Fixing bug in O-DU slice assurance app 09/7709/3
authorychacon <yennifer.chacon@est.tech>
Tue, 8 Feb 2022 09:46:39 +0000 (10:46 +0100)
committerychacon <yennifer.chacon@est.tech>
Tue, 8 Feb 2022 11:33:24 +0000 (12:33 +0100)
Issue-ID: NONRTRIC-637
Signed-off-by: ychacon <yennifer.chacon@est.tech>
Change-Id: I59bbb44679f1bc97351cc43e5b80ffa8d58ab810

test/usecases/odusliceassurance/goversion/internal/sliceassurance/app.go
test/usecases/odusliceassurance/goversion/internal/structures/sliceassurance.go
test/usecases/odusliceassurance/goversion/internal/structures/sliceassurance_test.go
test/usecases/odusliceassurance/goversion/main.go
test/usecases/odusliceassurance/goversion/messages/stdVesMessage.go
test/usecases/odusliceassurance/goversion/stub/simulator.go

index 2cef277..4266508 100644 (file)
@@ -69,9 +69,8 @@ func (a *App) Run(topic string, pollTime int) {
 
 func (a *App) getMessagesFromDmaap(url string) {
        var stdMessage messages.StdDefinedMessage
-
        a.client.Get(url, &stdMessage)
-       log.Infof("Polling new messages from DmaapMR: %v", stdMessage)
+       log.Infof("Polling new messages from DmaapMR")
        for _, meas := range stdMessage.GetMeasurements() {
                //Create sliceMetric and check if metric exist and update existing one or create new one
                if _, err := a.metricsPolicies.AddOrUpdateMetric(meas); err != nil {
index 7cefcaf..1f9c860 100644 (file)
@@ -25,6 +25,7 @@ import (
        "regexp"
        "strconv"
 
+       log "github.com/sirupsen/logrus"
        "oransc.org/usecase/oduclosedloop/messages"
 )
 
@@ -51,8 +52,13 @@ func (sa *SliceAssuranceMeas) AddNewPolicy(duid string, rrmPolicyRatio messages.
                metric := sa.GetSliceMetric(duid, policyMember.SliceDifferentiator, policyMember.SliceServiceType)
                if metric != nil {
                        pr := NewPolicyRatio(rrmPolicyRatio.Id, rrmPolicyRatio.RRMPolicyMaxRatio, rrmPolicyRatio.RRMPolicyMinRatio, rrmPolicyRatio.RRMPolicyDedicatedRatio)
+                       _, check := sa.Policies[pr.PolicyRatioId]
+                       if !check {
+                               log.Infof(" new policy has been added %+v", *pr)
+                       }
                        sa.Policies[pr.PolicyRatioId] = pr
                        metric.RRMPolicyRatioId = rrmPolicyRatio.Id
+
                }
        }
 }
@@ -73,7 +79,7 @@ func (sa *SliceAssuranceMeas) AddOrUpdateMetric(meas messages.Measurement) (stri
        var duid string
        var sd, sst int
 
-       regex := *regexp.MustCompile(`\/(.*)network-function\/distributed-unit-functions\[id=\'(.*)\'\]\/cell\[id=\'(.*)\'\]\/supported-measurements\[performance-measurement-type=\'(.*)\'\]\/supported-snssai-subcounter-instances\[slice-differentiator=\'(\d+)\'\]\[slice-service-type=\'(\d+)\'\]`)
+       regex := *regexp.MustCompile(`\/(.*)network-function\/distributed-unit-functions\[id=\'(.*)\'\]\/cell\[id=\'(.*)\'\]\/supported-measurements\/performance-measurement-type=\'(.*)\'\]\/supported-snssai-subcounter-instances\[slice-differentiator=\'(\d+)\'\]\[slice-service-type=\'(\d+)\'\]`)
        res := regex.FindAllStringSubmatch(meas.MeasurementTypeInstanceReference, -1)
 
        if res != nil && len(res[0]) == 7 {
@@ -102,14 +108,17 @@ func (sa *SliceAssuranceMeas) addMetric(res [][]string, metricValue int) {
                metric.PM[res[0][3]] = metricValue
                key := MapKey{res[0][2], toInt(res[0][5]), toInt(res[0][6])}
                sa.Metrics[key] = metric
+               log.Infof(" new metric has been added %+v", *metric)
        }
 }
 
 func (sa *SliceAssuranceMeas) updateMetric(key MapKey, value *SliceMetric, metricName string, metricValue int) {
        if metricValue < 700 {
                delete(sa.Metrics, key)
+               log.Infof(" metric with key %+v has been deleted", key)
        } else {
                value.PM[metricName] = metricValue
+               log.Infof(" metric value has been updated, new value: %v", metricValue)
        }
 }
 
index 9ed35fb..792f475 100644 (file)
@@ -41,7 +41,7 @@ func TestAddMetric(t *testing.T) {
                        name: "Test adding new metric",
                        args: args{
                                meas: messages.Measurement{
-                                       MeasurementTypeInstanceReference: "/o-ran-sc-du-hello-world:network-function/distributed-unit-functions[id='O-DU-1211']/cell[id='cell-1']/supported-measurements[performance-measurement-type='user-equipment-average-throughput-uplink']/supported-snssai-subcounter-instances[slice-differentiator='1'][slice-service-type='1']",
+                                       MeasurementTypeInstanceReference: "/o-ran-sc-du-hello-world:network-function/distributed-unit-functions[id='O-DU-1211']/cell[id='cell-1']/supported-measurements/performance-measurement-type='user-equipment-average-throughput-uplink']/supported-snssai-subcounter-instances[slice-differentiator='1'][slice-service-type='1']",
                                        Value:                            51232,
                                        Unit:                             "kbit/s",
                                },
@@ -51,7 +51,7 @@ func TestAddMetric(t *testing.T) {
                        name: "Test with invalid input",
                        args: args{
                                meas: messages.Measurement{
-                                       MeasurementTypeInstanceReference: "/distributed-unit-functions[id='O-DU-1211']/cell[id='cell-1']/supported-measurements[performance-measurement-type='user-equipment-average-throughput-uplink']/supported-snssai-subcounter-instances[slice-differentiator='1'][slice-service-type='1']",
+                                       MeasurementTypeInstanceReference: "/distributed-unit-functions[id='O-DU-1211']/cell[id='cell-1']/supported-measurements/performance-measurement-type='user-equipment-average-throughput-uplink']/supported-snssai-subcounter-instances[slice-differentiator='1'][slice-service-type='1']",
                                        Value:                            51232,
                                        Unit:                             "kbit/s",
                                },
@@ -83,13 +83,13 @@ func TestAddMetric(t *testing.T) {
 func TestUpdateExistingMetric(t *testing.T) {
        assertions := require.New(t)
        meas := messages.Measurement{
-               MeasurementTypeInstanceReference: "/o-ran-sc-du-hello-world:network-function/distributed-unit-functions[id='O-DU-1211']/cell[id='cell-1']/supported-measurements[performance-measurement-type='user-equipment-average-throughput-uplink']/supported-snssai-subcounter-instances[slice-differentiator='1'][slice-service-type='1']",
+               MeasurementTypeInstanceReference: "/o-ran-sc-du-hello-world:network-function/distributed-unit-functions[id='O-DU-1211']/cell[id='cell-1']/supported-measurements/performance-measurement-type='user-equipment-average-throughput-uplink']/supported-snssai-subcounter-instances[slice-differentiator='1'][slice-service-type='1']",
                Value:                            51232,
                Unit:                             "kbit/s",
        }
 
        updateMeas := messages.Measurement{
-               MeasurementTypeInstanceReference: "/o-ran-sc-du-hello-world:network-function/distributed-unit-functions[id='O-DU-1211']/cell[id='cell-1']/supported-measurements[performance-measurement-type='user-equipment-average-throughput-uplink']/supported-snssai-subcounter-instances[slice-differentiator='1'][slice-service-type='1']",
+               MeasurementTypeInstanceReference: "/o-ran-sc-du-hello-world:network-function/distributed-unit-functions[id='O-DU-1211']/cell[id='cell-1']/supported-measurements/performance-measurement-type='user-equipment-average-throughput-uplink']/supported-snssai-subcounter-instances[slice-differentiator='1'][slice-service-type='1']",
                Value:                            897,
                Unit:                             "kbit/s",
        }
@@ -115,13 +115,13 @@ func TestUpdateExistingMetric(t *testing.T) {
 func TestDeleteMetricWhenValueLessThanThreshold(t *testing.T) {
 
        meas := messages.Measurement{
-               MeasurementTypeInstanceReference: "/o-ran-sc-du-hello-world:network-function/distributed-unit-functions[id='O-DU-1211']/cell[id='cell-1']/supported-measurements[performance-measurement-type='user-equipment-average-throughput-uplink']/supported-snssai-subcounter-instances[slice-differentiator='1'][slice-service-type='1']",
+               MeasurementTypeInstanceReference: "/o-ran-sc-du-hello-world:network-function/distributed-unit-functions[id='O-DU-1211']/cell[id='cell-1']/supported-measurements/performance-measurement-type='user-equipment-average-throughput-uplink']/supported-snssai-subcounter-instances[slice-differentiator='1'][slice-service-type='1']",
                Value:                            51232,
                Unit:                             "kbit/s",
        }
 
        newMeas := messages.Measurement{
-               MeasurementTypeInstanceReference: "/o-ran-sc-du-hello-world:network-function/distributed-unit-functions[id='O-DU-1211']/cell[id='cell-1']/supported-measurements[performance-measurement-type='user-equipment-average-throughput-uplink']/supported-snssai-subcounter-instances[slice-differentiator='1'][slice-service-type='1']",
+               MeasurementTypeInstanceReference: "/o-ran-sc-du-hello-world:network-function/distributed-unit-functions[id='O-DU-1211']/cell[id='cell-1']/supported-measurements/performance-measurement-type='user-equipment-average-throughput-uplink']/supported-snssai-subcounter-instances[slice-differentiator='1'][slice-service-type='1']",
                Value:                            50,
                Unit:                             "kbit/s",
        }
@@ -140,7 +140,7 @@ func TestDeleteMetricWhenValueLessThanThreshold(t *testing.T) {
 func TestAddPolicy(t *testing.T) {
 
        meas := messages.Measurement{
-               MeasurementTypeInstanceReference: "/o-ran-sc-du-hello-world:network-function/distributed-unit-functions[id='O-DU-1211']/cell[id='cell-1']/supported-measurements[performance-measurement-type='user-equipment-average-throughput-uplink']/supported-snssai-subcounter-instances[slice-differentiator='1'][slice-service-type='1']",
+               MeasurementTypeInstanceReference: "/o-ran-sc-du-hello-world:network-function/distributed-unit-functions[id='O-DU-1211']/cell[id='cell-1']/supported-measurements/performance-measurement-type='user-equipment-average-throughput-uplink']/supported-snssai-subcounter-instances[slice-differentiator='1'][slice-service-type='1']",
                Value:                            51232,
                Unit:                             "kbit/s",
        }
index f1c8d42..4497cfb 100644 (file)
@@ -29,7 +29,7 @@ import (
        "oransc.org/usecase/oduclosedloop/internal/sliceassurance"
 )
 
-const TOPIC string = "unauthenticated.VES_O_RAN_SC_HELLO_WORLD_PM_STREAMING_OUTPUT"
+const TOPIC string = "/events/unauthenticated.VES_O_RAN_SC_HELLO_WORLD_PM_STREAMING_OUTPUT/myG/C1"
 
 var configuration *config.Config
 
index c2c5849..5c4a3b0 100644 (file)
@@ -30,8 +30,24 @@ type Event struct {
 }
 
 type CommonEventHeader struct {
-       Domain               string `json:"domain"`
-       StndDefinedNamespace string `json:"stndDefinedNamespace"`
+       Domain                  string `json:"domain"`
+       EventId                 string `json:"eventId"`
+       EventName               string `json:"eventName"`
+       EventType               string `json:"eventType"`
+       Sequence                int    `json:"sequence"`
+       Priority                string `json:"priority"`
+       ReportingEntityId       string `json:"reportingEntityId"`
+       ReportingEntityName     string `json:"reportingEntityName"`
+       SourceId                string `json:"sourceId"`
+       SourceName              string `json:"sourceName"`
+       StartEpochMicrosec      int64  `json:"startEpochMicrosec"`
+       LastEpochMicrosec       int64  `json:"lastEpochMicrosec"`
+       NfNamingCode            string `json:"nfNamingCode"`
+       NfVendorName            string `json:"nfVendorName"`
+       StndDefinedNamespace    string `json:"stndDefinedNamespace"`
+       TimeZoneOffset          string `json:"timeZoneOffset"`
+       Version                 string `json:"version"`
+       VesEventListenerVersion string `json:"vesEventListenerVersion"`
 }
 
 type StndDefinedFields struct {
@@ -41,8 +57,14 @@ type StndDefinedFields struct {
 }
 
 type Data struct {
-       DataId       string        `json:"id"`
-       Measurements []Measurement `json:"measurements"`
+       DataId              string        `json:"id"`
+       StartTime           string        `json:"start-time"`
+       AdministrativeState string        `json:"administrative-state"`
+       OperationalState    string        `json:"operational-state"`
+       UserLabel           string        `json:"user-label"`
+       JobTag              string        `json:"job-tag"`
+       GranularityPeriod   int           `json:"granularity-period"`
+       Measurements        []Measurement `json:"measurements"`
 }
 
 type Measurement struct {
index dcf450c..c8c747a 100644 (file)
@@ -118,7 +118,6 @@ func main() {
                r := mux.NewRouter()
                r.HandleFunc("/rests/data/network-topology:network-topology/topology=topology-netconf/node={NODE-ID}/yang-ext:mount/o-ran-sc-du-hello-world:network-function/distributed-unit-functions={O-DU-ID}", getSdnrResponseMessage).Methods(http.MethodGet)
                r.HandleFunc("/rests/data/network-topology:network-topology/topology=topology-netconf/node={NODE-ID}/yang-ext:mount/o-ran-sc-du-hello-world:network-function/distributed-unit-functions={O-DU-ID}/radio-resource-management-policy-ratio={POLICY-ID}", updateRRMPolicyDedicatedRatio).Methods(http.MethodPost)
-               r.HandleFunc("/events/unauthenticated.PERFORMANCE_MEASUREMENTS", sendDmaapMRMessages).Methods(http.MethodGet)
 
                fmt.Println("Starting SDNR stub on port: ", *portSdnr)
 
@@ -129,7 +128,7 @@ func main() {
        go func() {
 
                r := mux.NewRouter()
-               r.HandleFunc("/events/unauthenticated.PERFORMANCE_MEASUREMENTS", sendDmaapMRMessages).Methods(http.MethodGet)
+               r.HandleFunc("/events/unauthenticated.VES_O_RAN_SC_HELLO_WORLD_PM_STREAMING_OUTPUT/myG/C1", sendDmaapMRMessages).Methods(http.MethodGet)
 
                fmt.Println("Starting DmaapMR stub on port: ", *portDmaapMR)
 
@@ -181,7 +180,6 @@ func getPolicyRatioMessage() []messages.RRMPolicyRatio {
 }
 
 func updateRRMPolicyDedicatedRatio(w http.ResponseWriter, r *http.Request) {
-       log.Info("Post request to update RRMPolicyDedicatedRatio")
 
        var prMessages []messages.RRMPolicyRatio
        decoder := json.NewDecoder(r.Body)
@@ -192,6 +190,8 @@ func updateRRMPolicyDedicatedRatio(w http.ResponseWriter, r *http.Request) {
        }
        defer r.Body.Close()
 
+       log.Infof("Post request to update RRMPolicyDedicatedRatio %+v", prMessages)
+
        findAndUpdatePolicy(prMessages)
        respondWithJSON(w, http.StatusOK, map[string]string{"status": "200"})
 }
@@ -200,8 +200,8 @@ func findAndUpdatePolicy(rRMPolicyRatio []messages.RRMPolicyRatio) {
        for _, policy := range rRMPolicyRatio {
                for _, entry := range data {
                        if entry.policyRatioId == policy.Id {
+                               log.Infof("update Policy Dedicated Ratio: value for policy %+v\n Old value: %v New value: %v ", policy, entry.policyDedicatedRatio, policy.RRMPolicyDedicatedRatio)
                                entry.policyDedicatedRatio = policy.RRMPolicyDedicatedRatio
-                               log.Info("New value for Policy dedicated ratio: ", entry.policyDedicatedRatio)
                                if entry.metricValue > THRESHOLD_TPUT {
                                        entry.metricValue = rand.Intn(THRESHOLD_TPUT)
                                }
@@ -239,20 +239,44 @@ func sendDmaapMRMessages(w http.ResponseWriter, r *http.Request) {
        message := messages.StdDefinedMessage{
                Event: messages.Event{
                        CommonEventHeader: messages.CommonEventHeader{
-                               Domain:               "stndDefined",
-                               StndDefinedNamespace: "o-ran-sc-du-hello-world-pm-streaming-oas3",
+                               Domain:                  "stndDefined",
+                               EventId:                 "pm-1_1644252450",
+                               EventName:               "stndDefined_performanceMeasurementStreaming",
+                               EventType:               "performanceMeasurementStreaming",
+                               Sequence:                825,
+                               Priority:                "Low",
+                               ReportingEntityId:       "",
+                               ReportingEntityName:     "O-DU-1122",
+                               SourceId:                "",
+                               SourceName:              "O-DU-1122",
+                               StartEpochMicrosec:      1644252450000000,
+                               LastEpochMicrosec:       1644252480000000,
+                               NfNamingCode:            "SIM-O-DU",
+                               NfVendorName:            "O-RAN-SC SIM Project",
+                               StndDefinedNamespace:    "o-ran-sc-du-hello-world-pm-streaming-oas3",
+                               TimeZoneOffset:          "+00:00",
+                               Version:                 "4.1",
+                               VesEventListenerVersion: "7.2.1",
                        },
                        StndDefinedFields: messages.StndDefinedFields{
                                StndDefinedFieldsVersion: "1.0",
                                SchemaReference:          "https://gerrit.o-ran-sc.org/r/gitweb?p=scp/oam/modeling.git;a=blob_plain;f=data-model/oas3/experimental/o-ran-sc-du-hello-world-oas3.json;hb=refs/heads/master",
                                Data: messages.Data{
-                                       DataId:       "id",
-                                       Measurements: messagesToSend,
+                                       DataId:              "pm-1_1644252450",
+                                       StartTime:           "2022-02-07T16:47:30.0Z",
+                                       AdministrativeState: "unlocked",
+                                       OperationalState:    "enabled",
+                                       UserLabel:           "pm",
+                                       JobTag:              "my-job-tag",
+                                       GranularityPeriod:   30,
+                                       Measurements:        messagesToSend,
                                },
                        },
                },
        }
 
+       fmt.Printf("Send Dmaap messages\n %+v\n", message)
+
        time.Sleep(time.Duration(rand.Intn(3)) * time.Second)
        respondWithJSON(w, http.StatusOK, message)
 
@@ -261,7 +285,7 @@ func sendDmaapMRMessages(w http.ResponseWriter, r *http.Request) {
 
 func generateMeasurementEntry(entry *SliceAssuranceInformation) messages.Measurement {
 
-       measurementTypeInstanceReference := "/network-function/distributed-unit-functions[id='" + entry.duId + "']/cell[id='" + entry.cellId + "']/supported-measurements/performance-measurement-type[.='" + entry.metricName + "']/supported-snssai-subcounter-instances/slice-differentiator[.=" + strconv.Itoa(entry.sd) + "][slice-service-type=" + strconv.Itoa(entry.sst) + "]"
+       measurementTypeInstanceReference := "/o-ran-sc-du-hello-world:network-function/distributed-unit-functions[id='" + entry.duId + "']/cell[id='" + entry.cellId + "']/supported-measurements/performance-measurement-type='(urn:o-ran-sc:yang:o-ran-sc-du-hello-world?revision=2021-11-23)" + entry.metricName + "']/supported-snssai-subcounter-instances[slice-differentiator='" + strconv.Itoa(entry.sd) + "'][slice-service-type='" + strconv.Itoa(entry.sst) + "']"
        meas := messages.Measurement{
 
                MeasurementTypeInstanceReference: measurementTypeInstanceReference,