[RICPLT-2048] X2 ENDC Setup request refactoring
[ric-plt/e2mgr.git] / E2Manager / controllers / nodeb_controller.go
1 //
2 // Copyright 2019 AT&T Intellectual Property
3 // Copyright 2019 Nokia
4 //
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //      http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17
18 package controllers
19
20 import (
21         "e2mgr/logger"
22         "e2mgr/models"
23         "e2mgr/rNibWriter"
24         "e2mgr/services"
25         "e2mgr/sessions"
26         "e2mgr/utils"
27         "encoding/json"
28         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
29         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
30         "github.com/golang/protobuf/jsonpb"
31         "github.com/gorilla/mux"
32         "net/http"
33         "time"
34 )
35
36 const (
37         validationErrorCode       int = 402
38         notFoundErrorCode         int = 404
39         internalErrorCode         int = 501
40         validationFailedMessage       = "Validation failed"
41         notFoundErrorMessage          = "Resource not found"
42         internalErrorMessage          = "Internal Server Error. Please try again later"
43 )
44
45 var E2Sessions = make(sessions.E2Sessions)
46
47 var messageChannel chan *models.E2RequestMessage
48 var errorChannel chan error
49
50 type INodebController interface {
51         GetNodebIdList (writer http.ResponseWriter, request *http.Request)
52         GetNodeb(writer http.ResponseWriter, request *http.Request)
53         HandleHealthCheckRequest(writer http.ResponseWriter, request *http.Request)
54 }
55
56 type NodebController struct {
57         rmrService         *services.RmrService
58         Logger             *logger.Logger
59         rnibReaderProvider func() reader.RNibReader
60         rnibWriterProvider func() rNibWriter.RNibWriter
61 }
62
63 func NewNodebController(logger *logger.Logger, rmrService *services.RmrService, rnibReaderProvider func() reader.RNibReader, rnibWriterProvider func() rNibWriter.RNibWriter) *NodebController {
64         messageChannel = make(chan *models.E2RequestMessage)
65         errorChannel = make(chan error)
66         return &NodebController{
67                 rmrService:         rmrService,
68                 Logger:             logger,
69                 rnibReaderProvider: rnibReaderProvider,
70                 rnibWriterProvider: rnibWriterProvider,
71         }
72 }
73
74 func (rc NodebController) GetNodebIdList (writer http.ResponseWriter, request *http.Request) {
75         startTime := time.Now()
76         rnibReaderService := services.NewRnibReaderService(rc.rnibReaderProvider)
77         nodebIdList, rnibError := rnibReaderService.GetNodebIdList()
78
79         if rnibError != nil {
80                 rc.Logger.Errorf("%v", rnibError);
81                 httpStatusCode, errorCode, errorMessage := rnibErrorToHttpError(rnibError)
82                 handleErrorResponse(rc.Logger, httpStatusCode, errorCode, errorMessage, writer, startTime)
83                 return;
84         }
85
86         pmList := utils.ConvertNodebIdListToProtoMessageList(nodebIdList)
87         result, err := utils.MarshalProtoMessageListToJsonArray(pmList)
88
89         if err != nil {
90                 rc.Logger.Errorf("%v", err);
91                 handleErrorResponse(rc.Logger, http.StatusInternalServerError, internalErrorCode, internalErrorMessage, writer, startTime)
92                 return;
93         }
94
95         writer.Header().Set("Content-Type", "application/json")
96         rc.Logger.Infof("[E2 Manager -> Client] #nodeb_controller.GetNodebIdList - response: %s", result)
97         writer.Write([]byte(result))
98 }
99
100 func (rc NodebController) GetNodeb(writer http.ResponseWriter, request *http.Request) {
101         startTime := time.Now()
102         vars := mux.Vars(request)
103         ranName := vars["ranName"]
104         // WAS: respondingNode, rnibError := reader.GetRNibReader().GetNodeb(ranName)
105         rnibReaderService := services.NewRnibReaderService(rc.rnibReaderProvider)
106         respondingNode, rnibError := rnibReaderService.GetNodeb(ranName)
107         if rnibError != nil {
108                 rc.Logger.Errorf("%v", rnibError)
109                 httpStatusCode, errorCode, errorMessage := rnibErrorToHttpError(rnibError)
110                 handleErrorResponse(rc.Logger, httpStatusCode, errorCode, errorMessage, writer, startTime)
111                 return
112         }
113
114         m := jsonpb.Marshaler{}
115         result, err := m.MarshalToString(respondingNode)
116
117         if err != nil {
118                 rc.Logger.Errorf("%v", err)
119                 handleErrorResponse(rc.Logger, http.StatusInternalServerError, internalErrorCode, internalErrorMessage, writer, startTime)
120                 return
121         }
122
123         writer.Header().Set("Content-Type", "application/json")
124         rc.Logger.Infof("[E2 Manager -> Client] #nodeb_controller.GetNodeb - response: %s", result)
125         writer.Write([]byte(result))
126 }
127
128 func (rc NodebController) HandleHealthCheckRequest(writer http.ResponseWriter, request *http.Request) {
129         //fmt.Println("[X-APP -> Client] #HandleHealthCheckRequest - http status: 200")
130         writer.WriteHeader(http.StatusOK)
131 }
132
133 func handleErrorResponse(logger *logger.Logger, httpStatus int, errorCode int, errorMessage string, writer http.ResponseWriter, startTime time.Time) {
134         errorResponseDetails := models.ErrorResponse{errorCode, errorMessage}
135         errorResponse, _ := json.Marshal(errorResponseDetails)
136         printHandlingRequestElapsedTimeInMs(logger, startTime)
137         logger.Infof("[E2 Manager -> Client] #nodeb_controller.handleErrorResponse - http status: %d, error response: %+v", httpStatus, errorResponseDetails)
138         writer.Header().Set("Content-Type", "application/json")
139         writer.WriteHeader(httpStatus)
140         _, err := writer.Write(errorResponse)
141
142         if err != nil {
143                 logger.Errorf("#nodeb_controller.handleErrorResponse - Cannot send response. writer:%v", writer)
144         }
145 }
146
147 func printHandlingRequestElapsedTimeInMs(logger *logger.Logger, startTime time.Time) {
148         logger.Infof("Summary: #nodeb_controller.printElapsedTimeInMs - Elapsed time for handling request from client to E2 termination: %f ms",
149                 float64(time.Since(startTime))/float64(time.Millisecond))
150 }
151
152 func rnibErrorToHttpError(rnibError error) (int, int, string) {
153         switch rnibError.(type) {
154         case *common.ResourceNotFoundError:
155                 return http.StatusNotFound, notFoundErrorCode, notFoundErrorMessage
156         case *common.InternalError:
157                 return http.StatusInternalServerError, internalErrorCode, internalErrorMessage
158         case *common.ValidationError:
159                 return http.StatusBadRequest, validationErrorCode, validationFailedMessage
160         default:
161                 return http.StatusInternalServerError, internalErrorCode, internalErrorMessage
162         }
163 }