VOL-1452 Changes to make runnable with old openolt code

Updates to mostly make the openolt adapter talk to the core.
Still have to implement adding logical devices

Change-Id: I3140af196eb38d8beb225a864b1fc42fe5242329
diff --git a/python/adapters/kafka/kafka_inter_container_library.py b/python/adapters/kafka/kafka_inter_container_library.py
index 5cad2e8..a4719d4 100644
--- a/python/adapters/kafka/kafka_inter_container_library.py
+++ b/python/adapters/kafka/kafka_inter_container_library.py
@@ -24,9 +24,9 @@
 from zope.interface import implementer
 
 from python.common.utils import asleep
-from python.common.utils.registry import IComponent
+from voltha.common.utils.registry import IComponent
 from kafka_proxy import KafkaProxy, get_kafka_proxy
-from python.protos.inter_container_pb2 import MessageType, Argument, \
+from voltha.protos.inter_container_pb2 import MessageType, Argument, \
     InterContainerRequestBody, InterContainerMessage, Header, \
     InterContainerResponseBody
 
diff --git a/python/adapters/kafka/kafka_proxy.py b/python/adapters/kafka/kafka_proxy.py
index cefc590..8c4eeb8 100644
--- a/python/adapters/kafka/kafka_proxy.py
+++ b/python/adapters/kafka/kafka_proxy.py
@@ -24,7 +24,7 @@
 
 from python.common.utils.consulhelpers import get_endpoint_from_consul
 from event_bus_publisher import EventBusPublisher
-from python.common.utils.registry import IComponent
+from voltha.common.utils.registry import IComponent
 from confluent_kafka import Consumer, KafkaError
 import threading
 
diff --git a/python/adapters/openolt/main.py b/python/adapters/openolt/main.py
index 273ff13..3af6421 100755
--- a/python/adapters/openolt/main.py
+++ b/python/adapters/openolt/main.py
@@ -29,22 +29,22 @@
 from twisted.internet.task import LoopingCall
 from zope.interface import implementer
 
-from python.common.structlog_setup import setup_logging, update_logging
-from python.common.utils.asleep import asleep
-from python.common.utils.deferred_utils import TimeOutError
-from python.common.utils.dockerhelpers import get_my_containers_name
-from python.common.utils.nethelpers import get_my_primary_local_ipv4, \
+from voltha.common.structlog_setup import setup_logging, update_logging
+from voltha.common.utils.asleep import asleep
+from voltha.common.utils.deferred_utils import TimeOutError
+from voltha.common.utils.dockerhelpers import get_my_containers_name
+from voltha.common.utils.nethelpers import get_my_primary_local_ipv4, \
     get_my_primary_interface
-from python.common.utils.registry import registry, IComponent
-from python.adapters.kafka.adapter_proxy import AdapterProxy
-from python.adapters.kafka.adapter_request_facade import AdapterRequestFacade
-from python.adapters.kafka.core_proxy import CoreProxy
-from python.adapters.kafka.kafka_inter_container_library import IKafkaMessagingProxy, \
+from voltha.common.utils.registry import registry, IComponent
+from voltha.adapters.kafka.adapter_proxy import AdapterProxy
+from voltha.adapters.kafka.adapter_request_facade import AdapterRequestFacade
+from voltha.adapters.kafka.core_proxy import CoreProxy
+from voltha.adapters.kafka.kafka_inter_container_library import IKafkaMessagingProxy, \
     get_messaging_proxy
-from python.adapters.kafka.kafka_proxy import KafkaProxy, get_kafka_proxy
+from voltha.adapters.kafka.kafka_proxy import KafkaProxy, get_kafka_proxy
 from openolt import OpenoltAdapter
-from python.protos import third_party
-from python.protos.adapter_pb2 import AdapterConfig
+from voltha.protos import third_party
+from voltha.protos.adapter_pb2 import AdapterConfig
 
 _ = third_party
 
@@ -241,6 +241,7 @@
         dir = os.path.dirname(os.path.abspath(__file__))
         path = os.path.join(dir, path)
     path = os.path.abspath(path)
+    
     with open(path) as fd:
         config = yaml.load(fd)
     return config
@@ -269,7 +270,7 @@
     def __init__(self):
 
         self.args = args = parse_args()
