Prepare for SdlInstance usage removal in xapp-frame
[ric-plt/xapp-frame.git] / pkg / xapp / config.go
index 0493059..56986d3 100755 (executable)
@@ -21,17 +21,29 @@ package xapp
 
 import (
        "flag"
+       "fmt"
        "github.com/fsnotify/fsnotify"
        "github.com/spf13/viper"
        "os"
        "path/filepath"
 )
 
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+
+type mtype struct {
+       Name string
+       Id   int
+}
+
 type Configurator struct {
 }
 
 type ConfigChangeCB func(filename string)
 
+type SDLNotificationCB func(string, ...string)
+
 var ConfigChangeListeners []ConfigChangeCB
 
 func parseCmd() string {
@@ -51,11 +63,48 @@ func LoadConfig() (l *Log) {
        }
        l.Info("Using config file: %s", viper.ConfigFileUsed())
 
+       updateMTypes := func() {
+               var mtypes []mtype
+               viper.UnmarshalKey("messaging.mtypes", &mtypes)
+
+               if len(mtypes) > 0 {
+                       l.Info("Config mtypes before RICMessageTypes:%d RicMessageTypeToName:%d", len(RICMessageTypes), len(RicMessageTypeToName))
+                       for _, v := range mtypes {
+                               nadd := false
+                               iadd := false
+                               if _, ok := RICMessageTypes[v.Name]; ok == false {
+                                       nadd = true
+                               }
+                               if _, ok := RicMessageTypeToName[int(v.Id)]; ok == false {
+                                       iadd = true
+                               }
+                               if iadd != nadd {
+                                       l.Error("Config mtypes rmr.mtypes entry skipped due conflict with existing values %s(%t) %d(%t) ", v.Name, nadd, v.Id, iadd)
+                               } else if iadd {
+                                       l.Info("Config mtypes rmr.mtypes entry added %s(%t) %d(%t) ", v.Name, nadd, v.Id, iadd)
+                                       RICMessageTypes[v.Name] = int(v.Id)
+                                       RicMessageTypeToName[int(v.Id)] = v.Name
+                               } else {
+                                       l.Info("Config mtypes rmr.mtypes entry skipped %s(%t) %d(%t) ", v.Name, nadd, v.Id, iadd)
+                               }
+                       }
+                       l.Info("Config mtypes after RICMessageTypes:%d RicMessageTypeToName:%d", len(RICMessageTypes), len(RicMessageTypeToName))
+               }
+       }
+
+       updateMTypes()
+
        viper.WatchConfig()
        viper.OnConfigChange(func(e fsnotify.Event) {
                l.Info("config file %s changed ", e.Name)
 
-               Logger.SetLevel(viper.GetInt("logger.level"))
+               updateMTypes()
+               if viper.IsSet("controls.logger.level") {
+                       Logger.SetLevel(viper.GetInt("controls.logger.level"))
+               } else {
+                       Logger.SetLevel(viper.GetInt("logger.level"))
+               }
+
                if len(ConfigChangeListeners) > 0 {
                        for _, f := range ConfigChangeListeners {
                                go f(e.Name)
@@ -73,6 +122,74 @@ func AddConfigChangeListener(f ConfigChangeCB) {
        ConfigChangeListeners = append(ConfigChangeListeners, f)
 }
 
+func PublishConfigChange(appName, eventJson string) error {
+       channel := fmt.Sprintf("CM_UPDATE:%s", appName)
+       if err := SdlStorage.StoreAndPublish(getCmSdlNs(), channel, eventJson, appName, eventJson); err != nil {
+               Logger.Error("Sdl.Store failed: %v", err)
+               return err
+       }
+       return nil
+}
+
+func ReadConfig(appName string) (map[string]interface{}, error) {
+       return SdlStorage.Read(getCmSdlNs(), appName)
+}
+
+func GetPortData(pname string) (d PortData) {
+       var getPolicies = func(policies []interface{}) (plist []int) {
+               for _, p := range policies {
+                       plist = append(plist, int(p.(float64)))
+               }
+               return plist
+       }
+
+       if viper.IsSet("messaging") == false {
+               if pname == "http" {
+                       d.Port = 8080
+               }
+               if pname == "rmrdata" {
+                       d.Port = 4560
+               }
+               return
+       }
+
+       for _, v := range viper.GetStringMap("messaging")["ports"].([]interface{}) {
+               if n, ok := v.(map[string]interface{})["name"].(string); ok && n == pname {
+                       d.Name = n
+                       if p, _ := v.(map[string]interface{})["port"].(float64); ok {
+                               d.Port = int(p)
+                       }
+                       if m, _ := v.(map[string]interface{})["maxSize"].(float64); ok {
+                               d.MaxSize = int(m)
+                       }
+                       if m, _ := v.(map[string]interface{})["threadType"].(float64); ok {
+                               d.ThreadType = int(m)
+                       }
+                       if m, _ := v.(map[string]interface{})["lowLatency"].(bool); ok {
+                               d.LowLatency = bool(m)
+                       }
+                       if m, _ := v.(map[string]interface{})["fastAck"].(bool); ok {
+                               d.FastAck = bool(m)
+                       }
+                       if m, _ := v.(map[string]interface{})["maxRetryOnFailure"].(float64); ok {
+                               d.MaxRetryOnFailure = int(m)
+                       }
+                       if policies, ok := v.(map[string]interface{})["policies"]; ok {
+                               d.Policies = getPolicies(policies.([]interface{}))
+                       }
+               }
+       }
+       return
+}
+
+func getCmSdlNs() string {
+       return fmt.Sprintf("cm/%s", viper.GetString("name"))
+}
+
+func (*Configurator) SetSDLNotificationCB(appName string, sdlNotificationCb SDLNotificationCB) error {
+       return SdlStorage.Subscribe(getCmSdlNs(), sdlNotificationCb, fmt.Sprintf("CM_UPDATE:%s", appName))
+}
+
 func (*Configurator) GetString(key string) string {
        return viper.GetString(key)
 }
@@ -81,6 +198,26 @@ func (*Configurator) GetInt(key string) int {
        return viper.GetInt(key)
 }
 
+func (*Configurator) GetUint32(key string) uint32 {
+       return viper.GetUint32(key)
+}
+
 func (*Configurator) GetBool(key string) bool {
        return viper.GetBool(key)
 }
+
+func (*Configurator) Get(key string) interface{} {
+       return viper.Get(key)
+}
+
+func (*Configurator) GetStringSlice(key string) []string {
+       return viper.GetStringSlice(key)
+}
+
+func (*Configurator) GetStringMap(key string) map[string]interface{} {
+       return viper.GetStringMap(key)
+}
+
+func (*Configurator) IsSet(key string) bool {
+       return viper.IsSet(key)
+}