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.
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"
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"
45 var E2Sessions = make(sessions.E2Sessions)
47 var messageChannel chan *models.E2RequestMessage
48 var errorChannel chan error
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)
56 type NodebController struct {
57 rmrService *services.RmrService
59 rnibReaderProvider func() reader.RNibReader
60 rnibWriterProvider func() rNibWriter.RNibWriter
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,
69 rnibReaderProvider: rnibReaderProvider,
70 rnibWriterProvider: rnibWriterProvider,
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()
80 rc.Logger.Errorf("%v", rnibError);
81 httpStatusCode, errorCode, errorMessage := rnibErrorToHttpError(rnibError)
82 handleErrorResponse(rc.Logger, httpStatusCode, errorCode, errorMessage, writer, startTime)
86 pmList := utils.ConvertNodebIdListToProtoMessageList(nodebIdList)
87 result, err := utils.MarshalProtoMessageListToJsonArray(pmList)
90 rc.Logger.Errorf("%v", err);
91 handleErrorResponse(rc.Logger, http.StatusInternalServerError, internalErrorCode, internalErrorMessage, writer, startTime)
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))
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)
114 m := jsonpb.Marshaler{}
115 result, err := m.MarshalToString(respondingNode)
118 rc.Logger.Errorf("%v", err)
119 handleErrorResponse(rc.Logger, http.StatusInternalServerError, internalErrorCode, internalErrorMessage, writer, startTime)
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))
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)
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)
143 logger.Errorf("#nodeb_controller.handleErrorResponse - Cannot send response. writer:%v", writer)
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))
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
161 return http.StatusInternalServerError, internalErrorCode, internalErrorMessage