Update logging interface 36/336/3 v0.0.4
authorAbukar Mohamed <abukar.mohamed@nokia.com>
Thu, 13 Jun 2019 12:48:35 +0000 (12:48 +0000)
committerAbukar Mohamed <abukar.mohamed@nokia.com>
Thu, 13 Jun 2019 14:04:23 +0000 (14:04 +0000)
Change-Id: I51bc8405cfe02b7bb2d94307d6e7ecb720c77d54
Signed-off-by: Abukar Mohamed <abukar.mohamed@nokia.com>
14 files changed:
Dockerfile
cmd/appmgr/api.go
cmd/appmgr/api_test.go
cmd/appmgr/db.go
cmd/appmgr/desc.go
cmd/appmgr/desc_test.go
cmd/appmgr/helm.go
cmd/appmgr/helm_test.go
cmd/appmgr/logger.go
cmd/appmgr/main.go
cmd/appmgr/subscriptions.go
cmd/appmgr/types.go
go.mod
go.sum

index 142c876..c20bde2 100644 (file)
@@ -28,6 +28,7 @@ RUN sed -i -e "s,http://security.ubuntu.com/ubuntu,$(wget -qO - mirrors.ubuntu.c
 # packages
 #
 RUN apt-get update -y && \
+    apt-get upgrade -y && \
     apt-get install -y \
     build-essential \
     apt-utils \
@@ -54,16 +55,6 @@ RUN wget https://dl.google.com/go/go1.12.linux-amd64.tar.gz && \
 
 ENV PATH="/usr/local/go/bin:${PATH}"
 
-#
-# rancodev libs
-#
-RUN mkdir -p /opt/build \
-    && cd /opt/build && git clone https://gerrit.o-ran-sc.org/r/ric-plt/lib/rmr \
-    && cd rmr/; mkdir build; cd build; cmake ..; make install \
-    && cd /opt/build && git clone https://gerrit.o-ran-sc.org/r/com/log \
-    && cd log/ ; ./autogen.sh ; ./configure ; make ; make install \
-    && ldconfig
-
 COPY build/user_entrypoint.sh /
 
 RUN chmod +x /user_entrypoint.sh
index 8450d02..2de8b05 100755 (executable)
@@ -57,10 +57,11 @@ func (m *XappManager) Initialize(h Helmer, cm ConfigMapper) {
                {"POST", "/ric/v1/config", m.createConfig},
                {"PUT", "/ric/v1/config", m.updateConfig},
                {"DELETE", "/ric/v1/config", m.deleteConfig},
+               {"DELETE", "/ric/v1/config/{name}", m.deleteSingleConfig},
        }
 
        for _, resource := range resources {
-               handler := Logger(resource.HandlerFunc)
+               handler := LogRestRequests(resource.HandlerFunc)
                //handler = m.serviceChecker(handler)
                m.router.Methods(resource.Method).Path(resource.Url).Handler(handler)
        }
@@ -139,7 +140,7 @@ func (m *XappManager) getXappInstanceByName(w http.ResponseWriter, r *http.Reque
                        return
                }
        }
-       mdclog(MdclogErr, "Xapp instance not found - url="+r.URL.RequestURI())
+       Logger.Error("Xapp instance not found - url=%s", r.URL.RequestURI())
 
        respondWithError(w, http.StatusNotFound, "Xapp instance not found")
 }