-        self.config = load_config(args)
+	self.config = load_config(args)
 
         verbosity_adjust = (args.verbose or 0) - (args.quiet or 0)
         self.log = setup_logging(self.config.get('logging', {}),
@@ -277,7 +278,7 @@
                                  verbosity_adjust=verbosity_adjust)
         self.log.info('container-number-extractor',
                       regex=args.container_name_regex)
-
+        
         self.openolt_adapter_version = self.get_version()
         self.log.info('Open-OLT-Adapter-Version', version=
         self.openolt_adapter_version)
diff --git a/python/adapters/openolt/openolt.py b/python/adapters/openolt/openolt.py
index 2c87730..3a410ae 100644
--- a/python/adapters/openolt/openolt.py
+++ b/python/adapters/openolt/openolt.py
@@ -32,45 +32,51 @@
 from twisted.internet.defer import inlineCallbacks, returnValue
 from twisted.internet.task import LoopingCall
 
-from python.adapters.common.frameio.frameio import BpfProgramFilter, hexify
-from python.adapters.iadapter import OltAdapter
-from python.common.utils.asleep import asleep
-from python.common.utils.registry import registry
-from python.adapters.kafka.kafka_proxy import get_kafka_proxy
-from python.protos import openolt_pb2
-from python.protos import third_party
-from python.protos.common_pb2 import OperStatus, ConnectStatus
-from python.protos.common_pb2 import LogLevel
-from python.protos.common_pb2 import OperationResp
-from python.protos.inter_container_pb2 import SwitchCapability, PortCapability, \
+from voltha.adapters.common.frameio.frameio import BpfProgramFilter, hexify
+from voltha.adapters.iadapter import OltAdapter
+from voltha.common.utils.asleep import asleep
+from voltha.common.utils.registry import registry
+from voltha.adapters.kafka.kafka_proxy import get_kafka_proxy
+from voltha.protos import openolt_pb2
+from voltha.protos import third_party
+from voltha.protos.common_pb2 import OperStatus, ConnectStatus
+from voltha.protos.common_pb2 import LogLevel
+from voltha.protos.common_pb2 import OperationResp
+from voltha.protos.inter_container_pb2 import SwitchCapability, PortCapability, \
     InterAdapterMessageType, InterAdapterResponseBody
-from python.protos.device_pb2 import Port, PmConfig, PmConfigs, \
+from voltha.protos.device_pb2 import Port, PmConfig, PmConfigs, \
     DeviceType, DeviceTypes
-from python.protos.adapter_pb2 import Adapter
-from python.protos.adapter_pb2 import AdapterConfig
-
+from voltha.protos.adapter_pb2 import Adapter
+from voltha.protos.adapter_pb2 import AdapterConfig
+from voltha.adapters.openolt.openolt_flow_mgr import OpenOltFlowMgr
+from voltha.adapters.openolt.openolt_alarms import OpenOltAlarmMgr
+from voltha.adapters.openolt.openolt_statistics import OpenOltStatisticsMgr
+from voltha.adapters.openolt.openolt_bw import OpenOltBW
+from voltha.adapters.openolt.openolt_platform import OpenOltPlatform
+from voltha.adapters.openolt.openolt_resource_manager import OpenOltResourceMgr
+from voltha.adapters.openolt.openolt_device import OpenoltDevice
  
-from python.protos.events_pb2 import KpiEvent, KpiEventType, MetricValuePairs
-from python.protos.logical_device_pb2 import LogicalPort
-from python.protos.openflow_13_pb2 import OFPPS_LIVE, OFPPF_FIBER, \
+from voltha.protos.events_pb2 import KpiEvent, KpiEventType, MetricValuePairs
+from voltha.protos.logical_device_pb2 import LogicalPort
+from voltha.protos.openflow_13_pb2 import OFPPS_LIVE, OFPPF_FIBER, \
     OFPPF_1GB_FD, \
     OFPC_GROUP_STATS, OFPC_PORT_STATS, OFPC_TABLE_STATS, OFPC_FLOW_STATS, \
     ofp_switch_features, ofp_desc
-from python.protos.openflow_13_pb2 import ofp_port
-from python.protos.ponsim_pb2 import FlowTable, PonSimFrame, PonSimMetricsRequest, PonSimStub
+from voltha.protos.openflow_13_pb2 import ofp_port
+from voltha.protos.ponsim_pb2 import FlowTable, PonSimFrame, PonSimMetricsRequest, PonSimStub
 
 _ = third_party
 log = structlog.get_logger()
