[VOL-3041] - Configuration of port admin state
[VOL-3036] - Read MIB Templates from ETCD

Change-Id: I55b9553104701bf9ecd873a218c9aeffca782cd1
Signed-off-by: Holger Hildebrandt <holger.hildebrandt@adtran.com>
diff --git a/internal/pkg/onuadaptercore/onu_device_entry.go b/internal/pkg/onuadaptercore/onu_device_entry.go
index 2d7caa6..2a7c29e 100644
--- a/internal/pkg/onuadaptercore/onu_device_entry.go
+++ b/internal/pkg/onuadaptercore/onu_device_entry.go
@@ -19,12 +19,14 @@
 
 import (
 	"context"
-	//"errors"
+	"errors"
+
 	//"sync"
 	//"time"
 
 	"github.com/looplab/fsm"
 	"github.com/opencord/voltha-lib-go/v3/pkg/adapters/adapterif"
+	"github.com/opencord/voltha-lib-go/v3/pkg/db"
 
 	//"github.com/opencord/voltha-lib-go/v3/pkg/kafka"
 	"github.com/opencord/voltha-lib-go/v3/pkg/log"
@@ -33,6 +35,12 @@
 	//"github.com/opencord/voltha-protos/v3/go/voltha"
 )
 
+const (
+	KvstoreTimeout             = 5 //in seconds
+	BasePathMibTemplateKvStore = "service/voltha/omci_mibs/templates"
+	SuffixMibTemplateKvStore   = "%s/%s/%s"
+)
+
 type OnuDeviceEvent int
 
 const (
@@ -41,8 +49,11 @@
 	MibDatabaseSync      OnuDeviceEvent = 1 // MIB database sync (upload done)
 	OmciCapabilitiesDone OnuDeviceEvent = 2 // OMCI ME and message type capabilities known
 	MibDownloadDone      OnuDeviceEvent = 3 // MIB database sync (upload done)
-	PortLinkUp           OnuDeviceEvent = 4 // Port link state change
-	PortLinkDw           OnuDeviceEvent = 5 // Port link state change
+	UniLockStateDone     OnuDeviceEvent = 4 // Uni ports admin set to lock
+	UniUnlockStateDone   OnuDeviceEvent = 5 // Uni ports admin set to unlock
+	UniAdminStateDone    OnuDeviceEvent = 6 // Uni ports admin set done - general
+	PortLinkUp           OnuDeviceEvent = 7 // Port link state change
+	PortLinkDw           OnuDeviceEvent = 8 // Port link state change
 	// Add other events here as needed (alarms separate???)
 )
 
@@ -78,25 +89,29 @@
 
 //OntDeviceEntry structure holds information about the attached FSM'as and their communication
 type OnuDeviceEntry struct {
-	deviceID          string
-	baseDeviceHandler *DeviceHandler
-	coreProxy         adapterif.CoreProxy
-	adapterProxy      adapterif.AdapterProxy
-	started           bool
-	PDevOmciCC        *OmciCC
-	pOnuDB            *OnuDeviceDB
+	deviceID           string
+	baseDeviceHandler  *DeviceHandler
+	coreProxy          adapterif.CoreProxy
+	adapterProxy       adapterif.AdapterProxy
+	started            bool
+	PDevOmciCC         *OmciCC
+	pOnuDB             *OnuDeviceDB
+	mibTemplateKVStore *db.Backend
+	vendorID           string
+	serialNumber       string
+	equipmentID        string
+	activeSwVersion    string
+	macAddress         string
 	//lockDeviceEntries           sync.RWMutex
 	mibDbClass    func() error
 	supportedFsms OmciDeviceFsms
 	devState      OnuDeviceEvent
 	// for mibUpload
 	mibAuditDelay uint16
-	//MibSyncFsm    *fsm.FSM
-	//MibSyncChan   chan Message
+
+	// for mibUpload
 	pMibUploadFsm *AdapterFsm //could be handled dynamically and more general as pAdapterFsm - perhaps later
 	// for mibDownload
-	//MibDownloadFsm  *fsm.FSM
-	//MibDownloadChan chan Message
 	pMibDownloadFsm *AdapterFsm //could be handled dynamically and more general as pAdapterFsm - perhaps later
 	//remark: general usage of pAdapterFsm would require generalization of commChan  usage and internal event setting
 	//  within the FSM event procedures
@@ -105,8 +120,7 @@
 
 //OnuDeviceEntry returns a new instance of a OnuDeviceEntry
 //mib_db (as well as not inluded alarm_db not really used in this code? VERIFY!!)
-func NewOnuDeviceEntry(ctx context.Context,
-	device_id string, device_Handler *DeviceHandler,
+func NewOnuDeviceEntry(ctx context.Context, device_id string, kVStoreHost string, kVStorePort int, kvStoreType string, device_Handler *DeviceHandler,
 	core_proxy adapterif.CoreProxy, adapter_proxy adapterif.AdapterProxy,
 	supported_Fsms_Ptr *OmciDeviceFsms) *OnuDeviceEntry {
 	logger.Infow("init-onuDeviceEntry", log.Fields{"deviceId": device_id})
@@ -240,6 +254,11 @@
 		// some specifc error treatment - or waiting for crash ???
 	}
 
+	onuDeviceEntry.mibTemplateKVStore = onuDeviceEntry.SetKVClient(kvStoreType, kVStoreHost, kVStorePort, BasePathMibTemplateKvStore)
+	if onuDeviceEntry.mibTemplateKVStore == nil {
+		logger.Error("Failed to setup mibTemplateKVStore")
+	}
+
 	// Alarm Synchronization Database
 	//self._alarm_db = None
 	//self._alarm_database_cls = support_classes['alarm-synchronizer']['database']
@@ -252,11 +271,13 @@
 
 	oo.PDevOmciCC = NewOmciCC(ctx, oo, oo.deviceID, oo.baseDeviceHandler,
 		oo.coreProxy, oo.adapterProxy)
+	if oo.PDevOmciCC == nil {
+		logger.Errorw("Could not create devOmciCc - abort", log.Fields{"for device": oo.deviceID})
+		return errors.New("Could not create devOmciCc")
+	}
 
-	//TODO .....
-	//mib_db.start()
 	oo.started = true
-	logger.Info("OnuDeviceEntry-started, but not yet mib_db!!!")
+	logger.Info("OnuDeviceEntry-started")
 	return nil
 }
 
@@ -277,7 +298,7 @@
 	if dev_Event == MibDatabaseSync {
 		if oo.devState < MibDatabaseSync { //devState has not been synced yet
 			oo.devState = MibDatabaseSync
-			go oo.baseDeviceHandler.DeviceStateUpdate(dev_Event)
+			go oo.baseDeviceHandler.DeviceProcStatusUpdate(dev_Event)
 			//TODO!!! device control: next step: start MIB capability verification from here ?!!!
 		} else {
 			logger.Debugw("mibinsync-event in some already synced state - ignored", log.Fields{"state": oo.devState})
@@ -285,7 +306,7 @@
 	} else if dev_Event == MibDownloadDone {
 		if oo.devState < MibDownloadDone { //devState has not been synced yet
 			oo.devState = MibDownloadDone
-			go oo.baseDeviceHandler.DeviceStateUpdate(dev_Event)
+			go oo.baseDeviceHandler.DeviceProcStatusUpdate(dev_Event)
 		} else {
 			logger.Debugw("mibdownloaddone-event was already seen - ignored", log.Fields{"state": oo.devState})
 		}