Async/streaming gRPC client/server proto

This experiment was to fine-tune how we can implement
async gRPC client and server code inside a Twisted
python app.

Change-Id: I945014e27f4b9d6ed624666e0284cc298548adb3

Major cleanup of openflow_13.proto

Change-Id: I4e54eaf87b682124ec518a0ade1a6050a6ec6da8

Relocated openflow_13.proto to voltha

Change-Id: I66ae45a9142d180c2c6651e75c7a1ee08aef7ef8

Removed forced utest from make build

Change-Id: If0da58e9d135ebde6ca68c3316688a03a7b10f2f

twisted openflow agent first pass

Change-Id: Ibe5b4727ccfe92e6fd464ccd3baf6275569ef5d3

store openflow derived files

Change-Id: Ib3e1384bb2ca2a9c0872767f7b793f96b0a154e2

Minor cleanup

Change-Id: I1280ed3acb606121b616a0efd573f5f59d010dca

Factored out common utils

Change-Id: Icd86fcd50f60d0900924674cbcd65e13e47782a1

Refactored twisted agent

Change-Id: I71f26ce5357a4f98477df60b8c5ddc068cf75d43

Relocated openflow agent to ofagent

... and preserved obsolete working (non-twisted) agent under
~/obsolete, so we can still run the olt-oftest and pass tests,
unit the new twisted based agent reaches that maturity point.

Change-Id: I727f8d7144b1291a40276dad2966b7643bd7bc4b

olt-oftest in fake mode works with new agent

Change-Id: I43b4f5812e8dfaa9f45e4a77fdcf6c30ac520f8d

Initial ofagent/voltha operation

Change-Id: Ia8104f1285a6b1c51635d36d7d78fc113f800e79

Additional callouts to Voltha

Change-Id: If8f483d5140d3c9d45f22b480b8d33249a29cd4e

More gRPC calls

Change-Id: I7d24fadf9425217fb26ffe18f25359d072ef38fa

Flow add/list now works

Change-Id: Ie3e3e73108645b47891cef798fc61372a022fd93

Missed some files

