852e0f3c45b54d2f653f5f40119de9b2934281c5
[nonrtric/rapp/ransliceassurance.git] / icsversion / internal / odusliceassurance / app.go
1 // -
2 //   ========================LICENSE_START=================================
3 //   O-RAN-SC
4 //   %%
5 //   Copyright (C) 2022: Nordix Foundation
6 //   %%
7 //   Licensed under the Apache License, Version 2.0 (the "License");
8 //   you may not use this file except in compliance with the License.
9 //   You may obtain a copy of the License at
10 //
11 //        http://www.apache.org/licenses/LICENSE-2.0
12 //
13 //   Unless required by applicable law or agreed to in writing, software
14 //   distributed under the License is distributed on an "AS IS" BASIS,
15 //   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 //   See the License for the specific language governing permissions and
17 //   limitations under the License.
18 //   ========================LICENSE_END===================================
19 //
20
21 package sliceassurance
22
23 import (
24         "fmt"
25         "net/http"
26
27         "github.com/gorilla/mux"
28         log "github.com/sirupsen/logrus"
29         "oransc.org/usecase/oduclosedloop/icsversion/internal/config"
30         "oransc.org/usecase/oduclosedloop/icsversion/internal/restclient"
31         "oransc.org/usecase/oduclosedloop/icsversion/internal/structures"
32 )
33
34 var started bool
35 var icsAddr string
36 var consumerPort string
37
38 const (
39         THRESHOLD_TPUT          = 7000
40         DEFAULT_DEDICATED_RATIO = 15
41         NEW_DEDICATED_RATIO     = 25
42         NODE_ID                 = "O-DU-1122"
43         jobId                   = "14e7bb84-a44d-44c1-90b7-6995a92ad83d"
44 )
45
46 var jobRegistrationInfo = struct {
47         InfoTypeID            string      `json:"info_type_id"`
48         JobResultURI          string      `json:"job_result_uri"`
49         JobOwner              string      `json:"job_owner"`
50         JobDefinition         interface{} `json:"job_definition"`
51         StatusNotificationURI string      `json:"status_notification_uri"`
52 }{
53         InfoTypeID:   "Performance_Measurement_Streaming",
54         JobResultURI: "",
55         JobOwner:     "O-DU Slice Assurance Usecase",
56 }
57
58 type App struct {
59         client *restclient.Client
60         data   *structures.SliceAssuranceMeas
61         sdnr   SdnrHandler
62         mh     MessageHandler
63 }
64
65 var sdnrConfig SdnrConfiguration
66
67 func (a *App) Initialize(config *config.Configuration) {
68         consumerPort = fmt.Sprint(config.ConsumerPort)
69         jobRegistrationInfo.JobResultURI = config.ConsumerHost + ":" + consumerPort
70         jobRegistrationInfo.StatusNotificationURI = config.ConsumerHost + ":" + consumerPort
71
72         sdnrConfig = SdnrConfiguration{
73                 SDNRAddress:  config.SDNRAddress,
74                 SDNRUser:     config.SDNRUser,
75                 SDNRPassword: config.SDNPassword,
76         }
77         icsAddr = config.InfoCoordinatorAddress
78
79         a.client = restclient.New(&http.Client{}, false)
80         a.data = structures.NewSliceAssuranceMeas()
81
82         a.sdnr = *NewSdnrHandler(sdnrConfig, a.client, a.data)
83         a.mh = *NewMessageHandler(a.data)
84 }
85
86 func (a *App) StartServer() {
87         fmt.Printf("Starting Server %v", consumerPort)
88         err := http.ListenAndServe(fmt.Sprintf(":%v", consumerPort), a.getRouter())
89
90         if err != nil {
91                 log.Errorf("Server stopped unintentionally due to: %v. Deleting job.", err)
92                 if deleteErr := a.deleteJob(); deleteErr != nil {
93                         log.Errorf("Unable to delete consumer job due to: %v. Please remove job %v manually.", deleteErr, jobId)
94                 }
95         }
96 }
97
98 func (a *App) getRouter() *mux.Router {
99
100         r := mux.NewRouter()
101         r.HandleFunc("/", a.run).Methods(http.MethodPost).Name("messageHandler")
102         r.HandleFunc("/status", a.statusHandler).Methods(http.MethodGet).Name("status")
103         r.HandleFunc("/admin/start", a.startHandler).Methods(http.MethodPost).Name("start")
104         r.HandleFunc("/admin/stop", a.stopHandler).Methods(http.MethodPost).Name("stop")
105
106         return r
107 }
108
109 func (a *App) run(w http.ResponseWriter, r *http.Request) {
110         a.mh.ProcessMessage(r.Body)
111
112         for key := range a.data.Metrics {
113                 a.sdnr.getRRMInformation(key.Duid)
114         }
115         a.sdnr.updateDedicatedRatio()
116 }
117
118 func (a *App) statusHandler(w http.ResponseWriter, r *http.Request) {
119         log.Debug("statusHandler:")
120         runStatus := "started"
121         if !started {
122                 runStatus = "stopped"
123         }
124         fmt.Fprintf(w, `{"status": "%v"}`, runStatus)
125 }
126
127 func (a *App) startHandler(w http.ResponseWriter, r *http.Request) {
128         log.Debug("Register job in ICS.")
129
130         putErr := a.client.Put(icsAddr+"/data-consumer/v1/info-jobs/"+jobId, jobRegistrationInfo, nil)
131         if putErr != nil {
132                 http.Error(w, fmt.Sprintf("Unable to register consumer job due to: %v.", putErr), http.StatusBadRequest)
133                 return
134         }
135         log.Debug("Registered job.")
136         started = true
137 }
138
139 func (a *App) stopHandler(w http.ResponseWriter, r *http.Request) {
140         deleteErr := a.deleteJob()
141         if deleteErr != nil {
142                 http.Error(w, fmt.Sprintf("Unable to delete consumer job due to: %v. Please remove job %v manually.", deleteErr, jobId), http.StatusBadRequest)
143                 return
144         }
145         log.Debug("Deleted job.")
146         started = false
147 }
148
149 func (a *App) deleteJob() error {
150         return a.client.Delete(icsAddr+"/data-consumer/v1/info-jobs/"+jobId, nil, nil)
151 }
152
153 func (a *App) Teardown() {
154         log.Info("Shutting down gracefully.")
155         deleteErr := a.deleteJob()
156         if deleteErr != nil {
157                 log.Errorf("Unable to delete job on shutdown due to: %v. Please remove job %v manually.", deleteErr, jobId)
158         }
159
160 }