WIP [VOL-2811] - Incorporate preliminary onu-adapter-go code into opencord repo

- reason "discovery-mibsync-complete" reached (via full MibUpload only, received data won't be stored yet)
- first review comments of patchset #4 considered
 (please have a look into our inline-comments in Gerrit to know more about the current state)
- no refactoring done yet

Change-Id: Iac47817f8ce4bd28dd8132f530b0570d57ae99b8
Signed-off-by: Holger Hildebrandt <holger.hildebrandt@adtran.com>
diff --git a/adaptercoreont/omci_agent.go b/adaptercoreont/omci_agent.go
new file mode 100644
index 0000000..ff462f0
--- /dev/null
+++ b/adaptercoreont/omci_agent.go
@@ -0,0 +1,184 @@
+/*
+ * 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 adaptercoreont provides the utility for onu devices, flows and statistics
+package adaptercoreont
+
+import (
+	"context"
+	//"errors"
+	//"sync"
+	//"time"
+
+	"github.com/opencord/voltha-lib-go/v3/pkg/adapters/adapterif"
+
+	//"github.com/opencord/voltha-lib-go/v3/pkg/kafka"
+	"github.com/opencord/voltha-lib-go/v3/pkg/log"
+	//ic "github.com/opencord/voltha-protos/v3/go/inter_container"
+	//"github.com/opencord/voltha-protos/v3/go/openflow_13"
+	//"github.com/opencord/voltha-protos/v3/go/voltha"
+)
+
+/*
+OpenOmciAgentDefaults = {
+    'mib-synchronizer': {
+        'state-machine': MibSynchronizer,  # Implements the MIB synchronization state machine
+        'database': MibDbVolatileDict,     # Implements volatile ME MIB database
+        # 'database': MibDbExternal,         # Implements persistent ME MIB database
+        'advertise-events': True,          # Advertise events on OpenOMCI event bus
+        'audit-delay': 60,                 # Time to wait between MIB audits.  0 to disable audits.
+        'tasks': {
+            'mib-upload': MibUploadTask,
+            'mib-template': MibTemplateTask,
+            'get-mds': GetMdsTask,
+            'mib-audit': GetMdsTask,
+            'mib-resync': MibResyncTask,
+            'mib-reconcile': MibReconcileTask
+        }
+    },
+    'omci-capabilities': {
+        'state-machine': OnuOmciCapabilities,   # Implements OMCI capabilities state machine
+        'advertise-events': False,              # Advertise events on OpenOMCI event bus
+        'tasks': {
+            'get-capabilities': OnuCapabilitiesTask # Get supported ME and Commands
+        }
+    },
+    'performance-intervals': {
+        'state-machine': PerformanceIntervals,  # Implements PM Intervals State machine
+        'advertise-events': False,              # Advertise events on OpenOMCI event bus
+        'tasks': {
+            'sync-time': SyncTimeTask,
+            'collect-data': IntervalDataTask,
+            'create-pm': OmciCreatePMRequest,
+            'delete-pm': OmciDeletePMRequest,
+        },
+    },
+    'alarm-synchronizer': {
+        'state-machine': AlarmSynchronizer,    # Implements the Alarm sync state machine
+        'database': AlarmDbExternal,           # For any State storage needs
+        'advertise-events': True,              # Advertise events on OpenOMCI event bus
+        'tasks': {
+            'alarm-resync': AlarmResyncTask
+        }
+     },
+    'image_downloader': {
+        'state-machine': ImageDownloadeSTM,
+        'advertise-event': True,
+        'tasks': {
+            'download-file': FileDownloadTask
+        }
+    },
+    'image_upgrader': {
+        'state-machine': OmciSoftwareImageDownloadSTM,
+        'advertise-event': True,
+        'tasks': {
+            'omci_upgrade_task': OmciSwImageUpgradeTask
+        }
+    }
+    # 'image_activator': {
+    #     'state-machine': OmciSoftwareImageActivateSTM,
+    #     'advertise-event': True,
+    # }
+}
+*/
+
+//OpenOMCIAgent structure holds the ONU core information
+type OpenOMCIAgent struct {
+	coreProxy     adapterif.CoreProxy
+	adapterProxy  adapterif.AdapterProxy
+	started       bool
+	deviceEntries map[string]*OnuDeviceEntry
+	mibDbClass    func() error
+}
+
+//NewOpenOMCIAgent returns a new instance of OpenOMCIAgent
+func NewOpenOMCIAgent(ctx context.Context,
+	coreProxy adapterif.CoreProxy, adapterProxy adapterif.AdapterProxy) *OpenOMCIAgent {
+	log.Info("init-openOmciAgent")
+	var openomciagent OpenOMCIAgent
+	openomciagent.started = false
+	openomciagent.coreProxy = coreProxy
+	openomciagent.adapterProxy = adapterProxy
+	openomciagent.deviceEntries = make(map[string]*OnuDeviceEntry)
+	return &openomciagent
+}
+
+//Start starts (logs) the omci agent
+func (oo *OpenOMCIAgent) Start(ctx context.Context) error {
+	log.Info("starting-openOmciAgent")
+	//TODO .....
+	//mib_db.start()
+	oo.started = true
+	log.Info("openOmciAgent-started")
+	return nil
+}
+
+//Stop terminates the session
+func (oo *OpenOMCIAgent) Stop(ctx context.Context) error {
+	log.Info("stopping-openOmciAgent")
+	oo.started = false
+	//oo.exitChannel <- 1
+	log.Info("openOmciAgent-stopped")
+	return nil
+}
+
+//
+//Add a new ONU to be managed.
+
+//To provide vendor-specific or custom Managed Entities, create your own Entity
+//  ID to class mapping dictionary.
+
+//Since ONU devices can be added at any time (even during Device Handler
+//  startup), the ONU device handler is responsible for calling start()/stop()
+//  for this object.
+
+//:param device_id: (str) Device ID of ONU to add
+//:param core_proxy: (CoreProxy) Remote API to VOLTHA core
+//:param adapter_proxy: (AdapterProxy) Remote API to other adapters via VOLTHA core
+//:param custom_me_map: (dict) Additional/updated ME to add to class map
+//:param support_classes: (dict) State machines and tasks for this ONU
+
+//:return: (OnuDeviceEntry) The ONU device
+//
+func (oo *OpenOMCIAgent) Add_device(ctx context.Context, device_id string,
+	dh *DeviceHandler) (*OnuDeviceEntry, error) {
+	log.Info("openOmciAgent-adding-deviceEntry")
+
+	deviceEntry := oo.GetDevice(device_id)
+	if deviceEntry == nil {
+		/* costum_me_map in python code seems always to be None,
+		   we omit that here first (declaration unclear) -> todo at Adapter specialization ...*/
+		/* also no 'clock' argument - usage open ...*/
+		/* and no alarm_db yet (oo.alarm_db)  */
+		deviceEntry = NewOnuDeviceEntry(ctx, device_id, dh, oo.coreProxy, oo.adapterProxy,
+			oo.mibDbClass, nil)
+		oo.deviceEntries[device_id] = deviceEntry
+		log.Infow("openOmciAgent-OnuDeviceEntry-added", log.Fields{"for deviceId": device_id})
+	} else {
+		log.Infow("openOmciAgent-OnuDeviceEntry-add: Device already exists", log.Fields{"for deviceId": device_id})
+	}
+	// might be updated with some error handling !!!
+	return deviceEntry, nil
+}
+
+// Get ONU device entry for a specific Id
+func (oo *OpenOMCIAgent) GetDevice(device_id string) *OnuDeviceEntry {
+	if _, exist := oo.deviceEntries[device_id]; !exist {
+		return nil
+	} else {
+		return oo.deviceEntries[device_id]
+	}
+}