ADTRAN: Update to containerized adapters.
Loading and running but still needs about a week or so of work to
catch up to where the OpenOLT/ONU containerized adapters are

Change-Id: I5522232e21dd76b3f95b4698af6c7e4cef96753d
diff --git a/adapters/adtran_onu/adtran_onu.yml b/adapters/adtran_onu/adapters-adtran-onu.yml
similarity index 100%
rename from adapters/adtran_onu/adtran_onu.yml
rename to adapters/adtran_onu/adapters-adtran-onu.yml
diff --git a/adapters/adtran_onu/adtran_onu.py b/adapters/adtran_onu/adtran_onu.py
index c0801d1..7a88ed0 100755
--- a/adapters/adtran_onu/adtran_onu.py
+++ b/adapters/adtran_onu/adtran_onu.py
@@ -61,7 +61,7 @@
         self.adtran_omci['omci-capabilities']['tasks']['get-capabilities'] = AdtnCapabilitiesTask
         # TODO: Continue to customize adtran_omci here as needed
 
-        self._omci_agent = OpenOMCIAgent(self.adapter_agent.core,
+        self._omci_agent = OpenOMCIAgent(self.adapter_agent,
                                          support_classes=self.adtran_omci)
 
     @property
diff --git a/adapters/adtran_onu/adtran_onu_handler.py b/adapters/adtran_onu/adtran_onu_handler.py
index 61fdc2c..beed980 100644
--- a/adapters/adtran_onu/adtran_onu_handler.py
+++ b/adapters/adtran_onu/adtran_onu_handler.py
@@ -212,9 +212,8 @@
             assert device.parent_id, 'Invalid Parent ID'
             assert device.proxy_address.device_id, 'Invalid Device ID'
 
-            # register for proxied messages right away
+            # Cache our proxy address
             self.proxy_address = device.proxy_address
-            self.adapter_agent.register_for_proxied_messages(device.proxy_address)
 
             # initialize device info
             device.root = False
@@ -244,7 +243,7 @@
             parent_device = self.adapter_agent.get_device(device.parent_id)
 
             self.logical_device_id = parent_device.parent_id
-            self.adapter_agent.update_device(device)
+            yield self.adapter_agent.device_update(device)
 
             ############################################################################
             # Setup PM configuration for this device
@@ -260,7 +259,7 @@
             pm_config = self.pm_metrics.make_proto()
             self.openomci.set_pm_config(self.pm_metrics.omci_pm.openomci_interval_pm)
             self.log.info("initial-pm-config", pm_config=pm_config)
-            self.adapter_agent.update_device_pm_config(pm_config, init=True)
+            yield self.adapter_agent.device_pm_config_update(pm_config, init=True)
 
             ############################################################################
             # Setup Alarm handler
@@ -276,8 +275,9 @@
             device.reason = 'Failed to activate: {}'.format(e.message)
             device.connect_status = ConnectStatus.UNREACHABLE
             device.oper_status = OperStatus.FAILED
-            self.adapter_agent.update_device(device)
+            self.adapter_agent.device_update(device)
 
+    @inlineCallbacks
     def reconcile(self, device):
         self.log.info('reconciling-ONU-device-starts')
 
@@ -294,19 +294,15 @@
         # Register for adapter messages
         self.adapter_agent.register_for_inter_adapter_messages()
 
-        # Set the connection status to REACHABLE
-        device.connect_status = ConnectStatus.REACHABLE
-        self.adapter_agent.update_device(device)
-        self.enabled = True
-
         # TODO: Verify that the uni, pon and logical ports exists
+        self.enabled = True
 
         # Mark the device as REACHABLE and ACTIVE
         device = self.adapter_agent.get_device(device.id)
         device.connect_status = ConnectStatus.REACHABLE
         device.oper_status = OperStatus.ACTIVE
         device.reason = ''
-        self.adapter_agent.update_device(device)
+        yield self.adapter_agent.device_update(device)
 
         self.log.info('reconciling-ONU-device-ends')
 
@@ -425,6 +421,7 @@
         downstream = tp['downstream_gem_port_attribute_list']
         self._create_gemports(upstream, downstream, tcont, uni_id, tech_profile_id)
 
+    @inlineCallbacks
     def load_and_configure_tech_profile(self, uni_id, tp_path):
         self.log.debug("loading-tech-profile-configuration", uni_id=uni_id, tp_path=tp_path)
 
@@ -442,7 +439,7 @@
                 if tp_path in self._tp_service_specific_task[uni_id]:
                     self.log.info("tech-profile-config-already-in-progress",
                                   tp_path=tp_path)
-                    return
+                    returnValue('already-in-progress')
 
                 tp = self.kv_client[tp_path]
                 tp = ast.literal_eval(tp)
@@ -455,7 +452,7 @@
                     self.log.info("tech-profile-config-done-successfully")
                     device = self.adapter_agent.get_device(self.device_id)
                     device.reason = ''
-                    self.adapter_agent.update_device(device)
+                    yield self.adapter_agent.device_update(device)
 
                     if tp_path in self._tp_service_specific_task[uni_id]:
                         del self._tp_service_specific_task[uni_id][tp_path]
@@ -466,7 +463,7 @@
                     self.log.warn('tech-profile-config-failure-retrying', reason=_reason)
                     device = self.adapter_agent.get_device(self.device_id)
                     device.reason = 'Tech Profile config failed-retrying'
-                    self.adapter_agent.update_device(device)
+                    yield self.adapter_agent.device_update(device)
 
                     if tp_path in self._tp_service_specific_task[uni_id]:
                         del self._tp_service_specific_task[uni_id][tp_path]
@@ -601,7 +598,7 @@
         device.oper_status = OperStatus.ACTIVATING
         device.connect_status = ConnectStatus.UNREACHABLE
         device.reason = 'Attempting reboot'
-        self.adapter_agent.update_device(device)
+        yield self.adapter_agent.device_update(device)
 
         # TODO: send alert and clear alert after the reboot
         try:
@@ -617,10 +614,10 @@
         # Go ahead and pause less than that and start to look
         # for it being alive
         device.reason = 'reboot in progress'
-        self.adapter_agent.update_device(device)
+        yield self.adapter_agent.device_update(device)
 
         # Disable OpenOMCI
-        self.omci.enabled = False
+        self.openomci.enabled = False
         self._deferred = reactor.callLater(_ONU_REBOOT_MIN,
                                            self._finish_reboot,
                                            previous_oper_status,
@@ -631,13 +628,13 @@
     def _finish_reboot(self, previous_oper_status, previous_conn_status,
                        reregister):
         # Restart OpenOMCI
-        self.omci.enabled = True
+        self.openomci.enabled = True
 
         device = self.adapter_agent.get_device(self.device_id)
         device.oper_status = previous_oper_status
         device.connect_status = previous_conn_status
         device.reason = ''
-        self.adapter_agent.update_device(device)
+        yield self.adapter_agent.device_update(device)
 
         if reregister:
             self.adapter_agent.register_for_inter_adapter_messages()
@@ -655,6 +652,7 @@
         # TODO: Support self test?
         return SelfTestResponse(result=SelfTestResponse.NOT_SUPPORTED)
 
+    @inlineCallbacks
     def disable(self):
         self.log.info('disabling', device_id=self.device_id)
         try:
@@ -668,7 +666,7 @@
             device.oper_status = OperStatus.UNKNOWN
             device.connect_status = ConnectStatus.UNREACHABLE
             device.reason = 'Disabled'
-            self.adapter_agent.update_device(device)
+            yield self.adapter_agent.device_update(device)
 
             # Remove the uni logical port from the OLT, if still present
             parent_device = self.adapter_agent.get_device(device.parent_id)
@@ -702,6 +700,7 @@
         self.enabled = False
         self.log.info('disabled')
 
+    @inlineCallbacks
     def reenable(self):
         self.log.info('re-enabling', device_id=self.device_id)
         try:
@@ -729,7 +728,7 @@
                                                                 self._pon.get_port())
             # Update the connect status to REACHABLE
             device.connect_status = ConnectStatus.REACHABLE
-            self.adapter_agent.update_device(device)
+            yield self.adapter_agent.device_update(device)
 
             # re-add uni port to logical device
             parent_device = self.adapter_agent.get_device(device.parent_id)
@@ -748,7 +747,7 @@
             device.reason = ''
 
             self.enabled = True
-            self.adapter_agent.update_device(device)
+            yield self.adapter_agent.device_update(device)
 
             self.log.info('re-enabled')
 
@@ -773,6 +772,7 @@
         omci, self._openomci = self._openomci, None
         omci.delete()
 
+    @inlineCallbacks
     def add_uni_ports(self):
         """ Called after in-sync achieved and not in xPON mode"""
         # TODO: We have to methods adding UNI ports.  Go to one
@@ -823,7 +823,7 @@
                 pon_port.peers[d[0]].port_no = uni_port.port_number
                 self.adapter_agent.add_port_reference_to_parent(self.device_id,
                                                                 pon_port)
-            self.adapter_agent.update_device(device)
+            yield self.adapter_agent.device_update(device)
             uni_port.enabled = True
             uni_id += 1
 
diff --git a/adapters/adtran_onu/main.py b/adapters/adtran_onu/main.py
index e19f320..8bff56d 100755
--- a/adapters/adtran_onu/main.py
+++ b/adapters/adtran_onu/main.py
@@ -45,13 +45,14 @@
 from adtran_onu import AdtranOnuAdapter
 from pyvoltha.protos import third_party
 from pyvoltha.protos.adapter_pb2 import AdapterConfig
+import sys
 
 _ = third_party
 
 
-defs = dict(
-    version_file='./VERSION',
-    config=os.environ.get('CONFIG', './adapters-adtran_onu.yml'),
+defs=dict(
+    version_file='/voltha/VERSION',
+    config=os.environ.get('CONFIG', './adapters-adtran-onu.yml'),
     container_name_regex=os.environ.get('CONTAINER_NUMBER_EXTRACTOR', '^.*\.(['
                                                                       '0-9]+)\..*$'),
     consul=os.environ.get('CONSUL', 'localhost:8500'),
@@ -74,7 +75,7 @@
     debug_enabled=True,
     debug_host='work.bcsw.net',
     # debug_host='10.0.2.15',
-    debug_port=5678,
+    debug_port=8765,
 )
 
 
@@ -322,42 +323,48 @@
 class Main(object):
 
     def __init__(self):
+        try:
+            self.args = args = parse_args()
+            self.config = load_config(args)
 
-        self.args = args = parse_args()
-        self.config = load_config(args)
+            verbosity_adjust = (args.verbose or 0) - (args.quiet or 0)
+            self.log = setup_logging(self.config.get('logging', {}),
+                                     args.instance_id,
+                                     verbosity_adjust=verbosity_adjust)
+            self.log.info('container-number-extractor',
+                          regex=args.container_name_regex)
 
-        verbosity_adjust = (args.verbose or 0) - (args.quiet or 0)
-        self.log = setup_logging(self.config.get('logging', {}),
-                                 args.instance_id,
-                                 verbosity_adjust=verbosity_adjust)
-        self.log.info('container-number-extractor',
-                      regex=args.container_name_regex)
+            if args.debug_enabled:
+                setup_remote_debug(args.debug_host, args.debug_port, self.log)
 
-        if args.debug_enabled:
-            setup_remote_debug(args.debug_host, args.debug_port, self.log)
+            self.adtran_onu_adapter_version = self.get_version()
+            self.log.info('ADTRAN-ONU-Adapter-Version', version=self.adtran_onu_adapter_version)
 
-        self.adtran_onu_adapter_version = self.get_version()
-        self.log.info('ADTRAN-ONU-Adapter-Version', version=self.adtran_onu_adapter_version)
+            if not args.no_banner:
+                print_banner(self.log)
 
-        if not args.no_banner:
-            print_banner(self.log)
+            self.adapter = None
+            self.core_proxy = None
+            self.adapter_proxy = None
 
-        self.adapter = None
-        self.core_proxy = None
-        self.adapter_proxy = None
+            # Create a unique instance id using the passed-in instance id and
+            # UTC timestamp
+            current_time = arrow.utcnow().timestamp
+            self.instance_id = self.args.instance_id + '_' + str(current_time)
 
-        # Create a unique instance id using the passed-in instance id and
-        # UTC timestamp
-        current_time = arrow.utcnow().timestamp
-        self.instance_id = self.args.instance_id + '_' + str(current_time)
+            self.core_topic = args.core_topic
+            self.listening_topic = args.name
+            self.startup_components()
 
-        self.core_topic = args.core_topic
-        self.listening_topic = args.name
-        self.startup_components()
+            if not args.no_heartbeat:
+                self.start_heartbeat()
+                self.start_kafka_cluster_heartbeat(self.instance_id)
 
-        if not args.no_heartbeat:
-            self.start_heartbeat()
-            self.start_kafka_cluster_heartbeat(self.instance_id)
+        except Exception as e:
+            self.log.exception('unhandled-exception', e=e)
+            for tick in xrange(0, 30):
+                import time
+                time.sleep(2)
 
     def get_version(self):
         path = defs['version_file']
diff --git a/adapters/adtran_onu/pon_port.py b/adapters/adtran_onu/pon_port.py
index fd0d0c1..c89815f 100644
--- a/adapters/adtran_onu/pon_port.py
+++ b/adapters/adtran_onu/pon_port.py
@@ -150,6 +150,7 @@
                                                    port_no=device.parent_port_no)])
         return self._port
 
