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