Fix NfNamingCode and remove NfcNamingCodes
[ric-plt/vespamgr.git] / cmd / vesmgr / config.go
index e2c9f25..0df132b 100644 (file)
@@ -19,36 +19,61 @@ package main
 
 import (
        "encoding/json"
-       "gopkg.in/yaml.v2"
        "io"
+       "io/ioutil"
        "os"
        "strconv"
+       "strings"
        "time"
+
+       "gopkg.in/yaml.v2"
 )
 
+const defaultReportingEntityID = "00000000-0000-0000-0000-000000000000"
+const defaultVNFName = "Vespa"
+const defaultNFNamingCode = "ricp"
+
+func readSystemUUID() string {
+       data, err := ioutil.ReadFile("/sys/class/dmi/id/product_uuid")
+       if err != nil {
+               return defaultReportingEntityID
+       }
+       return strings.TrimSpace(string(data))
+}
+
+func getVNFName() string {
+       VNFName := os.Getenv("VESMGR_VNFNAME")
+       if VNFName == "" {
+               return defaultVNFName
+       }
+       return VNFName
+}
+
+func getNFNamingCode() string {
+       NFNamingCode := os.Getenv("VESMGR_NFNAMINGCODE")
+       if NFNamingCode == "" {
+               return defaultNFNamingCode
+       }
+       return NFNamingCode
+}
+
 func basicVespaConf() VESAgentConfiguration {
        var vespaconf = VESAgentConfiguration{
                DataDir: "/tmp/data",
                Debug:   false,
                Event: EventConfiguration{
-                       VNFName:           "vespa-demo",                          // XXX
-                       ReportingEntityID: "1af5bfa9-40b4-4522-b045-40e54f0310f", // XXX
-                       MaxSize:           2000000,
-                       NfNamingCode:      "hsxp",
-                       NfcNamingCodes: []NfcNamingCode{
-                               NfcNamingCode{
-                                       Type:  "oam",
-                                       Vnfcs: []string{"lr-ope-0", "lr-ope-1", "lr-ope-2"},
-                               },
-                               NfcNamingCode{
-                                       Type:  "etl",
-                                       Vnfcs: []string{"lr-pro-0", "lr-pro-1"},
-                               },
-                       },
+                       VNFName:             getVNFName(),
+                       ReportingEntityName: "Vespa",
+                       ReportingEntityID:   readSystemUUID(),
+                       MaxSize:             2000000,
+                       NfNamingCode:        getNFNamingCode(),
+                       NfcNamingCodes: []NfcNamingCode{},
                        RetryInterval: time.Second * 5,
                        MaxMissed:     2,
                },
                Measurement: MeasurementConfiguration{
+                       // Domain abbreviation has to be set to “Mvfs” for VES 5.3,
+                       // and to “Measurement” for later VES interface versions.
                        DomainAbbreviation:   "Mvfs",
                        MaxBufferingDuration: time.Hour,
                        Prometheus: PrometheusConfig{
@@ -65,12 +90,13 @@ func basicVespaConf() VESAgentConfiguration {
        return vespaconf
 }
 
+// AppMetricsStruct contains xapplication metrics definition
 type AppMetricsStruct struct {
        ObjectName     string
        ObjectInstance string
-       // xxx add labels here
 }
 
+// AppMetrics contains metrics definitions for all Xapps
 type AppMetrics map[string]AppMetricsStruct
 
 // Parses the metrics data from an array of bytes, which is expected to contain a JSON
@@ -89,10 +115,10 @@ func parseMetricsFromXAppDescriptor(descriptor []byte, appMetrics AppMetrics) Ap
        json.Unmarshal(descriptor, &desc)
 
        for _, app := range desc {
-               config, config_ok := app["config"]
-               if config_ok {
-                       metrics, metrics_ok := config.(map[string]interface{})["metrics"]
-                       if metrics_ok {
+               config, configOk := app["config"]
+               if configOk {
+                       metrics, metricsOk := config.(map[string]interface{})["metrics"]
+                       if metricsOk {
                                parseMetricsRules(metrics.([]interface{}), appMetrics)
                        }
                }
@@ -106,16 +132,16 @@ func parseMetricsFromXAppDescriptor(descriptor []byte, appMetrics AppMetrics) Ap
 // Entries, which do not have all the necessary fields, are ignored.
 func parseMetricsRules(metricsMap []interface{}, appMetrics AppMetrics) AppMetrics {
        for _, element := range metricsMap {
-               name, name_ok := element.(map[string]interface{})["name"].(string)
-               if name_ok {
-                       _, already_found := appMetrics[name]
-                       objectName, objectName_ok := element.(map[string]interface{})["objectName"].(string)
-                       objectInstance, objectInstance_ok := element.(map[string]interface{})["objectInstance"].(string)
-                       if !already_found && objectName_ok && objectInstance_ok {
+               name, nameOk := element.(map[string]interface{})["name"].(string)
+               if nameOk {
+                       _, alreadyFound := appMetrics[name]
+                       objectName, objectNameOk := element.(map[string]interface{})["objectName"].(string)
+                       objectInstance, objectInstanceOk := element.(map[string]interface{})["objectInstance"].(string)
+                       if !alreadyFound && objectNameOk && objectInstanceOk {
                                appMetrics[name] = AppMetricsStruct{objectName, objectInstance}
                                logger.Info("parsed counter %s %s %s", name, objectName, objectInstance)
                        }
-                       if already_found {
+                       if alreadyFound {
                                logger.Info("skipped duplicate counter %s", name)
                        }
                }
@@ -127,12 +153,12 @@ func getRules(vespaconf *VESAgentConfiguration, xAppConfig []byte) {
        appMetrics := make(AppMetrics)
        parseMetricsFromXAppDescriptor(xAppConfig, appMetrics)
 
-       makeRule := func(expr string, obj_name string, obj_instance string) MetricRule {
+       makeRule := func(expr string, objName string, objInstance string) MetricRule {
                return MetricRule{
                        Target:         "AdditionalObjects",
                        Expr:           expr,
-                       ObjectInstance: obj_instance,
-                       ObjectName:     obj_name,
+                       ObjectInstance: objInstance,
+                       ObjectName:     objName,
                        ObjectKeys: []Label{
                                Label{
                                        Name: "ricComponentName",
@@ -161,15 +187,15 @@ func getCollectorConfiguration(vespaconf *VESAgentConfiguration) {
        vespaconf.PrimaryCollector.FQDN = os.Getenv("VESMGR_PRICOLLECTOR_ADDR")
        vespaconf.PrimaryCollector.ServerRoot = os.Getenv("VESMGR_PRICOLLECTOR_SERVERROOT")
        vespaconf.PrimaryCollector.Topic = os.Getenv("VESMGR_PRICOLLECTOR_TOPIC")
-       port_str := os.Getenv("VESMGR_PRICOLLECTOR_PORT")
-       if port_str == "" {
+       portStr := os.Getenv("VESMGR_PRICOLLECTOR_PORT")
+       if portStr == "" {
                vespaconf.PrimaryCollector.Port = 8443
        } else {
-               port, _ := strconv.Atoi(port_str)
+               port, _ := strconv.Atoi(portStr)
                vespaconf.PrimaryCollector.Port = port
        }
-       secure_str := os.Getenv("VESMGR_PRICOLLECTOR_SECURE")
-       if secure_str == "true" {
+       secureStr := os.Getenv("VESMGR_PRICOLLECTOR_SECURE")
+       if secureStr == "true" {
                vespaconf.PrimaryCollector.Secure = true
        } else {
                vespaconf.PrimaryCollector.Secure = false