Change-Id: I29e81238ff1a26c095c0c73e521579edf7092e21
diff --git a/ofagent/protos/voltha_pb2.py b/ofagent/protos/voltha_pb2.py
new file mode 100644
index 0000000..d800877
--- /dev/null
+++ b/ofagent/protos/voltha_pb2.py
@@ -0,0 +1,1759 @@
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: voltha.proto
+
+import sys
+_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf import descriptor_pb2
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
+import openflow_13_pb2 as openflow__13__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='voltha.proto',
+  package='voltha',
+  syntax='proto3',
+  serialized_pb=_b('\n\x0cvoltha.proto\x12\x06voltha\x1a\x1cgoogle/api/annotations.proto\x1a\x11openflow_13.proto\"\r\n\x0bNullMessage\"v\n\x0cHealthStatus\x12/\n\x05state\x18\x01 \x01(\x0e\x32 .voltha.HealthStatus.HealthState\"5\n\x0bHealthState\x12\x0b\n\x07HEALTHY\x10\x00\x12\x0e\n\nOVERLOADED\x10\x01\x12\t\n\x05\x44YING\x10\x02\"q\n\x07\x41\x64\x64ress\x12\n\n\x02id\x18\x07 \x01(\t\x12\x0e\n\x06street\x18\x01 \x01(\t\x12\x0f\n\x07street2\x18\x02 \x01(\t\x12\x0f\n\x07street3\x18\x03 \x01(\t\x12\x0c\n\x04\x63ity\x18\x04 \x01(\t\x12\r\n\x05state\x18\x05 \x01(\t\x12\x0b\n\x03zip\x18\x06 \x01(\r\"/\n\tAddresses\x12\"\n\taddresses\x18\x01 \x03(\x0b\x32\x0f.voltha.Address\"\x9f\x01\n\x0bMoreComplex\x12$\n\x06health\x18\x01 \x01(\x0b\x32\x14.voltha.HealthStatus\x12\x13\n\x0b\x66oo_counter\x18\x02 \x01(\x05\x12\x0c\n\x04name\x18\x03 \x01(\t\x12%\n\x08\x63hildren\x18\x04 \x03(\x0b\x32\x13.voltha.MoreComplex\x12 \n\x07\x61\x64\x64ress\x18\x05 \x01(\x0b\x32\x0f.voltha.Address\"\x10\n\x02ID\x12\n\n\x02id\x18\x01 \x01(\t\"\x18\n\nSubscriber\x12\n\n\x02id\x18\x01 \x01(\t\"0\n\x0bSubscribers\x12!\n\x05items\x18\x01 \x03(\x0b\x32\x12.voltha.Subscriber\"U\n\rLogicalDevice\x12\n\n\x02id\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x61tapath_id\x18\x02 \x01(\x04\x12#\n\x04\x64\x65sc\x18\x03 \x01(\x0b\x32\x15.openflow_13.ofp_desc\"6\n\x0eLogicalDevices\x12$\n\x05items\x18\x01 \x03(\x0b\x32\x15.voltha.LogicalDevice\"4\n\x0cLogicalPorts\x12$\n\x05items\x18\x01 \x03(\x0b\x32\x15.openflow_13.ofp_port\"\x97\x01\n\x14LogicalDeviceDetails\x12\n\n\x02id\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x61tapath_id\x18\x02 \x01(\x04\x12#\n\x04\x64\x65sc\x18\x03 \x01(\x0b\x32\x15.openflow_13.ofp_desc\x12\x39\n\x0fswitch_features\x18\x04 \x01(\x0b\x32 .openflow_13.ofp_switch_features\"J\n\x0f\x46lowTableUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12+\n\x08\x66low_mod\x18\x02 \x01(\x0b\x32\x19.openflow_13.ofp_flow_mod\"3\n\x05\x46lows\x12*\n\x05items\x18\x01 \x03(\x0b\x32\x1b.openflow_13.ofp_flow_stats2^\n\rHealthService\x12M\n\x0fGetHealthStatus\x12\x13.voltha.NullMessage\x1a\x14.voltha.HealthStatus\"\x0f\x82\xd3\xe4\x93\x02\t\x12\x07/health2\xff\x06\n\x12VolthaLogicalLayer\x12Y\n\x12ListLogicalDevices\x12\x13.voltha.NullMessage\x1a\x16.voltha.LogicalDevices\"\x16\x82\xd3\xe4\x93\x02\x10\x12\x0e/local/devices\x12Y\n\x10GetLogicalDevice\x12\n.voltha.ID\x1a\x1c.voltha.LogicalDeviceDetails\"\x1b\x82\xd3\xe4\x93\x02\x15\x12\x13/local/devices/{id}\x12]\n\x16ListLogicalDevicePorts\x12\n.voltha.ID\x1a\x14.voltha.LogicalPorts\"!\x82\xd3\xe4\x93\x02\x1b\x12\x19/local/devices/{id}/ports\x12\x65\n\x0fUpdateFlowTable\x12\x17.voltha.FlowTableUpdate\x1a\x13.voltha.NullMessage\"$\x82\xd3\xe4\x93\x02\x1e\"\x19/local/devices/{id}/flows:\x01*\x12O\n\x0fListDeviceFlows\x12\n.voltha.ID\x1a\r.voltha.Flows\"!\x82\xd3\xe4\x93\x02\x1b\x12\x19/local/devices/{id}/flows\x12S\n\x10\x43reateSubscriber\x12\x12.voltha.Subscriber\x1a\x12.voltha.Subscriber\"\x17\x82\xd3\xe4\x93\x02\x11\"\x0c/subscribers:\x01*\x12J\n\rGetSubscriber\x12\n.voltha.ID\x1a\x12.voltha.Subscriber\"\x19\x82\xd3\xe4\x93\x02\x13\x12\x11/subscribers/{id}\x12X\n\x10UpdateSubscriber\x12\x12.voltha.Subscriber\x1a\x12.voltha.Subscriber\"\x1c\x82\xd3\xe4\x93\x02\x16\x32\x11/subscribers/{id}:\x01*\x12N\n\x10\x44\x65leteSubscriber\x12\n.voltha.ID\x1a\x13.voltha.NullMessage\"\x19\x82\xd3\xe4\x93\x02\x13*\x11/subscribers/{id}\x12Q\n\x0fListSubscribers\x12\x13.voltha.NullMessage\x1a\x13.voltha.Subscribers\"\x14\x82\xd3\xe4\x93\x02\x0e\x12\x0c/subscribers2\x85\x03\n\x0e\x45xampleService\x12H\n\rCreateAddress\x12\x0f.voltha.Address\x1a\x0f.voltha.Address\"\x15\x82\xd3\xe4\x93\x02\x0f\"\n/addresses:\x01*\x12\x42\n\nGetAddress\x12\n.voltha.ID\x1a\x0f.voltha.Address\"\x17\x82\xd3\xe4\x93\x02\x11\x12\x0f/addresses/{id}\x12M\n\rUpdateAddress\x12\x0f.voltha.Address\x1a\x0f.voltha.Address\"\x1a\x82\xd3\xe4\x93\x02\x14\x32\x0f/addresses/{id}:\x01*\x12I\n\rDeleteAddress\x12\n.voltha.ID\x1a\x13.voltha.NullMessage\"\x17\x82\xd3\xe4\x93\x02\x11*\x0f/addresses/{id}\x12K\n\rListAddresses\x12\x13.voltha.NullMessage\x1a\x11.voltha.Addresses\"\x12\x82\xd3\xe4\x93\x02\x0c\x12\n/addresses2\xfd\x04\n\x08OpenFlow\x12<\n\x08GetHello\x12\x16.openflow_13.ofp_hello\x1a\x16.openflow_13.ofp_hello\"\x00\x12\x41\n\x0b\x45\x63hoRequest\x12\x17.openflow_13.ofp_header\x1a\x17.openflow_13.ofp_header\"\x00\x12\x63\n\x13\x45xperimenterRequest\x12$.openflow_13.ofp_experimenter_header\x1a$.openflow_13.ofp_experimenter_header\"\x00\x12P\n\x11GetSwitchFeatures\x12\x17.openflow_13.ofp_header\x1a .openflow_13.ofp_switch_features\"\x00\x12L\n\x0fGetSwitchConfig\x12\x17.openflow_13.ofp_header\x1a\x1e.openflow_13.ofp_switch_config\"\x00\x12\x46\n\tSetConfig\x12\x1e.openflow_13.ofp_switch_config\x1a\x17.openflow_13.ofp_header\"\x00\x12R\n\x17ReceivePacketInMessages\x12\x17.openflow_13.ofp_header\x1a\x1a.openflow_13.ofp_packet_in\"\x00\x30\x01\x12O\n\x15SendPacketOutMessages\x12\x1b.openflow_13.ofp_packet_out\x1a\x17.openflow_13.ofp_header\"\x00\x42<\n\x13org.opencord.volthaB\x0cVolthaProtos\xaa\x02\x16Opencord.Voltha.Volthab\x06proto3')
+  ,
+  dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,openflow__13__pb2.DESCRIPTOR,])
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+
+
+_HEALTHSTATUS_HEALTHSTATE = _descriptor.EnumDescriptor(
+  name='HealthState',
+  full_name='voltha.HealthStatus.HealthState',
+  filename=None,
+  file=DESCRIPTOR,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='HEALTHY', index=0, number=0,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='OVERLOADED', index=1, number=1,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='DYING', index=2, number=2,
+      options=None,
+      type=None),
+  ],
+  containing_type=None,
+  options=None,
+  serialized_start=153,
+  serialized_end=206,
+)
+_sym_db.RegisterEnumDescriptor(_HEALTHSTATUS_HEALTHSTATE)
+
+
+_NULLMESSAGE = _descriptor.Descriptor(
+  name='NullMessage',
+  full_name='voltha.NullMessage',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=73,
+  serialized_end=86,
+)
+
+
+_HEALTHSTATUS = _descriptor.Descriptor(
+  name='HealthStatus',
+  full_name='voltha.HealthStatus',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='state', full_name='voltha.HealthStatus.state', index=0,
+      number=1, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+    _HEALTHSTATUS_HEALTHSTATE,
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=88,
+  serialized_end=206,
+)
+
+
+_ADDRESS = _descriptor.Descriptor(
+  name='Address',
+  full_name='voltha.Address',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='voltha.Address.id', index=0,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='street', full_name='voltha.Address.street', index=1,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='street2', full_name='voltha.Address.street2', index=2,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='street3', full_name='voltha.Address.street3', index=3,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='city', full_name='voltha.Address.city', index=4,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='state', full_name='voltha.Address.state', index=5,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='zip', full_name='voltha.Address.zip', index=6,
+      number=6, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=208,
+  serialized_end=321,
+)
+
+
+_ADDRESSES = _descriptor.Descriptor(
+  name='Addresses',
+  full_name='voltha.Addresses',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='addresses', full_name='voltha.Addresses.addresses', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=323,
+  serialized_end=370,
+)
+
+
+_MORECOMPLEX = _descriptor.Descriptor(
+  name='MoreComplex',
+  full_name='voltha.MoreComplex',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='health', full_name='voltha.MoreComplex.health', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='foo_counter', full_name='voltha.MoreComplex.foo_counter', index=1,
+      number=2, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='voltha.MoreComplex.name', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='children', full_name='voltha.MoreComplex.children', index=3,
+      number=4, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='address', full_name='voltha.MoreComplex.address', index=4,
+      number=5, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=373,
+  serialized_end=532,
+)
+
+
+_ID = _descriptor.Descriptor(
+  name='ID',
+  full_name='voltha.ID',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='voltha.ID.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=534,
+  serialized_end=550,
+)
+
+
+_SUBSCRIBER = _descriptor.Descriptor(
+  name='Subscriber',
+  full_name='voltha.Subscriber',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='voltha.Subscriber.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=552,
+  serialized_end=576,
+)
+
+
+_SUBSCRIBERS = _descriptor.Descriptor(
+  name='Subscribers',
+  full_name='voltha.Subscribers',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='items', full_name='voltha.Subscribers.items', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=578,
+  serialized_end=626,
+)
+
+
+_LOGICALDEVICE = _descriptor.Descriptor(
+  name='LogicalDevice',
+  full_name='voltha.LogicalDevice',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='voltha.LogicalDevice.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='datapath_id', full_name='voltha.LogicalDevice.datapath_id', index=1,
+      number=2, type=4, cpp_type=4, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='desc', full_name='voltha.LogicalDevice.desc', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=628,
+  serialized_end=713,
+)
+
+
+_LOGICALDEVICES = _descriptor.Descriptor(
+  name='LogicalDevices',
+  full_name='voltha.LogicalDevices',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='items', full_name='voltha.LogicalDevices.items', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=715,
+  serialized_end=769,
+)
+
+
+_LOGICALPORTS = _descriptor.Descriptor(
+  name='LogicalPorts',
+  full_name='voltha.LogicalPorts',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='items', full_name='voltha.LogicalPorts.items', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=771,
+  serialized_end=823,
+)
+
+
+_LOGICALDEVICEDETAILS = _descriptor.Descriptor(
+  name='LogicalDeviceDetails',
+  full_name='voltha.LogicalDeviceDetails',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='voltha.LogicalDeviceDetails.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='datapath_id', full_name='voltha.LogicalDeviceDetails.datapath_id', index=1,
+      number=2, type=4, cpp_type=4, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='desc', full_name='voltha.LogicalDeviceDetails.desc', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='switch_features', full_name='voltha.LogicalDeviceDetails.switch_features', index=3,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=826,
+  serialized_end=977,
+)
+
+
+_FLOWTABLEUPDATE = _descriptor.Descriptor(
+  name='FlowTableUpdate',
+  full_name='voltha.FlowTableUpdate',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='voltha.FlowTableUpdate.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='flow_mod', full_name='voltha.FlowTableUpdate.flow_mod', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=979,
+  serialized_end=1053,
+)
+
+
+_FLOWS = _descriptor.Descriptor(
+  name='Flows',
+  full_name='voltha.Flows',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='items', full_name='voltha.Flows.items', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1055,
+  serialized_end=1106,
+)
+
+_HEALTHSTATUS.fields_by_name['state'].enum_type = _HEALTHSTATUS_HEALTHSTATE
+_HEALTHSTATUS_HEALTHSTATE.containing_type = _HEALTHSTATUS
+_ADDRESSES.fields_by_name['addresses'].message_type = _ADDRESS
+_MORECOMPLEX.fields_by_name['health'].message_type = _HEALTHSTATUS
+_MORECOMPLEX.fields_by_name['children'].message_type = _MORECOMPLEX
+_MORECOMPLEX.fields_by_name['address'].message_type = _ADDRESS
+_SUBSCRIBERS.fields_by_name['items'].message_type = _SUBSCRIBER
+_LOGICALDEVICE.fields_by_name['desc'].message_type = openflow__13__pb2._OFP_DESC
+_LOGICALDEVICES.fields_by_name['items'].message_type = _LOGICALDEVICE
+_LOGICALPORTS.fields_by_name['items'].message_type = openflow__13__pb2._OFP_PORT
+_LOGICALDEVICEDETAILS.fields_by_name['desc'].message_type = openflow__13__pb2._OFP_DESC
+_LOGICALDEVICEDETAILS.fields_by_name['switch_features'].message_type = openflow__13__pb2._OFP_SWITCH_FEATURES
+_FLOWTABLEUPDATE.fields_by_name['flow_mod'].message_type = openflow__13__pb2._OFP_FLOW_MOD
+_FLOWS.fields_by_name['items'].message_type = openflow__13__pb2._OFP_FLOW_STATS
+DESCRIPTOR.message_types_by_name['NullMessage'] = _NULLMESSAGE
+DESCRIPTOR.message_types_by_name['HealthStatus'] = _HEALTHSTATUS
+DESCRIPTOR.message_types_by_name['Address'] = _ADDRESS
+DESCRIPTOR.message_types_by_name['Addresses'] = _ADDRESSES
+DESCRIPTOR.message_types_by_name['MoreComplex'] = _MORECOMPLEX
+DESCRIPTOR.message_types_by_name['ID'] = _ID
+DESCRIPTOR.message_types_by_name['Subscriber'] = _SUBSCRIBER
+DESCRIPTOR.message_types_by_name['Subscribers'] = _SUBSCRIBERS
+DESCRIPTOR.message_types_by_name['LogicalDevice'] = _LOGICALDEVICE
+DESCRIPTOR.message_types_by_name['LogicalDevices'] = _LOGICALDEVICES
+DESCRIPTOR.message_types_by_name['LogicalPorts'] = _LOGICALPORTS
+DESCRIPTOR.message_types_by_name['LogicalDeviceDetails'] = _LOGICALDEVICEDETAILS
+DESCRIPTOR.message_types_by_name['FlowTableUpdate'] = _FLOWTABLEUPDATE
+DESCRIPTOR.message_types_by_name['Flows'] = _FLOWS
+
+NullMessage = _reflection.GeneratedProtocolMessageType('NullMessage', (_message.Message,), dict(
+  DESCRIPTOR = _NULLMESSAGE,
+  __module__ = 'voltha_pb2'
+  # @@protoc_insertion_point(class_scope:voltha.NullMessage)
+  ))
+_sym_db.RegisterMessage(NullMessage)
+
+HealthStatus = _reflection.GeneratedProtocolMessageType('HealthStatus', (_message.Message,), dict(
+  DESCRIPTOR = _HEALTHSTATUS,
+  __module__ = 'voltha_pb2'
+  # @@protoc_insertion_point(class_scope:voltha.HealthStatus)
+  ))
+_sym_db.RegisterMessage(HealthStatus)
+
+Address = _reflection.GeneratedProtocolMessageType('Address', (_message.Message,), dict(
+  DESCRIPTOR = _ADDRESS,
+  __module__ = 'voltha_pb2'
+  # @@protoc_insertion_point(class_scope:voltha.Address)
+  ))
+_sym_db.RegisterMessage(Address)
+
+Addresses = _reflection.GeneratedProtocolMessageType('Addresses', (_message.Message,), dict(
+  DESCRIPTOR = _ADDRESSES,
+  __module__ = 'voltha_pb2'
+  # @@protoc_insertion_point(class_scope:voltha.Addresses)
+  ))
+_sym_db.RegisterMessage(Addresses)
+
+MoreComplex = _reflection.GeneratedProtocolMessageType('MoreComplex', (_message.Message,), dict(
+  DESCRIPTOR = _MORECOMPLEX,
+  __module__ = 'voltha_pb2'
+  # @@protoc_insertion_point(class_scope:voltha.MoreComplex)
+  ))
+_sym_db.RegisterMessage(MoreComplex)
+
+ID = _reflection.GeneratedProtocolMessageType('ID', (_message.Message,), dict(
+  DESCRIPTOR = _ID,
+  __module__ = 'voltha_pb2'
+  # @@protoc_insertion_point(class_scope:voltha.ID)
+  ))
+_sym_db.RegisterMessage(ID)
+
+Subscriber = _reflection.GeneratedProtocolMessageType('Subscriber', (_message.Message,), dict(
+  DESCRIPTOR = _SUBSCRIBER,
+  __module__ = 'voltha_pb2'
+  # @@protoc_insertion_point(class_scope:voltha.Subscriber)
+  ))
+_sym_db.RegisterMessage(Subscriber)
+
+Subscribers = _reflection.GeneratedProtocolMessageType('Subscribers', (_message.Message,), dict(
+  DESCRIPTOR = _SUBSCRIBERS,
+  __module__ = 'voltha_pb2'
+  # @@protoc_insertion_point(class_scope:voltha.Subscribers)
+  ))
+_sym_db.RegisterMessage(Subscribers)
+
+LogicalDevice = _reflection.GeneratedProtocolMessageType('LogicalDevice', (_message.Message,), dict(
+  DESCRIPTOR = _LOGICALDEVICE,
+  __module__ = 'voltha_pb2'
+  # @@protoc_insertion_point(class_scope:voltha.LogicalDevice)
+  ))
+_sym_db.RegisterMessage(LogicalDevice)
+
+LogicalDevices = _reflection.GeneratedProtocolMessageType('LogicalDevices', (_message.Message,), dict(
+  DESCRIPTOR = _LOGICALDEVICES,
+  __module__ = 'voltha_pb2'
+  # @@protoc_insertion_point(class_scope:voltha.LogicalDevices)
+  ))
+_sym_db.RegisterMessage(LogicalDevices)
+
+LogicalPorts = _reflection.GeneratedProtocolMessageType('LogicalPorts', (_message.Message,), dict(
+  DESCRIPTOR = _LOGICALPORTS,
+  __module__ = 'voltha_pb2'
+  # @@protoc_insertion_point(class_scope:voltha.LogicalPorts)
+  ))
+_sym_db.RegisterMessage(LogicalPorts)
+
+LogicalDeviceDetails = _reflection.GeneratedProtocolMessageType('LogicalDeviceDetails', (_message.Message,), dict(
+  DESCRIPTOR = _LOGICALDEVICEDETAILS,
+  __module__ = 'voltha_pb2'
+  # @@protoc_insertion_point(class_scope:voltha.LogicalDeviceDetails)
+  ))
+_sym_db.RegisterMessage(LogicalDeviceDetails)
+
+FlowTableUpdate = _reflection.GeneratedProtocolMessageType('FlowTableUpdate', (_message.Message,), dict(
+  DESCRIPTOR = _FLOWTABLEUPDATE,
+  __module__ = 'voltha_pb2'
+  # @@protoc_insertion_point(class_scope:voltha.FlowTableUpdate)
+  ))
+_sym_db.RegisterMessage(FlowTableUpdate)
+
+Flows = _reflection.GeneratedProtocolMessageType('Flows', (_message.Message,), dict(
+  DESCRIPTOR = _FLOWS,
+  __module__ = 'voltha_pb2'
+  # @@protoc_insertion_point(class_scope:voltha.Flows)
+  ))
+_sym_db.RegisterMessage(Flows)
+
+
+DESCRIPTOR.has_options = True
+DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\023org.opencord.volthaB\014VolthaProtos\252\002\026Opencord.Voltha.Voltha'))
+import grpc
+from grpc.beta import implementations as beta_implementations
+from grpc.beta import interfaces as beta_interfaces
+from grpc.framework.common import cardinality
+from grpc.framework.interfaces.face import utilities as face_utilities
+
+
+class HealthServiceStub(object):
+  """Health related services
+  """
+
+  def __init__(self, channel):
+    """Constructor.
+
+    Args:
+      channel: A grpc.Channel.
+    """
+    self.GetHealthStatus = channel.unary_unary(
+        '/voltha.HealthService/GetHealthStatus',
+        request_serializer=NullMessage.SerializeToString,
+        response_deserializer=HealthStatus.FromString,
+        )
+
+
+class HealthServiceServicer(object):
+  """Health related services
+  """
+
+  def GetHealthStatus(self, request, context):
+    """Return current health status of a Voltha instance
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+
+def add_HealthServiceServicer_to_server(servicer, server):
+  rpc_method_handlers = {
+      'GetHealthStatus': grpc.unary_unary_rpc_method_handler(
+          servicer.GetHealthStatus,
+          request_deserializer=NullMessage.FromString,
+          response_serializer=HealthStatus.SerializeToString,
+      ),
+  }
+  generic_handler = grpc.method_handlers_generic_handler(
+      'voltha.HealthService', rpc_method_handlers)
+  server.add_generic_rpc_handlers((generic_handler,))
+
+
+class BetaHealthServiceServicer(object):
+  """Health related services
+  """
+  def GetHealthStatus(self, request, context):
+    """Return current health status of a Voltha instance
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+
+
+class BetaHealthServiceStub(object):
+  """Health related services
+  """
+  def GetHealthStatus(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+    """Return current health status of a Voltha instance
+    """
+    raise NotImplementedError()
+  GetHealthStatus.future = None
+
+
+def beta_create_HealthService_server(servicer, pool=None, pool_size=None, default_timeout=None, maximum_timeout=None):
+  request_deserializers = {
+    ('voltha.HealthService', 'GetHealthStatus'): NullMessage.FromString,
+  }
+  response_serializers = {
+    ('voltha.HealthService', 'GetHealthStatus'): HealthStatus.SerializeToString,
+  }
+  method_implementations = {
+    ('voltha.HealthService', 'GetHealthStatus'): face_utilities.unary_unary_inline(servicer.GetHealthStatus),
+  }
+  server_options = beta_implementations.server_options(request_deserializers=request_deserializers, response_serializers=response_serializers, thread_pool=pool, thread_pool_size=pool_size, default_timeout=default_timeout, maximum_timeout=maximum_timeout)
+  return beta_implementations.server(method_implementations, options=server_options)
+
+
+def beta_create_HealthService_stub(channel, host=None, metadata_transformer=None, pool=None, pool_size=None):
+  request_serializers = {
+    ('voltha.HealthService', 'GetHealthStatus'): NullMessage.SerializeToString,
+  }
+  response_deserializers = {
+    ('voltha.HealthService', 'GetHealthStatus'): HealthStatus.FromString,
+  }
+  cardinalities = {
+    'GetHealthStatus': cardinality.Cardinality.UNARY_UNARY,
+  }
+  stub_options = beta_implementations.stub_options(host=host, metadata_transformer=metadata_transformer, request_serializers=request_serializers, response_deserializers=response_deserializers, thread_pool=pool, thread_pool_size=pool_size)
+  return beta_implementations.dynamic_stub(channel, 'voltha.HealthService', cardinalities, options=stub_options)
+
+
+class VolthaLogicalLayerStub(object):
+
+  def __init__(self, channel):
+    """Constructor.
+
+    Args:
+      channel: A grpc.Channel.
+    """
+    self.ListLogicalDevices = channel.unary_unary(
+        '/voltha.VolthaLogicalLayer/ListLogicalDevices',
+        request_serializer=NullMessage.SerializeToString,
+        response_deserializer=LogicalDevices.FromString,
+        )
+    self.GetLogicalDevice = channel.unary_unary(
+        '/voltha.VolthaLogicalLayer/GetLogicalDevice',
+        request_serializer=ID.SerializeToString,
+        response_deserializer=LogicalDeviceDetails.FromString,
+        )
+    self.ListLogicalDevicePorts = channel.unary_unary(
+        '/voltha.VolthaLogicalLayer/ListLogicalDevicePorts',
+        request_serializer=ID.SerializeToString,
+        response_deserializer=LogicalPorts.FromString,
+        )
+    self.UpdateFlowTable = channel.unary_unary(
+        '/voltha.VolthaLogicalLayer/UpdateFlowTable',
+        request_serializer=FlowTableUpdate.SerializeToString,
+        response_deserializer=NullMessage.FromString,
+        )
+    self.ListDeviceFlows = channel.unary_unary(
+        '/voltha.VolthaLogicalLayer/ListDeviceFlows',
+        request_serializer=ID.SerializeToString,
+        response_deserializer=Flows.FromString,
+        )
+    self.CreateSubscriber = channel.unary_unary(
+        '/voltha.VolthaLogicalLayer/CreateSubscriber',
+        request_serializer=Subscriber.SerializeToString,
+        response_deserializer=Subscriber.FromString,
+        )
+    self.GetSubscriber = channel.unary_unary(
+        '/voltha.VolthaLogicalLayer/GetSubscriber',
+        request_serializer=ID.SerializeToString,
+        response_deserializer=Subscriber.FromString,
+        )
+    self.UpdateSubscriber = channel.unary_unary(
+        '/voltha.VolthaLogicalLayer/UpdateSubscriber',
+        request_serializer=Subscriber.SerializeToString,
+        response_deserializer=Subscriber.FromString,
+        )
+    self.DeleteSubscriber = channel.unary_unary(
+        '/voltha.VolthaLogicalLayer/DeleteSubscriber',
+        request_serializer=ID.SerializeToString,
+        response_deserializer=NullMessage.FromString,
+        )
+    self.ListSubscribers = channel.unary_unary(
+        '/voltha.VolthaLogicalLayer/ListSubscribers',
+        request_serializer=NullMessage.SerializeToString,
+        response_deserializer=Subscribers.FromString,
+        )
+
+
+class VolthaLogicalLayerServicer(object):
+
+  def ListLogicalDevices(self, request, context):
+    """List logical devices owned by this Voltha instance
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def GetLogicalDevice(self, request, context):
+    """Get detailed info on logical device owned by this Voltha instance
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def ListLogicalDevicePorts(self, request, context):
+    """List ports of a logical device
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def UpdateFlowTable(self, request, context):
+    """Update flow table for device
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def ListDeviceFlows(self, request, context):
+    """List all flows of a logical device
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def CreateSubscriber(self, request, context):
+    """Create a subscriber record
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def GetSubscriber(self, request, context):
+    """Return an subscriber by ID
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def UpdateSubscriber(self, request, context):
+    """Update an existing subscriber record by ID
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def DeleteSubscriber(self, request, context):
+    """Delete a subscriber record by ID
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def ListSubscribers(self, request, context):
+    """List subscribers
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+
+def add_VolthaLogicalLayerServicer_to_server(servicer, server):
+  rpc_method_handlers = {
+      'ListLogicalDevices': grpc.unary_unary_rpc_method_handler(
+          servicer.ListLogicalDevices,
+          request_deserializer=NullMessage.FromString,
+          response_serializer=LogicalDevices.SerializeToString,
+      ),
+      'GetLogicalDevice': grpc.unary_unary_rpc_method_handler(
+          servicer.GetLogicalDevice,
+          request_deserializer=ID.FromString,
+          response_serializer=LogicalDeviceDetails.SerializeToString,
+      ),
+      'ListLogicalDevicePorts': grpc.unary_unary_rpc_method_handler(
+          servicer.ListLogicalDevicePorts,
+          request_deserializer=ID.FromString,
+          response_serializer=LogicalPorts.SerializeToString,
+      ),
+      'UpdateFlowTable': grpc.unary_unary_rpc_method_handler(
+          servicer.UpdateFlowTable,
+          request_deserializer=FlowTableUpdate.FromString,
+          response_serializer=NullMessage.SerializeToString,
+      ),
+      'ListDeviceFlows': grpc.unary_unary_rpc_method_handler(
+          servicer.ListDeviceFlows,
+          request_deserializer=ID.FromString,
+          response_serializer=Flows.SerializeToString,
+      ),
+      'CreateSubscriber': grpc.unary_unary_rpc_method_handler(
+          servicer.CreateSubscriber,
+          request_deserializer=Subscriber.FromString,
+          response_serializer=Subscriber.SerializeToString,
+      ),
+      'GetSubscriber': grpc.unary_unary_rpc_method_handler(
+          servicer.GetSubscriber,
+          request_deserializer=ID.FromString,
+          response_serializer=Subscriber.SerializeToString,
+      ),
+      'UpdateSubscriber': grpc.unary_unary_rpc_method_handler(
+          servicer.UpdateSubscriber,
+          request_deserializer=Subscriber.FromString,
+          response_serializer=Subscriber.SerializeToString,
+      ),
+      'DeleteSubscriber': grpc.unary_unary_rpc_method_handler(
+          servicer.DeleteSubscriber,
+          request_deserializer=ID.FromString,
+          response_serializer=NullMessage.SerializeToString,
+      ),
+      'ListSubscribers': grpc.unary_unary_rpc_method_handler(
+          servicer.ListSubscribers,
+          request_deserializer=NullMessage.FromString,
+          response_serializer=Subscribers.SerializeToString,
+      ),
+  }
+  generic_handler = grpc.method_handlers_generic_handler(
+      'voltha.VolthaLogicalLayer', rpc_method_handlers)
+  server.add_generic_rpc_handlers((generic_handler,))
+
+
+class BetaVolthaLogicalLayerServicer(object):
+  def ListLogicalDevices(self, request, context):
+    """List logical devices owned by this Voltha instance
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+  def GetLogicalDevice(self, request, context):
+    """Get detailed info on logical device owned by this Voltha instance
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+  def ListLogicalDevicePorts(self, request, context):
+    """List ports of a logical device
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+  def UpdateFlowTable(self, request, context):
+    """Update flow table for device
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+  def ListDeviceFlows(self, request, context):
+    """List all flows of a logical device
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+  def CreateSubscriber(self, request, context):
+    """Create a subscriber record
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+  def GetSubscriber(self, request, context):
+    """Return an subscriber by ID
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+  def UpdateSubscriber(self, request, context):
+    """Update an existing subscriber record by ID
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+  def DeleteSubscriber(self, request, context):
+    """Delete a subscriber record by ID
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+  def ListSubscribers(self, request, context):
+    """List subscribers
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+
+
+class BetaVolthaLogicalLayerStub(object):
+  def ListLogicalDevices(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+    """List logical devices owned by this Voltha instance
+    """
+    raise NotImplementedError()
+  ListLogicalDevices.future = None
+  def GetLogicalDevice(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+    """Get detailed info on logical device owned by this Voltha instance
+    """
+    raise NotImplementedError()
+  GetLogicalDevice.future = None
+  def ListLogicalDevicePorts(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+    """List ports of a logical device
+    """
+    raise NotImplementedError()
+  ListLogicalDevicePorts.future = None
+  def UpdateFlowTable(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+    """Update flow table for device
+    """
+    raise NotImplementedError()
+  UpdateFlowTable.future = None
+  def ListDeviceFlows(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+    """List all flows of a logical device
+    """
+    raise NotImplementedError()
+  ListDeviceFlows.future = None
+  def CreateSubscriber(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+    """Create a subscriber record
+    """
+    raise NotImplementedError()
+  CreateSubscriber.future = None
+  def GetSubscriber(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+    """Return an subscriber by ID
+    """
+    raise NotImplementedError()
+  GetSubscriber.future = None
+  def UpdateSubscriber(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+    """Update an existing subscriber record by ID
+    """
+    raise NotImplementedError()
+  UpdateSubscriber.future = None
+  def DeleteSubscriber(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+    """Delete a subscriber record by ID
+    """
+    raise NotImplementedError()
+  DeleteSubscriber.future = None
+  def ListSubscribers(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+    """List subscribers
+    """
+    raise NotImplementedError()
+  ListSubscribers.future = None
+
+
+def beta_create_VolthaLogicalLayer_server(servicer, pool=None, pool_size=None, default_timeout=None, maximum_timeout=None):
+  request_deserializers = {
+    ('voltha.VolthaLogicalLayer', 'CreateSubscriber'): Subscriber.FromString,
+    ('voltha.VolthaLogicalLayer', 'DeleteSubscriber'): ID.FromString,
+    ('voltha.VolthaLogicalLayer', 'GetLogicalDevice'): ID.FromString,
+    ('voltha.VolthaLogicalLayer', 'GetSubscriber'): ID.FromString,
+    ('voltha.VolthaLogicalLayer', 'ListDeviceFlows'): ID.FromString,
+    ('voltha.VolthaLogicalLayer', 'ListLogicalDevicePorts'): ID.FromString,
+    ('voltha.VolthaLogicalLayer', 'ListLogicalDevices'): NullMessage.FromString,
+    ('voltha.VolthaLogicalLayer', 'ListSubscribers'): NullMessage.FromString,
+    ('voltha.VolthaLogicalLayer', 'UpdateFlowTable'): FlowTableUpdate.FromString,
+    ('voltha.VolthaLogicalLayer', 'UpdateSubscriber'): Subscriber.FromString,
+  }
+  response_serializers = {
+    ('voltha.VolthaLogicalLayer', 'CreateSubscriber'): Subscriber.SerializeToString,
+    ('voltha.VolthaLogicalLayer', 'DeleteSubscriber'): NullMessage.SerializeToString,
+    ('voltha.VolthaLogicalLayer', 'GetLogicalDevice'): LogicalDeviceDetails.SerializeToString,
+    ('voltha.VolthaLogicalLayer', 'GetSubscriber'): Subscriber.SerializeToString,
+    ('voltha.VolthaLogicalLayer', 'ListDeviceFlows'): Flows.SerializeToString,
+    ('voltha.VolthaLogicalLayer', 'ListLogicalDevicePorts'): LogicalPorts.SerializeToString,
+    ('voltha.VolthaLogicalLayer', 'ListLogicalDevices'): LogicalDevices.SerializeToString,
+    ('voltha.VolthaLogicalLayer', 'ListSubscribers'): Subscribers.SerializeToString,
+    ('voltha.VolthaLogicalLayer', 'UpdateFlowTable'): NullMessage.SerializeToString,
+    ('voltha.VolthaLogicalLayer', 'UpdateSubscriber'): Subscriber.SerializeToString,
+  }
+  method_implementations = {
+    ('voltha.VolthaLogicalLayer', 'CreateSubscriber'): face_utilities.unary_unary_inline(servicer.CreateSubscriber),
+    ('voltha.VolthaLogicalLayer', 'DeleteSubscriber'): face_utilities.unary_unary_inline(servicer.DeleteSubscriber),
+    ('voltha.VolthaLogicalLayer', 'GetLogicalDevice'): face_utilities.unary_unary_inline(servicer.GetLogicalDevice),
+    ('voltha.VolthaLogicalLayer', 'GetSubscriber'): face_utilities.unary_unary_inline(servicer.GetSubscriber),
+    ('voltha.VolthaLogicalLayer', 'ListDeviceFlows'): face_utilities.unary_unary_inline(servicer.ListDeviceFlows),
+    ('voltha.VolthaLogicalLayer', 'ListLogicalDevicePorts'): face_utilities.unary_unary_inline(servicer.ListLogicalDevicePorts),
+    ('voltha.VolthaLogicalLayer', 'ListLogicalDevices'): face_utilities.unary_unary_inline(servicer.ListLogicalDevices),
+    ('voltha.VolthaLogicalLayer', 'ListSubscribers'): face_utilities.unary_unary_inline(servicer.ListSubscribers),
+    ('voltha.VolthaLogicalLayer', 'UpdateFlowTable'): face_utilities.unary_unary_inline(servicer.UpdateFlowTable),
+    ('voltha.VolthaLogicalLayer', 'UpdateSubscriber'): face_utilities.unary_unary_inline(servicer.UpdateSubscriber),
+  }
+  server_options = beta_implementations.server_options(request_deserializers=request_deserializers, response_serializers=response_serializers, thread_pool=pool, thread_pool_size=pool_size, default_timeout=default_timeout, maximum_timeout=maximum_timeout)
+  return beta_implementations.server(method_implementations, options=server_options)
+
+
+def beta_create_VolthaLogicalLayer_stub(channel, host=None, metadata_transformer=None, pool=None, pool_size=None):
+  request_serializers = {
+    ('voltha.VolthaLogicalLayer', 'CreateSubscriber'): Subscriber.SerializeToString,
+    ('voltha.VolthaLogicalLayer', 'DeleteSubscriber'): ID.SerializeToString,
+    ('voltha.VolthaLogicalLayer', 'GetLogicalDevice'): ID.SerializeToString,
+    ('voltha.VolthaLogicalLayer', 'GetSubscriber'): ID.SerializeToString,
+    ('voltha.VolthaLogicalLayer', 'ListDeviceFlows'): ID.SerializeToString,
+    ('voltha.VolthaLogicalLayer', 'ListLogicalDevicePorts'): ID.SerializeToString,
+    ('voltha.VolthaLogicalLayer', 'ListLogicalDevices'): NullMessage.SerializeToString,
+    ('voltha.VolthaLogicalLayer', 'ListSubscribers'): NullMessage.SerializeToString,
+    ('voltha.VolthaLogicalLayer', 'UpdateFlowTable'): FlowTableUpdate.SerializeToString,
+    ('voltha.VolthaLogicalLayer', 'UpdateSubscriber'): Subscriber.SerializeToString,
+  }
+  response_deserializers = {
+    ('voltha.VolthaLogicalLayer', 'CreateSubscriber'): Subscriber.FromString,
+    ('voltha.VolthaLogicalLayer', 'DeleteSubscriber'): NullMessage.FromString,
+    ('voltha.VolthaLogicalLayer', 'GetLogicalDevice'): LogicalDeviceDetails.FromString,
+    ('voltha.VolthaLogicalLayer', 'GetSubscriber'): Subscriber.FromString,
+    ('voltha.VolthaLogicalLayer', 'ListDeviceFlows'): Flows.FromString,
+    ('voltha.VolthaLogicalLayer', 'ListLogicalDevicePorts'): LogicalPorts.FromString,
+    ('voltha.VolthaLogicalLayer', 'ListLogicalDevices'): LogicalDevices.FromString,
+    ('voltha.VolthaLogicalLayer', 'ListSubscribers'): Subscribers.FromString,
+    ('voltha.VolthaLogicalLayer', 'UpdateFlowTable'): NullMessage.FromString,
+    ('voltha.VolthaLogicalLayer', 'UpdateSubscriber'): Subscriber.FromString,
+  }
+  cardinalities = {
+    'CreateSubscriber': cardinality.Cardinality.UNARY_UNARY,
+    'DeleteSubscriber': cardinality.Cardinality.UNARY_UNARY,
+    'GetLogicalDevice': cardinality.Cardinality.UNARY_UNARY,
+    'GetSubscriber': cardinality.Cardinality.UNARY_UNARY,
+    'ListDeviceFlows': cardinality.Cardinality.UNARY_UNARY,
+    'ListLogicalDevicePorts': cardinality.Cardinality.UNARY_UNARY,
+    'ListLogicalDevices': cardinality.Cardinality.UNARY_UNARY,
+    'ListSubscribers': cardinality.Cardinality.UNARY_UNARY,
+    'UpdateFlowTable': cardinality.Cardinality.UNARY_UNARY,
+    'UpdateSubscriber': cardinality.Cardinality.UNARY_UNARY,
+  }
+  stub_options = beta_implementations.stub_options(host=host, metadata_transformer=metadata_transformer, request_serializers=request_serializers, response_deserializers=response_deserializers, thread_pool=pool, thread_pool_size=pool_size)
+  return beta_implementations.dynamic_stub(channel, 'voltha.VolthaLogicalLayer', cardinalities, options=stub_options)
+
+
+class ExampleServiceStub(object):
+  """(placeholder) This is an example service
+  """
+
+  def __init__(self, channel):
+    """Constructor.
+
+    Args:
+      channel: A grpc.Channel.
+    """
+    self.CreateAddress = channel.unary_unary(
+        '/voltha.ExampleService/CreateAddress',
+        request_serializer=Address.SerializeToString,
+        response_deserializer=Address.FromString,
+        )
+    self.GetAddress = channel.unary_unary(
+        '/voltha.ExampleService/GetAddress',
+        request_serializer=ID.SerializeToString,
+        response_deserializer=Address.FromString,
+        )
+    self.UpdateAddress = channel.unary_unary(
+        '/voltha.ExampleService/UpdateAddress',
+        request_serializer=Address.SerializeToString,
+        response_deserializer=Address.FromString,
+        )
+    self.DeleteAddress = channel.unary_unary(
+        '/voltha.ExampleService/DeleteAddress',
+        request_serializer=ID.SerializeToString,
+        response_deserializer=NullMessage.FromString,
+        )
+    self.ListAddresses = channel.unary_unary(
+        '/voltha.ExampleService/ListAddresses',
+        request_serializer=NullMessage.SerializeToString,
+        response_deserializer=Addresses.FromString,
+        )
+
+
+class ExampleServiceServicer(object):
+  """(placeholder) This is an example service
+  """
+
+  def CreateAddress(self, request, context):
+    """Create an address record
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def GetAddress(self, request, context):
+    """Return an address by ID
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def UpdateAddress(self, request, context):
+    """Update an existing address record by ID
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def DeleteAddress(self, request, context):
+    """Delete an address record by ID
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def ListAddresses(self, request, context):
+    """Return a bit more complex objects
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+
+def add_ExampleServiceServicer_to_server(servicer, server):
+  rpc_method_handlers = {
+      'CreateAddress': grpc.unary_unary_rpc_method_handler(
+          servicer.CreateAddress,
+          request_deserializer=Address.FromString,
+          response_serializer=Address.SerializeToString,
+      ),
+      'GetAddress': grpc.unary_unary_rpc_method_handler(
+          servicer.GetAddress,
+          request_deserializer=ID.FromString,
+          response_serializer=Address.SerializeToString,
+      ),
+      'UpdateAddress': grpc.unary_unary_rpc_method_handler(
+          servicer.UpdateAddress,
+          request_deserializer=Address.FromString,
+          response_serializer=Address.SerializeToString,
+      ),
+      'DeleteAddress': grpc.unary_unary_rpc_method_handler(
+          servicer.DeleteAddress,
+          request_deserializer=ID.FromString,
+          response_serializer=NullMessage.SerializeToString,
+      ),
+      'ListAddresses': grpc.unary_unary_rpc_method_handler(
+          servicer.ListAddresses,
+          request_deserializer=NullMessage.FromString,
+          response_serializer=Addresses.SerializeToString,
+      ),
+  }
+  generic_handler = grpc.method_handlers_generic_handler(
+      'voltha.ExampleService', rpc_method_handlers)
+  server.add_generic_rpc_handlers((generic_handler,))
+
+
+class BetaExampleServiceServicer(object):
+  """(placeholder) This is an example service
+  """
+  def CreateAddress(self, request, context):
+    """Create an address record
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+  def GetAddress(self, request, context):
+    """Return an address by ID
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+  def UpdateAddress(self, request, context):
+    """Update an existing address record by ID
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+  def DeleteAddress(self, request, context):
+    """Delete an address record by ID
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+  def ListAddresses(self, request, context):
+    """Return a bit more complex objects
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+
+
+class BetaExampleServiceStub(object):
+  """(placeholder) This is an example service
+  """
+  def CreateAddress(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+    """Create an address record
+    """
+    raise NotImplementedError()
+  CreateAddress.future = None
+  def GetAddress(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+    """Return an address by ID
+    """
+    raise NotImplementedError()
+  GetAddress.future = None
+  def UpdateAddress(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+    """Update an existing address record by ID
+    """
+    raise NotImplementedError()
+  UpdateAddress.future = None
+  def DeleteAddress(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+    """Delete an address record by ID
+    """
+    raise NotImplementedError()
+  DeleteAddress.future = None
+  def ListAddresses(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+    """Return a bit more complex objects
+    """
+    raise NotImplementedError()
+  ListAddresses.future = None
+
+
+def beta_create_ExampleService_server(servicer, pool=None, pool_size=None, default_timeout=None, maximum_timeout=None):
+  request_deserializers = {
+    ('voltha.ExampleService', 'CreateAddress'): Address.FromString,
+    ('voltha.ExampleService', 'DeleteAddress'): ID.FromString,
+    ('voltha.ExampleService', 'GetAddress'): ID.FromString,
+    ('voltha.ExampleService', 'ListAddresses'): NullMessage.FromString,
+    ('voltha.ExampleService', 'UpdateAddress'): Address.FromString,
+  }
+  response_serializers = {
+    ('voltha.ExampleService', 'CreateAddress'): Address.SerializeToString,
+    ('voltha.ExampleService', 'DeleteAddress'): NullMessage.SerializeToString,
+    ('voltha.ExampleService', 'GetAddress'): Address.SerializeToString,
+    ('voltha.ExampleService', 'ListAddresses'): Addresses.SerializeToString,
+    ('voltha.ExampleService', 'UpdateAddress'): Address.SerializeToString,
+  }
+  method_implementations = {
+    ('voltha.ExampleService', 'CreateAddress'): face_utilities.unary_unary_inline(servicer.CreateAddress),
+    ('voltha.ExampleService', 'DeleteAddress'): face_utilities.unary_unary_inline(servicer.DeleteAddress),
+    ('voltha.ExampleService', 'GetAddress'): face_utilities.unary_unary_inline(servicer.GetAddress),
+    ('voltha.ExampleService', 'ListAddresses'): face_utilities.unary_unary_inline(servicer.ListAddresses),
+    ('voltha.ExampleService', 'UpdateAddress'): face_utilities.unary_unary_inline(servicer.UpdateAddress),
+  }
+  server_options = beta_implementations.server_options(request_deserializers=request_deserializers, response_serializers=response_serializers, thread_pool=pool, thread_pool_size=pool_size, default_timeout=default_timeout, maximum_timeout=maximum_timeout)
+  return beta_implementations.server(method_implementations, options=server_options)
+
+
+def beta_create_ExampleService_stub(channel, host=None, metadata_transformer=None, pool=None, pool_size=None):
+  request_serializers = {
+    ('voltha.ExampleService', 'CreateAddress'): Address.SerializeToString,
+    ('voltha.ExampleService', 'DeleteAddress'): ID.SerializeToString,
+    ('voltha.ExampleService', 'GetAddress'): ID.SerializeToString,
+    ('voltha.ExampleService', 'ListAddresses'): NullMessage.SerializeToString,
+    ('voltha.ExampleService', 'UpdateAddress'): Address.SerializeToString,
+  }
+  response_deserializers = {
+    ('voltha.ExampleService', 'CreateAddress'): Address.FromString,
+    ('voltha.ExampleService', 'DeleteAddress'): NullMessage.FromString,
+    ('voltha.ExampleService', 'GetAddress'): Address.FromString,
+    ('voltha.ExampleService', 'ListAddresses'): Addresses.FromString,
+    ('voltha.ExampleService', 'UpdateAddress'): Address.FromString,
+  }
+  cardinalities = {
+    'CreateAddress': cardinality.Cardinality.UNARY_UNARY,
+    'DeleteAddress': cardinality.Cardinality.UNARY_UNARY,
+    'GetAddress': cardinality.Cardinality.UNARY_UNARY,
+    'ListAddresses': cardinality.Cardinality.UNARY_UNARY,
+    'UpdateAddress': cardinality.Cardinality.UNARY_UNARY,
+  }
+  stub_options = beta_implementations.stub_options(host=host, metadata_transformer=metadata_transformer, request_serializers=request_serializers, response_deserializers=response_deserializers, thread_pool=pool, thread_pool_size=pool_size)
+  return beta_implementations.dynamic_stub(channel, 'voltha.ExampleService', cardinalities, options=stub_options)
+
+
+class OpenFlowStub(object):
+
+  def __init__(self, channel):
+    """Constructor.
+
+    Args:
+      channel: A grpc.Channel.
+    """
+    self.GetHello = channel.unary_unary(
+        '/voltha.OpenFlow/GetHello',
+        request_serializer=openflow__13__pb2.ofp_hello.SerializeToString,
+        response_deserializer=openflow__13__pb2.ofp_hello.FromString,
+        )
+    self.EchoRequest = channel.unary_unary(
+        '/voltha.OpenFlow/EchoRequest',
+        request_serializer=openflow__13__pb2.ofp_header.SerializeToString,
+        response_deserializer=openflow__13__pb2.ofp_header.FromString,
+        )
+    self.ExperimenterRequest = channel.unary_unary(
+        '/voltha.OpenFlow/ExperimenterRequest',
+        request_serializer=openflow__13__pb2.ofp_experimenter_header.SerializeToString,
+        response_deserializer=openflow__13__pb2.ofp_experimenter_header.FromString,
+        )
+    self.GetSwitchFeatures = channel.unary_unary(
+        '/voltha.OpenFlow/GetSwitchFeatures',
+        request_serializer=openflow__13__pb2.ofp_header.SerializeToString,
+        response_deserializer=openflow__13__pb2.ofp_switch_features.FromString,
+        )
+    self.GetSwitchConfig = channel.unary_unary(
+        '/voltha.OpenFlow/GetSwitchConfig',
+        request_serializer=openflow__13__pb2.ofp_header.SerializeToString,
+        response_deserializer=openflow__13__pb2.ofp_switch_config.FromString,
+        )
+    self.SetConfig = channel.unary_unary(
+        '/voltha.OpenFlow/SetConfig',
+        request_serializer=openflow__13__pb2.ofp_switch_config.SerializeToString,
+        response_deserializer=openflow__13__pb2.ofp_header.FromString,
+        )
+    self.ReceivePacketInMessages = channel.unary_stream(
+        '/voltha.OpenFlow/ReceivePacketInMessages',
+        request_serializer=openflow__13__pb2.ofp_header.SerializeToString,
+        response_deserializer=openflow__13__pb2.ofp_packet_in.FromString,
+        )
+    self.SendPacketOutMessages = channel.unary_unary(
+        '/voltha.OpenFlow/SendPacketOutMessages',
+        request_serializer=openflow__13__pb2.ofp_packet_out.SerializeToString,
+        response_deserializer=openflow__13__pb2.ofp_header.FromString,
+        )
+
+
+class OpenFlowServicer(object):
+
+  def GetHello(self, request, context):
+    """
+    Hello message handshake, initiated by the client (controller)
+    TODO http option
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def EchoRequest(self, request, context):
+    """
+    Echo request / reply, initiated by the client (controller)
+    TODO http option
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def ExperimenterRequest(self, request, context):
+    """
+    Experimental (extension) RPC
+    TODO http option
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def GetSwitchFeatures(self, request, context):
+    """
+    Get Switch Features
+    TODO http option
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def GetSwitchConfig(self, request, context):
+    """
+    Get Switch Config
+    TODO http option
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def SetConfig(self, request, context):
+    """
+    Set Config
+    TODO http option
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def ReceivePacketInMessages(self, request, context):
+    """
+    Receive Packet-In messages
+    TODO http option
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def SendPacketOutMessages(self, request, context):
+    """
+    Send Packet-Out messages
+    TODO http option
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+
+def add_OpenFlowServicer_to_server(servicer, server):
+  rpc_method_handlers = {
+      'GetHello': grpc.unary_unary_rpc_method_handler(
+          servicer.GetHello,
+          request_deserializer=openflow__13__pb2.ofp_hello.FromString,
+          response_serializer=openflow__13__pb2.ofp_hello.SerializeToString,
+      ),
+      'EchoRequest': grpc.unary_unary_rpc_method_handler(
+          servicer.EchoRequest,
+          request_deserializer=openflow__13__pb2.ofp_header.FromString,
+          response_serializer=openflow__13__pb2.ofp_header.SerializeToString,
+      ),
+      'ExperimenterRequest': grpc.unary_unary_rpc_method_handler(
+          servicer.ExperimenterRequest,
+          request_deserializer=openflow__13__pb2.ofp_experimenter_header.FromString,
+          response_serializer=openflow__13__pb2.ofp_experimenter_header.SerializeToString,
+      ),
+      'GetSwitchFeatures': grpc.unary_unary_rpc_method_handler(
+          servicer.GetSwitchFeatures,
+          request_deserializer=openflow__13__pb2.ofp_header.FromString,
+          response_serializer=openflow__13__pb2.ofp_switch_features.SerializeToString,
+      ),
+      'GetSwitchConfig': grpc.unary_unary_rpc_method_handler(
+          servicer.GetSwitchConfig,
+          request_deserializer=openflow__13__pb2.ofp_header.FromString,
+          response_serializer=openflow__13__pb2.ofp_switch_config.SerializeToString,
+      ),
+      'SetConfig': grpc.unary_unary_rpc_method_handler(
+          servicer.SetConfig,
+          request_deserializer=openflow__13__pb2.ofp_switch_config.FromString,
+          response_serializer=openflow__13__pb2.ofp_header.SerializeToString,
+      ),
+      'ReceivePacketInMessages': grpc.unary_stream_rpc_method_handler(
+          servicer.ReceivePacketInMessages,
+          request_deserializer=openflow__13__pb2.ofp_header.FromString,
+          response_serializer=openflow__13__pb2.ofp_packet_in.SerializeToString,
+      ),
+      'SendPacketOutMessages': grpc.unary_unary_rpc_method_handler(
+          servicer.SendPacketOutMessages,
+          request_deserializer=openflow__13__pb2.ofp_packet_out.FromString,
+          response_serializer=openflow__13__pb2.ofp_header.SerializeToString,
+      ),
+  }
+  generic_handler = grpc.method_handlers_generic_handler(
+      'voltha.OpenFlow', rpc_method_handlers)
+  server.add_generic_rpc_handlers((generic_handler,))
+
+
+class BetaOpenFlowServicer(object):
+  def GetHello(self, request, context):
+    """
+    Hello message handshake, initiated by the client (controller)
+    TODO http option
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+  def EchoRequest(self, request, context):
+    """
+    Echo request / reply, initiated by the client (controller)
+    TODO http option
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+  def ExperimenterRequest(self, request, context):
+    """
+    Experimental (extension) RPC
+    TODO http option
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+  def GetSwitchFeatures(self, request, context):
+    """
+    Get Switch Features
+    TODO http option
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+  def GetSwitchConfig(self, request, context):
+    """
+    Get Switch Config
+    TODO http option
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+  def SetConfig(self, request, context):
+    """
+    Set Config
+    TODO http option
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+  def ReceivePacketInMessages(self, request, context):
+    """
+    Receive Packet-In messages
+    TODO http option
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+  def SendPacketOutMessages(self, request, context):
+    """
+    Send Packet-Out messages
+    TODO http option
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+
+
+class BetaOpenFlowStub(object):
+  def GetHello(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+    """
+    Hello message handshake, initiated by the client (controller)
+    TODO http option
+    """
+    raise NotImplementedError()
+  GetHello.future = None
+  def EchoRequest(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+    """
+    Echo request / reply, initiated by the client (controller)
+    TODO http option
+    """
+    raise NotImplementedError()
+  EchoRequest.future = None
+  def ExperimenterRequest(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+    """
+    Experimental (extension) RPC
+    TODO http option
+    """
+    raise NotImplementedError()
+  ExperimenterRequest.future = None
+  def GetSwitchFeatures(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+    """
+    Get Switch Features
+    TODO http option
+    """
+    raise NotImplementedError()
+  GetSwitchFeatures.future = None
+  def GetSwitchConfig(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+    """
+    Get Switch Config
+    TODO http option
+    """
+    raise NotImplementedError()
+  GetSwitchConfig.future = None
+  def SetConfig(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+    """
+    Set Config
+    TODO http option
+    """
+    raise NotImplementedError()
+  SetConfig.future = None
+  def ReceivePacketInMessages(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+    """
+    Receive Packet-In messages
+    TODO http option
+    """
+    raise NotImplementedError()
+  def SendPacketOutMessages(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+    """
+    Send Packet-Out messages
+    TODO http option
+    """
+    raise NotImplementedError()
+  SendPacketOutMessages.future = None
+
+
+def beta_create_OpenFlow_server(servicer, pool=None, pool_size=None, default_timeout=None, maximum_timeout=None):
+  request_deserializers = {
+    ('voltha.OpenFlow', 'EchoRequest'): openflow__13__pb2.ofp_header.FromString,
+    ('voltha.OpenFlow', 'ExperimenterRequest'): openflow__13__pb2.ofp_experimenter_header.FromString,
+    ('voltha.OpenFlow', 'GetHello'): openflow__13__pb2.ofp_hello.FromString,
+    ('voltha.OpenFlow', 'GetSwitchConfig'): openflow__13__pb2.ofp_header.FromString,
+    ('voltha.OpenFlow', 'GetSwitchFeatures'): openflow__13__pb2.ofp_header.FromString,
+    ('voltha.OpenFlow', 'ReceivePacketInMessages'): openflow__13__pb2.ofp_header.FromString,
+    ('voltha.OpenFlow', 'SendPacketOutMessages'): openflow__13__pb2.ofp_packet_out.FromString,
+    ('voltha.OpenFlow', 'SetConfig'): openflow__13__pb2.ofp_switch_config.FromString,
+  }
+  response_serializers = {
+    ('voltha.OpenFlow', 'EchoRequest'): openflow__13__pb2.ofp_header.SerializeToString,
+    ('voltha.OpenFlow', 'ExperimenterRequest'): openflow__13__pb2.ofp_experimenter_header.SerializeToString,
+    ('voltha.OpenFlow', 'GetHello'): openflow__13__pb2.ofp_hello.SerializeToString,
+    ('voltha.OpenFlow', 'GetSwitchConfig'): openflow__13__pb2.ofp_switch_config.SerializeToString,
+    ('voltha.OpenFlow', 'GetSwitchFeatures'): openflow__13__pb2.ofp_switch_features.SerializeToString,
+    ('voltha.OpenFlow', 'ReceivePacketInMessages'): openflow__13__pb2.ofp_packet_in.SerializeToString,
+    ('voltha.OpenFlow', 'SendPacketOutMessages'): openflow__13__pb2.ofp_header.SerializeToString,
+    ('voltha.OpenFlow', 'SetConfig'): openflow__13__pb2.ofp_header.SerializeToString,
+  }
+  method_implementations = {
+    ('voltha.OpenFlow', 'EchoRequest'): face_utilities.unary_unary_inline(servicer.EchoRequest),
+    ('voltha.OpenFlow', 'ExperimenterRequest'): face_utilities.unary_unary_inline(servicer.ExperimenterRequest),
+    ('voltha.OpenFlow', 'GetHello'): face_utilities.unary_unary_inline(servicer.GetHello),
+    ('voltha.OpenFlow', 'GetSwitchConfig'): face_utilities.unary_unary_inline(servicer.GetSwitchConfig),
+    ('voltha.OpenFlow', 'GetSwitchFeatures'): face_utilities.unary_unary_inline(servicer.GetSwitchFeatures),
+    ('voltha.OpenFlow', 'ReceivePacketInMessages'): face_utilities.unary_stream_inline(servicer.ReceivePacketInMessages),
+    ('voltha.OpenFlow', 'SendPacketOutMessages'): face_utilities.unary_unary_inline(servicer.SendPacketOutMessages),
+    ('voltha.OpenFlow', 'SetConfig'): face_utilities.unary_unary_inline(servicer.SetConfig),
+  }
+  server_options = beta_implementations.server_options(request_deserializers=request_deserializers, response_serializers=response_serializers, thread_pool=pool, thread_pool_size=pool_size, default_timeout=default_timeout, maximum_timeout=maximum_timeout)
+  return beta_implementations.server(method_implementations, options=server_options)
+
+
+def beta_create_OpenFlow_stub(channel, host=None, metadata_transformer=None, pool=None, pool_size=None):
+  request_serializers = {
+    ('voltha.OpenFlow', 'EchoRequest'): openflow__13__pb2.ofp_header.SerializeToString,
+    ('voltha.OpenFlow', 'ExperimenterRequest'): openflow__13__pb2.ofp_experimenter_header.SerializeToString,
+    ('voltha.OpenFlow', 'GetHello'): openflow__13__pb2.ofp_hello.SerializeToString,
+    ('voltha.OpenFlow', 'GetSwitchConfig'): openflow__13__pb2.ofp_header.SerializeToString,
+    ('voltha.OpenFlow', 'GetSwitchFeatures'): openflow__13__pb2.ofp_header.SerializeToString,
+    ('voltha.OpenFlow', 'ReceivePacketInMessages'): openflow__13__pb2.ofp_header.SerializeToString,
+    ('voltha.OpenFlow', 'SendPacketOutMessages'): openflow__13__pb2.ofp_packet_out.SerializeToString,
+    ('voltha.OpenFlow', 'SetConfig'): openflow__13__pb2.ofp_switch_config.SerializeToString,
+  }
+  response_deserializers = {
+    ('voltha.OpenFlow', 'EchoRequest'): openflow__13__pb2.ofp_header.FromString,
+    ('voltha.OpenFlow', 'ExperimenterRequest'): openflow__13__pb2.ofp_experimenter_header.FromString,
+    ('voltha.OpenFlow', 'GetHello'): openflow__13__pb2.ofp_hello.FromString,
+    ('voltha.OpenFlow', 'GetSwitchConfig'): openflow__13__pb2.ofp_switch_config.FromString,
+    ('voltha.OpenFlow', 'GetSwitchFeatures'): openflow__13__pb2.ofp_switch_features.FromString,
+    ('voltha.OpenFlow', 'ReceivePacketInMessages'): openflow__13__pb2.ofp_packet_in.FromString,
+    ('voltha.OpenFlow', 'SendPacketOutMessages'): openflow__13__pb2.ofp_header.FromString,
+    ('voltha.OpenFlow', 'SetConfig'): openflow__13__pb2.ofp_header.FromString,
+  }
+  cardinalities = {
+    'EchoRequest': cardinality.Cardinality.UNARY_UNARY,
+    'ExperimenterRequest': cardinality.Cardinality.UNARY_UNARY,
+    'GetHello': cardinality.Cardinality.UNARY_UNARY,
+    'GetSwitchConfig': cardinality.Cardinality.UNARY_UNARY,
+    'GetSwitchFeatures': cardinality.Cardinality.UNARY_UNARY,
+    'ReceivePacketInMessages': cardinality.Cardinality.UNARY_STREAM,
+    'SendPacketOutMessages': cardinality.Cardinality.UNARY_UNARY,
+    'SetConfig': cardinality.Cardinality.UNARY_UNARY,
+  }
+  stub_options = beta_implementations.stub_options(host=host, metadata_transformer=metadata_transformer, request_serializers=request_serializers, response_deserializers=response_deserializers, thread_pool=pool, thread_pool_size=pool_size)
+  return beta_implementations.dynamic_stub(channel, 'voltha.OpenFlow', cardinalities, options=stub_options)
+# @@protoc_insertion_point(module_scope)