Merge "First version of ODU slice assurance usecase"
[nonrtric.git] / test / usecases / odusliceassurance / goversion / stub / sdnr / sdnrstub.go
diff --git a/test/usecases/odusliceassurance/goversion/stub/sdnr/sdnrstub.go b/test/usecases/odusliceassurance/goversion/stub/sdnr/sdnrstub.go
new file mode 100644 (file)
index 0000000..b8f80be
--- /dev/null
@@ -0,0 +1,145 @@
+// -
+//   ========================LICENSE_START=================================
+//   O-RAN-SC
+//   %%
+//   Copyright (C) 2021: Nordix Foundation
+//   %%
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//        http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   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.
+//   ========================LICENSE_END===================================
+//
+
+package main
+
+import (
+       "encoding/json"
+       "flag"
+       "fmt"
+       "net/http"
+
+       "github.com/gorilla/mux"
+       "oransc.org/usecase/oduclosedloop/messages"
+)
+
+func main() {
+       port := flag.Int("port", 3904, "The port this SDNR stub will listen on")
+       flag.Parse()
+
+       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}", getDistributedUnitFunctions).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)
+
+       fmt.Println("Starting SDNR on port: ", *port)
+       http.ListenAndServe(fmt.Sprintf(":%v", *port), r)
+
+}
+
+func getDistributedUnitFunctions(w http.ResponseWriter, r *http.Request) {
+       vars := mux.Vars(r)
+
+       message := messages.ORanDuRestConf{
+               DistributedUnitFunction: messages.DistributedUnitFunction{
+                       Id: vars["O-DU-ID"],
+                       RRMPolicyRatio: []messages.RRMPolicyRatio{
+                               {
+                                       Id:                      "rrm-pol-1",
+                                       AdmState:                "locked",
+                                       UserLabel:               "rrm-pol-1",
+                                       RRMPolicyMaxRatio:       100,
+                                       RRMPolicyMinRatio:       "0",
+                                       RRMPolicyDedicatedRatio: "0",
+                                       ResourceType:            "prb",
+                                       RRMPolicyMembers: []messages.RRMPolicyMember{
+                                               {
+                                                       MobileCountryCode:   "046",
+                                                       MobileNetworkCode:   "651",
+                                                       SliceDifferentiator: 1,
+                                                       SliceServiceType:    0,
+                                               },
+                                       },
+                               },
+                               {
+                                       Id:                      "rrm-pol-2",
+                                       AdmState:                "unlocked",
+                                       UserLabel:               "rrm-pol-2",
+                                       RRMPolicyMaxRatio:       20,
+                                       RRMPolicyMinRatio:       "10",
+                                       RRMPolicyDedicatedRatio: "15",
+                                       ResourceType:            "prb",
+                                       RRMPolicyMembers: []messages.RRMPolicyMember{
+                                               {
+                                                       MobileCountryCode:   "046",
+                                                       MobileNetworkCode:   "651",
+                                                       SliceDifferentiator: 2,
+                                                       SliceServiceType:    1,
+                                               },
+                                       },
+                               },
+                               {
+                                       Id:                      "rrm-pol-3",
+                                       AdmState:                "unlocked",
+                                       UserLabel:               "rrm-pol-3",
+                                       RRMPolicyMaxRatio:       30,
+                                       RRMPolicyMinRatio:       "10",
+                                       RRMPolicyDedicatedRatio: "5",
+                                       ResourceType:            "prb",
+                                       RRMPolicyMembers: []messages.RRMPolicyMember{
+                                               {
+                                                       MobileCountryCode:   "310",
+                                                       MobileNetworkCode:   "150",
+                                                       SliceDifferentiator: 2,
+                                                       SliceServiceType:    2,
+                                               },
+                                       },
+                               },
+                       },
+               },
+       }
+
+       respondWithJSON(w, http.StatusOK, message)
+}
+
+func updateRRMPolicyDedicatedRatio(w http.ResponseWriter, r *http.Request) {
+       //vars := mux.Vars(r)
+       fmt.Println("::updateRRMPolicyDedicatedRatio::")
+       var prMessage messages.DistributedUnitFunction
+       decoder := json.NewDecoder(r.Body)
+
+       if err := decoder.Decode(&prMessage); err != nil {
+               respondWithError(w, http.StatusBadRequest, "Invalid request payload")
+               return
+       }
+       defer r.Body.Close()
+
+       fmt.Println("prMessage: ", prMessage)
+       //prMessage.Id = vars["POLICY-ID"]
+
+       respondWithJSON(w, http.StatusOK, map[string]string{"status": "200"})
+}
+
+func respondWithError(w http.ResponseWriter, code int, message string) {
+       fmt.Println("-----------------------------------------------------------------------------")
+       fmt.Println("Sending error message: ", message)
+       fmt.Println("-----------------------------------------------------------------------------")
+       respondWithJSON(w, code, map[string]string{"error": message})
+}
+
+func respondWithJSON(w http.ResponseWriter, code int, payload interface{}) {
+       fmt.Println("-----------------------------------------------------------------------------")
+       fmt.Println("Sending message: ", payload)
+       fmt.Println("-----------------------------------------------------------------------------")
+       response, _ := json.Marshal(payload)
+
+       w.Header().Set("Content-Type", "application/json")
+       w.WriteHeader(code)
+       w.Write(response)
+}