X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=cmd%2Fvesmgr%2Fconfig_test.go;h=08bde190ca9d9a27be20098916246029be294993;hb=9a9ecfe2f3f3592c07c24e502b4ce252cf3bd377;hp=0a809b1c2db3b6e6cd65c776a546536b84d3e90f;hpb=4b74f01111b3b14fbb3832d8aaf4946cded374a0;p=ric-plt%2Fvespamgr.git diff --git a/cmd/vesmgr/config_test.go b/cmd/vesmgr/config_test.go index 0a809b1..08bde19 100644 --- a/cmd/vesmgr/config_test.go +++ b/cmd/vesmgr/config_test.go @@ -14,34 +14,231 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package main +package main - import ( - "testing" - "time" +import ( "bytes" + "encoding/json" "github.com/stretchr/testify/assert" "gopkg.in/yaml.v2" - ) + "io/ioutil" + "os" + "testing" + "time" +) - func testBaseConf(t *testing.T, vesconf VESAgentConfiguration) { +func testBaseConf(t *testing.T, vesconf VESAgentConfiguration) { assert.Equal(t, "/tmp/data", vesconf.DataDir) assert.False(t, vesconf.Debug) 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) - } +} - func TestBasicConfigContainsCorrectValues(t *testing.T) { +func TestBasicConfigContainsCorrectValues(t *testing.T) { vesconf := basicVespaConf() testBaseConf(t, vesconf) - } +} + +func TestCollectorConfiguration(t *testing.T) { + os.Setenv("VESMGR_PRICOLLECTOR_USER", "user123") + os.Setenv("VESMGR_PRICOLLECTOR_PASSWORD", "pass123") + os.Setenv("VESMGR_PRICOLLECTOR_PASSPHRASE", "phrase123") + os.Setenv("VESMGR_PRICOLLECTOR_ADDR", "1.2.3.4") + os.Setenv("VESMGR_PRICOLLECTOR_PORT", "1234") + os.Setenv("VESMGR_PRICOLLECTOR_SERVERROOT", "vescollector") + os.Setenv("VESMGR_PRICOLLECTOR_TOPIC", "sometopic") + os.Setenv("VESMGR_PRICOLLECTOR_SECURE", "true") + + vesconf := basicVespaConf() + getCollectorConfiguration(&vesconf) + + assert.Equal(t, "user123", vesconf.PrimaryCollector.User) + assert.Equal(t, "pass123", vesconf.PrimaryCollector.Password) + assert.Equal(t, "phrase123", vesconf.PrimaryCollector.PassPhrase) + assert.Equal(t, "1.2.3.4", vesconf.PrimaryCollector.FQDN) + assert.Equal(t, 1234, vesconf.PrimaryCollector.Port) + assert.Equal(t, "vescollector", vesconf.PrimaryCollector.ServerRoot) + assert.Equal(t, "sometopic", vesconf.PrimaryCollector.Topic) + assert.True(t, vesconf.PrimaryCollector.Secure) +} + +func TestCollectorConfigurationWhenEnvironmentVariablesAreNotDefined(t *testing.T) { + os.Unsetenv("VESMGR_PRICOLLECTOR_USER") + os.Unsetenv("VESMGR_PRICOLLECTOR_PASSWORD") + os.Unsetenv("VESMGR_PRICOLLECTOR_PASSPHRASE") + os.Unsetenv("VESMGR_PRICOLLECTOR_ADDR") + os.Unsetenv("VESMGR_PRICOLLECTOR_PORT") + os.Unsetenv("VESMGR_PRICOLLECTOR_SERVERROOT") + os.Unsetenv("VESMGR_PRICOLLECTOR_TOPIC") + os.Unsetenv("VESMGR_PRICOLLECTOR_SECURE") - func TestYamlGeneratio(t *testing.T) { + vesconf := basicVespaConf() + getCollectorConfiguration(&vesconf) + + assert.Equal(t, "", vesconf.PrimaryCollector.User) + assert.Equal(t, "", vesconf.PrimaryCollector.Password) + assert.Equal(t, "", vesconf.PrimaryCollector.PassPhrase) + assert.Equal(t, "", vesconf.PrimaryCollector.FQDN) + assert.Equal(t, 8443, vesconf.PrimaryCollector.Port) + assert.Equal(t, "", vesconf.PrimaryCollector.ServerRoot) + assert.Equal(t, "", vesconf.PrimaryCollector.Topic) + assert.False(t, vesconf.PrimaryCollector.Secure) +} + +func TestCollectorConfigurationWhenPrimaryCollectorPortIsNotInteger(t *testing.T) { + os.Setenv("VESMGR_PRICOLLECTOR_PORT", "abcd") + vesconf := basicVespaConf() + getCollectorConfiguration(&vesconf) + assert.Equal(t, 0, vesconf.PrimaryCollector.Port) +} + +func TestCollectorConfigurationWhenPrimaryCollectorSecureIsNotTrueOrFalse(t *testing.T) { + os.Setenv("VESMGR_PRICOLLECTOR_SECURE", "foo") + vesconf := basicVespaConf() + getCollectorConfiguration(&vesconf) + assert.False(t, vesconf.PrimaryCollector.Secure) +} + +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" }, + { "name": "ricxapp_RMR_ReceiveError", "objectName": "ricxappRMRReceiveErrorCounter", "objectInstance": "ricxappRMRReceiveError" }, + { "name": "ricxapp_RMR_Transmitted", "objectName": "ricxappRMRTransmittedCounter", "objectInstance": "ricxappRMRTransmitted" }, + { "name": "ricxapp_RMR_TransmitError", "objectName": "ricxappRMRTransmitErrorCounter", "objectInstance": "ricxappRMRTransmitError" }, + { "name": "ricxapp_SDL_Stored", "objectName": "ricxappSDLStoredCounter", "objectInstance": "ricxappSDLStored" }, + { "name": "ricxapp_SDL_StoreError", "objectName": "ricxappSDLStoreErrorCounter", "objectInstance": "ricxappSDLStoreError" } ]}` + appMetrics := make(AppMetrics) + var m []interface{} = metricsStringToInterfaceArray(metricsJson) + appMetrics = parseMetricsRules(m, appMetrics) + 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": []` + var m []interface{} = metricsStringToInterfaceArray(metricsJson) + appMetrics = parseMetricsRules(m, appMetrics) + assert.Empty(t, appMetrics) +} + +func TestParseMetricsRulesAdditionalFields(t *testing.T) { + appMetrics := make(AppMetrics) + metricsJson := `{"metrics": [ + { "additionalField": "valueIgnored", "name": "ricxapp_RMR_Received", "objectName": "ricxappRMRreceivedCounter", "objectInstance": "ricxappRMRReceived" }]}` + var m []interface{} = metricsStringToInterfaceArray(metricsJson) + appMetrics = parseMetricsRules(m, appMetrics) + 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" }, + { "name": "ricxapp_RMR_ReceiveError", "objectInstance": "ricxappRMRReceiveError" }, + { "name": "ricxapp_RMR_Transmitted", "objectName": "ricxappRMRTransmittedCounter", "objectInstance": "ricxappRMRTransmitted" }]}` + var m []interface{} = metricsStringToInterfaceArray(metricsJson) + appMetrics = parseMetricsRules(m, appMetrics) + 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" }, + { "name": "ricxapp_RMR_Received", "objectName": "ricxappRMRreceivedCounterXXX", "objectInstance": "ricxappRMRReceivedXXX" }, + { "name": "ricxapp_RMR_Transmitted", "objectName": "ricxappRMRTransmittedCounter", "objectInstance": "ricxappRMRTransmitted" }]}` + var m []interface{} = metricsStringToInterfaceArray(metricsJson) + appMetrics = parseMetricsRules(m, appMetrics) + 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" }]}` + metricsJson2 := `{"metrics": [ + { "name": "ricxapp_RMR_Transmitted", "objectName": "ricxappRMRTransmittedCounter", "objectInstance": "ricxappRMRTransmitted" }]}` + var m1 []interface{} = metricsStringToInterfaceArray(metricsJson1) + var m2 []interface{} = metricsStringToInterfaceArray(metricsJson2) + appMetrics = parseMetricsRules(m1, appMetrics) + appMetrics = parseMetricsRules(m2, appMetrics) + 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) +}