Xapp registration/deregistration to RIC
[ric-plt/xapp-frame.git] / pkg / xapp / xapp.go
index 1ab7ee0..2bf7799 100755 (executable)
 package xapp
 
 import (
+       "bytes"
+       "encoding/json"
        "fmt"
        "github.com/spf13/viper"
+       "io/ioutil"
        "net/http"
        "os"
        "os/signal"
+       "strings"
        "sync/atomic"
        "syscall"
        "time"
@@ -67,6 +71,140 @@ func XappReadyCb(params interface{}) {
        }
 }
 
+func xappShutdownCb() {
+       SendDeregistermsg()
+       Logger.Info("Wait for xapp to get unregistered")
+       time.Sleep(10 * time.Second)
+}
+
+func registerxapp() {
+       var (
+               retries int = 10
+       )
+       for retries > 0 {
+               name, _ := os.Hostname()
+               httpservicename := "SERVICE_RICXAPP_" + strings.ToUpper(name) + "_HTTP_PORT"
+               httpendpoint := os.Getenv(strings.Replace(httpservicename, "-", "_", -1))
+               urlString := strings.Split(httpendpoint, "//")
+               // Added this check to make UT pass
+               if urlString[0] == "" {
+                       return
+               }
+               resp, err := http.Get(fmt.Sprintf("http://%s/ric/v1/health/ready", urlString[1]))
+               retries -= 1
+               time.Sleep(5 * time.Second)
+               if err != nil {
+                       Logger.Error("Error in health check: %v", err)
+               }
+               if err == nil {
+                       retries -= 10
+                       Logger.Info("Health Probe Success with resp.StatusCode is %v", resp.StatusCode)
+                       if resp.StatusCode >= 200 && resp.StatusCode <= 299 {
+                               go SendRegistermsg()
+                       }
+               } else {
+                       Logger.Info("Health Probe failed, retrying...")
+               }
+       }
+}
+
+func SendRegistermsg() {
+       name, _ := os.Hostname()
+       xappname := viper.GetString("name")
+       xappversion := viper.GetString("version")
+       appnamespace := os.Getenv("APP_NAMESPACE")
+       if appnamespace == "" {
+               appnamespace = "ricxapp"
+       }
+       httpservicename := "SERVICE_" + strings.ToUpper(appnamespace) + "_" + strings.ToUpper(name) + "_HTTP_PORT"
+       rmrservicename := "SERVICE_" + strings.ToUpper(appnamespace) + "_" + strings.ToUpper(name) + "_RMR_PORT"
+       httpendpointstr := os.Getenv(strings.Replace(httpservicename, "-", "_", -1))
+       rmrendpointstr := os.Getenv(strings.Replace(rmrservicename, "-", "_", -1))
+       httpendpoint := strings.Split(httpendpointstr, "//")
+       rmrendpoint := strings.Split(rmrendpointstr, "//")
+       if httpendpoint[0] == "" || rmrendpoint[0] == "" {
+               return
+       }
+
+       pltnamespace := os.Getenv("PLT_NAMESPACE")
+       if pltnamespace == "" {
+               pltnamespace = "ricplt"
+       }
+
+       configpath := "/ric/v1/config"
+
+       requestBody, err := json.Marshal(map[string]string{
+               "appName":         name,
+               "httpEndpoint":    httpendpoint[1],
+               "rmrEndpoint":     rmrendpoint[1],
+               "appInstanceName": xappname,
+               "appVersion":      xappversion,
+               "configPath":      configpath,
+       })
+
+       if err != nil {
+               Logger.Info("Error while compiling request to appmgr: %v", err)
+       } else {
+               url := fmt.Sprintf("http://service-%v-appmgr-http.%v:8080/ric/v1/register", pltnamespace, pltnamespace)
+               resp, err := http.Post(url, "application/json", bytes.NewBuffer(requestBody))
+               Logger.Info(" Resp is %v", resp)
+               if err != nil {
+                       Logger.Info("Error  compiling request to appmgr: %v", err)
+               }
+               Logger.Info("Registering request sent. Response received is :%v", resp)
+
+               if resp != nil {
+                       body, err := ioutil.ReadAll(resp.Body)
+                       Logger.Info("Post body is %v", resp.Body)
+                       if err != nil {
+                               Logger.Info("rsp: Error  compiling request to appmgr: %v", string(body))
+                       }
+                       defer resp.Body.Close()
+               }
+       }
+}
+
+func SendDeregistermsg() {
+
+       name, _ := os.Hostname()
+       xappname := viper.GetString("name")
+
+       appnamespace := os.Getenv("APP_NAMESPACE")
+       if appnamespace == "" {
+               appnamespace = "ricxapp"
+       }
+       pltnamespace := os.Getenv("PLT_NAMESPACE")
+       if pltnamespace == "" {
+               pltnamespace = "ricplt"
+       }
+
+       requestBody, err := json.Marshal(map[string]string{
+               "appName":         name,
+               "appInstanceName": xappname,
+       })
+
+       if err != nil {
+               Logger.Info("Error while compiling request to appmgr: %v", err)
+       } else {
+               url := fmt.Sprintf("http://service-%v-appmgr-http.%v:8080/ric/v1/deregister", pltnamespace, pltnamespace)
+               resp, err := http.Post(url, "application/json", bytes.NewBuffer(requestBody))
+               Logger.Info(" Resp is %v", resp)
+               if err != nil {
+                       Logger.Info("Error  compiling request to appmgr: %v", err)
+               }
+               Logger.Info("Deregistering request sent. Response received is :%v", resp)
+
+               if resp != nil {
+                       body, err := ioutil.ReadAll(resp.Body)
+                       Logger.Info("Post body is %v", resp.Body)
+                       if err != nil {
+                               Logger.Info("rsp: Error  compiling request to appmgr: %v", string(body))
+                       }
+                       defer resp.Body.Close()
+               }
+       }
+}
+
 func SetShutdownCB(cb ShutdownCB) {
        shutdownCb = cb
 }
@@ -143,13 +281,14 @@ func init() {
 func RunWithParams(c MessageConsumer, sdlcheck bool) {
        Rmr = NewRMRClient()
        Rmr.SetReadyCB(XappReadyCb, nil)
-
+       SetShutdownCB(xappShutdownCb)
        host := fmt.Sprintf(":%d", GetPortData("http").Port)
        go http.ListenAndServe(host, Resource.router)
        Logger.Info(fmt.Sprintf("Xapp started, listening on: %s", host))
        if sdlcheck {
                Sdl.TestConnection()
        }
+       go registerxapp()
        Rmr.Start(c)
 }