2 ==================================================================================
3 Copyright (c) 2019 AT&T Intellectual Property.
4 Copyright (c) 2019 Nokia
6 Licensed under the Apache License, Version 2.0 (the "License");
7 you may not use this file except in compliance with the License.
8 You may obtain a copy of the License at
10 http://www.apache.org/licenses/LICENSE-2.0
12 Unless required by applicable law or agreed to in writing, software
13 distributed under the License is distributed on an "AS IS" BASIS,
14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 See the License for the specific language governing permissions and
16 limitations under the License.
17 ==================================================================================
24 "github.com/gorilla/mux"
25 "github.com/spf13/viper"
30 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/models"
34 ReadyURL = "/ric/v1/health/ready"
35 AliveURL = "/ric/v1/health/alive"
36 ConfigURL = "/ric/v1/cm/{name}"
37 AppConfigURL = "/ric/v1/config"
44 type StatusCb func() bool
51 func NewRouter() *Router {
53 router: mux.NewRouter().StrictSlash(true),
54 cbMap: make([]StatusCb, 0),
57 // Inject default routes for health probes
58 r.InjectRoute(ReadyURL, readyHandler, "GET")
59 r.InjectRoute(AliveURL, aliveHandler, "GET")
60 r.InjectRoute(ConfigURL, configHandler, "POST")
61 r.InjectRoute(AppConfigURL, appconfigHandler, "GET")
66 func (r *Router) serviceChecker(inner http.HandlerFunc) http.HandlerFunc {
67 return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
68 Logger.Info("restapi: method=%s url=%s", req.Method, req.URL.RequestURI())
69 if req.URL.RequestURI() == AliveURL || r.CheckStatus() {
70 inner.ServeHTTP(w, req)
72 respondWithJSON(w, http.StatusServiceUnavailable, nil)
77 func (r *Router) InjectRoute(url string, handler http.HandlerFunc, method string) *mux.Route {
78 return r.router.Path(url).HandlerFunc(r.serviceChecker(handler)).Methods(method)
81 func (r *Router) InjectQueryRoute(url string, h http.HandlerFunc, m string, q ...string) *mux.Route {
82 return r.router.Path(url).HandlerFunc(r.serviceChecker(h)).Methods(m).Queries(q...)
85 func (r *Router) InjectRoutePrefix(prefix string, handler http.HandlerFunc) *mux.Route {
86 return r.router.PathPrefix(prefix).HandlerFunc(r.serviceChecker(handler))
89 func (r *Router) InjectStatusCb(f StatusCb) {
90 r.cbMap = append(r.cbMap, f)
93 func (r *Router) CheckStatus() (status bool) {
94 if len(r.cbMap) == 0 {
98 for _, f := range r.cbMap {
104 func IsHealthProbeReady() bool {
108 func readyHandler(w http.ResponseWriter, r *http.Request) {
110 respondWithJSON(w, http.StatusOK, nil)
113 func aliveHandler(w http.ResponseWriter, r *http.Request) {
114 respondWithJSON(w, http.StatusOK, nil)
117 func configHandler(w http.ResponseWriter, r *http.Request) {
118 xappName := mux.Vars(r)["name"]
119 if xappName == "" || r.Body == nil {
120 respondWithJSON(w, http.StatusBadRequest, nil)
125 body, err := ioutil.ReadAll(r.Body)
127 Logger.Error("ioutil.ReadAll failed: %v", err)
128 respondWithJSON(w, http.StatusInternalServerError, nil)
132 if err := PublishConfigChange(xappName, string(body)); err != nil {
133 respondWithJSON(w, http.StatusInternalServerError, nil)
137 respondWithJSON(w, http.StatusOK, nil)
140 func respondWithJSON(w http.ResponseWriter, code int, payload interface{}) {
141 w.Header().Set("Content-Type", "application/json")
144 response, _ := json.Marshal(payload)
149 func appconfigHandler(w http.ResponseWriter, r *http.Request) {
151 Logger.Info("Inside appconfigHandler")
153 var appconfig models.XappConfigList
154 var metadata models.ConfigMetadata
155 var xappconfig models.XAppConfig
156 name := viper.GetString("name")
158 metadata.XappName = &name
159 metadata.ConfigType = &configtype
161 configFile, err := os.Open("/opt/ric/config/config-file.json")
163 Logger.Error("Cannot open config file: %v", err)
164 respondWithJSON(w, http.StatusInternalServerError, nil)
165 // return nil,errors.New("Could Not parse the config file")
168 body, err := ioutil.ReadAll(configFile)
170 defer configFile.Close()
172 xappconfig.Metadata = &metadata
173 xappconfig.Config = string(body)
175 appconfig = append(appconfig, &xappconfig)
177 respondWithJSON(w, http.StatusOK, appconfig)
179 //return appconfig,nil