Add gRPC servers to ncm service 48/106148/10
authorEric Multanen <eric.w.multanen@intel.com>
Thu, 23 Apr 2020 19:48:55 +0000 (12:48 -0700)
committerEric Multanen <eric.w.multanen@intel.com>
Wed, 13 May 2020 19:17:36 +0000 (12:17 -0700)
Add a contextupdate grpc server to the ncm service.

Issue-ID: MULTICLOUD-1029
Signed-off-by: Eric Multanen <eric.w.multanen@intel.com>
Change-Id: I38caa625c028baac06a6202f03b86d0f2bf38126

src/ncm/cmd/main.go
src/ncm/go.mod
src/ncm/pkg/grpc/contextupdateserver/contextupdateserver.go [new file with mode: 0644]
src/ncm/pkg/grpc/register.go [new file with mode: 0644]

index c4ae423..49af81e 100644 (file)
@@ -15,23 +15,73 @@ package main
 
 import (
        "context"
+       "fmt"
        "log"
        "math/rand"
+       "net"
        "net/http"
        "os"
        "os/signal"
+       "strings"
        "time"
 
        "github.com/gorilla/handlers"
        "github.com/onap/multicloud-k8s/src/ncm/api"
+       register "github.com/onap/multicloud-k8s/src/ncm/pkg/grpc"
+       "github.com/onap/multicloud-k8s/src/ncm/pkg/grpc/contextupdateserver"
+       updatepb "github.com/onap/multicloud-k8s/src/orchestrator/pkg/grpc/contextupdate"
        "github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/auth"
        "github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/config"
        contextDb "github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/contextdb"
        "github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/db"
+       "google.golang.org/grpc"
+       "google.golang.org/grpc/credentials"
+       "google.golang.org/grpc/testdata"
 )
 
-func main() {
+func startGrpcServer() error {
+       var tls bool
+
+       if strings.Contains(config.GetConfiguration().GrpcEnableTLS, "enable") {
+               tls = true
+       } else {
+               tls = false
+       }
+       certFile := config.GetConfiguration().GrpcServerCert
+       keyFile := config.GetConfiguration().GrpcServerKey
+
+       host, port := register.GetServerHostPort()
+
+       lis, err := net.Listen("tcp", fmt.Sprintf("%s:%d", host, port))
+       if err != nil {
+               log.Fatalf("Could not listen to port: %v", err)
+       }
+       var opts []grpc.ServerOption
+       if tls {
+               if certFile == "" {
+                       certFile = testdata.Path("server.pem")
+               }
+               if keyFile == "" {
+                       keyFile = testdata.Path("server.key")
+               }
+               creds, err := credentials.NewServerTLSFromFile(certFile, keyFile)
+               if err != nil {
+                       log.Fatalf("Could not generate credentials %v", err)
+               }
+               opts = []grpc.ServerOption{grpc.Creds(creds)}
+       }
+       grpcServer := grpc.NewServer(opts...)
+       updatepb.RegisterContextupdateServer(grpcServer, contextupdateserver.NewContextupdateServer())
 
+       log.Println("Starting Network Configuration Manager gRPC Server")
+       err = grpcServer.Serve(lis)
+       if err != nil {
+               log.Fatalf("ncm grpc server is not serving %v", err)
+       }
+       return err
+}
+
+func main() {
        rand.Seed(time.Now().UnixNano())
 
        err := db.InitializeDatabaseConnection("mco")
@@ -56,6 +106,13 @@ func main() {
                Addr:    ":" + config.GetConfiguration().ServicePort,
        }
 
+       go func() {
+               err := startGrpcServer()
+               if err != nil {
+                       log.Fatalf("GRPC server failed to start")
+               }
+       }()
+
        connectionsClose := make(chan struct{})
        go func() {
                c := make(chan os.Signal, 1)
index 8b45298..19f83bd 100644 (file)
@@ -13,6 +13,7 @@ require (
        go.etcd.io/etcd v3.3.12+incompatible
        go.mongodb.org/mongo-driver v1.0.0
        golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3
+       google.golang.org/grpc v1.27.1
        gopkg.in/yaml.v2 v2.2.8
        k8s.io/api v0.0.0-20190831074750-7364b6bdad65
        k8s.io/apimachinery v0.0.0-20190831074630-461753078381
diff --git a/src/ncm/pkg/grpc/contextupdateserver/contextupdateserver.go b/src/ncm/pkg/grpc/contextupdateserver/contextupdateserver.go
new file mode 100644 (file)
index 0000000..fc548cc
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+Copyright 2020 Intel Corporation.
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package contextupdateserver
+
+import (
+       "context"
+       "encoding/json"
+       "log"
+
+       contextpb "github.com/onap/multicloud-k8s/src/orchestrator/pkg/grpc/contextupdate"
+       //"google.golang.org/grpc/codes"
+       //"google.golang.org/grpc/status"
+)
+
+type contextupdateServer struct {
+       contextpb.UnimplementedContextupdateServer
+}
+
+func (cs *contextupdateServer) UpdateAppContext(ctx context.Context, req *contextpb.ContextUpdateRequest) (*contextpb.ContextUpdateResponse, error) {
+       contextUpdateReq, _ := json.Marshal(req)
+       log.Println("GRPC Server received contextupdateRequest: ", string(contextUpdateReq))
+
+       // Insert call to Server Functionality here
+       //
+       //
+
+       return &contextpb.ContextUpdateResponse{AppContextUpdated: true}, nil
+}
+
+// NewContextUpdateServer exported
+func NewContextupdateServer() *contextupdateServer {
+       s := &contextupdateServer{}
+       return s
+}
diff --git a/src/ncm/pkg/grpc/register.go b/src/ncm/pkg/grpc/register.go
new file mode 100644 (file)
index 0000000..07d8f5c
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+Copyright 2020 Intel Corporation.
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package grpc
+
+import (
+       "os"
+       "strconv"
+       "strings"
+
+       log "github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/logutils"
+)
+
+const default_host = "localhost"
+const default_port = 9030
+const default_ncm_name = "ncm"
+const ENV_NCM_NAME = "NCM_NAME"
+
+func GetServerHostPort() (string, int) {
+
+       // expect name of this ncm program to be in env variable "NCM_NAME" - e.g. NCM_NAME="ncm"
+       serviceName := os.Getenv(ENV_NCM_NAME)
+       if serviceName == "" {
+               serviceName = default_ncm_name
+               log.Info("Using default name for NCM service name", log.Fields{
+                       "Name": serviceName,
+               })
+       }
+
+       // expect service name to be in env variable - e.g. NCM_SERVICE_HOST
+       host := os.Getenv(strings.ToUpper(serviceName) + "_SERVICE_HOST")
+       if host == "" {
+               host = default_host
+               log.Info("Using default host for ncm gRPC controller", log.Fields{
+                       "Host": host,
+               })
+       }
+
+       // expect service port to be in env variable - e.g. NCM_SERVICE_PORT
+       port, err := strconv.Atoi(os.Getenv(strings.ToUpper(serviceName) + "_SERVICE_PORT"))
+       if err != nil || port < 0 {
+               port = default_port
+               log.Info("Using default port for ncm gRPC controller", log.Fields{
+                       "Port": port,
+               })
+       }
+       return host, port
+}