+    @inlineCallbacks
     def _update_adapter_agent(self):
         """
         Update the port status and state in the core
@@ -161,11 +162,13 @@
             self._port.admin_state = self._admin_state
             self._port.oper_status = self._oper_status
 
-        # adapter_agent add_port also does an update of port status
-        try:
-            self._handler.adapter_agent.add_port(self._handler.device_id, self.get_port())
-        except Exception as e:
-            self.log.exception('update-port', e=e)
+            try:
+                yield self._handler.adapter_agent.port_state_update(self._handler.device_id,
+                                                                    self._port.type,
+                                                                    self._port.port_no,
+                                                                    self._port.oper_status)
+            except Exception as e:
+                self.log.exception('update-port', e=e)
 
     def add_tcont(self, tcont, reflow=False):
         """
diff --git a/adapters/adtran_onu/uni_port.py b/adapters/adtran_onu/uni_port.py
index 96cd353..b829499 100644
--- a/adapters/adtran_onu/uni_port.py
+++ b/adapters/adtran_onu/uni_port.py
@@ -19,7 +19,8 @@
 from pyvoltha.protos.logical_device_pb2 import LogicalPort
 from pyvoltha.protos.openflow_13_pb2 import OFPPS_LIVE, OFPPF_FIBER
 from pyvoltha.protos.openflow_13_pb2 import ofp_port
