X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=cmd%2Fvesmgr%2Fconfig_test.go;h=da135b46d04c717c55d277cdf53bf03a891bbbbd;hb=070b3653202d9db994834cbdc175044a80e8278a;hp=b255db9e98b3bdfbefff536118e8fbf62c4ea17d;hpb=66b7813221b6da5c15da40953d09d3846a4bc029;p=ric-plt%2Fvespamgr.git diff --git a/cmd/vesmgr/config_test.go b/cmd/vesmgr/config_test.go old mode 100644 new mode 100755 index b255db9..da135b4 --- a/cmd/vesmgr/config_test.go +++ b/cmd/vesmgr/config_test.go @@ -13,16 +13,22 @@ * 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). */ - package main +package main - import ( +import ( + "bytes" + "encoding/json" + "io/ioutil" + "os" "testing" "time" - "bytes" + "github.com/stretchr/testify/assert" "gopkg.in/yaml.v2" - "os" ) func testBaseConf(t *testing.T, vesconf VESAgentConfiguration) { @@ -31,6 +37,14 @@ func testBaseConf(t *testing.T, vesconf VESAgentConfiguration) { assert.Equal(t, vesconf.Event.MaxMissed, 2) assert.Equal(t, vesconf.Event.RetryInterval, time.Second*5) assert.Equal(t, vesconf.Measurement.Prometheus.KeepAlive, time.Second*30) + assert.Equal(t, vesconf.Event.VNFName, defaultVNFName) + assert.Equal(t, vesconf.Event.NfNamingCode, defaultNFNamingCode) + assert.Equal(t, vesconf.Event.ReportingEntityName, "Vespa") + // depending on the credentials with which this test is run, + // root or non-root, the code either reads the UUID from the file or + // ends up using the default id. Just check the length here, + // not the actual value. + assert.Len(t, vesconf.Event.ReportingEntityID, len(defaultReportingEntityID)) } func TestBasicConfigContainsCorrectValues(t *testing.T) { @@ -38,7 +52,19 @@ func TestBasicConfigContainsCorrectValues(t *testing.T) { testBaseConf(t, vesconf) } +func TestBasicConfigContainsCorrectVNFName(t *testing.T) { + os.Setenv("VESMGR_VNFNAME", "VNF-111") + os.Setenv("VESMGR_NFNAMINGCODE", "code55") + vesconf := basicVespaConf() + assert.Equal(t, vesconf.Event.VNFName, "VNF-111") + assert.Equal(t, vesconf.Event.NfNamingCode, "code55") + os.Unsetenv("VESMGR_VNFNAME") + os.Unsetenv("VESMGR_NFNAMINGCODE") +} + func TestCollectorConfiguration(t *testing.T) { + os.Unsetenv("VESMGR_VNFNAME") + os.Unsetenv("VESMGR_NFNAMINGCODE") os.Setenv("VESMGR_PRICOLLECTOR_USER", "user123") os.Setenv("VESMGR_PRICOLLECTOR_PASSWORD", "pass123") os.Setenv("VESMGR_PRICOLLECTOR_PASSPHRASE", "phrase123") @@ -58,10 +84,12 @@ func TestCollectorConfiguration(t *testing.T) { assert.Equal(t, 1234, vesconf.PrimaryCollector.Port) assert.Equal(t, "vescollector", vesconf.PrimaryCollector.ServerRoot) assert.Equal(t, "sometopic", vesconf.PrimaryCollector.Topic) - assert.Equal(t, true, vesconf.PrimaryCollector.Secure) + assert.True(t, vesconf.PrimaryCollector.Secure) } func TestCollectorConfigurationWhenEnvironmentVariablesAreNotDefined(t *testing.T) { + os.Unsetenv("VESMGR_VNFNAME") + os.Unsetenv("VESMGR_NFNAMINGCODE") os.Unsetenv("VESMGR_PRICOLLECTOR_USER") os.Unsetenv("VESMGR_PRICOLLECTOR_PASSWORD") os.Unsetenv("VESMGR_PRICOLLECTOR_PASSPHRASE") @@ -81,7 +109,7 @@ func TestCollectorConfigurationWhenEnvironmentVariablesAreNotDefined(t *testing. assert.Equal(t, 8443, vesconf.PrimaryCollector.Port) assert.Equal(t, "", vesconf.PrimaryCollector.ServerRoot) assert.Equal(t, "", vesconf.PrimaryCollector.Topic) - assert.Equal(t, false, vesconf.PrimaryCollector.Secure) + assert.False(t, vesconf.PrimaryCollector.Secure) } func TestCollectorConfigurationWhenPrimaryCollectorPortIsNotInteger(t *testing.T) { @@ -95,14 +123,148 @@ func TestCollectorConfigurationWhenPrimaryCollectorSecureIsNotTrueOrFalse(t *tes os.Setenv("VESMGR_PRICOLLECTOR_SECURE", "foo") vesconf := basicVespaConf() getCollectorConfiguration(&vesconf) - assert.Equal(t, false, vesconf.PrimaryCollector.Secure) + assert.False(t, vesconf.PrimaryCollector.Secure) } -func TestYamlGeneration(t *testing.T) { +func TestYamlGenerationWithoutXAppsConfig(t *testing.T) { buffer := new(bytes.Buffer) - createVespaConfig(buffer) + createVespaConfig(buffer, []byte{}) var vesconf VESAgentConfiguration err := yaml.Unmarshal(buffer.Bytes(), &vesconf) assert.Nil(t, err) testBaseConf(t, vesconf) + assert.Empty(t, vesconf.Measurement.Prometheus.Rules.Metrics) +} + +func TestYamlGenerationWithXAppsConfig(t *testing.T) { + buffer := new(bytes.Buffer) + bytes, err := ioutil.ReadFile("../../test/xApp_config_test_output.json") + assert.Nil(t, err) + createVespaConfig(buffer, bytes) + var vesconf VESAgentConfiguration + err = yaml.Unmarshal(buffer.Bytes(), &vesconf) + assert.Nil(t, err) + testBaseConf(t, vesconf) + assert.Len(t, vesconf.Measurement.Prometheus.Rules.Metrics, 4) +} + +// Helper function for the metrics parsing tests +func metricsStringToInterfaceArray(metrics string) []interface{} { + var metricsArray map[string][]interface{} + json.Unmarshal([]byte(metrics), &metricsArray) + return metricsArray["metrics"] +} + +func TestParseMetricsRules(t *testing.T) { + metricsJSON := `{"metrics": [ + { "name": "ricxapp_RMR_Received", "objectName": "ricxappRMRreceivedCounter", "objectInstance": "ricxappRMRReceived", "counterId": "0011" }, + { "name": "ricxapp_RMR_ReceiveError", "objectName": "ricxappRMRReceiveErrorCounter", "objectInstance": "ricxappRMRReceiveError", "counterId": "0011" }, + { "name": "ricxapp_RMR_Transmitted", "objectName": "ricxappRMRTransmittedCounter", "objectInstance": "ricxappRMRTransmitted", "counterId": "0011" }, + { "name": "ricxapp_RMR_TransmitError", "objectName": "ricxappRMRTransmitErrorCounter", "objectInstance": "ricxappRMRTransmitError", "counterId": "0011" }, + { "name": "ricxapp_SDL_Stored", "objectName": "ricxappSDLStoredCounter", "objectInstance": "ricxappSDLStored", "counterId": "0011" }, + { "name": "ricxapp_SDL_StoreError", "objectName": "ricxappSDLStoreErrorCounter", "objectInstance": "ricxappSDLStoreError", "counterId": "0011" } ]}` + appMetrics := make(AppMetrics) + m := metricsStringToInterfaceArray(metricsJSON) + appMetrics = parseMetricsRules(m, appMetrics, "SEP/XAPP", "X2", "1234", "60") + assert.Len(t, appMetrics, 6) + assert.Equal(t, "ricxappRMRreceivedCounter", appMetrics["ricxapp_RMR_Received"].ObjectName) + assert.Equal(t, "ricxappRMRTransmitErrorCounter", appMetrics["ricxapp_RMR_TransmitError"].ObjectName) + assert.Equal(t, "ricxappSDLStoreError", appMetrics["ricxapp_SDL_StoreError"].ObjectInstance) +} + +func TestParseMetricsRulesNoMetrics(t *testing.T) { + appMetrics := make(AppMetrics) + metricsJSON := `{"metrics": []` + m := metricsStringToInterfaceArray(metricsJSON) + appMetrics = parseMetricsRules(m, appMetrics, "SEP/XAPP", "X2", "1234", "60") + assert.Empty(t, appMetrics) +} + +func TestParseMetricsRulesAdditionalFields(t *testing.T) { + appMetrics := make(AppMetrics) + metricsJSON := `{"metrics": [ + { "additionalField": "valueIgnored", "name": "ricxapp_RMR_Received", "objectName": "ricxappRMRreceivedCounter", "objectInstance": "ricxappRMRReceived", "counterId": "0011" }]}` + m := metricsStringToInterfaceArray(metricsJSON) + appMetrics = parseMetricsRules(m, appMetrics, "SEP/XAPP", "X2", "1234", "60") + assert.Len(t, appMetrics, 1) + assert.Equal(t, "ricxappRMRreceivedCounter", appMetrics["ricxapp_RMR_Received"].ObjectName) + assert.Equal(t, "ricxappRMRReceived", appMetrics["ricxapp_RMR_Received"].ObjectInstance) +} + +func TestParseMetricsRulesMissingFields(t *testing.T) { + appMetrics := make(AppMetrics) + metricsJSON := `{"metrics": [ + { "name": "ricxapp_RMR_Received", "objectName": "ricxappRMRreceivedCounter", "objectInstance": "ricxappRMRReceived", "counterId": "0011" }, + { "name": "ricxapp_RMR_ReceiveError", "objectInstance": "ricxappRMRReceiveError" }, + { "name": "ricxapp_RMR_Transmitted", "objectName": "ricxappRMRTransmittedCounter", "objectInstance": "ricxappRMRTransmitted", "counterId": "0011" }]}` + m := metricsStringToInterfaceArray(metricsJSON) + appMetrics = parseMetricsRules(m, appMetrics, "SEP/XAPP", "X2", "1234", "60") + assert.Len(t, appMetrics, 2) + assert.Equal(t, "ricxappRMRreceivedCounter", appMetrics["ricxapp_RMR_Received"].ObjectName) + assert.Equal(t, "ricxappRMRTransmittedCounter", appMetrics["ricxapp_RMR_Transmitted"].ObjectName) + _, ok := appMetrics["ricxapp_RMR_ReceiveError"] + assert.False(t, ok) +} + +func TestParseMetricsRulesDuplicateDefinitionIsIgnored(t *testing.T) { + appMetrics := make(AppMetrics) + metricsJSON := `{"metrics": [ + { "name": "ricxapp_RMR_Received", "objectName": "ricxappRMRreceivedCounter", "objectInstance": "ricxappRMRReceived", "counterId": "0011" }, + { "name": "ricxapp_RMR_Received", "objectName": "ricxappRMRreceivedCounterXXX", "objectInstance": "ricxappRMRReceivedXXX", "counterId": "0011" }, + { "name": "ricxapp_RMR_Transmitted", "objectName": "ricxappRMRTransmittedCounter", "objectInstance": "ricxappRMRTransmitted", "counterId": "0011" }]}` + m := metricsStringToInterfaceArray(metricsJSON) + appMetrics = parseMetricsRules(m, appMetrics, "SEP/XAPP", "X2", "1234", "60") + assert.Len(t, appMetrics, 2) + assert.Equal(t, "ricxappRMRreceivedCounter", appMetrics["ricxapp_RMR_Received"].ObjectName) + assert.Equal(t, "ricxappRMRReceived", appMetrics["ricxapp_RMR_Received"].ObjectInstance) +} + +func TestParseMetricsRulesIncrementalFillOfAppMetrics(t *testing.T) { + appMetrics := make(AppMetrics) + metricsJSON1 := `{"metrics": [ + { "name": "ricxapp_RMR_Received", "objectName": "ricxappRMRreceivedCounter", "objectInstance": "ricxappRMRReceived", "counterId": "0011" }]}` + metricsJSON2 := `{"metrics": [ + { "name": "ricxapp_RMR_Transmitted", "objectName": "ricxappRMRTransmittedCounter", "objectInstance": "ricxappRMRTransmitted", "counterId": "0011" }]}` + m1 := metricsStringToInterfaceArray(metricsJSON1) + m2 := metricsStringToInterfaceArray(metricsJSON2) + appMetrics = parseMetricsRules(m1, appMetrics, "SEP/XAPP", "X2", "1234", "60") + appMetrics = parseMetricsRules(m2, appMetrics, "SEP/XAPP", "X2", "1234", "60") + assert.Len(t, appMetrics, 2) + assert.Equal(t, "ricxappRMRreceivedCounter", appMetrics["ricxapp_RMR_Received"].ObjectName) + assert.Equal(t, "ricxappRMRReceived", appMetrics["ricxapp_RMR_Received"].ObjectInstance) +} + +func TestParseXAppDescriptor(t *testing.T) { + appMetrics := make(AppMetrics) + bytes, err := ioutil.ReadFile("../../test/xApp_config_test_output.json") + assert.Nil(t, err) + + appMetrics = parseMetricsFromXAppDescriptor(bytes, appMetrics) + assert.Len(t, appMetrics, 4) + assert.Equal(t, "App1ExampleCounterOneObject", appMetrics["App1ExampleCounterOne"].ObjectName) + assert.Equal(t, "App1ExampleCounterOneObjectInstance", appMetrics["App1ExampleCounterOne"].ObjectInstance) + assert.Equal(t, "App1ExampleCounterTwoObject", appMetrics["App1ExampleCounterTwo"].ObjectName) + assert.Equal(t, "App1ExampleCounterTwoObjectInstance", appMetrics["App1ExampleCounterTwo"].ObjectInstance) + assert.Equal(t, "App2ExampleCounterOneObject", appMetrics["App2ExampleCounterOne"].ObjectName) + assert.Equal(t, "App2ExampleCounterOneObjectInstance", appMetrics["App2ExampleCounterOne"].ObjectInstance) + assert.Equal(t, "App2ExampleCounterTwoObject", appMetrics["App2ExampleCounterTwo"].ObjectName) + assert.Equal(t, "App2ExampleCounterTwoObjectInstance", appMetrics["App2ExampleCounterTwo"].ObjectInstance) +} + +func TestParseXAppDescriptorWithNoConfig(t *testing.T) { + metricsJSON := `[{{"metadata": "something", "descriptor": "somethingelse"}}, + {{"metadata": "something", "descriptor": "somethingelse"}}]` + metricsBytes := []byte(metricsJSON) + appMetrics := make(AppMetrics) + appMetrics = parseMetricsFromXAppDescriptor(metricsBytes, appMetrics) + assert.Empty(t, appMetrics) +} + +func TestParseXAppDescriptorWithNoMetrics(t *testing.T) { + metricsJSON := `[{{"metadata": "something", "descriptor": "somethingelse", "config":{}}, + {{"metadata": "something", "descriptor": "somethingelse", "config":{}}}]` + metricsBytes := []byte(metricsJSON) + appMetrics := make(AppMetrics) + appMetrics = parseMetricsFromXAppDescriptor(metricsBytes, appMetrics) + assert.Empty(t, appMetrics) }