VOL-383: xpon_agent throws AttributeError and KeyError Exception at create_channel_termination

xpon agent throws such errors when attempting to configure xpon interface without referencing its parent.
As a result while seaching for device ID utilizing parent-child relationship datastructure, it returns empty list for its parent and consequently attempts to find its parent.
For VOLTHA 1.0, make all of the reference mandatory until VOL-314 & VOL-356 are implemented.

Change-Id: Ibf01572c190323979b3beb114b9c760205c717e2
diff --git a/voltha/adapters/iadapter.py b/voltha/adapters/iadapter.py
index 88e7c37..e6e0d46 100644
--- a/voltha/adapters/iadapter.py
+++ b/voltha/adapters/iadapter.py
@@ -224,6 +224,13 @@
     def remove_multicast_distribution_set(self, device, data):
         raise NotImplementedError()
 
+    def _get_handler(self, device):
+        if device.id in self.devices_handlers:
+            handler = self.devices_handlers[device.id]
+            if handler is not None:
+                return handler
+            return None
+
 """
 OLT Adapter base class
 """
diff --git a/voltha/adapters/ponsim_olt/ponsim_olt.py b/voltha/adapters/ponsim_olt/ponsim_olt.py
index 1e5d042..d7a75eb 100644
--- a/voltha/adapters/ponsim_olt/ponsim_olt.py
+++ b/voltha/adapters/ponsim_olt/ponsim_olt.py
@@ -206,70 +206,85 @@
         handler.update_pm_config(device, pm_config)
 
     def create_interface(self, device, data):
-        log.info('create-interface', device_id=device.id)
-        self.devices_handlers[device.id].create_interface(data)
+        if super(PonSimOltAdapter, self)._get_handler(device):
+            log.info('create-interface', device_id=device.id)
+            self.devices_handlers[device.id].create_interface(data)
 
     def update_interface(self, device, data):
-        log.info('update-interface', device_id=device.id)
-        self.devices_handlers[device.id].update_interface(data)
+        if super(PonSimOltAdapter, self)._get_handler(device):
+            log.info('update-interface', device_id=device.id)
+            self.devices_handlers[device.id].update_interface(data)
 
     def remove_interface(self, device, data):
-        log.info('remove-interface', device_id=device.id)
-        self.devices_handlers[device.id].remove_interface(data)
+        if super(PonSimOltAdapter, self)._get_handler(device):
+            log.info('remove-interface', device_id=device.id)
+            self.devices_handlers[device.id].remove_interface(data)
 
     def create_tcont(self, device, tcont_data, traffic_descriptor_data):
-        log.info('create-tcont', device_id=device.id)
-        self.devices_handlers[device.id].create_tcont(tcont_data,
-                                                      traffic_descriptor_data)
+        if super(PonSimOltAdapter, self)._get_handler(device):
+            log.info('create-tcont', device_id=device.id)
+            self.devices_handlers[device.id].create_tcont(
+                tcont_data, traffic_descriptor_data)
 
     def update_tcont(self, device, tcont_data, traffic_descriptor_data):
-        log.info('update-tcont', device_id=device.id)
-        self.devices_handlers[device.id].update_tcont(tcont_data,
-                                                      traffic_descriptor_data)
+        if super(PonSimOltAdapter, self)._get_handler(device):
+            log.info('update-tcont', device_id=device.id)
+            self.devices_handlers[device.id].update_tcont(
+                tcont_data, traffic_descriptor_data)
 
     def remove_tcont(self, device, tcont_data, traffic_descriptor_data):
-        log.info('remove-tcont', device_id=device.id)
-        self.devices_handlers[device.id].remove_tcont(tcont_data,
-                                                      traffic_descriptor_data)
+        if super(PonSimOltAdapter, self)._get_handler(device):
+            log.info('remove-tcont', device_id=device.id)
+            self.devices_handlers[device.id].remove_tcont(
+                tcont_data, traffic_descriptor_data)
 
     def create_gemport(self, device, data):
-        log.info('create-gemport', device_id=device.id)
-        self.devices_handlers[device.id].create_gemport(data)
+        if super(PonSimOltAdapter, self)._get_handler(device):
+            log.info('create-gemport', device_id=device.id)
+            self.devices_handlers[device.id].create_gemport(data)
 
     def update_gemport(self, device, data):