@@ -156,14 +157,14 @@ func (m *XappManager) getAllXapps(w http.ResponseWriter, r *http.Request) {
 
 func (m *XappManager) deployXapp(w http.ResponseWriter, r *http.Request) {
        if r.Body == nil {
-               mdclog(MdclogErr, "No xapp data found in request body - url="+r.URL.RequestURI())
+               Logger.Error("No xapp data found in request body - url=%s", r.URL.RequestURI())
                respondWithError(w, http.StatusMethodNotAllowed, "No xapp data!")
                return
        }
 
        var cm XappDeploy
        if err := json.NewDecoder(r.Body).Decode(&cm); err != nil {
-               mdclog(MdclogErr, "Invalid xapp data in request body - url="+r.URL.RequestURI())
+               Logger.Error("Invalid xapp data in request body - url=%s", r.URL.RequestURI())
                respondWithError(w, http.StatusMethodNotAllowed, "Invalid xapp data!")
                return
        }
@@ -207,7 +208,7 @@ func (m *XappManager) getSubscription(w http.ResponseWriter, r *http.Request) {
                if s, ok := m.sd.Get(id); ok {
                        respondWithJSON(w, http.StatusOK, s)
                } else {
-                       mdclog(MdclogErr, "Subscription not found - url="+r.URL.RequestURI())
+                       Logger.Error("Subscription not found - url=%s", r.URL.RequestURI())
                        respondWithError(w, http.StatusNotFound, "Subscription not found")
                }
        }
@@ -218,7 +219,7 @@ func (m *XappManager) deleteSubscription(w http.ResponseWriter, r *http.Request)
                if _, ok := m.sd.Delete(id); ok {
                        respondWithJSON(w, http.StatusNoContent, nil)
                } else {
-                       mdclog(MdclogErr, "Subscription not found - url="+r.URL.RequestURI())
+                       Logger.Error("Subscription not found - url=%s", r.URL.RequestURI())
                        respondWithError(w, http.StatusNotFound, "Subscription not found")
                }
        }
@@ -227,7 +228,7 @@ func (m *XappManager) deleteSubscription(w http.ResponseWriter, r *http.Request)
 func (m *XappManager) addSubscription(w http.ResponseWriter, r *http.Request) {
        var req SubscriptionReq
        if r.Body == nil || json.NewDecoder(r.Body).Decode(&req) != nil {
-               mdclog(MdclogErr, "Invalid request payload - url="+r.URL.RequestURI())
+               Logger.Error("Invalid request payload - url=%s", r.URL.RequestURI())
                respondWithError(w, http.StatusMethodNotAllowed, "Invalid request payload")
                return
        }
@@ -240,7 +241,7 @@ func (m *XappManager) updateSubscription(w http.ResponseWriter, r *http.Request)
        if id, ok := getResourceId(r, w, "id"); ok == true {
                var req SubscriptionReq
                if r.Body == nil || json.NewDecoder(r.Body).Decode(&req) != nil {
-                       mdclog(MdclogErr, "Invalid request payload - url="+r.URL.RequestURI())
+                       Logger.Error("Invalid request payload - url=%s", r.URL.RequestURI())
                        respondWithError(w, http.StatusMethodNotAllowed, "Invalid request payload")
                        return
                }
@@ -249,7 +250,7 @@ func (m *XappManager) updateSubscription(w http.ResponseWriter, r *http.Request)
                if s, ok := m.sd.Update(id, req); ok {
                        respondWithJSON(w, http.StatusOK, s)
                } else {
-                       mdclog(MdclogErr, "Subscription not found - url="+r.URL.RequestURI())
+                       Logger.Error("Subscription not found - url=%s", r.URL.RequestURI())
                        respondWithError(w, http.StatusNotFound, "Subscription not found")
                }
        }
@@ -258,7 +259,7 @@ func (m *XappManager) updateSubscription(w http.ResponseWriter, r *http.Request)
 func (m *XappManager) notifyClients() {
        xapps, err := m.helm.StatusAll()
        if err != nil {
-               mdclog(MdclogInfo, "Couldn't fetch xapps status information"+err.Error())
+               Logger.Info("Couldn't fetch xapps status information: %v", err.Error())
                return
        }
 
@@ -284,7 +285,7 @@ func (m *XappManager) createConfig(w http.ResponseWriter, r *http.Request) {
                }
                return
        }
-       respondWithJSON(w, http.StatusCreated, nil)
+       respondWithJSON(w, http.StatusCreated, c.Metadata)
 }
 
 func (m *XappManager) updateConfig(w http.ResponseWriter, r *http.Request) {
@@ -297,11 +298,21 @@ func (m *XappManager) updateConfig(w http.ResponseWriter, r *http.Request) {
                if err.Error() != "Validation failed!" {
                        respondWithError(w, http.StatusInternalServerError, err.Error())
                } else {
-                       respondWithJSON(w, http.StatusUnprocessableEntity, errList)
+                       respondWithJSON(w, http.StatusInternalServerError, errList)
                }
                return
        }
-       respondWithJSON(w, http.StatusOK, nil)
+       respondWithJSON(w, http.StatusOK, c.Metadata)
+}
+
+func (m *XappManager) deleteSingleConfig(w http.ResponseWriter, r *http.Request) {
+       xappName, ok := getResourceId(r, w, "name")
+       if ok != true {
+               return
+       }
+
+       md := ConfigMetadata{Name: xappName, Namespace: m.cm.GetNamespace(""), ConfigName: xappName + "-appconfig"}
+       m.delConfig(w, XAppConfig{Metadata: md})
 }
 
 func (m *XappManager) deleteConfig(w http.ResponseWriter, r *http.Request) {
@@ -310,11 +321,15 @@ func (m *XappManager) deleteConfig(w http.ResponseWriter, r *http.Request) {
                return
        }
 
+       m.delConfig(w, c)
+}
+
+func (m *XappManager) delConfig(w http.ResponseWriter, c XAppConfig) {
        if _, err := m.cm.DeleteConfigMap(c); err != nil {
                respondWithError(w, http.StatusInternalServerError, err.Error())
                return
        }
-       respondWithJSON(w, http.StatusNotFound, nil)
+       respondWithJSON(w, http.StatusNoContent, nil)
 }
 
 // Helper functions
@@ -333,7 +348,7 @@ func respondWithJSON(w http.ResponseWriter, code int, payload interface{}) {
 
 func getResourceId(r *http.Request, w http.ResponseWriter, pattern string) (id string, ok bool) {
        if id, ok = mux.Vars(r)[pattern]; ok != true {
-               mdclog(MdclogErr, "Couldn't resolve name/id from the request URL")
+               Logger.Error("Couldn't resolve name/id from the request URL")
                respondWithError(w, http.StatusMethodNotAllowed, "Couldn't resolve name/id from the request URL")
                return
        }
@@ -342,7 +357,7 @@ func getResourceId(r *http.Request, w http.ResponseWriter, pattern string) (id s
 
 func parseConfig(w http.ResponseWriter, r *http.Request, req *XAppConfig) error {
        if r.Body == nil || json.NewDecoder(r.Body).Decode(&req) != nil {
-               mdclog(MdclogErr, "Invalid request payload - url="+r.URL.RequestURI())
+               Logger.Error("Invalid request payload - url=%s", r.URL.RequestURI())
                respondWithError(w, http.StatusMethodNotAllowed, "Invalid request payload")
                return errors.New("Invalid payload")
        }
index 89e4a08..109f6e9 100755 (executable)
@@ -69,6 +69,7 @@ func (h *MockedHelmer) Delete(name string) (Xapp, error) {
 
 // Test cases
 func TestMain(m *testing.M) {
+       Logger = NewLogger("xapp-manager")
        loadConfig()
 
        xapp = Xapp{}
@@ -185,7 +186,7 @@ func TestDeleteConfigOk(t *testing.T) {
        req, _ := http.NewRequest("DELETE", "/ric/v1/config", bytes.NewBuffer(payload))
        response := executeRequest(req)
 
-       checkResponseCode(t, http.StatusNotFound, response.Code)
+       checkResponseCode(t, http.StatusNoContent, response.Code)
 }
 
 // Error handling
index 723fa10..97865c2 100755 (executable)
@@ -40,7 +40,7 @@ func (d *DB) Create() {
                if _, err := d.session.GetAll(); err == nil {
                        return
                }
-               mdclog(MdclogErr, "Database connection not ready, waiting ...")
+               Logger.Error("Database connection not ready, waiting ...")
                time.Sleep(time.Duration(5 * time.Second))
        }
 }
@@ -51,12 +51,12 @@ func (d *DB) StoreSubscriptions(m cmap.ConcurrentMap) {
 
                data, err := json.Marshal(s.req)
                if err != nil {
-                       mdclog(MdclogErr, "json.marshal failed: "+err.Error())
+                       Logger.Error("json.marshal failed: %v ", err.Error())
                        return
                }
 
                if err := d.session.Set(s.req.Id, data); err != nil {
-                       mdclog(MdclogErr, "DB.session.Set failed: "+err.Error())
+                       Logger.Error("DB.session.Set failed: %v ", err.Error())
                }
        }
 }
@@ -66,20 +66,20 @@ func (d *DB) RestoreSubscriptions() (m cmap.ConcurrentMap) {
 
        keys, err := d.session.GetAll()
        if err != nil {
-               mdclog(MdclogErr, "DB.session.GetAll failed: "+err.Error())
+               Logger.Error("DB.session.GetAll failed: %v ", err.Error())
                return
        }
 
        for _, key := range keys {
                value, err := d.session.Get([]string{key})
                if err != nil {
-                       mdclog(MdclogErr, "DB.session.Get failed: "+err.Error())
+                       Logger.Error("DB.session.Get failed: %v ", err.Error())
                        return
                }
 
                var item SubscriptionReq
                if err = json.Unmarshal([]byte(value[key].(string)), &item); err != nil {
-                       mdclog(MdclogErr, "json.Unmarshal failed: "+err.Error())
+                       Logger.Error("json.Unmarshal failed: %v ", err.Error())
                        return
                }
 
index ac1d0c8..d4493be 100755 (executable)
@@ -65,13 +65,14 @@ type CMError struct {
 }
 
 func (cm *ConfigMap) UploadConfig() (cfg []XAppConfig) {
+       ns := cm.GetNamespace("")
        for _, name := range cm.GetNamesFromHelmRepo() {
                if name == "appmgr" {
                        continue
                }
 
                c := XAppConfig{
-                       Metadata: ConfigMetadata{Name: name, Namespace: "ricxapp", ConfigName: name + "-appconfig"},
+                       Metadata: ConfigMetadata{Name: name, Namespace: ns, ConfigName: name + "-appconfig"},
                }
 
                err := cm.ReadSchema(name, &c)
@@ -79,7 +80,7 @@ func (cm *ConfigMap) UploadConfig() (cfg []XAppConfig) {
                        continue
                }
 
-               err = cm.ReadConfigMap(c.Metadata.ConfigName, "ricxapp", &c.Configuration)
+               err = cm.ReadConfigMap(c.Metadata.ConfigName, ns, &c.Configuration)
                if err != nil {
                        log.Println("No active configMap found, using default!")
                }
@@ -291,7 +292,8 @@ func (cm *ConfigMap) FetchChart(name string) (err error) {
 func (cm *ConfigMap) GetMessages(name string) (msgs MessageTypes) {
        log.Println("Fetching tx/rx messages for: ", name)
 
-       args := fmt.Sprintf("get configmap -o jsonpath='{.data.config-file\\.json}' -n ricxapp %s-appconfig", name)
+       ns := cm.GetNamespace("")
+       args := fmt.Sprintf("get configmap -o jsonpath='{.data.config-file\\.json}' -n %s %s-appconfig", ns, name)
        out, err := KubectlExec(args)
        if err != nil {
                return
@@ -313,3 +315,16 @@ func (cm *ConfigMap) GetMessages(name string) (msgs MessageTypes) {
 
        return
 }
+
+func (cm *ConfigMap) GetNamespace(ns string) string {
+       if ns != "" {
+               return ns
+       }
+
+       ns = viper.GetString("xapp.namespace")
+       if ns == "" {
+               ns = "ricxapp"
+       }
+       return ns
+}
+
index f553c38..bd4a3f3 100755 (executable)
@@ -66,6 +66,10 @@ type ConfigSample struct {
 type MockedConfigMapper struct {
 }
 
+func (cm *MockedConfigMapper) ReadSchema(name string, c *XAppConfig) (err error) {
+       return
+}
+
 func (cm *MockedConfigMapper) UploadConfig() (cfg []XAppConfig) {
        return
 }
@@ -74,15 +78,19 @@ func (cm *MockedConfigMapper) CreateConfigMap(r XAppConfig) (errList []CMError,
        return
 }
 
-func (cm *MockedConfigMapper) UpdateConfigMap(r XAppConfig) (errList []CMError, err error){
+func (cm *MockedConfigMapper) GetConfigMap(m XappDeploy, c *interface{}) (err error) {
+       return
+}
+
+func (cm *MockedConfigMapper) UpdateConfigMap(r XAppConfig) (errList []CMError, err error) {
        return
 }
 
-func (cm *MockedConfigMapper) DeleteConfigMap(r XAppConfig) (c interface{}, err error){
+func (cm *MockedConfigMapper) DeleteConfigMap(r XAppConfig) (c interface{}, err error) {
        return
 }
 
-func (cm *MockedConfigMapper) PurgeConfigMap(m XappDeploy) (c interface{}, err error){
+func (cm *MockedConfigMapper) PurgeConfigMap(m XappDeploy) (c interface{}, err error) {
        return
 }
 
@@ -106,6 +114,10 @@ func (cm *MockedConfigMapper) GetMessages(name string) (msgs MessageTypes) {
        return
 }
 
+func (cm *MockedConfigMapper) GetNamespace(ns string) (n string) {
+       return
+}
+
 // Test cases
 func TestGetMessages(t *testing.T) {
        cm := ConfigMap{}
@@ -124,6 +136,18 @@ func TestGetMessages(t *testing.T) {
        }
 }
 
+func TestHelmNamespace(t *testing.T) {
+       cm := ConfigMap{}
+
+       if cm.GetNamespace("pltxapp") != "pltxapp" {
+        t.Errorf("getNamespace failed!")
+       }
+
+    if cm.GetNamespace("") != "ricxapp" {
+        t.Errorf("getNamespace failed!")
+       }
+}
+
 func TestFetchChartFails(t *testing.T) {
        cm := ConfigMap{}
 
index 578dcf0..a3785c8 100755 (executable)
@@ -48,7 +48,7 @@ func Exec(args string) (out []byte, err error) {
        for i := 0; i < viper.GetInt("helm.retry"); i++ {
                err = cmd.Run()
                if err != nil {
-                       mdclog(MdclogErr, formatLog("Command failed, retrying", args, err.Error()+stderr.String()))
+                       Logger.Error("Command '%s' failed with error: %v, retrying", args, err.Error()+stderr.String())
                        time.Sleep(time.Duration(2) * time.Second)
                        continue
                }
@@ -56,7 +56,7 @@ func Exec(args string) (out []byte, err error) {
        }
 
        if err == nil && !strings.HasSuffix(os.Args[0], ".test") {
-               mdclog(MdclogDebug, formatLog("command success", stdout.String(), ""))
+               Logger.Info("command success: %s", stdout.String())
                return stdout.Bytes(), nil
        }
 
@@ -82,19 +82,19 @@ func (h *Helm) Initialize() {
 
        for {
                if _, err := h.Init(); err == nil {
-                       mdclog(MdclogDebug, formatLog("Helm init done successfully!", "", ""))
+                       Logger.Info("Helm init done successfully!")
                        break
                }
-               mdclog(MdclogErr, formatLog("helm init failed, retyring ...", "", ""))
+               Logger.Error("helm init failed, retyring ...")
                time.Sleep(time.Duration(10) * time.Second)
        }
 
        for {
                if _, err := h.AddRepo(); err == nil {
-                       mdclog(MdclogDebug, formatLog("Helm repo added successfully", "", ""))
+                       Logger.Info("Helm repo added successfully")
                        break
                }
-               mdclog(MdclogErr, formatLog("Helm repo addition failed, retyring ...", "", ""))
+               Logger.Error("Helm repo addition failed, retyring ...")
                time.Sleep(time.Duration(10) * time.Second)
        }
 
@@ -119,7 +119,7 @@ func (h *Helm) AddRepo() (out []byte, err error) {
        // Get helm repo user name and password from files mounted by secret object
        credFile, err := ioutil.ReadFile(viper.GetString("helm.helm-username-file"))
        if err != nil {
-               mdclog(MdclogErr, formatLog("helm_repo_username ReadFile failed", "", err.Error()))
+               Logger.Error("helm_repo_username ReadFile failed: %v", err.Error())
                return
        }
 
@@ -127,7 +127,7 @@ func (h *Helm) AddRepo() (out []byte, err error) {
 
        credFile, err = ioutil.ReadFile(viper.GetString("helm.helm-password-file"))
        if err != nil {
-               mdclog(MdclogErr, formatLog("helm_repo_password ReadFile failed", "", err.Error()))
+               Logger.Error("helm_repo_password ReadFile failed: %v", err.Error())
                return
        }
 
@@ -149,7 +149,7 @@ func (h *Helm) Install(m XappDeploy) (xapp Xapp, err error) {
        }
 
        var cm interface{}
-       m.Namespace = getNamespace(m.Namespace)
+       m.Namespace = h.cm.GetNamespace(m.Namespace)
 
        if err = h.cm.GetConfigMap(m, &cm); err != nil {
                out, err = h.Run(getInstallArgs(m, false))
@@ -180,7 +180,7 @@ func (h *Helm) Install(m XappDeploy) (xapp Xapp, err error) {
 func (h *Helm) Status(name string) (xapp Xapp, err error) {
        out, err := h.Run(strings.Join([]string{"status ", name}, ""))
        if err != nil {
-               mdclog(MdclogErr, formatLog("Getting xapps status", "", err.Error()))
+               Logger.Error("Getting xapps status: %v", err.Error())
                return
        }
 
@@ -190,7 +190,7 @@ func (h *Helm) Status(name string) (xapp Xapp, err error) {
 func (h *Helm) StatusAll() (xapps []Xapp, err error) {
        xappNameList, err := h.List()
        if err != nil {
-               mdclog(MdclogErr, formatLog("Helm list failed", "", err.Error()))
+               Logger.Error("Helm list failed: %v", err.Error())
                return
        }
 
@@ -198,10 +198,10 @@ func (h *Helm) StatusAll() (xapps []Xapp, err error) {
 }
 
 func (h *Helm) List() (names []string, err error) {
-       ns := getNamespace("")
+       ns := h.cm.GetNamespace("")
        out, err := h.Run(strings.Join([]string{"list --all --output yaml --namespace=", ns}, ""))
        if err != nil {
-               mdclog(MdclogErr, formatLog("Listing deployed xapps failed", "", err.Error()))
+               Logger.Error("Listing deployed xapps failed: %v", err.Error())
                return
        }
 
@@ -211,7 +211,7 @@ func (h *Helm) List() (names []string, err error) {
 func (h *Helm) Delete(name string) (xapp Xapp, err error) {
        xapp, err = h.Status(name)
        if err != nil {
-               mdclog(MdclogErr, formatLog("Fetching xapp status failed", "", err.Error()))
+               Logger.Error("Fetching xapp status failed: %v", err.Error())
                return
        }
 
@@ -232,7 +232,7 @@ func (h *Helm) Fetch(name, tarDir string) error {
 
 // Helper functions
 func (h *Helm) GetVersion(name string) (version string) {
-       ns := getNamespace("")
+       ns := h.cm.GetNamespace("")
        out, err := h.Run(strings.Join([]string{"list --output yaml --namespace=", ns, " ", name}, ""))
        if err != nil {
                return
@@ -325,6 +325,11 @@ func (h *Helm) parseAllStatus(names []string) (xapps []Xapp, err error) {
        xapps = []Xapp{}
 
        for _, name := range names {
+               err := h.cm.ReadSchema(name, &XAppConfig{})
+               if err != nil {
+                       continue
+               }
+
                x, err := h.Status(name)
                if err == nil {
                        xapps = append(xapps, x)
@@ -340,24 +345,12 @@ func addTillerEnv() (err error) {
        port := viper.GetString("helm.tiller-port")
 
        if err = os.Setenv("HELM_HOST", service+"."+namespace+":"+port); err != nil {
-               mdclog(MdclogErr, formatLog("Tiller Env Setting Failed", "", err.Error()))
+               Logger.Error("Tiller Env Setting Failed: %v", err.Error())
        }
 
        return err
 }
 
-func getNamespace(namespace string) string {
-       if namespace != "" {
-               return namespace
-       }
-
-       ns := viper.GetString("xapp.namespace")
-       if ns == "" {
-               ns = "ricxapp"
-       }
-       return ns
-}
-
 func getInstallArgs(x XappDeploy, cmOverride bool) (args string) {
        args = args + " --namespace=" + x.Namespace
 
@@ -380,7 +373,3 @@ func getInstallArgs(x XappDeploy, cmOverride bool) (args string) {
        rname := viper.GetString("helm.repo-name")
        return fmt.Sprintf("install %s/%s --name=%s %s", rname, x.Name, x.Name, args)
 }
-
-func formatLog(text string, args string, err string) string {
-       return fmt.Sprintf("Helm: %s: args=%s err=%s\n", text, args, err)
-}
index c3ac3c5..b3ff348 100755 (executable)
@@ -99,16 +99,6 @@ func TestHelmLists(t *testing.T) {
     }
 }
 
-func TestHelmNamespace(t *testing.T) {
-    if getNamespace("pltxapp") != "pltxapp" {
-        t.Errorf("getNamespace failed!")
-       }
-
-    if getNamespace("") != "ricxapp" {
-        t.Errorf("getNamespace failed!")
-       }
-}
-
 func TestAddTillerEnv(t *testing.T) {
     if addTillerEnv() != nil {
         t.Errorf("TestAddTillerEnv failed!")
@@ -116,7 +106,7 @@ func TestAddTillerEnv(t *testing.T) {
 }
 
 func TestGetInstallArgs(t *testing.T) {
-       x := XappDeploy{Name: "dummy-xapp"}
+       x := XappDeploy{Name: "dummy-xapp", Namespace: "ricxapp"}
 
        expectedArgs := "install helm-repo/dummy-xapp --name=dummy-xapp  --namespace=ricxapp"
        if args := getInstallArgs(x, false); args != expectedArgs {
@@ -124,19 +114,19 @@ func TestGetInstallArgs(t *testing.T) {
        }
 
        x.ImageRepo = "localhost:5000"
-       expectedArgs = expectedArgs + " --set image.repository=" + "localhost:5000"
+       expectedArgs = expectedArgs + " --set global.repository=" + "localhost:5000"
        if args := getInstallArgs(x, false); args != expectedArgs {
         t.Errorf("TestGetInstallArgs failed: expected %v, got %v", expectedArgs, args)
        }
 
        x.ServiceName = "xapp"
-       expectedArgs = expectedArgs + " --set service.name=" + "xapp"
+       expectedArgs = expectedArgs + " --set ricapp.service.name=" + "xapp"
        if args := getInstallArgs(x, false); args != expectedArgs {
         t.Errorf("TestGetInstallArgs failed: expected %v, got %v", expectedArgs, args)
        }
 
        x.ServiceName = "xapp"
-       expectedArgs = expectedArgs + " --set appconfig.override=true"
+       expectedArgs = expectedArgs + " --set ricapp.appconfig.override=dummy-xapp-appconfig"
        if args := getInstallArgs(x, true); args != expectedArgs {
         t.Errorf("TestGetInstallArgs failed: expected %v, got %v", expectedArgs, args)
        }
index 877bcbe..b8a7475 100755 (executable)
 
 package main
 
-/*
-#cgo CFLAGS: -I/usr/local/include
-#cgo LDFLAGS: -lmdclog
-#
-#include <mdclog/mdclog.h>
-void xAppMgr_mdclog_write(mdclog_severity_t severity, const char *msg) {
-     mdclog_write(severity, "%s", msg);
-}
-*/
-import "C"
-
 import (
-       "fmt"
        "net/http"
        "time"
+       mdclog "gerrit.o-ran-sc.org/r/com/golog"
 )
 
-func mdclog(severity C.mdclog_severity_t, msg string) {
-       msg = fmt.Sprintf("%s:: %s ", time.Now().Format("2019-01-02 15:04:05"), msg)
+type Log struct {
+       logger *mdclog.MdcLogger
+}
+
+func NewLogger(name string) *Log {
+       l, _ := mdclog.InitLogger(name)
+       return &Log{
+               logger: l,
+       }
+}
+
+func (l *Log) SetLevel(level int) {
+       l.logger.LevelSet(mdclog.Level(level))
+}
+
+func (l *Log) SetMdc(key string, value string) {
+       l.logger.MdcAdd(key, value)
+}
+
+func (l *Log) Error(pattern string, args ...interface{}) {
+       l.SetMdc("time", time.Now().Format("2019-01-02 15:04:05"))
+       l.logger.Error(pattern, args...)
+}
+
+func (l *Log) Warn(pattern string, args ...interface{}) {
+       l.SetMdc("time", time.Now().Format("2019-01-02 15:04:05"))
+       l.logger.Warning(pattern, args...)
+}
 
-       C.mdclog_mdc_add(C.CString("XM"), C.CString("1.0.1"))
-       C.xAppMgr_mdclog_write(severity, C.CString(msg))
+func (l *Log) Info(pattern string, args ...interface{}) {
+       l.SetMdc("time", time.Now().Format("2019-01-02 15:04:05"))
+       l.logger.Info(pattern, args...)
 }
 
-func mdclogSetLevel(severity C.mdclog_severity_t) {
-       C.mdclog_level_set(severity)
+func (l *Log) Debug(pattern string, args ...interface{}) {
+       l.SetMdc("time", time.Now().Format("2019-01-02 15:04:05"))
+       l.logger.Debug(pattern, args...)
 }
 
-func Logger(inner http.Handler) http.Handler {
+func LogRestRequests(inner http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
                inner.ServeHTTP(w, r)
-               s := fmt.Sprintf("Logger: method=%s url=%s", r.Method, r.URL.RequestURI())
-               mdclog(C.MDCLOG_DEBUG, s)
+               Logger.Info("Logger: method=%s url=%s", r.Method, r.URL.RequestURI())
        })
 }
index 9b9eebb..954f957 100755 (executable)
 
 package main
 
+var Logger *Log
+
 func main() {
-       mdclogSetLevel(MdclogDebug)
+       Logger = NewLogger("xapp-manager")
 
        loadConfig()
 
index 5728e5b..1db4c5a 100755 (executable)
@@ -22,7 +22,6 @@ package main
 import (
        "bytes"
        "encoding/json"
-       "fmt"
        "github.com/segmentio/ksuid"
        "net/http"
        "time"
@@ -44,7 +43,7 @@ func (sd *SubscriptionDispatcher) Add(sr SubscriptionReq) (resp SubscriptionResp
        sd.subscriptions.Set(key, Subscription{sr, resp})
        sd.db.StoreSubscriptions(sd.subscriptions)
 
-       mdclog(MdclogInfo, fmt.Sprintf("Sub: New subscription added: key=%s value=%v", key, sr))
+       Logger.Info("Sub: New subscription added: key=%s value=%v", key, sr)
        return
 }
 
@@ -59,7 +58,7 @@ func (sd *SubscriptionDispatcher) GetAll() (hooks []SubscriptionReq) {
 
 func (sd *SubscriptionDispatcher) Get(id string) (SubscriptionReq, bool) {
        if v, found := sd.subscriptions.Get(id); found {
-               mdclog(MdclogInfo, fmt.Sprintf("Subscription id=%s found: %v", id, v.(Subscription).req))
+               Logger.Info("Subscription id=%s found: %v", id, v.(Subscription).req)
 
                return v.(Subscription).req, found
        }
@@ -68,7 +67,7 @@ func (sd *SubscriptionDispatcher) Get(id string) (SubscriptionReq, bool) {
 
 func (sd *SubscriptionDispatcher) Delete(id string) (SubscriptionReq, bool) {
        if v, found := sd.subscriptions.Get(id); found {
-               mdclog(MdclogInfo, fmt.Sprintf("Subscription id=%s found: %v ... deleting", id, v.(Subscription).req))
+               Logger.Info("Subscription id=%s found: %v ... deleting", id, v.(Subscription).req)
 
                sd.subscriptions.Remove(id)
                sd.db.StoreSubscriptions(sd.subscriptions)
@@ -80,7 +79,7 @@ func (sd *SubscriptionDispatcher) Delete(id string) (SubscriptionReq, bool) {
 
 func (sd *SubscriptionDispatcher) Update(id string, sr SubscriptionReq) (SubscriptionReq, bool) {
        if s, found := sd.subscriptions.Get(id); found {
-               mdclog(MdclogInfo, fmt.Sprintf("Subscription id=%s found: %v ... updating", id, s.(Subscription).req))
+               Logger.Info("Subscription id=%s found: %v ... updating", id, s.(Subscription).req)
 
                sr.Id = id
                sd.subscriptions.Set(id, Subscription{sr, s.(Subscription).resp})
@@ -97,7 +96,7 @@ func (sd *SubscriptionDispatcher) Publish(x Xapp, et EventType) {
 
 func (sd *SubscriptionDispatcher) notifyClients(xapps []Xapp, et EventType) {
        if len(xapps) == 0 || len(sd.subscriptions) == 0 {
-               mdclog(MdclogInfo, fmt.Sprintf("Nothing to publish [%d:%d]", len(xapps), len(sd.subscriptions)))
+               Logger.Info("Nothing to publish [%d:%d]", len(xapps), len(sd.subscriptions))
                return
        }
 
@@ -113,7 +112,7 @@ func (sd *SubscriptionDispatcher) notify(xapps []Xapp, et EventType, s Subscript
 
        jsonData, err := json.Marshal(notif)
        if err != nil {
-               mdclog(MdclogInfo, fmt.Sprintf("json.Marshal failed: %v", err))
+               Logger.Info("json.Marshal failed: %v", err)
                return err
        }
 
@@ -121,16 +120,16 @@ func (sd *SubscriptionDispatcher) notify(xapps []Xapp, et EventType, s Subscript
        return sd.retry(s, func() error {
                resp, err := http.Post(s.req.TargetUrl, "application/json", bytes.NewBuffer(jsonData))
                if err != nil {
-                       mdclog(MdclogInfo, fmt.Sprintf("Posting to subscription failed: %v", err))
+                       Logger.Info("Posting to subscription failed: %v", err)
                        return err
                }
 
                if resp.StatusCode != http.StatusOK {
-                       mdclog(MdclogInfo, fmt.Sprintf("Client returned error code: %d", resp.StatusCode))
+                       Logger.Info("Client returned error code: %d", resp.StatusCode)
                        return err
                }
 
-               mdclog(MdclogInfo, fmt.Sprintf("subscription to '%s' dispatched, response code: %d \n", s.req.TargetUrl, resp.StatusCode))
+               Logger.Info("subscription to '%s' dispatched, response code: %d", s.req.TargetUrl, resp.StatusCode)
                return nil
        })
 }
index e32b62f..d452498 100755 (executable)
@@ -77,11 +77,13 @@ type ConfigMapper interface {
        CreateConfigMap(r XAppConfig) (errList []CMError, err error)
        UpdateConfigMap(r XAppConfig) (errList []CMError, err error)
        DeleteConfigMap(r XAppConfig) (cm interface{}, err error)
+       ReadSchema(name string, c *XAppConfig) (err error)
        PurgeConfigMap(m XappDeploy) (cm interface{}, err error)
        RestoreConfigMap(m XappDeploy, cm interface{}) (err error)
        ReadConfigMap(name string, ns string, c *interface{}) (err error)
        ApplyConfigMap(r XAppConfig, action string) (err error)
        GetMessages(name string) (msgs MessageTypes)
+       GetNamespace(ns string) string
 }
 
 type Helmer interface {
diff --git a/go.mod b/go.mod
index 19c1062..6a22825 100644 (file)
--- a/go.mod
+++ b/go.mod
@@ -3,6 +3,7 @@ module gerrit.oran-osc.org/r/ric-plt/appmgr
 go 1.12
 
 require (
+       gerrit.o-ran-sc.org/r/com/golog v0.0.1
        gerrit.oran-osc.org/r/ric-plt/sdlgo v0.0.0
        github.com/BurntSushi/toml v0.3.1 // indirect
        github.com/fsnotify/fsnotify v1.4.7
@@ -17,3 +18,5 @@ require (
 )
 
 replace gerrit.oran-osc.org/r/ric-plt/sdlgo => gerrit.oran-osc.org/r/ric-plt/sdlgo.git v0.0.1
+
+replace gerrit.o-ran-sc.org/r/com/golog => gerrit.o-ran-sc.org/r/com/golog.git v0.0.1
diff --git a/go.sum b/go.sum
index 46361f4..e0539a4 100644 (file)
--- a/go.sum
+++ b/go.sum
@@ -1,3 +1,6 @@
+gerrit.o-ran-sc.org/r/com/golog.git v0.0.1 h1:9RfO/Whehaaq5KiJTT7s+YOzmi9mT1C3HktfhwwMEmw=
+gerrit.o-ran-sc.org/r/com/golog.git v0.0.1/go.mod h1:b8YB31U8/4iRpABioeSzGi/YMzOQ/Zq7hrJmmXKqlJk=
+gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.1.1/go.mod h1:2Y8gw2jqj9urI8VFqFQn7BX0J3A852+YrXVV9V8gOt4=
 gerrit.oran-osc.org/r/ric-plt/sdlgo.git v0.0.1 h1:l2dl31r++3xhgCumTzwvuo0/F415eqU4aFk/uDQ4WnM=
 gerrit.oran-osc.org/r/ric-plt/sdlgo.git v0.0.1/go.mod h1:LVhkNS82IofJTBK/VYPKiYed9MG/3OFwvWC6MGSDw1w=
 github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=