-import adtran_olt.resources.adtranolt_platform as platform
+# import adtran_olt.resources.adtranolt_platform as platform
+from twisted.internet.defer import inlineCallbacks
 
 
 class UniPort(object):
@@ -136,6 +137,7 @@
         """
         return self._logical_port_number
 
+    @inlineCallbacks
     def _update_adapter_agent(self):
         """
         Update the port status and state in the core
@@ -147,14 +149,16 @@
             self._port.admin_state = self._admin_state
             self._port.oper_status = self._oper_status
 
-        try:
-            # adapter_agent add_port also does an update of existing port
-            self._handler.adapter_agent.add_port(self._handler.device_id,
-                                                 self.get_port())
-        except KeyError:  # Expected exception during ONU disabling
-            pass
-        except Exception as e:  # Expected exception during ONU disabling
-            self.log.exception('update-port', e=e)
+            try:
+                yield self._handler.adapter_agent.port_state_update(self._handler.device_id,
+                                                                    self._port.type,
+                                                                    self._port.port_no,
+                                                                    self._port.oper_status)
+
+            except KeyError:  # Expected exception during ONU disabling
+                pass
+            except Exception as e:  # Expected exception during ONU disabling
+                self.log.exception('update-port', e=e)
 
     def get_port(self):
         """