blob: 017646f6a5a4264d161311832197624090acb5a2 [file] [log] [blame]
Akash Sonib3abf522022-12-19 13:20:02 +05301/*
2* Copyright 2022-present Open Networking Foundation
3* Licensed under the Apache License, Version 2.0 (the "License");
4* you may not use this file except in compliance with the License.
5* You may obtain a copy of the License at
6*
7* http://www.apache.org/licenses/LICENSE-2.0
8*
9* Unless required by applicable law or agreed to in writing, software
10* distributed under the License is distributed on an "AS IS" BASIS,
11* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12* See the License for the specific language governing permissions and
13* limitations under the License.
14 */
15
vinokuma926cb3e2023-03-29 11:41:06 +053016package onosnbi
Akash Sonib3abf522022-12-19 13:20:02 +053017
18import (
19 "context"
20 "encoding/json"
21 "net/http"
22 "strconv"
Akash Soni6f369452023-09-19 11:18:28 +053023 cntlr "voltha-go-controller/internal/pkg/controller"
Hitesh Chhabra7d249a02023-07-04 21:33:49 +053024 errorCodes "voltha-go-controller/internal/pkg/errorcodes"
Akash Sonib3abf522022-12-19 13:20:02 +053025 "voltha-go-controller/log"
26
27 "github.com/gorilla/mux"
28)
29
30type MetersHandle struct {
31}
32
33func init() {
34 // Setup this package so that it's log level can be modified at run time
35 var err error
36 logger, err = log.AddPackageWithDefaultParam()
37 if err != nil {
38 panic(err)
39 }
40}
41
42// ServeHTTP to serve http request
43func (mh *MetersHandle) MeterServeHTTP(w http.ResponseWriter, r *http.Request) {
Akash Sonib3abf522022-12-19 13:20:02 +053044 vars := mux.Vars(r)
45 meterID := vars["id"]
46
Hitesh Chhabraaf80b832023-07-21 15:27:20 +053047 logger.Infow(ctx, "Received-northbound-request ", log.Fields{"Method": r.Method, "URL": r.URL, "meterID": meterID})
Akash Sonib3abf522022-12-19 13:20:02 +053048 switch r.Method {
vinokuma926cb3e2023-03-29 11:41:06 +053049 case cGet:
Akash Sonib3abf522022-12-19 13:20:02 +053050 if meterID != "" {
Akash Sonib3abf522022-12-19 13:20:02 +053051 mh.GetMeter(context.Background(), meterID, w, r)
52 } else {
53 mh.GetAllMeters(context.Background(), w, r)
54 }
55
56 default:
57 logger.Warnw(ctx, "Unsupported Method", log.Fields{"Method": r.Method})
Hitesh Chhabra7d249a02023-07-04 21:33:49 +053058 err := errorCodes.ErrOperationNotSupported
59 http.Error(w, err.Error(), http.StatusBadRequest)
Akash Sonib3abf522022-12-19 13:20:02 +053060 }
61}
62
vinokuma926cb3e2023-03-29 11:41:06 +053063func (mh *MetersHandle) GetMeter(cntx context.Context, meterID string, w http.ResponseWriter, r *http.Request) {
Akash Sonib3abf522022-12-19 13:20:02 +053064 meterListResp := MeterList{}
65 meterListResp.Meters = []Meters{}
vinokuma926cb3e2023-03-29 11:41:06 +053066 mID, err := strconv.ParseUint(meterID, 10, 32)
Akash Sonib3abf522022-12-19 13:20:02 +053067 if err != nil {
Hitesh Chhabraaf80b832023-07-21 15:27:20 +053068 logger.Errorw(ctx, "Failed to parse meterID from string to uint32", log.Fields{"Meter ID": mID, "Reason": err.Error()})
Hitesh Chhabra7d249a02023-07-04 21:33:49 +053069 w.WriteHeader(http.StatusInternalServerError)
70 return
Akash Sonib3abf522022-12-19 13:20:02 +053071 }
vinokuma926cb3e2023-03-29 11:41:06 +053072 id := uint32(mID)
Akash Sonib3abf522022-12-19 13:20:02 +053073 logger.Infow(ctx, "Meter Id", log.Fields{"metreId": id})
Akash Soni6f369452023-09-19 11:18:28 +053074 var voltContrIntr cntlr.VoltControllerInterface
75 cntrlr := cntlr.GetController()
76 voltContrIntr = cntrlr
77 meterInfo, err := voltContrIntr.GetMeterInfo(cntx, id)
Akash Sonib3abf522022-12-19 13:20:02 +053078 if err != nil {
Hitesh Chhabraaf80b832023-07-21 15:27:20 +053079 logger.Errorw(ctx, "Failed to get meter info from device with Meter Id", log.Fields{"Meter ID": mID, "Reason": err.Error()})
Akash Sonib3abf522022-12-19 13:20:02 +053080 w.WriteHeader(http.StatusNotFound)
Hitesh Chhabra7d249a02023-07-04 21:33:49 +053081 return
Akash Sonib3abf522022-12-19 13:20:02 +053082 }
83
vinokuma926cb3e2023-03-29 11:41:06 +053084 for deviceID, meter := range meterInfo {
85 meterResp := mh.MeterObjectMapping(meter, deviceID)
Akash Sonib3abf522022-12-19 13:20:02 +053086 meterListResp.Meters = append(meterListResp.Meters, meterResp)
87 }
88 MeterRespJSON, err := json.Marshal(meterListResp)
89 if err != nil {
Hitesh Chhabraaf80b832023-07-21 15:27:20 +053090 logger.Errorw(ctx, "Error occurred while marshaling meter response", log.Fields{"Meter ID": mID, "MeterListResp": meterListResp, "Error": err})
Akash Sonib3abf522022-12-19 13:20:02 +053091 w.WriteHeader(http.StatusInternalServerError)
92 return
93 }
94 w.Header().Add("Content-Type", "application/json")
95 _, err = w.Write(MeterRespJSON)
96 if err != nil {
Hitesh Chhabraaf80b832023-07-21 15:27:20 +053097 logger.Errorw(ctx, "error in sending meter response", log.Fields{"Meter ID": mID, "MeterListResp": meterListResp, "Error": err})
Akash Sonib3abf522022-12-19 13:20:02 +053098 w.WriteHeader(http.StatusInternalServerError)
Hitesh Chhabraaf80b832023-07-21 15:27:20 +053099 return
Akash Sonib3abf522022-12-19 13:20:02 +0530100 }
Hitesh Chhabraaf80b832023-07-21 15:27:20 +0530101 logger.Debugw(ctx, "Fetch Meter Info specific to received Meter Id", log.Fields{"metreId": id, "MeterListResp": meterListResp})
Akash Sonib3abf522022-12-19 13:20:02 +0530102}
103
104func (mh *MetersHandle) GetAllMeters(cntx context.Context, w http.ResponseWriter, r *http.Request) {
Akash Sonib3abf522022-12-19 13:20:02 +0530105 metersList := MeterList{}
106 metersList.Meters = []Meters{}
Akash Soni6f369452023-09-19 11:18:28 +0530107 var voltContrIntr cntlr.VoltControllerInterface
108 cntrlr := cntlr.GetController()
109 voltContrIntr = cntrlr
110 meterInfo, err := voltContrIntr.GetAllMeterInfo()
Akash Sonib3abf522022-12-19 13:20:02 +0530111 if err != nil {
112 logger.Errorw(ctx, "Failed to get meter info", log.Fields{"Reason": err.Error()})
113 w.WriteHeader(http.StatusNotFound)
Hitesh Chhabraaf80b832023-07-21 15:27:20 +0530114 return
Akash Sonib3abf522022-12-19 13:20:02 +0530115 }
vinokuma926cb3e2023-03-29 11:41:06 +0530116 for deviceID, meters := range meterInfo {
Akash Sonib3abf522022-12-19 13:20:02 +0530117 for _, meter := range meters {
vinokuma926cb3e2023-03-29 11:41:06 +0530118 mtr := mh.MeterObjectMapping(meter, deviceID)
Akash Sonib3abf522022-12-19 13:20:02 +0530119 metersList.Meters = append(metersList.Meters, mtr)
120 }
121 }
122 MeterRespJSON, err := json.Marshal(metersList)
123 if err != nil {
Hitesh Chhabraaf80b832023-07-21 15:27:20 +0530124 logger.Errorw(ctx, "Error occurred while marshaling meter response", log.Fields{"MetersList": metersList, "Error": err})
Akash Sonib3abf522022-12-19 13:20:02 +0530125 w.WriteHeader(http.StatusInternalServerError)
126 return
127 }
128 w.Header().Add("Content-Type", "application/json")
129 _, err = w.Write(MeterRespJSON)
130 if err != nil {
Hitesh Chhabraaf80b832023-07-21 15:27:20 +0530131 logger.Errorw(ctx, "error in sending meter response", log.Fields{"MetersList": metersList, "Error": err})
Akash Sonib3abf522022-12-19 13:20:02 +0530132 w.WriteHeader(http.StatusInternalServerError)
Hitesh Chhabraaf80b832023-07-21 15:27:20 +0530133 return
Akash Sonib3abf522022-12-19 13:20:02 +0530134 }
Hitesh Chhabraaf80b832023-07-21 15:27:20 +0530135 logger.Debugw(ctx, "Fetching all Meter Info from device", log.Fields{"MetersList": metersList})
Akash Sonib3abf522022-12-19 13:20:02 +0530136}