Resolve RMR port from K8s services
[ric-plt/appmgr.git] / pkg / helm / helm.go
index a3d7b18..157a117 100755 (executable)
@@ -30,10 +30,10 @@ import (
        "strings"
        "time"
 
-       "gerrit.oran-osc.org/r/ric-plt/appmgr/pkg/appmgr"
-       "gerrit.oran-osc.org/r/ric-plt/appmgr/pkg/cm"
-       "gerrit.oran-osc.org/r/ric-plt/appmgr/pkg/models"
-       "gerrit.oran-osc.org/r/ric-plt/appmgr/pkg/util"
+       "gerrit.o-ran-sc.org/r/ric-plt/appmgr/pkg/appmgr"
+       "gerrit.o-ran-sc.org/r/ric-plt/appmgr/pkg/cm"
+       "gerrit.o-ran-sc.org/r/ric-plt/appmgr/pkg/models"
+       "gerrit.o-ran-sc.org/r/ric-plt/appmgr/pkg/util"
 )
 
 type Helm struct {
@@ -85,28 +85,25 @@ func (h *Helm) Init() (out []byte, err error) {
 
 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"))
+       username, err := ioutil.ReadFile(viper.GetString("helm.helm-username-file"))
        if err != nil {
                appmgr.Logger.Info("helm_repo_username ReadFile failed: %v", err.Error())
                return
        }
-       username := " --username " + string(credFile)
 
-       credFile, err = ioutil.ReadFile(viper.GetString("helm.helm-password-file"))
+       password, err := ioutil.ReadFile(viper.GetString("helm.helm-password-file"))
        if err != nil {
                appmgr.Logger.Info("helm_repo_password ReadFile failed: %v", err.Error())
                return
        }
-       pwd := " --password " + string(credFile)
 
-       rname := viper.GetString("helm.repo-name")
-       repo := viper.GetString("helm.repo")
+       repoArgs := fmt.Sprintf(" %s %s ", viper.GetString("helm.repo-name"), viper.GetString("helm.repo"))
+       credentials := fmt.Sprintf(" --username %s --password %s", string(username), string(password))
 
-       return util.HelmExec(strings.Join([]string{"repo add ", rname, " ", repo, username, pwd}, ""))
+       return util.HelmExec(strings.Join([]string{"repo add ", repoArgs, credentials}, ""))
 }
 
 func (h *Helm) Install(m models.XappDescriptor) (xapp models.Xapp, err error) {
-       var c interface{}
        m.Namespace = h.cm.GetNamespace(m.Namespace)
 
        out, err := h.Run(strings.Join([]string{"repo update "}, ""))
@@ -114,29 +111,10 @@ func (h *Helm) Install(m models.XappDescriptor) (xapp models.Xapp, err error) {
                return
        }
 
-       if err = h.cm.GetConfigMap(m, &c); err != nil {
-               out, err = h.Run(h.GetInstallArgs(m, false))
-               if err != nil {
-                       return
-               }
-               return h.ParseStatus(*m.XappName, string(out))
-       }
-
-       // ConfigMap exists, try to override
-       out, err = h.Run(h.GetInstallArgs(m, true))
-       if err == nil {
-               return h.ParseStatus(*m.XappName, string(out))
-       }
-
-       c, cmErr := h.cm.PurgeConfigMap(m)
        out, err = h.Run(h.GetInstallArgs(m, false))
        if err != nil {
                return
        }
-
-       if cmErr == nil {
-               cmErr = h.cm.RestoreConfigMap(m, c)
-       }
        return h.ParseStatus(*m.XappName, string(out))
 }
 
@@ -236,15 +214,30 @@ func (h *Helm) GetAddress(out string) (ip, port string) {
        return
 }
 
-func (h *Helm) GetEndpointInfo(name string) (ip string, port int) {
+func (h *Helm) GetEndpointInfo(name string) (svc string, port int) {
+       port = 4560 // Default
        ns := h.cm.GetNamespace("")
-       args := fmt.Sprintf(" get endpoints -o=jsonpath='{.subsets[*].addresses[*].ip}' service-%s-%s-rmr -n %s", ns, name, ns)
+       args := fmt.Sprintf(" get service -n ricxapp service-%s-%s-rmr -o json", ns, name)
        out, err := util.KubectlExec(args)
        if err != nil {
-               return
+               return fmt.Sprintf("service-%s-%s-rmr.%s", ns, name, ns), 4560
        }
-       appmgr.Logger.Info("Endpoint IP address of %s: %s", name, string(out))
-       return fmt.Sprintf("service-%s-%s-rmr.%s", ns, name, ns), 4560
+       appmgr.Logger.Debug("Endpoint IP address of %s: %s", name, string(out))
+
+       v, err := h.cm.ParseJson(string(out))
+       if err != nil {
+               return fmt.Sprintf("service-%s-%s-rmr.%s", ns, name, ns), 4560
+       }
+
+       for _, p := range v.GetArray("spec", "ports") {
+               if string(p.GetStringBytes("name")) == "rmrdata" {
+                       port = int(p.GetInt("port"))
+                       break
+               }
+       }
+       appmgr.Logger.Info("service-%s-%s-rmr.%s %d", ns, name, ns, port)
+
+       return fmt.Sprintf("service-%s-%s-rmr.%s", ns, name, ns), port
 }
 
 func (h *Helm) GetNames(out string) (names []string, err error) {
@@ -263,7 +256,7 @@ func (h *Helm) GetNames(out string) (names []string, err error) {
        return names, nil
 }
 
-func (h *Helm) FillInstanceData(name string, out string, xapp *models.Xapp, msgs appmgr.MessageTypes) {
+func (h *Helm) FillInstanceData(name string, out string, xapp *models.Xapp, rtData appmgr.RtmData) {
        ip, port := h.GetEndpointInfo(name)
        if ip == "" {
                appmgr.Logger.Info("Endpoint IP address not found, using CluserIP")
@@ -288,8 +281,9 @@ func (h *Helm) FillInstanceData(name string, out string, xapp *models.Xapp, msgs
                        x.Status = strings.ToLower(x.Status)
                        x.IP = ip
                        x.Port = int64(port)
-                       x.TxMessages = msgs.TxMessages
-                       x.RxMessages = msgs.RxMessages
+                       x.TxMessages = rtData.TxMessages
+                       x.RxMessages = rtData.RxMessages
+                       x.Policies = rtData.Policies
                        xapp.Instances = append(xapp.Instances, &x)
                }
        }
@@ -300,14 +294,15 @@ func (h *Helm) ParseStatus(name string, out string) (xapp models.Xapp, err error
        xapp.Version = h.GetVersion(name)
        xapp.Status = h.GetState(out)
 
-       h.FillInstanceData(name, out, &xapp, h.cm.GetMessages(name))
+       h.FillInstanceData(name, out, &xapp, h.cm.GetRtmData(name))
        return
 }
 
 func (h *Helm) parseAllStatus(names []string) (xapps models.AllDeployedXapps, err error) {
        xapps = models.AllDeployedXapps{}
        for _, name := range names {
-               err := h.cm.ReadSchema(name, &models.XAppConfig{})
+               var desc interface{}
+               err := h.cm.ReadSchema(name, &desc)
                if err != nil {
                        continue
                }
@@ -332,19 +327,19 @@ func (h *Helm) AddTillerEnv() (err error) {
 }
 
 func (h *Helm) GetInstallArgs(x models.XappDescriptor, cmOverride bool) (args string) {
-       args = args + " --namespace=" + x.Namespace
+       args = fmt.Sprintf("%s --namespace=%s", args, x.Namespace)
        if x.HelmVersion != "" {
-               args = args + " --version=" + x.HelmVersion
+               args = fmt.Sprintf("%s --version=%s", args, x.HelmVersion)
        }
 
        if x.ReleaseName != "" {
-               args = args + " --name=" + x.ReleaseName
+               args = fmt.Sprintf("%s --name=%s", args, x.ReleaseName)
        } else {
-               args = args + " --name=" + *x.XappName
+               args = fmt.Sprintf("%s --name=%s", args, *x.XappName)
        }
 
        if cmOverride == true {
-               args = args + " --set ricapp.appconfig.override=" + *x.XappName + "-appconfig"
+               args = fmt.Sprintf("%s ---set ricapp.appconfig.override=%s-appconfig", args, *x.XappName)
        }
 
        if x.OverrideFile != nil {