-#OpenOltDefaults = {
-#    'support_classes': {
-#        'platform': OpenOltPlatform,
-#        'resource_mgr': OpenOltResourceMgr,
-#        'flow_mgr': OpenOltFlowMgr,
-#        'alarm_mgr': OpenOltAlarmMgr,
-#        'stats_mgr': OpenOltStatisticsMgr,
-#        'bw_mgr': OpenOltBW
-#    }
-#}
+OpenOltDefaults = {
+    'support_classes': {
+        'platform': OpenOltPlatform,
+        'resource_mgr': OpenOltResourceMgr,
+        'flow_mgr': OpenOltFlowMgr,
+        'alarm_mgr': OpenOltAlarmMgr,
+        'stats_mgr': OpenOltStatisticsMgr,
+        'bw_mgr': OpenOltBW
+    }
+}
 
 class AdapterPmMetrics:
     def __init__(self, device):
@@ -416,6 +422,7 @@
         self.pm_metrics = None
         self.alarms = None
         self.frames = None
+	self.num_devices = 0
 
     @inlineCallbacks
     def get_channel(self):
@@ -450,30 +457,32 @@
         ports = yield self.core_proxy.get_ports(self.device_id,
                                                 Port.ETHERNET_NNI)
         returnValue(ports)
+    
+    def init_device(self, kwargs):
+	self.device = OpenoltDevice(**kwargs)
 
     @inlineCallbacks
     def activate(self, device):
         try:
             self.log.info('activating')
-	    print (dir(device))
             if not device.host_and_port:
                 device.oper_status = OperStatus.FAILED
                 device.reason = 'No host_and_port field provided'
                 self.core_proxy.device_update(device)
                 return
-	    """        
+	          
 	    kwargs = {
             	'support_classes': OpenOltDefaults['support_classes'],
-                'adapter_agent': self.adapter_proxy,
+                'adapter_agent': self.core_proxy,
                 'device': device,
                 'device_num': self.num_devices + 1
             }
             try:
-                self.devices[device.id] = OpenoltDevice(**kwargs)
+		yield self.init_device(kwargs)
             except Exception as e:
                 log.error('Failed to adopt OpenOLT device', error=e)
                 # TODO set status to ERROR so that is clear something went wrong
-                del self.devices[device.id]
+                #del self.devices[device.id]
                 raise
             else:
                 self.num_devices += 1
@@ -537,6 +546,7 @@
 
             # Start collecting stats from the device after a brief pause
             self.start_kpi_collection(device.id)
+	    """
         except Exception as e:
             log.exception("Exception-activating", e=e)
 
diff --git a/python/adapters/openolt/openolt_alarms.py b/python/adapters/openolt/openolt_alarms.py
index 764a013..aa227d3 100644
--- a/python/adapters/openolt/openolt_alarms.py
+++ b/python/adapters/openolt/openolt_alarms.py
@@ -30,7 +30,7 @@
 from voltha.extensions.alarms.onu.onu_window_drift_alarm import OnuWindowDriftAlarm
 from voltha.extensions.alarms.onu.onu_activation_fail_alarm import OnuActivationFailAlarm
 
-import protos.openolt_pb2 as openolt_pb2
+import voltha.protos.openolt_pb2 as openolt_pb2
 import voltha.protos.device_pb2 as device_pb2
 
 
diff --git a/python/adapters/openolt/openolt_device.py b/python/adapters/openolt/openolt_device.py
index 2779dc6..d3080ba 100644
--- a/python/adapters/openolt/openolt_device.py
+++ b/python/adapters/openolt/openolt_device.py
@@ -19,29 +19,28 @@
 import socket
 import re
 import structlog
+import time
 from twisted.internet import reactor
 from scapy.layers.l2 import Ether, Dot1Q
 from transitions import Machine
 
-#from voltha.adapters.openolt.protos import openolt_pb2_grpc, openolt_pb2
-from python.protos.bbf_fiber_tcont_body_pb2 import TcontsConfigData
-from python.protos.bbf_fiber_gemport_body_pb2 import GemportsConfigData
+from voltha.protos import openolt_pb2_grpc, openolt_pb2
 
