VOL-4019: Initial commit with grpc nbi, sbi, etcd, kafka and hw management rpcs.
Change-Id: I78feaf7da284028fc61f42c5e0c5f56e72fe9e78
diff --git a/pkg/sbi/grpc/connection.go b/pkg/sbi/grpc/connection.go
new file mode 100644
index 0000000..3b65c29
--- /dev/null
+++ b/pkg/sbi/grpc/connection.go
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2020-present Open Networking Foundation
+ *
+ * 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 holds utils for grpc client implementation
+package grpc
+
+import (
+ "context"
+
+ "github.com/opencord/device-management-interface/go/dmi"
+ "github.com/opencord/opendevice-manager/pkg/config"
+ "github.com/opencord/voltha-lib-go/v4/pkg/log"
+ "google.golang.org/grpc/credentials"
+
+ g "google.golang.org/grpc"
+)
+
+// logger represents the log object
+var logger log.CLogger
+
+// init function for the package
+func init() {
+ logger = config.Initlog()
+}
+
+// Client holds the parameters for grpc
+type Client struct {
+ uri string
+ conn *g.ClientConn
+ hwMgmtSvcClient dmi.NativeHWManagementServiceClient
+}
+
+// NewClient returns a new Grpc Client
+func NewClient(uri string) *Client {
+ c := new(Client)
+ c.uri = uri
+ return c
+}
+
+func (c *Client) getDialOpts(ctx context.Context) []g.DialOption {
+
+ coreFlags := config.NewCoreFlags()
+ var opts []g.DialOption
+
+ if coreFlags.SecureConnection {
+ logger.Info(ctx, "Trying-to-establish-secure-connection")
+
+ creds, err := credentials.NewClientTLSFromFile(coreFlags.CertsPath.RootCaCrt, "")
+ if err != nil {
+ logger.Fatalf(ctx, "could-not-process-the-credentials", log.Fields{"err": err})
+ }
+
+ err = creds.OverrideServerName(coreFlags.GrpcHostName)
+ if err != nil {
+ logger.Fatalf(ctx, "Overriding-server-name-failed-at-getDialOpts()", log.Fields{"err": err})
+ }
+
+ opts = append(opts, g.WithTransportCredentials(creds))
+ } else {
+ logger.Info(ctx, "Trying-to-establish-insecure-connection")
+ opts = append(opts, g.WithInsecure())
+ }
+
+ opts = append(opts, g.WithTimeout(coreFlags.GrpcRetryInterval))
+ backoffConfig := g.BackoffConfig{MaxDelay: coreFlags.GrpcBackoffMaxDelay}
+ opts = append(opts, g.WithBackoffConfig(backoffConfig))
+
+ return opts
+}
+
+// Connect will establish a connection
+func (c *Client) Connect(ctx context.Context) error {
+ logger.Info(ctx, "Invoked-connectGrpcServer")
+ // log.Info("Invoked-connectGrpcServer", log.Opts{"peer-ID": peerID})
+ opts := c.getDialOpts(ctx)
+ // Establishing the server connection
+ conn, err := g.Dial(c.uri, opts...)
+ if err != nil {
+ logger.Error(ctx, "Grpc-client-connection-failed", log.Fields{"error": err})
+ return err
+ }
+ c.conn = conn
+ logger.Info(ctx, "Connection-established", log.Fields{"conn": conn})
+ // Constructing a client object
+ c.hwMgmtSvcClient = dmi.NewNativeHWManagementServiceClient(conn)
+ return nil
+}
+
+// Disconnect will remove the connection
+func (c *Client) Disconnect(ctx context.Context) error {
+ logger.Infow(ctx, "Invoked-Disconnect", log.Fields{"client": c})
+ return c.conn.Close()
+}