X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=pkg%2Fsdl%2Ffile.go;h=7ac6594c5bb2a74fd47fc65efac5f5832645762e;hb=82c726627010dca2467989ec36cac6626ae9943a;hp=11c3350a3e74c3440be0ea3fa1cab3841936691d;hpb=871fa393844ce1b61b8d5218d27687d9fc05803a;p=ric-plt%2Frtmgr.git diff --git a/pkg/sdl/file.go b/pkg/sdl/file.go index 11c3350..7ac6594 100644 --- a/pkg/sdl/file.go +++ b/pkg/sdl/file.go @@ -14,6 +14,10 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + + This source code is part of the near-RT RIC (RAN Intelligent Controller) + platform project (RICP). + ================================================================================== */ /* @@ -27,9 +31,12 @@ package sdl import ( "encoding/json" "errors" + "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp" "io/ioutil" "os" - "rtmgr" + "strings" + "routing-manager/pkg/rtmgr" + "routing-manager/pkg/models" ) /* @@ -37,10 +44,19 @@ Reads the content of the rt.json file Parses the JSON content and loads each xApp entry into an xApp object Returns an array os xApp object */ -func fileReadAll(file string) (*[]rtmgr.XApp, error) { - rtmgr.Logger.Debug("Invoked file.fileReadAll") - rtmgr.Logger.Debug("file.fileReadAll opens file: " + file) - var xapps *[]rtmgr.XApp + +type File struct { + Sdl +} + +func NewFile() *File { + instance := new(File) + return instance +} + +func (f *File) ReadAll(file string) (*rtmgr.RicComponents, error) { + xapp.Logger.Debug("Invoked sdl.ReadAll(" + file + ")") + var rcs *rtmgr.RicComponents jsonFile, err := os.Open(file) if err != nil { return nil, errors.New("cannot open the file due to: " + err.Error()) @@ -50,19 +66,43 @@ func fileReadAll(file string) (*[]rtmgr.XApp, error) { if err != nil { return nil, errors.New("cannot read the file due to: " + err.Error()) } - err = json.Unmarshal(byteValue, &xapps) + + err = json.Unmarshal(byteValue, &rcs) if err != nil { return nil, errors.New("cannot parse data due to: " + err.Error()) } - rtmgr.Logger.Debug("file.fileReadAll returns: %v", xapps) - return xapps, nil + xapp.Logger.Debug("file.fileReadAll returns: %v", rcs) + return rcs, nil +} + +func (f *File) WriteAll(file string, rcs *rtmgr.RicComponents) error { + xapp.Logger.Debug("Invoked sdl.WriteAll") + xapp.Logger.Debug("file.fileWriteAll writes into file: " + file) + xapp.Logger.Debug("file.fileWriteAll writes data: %v", *rcs) + byteValue, err := json.Marshal(rcs) + if err != nil { + return errors.New("cannot convert data due to: " + err.Error()) + } + err = ioutil.WriteFile(file, byteValue, 0644) + if err != nil { + return errors.New("cannot write file due to: " + err.Error()) + } + return nil } -func fileWriteAll(file string, xapps *[]rtmgr.XApp) error { - rtmgr.Logger.Debug("Invoked file.fileWriteAll") - rtmgr.Logger.Debug("file.fileWriteAll writes into file: " + file) - rtmgr.Logger.Debug("file.fileWriteAll writes data: %v", (*xapps)) - byteValue, err := json.Marshal(xapps) +func (f *File) WriteXApps(file string, xApps *[]rtmgr.XApp) error { + xapp.Logger.Debug("Invoked sdl.WriteXApps") + xapp.Logger.Debug("file.fileWriteXApps writes into file: " + file) + xapp.Logger.Debug("file.fileWriteXApps writes data: %v", *xApps) + + ricData, err := NewFile().ReadAll(file) + if err != nil { + xapp.Logger.Error("cannot get data from sdl interface due to: " + err.Error()) + return errors.New("cannot read full ric data to modify xApps data, due to: " + err.Error()) + } + ricData.XApps = *xApps + + byteValue, err := json.Marshal(ricData) if err != nil { return errors.New("cannot convert data due to: " + err.Error()) } @@ -72,3 +112,205 @@ func fileWriteAll(file string, xapps *[]rtmgr.XApp) error { } return nil } + +func (f *File) WriteNewE2TInstance(file string, E2TInst *rtmgr.E2TInstance,meiddata string) error { + xapp.Logger.Debug("Invoked sdl.WriteNewE2TInstance") + xapp.Logger.Debug("file.WriteNewE2TInstance writes into file: " + file) + xapp.Logger.Debug("file.WriteNewE2TInstance writes data: %v", *E2TInst) + + ricData, err := NewFile().ReadAll(file) + if err != nil { + xapp.Logger.Error("cannot get data from sdl interface due to: " + err.Error()) + return errors.New("cannot read full ric data to modify xApps data, due to: " + err.Error()) + } + ricData.E2Ts[E2TInst.Fqdn] = *E2TInst + if (len(meiddata) > 0){ + ricData.MeidMap = []string {meiddata} + } else { + ricData.MeidMap = []string {} + } + + + byteValue, err := json.Marshal(ricData) + if err != nil { + return errors.New("cannot convert data due to: " + err.Error()) + } + err = ioutil.WriteFile(file, byteValue, 0644) + if err != nil { + return errors.New("cannot write file due to: " + err.Error()) + } + return nil +} + +func (f *File) WriteAssRANToE2TInstance(file string, rane2tmap models.RanE2tMap) error { + xapp.Logger.Debug("Invoked sdl.WriteAssRANToE2TInstance") + xapp.Logger.Debug("file.WriteAssRANToE2TInstance writes into file: " + file) + xapp.Logger.Debug("file.WriteAssRANToE2TInstance writes data: %v", rane2tmap) + + ricData, err := NewFile().ReadAll(file) + if err != nil { + xapp.Logger.Error("cannot get data from sdl interface due to: " + err.Error()) + return errors.New("cannot read full ric data to modify xApps data, due to: " + err.Error()) + } + + ricData.MeidMap = []string{} + for _, element := range rane2tmap { + xapp.Logger.Info("data received") + var str,meidar string + for _, meid := range element.RanNamelist { + meidar += meid + " " + } + str = "mme_ar|" + *element.E2TAddress + "|" + strings.TrimSuffix(meidar," ") + ricData.MeidMap = append(ricData.MeidMap,str) + + for key, _ := range ricData.E2Ts { + if key == *element.E2TAddress { + var estObj rtmgr.E2TInstance + estObj = ricData.E2Ts[key] + estObj.Ranlist = append(ricData.E2Ts[key].Ranlist, element.RanNamelist...) + ricData.E2Ts[key]= estObj + } + } + } + + byteValue, err := json.Marshal(ricData) + if err != nil { + return errors.New("cannot convert data due to: " + err.Error()) + } + err = ioutil.WriteFile(file, byteValue, 0644) + if err != nil { + return errors.New("cannot write file due to: " + err.Error()) + } + return nil +} + +func (f *File) WriteDisAssRANFromE2TInstance(file string, disassranmap models.RanE2tMap) error { + xapp.Logger.Debug("Invoked sdl.WriteDisAssRANFromE2TInstance") + xapp.Logger.Debug("file.WriteDisAssRANFromE2TInstance writes into file: " + file) + xapp.Logger.Debug("file.WriteDisAssRANFromE2TInstance writes data: %v", disassranmap) + + ricData, err := NewFile().ReadAll(file) + if err != nil { + xapp.Logger.Error("cannot get data from sdl interface due to: " + err.Error()) + return errors.New("cannot read full ric data to modify xApps data, due to: " + err.Error()) + } + + var str,meiddel,meiddisdel string + ricData.MeidMap = []string{} + for _, element := range disassranmap { + xapp.Logger.Info("data received") + for _, meid := range element.RanNamelist { + meiddisdel += meid + " " + } + if ( len(element.RanNamelist) > 0 ) { + str = "mme_del|" + strings.TrimSuffix(meiddisdel," ") + ricData.MeidMap = append(ricData.MeidMap,str) + } + e2taddress_key := *element.E2TAddress + //Check whether the provided E2T Address is available in SDL as a key. + //If exist, proceed further to check RAN list, Otherwise move to next E2T Instance + if _, exist := ricData.E2Ts[e2taddress_key]; exist { + var estObj rtmgr.E2TInstance + estObj = ricData.E2Ts[e2taddress_key] + // If RAN list is empty, then routing manager assumes that all RANs attached associated to the particular E2T Instance to be removed. + if len(element.RanNamelist) == 0 { + xapp.Logger.Debug("RAN List is empty. So disassociating all RANs from the E2T Instance: %v ", *element.E2TAddress) + for _, meid := range estObj.Ranlist { + meiddel += meid + " " + } + str = "mme_del|" + strings.TrimSuffix(meiddel," ") + ricData.MeidMap = append(ricData.MeidMap,str) + + estObj.Ranlist = []string{} + } else { + xapp.Logger.Debug("Remove only selected rans from E2T Instance: %v and %v ", ricData.E2Ts[e2taddress_key].Ranlist, element.RanNamelist) + for _, disRanValue := range element.RanNamelist { + for ranIndex, ranValue := range ricData.E2Ts[e2taddress_key].Ranlist { + if disRanValue == ranValue { + estObj.Ranlist[ranIndex] = estObj.Ranlist[len(estObj.Ranlist)-1] + estObj.Ranlist[len(estObj.Ranlist)-1] = "" + estObj.Ranlist = estObj.Ranlist[:len(estObj.Ranlist)-1] + } + } + } + } + ricData.E2Ts[e2taddress_key]= estObj + } + } + + xapp.Logger.Debug("Final data after disassociate: %v", ricData) + + byteValue, err := json.Marshal(ricData) + if err != nil { + return errors.New("cannot convert data due to: " + err.Error()) + } + err = ioutil.WriteFile(file, byteValue, 0644) + if err != nil { + return errors.New("cannot write file due to: " + err.Error()) + } + return nil +} + +func (f *File) WriteDeleteE2TInstance(file string, E2TInst *models.E2tDeleteData) error { + xapp.Logger.Debug("Invoked sdl.WriteDeleteE2TInstance") + xapp.Logger.Debug("file.WriteDeleteE2TInstance writes into file: " + file) + xapp.Logger.Debug("file.WriteDeleteE2TInstance writes data: %v", *E2TInst) + + ricData, err := NewFile().ReadAll(file) + if err != nil { + xapp.Logger.Error("cannot get data from sdl interface due to: " + err.Error()) + return errors.New("cannot read full ric data to modify xApps data, due to: " + err.Error()) + } + + + ricData.MeidMap = []string {} + var delrow,meiddel string + if(len(E2TInst.RanNamelistTobeDissociated)>0) { + for _, meid := range E2TInst.RanNamelistTobeDissociated { + meiddel += meid + " " + } + delrow = "mme_del|" + strings.TrimSuffix(meiddel," ") + ricData.MeidMap = append(ricData.MeidMap,delrow) + } else { + if(len(ricData.E2Ts[*E2TInst.E2TAddress].Ranlist) > 0) { + for _, meid := range ricData.E2Ts[*E2TInst.E2TAddress].Ranlist { + meiddel += meid + " " + } + delrow = "mme_del|" + strings.TrimSuffix(meiddel," ") + ricData.MeidMap = append(ricData.MeidMap,delrow) + } + } + + delete(ricData.E2Ts, *E2TInst.E2TAddress) + + for _, element := range E2TInst.RanAssocList { + var str,meidar string + xapp.Logger.Info("data received") + for _, meid := range element.RanNamelist { + meidar = meid + " " + } + str = "mme_ar|" + *element.E2TAddress + "|" + strings.TrimSuffix(meidar," ") + ricData.MeidMap = append(ricData.MeidMap,str) + key := *element.E2TAddress + + if val, ok := ricData.E2Ts[key]; ok { + var estObj rtmgr.E2TInstance + estObj = val + estObj.Ranlist = append(ricData.E2Ts[key].Ranlist, element.RanNamelist...) + ricData.E2Ts[key]= estObj + } else { + xapp.Logger.Error("file.WriteDeleteE2TInstance E2T instance is not found for provided E2TAddress : %v", errors.New(key).Error()) + } + + } + + byteValue, err := json.Marshal(ricData) + if err != nil { + return errors.New("cannot convert data due to: " + err.Error()) + } + err = ioutil.WriteFile(file, byteValue, 0644) + if err != nil { + return errors.New("cannot write file due to: " + err.Error()) + } + return nil +}