-from python.adapters.extensions.alarms.onu.onu_discovery_alarm import OnuDiscoveryAlarm
+from voltha.extensions.alarms.onu.onu_discovery_alarm import OnuDiscoveryAlarm
 
-from python.common.utils.nethelpers import mac_str_to_tuple
-from python.protos.openflow_13_pb2 import OFPPS_LIVE, OFPPF_FIBER, \
+from voltha.common.utils.nethelpers import mac_str_to_tuple
+from voltha.protos.openflow_13_pb2 import OFPPS_LIVE, OFPPF_FIBER, \
     OFPPS_LINK_DOWN, OFPPF_1GB_FD, \
     OFPC_GROUP_STATS, OFPC_PORT_STATS, OFPC_TABLE_STATS, OFPC_FLOW_STATS, \
     ofp_switch_features, ofp_port, ofp_port_stats, ofp_desc
-from python.common.utils.registry import registry
-from python.protos import openolt_pb2
-from python.protos import third_party
-from python.protos.common_pb2 import AdminStatus, OperStatus, ConnectStatus
-from python.protos.common_pb2 import LogLevel
-from python.protos.device_pb2 import Port, Device
+from voltha.common.utils.registry import registry
+from voltha.protos import openolt_pb2
+from voltha.protos import third_party
+from voltha.protos.common_pb2 import AdminState, OperStatus, ConnectStatus
+from voltha.protos.common_pb2 import LogLevel
+from voltha.protos.device_pb2 import Port, Device
 
