Correct number_of_endpoints number in vnffgd samples.

Add a function to validate vnffg property number_of_endpoints
Add some UT testcases for this function.

Change-Id: I5180c551f5d6571491c80a9f4bbcb3c74c3c5572
This commit is contained in:
Yan Xing'an 2017-03-30 20:16:32 -07:00
parent f01d81e047
commit 9bbad6dc26
12 changed files with 113 additions and 32 deletions

View File

@ -45,7 +45,7 @@ topology_template:
properties:
vendor: tacker
version: 1.0
number_of_endpoints: 5
number_of_endpoints: 2
dependent_virtual_link: [VL12,VL22]
connection_point: [CP12,CP22]
constituent_vnfs: [VNFD1,VNFD2]

View File

@ -32,7 +32,7 @@ topology_template:
properties:
vendor: tacker
version: 1.0
number_of_endpoints: 5
number_of_endpoints: 2
dependent_virtual_link: [VL12,VL22]
connection_point: [CP12,CP22]
constituent_vnfs: [VNFD1,VNFD2]

View File

@ -344,7 +344,7 @@ class VnffgPluginDbMixin(vnffg.VNFFGPluginBase, db_base.CommonDbMixin):
template_db.template['vnffgd']['topology_template'] = \
vnffgd_topology_template
vnf_members = self._get_vnffg_property(template_db,
vnf_members = self._get_vnffg_property(template_db.template,
'constituent_vnfs')
LOG.debug(_('Constituent VNFs: %s'), vnf_members)
vnf_mapping = self._get_vnf_mapping(context, vnffg.get(
@ -479,8 +479,8 @@ class VnffgPluginDbMixin(vnffg.VNFFGPluginBase, db_base.CommonDbMixin):
return chain_list
@staticmethod
def _get_vnffg_property(template_db, vnffg_property):
template = template_db.template['vnffgd']['topology_template']
def _get_vnffg_property(template, vnffg_property):
template = template['vnffgd']['topology_template']
vnffg_name = list(template['groups'].keys())[0]
try:
return template['groups'][vnffg_name]['properties'][vnffg_property]

View File

@ -117,6 +117,11 @@ class VnffgdCpNoForwardingException(exceptions.TackerException):
"included in forwarding path")
class VnffgdWrongEndpointNumber(exceptions.TackerException):
message = _("Specified number_of_endpoints %(number)s is not equal to "
"the number of connection_point %(cps)s")
class VnffgdInUse(exceptions.InUse):
message = _('VNFFGD %(vnffgd_id)s is still in use')

View File

@ -211,6 +211,46 @@ class NfvoPlugin(nfvo_db.NfvoPluginDb, vnffg_db.VnffgPluginDbMixin,
LOG.exception(_("tosca-parser error: %s"), str(e))
raise nfvo.ToscaParserFailed(error_msg_details=str(e))
@log.log
def validate_vnffgd_path(self, template):
temp = template['vnffgd']['topology_template']
vnffg_name = list(temp['groups'].keys())[0]
nfp_name = temp['groups'][vnffg_name]['members'][0]
path = self._get_nfp_attribute(template, nfp_name,
'path')
prev_element = None
known_forwarders = set()
for element in path:
if element.get('forwarder') in known_forwarders:
if prev_element is not None and element.get('forwarder')\
!= prev_element['forwarder']:
raise nfvo.VnffgdDuplicateForwarderException(
forwarder=element.get('forwarder')
)
elif prev_element is not None and element.get(
'capability') == prev_element['capability']:
raise nfvo.VnffgdDuplicateCPException(
cp=element.get('capability')
)
else:
known_forwarders.add(element.get('forwarder'))
prev_element = element
@log.log
def validate_vnffg_properties(self, template):
# check whether number_of_endpoints is same with connection_point
connection_point = self._get_vnffg_property(
template, 'connection_point')
number_endpoint = self._get_vnffg_property(
template, 'number_of_endpoints')
if len(connection_point) != number_endpoint:
raise nfvo.VnffgdWrongEndpointNumber(
number=number_endpoint,
cps=connection_point)
@log.log
def create_vnffgd(self, context, vnffgd):
template = vnffgd['vnffgd']
@ -219,28 +259,11 @@ class NfvoPlugin(nfvo_db.NfvoPluginDb, vnffg_db.VnffgPluginDbMixin,
raise nfvo.VnffgdInvalidTemplate(template=template.get('template'))
else:
self.validate_tosca(template['template']['vnffgd'])
temp = template['template']['vnffgd']['topology_template']
vnffg_name = list(temp['groups'].keys())[0]
nfp_name = temp['groups'][vnffg_name]['members'][0]
path = self._get_nfp_attribute(template['template'], nfp_name,
'path')
prev_element = None
known_forwarders = set()
for element in path:
if element.get('forwarder') in known_forwarders:
if prev_element is not None and element.get('forwarder')\
!= prev_element['forwarder']:
raise nfvo.VnffgdDuplicateForwarderException(
forwarder=element.get('forwarder')
)
elif prev_element is not None and element.get(
'capability') == prev_element['capability']:
raise nfvo.VnffgdDuplicateCPException(
cp=element.get('capability')
)
else:
known_forwarders.add(element.get('forwarder'))
prev_element = element
self.validate_vnffgd_path(template['template'])
self.validate_vnffg_properties(template['template'])
return super(NfvoPlugin, self).create_vnffgd(context, vnffgd)
@log.log
@ -295,7 +318,7 @@ class NfvoPlugin(nfvo_db.NfvoPluginDb, vnffg_db.VnffgPluginDbMixin,
nfp['classifier_id'])
template_db = self._get_resource(context, vnffg_db.VnffgTemplate,
vnffg_dict['vnffgd_id'])
vnf_members = self._get_vnffg_property(template_db,
vnf_members = self._get_vnffg_property(template_db.template,
'constituent_vnfs')
new_vnffg['vnf_mapping'] = super(NfvoPlugin, self)._get_vnf_mapping(
context, new_vnffg.get('vnf_mapping'), vnf_members)

View File

@ -50,6 +50,8 @@ vnfd_alarm_respawn_tosca_template = _get_template(
vnfd_alarm_scale_tosca_template = _get_template(
'test_tosca_vnfd_alarm_scale.yaml')
nsd_tosca_template = yaml.safe_load(_get_template('tosca_nsd_template.yaml'))
vnffgd_wrong_cp_number_template = yaml.safe_load(_get_template(
'tosca_vnffgd_wrong_cp_number_template.yaml'))
def get_dummy_vnfd_obj():

View File

@ -448,6 +448,16 @@ class TestNfvoPlugin(db_base.SqlTestCase):
self.nfvo_plugin.validate_tosca,
template)
def test_validate_vnffg_properties(self):
template = {'vnffgd': utils.vnffgd_tosca_template}
self.nfvo_plugin.validate_vnffg_properties(template)
def test_validate_vnffg_properties_wrong_number(self):
template = {'vnffgd': utils.vnffgd_wrong_cp_number_template}
self.assertRaises(nfvo.VnffgdWrongEndpointNumber,
self.nfvo_plugin.validate_vnffg_properties,
template)
def test_create_vnffgd(self):
vnffgd_obj = utils.get_dummy_vnffgd_obj()
result = self.nfvo_plugin.create_vnffgd(self.context, vnffgd_obj)

View File

@ -34,7 +34,7 @@ topology_template:
properties:
vendor: tacker
version: 1.0
number_of_endpoints: 5
number_of_endpoints: 3
dependent_virtual_link: [VL1,VL2,VL3]
connection_point: [CP11,CP12,CP32]
constituent_vnfs: [VNF1,VNF3]

View File

@ -39,7 +39,7 @@ topology_template:
properties:
vendor: tacker
version: 1.0
number_of_endpoints: 5
number_of_endpoints: 3
dependent_virtual_link: [VL1,VL2,VL3]
connection_point: [CP11,CP12,CP32]
constituent_vnfs: [VNF1,VNF3]

View File

@ -34,7 +34,7 @@ topology_template:
properties:
vendor: tacker
version: 1.0
number_of_endpoints: 5
number_of_endpoints: 3
dependent_virtual_link: [VL1,VL2,VL3]
connection_point: [CP11,CP12,CP32]
constituent_vnfs: [VNF1,VNF3]

View File

@ -0,0 +1,41 @@
tosca_definitions_version: tosca_simple_profile_for_nfv_1_0_0
description: example template
topology_template:
description: Example VNFFG template
node_templates:
Forwarding_path1:
type: tosca.nodes.nfv.FP.Tacker
description: creates path (CP11->CP12->CP32)
properties:
id: 51
policy:
type: ACL
criteria:
- blah: tenant1_net
- destination_port_range: 80-1024
- ip_proto: 6
- ip_dst_prefix: 192.168.1.2/24
path:
- forwarder: VNF1
capability: CP11
- forwarder: VNF1
capability: CP12
- forwarder: VNF3
capability: CP32
groups:
VNFFG1:
type: tosca.groups.nfv.VNFFG
description: HTTP to Corporate Net
properties:
vendor: tacker
version: 1.0
number_of_endpoints: 4
dependent_virtual_link: [VL1,VL2,VL3]
connection_point: [CP11,CP12,CP32]
constituent_vnfs: [VNF1,VNF3]
members: [Forwarding_path1]

View File

@ -25,7 +25,7 @@
properties:
vendor: tacker
version: 1.0
number_of_endpoints: 5
number_of_endpoints: 3
dependent_virtual_link: [VL1,VL2,VL3]
connection_point: [CP11,CP12,CP32]
constituent_vnfs: [VNF1,VNF3]