Add status check to REST API of Go products
[nonrtric.git] / test / usecases / oruclosedlooprecovery / goversion / main.go
index bef9e24..c3d731f 100644 (file)
 package main
 
 import (
+       "crypto/tls"
        "encoding/json"
        "fmt"
        "net/http"
        "os"
        "os/signal"
        "syscall"
-       "time"
 
        "github.com/gorilla/mux"
        log "github.com/sirupsen/logrus"
@@ -37,21 +37,16 @@ import (
        "oransc.org/usecase/oruclosedloop/internal/restclient"
 )
 
-type Server interface {
-       ListenAndServe() error
-}
-
-const timeoutHTTPClient = time.Second * 5
 const jobId = "14e7bb84-a44d-44c1-90b7-6995a92ad43c"
 
 var jobRegistrationInfo = struct {
-       InfoTypeId    string      `json:"info_type_id"`
-       JobResultUri  string      `json:"job_result_uri"`
+       InfoTypeID    string      `json:"info_type_id"`
+       JobResultURI  string      `json:"job_result_uri"`
        JobOwner      string      `json:"job_owner"`
        JobDefinition interface{} `json:"job_definition"`
 }{
-       InfoTypeId:    "STD_Fault_Messages",
-       JobResultUri:  "",
+       InfoTypeID:    "STD_Fault_Messages",
+       JobResultURI:  "",
        JobOwner:      "O-RU Closed Loop Usecase",
        JobDefinition: "{}",
 }
@@ -61,6 +56,7 @@ var configuration *config.Config
 var linkfailureConfig linkfailure.Configuration
 var lookupService repository.LookupService
 var consumerPort string
+var started bool
 
 func init() {
        doInit()
@@ -70,16 +66,13 @@ func doInit() {
        configuration = config.New()
 
        log.SetLevel(configuration.LogLevel)
-
-       client = &http.Client{
-               Timeout: timeoutHTTPClient,
-       }
+       log.Debug("Using configuration: ", configuration)
 
        consumerPort = fmt.Sprint(configuration.ConsumerPort)
-       jobRegistrationInfo.JobResultUri = configuration.ConsumerHost + ":" + consumerPort
+       jobRegistrationInfo.JobResultURI = configuration.ConsumerHost + ":" + consumerPort
 
        linkfailureConfig = linkfailure.Configuration{
-               SDNRAddress:  configuration.SDNRHost + ":" + fmt.Sprint(configuration.SDNRPort),
+               SDNRAddress:  configuration.SDNRAddress,
                SDNRUser:     configuration.SDNRUser,
                SDNRPassword: configuration.SDNPassword,
        }
@@ -95,12 +88,16 @@ func main() {
                log.Fatalf("Unable to create LookupService due to inability to get O-RU-ID to O-DU-ID map. Cause: %v", initErr)
        }
 
+       var cert tls.Certificate
+       if c, err := restclient.CreateClientCertificate(configuration.ConsumerCertPath, configuration.ConsumerKeyPath); err == nil {
+               cert = c
+       } else {
+               log.Fatalf("Stopping producer due to error: %v", err)
+       }
+       client = restclient.CreateRetryClient(cert)
+
        go func() {
-               startServer(&http.Server{
-                       Addr:    ":" + consumerPort,
-                       Handler: getRouter(),
-               })
-               deleteJob()
+               startServer()
                os.Exit(1) // If the startServer function exits, it is because there has been a failure in the server, so we exit.
        }()
 
@@ -116,6 +113,11 @@ func validateConfiguration(configuration *config.Config) error {
        if configuration.ConsumerHost == "" || configuration.ConsumerPort == 0 {
                return fmt.Errorf("consumer host and port must be provided")
        }
+
+       if configuration.ConsumerCertPath == "" || configuration.ConsumerKeyPath == "" {
+               return fmt.Errorf("missing CONSUMER_CERT and/or CONSUMER_KEY")
+       }
+
        return nil
 }
 
@@ -129,17 +131,24 @@ func getRouter() *mux.Router {
 
        r := mux.NewRouter()
        r.HandleFunc("/", messageHandler.MessagesHandler).Methods(http.MethodPost).Name("messageHandler")
+       r.HandleFunc("/status", statusHandler).Methods(http.MethodGet).Name("status")
        r.HandleFunc("/admin/start", startHandler).Methods(http.MethodPost).Name("start")
        r.HandleFunc("/admin/stop", stopHandler).Methods(http.MethodPost).Name("stop")
 
        return r
 }
 
-func startServer(server Server) {
-       if err := server.ListenAndServe(); err != nil {
+func startServer() {
+       var err error
+       if restclient.IsUrlSecure(configuration.ConsumerHost) {
+               err = http.ListenAndServeTLS(fmt.Sprintf(":%v", configuration.ConsumerPort), configuration.ConsumerCertPath, configuration.ConsumerKeyPath, getRouter())
+       } else {
+               err = http.ListenAndServe(fmt.Sprintf(":%v", configuration.ConsumerPort), getRouter())
+       }
+       if err != nil {
                log.Errorf("Server stopped unintentionally due to: %v. Deleteing job.", err)
                if deleteErr := deleteJob(); deleteErr != nil {
-                       log.Error(fmt.Sprintf("Unable to delete consumer job due to: %v. Please remove job %v manually.", deleteErr, jobId))
+                       log.Errorf("Unable to delete consumer job due to: %v. Please remove job %v manually.", deleteErr, jobId)
                }
        }
 }
@@ -157,6 +166,7 @@ func startHandler(w http.ResponseWriter, r *http.Request) {
                return
        }
        log.Debug("Registered job.")
+       started = true
 }
 
 func stopHandler(w http.ResponseWriter, r *http.Request) {
@@ -166,6 +176,15 @@ func stopHandler(w http.ResponseWriter, r *http.Request) {
                return
        }
        log.Debug("Deleted job.")
+       started = false
+}
+
+func statusHandler(w http.ResponseWriter, r *http.Request) {
+       runStatus := "started"
+       if !started {
+               runStatus = "stopped"
+       }
+       fmt.Fprintf(w, `{"status": "%v"}`, runStatus)
 }
 
 func deleteOnShutdown(s chan os.Signal) {
@@ -174,7 +193,7 @@ func deleteOnShutdown(s chan os.Signal) {
        <-s
        log.Info("Shutting down gracefully.")
        if err := deleteJob(); err != nil {
-               log.Error(fmt.Sprintf("Unable to delete job on shutdown due to: %v. Please remove job %v manually.", err, jobId))
+               log.Errorf("Unable to delete job on shutdown due to: %v. Please remove job %v manually.", err, jobId)
        }
 }