-        log.info('update-gemport', device_id=device.id)
-        self.devices_handlers[device.id].update_gemport(data)
+        if super(PonSimOltAdapter, self)._get_handler(device):
+            log.info('update-gemport', device_id=device.id)
+            self.devices_handlers[device.id].update_gemport(data)
 
     def remove_gemport(self, device, data):
-        log.info('remove-gemport', device_id=device.id)
-        self.devices_handlers[device.id].remove_gemport(data)
+        if super(PonSimOltAdapter, self)._get_handler(device):
+            log.info('remove-gemport', device_id=device.id)
+            self.devices_handlers[device.id].remove_gemport(data)
 
     def create_multicast_gemport(self, device, data):
-        log.info('create-multicast-gemport', device_id=device.id)
-        self.devices_handlers[device.id].create_multicast_gemport(data)
+        if super(PonSimOltAdapter, self)._get_handler(device):
+            log.info('create-multicast-gemport', device_id=device.id)
+            self.devices_handlers[device.id].create_multicast_gemport(data)
 
     def update_multicast_gemport(self, device, data):
-        log.info('update-multicast-gemport', device_id=device.id)
-        self.devices_handlers[device.id].update_multicast_gemport(data)
+        if super(PonSimOltAdapter, self)._get_handler(device):
+            log.info('update-multicast-gemport', device_id=device.id)
+            self.devices_handlers[device.id].update_multicast_gemport(data)
 
     def remove_multicast_gemport(self, device, data):
-        log.info('remove-multicast-gemport', device_id=device.id)
-        self.devices_handlers[device.id].remove_multicast_gemport(data)
+        if super(PonSimOltAdapter, self)._get_handler(device):
+            log.info('remove-multicast-gemport', device_id=device.id)
+            self.devices_handlers[device.id].remove_multicast_gemport(data)
 
     def create_multicast_distribution_set(self, device, data):
-        log.info('create-multicast-distribution-set', device_id=device.id)
-        self.devices_handlers[device.id].create_multicast_distribution_set(
-            data)
+        if super(PonSimOltAdapter, self)._get_handler(device):
+            log.info('create-multicast-distribution-set', device_id=device.id)
+            self.devices_handlers[device.id].create_multicast_distribution_set(
+                data)
 
     def update_multicast_distribution_set(self, device, data):
-        log.info('update-multicast-distribution-set', device_id=device.id)
-        self.devices_handlers[device.id].update_multicast_distribution_set(
-            data)
+        if super(PonSimOltAdapter, self)._get_handler(device):
+            log.info('update-multicast-distribution-set', device_id=device.id)
+            self.devices_handlers[device.id].update_multicast_distribution_set(
+                data)
 
     def remove_multicast_distribution_set(self, device, data):