-from python.protos.logical_device_pb2 import LogicalDevice, LogicalPort
+from voltha.protos.logical_device_pb2 import LogicalDevice, LogicalPort
 
 class OpenoltDevice(object):
     """
@@ -96,14 +95,14 @@
         self.alarm_mgr_class = kwargs['support_classes']['alarm_mgr']
         self.stats_mgr_class = kwargs['support_classes']['stats_mgr']
         self.bw_mgr_class = kwargs['support_classes']['bw_mgr']
-
+	
         is_reconciliation = kwargs.get('reconciliation', False)
         self.device_id = device.id
         self.host_and_port = device.host_and_port
         self.extra_args = device.extra_args
         self.log = structlog.get_logger(id=self.device_id,
                                         ip=self.host_and_port)
-        self.proxy = registry('core').get_proxy('/')
+        #self.proxy = registry('core').get_proxy('/')
 
         self.log.info('openolt-device-init')
 
@@ -119,7 +118,7 @@
             device.root = True
             device.connect_status = ConnectStatus.UNREACHABLE
             device.oper_status = OperStatus.ACTIVATING
-            self.adapter_agent.update_device(device)
+            self.adapter_agent.device_update(device)
 
         # If logical device does exist use it, else create one after connecting to device
         if device.parent_id:
@@ -185,7 +184,7 @@
 
         device = self.adapter_agent.get_device(self.device_id)
         device.serial_number = serial_number
-        self.adapter_agent.update_device(device)
+        self.adapter_agent.device_update(device)
 
         self.dpid = dpid
         self.serial_number = serial_number
@@ -208,6 +207,7 @@
 
     def do_state_init(self, event):
         # Initialize gRPC
+	print ("Host And Port", self.host_and_port)
         self.channel = grpc.insecure_channel(self.host_and_port)
         self.channel_ready_future = grpc.channel_ready_future(self.channel)
 
@@ -227,6 +227,7 @@
             # property instead. The Jinkins error will happon on the reason of
             # Exception in thread Thread-1 (most likely raised # during
             # interpreter shutdown)
+	    self.log.debug('starting indications thread')
             self.indications_thread_handle.setDaemon(True)
             self.indications_thread_handle.start()
         except Exception as e:
@@ -239,13 +240,31 @@
 
         self.stub = openolt_pb2_grpc.OpenoltStub(self.channel)
 
-        device_info = self.stub.GetDeviceInfo(openolt_pb2.Empty())
+        delay = 1
+        while True:
+            try:
+                device_info = self.stub.GetDeviceInfo(openolt_pb2.Empty())
+                break
+            except Exception as e:
+                reraise = True
+                if delay > 120:
+                    self.log.error("gRPC failure too many times")
+                else:
+                    self.log.warn("gRPC failure, retry in %ds: %s"
+                                  % (delay, repr(e)))
+                    time.sleep(delay)
+                    delay += delay
+                    reraise = False
+
+                if reraise:
+                    raise
+
         self.log.info('Device connected', device_info=device_info)
 
         self.create_logical_device(device_info)
 
         device.serial_number = self.serial_number
-
+	
         self.resource_mgr = self.resource_mgr_class(self.device_id,
                                                     self.host_and_port,
                                                     self.extra_args,
@@ -260,9 +279,9 @@
                                               self.device_id,
                                               self.logical_device_id,
                                               self.platform)
-        self.stats_mgr = self.stats_mgr_class(self, self.log, self.platform)
+	self.stats_mgr = self.stats_mgr_class(self, self.log, self.platform)
         self.bw_mgr = self.bw_mgr_class(self.log, self.proxy)
-
+	
         device.vendor = device_info.vendor
         device.model = device_info.model
         device.hardware_version = device_info.hardware_version
@@ -271,7 +290,7 @@
         # TODO: check for uptime and reboot if too long (VOL-1192)
 
         device.connect_status = ConnectStatus.REACHABLE
-        self.adapter_agent.update_device(device)
+        self.adapter_agent.device_update(device)
 
     def do_state_up(self, event):
         self.log.debug("do_state_up")
@@ -281,7 +300,7 @@
         # Update phys OF device
         device.parent_id = self.logical_device_id
         device.oper_status = OperStatus.ACTIVE
-        self.adapter_agent.update_device(device)
+        self.adapter_agent.device_update(device)
 
     def do_state_down(self, event):
         self.log.debug("do_state_down")
@@ -327,7 +346,7 @@
         device.oper_status = oper_state
         device.connect_status = connect_state
 
-        reactor.callLater(2, self.adapter_agent.update_device, device)
+        reactor.callLater(2, self.adapter_agent.device_update, device)
 
     # def post_up(self, event):
     #     self.log.debug('post-up')
@@ -471,7 +490,7 @@
         else:
             if onu_device.connect_status != ConnectStatus.REACHABLE:
                 onu_device.connect_status = ConnectStatus.REACHABLE
-                self.adapter_agent.update_device(onu_device)
+                self.adapter_agent.device_update(onu_device)
 
             onu_id = onu_device.proxy_address.onu_id
             if onu_device.oper_status == OperStatus.DISCOVERED \
@@ -491,7 +510,7 @@
                               onu_id=onu_id, serial_number=serial_number_str)
 
                 onu_device.oper_status = OperStatus.DISCOVERED
-                self.adapter_agent.update_device(onu_device)
+                self.adapter_agent.device_update(onu_device)
                 try:
                     self.activate_onu(intf_id, onu_id, serial_number,
                                       serial_number_str)
@@ -576,14 +595,14 @@
 
             if onu_device.connect_status != ConnectStatus.UNREACHABLE:
                 onu_device.connect_status = ConnectStatus.UNREACHABLE
-                self.adapter_agent.update_device(onu_device)
+                self.adapter_agent.device_update(onu_device)
 
             # Move to discovered state
             self.log.debug('onu-oper-state-is-down')
 
             if onu_device.oper_status != OperStatus.DISCOVERED:
                 onu_device.oper_status = OperStatus.DISCOVERED
-                self.adapter_agent.update_device(onu_device)
+                self.adapter_agent.device_update(onu_device)
             # Set port oper state to Discovered
             self.onu_ports_down(onu_device, OperStatus.DISCOVERED)
 
@@ -594,7 +613,7 @@
 
             if onu_device.connect_status != ConnectStatus.REACHABLE:
                 onu_device.connect_status = ConnectStatus.REACHABLE
-                self.adapter_agent.update_device(onu_device)
+                self.adapter_agent.device_update(onu_device)
 
             if onu_device.oper_status != OperStatus.DISCOVERED:
                 self.log.debug("ignore onu indication",
@@ -994,8 +1013,6 @@
         try:
             self.stub.ReenableOlt(openolt_pb2.Empty())
 
-            self.log.info('enabling-all-ports', device_id=self.device_id)
-            self.adapter_agent.enable_all_ports(self.device_id)
         except Exception as e:
             self.log.error('Failure to reenable openolt device', error=e)
         else: