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

Change-Id: I78feaf7da284028fc61f42c5e0c5f56e72fe9e78
diff --git a/pkg/models/device/util.go b/pkg/models/device/util.go
new file mode 100644
index 0000000..8930cab
--- /dev/null
+++ b/pkg/models/device/util.go
@@ -0,0 +1,114 @@
+/*
+ * 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 modifiablecomponent stores ModifiableComponent methods and functions
+package device
+
+import (
+	"context"
+
+	"github.com/opencord/device-management-interface/go/dmi"
+
+	"github.com/opencord/voltha-lib-go/v4/pkg/log"
+)
+
+// GetLoggableEntitiesFromDevRec represnets the fetch the log level with entity from device record
+func (rec *DeviceRecord) GetLoggableEntitiesFromDevRec(ctx context.Context, entities []string) ([]*dmi.EntitiesLogLevel, bool) {
+
+	var traceLevel, debugLevel, infoLevel, warnLevel, errorLevel []string
+
+	if len(entities) > 0 {
+		// getLogLevel request for given entities
+		for _, entity := range entities {
+			if logLevel, ok := rec.Logging.LoggableEntities[entity]; ok {
+				switch logLevel {
+				case dmi.LogLevel_TRACE:
+					traceLevel = append(traceLevel, entity)
+				case dmi.LogLevel_DEBUG:
+					debugLevel = append(debugLevel, entity)
+				case dmi.LogLevel_INFO:
+					infoLevel = append(infoLevel, entity)
+				case dmi.LogLevel_WARN:
+					warnLevel = append(warnLevel, entity)
+				case dmi.LogLevel_ERROR:
+					errorLevel = append(errorLevel, entity)
+				}
+			} else {
+				logger.Warnw(ctx, "entity-was-not-found-in-device-record", log.Fields{"device-name": rec.Name, "entity": entity})
+				return nil, false
+			}
+
+		}
+	} else if len(rec.Logging.LoggableEntities) == 0 {
+		// if LoggableEntities length is zero means loglevel is applicable for entire hardware
+		logger.Debug(ctx, "all-entities-have-common-loglevel", log.Fields{"device-name": rec.Name, "log-level": rec.Logging.LogLevel})
+		return []*dmi.EntitiesLogLevel{{LogLevel: rec.Logging.LogLevel}}, true
+	} else {
+		// get globle log level or get loggble entities will  invoke here
+		logger.Debug(ctx, "all-entities-have-diffrent-loglevel", log.Fields{"device-name": rec.Name})
+		for entity, logLevel := range rec.Logging.LoggableEntities {
+			switch logLevel {
+			case dmi.LogLevel_TRACE:
+				traceLevel = append(traceLevel, entity)
+			case dmi.LogLevel_DEBUG:
+				debugLevel = append(debugLevel, entity)
+			case dmi.LogLevel_INFO:
+				infoLevel = append(infoLevel, entity)
+			case dmi.LogLevel_WARN:
+				warnLevel = append(warnLevel, entity)
+			case dmi.LogLevel_ERROR:
+				errorLevel = append(errorLevel, entity)
+			}
+		}
+	}
+
+	entitiesLogLevel := []*dmi.EntitiesLogLevel{
+		{LogLevel: dmi.LogLevel_TRACE, Entities: traceLevel},
+		{LogLevel: dmi.LogLevel_DEBUG, Entities: debugLevel},
+		{LogLevel: dmi.LogLevel_INFO, Entities: infoLevel},
+		{LogLevel: dmi.LogLevel_WARN, Entities: warnLevel},
+		{LogLevel: dmi.LogLevel_ERROR, Entities: errorLevel},
+	}
+	logger.Debug(ctx, "entities-with-log-level", log.Fields{"entities": entitiesLogLevel})
+
+	return entitiesLogLevel, true
+}
+
+// SaveLoggableEntities func is is used to save the log level with entity in device record
+func (rec *DeviceRecord) SaveLoggableEntities(ctx context.Context, listEntities []*dmi.EntitiesLogLevel) {
+
+	if rec.Logging.LoggableEntities == nil {
+
+		logger.Debug(ctx, "allocating-memory-for-loggable-entitie", log.Fields{"device-name": rec.Name})
+		rec.Logging.LoggableEntities = make(map[string]dmi.LogLevel)
+	}
+
+	if len(listEntities) == 1 && listEntities[0].Entities == nil {
+
+		logger.Debug(ctx, "set-global-log-level", log.Fields{"device-name": rec.Name})
+		rec.Logging.LogLevel = listEntities[0].LogLevel
+
+	} else {
+
+		logger.Debug(ctx, "setting-entity-log-level", log.Fields{"device-name": rec.Name, "list-of-entities": listEntities})
+		for _, entities := range listEntities {
+			logLevel := entities.LogLevel
+			for _, entity := range entities.Entities {
+				rec.Logging.LoggableEntities[entity] = logLevel
+			}
+		}
+	}
+}