-        log.info('remove-multicast-distribution-set', device_id=device.id)
-        self.devices_handlers[device.id].remove_multicast_distribution_set(
-            data)
+        if super(PonSimOltAdapter, self)._get_handler(device):
+            log.info('remove-multicast-distribution-set', device_id=device.id)
+            self.devices_handlers[device.id].remove_multicast_distribution_set(
+                data)
 
 class PonSimOltHandler(object):
     xpon_ponsim_olt_itfs = {
diff --git a/voltha/core/xpon_agent.py b/voltha/core/xpon_agent.py
index 127760a..f78b765 100644
--- a/voltha/core/xpon_agent.py
+++ b/voltha/core/xpon_agent.py
@@ -207,6 +207,8 @@
         parent_path = interface_node['parent_path'].format(*id_val.values())
         try:
             parent_data = self.core.get_proxy('/').get(parent_path)
+            if not parent_data:
+                return None
             return parent_data
         except KeyError:
             log.info('xpon-agent-warning-interface-cannot-get-parent',
@@ -215,6 +217,7 @@
 
     def get_child_data(self, data):
         interface_node = self.interface_stack[type(data)]
+        child = None
         if len(interface_node['child'][1]['child_path']) > 1:
             top_children = self.core.get_proxy('/').get('{}'.format(
                 interface_node['child'][1]['child_path'][0]))
diff --git a/voltha/core/xpon_handler.py b/voltha/core/xpon_handler.py
index b21ad20..e91a604 100644
--- a/voltha/core/xpon_handler.py
+++ b/voltha/core/xpon_handler.py
@@ -118,11 +118,13 @@
         log.info('grpc-request', request=request)
 
         try:
-            assert isinstance(request, ChannelgroupConfig)
+            assert isinstance(request, ChannelgroupConfig), \
+                'Instance is not of Channel Group'
             assert self.validate_interface(request, context)
             log.debug('creating-channel-group', name=request.name)
             _id = self.cg_pool.get_next()
-            assert _id != None
+            assert _id != None, \
+                'Fail to allocate id for Channel Group'
             request.cg_index = _id
             self.root.add('/channel_groups', request)
             self.cg_dict[request.name] = {'alloc_id': IndexPool(16383, 1024)}
@@ -130,8 +132,7 @@
 
             return Empty()
         except AssertionError, e:
-            context.set_details(
-                'Fail to allocate id to \'{}\''.format(request.name))
+            context.set_details(e.message)
             context.set_code(StatusCode.INVALID_ARGUMENT)
             return Empty()
         except ValueError:
@@ -152,7 +153,8 @@
             return ChannelgroupConfig()
 
         try:
-            assert isinstance(request, ChannelgroupConfig)
+            assert isinstance(request, ChannelgroupConfig), \
+                'Instance is not of Channel Group'
             assert self.validate_interface(request, context)
             channelgroup = self.get_channel_group_config(request, context)
             request.cg_index = channelgroup.cg_index
@@ -160,10 +162,10 @@
             log.debug('updating-channel-group', name=request.name)
             self.root.update(path, request, strict=True)
             return Empty()
-
         except AssertionError, e:
+            context.set_details(e.message)
+            context.set_code(StatusCode.INVALID_ARGUMENT)
             return Empty()
-
         except KeyError:
             context.set_details(
                     'channel group \'{}\' not found'.format(request.name))
@@ -219,13 +221,16 @@
         log.info('grpc-request', request=request)
 
         try:
-            assert isinstance(request, ChannelpartitionConfig)
+            assert isinstance(request, ChannelpartitionConfig), \
+                'Instance is not of Channel Partition'
             assert self.validate_interface(request, context)
             log.debug('creating-channel-partition', name=request.name)
             self.root.add('/channel_partitions', request)
 
             return Empty()
         except AssertionError, e:
+            context.set_details(e.message)
+            context.set_code(StatusCode.INVALID_ARGUMENT)
             return Empty()
         except ValueError:
             context.set_details(
@@ -244,7 +249,8 @@
             return ChannelpartitionConfig()
 
         try:
-            assert isinstance(request, ChannelpartitionConfig)
+            assert isinstance(request, ChannelpartitionConfig), \
+                'Instance is not of Channel Partition'
             assert self.validate_interface(request, context)
 
             path = '/channel_partitions/{}'.format(request.name)
@@ -253,8 +259,9 @@
             return Empty()
 
         except AssertionError, e:
+            context.set_details(e.message)
+            context.set_code(StatusCode.INVALID_ARGUMENT)
             return Empty()
-
         except KeyError:
             context.set_details(
                     'channel partition \'{}\' not found'.format(request.name))
@@ -308,13 +315,16 @@
         log.info('grpc-request', request=request)
 
         try:
-            assert isinstance(request, ChannelpairConfig)
+            assert isinstance(request, ChannelpairConfig), \
+                'Instance is not of Channel Pair'
             assert self.validate_interface(request, context)
             log.debug('creating-channel-pair', name=request.name)
             self.root.add('/channel_pairs', request)
 
             return Empty()
         except AssertionError, e:
+            context.set_details(e.message)
+            context.set_code(StatusCode.INVALID_ARGUMENT)
             return Empty()
         except ValueError:
             context.set_details(
@@ -331,19 +341,19 @@
                 'Malformed name \'{}\''.format(request.name))
             context.set_code(StatusCode.INVALID_ARGUMENT)
             return ChannelpairConfig()
-
         try:
-            assert isinstance(request, ChannelpairConfig)
+            assert isinstance(request, ChannelpairConfig), \
+                'Instance is not of Channel Pair'
             assert self.validate_interface(request, context)
 
             path = '/channel_pairs/{}'.format(request.name)
             log.debug('updating-channel-pair', name=request.name)
             self.root.update(path, request, strict=True)
             return Empty()
-
         except AssertionError, e:
+            context.set_details(e.message)
+            context.set_code(StatusCode.INVALID_ARGUMENT)
             return Empty()
-
         except KeyError:
             context.set_details(
                     'channel pair \'{}\' not found'.format(request.name))
@@ -408,10 +418,13 @@
         log.info('grpc-request', request=request)
 
         try:
-            assert isinstance(request, ChannelterminationConfig)
+            assert isinstance(request, ChannelterminationConfig), \
+                'Instance is not of Channel Termination'
             assert self.validate_interface(request, context)
             #device = self.root.get('/devices/{}'.format(request.id))
         except AssertionError, e:
+            context.set_details(e.message)
+            context.set_code(StatusCode.INVALID_ARGUMENT)
             return Empty()
         except KeyError:
             context.set_details(
@@ -445,9 +458,12 @@
             return ChannelterminationConfig()
 
         try:
-            assert isinstance(request, ChannelterminationConfig)
+            assert isinstance(request, ChannelterminationConfig), \
+                'Instance is not of Channel Termination'
             assert self.validate_interface(request, context)
         except AssertionError, e:
+            context.set_details(e.message)
+            context.set_code(StatusCode.INVALID_ARGUMENT)
             return Empty()
         except KeyError:
             context.set_details(
@@ -487,7 +503,7 @@
             assert isinstance(request, ChannelterminationConfig)
         except AssertionError:
             context.set_details(
-                'Instance is not of channel termination')
+                'Instance is not of Channel Termination')
             context.set_code(StatusCode.INVALID_ARGUMENT)
             return Empty()
         except KeyError:
@@ -524,12 +540,15 @@
         log.info('grpc-request', request=request)
 
         try:
-            assert isinstance(request, OntaniConfig)
+            assert isinstance(request, OntaniConfig), \
+                'Instance is not of Ont Ani'
             assert self.validate_interface(request, context)
             log.debug('creating-ont-ani', name=request.name)
             self.root.add('/ont_anis', request)
             return Empty()
         except AssertionError, e:
+            context.set_details(e.message)
+            context.set_code(StatusCode.INVALID_ARGUMENT)
             return Empty()
         except KeyError:
             context.set_details(
@@ -553,17 +572,18 @@
             return OntaniConfig()
 
         try:
-            assert isinstance(request, OntaniConfig)
+            assert isinstance(request, OntaniConfig), \
+                'Instance is not of Ont Ani'
             assert self.validate_interface(request, context)
 
             path = '/ont_anis/{}'.format(request.name)
             log.debug('updating-ont-ani', name=request.name)
             self.root.update(path, request, strict=True)
             return Empty()
-
         except AssertionError, e:
+            context.set_details(e.message)
+            context.set_code(StatusCode.INVALID_ARGUMENT)
             return Empty()
-
         except KeyError:
             context.set_details(
                 'ontani \'{}\' not found'.format(request.name))
@@ -589,7 +609,7 @@
 
         except AssertionError:
             context.set_details(
-                'Instance is not of ont ani')
+                'Instance is not of Ont Ani')
             context.set_code(StatusCode.INVALID_ARGUMENT)
             return Empty()
 
@@ -608,12 +628,15 @@
         log.info('grpc-request', request=request)
 
         try:
-            assert isinstance(request, VOntaniConfig)
+            assert isinstance(request, VOntaniConfig), \
+                'Instance is not of VOnt Ani'
             assert self.validate_interface(request, context)
             log.debug('creating-vont-ani', name=request.name)
             self.root.add('/v_ont_anis', request)
             return Empty()
         except AssertionError, e:
+            context.set_details(e.message)
+            context.set_code(StatusCode.INVALID_ARGUMENT)
             return Empty()
         except KeyError:
             context.set_details(
@@ -637,17 +660,17 @@
             return VOntaniConfig()
 
         try:
-            assert isinstance(request, VOntaniConfig)
+            assert isinstance(request, VOntaniConfig), \
+                'Instance is not of VOnt Ani'
             assert self.validate_interface(request, context)
-
             path = '/v_ont_anis/{}'.format(request.name)
             log.debug('updating-vont-ani', name=request.name)
             self.root.update(path, request, strict=True)
             return Empty()
-
         except AssertionError, e:
+            context.set_details(e.message)
+            context.set_code(StatusCode.INVALID_ARGUMENT)
             return Empty()
-
         except KeyError:
             context.set_details(
                 'vontani \'{}\' not found'.format(request.name))
@@ -700,12 +723,15 @@
         log.info('grpc-request', request=request)
 
         try:
-            assert isinstance(request, VEnetConfig)
+            assert isinstance(request, VEnetConfig), \
+                'Instance is not of VEnet'
             assert self.validate_interface(request, context)
             log.debug('creating-venet', name=request.name)
             self.root.add('/v_enets', request)
             return Empty()
         except AssertionError, e:
+            context.set_details(e.message)
+            context.set_code(StatusCode.INVALID_ARGUMENT)
             return Empty()
         except KeyError:
             context.set_details(
@@ -729,17 +755,17 @@
             return VEnetConfig()
 
         try:
-            assert isinstance(request, VEnetConfig)
+            assert isinstance(request, VEnetConfig), \
+                'Instance is not of VEnet'
             assert self.validate_interface(request, context)
-
             path = '/v_enets/{}'.format(request.name)
             log.debug('updating-venet', name=request.name)
             self.root.update(path, request, strict=True)
             return Empty()
-
         except AssertionError, e:
+            context.set_details(e.message)
+            context.set_code(StatusCode.INVALID_ARGUMENT)
             return Empty()
-
         except KeyError:
             context.set_details(
                 'venet \'{}\' not found'.format(request.name))
@@ -771,12 +797,10 @@
             log.debug('removing-venet', name=request.name)
             self.root.remove(path)
             return Empty()
-
         except AssertionError, e:
             context.set_details(e.message)
             context.set_code(StatusCode.INVALID_ARGUMENT)
             return Empty()
-
         except KeyError:
             context.set_details(
                 'venet \'{}\' not found'.format(request.name))
@@ -792,12 +816,15 @@
     def create_traffic_descriptor_profile(self, request, context):
         log.info('grpc-request', request=request)
         try:
-            assert isinstance(request, TrafficDescriptorProfileData)
+            assert isinstance(request, TrafficDescriptorProfileData), \
+                'Instance is not of Traffic Descriptor Profile'
             assert self.validate_interface(request, context)
             log.debug('creating-traffic-descriptor-profile', name=request.name)
             self.root.add('/traffic_descriptor_profiles', request)
             return Empty()
         except AssertionError, e:
+            context.set_details(e.message)
+            context.set_code(StatusCode.INVALID_ARGUMENT)
             return Empty()
         except KeyError:
             context.set_details(
@@ -822,18 +849,18 @@
             return TrafficDescriptorProfileData()
 
         try:
-            assert isinstance(request, TrafficDescriptorProfileData)
+            assert isinstance(request, TrafficDescriptorProfileData), \
+                'Instance is not of Traffic Descriptor Profile'
             assert self.validate_interface(request, context)
-
             path = '/traffic_descriptor_profiles/{}'.format(request.name)
             log.debug('updating-traffic-descriptor-profile',
                       name=request.name)
             self.root.update(path, request, strict=True)
             return Empty()
-
         except AssertionError, e:
+            context.set_details(e.message)
+            context.set_code(StatusCode.INVALID_ARGUMENT)
             return Empty()
-
         except KeyError:
             context.set_details(
                 'traffic descriptor profile \'{}\' not found'.format(
@@ -852,7 +879,7 @@
 
         try:
             assert isinstance(request, TrafficDescriptorProfileData), \
-                'Instance is not of Traffic Descriptor Profile Data'
+                'Instance is not of Traffic Descriptor Profile'
             tdp_ref_by_tcont = next(
                 (tcont for tcont in self.root.get('/tconts') if
                  tcont.traffic_descriptor_profile_ref == request.name), None)
@@ -883,9 +910,9 @@
     def create_tcont(self, request, context):
         log.info('grpc-request', request=request)
         try:
-            assert isinstance(request, TcontsConfigData)
+            assert isinstance(request, TcontsConfigData), \
+                'Instance is not of TCont'
             assert self.validate_interface(request, context)
-
             cg_name = self.extract_channel_group_from_request(request,
                         'v_ont_anis', request.interface_reference)
             _id = self.cg_dict[cg_name]['alloc_id'].get_next()
@@ -895,6 +922,8 @@
             self.root.add('/tconts', request)
             return Empty()
         except AssertionError, e:
+            context.set_details(e.message)
+            context.set_code(StatusCode.INVALID_ARGUMENT)
             return Empty()
         except KeyError:
             context.set_details(
@@ -917,9 +946,9 @@
             context.set_code(StatusCode.INVALID_ARGUMENT)
             return TcontsConfigData()
         try:
-            assert isinstance(request, TcontsConfigData)
+            assert isinstance(request, TcontsConfigData), \
+                'Instance is not of TCont'
             assert self.validate_interface(request, context)
-
             path = '/tconts/{}'.format(request.name)
             tcont = self.root.get(path)
             request.alloc_id = tcont.alloc_id
@@ -927,6 +956,8 @@
             self.root.update(path, request, strict=True)
             return Empty()
         except AssertionError, e:
+            context.set_details(e.message)
+            context.set_code(StatusCode.INVALID_ARGUMENT)
             return Empty()
         except KeyError:
             context.set_details(
@@ -976,17 +1007,21 @@
     def create_gem_port(self, request, context):
         log.info('grpc-request', request=request)
         try:
-            assert isinstance(request, GemportsConfigData)
+            assert isinstance(request, GemportsConfigData), \
+                'Instance is not of GemPort'
             assert self.validate_interface(request, context)
             cg_name = self.extract_channel_group_from_request(request,
                         'v_enets', request.itf_ref)
             _id = self.cg_dict[cg_name]['gemport_id'].get_next()
-            assert _id != None
+            assert _id != None, \
+                'Fail to allocate id for CemPort'
             request.gemport_id = _id
             log.debug('creating-gemport', name=request.name)
             self.root.add('/gemports', request)
             return Empty()
         except AssertionError, e:
+            context.set_details(e.message)
+            context.set_code(StatusCode.INVALID_ARGUMENT)
             return Empty()
         except KeyError:
             context.set_details(
@@ -1009,9 +1044,9 @@
             context.set_code(StatusCode.INVALID_ARGUMENT)
             return GemportsConfigData()
         try:
-            assert isinstance(request, GemportsConfigData)
+            assert isinstance(request, GemportsConfigData), \
+                'Instance is not of GemPort'
             assert self.validate_interface(request, context)
-
             path = '/gemports/{}'.format(request.name)
             gemport = self.root.get(path)
             request.gemport_id = gemport.gemport_id
@@ -1019,6 +1054,8 @@
             self.root.update(path, request, strict=True)
             return Empty()
         except AssertionError, e:
+            context.set_details(e.message)
+            context.set_code(StatusCode.INVALID_ARGUMENT)
             return Empty()
         except KeyError:
             context.set_details(
@@ -1044,7 +1081,7 @@
             self.cg_dict[cg_name]['gemport_id'].release(gemport.gemport_id)
             return Empty()
         except AssertionError:
-            context.set_details('Instance is not of gemport')
+            context.set_details('Instance is not of GemPort')
             context.set_code(StatusCode.INVALID_ARGUMENT)
             return Empty()
         except KeyError:
@@ -1106,12 +1143,17 @@
                         request.data.channelgroup_ref), \
                         'Reference to channel group -- \'{}\' not found'\
                         .format(request.data.channelgroup_ref)
-                if channelpair.data.channelpartition_ref:
-                    assert self.get_ref_data(
-                        request, context, "channel_partitions",
-                        request.data.channelpartition_ref), \
-                        'Reference to channel partition -- \'{}\' not found'\
-                        .format(request.data.channelpartition_ref)
+                '''
+                @todo: For VOLTHA 1.0, make this reference mandatory until
+                       VOL-314 & VOL-356 are implemented.
+                '''
+                assert channelpair.data.channelpartition_ref != '', \
+                    'Channel Pair must reference an existing Channel Partition'
+                assert self.get_ref_data(
+                    request, context, "channel_partitions",
+                    request.data.channelpartition_ref), \
+                    'Reference to channel partition -- \'{}\' not found'\
+                    .format(request.data.channelpartition_ref)
 
                 assert channelpair.data.channelpair_type != '', \
                     'Channel Pair type is mandatory'
@@ -1131,13 +1173,17 @@
                 assert channeltermin.id != '', 'Device ID is mandatory'
                 assert channeltermin.name != '', \
                     'Channel Termination name is mandatory'
-
-                if channeltermin.data.channelpair_ref:
-                    assert self.get_ref_data(
-                        request, context, "channel_pairs",
-                        request.data.channelpair_ref), \
-                        'Reference to channel pair -- \'{}\' not found'\
-                        .format(request.data.channelpair_ref)
+                '''
+                @todo: For VOLTHA 1.0, make this reference mandatory until
+                       VOL-314 & VOL-356 are implemented.
+                '''
+                assert channeltermin.data.channelpair_ref != '', \
+                    'Channel Termination must reference Channel Pair'
+                assert self.get_ref_data(
+                    request, context, "channel_pairs",
+                    request.data.channelpair_ref), \
+                    'Reference to channel pair -- \'{}\' not found'\
+                    .format(request.data.channelpair_ref)
 
                 assert 0 <= channeltermin.data.ber_calc_period <= 864000, \
                     'Channel Termination ber calc period must be in range of \
@@ -1152,19 +1198,25 @@
                 assert isinstance(request, VOntaniConfig)
                 vontani = request
                 assert vontani.name != '', 'VOntAni name is mandatory'
-
-                if vontani.data.parent_ref:
-                    assert self.get_ref_data(
-                        request, context, "channel_partitions",
-                        request.data.parent_ref), \
-                        'Reference to channel partition -- \'{}\' not found'\
-                        .format(request.data.parent_ref)
-                if vontani.data.preferred_chanpair:
-                    assert self.get_ref_data(
-                        request, context, "channel_pairs",
-                        request.data.preferred_chanpair), \
-                        'Preferred channel pair -- \'{}\' not found'\
-                        .format(request.data.preferred_chanpair)
+                assert vontani.data.parent_ref != '', \
+                    'VOntAni must reference an existing Channel Partition'
+                assert self.get_ref_data(
+                    request, context, "channel_partitions",
+                    request.data.parent_ref), \
+                    'Reference to channel partition -- \'{}\' not found'\
+                    .format(request.data.parent_ref)
+                '''
+                @todo: For VOLTHA 1.0, make this reference mandatory until
+                       VOL-314 & VOL-356 are implemented.
+                '''
+                assert vontani.data.preferred_chanpair != '', \
+                    'VOntAni must reference preferred Channel Pair'
+                #if vontani.data.preferred_chanpair:
+                assert self.get_ref_data(
+                    request, context, "channel_pairs",
+                    request.data.preferred_chanpair), \
+                    'Preferred channel pair -- \'{}\' not found'\
+                    .format(request.data.preferred_chanpair)
                 if vontani.data.protection_chanpair:
                     assert self.get_ref_data(
                         request, context, "channel_pairs",
@@ -1195,13 +1247,12 @@
                 assert isinstance(request, VEnetConfig)
                 venet = request
                 assert venet.name != '', 'VEnet name is mandatory'
-
-                if venet.data.v_ontani_ref:
-                    assert self.get_ref_data(
-                        request, context, "v_ont_anis",
-                        venet.data.v_ontani_ref), \
-                        'Reference to vont ani -- \'{}\' not found'\
-                        .format(venet.data.v_ontani_ref)
+                assert venet.data.v_ontani_ref != '', \
+                    'VEnet must reference an existing VOntAni'
+                assert self.get_ref_data(
+                    request, context, "v_ont_anis", venet.data.v_ontani_ref), \
+                    'Reference to VOntAni -- \'{}\' not found'\
+                    .format(venet.data.v_ontani_ref)
                 return True
             elif(isinstance(request, TrafficDescriptorProfileData)):
                 assert isinstance(request, TrafficDescriptorProfileData)
@@ -1243,7 +1294,7 @@
                 gemport = request
                 assert gemport.name != '', 'Gemport name is mandatory'
                 assert gemport.itf_ref != '', \
-                    'Gemport must reference an existing VEnet interface'
+                    'GemPort must reference an existing VEnet interface'
                 assert self.get_ref_data(
                     request, context, "v_enets", gemport.itf_ref), \
                     'Reference to VEnet interface -- \'{}\' not found'\
@@ -1251,11 +1302,16 @@
                 assert 0 <= gemport.traffic_class <= 7, \
                     'Traffic class value for Gemport \
                     must be in range of [0, 7]'
-                if gemport.tcont_ref:
-                    assert self.get_ref_data(
-                        request, context, "tconts", gemport.tcont_ref), \
-                        'Reference to tcont -- \'{}\' not found'\
-                        .format(gemport.tcont_ref)
+                '''
+                @todo: For VOLTHA 1.0, make this reference mandatory until
+                       VOL-314 & VOL-356 are implemented.
+                '''
+                assert gemport.tcont_ref != '', \
+                    'GemPort must reference an existing TCont'
+                assert self.get_ref_data(
+                    request, context, "tconts", gemport.tcont_ref), \
+                    'Reference to tcont -- \'{}\' not found'\
+                    .format(gemport.tcont_ref)
                 return True
             else:
                 return False