Generating token using keycloak
[nonrtric/plt/sme.git] / capifcore / main.go
index 7a3f96f..f8b9daf 100644 (file)
@@ -25,17 +25,23 @@ import (
        "fmt"
        "net/http"
 
+       "github.com/getkin/kin-openapi/openapi3"
        "github.com/labstack/echo/v4"
        "helm.sh/helm/v3/pkg/cli"
+       "oransc.org/nonrtric/capifcore/internal/common29122"
        "oransc.org/nonrtric/capifcore/internal/discoverserviceapi"
+       "oransc.org/nonrtric/capifcore/internal/eventsapi"
        "oransc.org/nonrtric/capifcore/internal/invokermanagementapi"
+       "oransc.org/nonrtric/capifcore/internal/keycloak"
        "oransc.org/nonrtric/capifcore/internal/providermanagementapi"
        "oransc.org/nonrtric/capifcore/internal/securityapi"
 
        "github.com/deepmap/oapi-codegen/pkg/middleware"
        echomiddleware "github.com/labstack/echo/v4/middleware"
        log "github.com/sirupsen/logrus"
+       config "oransc.org/nonrtric/capifcore/internal/config"
        "oransc.org/nonrtric/capifcore/internal/discoverservice"
+       "oransc.org/nonrtric/capifcore/internal/eventservice"
        "oransc.org/nonrtric/capifcore/internal/helmmanagement"
        "oransc.org/nonrtric/capifcore/internal/invokermanagement"
        "oransc.org/nonrtric/capifcore/internal/providermanagement"
@@ -50,9 +56,13 @@ var repoName string
 
 func main() {
        var port = flag.Int("port", 8090, "Port for CAPIF Core Function HTTP server")
-       flag.StringVar(&url, "url", "http://localhost:8080", "ChartMuseum url")
+       var secPort = flag.Int("secPort", 4433, "Port for CAPIF Core Function HTTPS server")
+       flag.StringVar(&url, "chartMuseumUrl", "", "ChartMuseum URL")
        flag.StringVar(&repoName, "repoName", "capifcore", "Repository name")
        var logLevelStr = flag.String("loglevel", "Info", "Log level")
+       var certPath = flag.String("certPath", "certs/cert.pem", "Path for server certificate")
+       var keyPath = flag.String("keyPath", "certs/key.pem", "Path for server private key")
+
        flag.Parse()
 
        if loglevel, err := log.ParseLevel(*logLevelStr); err == nil {
@@ -60,14 +70,14 @@ func main() {
        }
 
        // Add repo
-       fmt.Printf("Adding %s to Helm Repo\n", url)
        helmManager = helmmanagement.NewHelmManager(cli.New())
        err := helmManager.SetUpRepo(repoName, url)
        if err != nil {
-               log.Fatal(err.Error())
+               log.Warnf("No Helm repo added due to: %s", err.Error())
        }
 
        go startWebServer(getEcho(), *port)
+       go startHttpsWebServer(getEcho(), *secPort, *certPath, *keyPath)
 
        log.Info("Server started and listening on port: ", *port)
 
@@ -75,11 +85,17 @@ func main() {
 }
 
 func getEcho() *echo.Echo {
-       // This is how you set up a basic Echo router
        e := echo.New()
        // Log all requests
        e.Use(echomiddleware.Logger())
 
+       // Read configuration file
+       cfg, err := config.ReadKeycloakConfigFile("configs")
+       if err != nil {
+               log.Fatalf("Error loading configuration file\n: %s", err)
+       }
+       km := keycloak.NewKeycloakManager(cfg)
+
        var group *echo.Group
        // Register ProviderManagement
        providerManagerSwagger, err := providermanagementapi.GetSwagger()
@@ -92,13 +108,25 @@ func getEcho() *echo.Echo {
        group.Use(middleware.OapiRequestValidator(providerManagerSwagger))
        providermanagementapi.RegisterHandlersWithBaseURL(e, providerManager, "/api-provider-management/v1")
 
+       // Register EventService
+       eventServiceSwagger, err := eventsapi.GetSwagger()
+       if err != nil {
+               log.Fatalf("Error loading EventService swagger spec\n: %s", err)
+       }
+       eventServiceSwagger.Servers = nil
+       eventService := eventservice.NewEventService(&http.Client{})
+       group = e.Group("/capif-events/v1")
+       group.Use(middleware.OapiRequestValidator(eventServiceSwagger))
+       eventsapi.RegisterHandlersWithBaseURL(e, eventService, "/capif-events/v1")
+       eventChannel := eventService.GetNotificationChannel()
+
        // Register PublishService
        publishServiceSwagger, err := publishserviceapi.GetSwagger()
        if err != nil {
                log.Fatalf("Error loading PublishService swagger spec\n: %s", err)
        }
        publishServiceSwagger.Servers = nil
-       publishService := publishservice.NewPublishService(providerManager, helmManager)
+       publishService := publishservice.NewPublishService(providerManager, helmManager, eventChannel)
        group = e.Group("/published-apis/v1")
        group.Use(middleware.OapiRequestValidator(publishServiceSwagger))
        publishserviceapi.RegisterHandlersWithBaseURL(e, publishService, "/published-apis/v1")
@@ -109,7 +137,7 @@ func getEcho() *echo.Echo {
                log.Fatalf("Error loading InvokerManagement swagger spec\n: %s", err)
        }
        invokerManagerSwagger.Servers = nil
-       invokerManager := invokermanagement.NewInvokerManager(publishService)
+       invokerManager := invokermanagement.NewInvokerManager(publishService, eventChannel)
        group = e.Group("/api-invoker-management/v1")
        group.Use(middleware.OapiRequestValidator(invokerManagerSwagger))
        invokermanagementapi.RegisterHandlersWithBaseURL(e, invokerManager, "/api-invoker-management/v1")
@@ -126,18 +154,20 @@ func getEcho() *echo.Echo {
        discoverserviceapi.RegisterHandlersWithBaseURL(e, discoverService, "/service-apis/v1")
 
        // Register Security
-       securitySwagger, err := publishserviceapi.GetSwagger()
+       securitySwagger, err := securityapi.GetSwagger()
        if err != nil {
                log.Fatalf("Error loading Security swagger spec\n: %s", err)
        }
        securitySwagger.Servers = nil
-       securityService := security.NewSecurity(providerManager, publishService, invokerManager)
+       securityService := security.NewSecurity(providerManager, publishService, invokerManager, km)
        group = e.Group("/capif-security/v1")
        group.Use(middleware.OapiRequestValidator(securitySwagger))
        securityapi.RegisterHandlersWithBaseURL(e, securityService, "/capif-security/v1")
 
        e.GET("/", hello)
 
+       e.GET("/swagger/:apiName", getSwagger)
+
        return e
 }
 
@@ -145,11 +175,47 @@ func startWebServer(e *echo.Echo, port int) {
        e.Logger.Fatal(e.Start(fmt.Sprintf("0.0.0.0:%d", port)))
 }
 
+func startHttpsWebServer(e *echo.Echo, port int, certPath string, keyPath string) {
+       e.Logger.Fatal(e.StartTLS(fmt.Sprintf("0.0.0.0:%d", port), certPath, keyPath))
+}
+
 func keepServerAlive() {
        forever := make(chan int)
        <-forever
 }
 
 func hello(c echo.Context) error {
-       return c.String(http.StatusOK, "Hello, World!\n")
+       return c.String(http.StatusOK, "Hello, World!")
+}
+
+func getSwagger(c echo.Context) error {
+       var swagger *openapi3.T
+       var err error
+       switch api := c.Param("apiName"); api {
+       case "provider":
+               swagger, err = providermanagementapi.GetSwagger()
+       case "publish":
+               swagger, err = publishserviceapi.GetSwagger()
+       case "invoker":
+               swagger, err = invokermanagementapi.GetSwagger()
+       case "discover":
+               swagger, err = discoverserviceapi.GetSwagger()
+       case "events":
+               swagger, err = eventsapi.GetSwagger()
+       case "security":
+               swagger, err = securityapi.GetSwagger()
+       default:
+               return c.JSON(http.StatusBadRequest, getProblemDetails("Invalid API name "+api, http.StatusBadRequest))
+       }
+       if err != nil {
+               return c.JSON(http.StatusInternalServerError, getProblemDetails("Unable to get swagger for API", http.StatusInternalServerError))
+       }
+       return c.JSON(http.StatusOK, swagger)
+}
+
+func getProblemDetails(cause string, status int) common29122.ProblemDetails {
+       return common29122.ProblemDetails{
+               Cause:  &cause,
+               Status: &status,
+       }
 }