2 // Copyright 2019 AT&T Intellectual Property
3 // Copyright 2019 Nokia
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
9 // http://www.apache.org/licenses/LICENSE-2.0
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.
27 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
28 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
29 "github.com/golang/protobuf/jsonpb"
30 "github.com/gorilla/mux"
36 validationErrorCode int = 402
37 notFoundErrorCode int = 404
38 internalErrorCode int = 501
39 validationFailedMessage = "Validation failed"
40 notFoundErrorMessage = "Resource not found"
41 internalErrorMessage = "Internal Server Error. Please try again later"
44 var messageChannel chan *models.E2RequestMessage
45 var errorChannel chan error
47 type INodebController interface {
48 GetNodebIdList (writer http.ResponseWriter, request *http.Request)
49 GetNodeb(writer http.ResponseWriter, request *http.Request)
50 HandleHealthCheckRequest(writer http.ResponseWriter, request *http.Request)
53 type NodebController struct {
54 rmrService *services.RmrService
56 rnibReaderProvider func() reader.RNibReader
57 rnibWriterProvider func() rNibWriter.RNibWriter
60 func NewNodebController(logger *logger.Logger, rmrService *services.RmrService, rnibReaderProvider func() reader.RNibReader, rnibWriterProvider func() rNibWriter.RNibWriter) *NodebController {
61 messageChannel = make(chan *models.E2RequestMessage)
62 errorChannel = make(chan error)
63 return &NodebController{
64 rmrService: rmrService,
66 rnibReaderProvider: rnibReaderProvider,
67 rnibWriterProvider: rnibWriterProvider,
71 func (rc NodebController) GetNodebIdList (writer http.ResponseWriter, request *http.Request) {
72 startTime := time.Now()
73 rnibReaderService := services.NewRnibReaderService(rc.rnibReaderProvider)
74 nodebIdList, rnibError := rnibReaderService.GetNodebIdList()
77 rc.Logger.Errorf("%v", rnibError);
78 httpStatusCode, errorCode, errorMessage := rnibErrorToHttpError(rnibError)
79 handleErrorResponse(rc.Logger, httpStatusCode, errorCode, errorMessage, writer, startTime)
83 pmList := utils.ConvertNodebIdListToProtoMessageList(nodebIdList)
84 result, err := utils.MarshalProtoMessageListToJsonArray(pmList)
87 rc.Logger.Errorf("%v", err);
88 handleErrorResponse(rc.Logger, http.StatusInternalServerError, internalErrorCode, internalErrorMessage, writer, startTime)
92 writer.Header().Set("Content-Type", "application/json")
93 rc.Logger.Infof("[E2 Manager -> Client] #nodeb_controller.GetNodebIdList - response: %s", result)
94 writer.Write([]byte(result))
97 func (rc NodebController) GetNodeb(writer http.ResponseWriter, request *http.Request) {
98 startTime := time.Now()
99 vars := mux.Vars(request)
100 ranName := vars["ranName"]
101 // WAS: respondingNode, rnibError := reader.GetRNibReader().GetNodeb(ranName)
102 rnibReaderService := services.NewRnibReaderService(rc.rnibReaderProvider)
103 respondingNode, rnibError := rnibReaderService.GetNodeb(ranName)
104 if rnibError != nil {
105 rc.Logger.Errorf("%v", rnibError)
106 httpStatusCode, errorCode, errorMessage := rnibErrorToHttpError(rnibError)
107 handleErrorResponse(rc.Logger, httpStatusCode, errorCode, errorMessage, writer, startTime)
111 m := jsonpb.Marshaler{}
112 result, err := m.MarshalToString(respondingNode)
115 rc.Logger.Errorf("%v", err)
116 handleErrorResponse(rc.Logger, http.StatusInternalServerError, internalErrorCode, internalErrorMessage, writer, startTime)
120 writer.Header().Set("Content-Type", "application/json")
121 rc.Logger.Infof("[E2 Manager -> Client] #nodeb_controller.GetNodeb - response: %s", result)
122 writer.Write([]byte(result))
125 func (rc NodebController) HandleHealthCheckRequest(writer http.ResponseWriter, request *http.Request) {
126 //fmt.Println("[X-APP -> Client] #HandleHealthCheckRequest - http status: 200")
127 writer.WriteHeader(http.StatusOK)
130 func handleErrorResponse(logger *logger.Logger, httpStatus int, errorCode int, errorMessage string, writer http.ResponseWriter, startTime time.Time) {
131 errorResponseDetails := models.ErrorResponse{errorCode, errorMessage}
132 errorResponse, _ := json.Marshal(errorResponseDetails)
133 printHandlingRequestElapsedTimeInMs(logger, startTime)
134 logger.Infof("[E2 Manager -> Client] #nodeb_controller.handleErrorResponse - http status: %d, error response: %+v", httpStatus, errorResponseDetails)
135 writer.Header().Set("Content-Type", "application/json")
136 writer.WriteHeader(httpStatus)
137 _, err := writer.Write(errorResponse)
140 logger.Errorf("#nodeb_controller.handleErrorResponse - Cannot send response. writer:%v", writer)
144 func printHandlingRequestElapsedTimeInMs(logger *logger.Logger, startTime time.Time) {
145 logger.Infof("Summary: #nodeb_controller.printElapsedTimeInMs - Elapsed time for handling request from client to E2 termination: %f ms",
146 float64(time.Since(startTime))/float64(time.Millisecond))
149 func rnibErrorToHttpError(rnibError error) (int, int, string) {
150 switch rnibError.(type) {
151 case *common.ResourceNotFoundError:
152 return http.StatusNotFound, notFoundErrorCode, notFoundErrorMessage
153 case *common.InternalError:
154 return http.StatusInternalServerError, internalErrorCode, internalErrorMessage
155 case *common.ValidationError:
156 return http.StatusBadRequest, validationErrorCode, validationFailedMessage
158 return http.StatusInternalServerError, internalErrorCode, internalErrorMessage