Merge "[RIC-436] Fix E2 Setup Response population" into PI5
authorShuky Har-Noy <shuky.har-noy@intl.att.com>
Sun, 7 Jun 2020 11:09:58 +0000 (11:09 +0000)
committerGerrit Code Review <gerrit@o-ran-sc.org>
Sun, 7 Jun 2020 11:09:58 +0000 (11:09 +0000)
E2Manager/Dockerfile
E2Manager/configuration/configuration.go
E2Manager/configuration/configuration_test.go
E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler.go
E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go
E2Manager/rNibWriter/rNibWriter_test.go
E2Manager/resources/configuration.yaml

index b56f011..89c23af 100755 (executable)
@@ -20,7 +20,7 @@
 #   platform project (RICP).
 #
 
-FROM nexus3.o-ran-sc.org:10004/bldr-ubuntu18-c-go:7-u18.04 as ubuntu
+FROM nexus3.o-ran-sc.org:10004/o-ran-sc/bldr-ubuntu18-c-go:8-u18.04 as ubuntu
 
 WORKDIR /opt/E2Manager
 COPY . .
index 5e4c31e..791360a 100644 (file)
 package configuration
 
 import (
+       "errors"
        "fmt"
        "github.com/spf13/viper"
+       "strconv"
 )
 
 type Configuration struct {
@@ -38,10 +40,7 @@ type Configuration struct {
        RoutingManager struct {
                BaseUrl string
        }
-/*     Kubernetes struct {
-               ConfigPath string
-               KubeNamespace  string
-       }*/
+
        NotificationResponseBuffer   int
        BigRedButtonTimeoutSec       int
        MaxRnibConnectionAttempts    int
@@ -50,8 +49,9 @@ type Configuration struct {
        KeepAliveDelayMs             int
        E2TInstanceDeletionTimeoutMs int
        GlobalRicId                  struct {
-               PlmnId      string
-               RicNearRtId string
+               RicId string
+               Mcc   string
+               Mnc   string
        }
 }
 
@@ -72,7 +72,6 @@ func ParseConfiguration() *Configuration {
        config.populateHttpConfig(viper.Sub("http"))
        config.populateLoggingConfig(viper.Sub("logging"))
        config.populateRoutingManagerConfig(viper.Sub("routingManager"))
-       //config.populateKubernetesConfig(viper.Sub("kubernetes"))
        config.NotificationResponseBuffer = viper.GetInt("notificationResponseBuffer")
        config.BigRedButtonTimeoutSec = viper.GetInt("bigRedButtonTimeoutSec")
        config.MaxRnibConnectionAttempts = viper.GetInt("maxRnibConnectionAttempts")
@@ -113,27 +112,112 @@ func (c *Configuration) populateRoutingManagerConfig(rmConfig *viper.Viper) {
        c.RoutingManager.BaseUrl = rmConfig.GetString("baseUrl")
 }
 
-/*func (c *Configuration) populateKubernetesConfig(rmConfig *viper.Viper) {
-       if rmConfig == nil {
-               panic(fmt.Sprintf("#configuration.populateKubernetesConfig - failed to populate Kubernetes configuration: The entry 'kubernetes' not found\n"))
+func (c *Configuration) populateGlobalRicIdConfig(globalRicIdConfig *viper.Viper) {
+       err := validateGlobalRicIdConfig(globalRicIdConfig)
+       if err != nil {
+               panic(err.Error())
        }
-       c.Kubernetes.ConfigPath = rmConfig.GetString("configPath")
-       c.Kubernetes.KubeNamespace = rmConfig.GetString("kubeNamespace")
-}*/
+       c.GlobalRicId.RicId = globalRicIdConfig.GetString("ricId")
+       c.GlobalRicId.Mcc = globalRicIdConfig.GetString("mcc")
+       c.GlobalRicId.Mnc = globalRicIdConfig.GetString("mnc")
+}
 
-func (c *Configuration) populateGlobalRicIdConfig(globalRicIdConfig *viper.Viper) {
+func validateGlobalRicIdConfig(globalRicIdConfig *viper.Viper) error {
        if globalRicIdConfig == nil {
-               panic(fmt.Sprintf("#configuration.populateGlobalRicIdConfig - failed to populate Global RicId configuration: The entry 'globalRicId' not found\n"))
+               return errors.New("#configuration.validateGlobalRicIdConfig - failed to populate Global RicId configuration: The entry 'globalRicId' not found\n")
+       }
+
+       err := validateRicId(globalRicIdConfig.GetString("ricId"))
+
+       if err != nil {
+               return err
+       }
+
+       err = validateMcc(globalRicIdConfig.GetString("mcc"))
+
+       if err != nil {
+               return err
+       }
+
+       err = validateMnc(globalRicIdConfig.GetString("mnc"))
+
+       if err != nil {
+               return err
+       }
+
+
+       return nil
+}
+
+func validateMcc(mcc string) error {
+
+       if len(mcc) == 0{
+               return errors.New("#configuration.validateMcc - mcc is missing or empty\n")
+       }
+
+       if len(mcc) != 3{
+               return errors.New("#configuration.validateMcc - mcc is not 3 digits\n")
+       }
+
+       mccInt, err := strconv.Atoi(mcc)
+
+       if err != nil{
+               return errors.New("#configuration.validateMcc - mcc is not a number\n")
+       }
+
+       if mccInt < 0 {
+               return errors.New("#configuration.validateMcc - mcc is negative\n")
        }
-       c.GlobalRicId.PlmnId = globalRicIdConfig.GetString("plmnId")
-       c.GlobalRicId.RicNearRtId = globalRicIdConfig.GetString("ricNearRtId")
+       return nil
 }
 
+func validateMnc(mnc string) error {
+
+       if len(mnc) == 0{
+               return errors.New("#configuration.validateMnc - mnc is missing or empty\n")
+       }
+
+       if len(mnc) < 2 || len(mnc) >3 {
+               return errors.New("#configuration.validateMnc - mnc is not 2 or 3 digits\n")
+       }
+
+       mncAsInt, err := strconv.Atoi(mnc)
+
+       if err != nil{
+               return errors.New("#configuration.validateMnc - mnc is not a number\n")
+       }
+
+       if mncAsInt < 0 {
+               return errors.New("#configuration.validateMnc - mnc is negative\n")
+       }
+
+       return nil
+}
+
+func validateRicId(ricId string) error{
+
+       if len(ricId) == 0{
+               return errors.New("#configuration.validateRicId - ricId is missing or empty\n")
+       }
+
+       if len(ricId) != 5 {
+               return errors.New("#configuration.validateRicId - ricId length should be 5 hex characters\n")
+       }
+
+       _, err := strconv.ParseUint(ricId, 16, 64)
+       if err != nil {
+               return errors.New("#configuration.validateRicId - ricId is not hex number\n")
+       }
+
+       return nil
+}
+
+
 func (c *Configuration) String() string {
        return fmt.Sprintf("{logging.logLevel: %s, http.port: %d, rmr: { port: %d, maxMsgSize: %d}, routingManager.baseUrl: %s, "+
                "notificationResponseBuffer: %d, bigRedButtonTimeoutSec: %d, maxRnibConnectionAttempts: %d, "+
                "rnibRetryIntervalMs: %d, keepAliveResponseTimeoutMs: %d, keepAliveDelayMs: %d, e2tInstanceDeletionTimeoutMs: %d, "+
-               "globalRicId: { plmnId: %s, ricNearRtId: %s}",//, kubernetes: {configPath: %s, kubeNamespace: %s}}",
+               "globalRicId: { ricId: %s, mcc: %s, mnc: %s}",
                c.Logging.LogLevel,
                c.Http.Port,
                c.Rmr.Port,
@@ -146,9 +230,8 @@ func (c *Configuration) String() string {
                c.KeepAliveResponseTimeoutMs,
                c.KeepAliveDelayMs,
                c.E2TInstanceDeletionTimeoutMs,
-               c.GlobalRicId.PlmnId,
-               c.GlobalRicId.RicNearRtId,
-/*             c.Kubernetes.ConfigPath,
-               c.Kubernetes.KubeNamespace,*/
+               c.GlobalRicId.RicId,
+               c.GlobalRicId.Mcc,
+               c.GlobalRicId.Mnc,
        )
 }
index 695ed9a..4a3dff3 100644 (file)
@@ -40,10 +40,9 @@ func TestParseConfigurationSuccess(t *testing.T) {
        assert.Equal(t, 1500, config.KeepAliveDelayMs)
        assert.Equal(t, 15000, config.E2TInstanceDeletionTimeoutMs)
        assert.NotNil(t, config.GlobalRicId)
-       assert.NotEmpty(t, config.GlobalRicId.PlmnId)
-       assert.NotEmpty(t, config.GlobalRicId.RicNearRtId)
-/*     assert.NotEmpty(t, config.Kubernetes.KubeNamespace)
-       assert.NotEmpty(t, config.Kubernetes.ConfigPath)*/
+       assert.Equal(t, "AACCE", config.GlobalRicId.RicId)
+       assert.Equal(t, "310", config.GlobalRicId.Mcc)
+       assert.Equal(t, "411", config.GlobalRicId.Mnc)
 }
 
 func TestStringer(t *testing.T) {
@@ -83,7 +82,7 @@ func TestRmrConfigNotFoundFailure(t *testing.T) {
        yamlMap := map[string]interface{}{
                "logging": map[string]interface{}{"logLevel": "info"},
                "http":    map[string]interface{}{"port": 3800},
-               "routingManager":    map[string]interface{}{"baseUrl": "http://iltlv740.intl.att.com:8080/ric/v1/handles/"},
+               "routingManager":    map[string]interface{}{"baseUrl": "http://localhost:8080/ric/v1/handles/"},
                "globalRicId":    map[string]interface{}{"plmnId": "131014", "ricNearRtId": "556670"},
        }
        buf, err := yaml.Marshal(yamlMap)
@@ -113,7 +112,7 @@ func TestLoggingConfigNotFoundFailure(t *testing.T) {
        yamlMap := map[string]interface{}{
                "rmr":  map[string]interface{}{"port": 3801, "maxMsgSize": 4096},
                "http": map[string]interface{}{"port": 3800},
-               "routingManager":    map[string]interface{}{"baseUrl": "http://iltlv740.intl.att.com:8080/ric/v1/handles/"},
+               "routingManager":    map[string]interface{}{"baseUrl": "http://localhost:8080/ric/v1/handles/"},
                "globalRicId":    map[string]interface{}{"plmnId": "131014", "ricNearRtId": "556670"},
        }
        buf, err := yaml.Marshal(yamlMap)
@@ -144,7 +143,7 @@ func TestHttpConfigNotFoundFailure(t *testing.T) {
        yamlMap := map[string]interface{}{
                "rmr":     map[string]interface{}{"port": 3801, "maxMsgSize": 4096},
                "logging": map[string]interface{}{"logLevel": "info"},
-               "routingManager":    map[string]interface{}{"baseUrl": "http://iltlv740.intl.att.com:8080/ric/v1/handles/"},
+               "routingManager":    map[string]interface{}{"baseUrl": "http://localhost:8080/ric/v1/handles/"},
                "globalRicId":    map[string]interface{}{"plmnId": "131014", "ricNearRtId": "556670"},
        }
        buf, err := yaml.Marshal(yamlMap)
@@ -176,7 +175,7 @@ func TestRoutingManagerConfigNotFoundFailure(t *testing.T) {
                "rmr":     map[string]interface{}{"port": 3801, "maxMsgSize": 4096},
                "logging": map[string]interface{}{"logLevel": "info"},
                "http": map[string]interface{}{"port": 3800},
-               "globalRicId":    map[string]interface{}{"plmnId": "131014", "ricNearRtId": "556670"},
+               "globalRicId":    map[string]interface{}{"mcc": 327, "mnc": 94, "ricId": "AACCE"},
        }
        buf, err := yaml.Marshal(yamlMap)
        if err != nil {
@@ -207,8 +206,7 @@ func TestGlobalRicIdConfigNotFoundFailure(t *testing.T) {
                "rmr":     map[string]interface{}{"port": 3801, "maxMsgSize": 4096},
                "logging": map[string]interface{}{"logLevel": "info"},
                "http": map[string]interface{}{"port": 3800},
-               "routingManager":    map[string]interface{}{"baseUrl": "http://iltlv740.intl.att.com:8080/ric/v1/handles/"},
-               //"kubernetes":    map[string]interface{}{"kubeNamespace": "test", "ConfigPath": "test"},
+               "routingManager":    map[string]interface{}{"baseUrl": "http://localhost:8080/ric/v1/handles/"},
        }
        buf, err := yaml.Marshal(yamlMap)
        if err != nil {
@@ -218,38 +216,487 @@ func TestGlobalRicIdConfigNotFoundFailure(t *testing.T) {
        if err != nil {
                t.Errorf("#TestGlobalRicIdConfigNotFoundFailure - failed to write configuration file: %s\n", configPath)
        }
-       assert.PanicsWithValue(t, "#configuration.populateGlobalRicIdConfig - failed to populate Global RicId configuration: The entry 'globalRicId' not found\n",
+       assert.PanicsWithValue(t, "#configuration.validateGlobalRicIdConfig - failed to populate Global RicId configuration: The entry 'globalRicId' not found\n",
                func() { ParseConfiguration() })
 }
 
-/*func TestKubernetesConfigNotFoundFailure(t *testing.T) {
+func TestEmptyRicIdFailure(t *testing.T) {
+configPath := "../resources/configuration.yaml"
+configPathTmp := "../resources/configuration.yaml_tmp"
+err := os.Rename(configPath, configPathTmp)
+if err != nil {
+t.Errorf("#TestEmptyRicIdFailure - failed to rename configuration file: %s\n", configPath)
+}
+defer func() {
+err = os.Rename(configPathTmp, configPath)
+if err != nil {
+t.Errorf("#TestEmptyRicIdFailure - failed to rename configuration file: %s\n", configPath)
+}
+}()
+yamlMap := map[string]interface{}{
+"rmr":     map[string]interface{}{"port": 3801, "maxMsgSize": 4096},
+"logging": map[string]interface{}{"logLevel": "info"},
+"http": map[string]interface{}{"port": 3800},
+"globalRicId":    map[string]interface{}{"mcc": "327", "mnc": "94", "ricId": ""},
+"routingManager":    map[string]interface{}{"baseUrl": "http://localhost:8080/ric/v1/handles/"},
+}
+buf, err := yaml.Marshal(yamlMap)
+if err != nil {
+t.Errorf("#TestEmptyRicIdFailure - failed to marshal configuration map\n")
+}
+err = ioutil.WriteFile("../resources/configuration.yaml", buf, 0644)
+if err != nil {
+t.Errorf("#TestEmptyRicIdFailure - failed to write configuration file: %s\n", configPath)
+}
+assert.PanicsWithValue(t, "#configuration.validateRicId - ricId is missing or empty\n",
+func() { ParseConfiguration() })
+}
+
+func TestMissingRicIdFailure(t *testing.T) {
        configPath := "../resources/configuration.yaml"
        configPathTmp := "../resources/configuration.yaml_tmp"
        err := os.Rename(configPath, configPathTmp)
        if err != nil {
-               t.Errorf("#TestKubernetesConfigNotFoundFailure - failed to rename configuration file: %s\n", configPath)
+               t.Errorf("#TestEmptyRicIdFailure - failed to rename configuration file: %s\n", configPath)
        }
        defer func() {
                err = os.Rename(configPathTmp, configPath)
                if err != nil {
-                       t.Errorf("#TestKubernetesConfigNotFoundFailure - failed to rename configuration file: %s\n", configPath)
+                       t.Errorf("#TestEmptyRicIdFailure - failed to rename configuration file: %s\n", configPath)
                }
        }()
        yamlMap := map[string]interface{}{
                "rmr":     map[string]interface{}{"port": 3801, "maxMsgSize": 4096},
                "logging": map[string]interface{}{"logLevel": "info"},
                "http": map[string]interface{}{"port": 3800},
-               "routingManager":    map[string]interface{}{"baseUrl": "http://iltlv740.intl.att.com:8080/ric/v1/handles/"},
-               "globalRicId":    map[string]interface{}{"plmnId": "131014", "ricNearRtId": "556670"},
+               "globalRicId":    map[string]interface{}{"mcc": "327", "mnc": "94"},
+               "routingManager":    map[string]interface{}{"baseUrl": "http://localhost:8080/ric/v1/handles/"},
+       }
+       buf, err := yaml.Marshal(yamlMap)
+       if err != nil {
+               t.Errorf("#TestEmptyRicIdFailure - failed to marshal configuration map\n")
+       }
+       err = ioutil.WriteFile("../resources/configuration.yaml", buf, 0644)
+       if err != nil {
+               t.Errorf("#TestEmptyRicIdFailure - failed to write configuration file: %s\n", configPath)
+       }
+       assert.PanicsWithValue(t, "#configuration.validateRicId - ricId is missing or empty\n",
+               func() { ParseConfiguration() })
+}
+
+func TestNonHexRicIdFailure(t *testing.T) {
+       configPath := "../resources/configuration.yaml"
+       configPathTmp := "../resources/configuration.yaml_tmp"
+       err := os.Rename(configPath, configPathTmp)
+       if err != nil {
+               t.Errorf("#TestNonHexRicIdFailure - failed to rename configuration file: %s\n", configPath)
+       }
+       defer func() {
+               err = os.Rename(configPathTmp, configPath)
+               if err != nil {
+                       t.Errorf("#TestNonHexRicIdFailure - failed to rename configuration file: %s\n", configPath)
+               }
+       }()
+       yamlMap := map[string]interface{}{
+               "rmr":     map[string]interface{}{"port": 3801, "maxMsgSize": 4096},
+               "logging": map[string]interface{}{"logLevel": "info"},
+               "http": map[string]interface{}{"port": 3800},
+               "globalRicId":    map[string]interface{}{"mcc": "327", "mnc": "94", "ricId": "TEST1"},
+               "routingManager":    map[string]interface{}{"baseUrl": "http://localhost:8080/ric/v1/handles/"},
+       }
+       buf, err := yaml.Marshal(yamlMap)
+       if err != nil {
+               t.Errorf("#TestNonHexRicIdFailure - failed to marshal configuration map\n")
+       }
+       err = ioutil.WriteFile("../resources/configuration.yaml", buf, 0644)
+       if err != nil {
+               t.Errorf("#TestNonHexRicIdFailure - failed to write configuration file: %s\n", configPath)
+       }
+       assert.PanicsWithValue(t, "#configuration.validateRicId - ricId is not hex number\n",
+               func() { ParseConfiguration() })
+}
+
+func TestWrongRicIdLengthFailure(t *testing.T) {
+       configPath := "../resources/configuration.yaml"
+       configPathTmp := "../resources/configuration.yaml_tmp"
+       err := os.Rename(configPath, configPathTmp)
+       if err != nil {
+               t.Errorf("#TestWrongRicIdLengthFailure - failed to rename configuration file: %s\n", configPath)
+       }
+       defer func() {
+               err = os.Rename(configPathTmp, configPath)
+               if err != nil {
+                       t.Errorf("#TestWrongRicIdLengthFailure - failed to rename configuration file: %s\n", configPath)
+               }
+       }()
+       yamlMap := map[string]interface{}{
+               "rmr":     map[string]interface{}{"port": 3801, "maxMsgSize": 4096},
+               "logging": map[string]interface{}{"logLevel": "info"},
+               "http": map[string]interface{}{"port": 3800},
+               "globalRicId":    map[string]interface{}{"mcc": "327", "mnc": "94", "ricId": "AA43"},
+               "routingManager":    map[string]interface{}{"baseUrl": "http://localhost:8080/ric/v1/handles/"},
+       }
+       buf, err := yaml.Marshal(yamlMap)
+       if err != nil {
+               t.Errorf("#TestWrongRicIdLengthFailure - failed to marshal configuration map\n")
+       }
+       err = ioutil.WriteFile("../resources/configuration.yaml", buf, 0644)
+       if err != nil {
+               t.Errorf("#TestWrongRicIdLengthFailure - failed to write configuration file: %s\n", configPath)
+       }
+       assert.PanicsWithValue(t, "#configuration.validateRicId - ricId length should be 5 hex characters\n",
+               func() { ParseConfiguration() })
+}
+
+func TestMccNotThreeDigitsFailure(t *testing.T) {
+       configPath := "../resources/configuration.yaml"
+       configPathTmp := "../resources/configuration.yaml_tmp"
+       err := os.Rename(configPath, configPathTmp)
+       if err != nil {
+               t.Errorf("#TestMccNotThreeDigitsFailure - failed to rename configuration file: %s\n", configPath)
+       }
+       defer func() {
+               err = os.Rename(configPathTmp, configPath)
+               if err != nil {
+                       t.Errorf("#TestMccNotThreeDigitsFailure - failed to rename configuration file: %s\n", configPath)
+               }
+       }()
+       yamlMap := map[string]interface{}{
+               "rmr":     map[string]interface{}{"port": 3801, "maxMsgSize": 4096},
+               "logging": map[string]interface{}{"logLevel": "info"},
+               "http": map[string]interface{}{"port": 3800},
+               "globalRicId":    map[string]interface{}{"mcc": "31", "mnc": "94", "ricId": "AA443"},
+               "routingManager":    map[string]interface{}{"baseUrl": "http://localhost:8080/ric/v1/handles/"},
        }
        buf, err := yaml.Marshal(yamlMap)
        if err != nil {
-               t.Errorf("#TestKubernetesConfigNotFoundFailure - failed to marshal configuration map\n")
+               t.Errorf("#TestMccNotThreeDigitsFailure - failed to marshal configuration map\n")
        }
        err = ioutil.WriteFile("../resources/configuration.yaml", buf, 0644)
        if err != nil {
-               t.Errorf("#TestKubernetesConfigNotFoundFailure - failed to write configuration file: %s\n", configPath)
+               t.Errorf("#TestMccNotThreeDigitsFailure - failed to write configuration file: %s\n", configPath)
        }
-       assert.PanicsWithValue(t, "#configuration.populateKubernetesConfig - failed to populate Kubernetes configuration: The entry 'kubernetes' not found\n",
+       assert.PanicsWithValue(t, "#configuration.validateMcc - mcc is not 3 digits\n",
                func() { ParseConfiguration() })
-}*/
+}
+
+func TestMncLengthIsGreaterThanThreeDigitsFailure(t *testing.T) {
+       configPath := "../resources/configuration.yaml"
+       configPathTmp := "../resources/configuration.yaml_tmp"
+       err := os.Rename(configPath, configPathTmp)
+       if err != nil {
+               t.Errorf("#TestMncLengthIsGreaterThanThreeDigitsFailure - failed to rename configuration file: %s\n", configPath)
+       }
+       defer func() {
+               err = os.Rename(configPathTmp, configPath)
+               if err != nil {
+                       t.Errorf("#TestMncLengthIsGreaterThanThreeDigitsFailure - failed to rename configuration file: %s\n", configPath)
+               }
+       }()
+       yamlMap := map[string]interface{}{
+               "rmr":     map[string]interface{}{"port": 3801, "maxMsgSize": 4096},
+               "logging": map[string]interface{}{"logLevel": "info"},
+               "http": map[string]interface{}{"port": 3800},
+               "globalRicId":    map[string]interface{}{"mcc": "310", "mnc": "6794", "ricId": "AA443"},
+               "routingManager":    map[string]interface{}{"baseUrl": "http://localhost:8080/ric/v1/handles/"},
+       }
+       buf, err := yaml.Marshal(yamlMap)
+       if err != nil {
+               t.Errorf("#TestMncLengthIsGreaterThanThreeDigitsFailure - failed to marshal configuration map\n")
+       }
+       err = ioutil.WriteFile("../resources/configuration.yaml", buf, 0644)
+       if err != nil {
+               t.Errorf("#TestMncLengthIsGreaterThanThreeDigitsFailure - failed to write configuration file: %s\n", configPath)
+       }
+       assert.PanicsWithValue(t, "#configuration.validateMnc - mnc is not 2 or 3 digits\n",
+               func() { ParseConfiguration() })
+}
+
+func TestMncLengthIsLessThanTwoDigitsFailure(t *testing.T) {
+       configPath := "../resources/configuration.yaml"
+       configPathTmp := "../resources/configuration.yaml_tmp"
+       err := os.Rename(configPath, configPathTmp)
+       if err != nil {
+               t.Errorf("#TestMncLengthIsLessThanTwoDigitsFailure - failed to rename configuration file: %s\n", configPath)
+       }
+       defer func() {
+               err = os.Rename(configPathTmp, configPath)
+               if err != nil {
+                       t.Errorf("#TestMncLengthIsLessThanTwoDigitsFailure - failed to rename configuration file: %s\n", configPath)
+               }
+       }()
+       yamlMap := map[string]interface{}{
+               "rmr":     map[string]interface{}{"port": 3801, "maxMsgSize": 4096},
+               "logging": map[string]interface{}{"logLevel": "info"},
+               "http": map[string]interface{}{"port": 3800},
+               "globalRicId":    map[string]interface{}{"mcc": "310", "mnc": "4", "ricId": "AA443"},
+               "routingManager":    map[string]interface{}{"baseUrl": "http://localhost:8080/ric/v1/handles/"},
+       }
+       buf, err := yaml.Marshal(yamlMap)
+       if err != nil {
+               t.Errorf("#TestMncLengthIsLessThanTwoDigitsFailure - failed to marshal configuration map\n")
+       }
+       err = ioutil.WriteFile("../resources/configuration.yaml", buf, 0644)
+       if err != nil {
+               t.Errorf("#TestMncLengthIsLessThanTwoDigitsFailure - failed to write configuration file: %s\n", configPath)
+       }
+       assert.PanicsWithValue(t, "#configuration.validateMnc - mnc is not 2 or 3 digits\n",
+               func() { ParseConfiguration() })
+}
+
+func TestNegativeMncFailure(t *testing.T) {
+       configPath := "../resources/configuration.yaml"
+       configPathTmp := "../resources/configuration.yaml_tmp"
+       err := os.Rename(configPath, configPathTmp)
+       if err != nil {
+               t.Errorf("#TestNegativeMncFailure - failed to rename configuration file: %s\n", configPath)
+       }
+       defer func() {
+               err = os.Rename(configPathTmp, configPath)
+               if err != nil {
+                       t.Errorf("#TestNegativeMncFailure - failed to rename configuration file: %s\n", configPath)
+               }
+       }()
+       yamlMap := map[string]interface{}{
+               "rmr":     map[string]interface{}{"port": 3801, "maxMsgSize": 4096},
+               "logging": map[string]interface{}{"logLevel": "info"},
+               "http": map[string]interface{}{"port": 3800},
+               "globalRicId":    map[string]interface{}{"mcc": "310", "mnc": "-2", "ricId": "AA443"},
+               "routingManager":    map[string]interface{}{"baseUrl": "http://localhost:8080/ric/v1/handles/"},
+       }
+       buf, err := yaml.Marshal(yamlMap)
+       if err != nil {
+               t.Errorf("#TestNegativeMncFailure - failed to marshal configuration map\n")
+       }
+       err = ioutil.WriteFile("../resources/configuration.yaml", buf, 0644)
+       if err != nil {
+               t.Errorf("#TestNegativeMncFailure - failed to write configuration file: %s\n", configPath)
+       }
+       assert.PanicsWithValue(t, "#configuration.validateMnc - mnc is negative\n",
+               func() { ParseConfiguration() })
+}
+
+func TestNegativeMccFailure(t *testing.T) {
+       configPath := "../resources/configuration.yaml"
+       configPathTmp := "../resources/configuration.yaml_tmp"
+       err := os.Rename(configPath, configPathTmp)
+       if err != nil {
+               t.Errorf("#TestNegativeMncFailure - failed to rename configuration file: %s\n", configPath)
+       }
+       defer func() {
+               err = os.Rename(configPathTmp, configPath)
+               if err != nil {
+                       t.Errorf("#TestNegativeMncFailure - failed to rename configuration file: %s\n", configPath)
+               }
+       }()
+       yamlMap := map[string]interface{}{
+               "rmr":     map[string]interface{}{"port": 3801, "maxMsgSize": 4096},
+               "logging": map[string]interface{}{"logLevel": "info"},
+               "http": map[string]interface{}{"port": 3800},
+               "globalRicId":    map[string]interface{}{"mcc": "-31", "mnc": "222", "ricId": "AA443"},
+               "routingManager":    map[string]interface{}{"baseUrl": "http://localhost:8080/ric/v1/handles/"},
+       }
+       buf, err := yaml.Marshal(yamlMap)
+       if err != nil {
+               t.Errorf("#TestNegativeMncFailure - failed to marshal configuration map\n")
+       }
+       err = ioutil.WriteFile("../resources/configuration.yaml", buf, 0644)
+       if err != nil {
+               t.Errorf("#TestNegativeMncFailure - failed to write configuration file: %s\n", configPath)
+       }
+       assert.PanicsWithValue(t, "#configuration.validateMcc - mcc is negative\n",
+               func() { ParseConfiguration() })
+}
+
+func TestAlphaNumericMccFailure(t *testing.T) {
+       configPath := "../resources/configuration.yaml"
+       configPathTmp := "../resources/configuration.yaml_tmp"
+       err := os.Rename(configPath, configPathTmp)
+       if err != nil {
+               t.Errorf("#TestAlphaNumericMccFailure - failed to rename configuration file: %s\n", configPath)
+       }
+       defer func() {
+               err = os.Rename(configPathTmp, configPath)
+               if err != nil {
+                       t.Errorf("#TestAlphaNumericMccFailure - failed to rename configuration file: %s\n", configPath)
+               }
+       }()
+       yamlMap := map[string]interface{}{
+               "rmr":     map[string]interface{}{"port": 3801, "maxMsgSize": 4096},
+               "logging": map[string]interface{}{"logLevel": "info"},
+               "http": map[string]interface{}{"port": 3800},
+               "globalRicId":    map[string]interface{}{"mcc": "1W2", "mnc": "222", "ricId": "AA443"},
+               "routingManager":    map[string]interface{}{"baseUrl": "http://localhost:8080/ric/v1/handles/"},
+       }
+       buf, err := yaml.Marshal(yamlMap)
+       if err != nil {
+               t.Errorf("#TestAlphaNumericMccFailure - failed to marshal configuration map\n")
+       }
+       err = ioutil.WriteFile("../resources/configuration.yaml", buf, 0644)
+       if err != nil {
+               t.Errorf("#TestAlphaNumericMccFailure - failed to write configuration file: %s\n", configPath)
+       }
+       assert.PanicsWithValue(t, "#configuration.validateMcc - mcc is not a number\n",
+               func() { ParseConfiguration() })
+}
+
+func TestAlphaNumericMncFailure(t *testing.T) {
+       configPath := "../resources/configuration.yaml"
+       configPathTmp := "../resources/configuration.yaml_tmp"
+       err := os.Rename(configPath, configPathTmp)
+       if err != nil {
+               t.Errorf("#TestAlphaNumericMncFailure - failed to rename configuration file: %s\n", configPath)
+       }
+       defer func() {
+               err = os.Rename(configPathTmp, configPath)
+               if err != nil {
+                       t.Errorf("#TestAlphaNumericMncFailure - failed to rename configuration file: %s\n", configPath)
+               }
+       }()
+       yamlMap := map[string]interface{}{
+               "rmr":     map[string]interface{}{"port": 3801, "maxMsgSize": 4096},
+               "logging": map[string]interface{}{"logLevel": "info"},
+               "http": map[string]interface{}{"port": 3800},
+               "globalRicId":    map[string]interface{}{"mcc": "111", "mnc": "2A8", "ricId": "AA443"},
+               "routingManager":    map[string]interface{}{"baseUrl": "http://localhost:8080/ric/v1/handles/"},
+       }
+       buf, err := yaml.Marshal(yamlMap)
+       if err != nil {
+               t.Errorf("#TestAlphaNumericMncFailure - failed to marshal configuration map\n")
+       }
+       err = ioutil.WriteFile("../resources/configuration.yaml", buf, 0644)
+       if err != nil {
+               t.Errorf("#TestAlphaNumericMncFailure - failed to write configuration file: %s\n", configPath)
+       }
+       assert.PanicsWithValue(t, "#configuration.validateMnc - mnc is not a number\n",
+               func() { ParseConfiguration() })
+}
+
+func TestMissingMmcFailure(t *testing.T) {
+       configPath := "../resources/configuration.yaml"
+       configPathTmp := "../resources/configuration.yaml_tmp"
+       err := os.Rename(configPath, configPathTmp)
+       if err != nil {
+               t.Errorf("#TestMissingMmcFailure - failed to rename configuration file: %s\n", configPath)
+       }
+       defer func() {
+               err = os.Rename(configPathTmp, configPath)
+               if err != nil {
+                       t.Errorf("#TestMissingMmcFailure - failed to rename configuration file: %s\n", configPath)
+               }
+       }()
+       yamlMap := map[string]interface{}{
+               "rmr":     map[string]interface{}{"port": 3801, "maxMsgSize": 4096},
+               "logging": map[string]interface{}{"logLevel": "info"},
+               "http": map[string]interface{}{"port": 3800},
+               "globalRicId":    map[string]interface{}{"mnc": "94", "ricId": "AABB3"},
+               "routingManager":    map[string]interface{}{"baseUrl": "http://localhost:8080/ric/v1/handles/"},
+       }
+       buf, err := yaml.Marshal(yamlMap)
+       if err != nil {
+               t.Errorf("#TestMissingMmcFailure - failed to marshal configuration map\n")
+       }
+       err = ioutil.WriteFile("../resources/configuration.yaml", buf, 0644)
+       if err != nil {
+               t.Errorf("#TestMissingMmcFailure - failed to write configuration file: %s\n", configPath)
+       }
+       assert.PanicsWithValue(t, "#configuration.validateMcc - mcc is missing or empty\n",
+               func() { ParseConfiguration() })
+}
+
+
+func TestEmptyMmcFailure(t *testing.T) {
+       configPath := "../resources/configuration.yaml"
+       configPathTmp := "../resources/configuration.yaml_tmp"
+       err := os.Rename(configPath, configPathTmp)
+       if err != nil {
+               t.Errorf("#TestEmptyMmcFailure - failed to rename configuration file: %s\n", configPath)
+       }
+       defer func() {
+               err = os.Rename(configPathTmp, configPath)
+               if err != nil {
+                       t.Errorf("#TestEmptyMmcFailure - failed to rename configuration file: %s\n", configPath)
+               }
+       }()
+       yamlMap := map[string]interface{}{
+               "rmr":     map[string]interface{}{"port": 3801, "maxMsgSize": 4096},
+               "logging": map[string]interface{}{"logLevel": "info"},
+               "http": map[string]interface{}{"port": 3800},
+               "globalRicId":    map[string]interface{}{"mcc": "", "mnc": "94", "ricId": "AABB3"},
+               "routingManager":    map[string]interface{}{"baseUrl": "http://localhost:8080/ric/v1/handles/"},
+       }
+       buf, err := yaml.Marshal(yamlMap)
+       if err != nil {
+               t.Errorf("#TestEmptyMmcFailure - failed to marshal configuration map\n")
+       }
+       err = ioutil.WriteFile("../resources/configuration.yaml", buf, 0644)
+       if err != nil {
+               t.Errorf("#TestEmptyMmcFailure - failed to write configuration file: %s\n", configPath)
+       }
+       assert.PanicsWithValue(t, "#configuration.validateMcc - mcc is missing or empty\n",
+               func() { ParseConfiguration() })
+}
+
+func TestEmptyMncFailure(t *testing.T) {
+       configPath := "../resources/configuration.yaml"
+       configPathTmp := "../resources/configuration.yaml_tmp"
+       err := os.Rename(configPath, configPathTmp)
+       if err != nil {
+               t.Errorf("#TestEmptyMncFailure - failed to rename configuration file: %s\n", configPath)
+       }
+       defer func() {
+               err = os.Rename(configPathTmp, configPath)
+               if err != nil {
+                       t.Errorf("#TestEmptyMncFailure - failed to rename configuration file: %s\n", configPath)
+               }
+       }()
+       yamlMap := map[string]interface{}{
+               "rmr":     map[string]interface{}{"port": 3801, "maxMsgSize": 4096},
+               "logging": map[string]interface{}{"logLevel": "info"},
+               "http": map[string]interface{}{"port": 3800},
+               "globalRicId":    map[string]interface{}{"mcc": "111", "mnc": "", "ricId": "AABB3"},
+               "routingManager":    map[string]interface{}{"baseUrl": "http://localhost:8080/ric/v1/handles/"},
+       }
+       buf, err := yaml.Marshal(yamlMap)
+       if err != nil {
+               t.Errorf("#TestEmptyMncFailure - failed to marshal configuration map\n")
+       }
+       err = ioutil.WriteFile("../resources/configuration.yaml", buf, 0644)
+       if err != nil {
+               t.Errorf("#TestEmptyMncFailure - failed to write configuration file: %s\n", configPath)
+       }
+       assert.PanicsWithValue(t, "#configuration.validateMnc - mnc is missing or empty\n",
+               func() { ParseConfiguration() })
+}
+
+func TestMissingMncFailure(t *testing.T) {
+       configPath := "../resources/configuration.yaml"
+       configPathTmp := "../resources/configuration.yaml_tmp"
+       err := os.Rename(configPath, configPathTmp)
+       if err != nil {
+               t.Errorf("#TestMissingMncFailure - failed to rename configuration file: %s\n", configPath)
+       }
+       defer func() {
+               err = os.Rename(configPathTmp, configPath)
+               if err != nil {
+                       t.Errorf("#TestMissingMncFailure - failed to rename configuration file: %s\n", configPath)
+               }
+       }()
+       yamlMap := map[string]interface{}{
+               "rmr":     map[string]interface{}{"port": 3801, "maxMsgSize": 4096},
+               "logging": map[string]interface{}{"logLevel": "info"},
+               "http": map[string]interface{}{"port": 3800},
+               "globalRicId":    map[string]interface{}{"mcc": "111", "ricId": "AABB3"},
+               "routingManager":    map[string]interface{}{"baseUrl": "http://localhost:8080/ric/v1/handles/"},
+       }
+       buf, err := yaml.Marshal(yamlMap)
+       if err != nil {
+               t.Errorf("#TestMissingMncFailure - failed to marshal configuration map\n")
+       }
+       err = ioutil.WriteFile("../resources/configuration.yaml", buf, 0644)
+       if err != nil {
+               t.Errorf("#TestMissingMncFailure - failed to write configuration file: %s\n", configPath)
+       }
+       assert.PanicsWithValue(t, "#configuration.validateMnc - mnc is missing or empty\n",
+               func() { ParseConfiguration() })
+}
index e50829d..d65516c 100644 (file)
@@ -163,6 +163,8 @@ func (h E2SetupRequestNotificationHandler) handleUnsuccessfulResponse(nodebInfo
 
        responsePayload = replaceEmptyTagsWithSelfClosing(responsePayload)
 
+       h.logger.Infof("#E2SetupRequestNotificationHandler.handleUnsuccessfulResponse - payload: %s", responsePayload)
+
        msg := models.NewRmrMessage(rmrCgo.RIC_E2_SETUP_FAILURE, nodebInfo.RanName, responsePayload, req.TransactionId, req.GetMsgSrc())
        h.logger.Infof("#E2SetupRequestNotificationHandler.handleUnsuccessfulResponse - RAN name: %s - RIC_E2_SETUP_RESP message has been built successfully. Message: %x", nodebInfo.RanName, msg)
        _ = h.rmrSender.WhSend(msg)
@@ -171,12 +173,13 @@ func (h E2SetupRequestNotificationHandler) handleUnsuccessfulResponse(nodebInfo
 
 func (h E2SetupRequestNotificationHandler) handleSuccessfulResponse(ranName string, req *models.NotificationRequest, setupRequest *models.E2SetupRequestMessage) {
 
-       ricNearRtId, err := convertTo20BitString(h.config.GlobalRicId.RicNearRtId)
+       plmnId := buildPlmnId(h.config.GlobalRicId.Mcc, h.config.GlobalRicId.Mnc)
+
+       ricNearRtId, err := convertTo20BitString(h.config.GlobalRicId.RicId)
        if err != nil {
-               h.logger.Errorf("#E2SetupRequestNotificationHandler.handleSuccessfulResponse - RAN name: %s - failed to convert RicNearRtId value %s to 20 bit string . Error: %s", ranName, h.config.GlobalRicId.RicNearRtId, err)
                return
        }
-       successResponse := models.NewE2SetupSuccessResponseMessage(h.config.GlobalRicId.PlmnId, ricNearRtId, setupRequest)
+       successResponse := models.NewE2SetupSuccessResponseMessage(plmnId, ricNearRtId, setupRequest)
        h.logger.Debugf("#E2SetupRequestNotificationHandler.handleSuccessfulResponse - E2_SETUP_RESPONSE has been built successfully %+v", successResponse)
 
        responsePayload, err := xml.Marshal(&successResponse.E2APPDU)
@@ -186,11 +189,30 @@ func (h E2SetupRequestNotificationHandler) handleSuccessfulResponse(ranName stri
 
        responsePayload = replaceEmptyTagsWithSelfClosing(responsePayload)
 
+       h.logger.Infof("#E2SetupRequestNotificationHandler.handleSuccessfulResponse - payload: %s", responsePayload)
+
        msg := models.NewRmrMessage(rmrCgo.RIC_E2_SETUP_RESP, ranName, responsePayload, req.TransactionId, req.GetMsgSrc())
        h.logger.Infof("#E2SetupRequestNotificationHandler.handleSuccessfulResponse - RAN name: %s - RIC_E2_SETUP_RESP message has been built successfully. Message: %x", ranName, msg)
        _ = h.rmrSender.Send(msg)
 }
 
+func buildPlmnId(mmc string, mnc string) string{
+       var b strings.Builder
+
+       b.WriteByte(mmc[1])
+       b.WriteByte(mmc[0])
+       if len(mnc) == 2 {
+               b.WriteString("F")
+       } else {
+               b.WriteByte(mnc[2])
+       }
+       b.WriteByte(mmc[2])
+       b.WriteByte(mnc[1])
+       b.WriteByte(mnc[0])
+
+       return b.String()
+}
+
 func replaceEmptyTagsWithSelfClosing(responsePayload []byte) []byte {
        responseString := strings.NewReplacer(
                "<reject></reject>", "<reject/>",
index 8712194..3f3a27b 100644 (file)
@@ -394,9 +394,10 @@ func TestE2SetupRequestNotificationHandler_ConvertTo20BitStringError(t *testing.
        xmlEnGnb := readXmlFile(t, EnGnbSetupRequestXmlPath)
        logger := tests.InitLog(t)
        config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3, GlobalRicId: struct {
-               PlmnId      string
-               RicNearRtId string
-       }{PlmnId: "131014", RicNearRtId: "10011001101010101011"}}
+               RicId string
+               Mcc   string
+               Mnc   string
+       }{Mcc: "327", Mnc: "94" ,RicId: "10011001101010101011"}}
        rmrMessengerMock := &mocks.RmrMessengerMock{}
        rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
        readerMock := &mocks.RnibReaderMock{}
@@ -452,9 +453,10 @@ func TestE2SetupRequestNotificationHandler_HandleExistingGnbInvalidStatusError(t
 func initMocks(t *testing.T) (E2SetupRequestNotificationHandler, *mocks.RnibReaderMock, *mocks.RnibWriterMock, *mocks.RmrMessengerMock, *mocks.E2TInstancesManagerMock, *mocks.RoutingManagerClientMock) {
        logger := tests.InitLog(t)
        config := &configuration.Configuration{RnibRetryIntervalMs: 10, MaxRnibConnectionAttempts: 3, GlobalRicId: struct {
-               PlmnId      string
-               RicNearRtId string
-       }{PlmnId: "131014", RicNearRtId: "556670"}}
+               RicId string
+               Mcc   string
+               Mnc   string
+       }{Mcc: "327", Mnc: "94" ,RicId: "AACCE"}}
        rmrMessengerMock := &mocks.RmrMessengerMock{}
        rmrSender := tests.InitRmrSender(rmrMessengerMock, logger)
        readerMock := &mocks.RnibReaderMock{}
index cd38bcc..dc5450b 100644 (file)
@@ -762,7 +762,7 @@ func TestRemoveE2TInstanceEmptyAddressFailure(t *testing.T) {
 //             nb.Configuration = &entities.NodebInfo_Enb{Enb:&enb}
 //             plmnId := 0x02f828
 //             nbId := 0x4a952a0a
-//             nbIdentity := &entities.NbIdentity{InventoryName: fmt.Sprintf("nameEnb%d" ,i), GlobalNbId:&entities.GlobalNbId{PlmnId:fmt.Sprintf("%02x", plmnId + i), NbId:fmt.Sprintf("%02x", nbId + i)}}
+//             nbIdentity := &entities.NbIdentity{InventoryName: fmt.Sprintf("nameEnb%d" ,i), GlobalNbId:&entities.GlobalNbId{RicId:fmt.Sprintf("%02x", plmnId + i), NbId:fmt.Sprintf("%02x", nbId + i)}}
 //             err := w.SaveNodeb(nbIdentity, &nb)
 //             if err != nil{
 //                     t.Errorf("#rNibWriter_test.TestSaveEnbInteg - Failed to save NodeB entity. Error: %v", err)
@@ -779,7 +779,7 @@ func TestRemoveE2TInstanceEmptyAddressFailure(t *testing.T) {
 //             gCell3 := &entities.ServedNRCell{ServedNrCellInformation:&entities.ServedNRCellInformation{CellId:fmt.Sprintf("%02x",3333 + i), NrPci:uint32(3 + i)}}
 //             gnb.ServedNrCells = []*entities.ServedNRCell{gCell1, gCell2, gCell3,}
 //             nb1.Configuration = &entities.NodebInfo_Gnb{Gnb:&gnb}
-//             nbIdentity = &entities.NbIdentity{InventoryName: fmt.Sprintf("nameGnb%d" ,i), GlobalNbId:&entities.GlobalNbId{PlmnId:fmt.Sprintf("%02x", plmnId - i), NbId:fmt.Sprintf("%02x", nbId - i)}}
+//             nbIdentity = &entities.NbIdentity{InventoryName: fmt.Sprintf("nameGnb%d" ,i), GlobalNbId:&entities.GlobalNbId{RicId:fmt.Sprintf("%02x", plmnId - i), NbId:fmt.Sprintf("%02x", nbId - i)}}
 //             err = w.SaveNodeb(nbIdentity, &nb1)
 //             if err != nil{
 //                     t.Errorf("#rNibWriter_test.TestSaveEnbInteg - Failed to save NodeB entity. Error: %v", err)
index d79565b..fc77022 100644 (file)
@@ -15,5 +15,6 @@ keepAliveResponseTimeoutMs: 4500
 keepAliveDelayMs: 1500
 e2tInstanceDeletionTimeoutMs: 15000
 globalRicId:
-  plmnId: 131014
-  ricNearRtId: 556670
\ No newline at end of file
+  ricId: "AACCE"
+  mcc: "310"
+  mnc: "411"
\ No newline at end of file