RIC-1059: dms_cli to use flask-restx
[ric-plt/appmgr.git] / pkg / restful / restful.go
index 077eea0..e6bebb7 100755 (executable)
@@ -23,7 +23,6 @@ import (
        "encoding/json"
        "errors"
        "fmt"
-       //"io/ioutil"
        "log"
        "net/http"
        "os"
@@ -45,15 +44,16 @@ import (
 )
 
 type XappData struct {
-       httpendpoint   string
-       rmrendpoint    string
-       rmrserviceep   string
-       status         string
-       xappname       string
-       xappinstname   string
-       xappversion    string
-       xappconfigpath string
-       xappInstance   *models.XappInstance
+       httpendpoint     string
+       rmrendpoint      string
+       rmrserviceep     string
+       status           string
+       xappname         string
+       xappinstname     string
+       xappversion      string
+       xappconfigpath   string
+       xappdynamiconfig bool
+       xappInstance     *models.XappInstance
 }
 
 var xappmap = map[string]map[string]*XappData{}
@@ -75,6 +75,7 @@ func (r *Restful) Run() {
 
        appmgr.Logger.Info("Xapp manager started ... serving on %s:%d\n", server.Host, server.Port)
 
+       go r.symptomdataServer()
        go r.RetrieveApps()
        if err := server.Serve(); err != nil {
                log.Fatal(err.Error())
@@ -209,6 +210,7 @@ func httpGetXAppsconfig(url string) *string {
        appmgr.Logger.Info("Invoked httprestful.httpGetXApps: " + url)
        resp, err := http.Get(url)
        if err != nil {
+               appmgr.Logger.Error("Error while querying config to Xapp: ", err.Error())
                return nil
        }
        defer resp.Body.Close()
@@ -303,15 +305,22 @@ func (r *Restful) DeregisterXapp(params models.DeregisterRequest) (xapp *models.
 
 func (r *Restful) PrepareConfig(params models.RegisterRequest, updateflag bool) (xapp *models.Xapp, err error) {
        maxRetries := 5
-       //tmpString := strings.Split(*params.HTTPEndpoint, "//")
+       configPresent := false
+       var xappconfig *string
        appmgr.Logger.Info("http endpoint is %s", *params.HTTPEndpoint)
        for i := 1; i <= maxRetries; i++ {
-               xappconfig := httpGetXAppsconfig(fmt.Sprintf("http://%s%s", *params.HTTPEndpoint, params.ConfigPath))
+               if params.Config != "" {
+                       appmgr.Logger.Info("Getting config during xapp register: %v", params.Config)
+                       xappconfig = &params.Config
+                       configPresent = true
+               } else {
+                       appmgr.Logger.Info("Getting config from xapp:")
+                       xappconfig = httpGetXAppsconfig(fmt.Sprintf("http://%s%s", *params.HTTPEndpoint, params.ConfigPath))
+               }
 
                if xappconfig != nil {
                        data := parseConfig(xappconfig)
                        if data != nil {
-                               appmgr.Logger.Info("iRetry Count = %v", i)
                                var xapp models.Xapp
 
                                xapp.Name = params.AppName
@@ -319,20 +328,23 @@ func (r *Restful) PrepareConfig(params models.RegisterRequest, updateflag bool)
                                //xapp.Status = params.Status
 
                                r.rh.UpdateAppData(params, updateflag)
-                               return r.FillInstanceData(params, &xapp, *data)
+                               return r.FillInstanceData(params, &xapp, *data, configPresent)
                                break
                        } else {
-                               appmgr.Logger.Error("Couldn't get data due to" + err.Error())
+                               appmgr.Logger.Error("No Data from xapp")
+                       }
+                       if configPresent == true {
+                               break
                        }
-                       time.Sleep(2 * time.Second)
                }
+               appmgr.Logger.Info("Retrying query configuration from xapp, try no : %d", i)
+               time.Sleep(4 * time.Second)
        }
        return nil, errors.New("Unable to get configmap after 5 retries")
 }
 
-func (r *Restful) FillInstanceData(params models.RegisterRequest, xapp *models.Xapp, rtData appmgr.RtmData) (xapps *models.Xapp, err error) {
+func (r *Restful) FillInstanceData(params models.RegisterRequest, xapp *models.Xapp, rtData appmgr.RtmData, configFlag bool) (xapps *models.Xapp, err error) {
 
-       //tmpString := strings.Split(*params.RmrEndpoint, "//")
        endPointStr := strings.Split(*params.RmrEndpoint, ":")
        var x models.XappInstance
        x.Name = params.AppInstanceName
@@ -348,14 +360,15 @@ func (r *Restful) FillInstanceData(params models.RegisterRequest, xapp *models.X
        rmrsrvname := fmt.Sprintf("service-ricxapp-%s-rmr.ricxapp:%s", *params.AppInstanceName, x.Port)
 
        a := &XappData{httpendpoint: *params.HTTPEndpoint,
-               rmrendpoint:    *params.RmrEndpoint,
-               rmrserviceep:   rmrsrvname,
-               status:         "deployed",
-               xappname:       *params.AppName,
-               xappversion:    params.AppVersion,
-               xappinstname:   *params.AppInstanceName,
-               xappconfigpath: params.ConfigPath,
-               xappInstance:   &x}
+               rmrendpoint:      *params.RmrEndpoint,
+               rmrserviceep:     rmrsrvname,
+               status:           "deployed",
+               xappname:         *params.AppName,
+               xappversion:      params.AppVersion,
+               xappinstname:     *params.AppInstanceName,
+               xappconfigpath:   params.ConfigPath,
+               xappdynamiconfig: configFlag,
+               xappInstance:     &x}
 
        if _, ok := xappmap[*params.AppName]; ok {
                xappmap[*params.AppName][*params.AppInstanceName] = a
@@ -390,9 +403,12 @@ func (r *Restful) GetApps() (xapps models.AllDeployedXapps, err error) {
 
 func (r *Restful) getAppConfig() (configList models.AllXappConfig) {
        for _, v := range xappmap {
-               namespace := "ricxapp" //Namespace hardcode, to be removed later
+               namespace := "ricxapp" //Namespace hardcoded, to be removed later
                for _, j := range v {
                        var activeConfig interface{}
+                       if j.xappdynamiconfig {
+                               continue
+                       }
                        xappconfig := httpGetXAppsconfig(fmt.Sprintf("http://%s%s", j.httpendpoint, j.xappconfigpath))
 
                        if xappconfig == nil {
@@ -412,3 +428,26 @@ func (r *Restful) getAppConfig() (configList models.AllXappConfig) {
        }
        return
 }
+
+func (r *Restful) symptomdataServer() {
+       http.HandleFunc("/ric/v1/symptomdata", func(w http.ResponseWriter, req *http.Request) {
+               d, _ := r.GetApps()
+               xappData := struct {
+                       XappList         models.AllDeployedXapps `json:"xappList"`
+                       ConfigList       models.AllXappConfig    `json:"configList"`
+                       SubscriptionList models.AllSubscriptions `json:"subscriptionList"`
+               }{
+                       d,
+                       r.getAppConfig(),
+                       r.rh.GetAllSubscriptions(),
+               }
+
+               w.Header().Set("Content-Type", "application/json")
+               w.Header().Set("Content-Disposition", "attachment; filename=platform/apps_info.json")
+               w.WriteHeader(http.StatusOK)
+               resp, _ := json.MarshalIndent(xappData, "", "    ")
+               w.Write(resp)
+       })
+
+       http.ListenAndServe(":8081", nil)
+}