VOL-4019: Initial commit with grpc nbi, sbi, etcd, kafka and hw management rpcs.
Change-Id: I78feaf7da284028fc61f42c5e0c5f56e72fe9e78
diff --git a/pkg/nbi/connection.go b/pkg/nbi/connection.go
new file mode 100644
index 0000000..ae94999
--- /dev/null
+++ b/pkg/nbi/connection.go
@@ -0,0 +1,88 @@
+/*
+ * 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 nbi holds rpc server apis implemented
+package nbi
+
+import (
+ "context"
+ "sync"
+
+ dev "github.com/opencord/opendevice-manager/pkg/models/device"
+ "github.com/opencord/opendevice-manager/pkg/sbi"
+ "github.com/opencord/voltha-lib-go/v4/pkg/log"
+)
+
+// connectMap store all device connections established
+type connectMap struct {
+ nameToAdapter map[string]sbi.Adapter // key is name and value is adapter
+ mutex *sync.RWMutex // mutex is used to lock when accessing
+}
+
+var connections *connectMap
+
+// initConnectMap initialises map for storing connections
+func initConnectMap() {
+ connections = new(connectMap)
+ connections.nameToAdapter = make(map[string]sbi.Adapter)
+ connections.mutex = &sync.RWMutex{}
+}
+
+// DeInitConnectMap clears all stored connections
+func DeInitConnectMap(ctx context.Context) {
+ connections.nameToAdapter = nil
+ connections.mutex = nil
+ connections = nil
+}
+
+// getConnection retrieves connection object from map using name
+func (conn *connectMap) getConnection(ctx context.Context, devRec *dev.DeviceRecord) (sbi.Adapter, error) {
+ conn.mutex.Lock()
+ defer conn.mutex.Unlock()
+ if val, ok := conn.nameToAdapter[devRec.Name]; ok {
+ return val, nil
+ }
+
+ // Get the right adapter
+ adapter := sbi.GetHwMgmtSvcClient(devRec)
+ if err := adapter.Connect(ctx); err != nil {
+ return nil, err
+ }
+
+ conn.nameToAdapter[devRec.Name] = adapter
+ logger.Infow(ctx, "getConnection-completed", log.Fields{"name": devRec.Name, "adapter": adapter})
+
+ return adapter, nil
+}
+
+// // storeConn stores connection object in map using uuid and name
+// func (conn *connectMap) storeConnWithName(ctx context.Context, name string, adapter sbi.Adapter) {
+// conn.mutex.Lock()
+// defer conn.mutex.Unlock()
+// conn.nameToAdapter[name] = adapter
+// logger.Infow(ctx, "storeConnWithName-completed", log.Fields{"name": name, "adapter": adapter})
+// }
+
+// delConn deletes connection object from map using uuid and name
+func (conn *connectMap) delConn(ctx context.Context, name string) {
+ conn.mutex.Lock()
+ defer conn.mutex.Unlock()
+
+ if name != "" {
+ delete(conn.nameToAdapter, name)
+ }
+ logger.Infow(ctx, "delConn-completed", log.Fields{"name": name})
+}