[VOL-3538] Store unsupported OMCI-MEs into DB

Change-Id: I8879313c1321fff9298854a4296a57eeb7b84919
diff --git a/internal/pkg/devdb/onu_device_db.go b/internal/pkg/devdb/onu_device_db.go
index 008c37c..d3338c8 100755
--- a/internal/pkg/devdb/onu_device_db.go
+++ b/internal/pkg/devdb/onu_device_db.go
@@ -19,9 +19,11 @@
 
 import (
 	"context"
+	"encoding/hex"
 	"fmt"
 	"reflect"
 	"sort"
+	"strconv"
 	"sync"
 
 	me "github.com/opencord/omci-lib-go/v2/generated"
@@ -30,12 +32,28 @@
 
 type meDbMap map[me.ClassID]map[uint16]me.AttributeValueMap
 
-//OnuDeviceDB structure holds information about known ME's
+// UnknownMeName type to be used for unknown ME names
+type UnknownMeName string
+
+// allowed values for type UnknownMeName
+const (
+	CUnknownItuG988ManagedEntity        = "UnknownItuG988ManagedEntity"
+	CUnknownVendorSpecificManagedEntity = "UnknownVendorSpecificManagedEntity"
+)
+
+type unknownMeAttribs struct {
+	AttribMask  string `json:"AttributeMask"`
+	AttribBytes string `json:"AttributeBytes"`
+}
+type unknownMeDbMap map[UnknownMeName]map[me.ClassID]map[uint16]unknownMeAttribs
+
+//OnuDeviceDB structure holds information about ME's
 type OnuDeviceDB struct {
-	ctx      context.Context
-	deviceID string
-	MeDb     meDbMap
-	meDbLock sync.RWMutex
+	ctx         context.Context
+	deviceID    string
+	MeDb        meDbMap
+	meDbLock    sync.RWMutex
+	UnknownMeDb unknownMeDbMap
 }
 
 //NewOnuDeviceDB returns a new instance for a specific ONU_Device_Entry
@@ -45,6 +63,7 @@
 	OnuDeviceDB.ctx = ctx
 	OnuDeviceDB.deviceID = aDeviceID
 	OnuDeviceDB.MeDb = make(meDbMap)
+	OnuDeviceDB.UnknownMeDb = make(unknownMeDbMap)
 
 	return &OnuDeviceDB
 }
@@ -57,32 +76,22 @@
 	if me.OnuDataClassID == meClassID {
 		return
 	}
-
-	//logger.Debugw(ctx,"Search for key data :", log.Fields{"deviceId": OnuDeviceDB.deviceID, "meClassID": meClassID, "meEntityID": meEntityID})
-	meInstMap, ok := OnuDeviceDB.MeDb[meClassID]
+	_, ok := OnuDeviceDB.MeDb[meClassID]
 	if !ok {
 		logger.Debugw(ctx, "meClassID not found - add to db :", log.Fields{"device-id": OnuDeviceDB.deviceID})
-		meInstMap = make(map[uint16]me.AttributeValueMap)
-		OnuDeviceDB.MeDb[meClassID] = meInstMap
+		OnuDeviceDB.MeDb[meClassID] = make(map[uint16]me.AttributeValueMap)
+		OnuDeviceDB.MeDb[meClassID][meEntityID] = make(me.AttributeValueMap)
 		OnuDeviceDB.MeDb[meClassID][meEntityID] = meAttributes
 	} else {
-		meAttribs, ok := meInstMap[meEntityID]
+		meAttribs, ok := OnuDeviceDB.MeDb[meClassID][meEntityID]
 		if !ok {
-			/* verbose logging, avoid in >= debug level
-			logger.Debugw(ctx,"meEntityId not found - add to db :", log.Fields{"device-id": OnuDeviceDB.deviceID})
-			*/
-			meInstMap[meEntityID] = meAttributes
+			OnuDeviceDB.MeDb[meClassID][meEntityID] = make(me.AttributeValueMap)
+			OnuDeviceDB.MeDb[meClassID][meEntityID] = meAttributes
 		} else {
-			/* verbose logging, avoid in >= debug level
-			logger.Debugw(ctx,"ME-Instance exists already: merge attribute data :", log.Fields{"device-id": OnuDeviceDB.deviceID, "meAttribs": meAttribs})
-			*/
 			for k, v := range meAttributes {
 				meAttribs[k] = v
 			}
-			meInstMap[meEntityID] = meAttribs
-			/* verbose logging, avoid in >= debug level
-			logger.Debugw(ctx,"ME-Instance updated :", log.Fields{"device-id": OnuDeviceDB.deviceID, "meAttribs": meAttribs})
-			*/
+			OnuDeviceDB.MeDb[meClassID][meEntityID] = meAttribs
 		}
 	}
 }
@@ -151,7 +160,34 @@
 	logger.Debugw(ctx, "ME instances stored for :", log.Fields{"device-id": OnuDeviceDB.deviceID})
 	for meClassID, meInstMap := range OnuDeviceDB.MeDb {
 		for meEntityID, meAttribs := range meInstMap {
-			logger.Debugw(ctx, "ME instance: ", log.Fields{"meClassID": meClassID, "meEntityID": meEntityID, "meAttribs": meAttribs, "device-id": OnuDeviceDB.deviceID})
+			logger.Debugw(ctx, "ME instance: ", log.Fields{"meClassID": meClassID, "meEntityID": meEntityID, "meAttribs": meAttribs,
+				"device-id": OnuDeviceDB.deviceID})
+		}
+	}
+}
+
+//PutUnknownMe puts an unknown ME instance into internal ONU DB
+func (OnuDeviceDB *OnuDeviceDB) PutUnknownMe(ctx context.Context, aMeName UnknownMeName, aMeClassID me.ClassID, aMeEntityID uint16,
+	aMeAttributeMask uint16, aMePayload []byte) {
+
+	meAttribMaskStr := strconv.FormatUint(uint64(aMeAttributeMask), 16)
+	attribs := unknownMeAttribs{meAttribMaskStr, hex.EncodeToString(aMePayload)}
+
+	_, ok := OnuDeviceDB.UnknownMeDb[aMeName]
+	if !ok {
+		OnuDeviceDB.UnknownMeDb[aMeName] = make(map[me.ClassID]map[uint16]unknownMeAttribs)
+		OnuDeviceDB.UnknownMeDb[aMeName][aMeClassID] = make(map[uint16]unknownMeAttribs)
+		OnuDeviceDB.UnknownMeDb[aMeName][aMeClassID][aMeEntityID] = attribs
+	} else {
+		_, ok := OnuDeviceDB.UnknownMeDb[aMeName][aMeClassID]
+		if !ok {
+			OnuDeviceDB.UnknownMeDb[aMeName][aMeClassID] = make(map[uint16]unknownMeAttribs)
+			OnuDeviceDB.UnknownMeDb[aMeName][aMeClassID][aMeEntityID] = attribs
+		} else {
+			_, ok := OnuDeviceDB.UnknownMeDb[aMeName][aMeClassID][aMeEntityID]
+			if !ok {
+				OnuDeviceDB.UnknownMeDb[aMeName][aMeClassID][aMeEntityID] = attribs
+			}
 		}
 	}
 }