diff --git a/tacker/common/csar_utils.py b/tacker/common/csar_utils.py index 5c3f6ece3..62675fa31 100644 --- a/tacker/common/csar_utils.py +++ b/tacker/common/csar_utils.py @@ -236,9 +236,11 @@ def _validate_sw_image_data_for_artifacts(tosca): def _get_data_from_csar(tosca, context, id): for tp in tosca.nested_tosca_templates_with_topology: - levels = _get_instantiation_levels_from_policy(tp.tpl.get("policies")) - for policy_tpl in tp.tpl.get("policies"): - _validate_instantiation_levels(policy_tpl, levels) + policies = tp.tpl.get("policies") + if policies: + levels = _get_instantiation_levels_from_policy(policies) + for policy_tpl in policies: + _validate_instantiation_levels(policy_tpl, levels) _validate_sw_image_data_for_artifacts(tosca) vnf_data = _get_vnf_data(tosca.nodetemplates) diff --git a/tacker/conductor/conductor_server.py b/tacker/conductor/conductor_server.py index 2abc8e4af..56f60d48a 100644 --- a/tacker/conductor/conductor_server.py +++ b/tacker/conductor/conductor_server.py @@ -179,7 +179,7 @@ class Conductor(manager.Manager): deploy_flavour.flavour_id = flavour['flavour_id'] deploy_flavour.flavour_description = flavour['flavour_description'] deploy_flavour.instantiation_levels = \ - flavour['instantiation_levels'] + flavour.get('instantiation_levels') deploy_flavour.create() sw_images = flavour.get('sw_images') diff --git a/tacker/tests/etc/samples/csar_without_policies.zip b/tacker/tests/etc/samples/csar_without_policies.zip new file mode 100644 index 000000000..ec667c175 Binary files /dev/null and b/tacker/tests/etc/samples/csar_without_policies.zip differ diff --git a/tacker/tests/unit/common/test_csar_utils.py b/tacker/tests/unit/common/test_csar_utils.py index 29ebb3ed6..7a3d9a759 100644 --- a/tacker/tests/unit/common/test_csar_utils.py +++ b/tacker/tests/unit/common/test_csar_utils.py @@ -162,3 +162,14 @@ class TestCSARUtils(testtools.TestCase): csar_utils.delete_csar_data(constants.UUID) mock_rmtree.assert_called() mock_remove.assert_called() + + @mock.patch('tacker.common.csar_utils._extract_csar_zip_file') + def test_load_csar_data_without_policies( + self, mock_extract_csar_zip_file): + file_path = os.path.join( + self.base_path, "../../etc/samples/" + "csar_without_policies.zip") + vnf_data, flavours = csar_utils.load_csar_data( + self.context, constants.UUID, file_path) + self.assertIsNone(flavours[0].get('instantiation_levels')) + self.assertEqual(vnf_data['descriptor_version'], '1.0')