From a08968c161b999238cbd61ea2eb9fd597a5b37e6 Mon Sep 17 00:00:00 2001 From: Eric Multanen Date: Thu, 23 Apr 2020 12:48:55 -0700 Subject: Add gRPC servers to ncm service Add a contextupdate grpc server to the ncm service. Issue-ID: MULTICLOUD-1029 Signed-off-by: Eric Multanen Change-Id: I38caa625c028baac06a6202f03b86d0f2bf38126 --- src/ncm/cmd/main.go | 59 +++++++++++++++++++++- src/ncm/go.mod | 1 + .../contextupdateserver/contextupdateserver.go | 45 +++++++++++++++++ src/ncm/pkg/grpc/register.go | 58 +++++++++++++++++++++ 4 files changed, 162 insertions(+), 1 deletion(-) create mode 100644 src/ncm/pkg/grpc/contextupdateserver/contextupdateserver.go create mode 100644 src/ncm/pkg/grpc/register.go diff --git a/src/ncm/cmd/main.go b/src/ncm/cmd/main.go index c4ae423f..49af81ee 100644 --- a/src/ncm/cmd/main.go +++ b/src/ncm/cmd/main.go @@ -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) diff --git a/src/ncm/go.mod b/src/ncm/go.mod index 8b45298f..19f83bdf 100644 --- a/src/ncm/go.mod +++ b/src/ncm/go.mod @@ -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 index 00000000..fc548ccc --- /dev/null +++ b/src/ncm/pkg/grpc/contextupdateserver/contextupdateserver.go @@ -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 index 00000000..07d8f5c0 --- /dev/null +++ b/src/ncm/pkg/grpc/register.go @@ -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 +} -- cgit 1.2.3-korg