Support for SDL config update via REST i/f
[ric-plt/xapp-frame.git] / pkg / xapp / restapi.go
index 291a874..6562dc5 100755 (executable)
@@ -22,12 +22,14 @@ package xapp
 import (
        "encoding/json"
        "github.com/gorilla/mux"
+       "io/ioutil"
        "net/http"
 )
 
 const (
-       ReadyURL = "/ric/v1/health/ready"
-       AliveURL = "/ric/v1/health/alive"
+       ReadyURL  = "/ric/v1/health/ready"
+       AliveURL  = "/ric/v1/health/alive"
+       ConfigURL = "/ric/v1/cm/{name}"
 )
 
 type StatusCb func() bool
@@ -46,6 +48,7 @@ func NewRouter() *Router {
        // Inject default routes for health probes
        r.InjectRoute(ReadyURL, readyHandler, "GET")
        r.InjectRoute(AliveURL, aliveHandler, "GET")
+       r.InjectRoute(ConfigURL, configHandler, "POST")
 
        return r
 }
@@ -53,7 +56,7 @@ func NewRouter() *Router {
 func (r *Router) serviceChecker(inner http.HandlerFunc) http.HandlerFunc {
        return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
                Logger.Info("restapi: method=%s url=%s", req.Method, req.URL.RequestURI())
-               if req.URL.RequestURI() == AliveURL || (Rmr.IsReady() && r.CheckStatus()) {
+               if req.URL.RequestURI() == AliveURL || r.CheckStatus() {
                        inner.ServeHTTP(w, req)
                } else {
                        respondWithJSON(w, http.StatusServiceUnavailable, nil)
@@ -62,11 +65,15 @@ func (r *Router) serviceChecker(inner http.HandlerFunc) http.HandlerFunc {
 }
 
 func (r *Router) InjectRoute(url string, handler http.HandlerFunc, method string) *mux.Route {
-       return r.router.HandleFunc(url, r.serviceChecker(handler)).Methods(method)
+       return r.router.Path(url).HandlerFunc(r.serviceChecker(handler)).Methods(method)
 }
 
 func (r *Router) InjectQueryRoute(url string, h http.HandlerFunc, m string, q ...string) *mux.Route {
-       return r.router.HandleFunc(url, r.serviceChecker(h)).Methods(m).Queries(q...)
+       return r.router.Path(url).HandlerFunc(r.serviceChecker(h)).Methods(m).Queries(q...)
+}
+
+func (r *Router) InjectRoutePrefix(prefix string, handler http.HandlerFunc) *mux.Route {
+       return r.router.PathPrefix(prefix).HandlerFunc(r.serviceChecker(handler))
 }
 
 func (r *Router) InjectStatusCb(f StatusCb) {
@@ -92,6 +99,29 @@ func aliveHandler(w http.ResponseWriter, r *http.Request) {
        respondWithJSON(w, http.StatusOK, nil)
 }
 
+func configHandler(w http.ResponseWriter, r *http.Request) {
+       xappName := mux.Vars(r)["name"]
+       if xappName == "" || r.Body == nil {
+               respondWithJSON(w, http.StatusBadRequest, nil)
+               return
+       }
+       defer r.Body.Close()
+
+       body, err := ioutil.ReadAll(r.Body)
+       if err != nil {
+               Logger.Error("ioutil.ReadAll failed: %v", err)
+               respondWithJSON(w, http.StatusInternalServerError, nil)
+               return
+       }
+
+       if err := PublishConfigChange(xappName, string(body)); err != nil {
+               respondWithJSON(w, http.StatusInternalServerError, nil)
+               return
+       }
+
+       respondWithJSON(w, http.StatusOK, nil)
+}
+
 func respondWithJSON(w http.ResponseWriter, code int, payload interface{}) {
        w.Header().Set("Content-Type", "application/json")
        w.WriteHeader(code)