[VOL-2241] Python 3 refactor of pyvoltha

Majority of work was manual fixes to bytes and strings types, which are
different in py3, but same in py2. As the OMCI library does a lot of
these comparisons and scapy then renders packets, this was frequently
nontrival to debug.

Also:

- Removed grpc dep which wasn't being used, not py3 compatible
- s/Alarms/Events/ to work with protobuf changes per VOL-2224
- Automatic fixes via modernize tooling
- Removed unused OrderedWeakValueDict code
- Removed frameio send_frame specific to Darwin (MacOS), which had no
  corresponding linux code
- Use library functions for hex and unicode conversions
- Various other cleanups and fixes (EOL whitespace, etc.)

Also more (Matt):

 - handle stringify better, check if already string
 - use binary string for binary work
 - import new thread paths
 - update requirements.txt for newer libraries needed with newer python
 - return proper tuple for unpacking
 - bytes string formatting fixed
 - fix mock task unit test

Even more (Zack):

- Python 2/3 compat for _thread by using 'future'
- Bump version to 2.3.0

Change-Id: I53b596d374a944bfb80d0b112f21bcc1f8bcee6e
diff --git a/test/unit/extensions/omci/test_mib_db_dict.py b/test/unit/extensions/omci/test_mib_db_dict.py
index 2f7f26d..6cf1e1d 100644
--- a/test/unit/extensions/omci/test_mib_db_dict.py
+++ b/test/unit/extensions/omci/test_mib_db_dict.py
@@ -13,15 +13,17 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
+from __future__ import absolute_import
 from unittest import main, TestCase
 
 from pyvoltha.adapters.extensions.omci.omci_entities import *
 from pyvoltha.adapters.extensions.omci.database.mib_db_dict import *
 from pyvoltha.adapters.extensions.omci.database.mib_db_api import MODIFIED_KEY, CREATED_KEY,\
     DEVICE_ID_KEY, MDS_KEY, LAST_SYNC_KEY
-from mock.mock_adapter_agent import MockAdapterAgent, MockDevice
+from .mock.mock_adapter_agent import MockAdapterAgent, MockDevice
 from nose.tools import raises, assert_raises
 import time
+import six
 
 _DEVICE_ID = 'br-549'
 
@@ -373,7 +375,7 @@
         self.assertLessEqual(dev_data[CREATED_KEY], set_time)
         self.assertLessEqual(self.db.created, set_time)
 
-        self.assertFalse(any(isinstance(cls, int) for cls in dev_data.iterkeys()))
+        self.assertFalse(any(isinstance(cls, int) for cls in six.iterkeys(dev_data)))
 
     def test_str_field_serialization(self):
         self.db.start()
@@ -385,8 +387,8 @@
             'olt_vendor_id': 'ABCD',             # StrFixedLenField(4)
         }
         self.db.set(_DEVICE_ID, class_id, inst_id, attributes)
-        data = self.db.query(_DEVICE_ID, class_id, inst_id, attributes.keys())
-        self.assertTrue(all(isinstance(data[k], basestring) for k in attributes.keys()))
+        data = self.db.query(_DEVICE_ID, class_id, inst_id, list(attributes.keys()))
+        self.assertTrue(all(isinstance(data[k], six.string_types) for k in attributes.keys()))
         self.assertTrue(all(data[k] == attributes[k] for k in attributes.keys()))
 
     def test_mac_address_ip_field_serialization(self):
@@ -400,8 +402,8 @@
             'ip_address': '1.2.3.4',                        # IPField
         }
         self.db.set(_DEVICE_ID, class_id, inst_id, attributes)
-        data = self.db.query(_DEVICE_ID, class_id, inst_id, attributes.keys())
-        self.assertTrue(all(isinstance(data[k], basestring) for k in attributes.keys()))
+        data = self.db.query(_DEVICE_ID, class_id, inst_id, list(attributes.keys()))
+        self.assertTrue(all(isinstance(data[k], six.string_types) for k in attributes.keys()))
         self.assertTrue(all(data[k] == attributes[k] for k in attributes.keys()))
 
     def test_byte_and_short_field_serialization(self):
@@ -415,7 +417,7 @@
             'non_omci_management_identifier': int(12345)   # IPField
         }
         self.db.set(_DEVICE_ID, class_id, inst_id, attributes)
-        data = self.db.query(_DEVICE_ID, class_id, inst_id, attributes.keys())
+        data = self.db.query(_DEVICE_ID, class_id, inst_id, list(attributes.keys()))
         self.assertTrue(all(isinstance(data[k], type(attributes[k])) for k in attributes.keys()))
         self.assertTrue(all(data[k] == attributes[k] for k in attributes.keys()))
 
@@ -429,7 +431,7 @@
             'related_port': int(1234567)    # IntField
         }
         self.db.set(_DEVICE_ID, class_id, inst_id, attributes)
-        data = self.db.query(_DEVICE_ID, class_id, inst_id, attributes.keys())
+        data = self.db.query(_DEVICE_ID, class_id, inst_id, list(attributes.keys()))
         self.assertTrue(all(isinstance(data[k], type(attributes[k])) for k in attributes.keys()))
         self.assertTrue(all(data[k] == attributes[k] for k in attributes.keys()))
 
@@ -443,7 +445,7 @@
             'packet_drop_queue_thresholds': int(0x1234)        # LongField
         }
         self.db.set(_DEVICE_ID, class_id, inst_id, attributes)
-        data = self.db.query(_DEVICE_ID, class_id, inst_id, attributes.keys())
+        data = self.db.query(_DEVICE_ID, class_id, inst_id, list(attributes.keys()))
         self.assertTrue(all(isinstance(data[k], type(attributes[k])) for k in attributes.keys()))
         self.assertTrue(all(data[k] == attributes[k] for k in attributes.keys()))
 
@@ -454,10 +456,10 @@
         class_id = OntG.class_id
         inst_id = 0
         attributes = {
-            'extended_tc_layer_options': long(0x1234),        # BitField(16)
+            'extended_tc_layer_options': int(0x1234),        # BitField(16)
         }
         self.db.set(_DEVICE_ID, class_id, inst_id, attributes)
-        data = self.db.query(_DEVICE_ID, class_id, inst_id, attributes.keys())
+        data = self.db.query(_DEVICE_ID, class_id, inst_id, list(attributes.keys()))
         self.assertTrue(all(isinstance(data[k], type(attributes[k])) for k in attributes.keys()))
         self.assertTrue(all(data[k] == attributes[k] for k in attributes.keys()))
 
@@ -476,7 +478,7 @@
             'number_of_entries': 1
         }
         self.db.set(_DEVICE_ID, class_id, inst_id, attributes)
-        data = self.db.query(_DEVICE_ID, class_id, inst_id, attributes.keys())
+        data = self.db.query(_DEVICE_ID, class_id, inst_id, list(attributes.keys()))
         self.assertTrue(all(isinstance(data[k], type(attributes[k])) for k in attributes.keys()))
         self.assertTrue(all(data[k] == attributes[k] for k in attributes.keys()))
 
@@ -504,7 +506,7 @@
         )
         self.db.set(_DEVICE_ID, class_id, inst_id, attributes)
 
-        data = self.db.query(_DEVICE_ID, class_id, inst_id, attributes.keys())
+        data = self.db.query(_DEVICE_ID, class_id, inst_id, list(attributes.keys()))
         table_as_dict = json.loads(table_data.to_json())
 
         self.assertTrue(all(isinstance(data['received_frame_vlan_tagging_operation_table'][0].fields[k],