VOL-4019: Initial commit with grpc nbi, sbi, etcd, kafka and hw management rpcs.

Change-Id: I78feaf7da284028fc61f42c5e0c5f56e72fe9e78
diff --git a/pkg/models/hwcomponents/models.go b/pkg/models/hwcomponents/models.go
new file mode 100644
index 0000000..9906b53
--- /dev/null
+++ b/pkg/models/hwcomponents/models.go
@@ -0,0 +1,105 @@
+/*
+ * 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 hwcomponents stores methods and functions related to hardware
+package hwcomponents
+
+import (
+	"sync"
+
+	config "github.com/opencord/opendevice-manager/pkg/config"
+	v1 "github.com/opencord/opendevice-manager/pkg/models/hwcomponents/v1"
+	log "github.com/opencord/voltha-lib-go/v4/pkg/log"
+)
+
+// Constants defined are the DB Path meant for storing hw component info records
+const (
+	DbPrefix = config.DBPrefix + config.CurDBVer + "/HwCompRec/%s"
+	// Key : /OpenDevMgr/v1/HwCompRec/{Device-Uuid}/Components
+	// Val : Map => {"hw-comp-name-1":"hw-comp-uuid-1", "hw-comp-name-2":"hw-comp-uuid-2"}
+	DbPathNameToUuid = DbPrefix + "/Components"
+	// Key : /OpenDevMgr/v1/HwCompRec/{Device-Uuid}/Uuid/{Hw-Comp-Uuid}
+	// Val : HwCompRecord{}
+	DbPathUuidToRecord = DbPrefix + "/Uuid/%s"
+)
+
+// compCache stores component information in buffer
+type compCache struct {
+	uuidToRec map[string]map[string]*HwCompRecord // nameToRecord maintains cache for mapping from name to main record
+	mutex     sync.Mutex
+}
+
+var cache *compCache
+
+// logger represents the log object
+var logger log.CLogger
+
+// initCache initialises device cache
+func initCache() {
+	cache = new(compCache)
+	cache.uuidToRec = make(map[string]map[string]*HwCompRecord)
+	cache.mutex = sync.Mutex{}
+}
+
+// init function for the package
+func init() {
+	logger = config.Initlog()
+	initCache()
+}
+
+type HwCompRecord v1.HwCompRecordV1_0
+
+func (*compCache) store(devUuid string, rec *HwCompRecord) {
+	cache.mutex.Lock()
+	defer cache.mutex.Unlock()
+
+	var uuidToRecMap map[string]*HwCompRecord
+
+	if val, ok := cache.uuidToRec[devUuid]; !ok {
+		uuidToRecMap = make(map[string]*HwCompRecord)
+	} else {
+		uuidToRecMap = val
+	}
+
+	uuidToRecMap[rec.Uuid] = rec
+	cache.uuidToRec[devUuid] = uuidToRecMap
+}
+
+func (*compCache) get(devUuid, compUuid string) *HwCompRecord {
+	cache.mutex.Lock()
+	defer cache.mutex.Unlock()
+
+	var uuidToRecMap map[string]*HwCompRecord
+
+	if val, ok := cache.uuidToRec[devUuid]; !ok {
+		return nil
+	} else {
+		uuidToRecMap = val
+	}
+
+	if rec, ok := uuidToRecMap[compUuid]; ok {
+		return rec
+	}
+
+	return nil
+}
+
+func (*compCache) delDevice(devUuid string) *HwCompRecord {
+	cache.mutex.Lock()
+	defer cache.mutex.Unlock()
+	delete(cache.uuidToRec, devUuid)
+	return nil
+}