Avoid use of zip files in unit tests

Replaced the zip files by creating respective directories which is used
as the test data for unit test cases.

Addressed review comment [1] in this patch.

[1]: https://review.opendev.org/#/c/707802/26/tacker/tests/unit/vnflcm/test_vnflcm_driver.py@326
Change-Id: I6a19debe94c2707b6145003d428db9704bda02ee
This commit is contained in:
Shubham 2020-05-18 14:26:11 +05:30
parent de5108e4b2
commit 46bb74019c
46 changed files with 2959 additions and 123 deletions

View File

@ -0,0 +1,5 @@
The subdirectories in this path are used to create csar zip files to cover
different test scenarios in test_csar_utils.py module.
* While execution of test cases it creates csar zip file with the use of
'test_csar_utils_common' and '../common' directory.

View File

@ -0,0 +1,27 @@
tosca_definitions_version: tosca_simple_yaml_1_2
description: Sample VNF.
imports:
- etsi_nfv_sol001_common_types.yaml
- etsi_nfv_sol001_vnfd_types.yaml
- helloworld3_types.yaml
- tosca_with_vdus.yaml
topology_template:
inputs:
selected_flavour:
type: string
description: VNF deployment flavour selected by the consumer. It is provided in the API
node_templates:
VNF:
type: company.provider.VNF
properties:
descriptor_id: b1bb0ce7-ebca-4fa7-95ed-4840d70a1177
provider: Company
product_name: Sample VNF
software_version: '1.0'
descriptor_version: '1.0'
vnfm_info:
- Tacker

View File

@ -0,0 +1,122 @@
tosca_definitions_version: tosca_simple_yaml_1_2
description: Simple deployment flavour for Sample VNF
imports:
- etsi_nfv_sol001_common_types.yaml
- etsi_nfv_sol001_vnfd_types.yaml
- helloworld3_types.yaml
topology_template:
inputs:
descriptor_id:
type: string
descriptor_version:
type: string
provider:
type: string
product_name:
type: string
software_version:
type: string
vnfm_info:
type: list
entry_schema:
type: string
flavour_id:
type: string
flavour_description:
type: string
substitution_mappings:
node_type: company.provider.VNF
properties:
flavour_id: simple
requirements:
virtual_link_external: [ CP1, virtual_link ]
node_templates:
VDU1:
type: tosca.nodes.nfv.Vdu.Compute
properties:
name: VDU1
description: VDU1 compute node
vdu_profile:
min_number_of_instances: 1
max_number_of_instances: 1
capabilities:
virtual_compute:
properties:
virtual_memory:
virtual_mem_size: 512 MB
virtual_cpu:
num_virtual_cpu: 1
virtual_local_storage:
- size_of_storage: 1 GB
CP1:
type: tosca.nodes.nfv.VduCp
properties:
layer_protocols: [ ipv4 ]
order: 0
vnic_type: direct-physical
requirements:
- virtual_binding: VDU1
internalVL2:
type: tosca.nodes.nfv.VnfVirtualLink
properties:
connectivity_type:
layer_protocols: [ ipv4 ]
description: Internal Virtual link in the VNF
vl_profile:
max_bitrate_requirements:
root: 1048576
leaf: 1048576
min_bitrate_requirements:
root: 1048576
leaf: 1048576
virtual_link_protocol_data:
- associated_layer_protocol: ipv4
l3_protocol_data:
ip_version: ipv4
cidr: 11.11.0.0/24
policies:
- scaling_aspects:
type: tosca.policies.nfv.ScalingAspects
properties:
aspects:
worker_instance:
name: worker_instance_aspect
description: worker_instance scaling aspect
max_scale_level: 2
step_deltas:
- delta_1
- instantiation_levels:
type: tosca.policies.nfv.InstantiationLevels
properties:
levels:
instantiation_level_1:
description: Smallest size
scale_info:
worker_instance:
scale_level: 0
instantiation_level_2:
description: Largest size
scale_info:
worker_instance:
scale_level: 2
default_level: instantiation_level_1
- VDU1_instantiation_levels:
type: tosca.policies.nfv.VduInstantiationLevels
properties:
levels:
instantiation_level_1:
number_of_instances: 1
instantiation_level_3:
number_of_instances: 3
targets: [ VDU1 ]

View File

@ -0,0 +1,27 @@
tosca_definitions_version: tosca_simple_yaml_1_2
description: Sample VNF.
imports:
- etsi_nfv_sol001_common_types.yaml
- etsi_nfv_sol001_vnfd_types.yaml
- helloworld3_types.yaml
- tosca_with_vdus.yaml
topology_template:
inputs:
selected_flavour:
type: string
description: VNF deployment flavour selected by the consumer. It is provided in the API
node_templates:
VNF:
type: company.provider.VNF
properties:
descriptor_id: b1bb0ce7-ebca-4fa7-95ed-4840d70a1177
provider: Company
product_name: Sample VNF
software_version: '1.0'
descriptor_version: '1.0'
vnfm_info:
- Tacker

View File

@ -0,0 +1,113 @@
tosca_definitions_version: tosca_simple_yaml_1_2
description: Simple deployment flavour for Sample VNF
imports:
- etsi_nfv_sol001_common_types.yaml
- etsi_nfv_sol001_vnfd_types.yaml
- helloworld3_types.yaml
topology_template:
inputs:
descriptor_id:
type: string
descriptor_version:
type: string
provider:
type: string
product_name:
type: string
software_version:
type: string
vnfm_info:
type: list
entry_schema:
type: string
flavour_id:
type: string
flavour_description:
type: string
substitution_mappings:
node_type: company.provider.VNF
properties:
flavour_id: simple
requirements:
virtual_link_external: [ CP1, virtual_link ]
node_templates:
VDU1:
type: tosca.nodes.nfv.Vdu.Compute
properties:
name: VDU1
description: VDU1 compute node
vdu_profile:
min_number_of_instances: 1
max_number_of_instances: 1
capabilities:
virtual_compute:
properties:
virtual_memory:
virtual_mem_size: 512 MB
virtual_cpu:
num_virtual_cpu: 1
virtual_local_storage:
- size_of_storage: 1 GB
CP1:
type: tosca.nodes.nfv.VduCp
properties:
layer_protocols: [ ipv4 ]
order: 0
vnic_type: direct-physical
requirements:
- virtual_binding: VDU1
internalVL2:
type: tosca.nodes.nfv.VnfVirtualLink
properties:
connectivity_type:
layer_protocols: [ ipv4 ]
description: Internal Virtual link in the VNF
vl_profile:
max_bitrate_requirements:
root: 1048576
leaf: 1048576
min_bitrate_requirements:
root: 1048576
leaf: 1048576
virtual_link_protocol_data:
- associated_layer_protocol: ipv4
l3_protocol_data:
ip_version: ipv4
cidr: 11.11.0.0/24
policies:
- scaling_aspects:
type: tosca.policies.nfv.ScalingAspects
properties:
aspects:
worker_instance:
name: worker_instance_aspect
description: worker_instance scaling aspect
max_scale_level: 2
step_deltas:
- delta_1
- instantiation_levels:
type: tosca.policies.nfv.InstantiationLevels
properties:
levels:
instantiation_level_1:
description: Smallest size
scale_info:
worker_instance:
scale_level: 0
instantiation_level_2:
description: Largest size
scale_info:
worker_instance:
scale_level: 2
default_level: instantiation_level_3

View File

@ -0,0 +1,119 @@
tosca_definitions_version: tosca_simple_yaml_1_2
description: Simple deployment flavour for Sample VNF
imports:
- etsi_nfv_sol001_common_types.yaml
- etsi_nfv_sol001_vnfd_types.yaml
- helloworld3_types.yaml
topology_template:
inputs:
descriptor_id:
type: string
descriptor_version:
type: string
provider:
type: string
product_name:
type: string
software_version:
type: string
vnfm_info:
type: list
entry_schema:
type: string
flavour_id:
type: string
flavour_description:
type: string
substitution_mappings:
node_type: company.provider.VNF
properties:
flavour_id: simple
requirements:
virtual_link_external: [ CP1, virtual_link ]
node_templates:
VNF:
type: company.provider.VNF
properties:
descriptor_id: b1bb0ce7-ebca-4fa7-95ed-4840d70a1177
provider: Company
flavour_id: simple
product_name: Sample VNF
software_version: '1.0'
descriptor_version: '1.0'
vnfm_info:
- Tacker
VDU1:
type: tosca.nodes.nfv.Vdu.Compute
properties:
name: VDU1
description: VDU1 compute node
vdu_profile:
min_number_of_instances: 1
max_number_of_instances: 1
artifacts:
sw_image:
type: tosca.artifacts.nfv.SwImage
file: ../Files/images/cirros-0.4.0-x86_64-disk.img
capabilities:
virtual_compute:
properties:
virtual_memory:
virtual_mem_size: 512 MB
virtual_cpu:
num_virtual_cpu: 1
virtual_local_storage:
- size_of_storage: 1 GB
CP1:
type: tosca.nodes.nfv.VduCp
properties:
layer_protocols: [ ipv4 ]
order: 0
vnic_type: direct-physical
requirements:
- virtual_binding: VDU1
internalVL2:
type: tosca.nodes.nfv.VnfVirtualLink
properties:
connectivity_type:
layer_protocols: [ ipv4 ]
description: Internal Virtual link in the VNF
vl_profile:
max_bitrate_requirements:
root: 1048576
leaf: 1048576
min_bitrate_requirements:
root: 1048576
leaf: 1048576
virtual_link_protocol_data:
- associated_layer_protocol: ipv4
l3_protocol_data:
ip_version: ipv4
cidr: 11.11.0.0/24
policies:
- instantiation_levels:
type: tosca.policies.nfv.InstantiationLevels
properties:
levels:
instantiation_level_1:
description: Smallest size
scale_info:
worker_instance:
scale_level: 0
instantiation_level_2:
description: Largest size
scale_info:
worker_instance:
scale_level: 2
default_level: instantiation_level_1

View File

@ -0,0 +1,28 @@
tosca_definitions_version: tosca_simple_yaml_1_2
description: Sample VNF.
imports:
- etsi_nfv_sol001_common_types.yaml
- etsi_nfv_sol001_vnfd_types.yaml
- helloworld3_types.yaml
- tosca_with_vdus.yaml
topology_template:
inputs:
selected_flavour:
type: string
description: VNF deployment flavour selected by the consumer. It is provided in the API
node_templates:
VNF:
type: company.provider.VNF
properties:
descriptor_id: b1bb0ce7-ebca-4fa7-95ed-4840d70a1177
provider: Company
flavour_id: { get_input: selected_flavour }
product_name: Sample VNF
software_version: '1.0'
descriptor_version: '1.0'
vnfm_info:
- Tacker

View File

@ -0,0 +1,132 @@
tosca_definitions_version: tosca_simple_yaml_1_2
description: Simple deployment flavour for Sample VNF
imports:
- etsi_nfv_sol001_common_types.yaml
- etsi_nfv_sol001_vnfd_types.yaml
- helloworld3_types.yaml
topology_template:
inputs:
descriptor_id:
type: string
descriptor_version:
type: string
provider:
type: string
product_name:
type: string
software_version:
type: string
vnfm_info:
type: list
entry_schema:
type: string
flavour_id:
type: string
flavour_description:
type: string
substitution_mappings:
node_type: company.provider.VNF
properties:
flavour_id: simple
requirements:
virtual_link_external: [ CP1, virtual_link ]
node_templates:
VNF:
type: company.provider.VNF
properties:
descriptor_id: b1bb0ce7-ebca-4fa7-95ed-4840d70a1177
provider: Company
flavour_id: simple
product_name: Sample VNF
software_version: '1.0'
descriptor_version: '1.0'
vnfm_info:
- Tacker
VDU1:
type: tosca.nodes.nfv.Vdu.Compute
properties:
name: VDU1
description: VDU1 compute node
vdu_profile:
min_number_of_instances: 1
max_number_of_instances: 1
sw_image_data:
name: Software of VDU1
version: '0.4.0'
checksum:
algorithm: sha-256
hash: b9c3036539fd7a5f87a1bf38eb05fdde8b556a1a7e664dbeda90ed3cd74b4f9d
container_format: bare
disk_format: qcow2
min_disk: 1 GB
size: 1 GB
artifacts:
sw_image:
type: tosca.artifacts.nfv.SwImage
file: ../Files/images/cirros-0.4.0-x86_64-disk.img
sw_image1:
type: tosca.artifacts.nfv.SwImage
file: ../Files/images/cirros-0.4.0-x86_64-disk.img
capabilities:
virtual_compute:
properties:
virtual_memory:
virtual_mem_size: 512 MB
virtual_cpu:
num_virtual_cpu: 1
virtual_local_storage:
- size_of_storage: 1 GB
CP1:
type: tosca.nodes.nfv.VduCp
properties:
layer_protocols: [ ipv4 ]
order: 0
vnic_type: direct-physical
requirements:
- virtual_binding: VDU1
internalVL2:
type: tosca.nodes.nfv.VnfVirtualLink
properties:
connectivity_type:
layer_protocols: [ ipv4 ]
description: Internal Virtual link in the VNF
vl_profile:
max_bitrate_requirements:
root: 1048576
leaf: 1048576
min_bitrate_requirements:
root: 1048576
leaf: 1048576
virtual_link_protocol_data:
- associated_layer_protocol: ipv4
l3_protocol_data:
ip_version: ipv4
cidr: 11.11.0.0/24
policies:
- instantiation_levels:
type: tosca.policies.nfv.InstantiationLevels
properties:
levels:
instantiation_level_1:
description: Smallest size
scale_info:
worker_instance:
scale_level: 0
instantiation_level_2:
description: Largest size
scale_info:
worker_instance:
scale_level: 2
default_level: instantiation_level_1

View File

@ -0,0 +1,22 @@
tosca_definitions_version: tosca_simple_yaml_1_2
description: Sample VNF.
imports:
- etsi_nfv_sol001_common_types.yaml
- etsi_nfv_sol001_vnfd_types.yaml
- helloworld3_types.yaml
- tosca_with_vdus.yaml
topology_template:
node_templates:
VNF:
type: company.provider.VNF
properties:
descriptor_id: b1bb0ce7-ebca-4fa7-95ed-4840d70a1177
provider: Company
product_name: Sample VNF
software_version: '1.0'
descriptor_version: '1.0'
vnfm_info:
- Tacker

View File

@ -0,0 +1,93 @@
tosca_definitions_version: tosca_simple_yaml_1_2
description: Simple deployment flavour for Sample VNF
imports:
- etsi_nfv_sol001_common_types.yaml
- etsi_nfv_sol001_vnfd_types.yaml
- helloworld3_types.yaml
topology_template:
inputs:
descriptor_id:
type: string
descriptor_version:
type: string
provider:
type: string
product_name:
type: string
software_version:
type: string
vnfm_info:
type: list
entry_schema:
type: string
flavour_id:
type: string
flavour_description:
type: string
substitution_mappings:
node_type: company.provider.VNF
properties:
provider: Company
requirements:
virtual_link_external: [ CP1, virtual_link ]
node_templates:
VNF:
type: company.provider.VNF
properties:
provider: Company
VDU1:
type: tosca.nodes.nfv.Vdu.Compute
properties:
name: VDU1
description: VDU1 compute node
vdu_profile:
min_number_of_instances: 1
max_number_of_instances: 1
capabilities:
virtual_compute:
properties:
virtual_memory:
virtual_mem_size: 512 MB
virtual_cpu:
num_virtual_cpu: 1
virtual_local_storage:
- size_of_storage: 1 GB
CP1:
type: tosca.nodes.nfv.VduCp
properties:
layer_protocols: [ ipv4 ]
order: 0
vnic_type: direct-physical
requirements:
- virtual_binding: VDU1
internalVL2:
type: tosca.nodes.nfv.VnfVirtualLink
properties:
connectivity_type:
layer_protocols: [ ipv4 ]
description: Internal Virtual link in the VNF
vl_profile:
max_bitrate_requirements:
root: 1048576
leaf: 1048576
min_bitrate_requirements:
root: 1048576
leaf: 1048576
virtual_link_protocol_data:
- associated_layer_protocol: ipv4
l3_protocol_data:
ip_version: ipv4
cidr: 11.11.0.0/24
policies:
- instantiation_levels:
type: tosca.policies.nfv.InstantiationLevels

View File

@ -0,0 +1,95 @@
tosca_definitions_version: tosca_simple_yaml_1_2
description: Simple deployment flavour for Sample VNF
imports:
- etsi_nfv_sol001_common_types.yaml
- etsi_nfv_sol001_vnfd_types.yaml
- helloworld3_types.yaml
topology_template:
inputs:
descriptor_id:
type: string
descriptor_version:
type: string
provider:
type: string
product_name:
type: string
software_version:
type: string
vnfm_info:
type: list
entry_schema:
type: string
flavour_id:
type: string
flavour_description:
type: string
substitution_mappings:
node_type: company.provider.VNF
properties:
provider: Company
requirements:
virtual_link_external: [ CP1, virtual_link ]
node_templates:
VNF:
type: company.provider.VNF
properties:
descriptor_id: b1bb0ce7-ebca-4fa7-95ed-4840d70a1177
provider: Company
VDU1:
type: tosca.nodes.nfv.Vdu.Compute
properties:
name: VDU1
description: VDU1 compute node
vdu_profile:
min_number_of_instances: 1
max_number_of_instances: 1
capabilities:
virtual_compute:
properties:
virtual_memory:
virtual_mem_size: 512 MB
virtual_cpu:
num_virtual_cpu: 1
virtual_local_storage:
- size_of_storage: 1 GB
CP1:
type: tosca.nodes.nfv.VduCp
properties:
layer_protocols: [ ipv4 ]
order: 0
vnic_type: direct-physical
requirements:
- virtual_binding: VDU1
internalVL2:
type: tosca.nodes.nfv.VnfVirtualLink
properties:
connectivity_type:
layer_protocols: [ ipv4 ]
description: Internal Virtual link in the VNF
vl_profile:
max_bitrate_requirements:
root: 1048576
leaf: 1048576
min_bitrate_requirements:
root: 1048576
leaf: 1048576
virtual_link_protocol_data:
- associated_layer_protocol: ipv4
l3_protocol_data:
ip_version: ipv4
cidr: 11.11.0.0/24
policies:
- instantiation_levels:
type: tosca.policies.nfv.InstantiationLevels
properties:

View File

@ -0,0 +1,27 @@
tosca_definitions_version: tosca_simple_yaml_1_2
description: Sample VNF.
imports:
- etsi_nfv_sol001_common_types.yaml
- etsi_nfv_sol001_vnfd_types.yaml
- helloworld3_types.yaml
- tosca_with_vdus.yaml
topology_template:
inputs:
selected_flavour:
type: string
description: VNF deployment flavour selected by the consumer. It is provided in the API
node_templates:
VNF:
type: company.provider.VNF
properties:
descriptor_id: b1bb0ce7-ebca-4fa7-95ed-4840d70a1177
provider: Company
product_name: Sample VNF
software_version: '1.0'
descriptor_version: '1.0'
vnfm_info:
- Tacker

View File

@ -0,0 +1,95 @@
tosca_definitions_version: tosca_simple_yaml_1_2
description: Simple deployment flavour for Sample VNF
imports:
- etsi_nfv_sol001_common_types.yaml
- etsi_nfv_sol001_vnfd_types.yaml
- helloworld3_types.yaml
topology_template:
inputs:
descriptor_id:
type: string
descriptor_version:
type: string
provider:
type: string
product_name:
type: string
software_version:
type: string
vnfm_info:
type: list
entry_schema:
type: string
flavour_id:
type: string
flavour_description:
type: string
substitution_mappings:
node_type: company.provider.VNF
properties:
flavour_id: simple
requirements:
virtual_link_external: [ CP1, virtual_link ]
node_templates:
VDU1:
type: tosca.nodes.nfv.Vdu.Compute
properties:
name: VDU1
description: VDU1 compute node
vdu_profile:
min_number_of_instances: 1
max_number_of_instances: 1
capabilities:
virtual_compute:
properties:
virtual_memory:
virtual_mem_size: 512 MB
virtual_cpu:
num_virtual_cpu: 1
virtual_local_storage:
- size_of_storage: 1 GB
CP1:
type: tosca.nodes.nfv.VduCp
properties:
layer_protocols: [ ipv4 ]
order: 0
vnic_type: direct-physical
requirements:
- virtual_binding: VDU1
internalVL2:
type: tosca.nodes.nfv.VnfVirtualLink
properties:
connectivity_type:
layer_protocols: [ ipv4 ]
description: Internal Virtual link in the VNF
vl_profile:
max_bitrate_requirements:
root: 1048576
leaf: 1048576
min_bitrate_requirements:
root: 1048576
leaf: 1048576
virtual_link_protocol_data:
- associated_layer_protocol: ipv4
l3_protocol_data:
ip_version: ipv4
cidr: 11.11.0.0/24
policies:
- VDU1_instantiation_levels:
type: tosca.policies.nfv.VduInstantiationLevels
properties:
levels:
instantiation_level_1:
number_of_instances: 1
instantiation_level_2:
number_of_instances: 3
targets: [ VDU1 ]

View File

@ -0,0 +1,116 @@
tosca_definitions_version: tosca_simple_yaml_1_2
description: Simple deployment flavour for Sample VNF
imports:
- etsi_nfv_sol001_common_types.yaml
- etsi_nfv_sol001_vnfd_types.yaml
- helloworld3_types.yaml
topology_template:
inputs:
descriptor_id:
type: string
descriptor_version:
type: string
provider:
type: string
product_name:
type: string
software_version:
type: string
vnfm_info:
type: list
entry_schema:
type: string
flavour_id:
type: string
flavour_description:
type: string
substitution_mappings:
node_type: company.provider.VNF
properties:
flavour_id: simple
requirements:
virtual_link_external: [ CP1, virtual_link ]
node_templates:
VNF:
type: company.provider.VNF
properties:
flavour_description: A simple flavour
interfaces:
Vnflcm:
instantiate: []
instantiate_start: []
instantiate_end: []
terminate: []
terminate_start: []
terminate_end: []
modify_information: []
modify_information_start: []
modify_information_end: []
VDU1:
type: tosca.nodes.nfv.Vdu.Compute
properties:
name: VDU1
description: VDU1 compute node
vdu_profile:
min_number_of_instances: 1
max_number_of_instances: 1
sw_image_data:
name: Software of VDU1
version: '0.4.0'
checksum:
algorithm: sha-256
hash: b9c3036539fd7a5f87a1bf38eb05fdde8b556a1a7e664dbeda90ed3cd74b4f9d
container_format: bare
disk_format: qcow2
min_disk: 1 GB
size: 1 GB
artifacts:
sw_image:
file: ../Files/images/cirros-0.4.0-x86_64-disk.img
type: tosca.artifacts.nfv.SwImage
capabilities:
virtual_compute:
properties:
virtual_memory:
virtual_mem_size: 512 MB
virtual_cpu:
num_virtual_cpu: 1
virtual_local_storage:
- size_of_storage: 1 GB
CP1:
type: tosca.nodes.nfv.VduCp
properties:
layer_protocols: [ ipv4 ]
order: 0
vnic_type: direct-physical
requirements:
- virtual_binding: VDU1
- virtual_link: internalVL2
internalVL2:
type: tosca.nodes.nfv.VnfVirtualLink
properties:
connectivity_type:
layer_protocols: [ ipv4 ]
description: Internal Virtual link in the VNF
vl_profile:
max_bitrate_requirements:
root: 1048576
leaf: 1048576
min_bitrate_requirements:
root: 1048576
leaf: 1048576
virtual_link_protocol_data:
- associated_layer_protocol: ipv4
l3_protocol_data:
ip_version: ipv4
cidr: 11.11.0.0/24

View File

@ -0,0 +1,31 @@
tosca_definitions_version: tosca_simple_yaml_1_2
description: Sample VNF
imports:
- etsi_nfv_sol001_common_types.yaml
- etsi_nfv_sol001_vnfd_types.yaml
- helloworld3_types.yaml
- helloworld3_df_simple.yaml
topology_template:
inputs:
selected_flavour:
type: string
description: VNF deployment flavour selected by the consumer. It is provided in the API
node_templates:
VNF:
type: company.provider.VNF
properties:
flavour_id: { get_input: selected_flavour }
descriptor_id: b1bb0ce7-ebca-4fa7-95ed-4840d70a1177
provider: Company
product_name: Sample VNF
software_version: '1.0'
descriptor_version: '1.0'
vnfm_info:
- Tacker
requirements:
#- virtual_link_external # mapped in lower-level templates
#- virtual_link_internal # mapped in lower-level templates

View File

@ -0,0 +1,28 @@
tosca_definitions_version: tosca_simple_yaml_1_2
description: Sample VNF.
imports:
- etsi_nfv_sol001_common_types.yaml
- etsi_nfv_sol001_vnfd_types.yaml
- helloworld3_types.yaml
- tosca_with_vdus.yaml
topology_template:
inputs:
selected_flavour:
type: string
description: VNF deployment flavour selected by the consumer. It is provided in the API
node_templates:
VNF:
type: company.provider.VNF
properties:
descriptor_id: b1bb0ce7-ebca-4fa7-95ed-4840d70a1177
provider: Company
flavour_id: { get_input: selected_flavour }
product_name: Sample VNF
software_version: '1.0'
descriptor_version: '1.0'
vnfm_info:
- Tacker

View File

@ -0,0 +1,119 @@
tosca_definitions_version: tosca_simple_yaml_1_2
description: Simple deployment flavour for Sample VNF
imports:
- etsi_nfv_sol001_common_types.yaml
- etsi_nfv_sol001_vnfd_types.yaml
- helloworld3_types.yaml
topology_template:
inputs:
descriptor_id:
type: string
descriptor_version:
type: string
provider:
type: string
product_name:
type: string
software_version:
type: string
vnfm_info:
type: list
entry_schema:
type: string
flavour_id:
type: string
flavour_description:
type: string
substitution_mappings:
node_type: company.provider.VNF
properties:
flavour_id: simple
requirements:
virtual_link_external: [ CP1, virtual_link ]
node_templates:
VNF:
type: company.provider.VNF
properties:
descriptor_id: b1bb0ce7-ebca-4fa7-95ed-4840d70a1177
provider: Company
flavour_id: simple
product_name: Sample VNF
software_version: '1.0'
descriptor_version: '1.0'
vnfm_info:
- Tacker
VDU1:
type: tosca.nodes.nfv.Vdu.Compute
properties:
name: VDU1
description: VDU1 compute node
vdu_profile:
min_number_of_instances: 1
max_number_of_instances: 1
artifacts:
sw_image:
type: tosca.artifacts.nfv.SwImage
file: ../Files/images/cirros-0.4.0-x86_64-disk.img
capabilities:
virtual_compute:
properties:
virtual_memory:
virtual_mem_size: 512 MB
virtual_cpu:
num_virtual_cpu: 1
virtual_local_storage:
- size_of_storage: 1 GB
CP1:
type: tosca.nodes.nfv.VduCp
properties:
layer_protocols: [ ipv4 ]
order: 0
vnic_type: direct-physical
requirements:
- virtual_binding: VDU1
internalVL2:
type: tosca.nodes.nfv.VnfVirtualLink
properties:
connectivity_type:
layer_protocols: [ ipv4 ]
description: Internal Virtual link in the VNF
vl_profile:
max_bitrate_requirements:
root: 1048576
leaf: 1048576
min_bitrate_requirements:
root: 1048576
leaf: 1048576
virtual_link_protocol_data:
- associated_layer_protocol: ipv4
l3_protocol_data:
ip_version: ipv4
cidr: 11.11.0.0/24
policies:
- instantiation_levels:
type: tosca.policies.nfv.InstantiationLevels
properties:
levels:
instantiation_level_1:
description: Smallest size
scale_info:
worker_instance:
scale_level: 0
instantiation_level_2:
description: Largest size
scale_info:
worker_instance:
scale_level: 2
default_level: instantiation_level_1

View File

@ -0,0 +1,20 @@
tosca_definitions_version: tosca_simple_yaml_1_2
description: Sample VNF.
imports:
- etsi_nfv_sol001_common_types.yaml
- etsi_nfv_sol001_vnfd_types.yaml
- helloworld3_types.yaml
- tosca_with_vdus.yaml
topology_template:
inputs:
selected_flavour:
type: string
description: VNF deployment flavour selected by the consumer. It is provided in the API
node_templates:
VNF:
type: company.provider.VNF
properties: {}

View File

@ -0,0 +1,239 @@
tosca_definitions_version: tosca_simple_yaml_1_2
description: Simple deployment flavour for Sample VNF
imports:
- etsi_nfv_sol001_common_types.yaml
- etsi_nfv_sol001_vnfd_types.yaml
- helloworld3_types.yaml
topology_template:
inputs:
descriptor_id:
type: string
descriptor_version:
type: string
provider:
type: string
product_name:
type: string
software_version:
type: string
vnfm_info:
type: list
entry_schema:
type: string
flavour_id:
type: string
flavour_description:
type: string
substitution_mappings:
node_type: company.provider.VNF
properties:
flavour_id: simple
requirements:
virtual_link_external: [ CP1, virtual_link ]
node_templates:
VDU1:
type: tosca.nodes.nfv.Vdu.Compute
properties:
name: VDU1
description: VDU1 compute node
vdu_profile:
min_number_of_instances: 1
max_number_of_instances: 1
sw_image_data:
name: Software of VDU1
version: '0.4.0'
checksum:
algorithm: sha-256
hash: b9c3036539fd7a5f87a1bf38eb05fdde8b556a1a7e664dbeda90ed3cd74b4f9d
container_format: bare
disk_format: qcow2
min_disk: 1 GB
size: 1 GB
artifacts:
sw_image:
type: tosca.artifacts.nfv.SwImage
file: ../Files/images/cirros-0.4.0-x86_64-disk.img
capabilities:
virtual_compute:
properties:
virtual_memory:
virtual_mem_size: 512 MB
virtual_cpu:
num_virtual_cpu: 1
virtual_local_storage:
- size_of_storage: 1 GB
VDU2:
type: tosca.nodes.nfv.Vdu.Compute
properties:
name: VDU2
description: VDU2 compute node
vdu_profile:
min_number_of_instances: 1
max_number_of_instances: 3
capabilities:
virtual_compute:
properties:
virtual_memory:
virtual_mem_size: 512 MB
virtual_cpu:
num_virtual_cpu: 1
virtual_local_storage:
- size_of_storage: 1 GB
requirements:
- virtual_storage: VirtualStorage
VirtualStorage:
type: tosca.nodes.nfv.Vdu.VirtualBlockStorage
properties:
virtual_block_storage_data:
size_of_storage: 30 GB
rdma_enabled: true
sw_image_data:
name: VrtualStorage
version: '0.4.0'
checksum:
algorithm: sha-256
hash: b9c3036539fd7a5f87a1bf38eb05fdde8b556a1a7e664dbeda90ed3cd74b4f9d
container_format: bare
disk_format: qcow2
min_disk: 2 GB
min_ram: 8192 MB
size: 2 GB
artifacts:
sw_image:
type: tosca.artifacts.nfv.SwImage
file: ../Files/images/cirros-0.4.0-x86_64-disk.img
CP1:
type: tosca.nodes.nfv.VduCp
properties:
layer_protocols: [ ipv4 ]
order: 0
vnic_type: direct-physical
requirements:
- virtual_binding: VDU1
#- virtual_link: # the target node is determined in the NSD
CP2:
type: tosca.nodes.nfv.VduCp
properties:
layer_protocols: [ ipv4 ]
order: 1
requirements:
- virtual_binding: VDU1
- virtual_link: internalVL2
CP3:
type: tosca.nodes.nfv.VduCp
properties:
layer_protocols: [ ipv4 ]
order: 2
requirements:
- virtual_binding: VDU2
- virtual_link: internalVL2
internalVL2:
type: tosca.nodes.nfv.VnfVirtualLink
properties:
connectivity_type:
layer_protocols: [ ipv4 ]
description: Internal Virtual link in the VNF
vl_profile:
max_bitrate_requirements:
root: 1048576
leaf: 1048576
min_bitrate_requirements:
root: 1048576
leaf: 1048576
virtual_link_protocol_data:
- associated_layer_protocol: ipv4
l3_protocol_data:
ip_version: ipv4
cidr: 11.11.0.0/24
policies:
- scaling_aspects:
type: tosca.policies.nfv.ScalingAspects
properties:
aspects:
worker_instance:
name: worker_instance_aspect
description: worker_instance scaling aspect
max_scale_level: 2
step_deltas:
- delta_1
- VDU2_initial_delta:
type: tosca.policies.nfv.VduInitialDelta
properties:
initial_delta:
number_of_instances: 1
targets: [ VDU2 ]
- VDU2_scaling_aspect_deltas:
type: tosca.policies.nfv.VduScalingAspectDeltas
properties:
aspect: worker_instance
deltas:
delta_2:
number_of_instances: 1
targets: [ VDU2 ]
- instantiation_levels:
type: tosca.policies.nfv.InstantiationLevels
properties:
levels:
instantiation_level_1:
description: Smallest size
scale_info:
worker_instance:
scale_level: 0
instantiation_level_2:
description: Largest size
scale_info:
worker_instance:
scale_level: 2
default_level: instantiation_level_1
- VDU1_instantiation_levels:
type: tosca.policies.nfv.VduInstantiationLevels
properties:
levels:
instantiation_level_1:
number_of_instances: 1
instantiation_level_2:
number_of_instances: 3
targets: [ VDU1 ]
- VDU2_instantiation_levels:
type: tosca.policies.nfv.VduInstantiationLevels
properties:
levels:
instantiation_level_1:
number_of_instances: 1
instantiation_level_2:
number_of_instances: 1
targets: [ VDU2 ]
- internalVL2_instantiation_levels:
type: tosca.policies.nfv.VirtualLinkInstantiationLevels
properties:
levels:
instantiation_level_1:
bitrate_requirements:
root: 1048576
leaf: 1048576
instantiation_level_2:
bitrate_requirements:
root: 1048576
leaf: 1048576
targets: [ internalVL2 ]

View File

@ -0,0 +1,53 @@
tosca_definitions_version: tosca_simple_yaml_1_2
description: VNF type definition
imports:
- etsi_nfv_sol001_common_types.yaml
- etsi_nfv_sol001_vnfd_types.yaml
node_types:
company.provider.VNF:
derived_from: tosca.nodes.nfv.VNF
properties:
descriptor_id:
type: string
constraints: [ valid_values: [ b1bb0ce7-ebca-4fa7-95ed-4840d70a1177 ] ]
default: b1bb0ce7-ebca-4fa7-95ed-4840d70a1177
descriptor_version:
type: string
constraints: [ valid_values: [ '1.0' ] ]
default: '1.0'
provider:
type: string
constraints: [ valid_values: [ 'Company' ] ]
default: 'Company'
product_name:
type: string
constraints: [ valid_values: [ 'Sample VNF' ] ]
default: 'Sample VNF'
software_version:
type: string
constraints: [ valid_values: [ '1.0' ] ]
default: '1.0'
vnfm_info:
type: list
entry_schema:
type: string
constraints: [ valid_values: [ Tacker ] ]
default: [ Tacker ]
flavour_id:
type: string
constraints: [ valid_values: [ simple ] ]
default: simple
flavour_description:
type: string
default: ""
requirements:
- virtual_link_external:
capability: tosca.capabilities.nfv.VirtualLinkable
- virtual_link_internal:
capability: tosca.capabilities.nfv.VirtualLinkable
interfaces:
Vnflcm:
type: tosca.interfaces.nfv.Vnflcm

View File

@ -0,0 +1,7 @@
TOSCA-Meta-File-Version: 1.0
Created-by: Hiroyuki JO
CSAR-Version: 1.1
Entry-Definitions: Definitions/main_tosca.yaml
Name: Files/images/cirros-0.4.0-x86_64-disk.img
Content-type: application/x-iso9066-image

View File

@ -14,8 +14,11 @@
import os
import shutil
import tempfile
import testtools
from unittest import mock
import uuid
import zipfile
from tacker.common import csar_utils
from tacker.common import exceptions
@ -29,15 +32,12 @@ class TestCSARUtils(testtools.TestCase):
def setUp(self):
super(TestCSARUtils, self).setUp()
self.context = context.get_admin_context()
self.base_path = os.path.dirname(os.path.abspath(__file__))
def _get_csar_file_path(self, file_name):
return os.path.join(
self.base_path, "../../etc/samples", file_name)
@mock.patch('tacker.common.csar_utils.extract_csar_zip_file')
def test_load_csar_data(self, mock_extract_csar_zip_file):
file_path = self._get_csar_file_path("sample_vnf_package_csar.zip")
file_path, _ = utils.create_csar_with_unique_vnfd_id(
'./tacker/tests/etc/samples/etsi/nfv/vnfpkgm1')
self.addCleanup(os.remove, file_path)
vnf_data, flavours = csar_utils.load_csar_data(
self.context, constants.UUID, file_path)
self.assertEqual(vnf_data['descriptor_version'], '1.0')
@ -48,8 +48,10 @@ class TestCSARUtils(testtools.TestCase):
@mock.patch('tacker.common.csar_utils.extract_csar_zip_file')
def test_load_csar_data_with_single_yaml(
self, mock_extract_csar_zip_file):
file_path = self._get_csar_file_path(
"sample_vnfpkg_no_meta_single_vnfd.zip")
file_path, _ = utils.create_csar_with_unique_vnfd_id(
'./tacker/tests/etc/samples/etsi/nfv/'
'sample_vnfpkg_no_meta_single_vnfd')
self.addCleanup(os.remove, file_path)
vnf_data, flavours = csar_utils.load_csar_data(
self.context, constants.UUID, file_path)
self.assertEqual(vnf_data['descriptor_version'], '1.0')
@ -57,11 +59,41 @@ class TestCSARUtils(testtools.TestCase):
self.assertEqual(flavours[0]['flavour_id'], 'simple')
self.assertIsNotNone(flavours[0]['sw_images'])
def _get_csar_zip_from_dir(self, dir_name):
csar_dir_path = os.path.join('test_csar_utils_data', dir_name)
unique_name = str(uuid.uuid4())
csar_temp_dir = os.path.join('/tmp', unique_name)
self.addCleanup(shutil.rmtree, csar_temp_dir)
utils.copy_csar_files(csar_temp_dir, csar_dir_path)
# Copy contents from 'test_csar_utils_common' to 'csar_temp_dir'.
common_dir_path = ('./tacker/tests/etc/samples/etsi/nfv/'
'test_csar_utils_data/test_csar_utils_common')
common_yaml_file = os.path.join(common_dir_path,
'Definitions/helloworld3_types.yaml')
shutil.copy(common_yaml_file,
os.path.join(csar_temp_dir, 'Definitions/'))
shutil.copytree(os.path.join(common_dir_path, "TOSCA-Metadata/"),
os.path.join(csar_temp_dir, "TOSCA-Metadata/"))
# Create temporary zip file from 'csar_temp_dir'
tempfd, tempname = tempfile.mkstemp(suffix=".zip", dir=csar_temp_dir)
os.close(tempfd)
zcsar = zipfile.ZipFile(tempname, 'w')
for (dpath, _, fnames) in os.walk(csar_temp_dir):
for fname in fnames:
src_file = os.path.join(dpath, fname)
dst_file = os.path.relpath(os.path.join(dpath, fname),
csar_temp_dir)
zcsar.write(src_file, dst_file)
zcsar.close()
return tempname
@mock.patch('tacker.common.csar_utils.extract_csar_zip_file')
def test_load_csar_data_without_instantiation_level(
self, mock_extract_csar_zip_file):
file_path = self._get_csar_file_path(
"csar_without_instantiation_level.zip")
file_path = self._get_csar_zip_from_dir(
'csar_without_instantiation_level')
exc = self.assertRaises(exceptions.InvalidCSAR,
csar_utils.load_csar_data,
self.context, constants.UUID, file_path)
@ -72,8 +104,8 @@ class TestCSARUtils(testtools.TestCase):
@mock.patch('tacker.common.csar_utils.extract_csar_zip_file')
def test_load_csar_data_with_invalid_instantiation_level(
self, mock_extract_csar_zip_file):
file_path = self._get_csar_file_path(
"csar_invalid_instantiation_level.zip")
file_path = self._get_csar_zip_from_dir(
'csar_invalid_instantiation_level')
exc = self.assertRaises(exceptions.InvalidCSAR,
csar_utils.load_csar_data,
self.context, constants.UUID, file_path)
@ -85,8 +117,8 @@ class TestCSARUtils(testtools.TestCase):
@mock.patch('tacker.common.csar_utils.extract_csar_zip_file')
def test_load_csar_data_with_invalid_default_instantiation_level(
self, mock_extract_csar_zip_file):
file_path = self._get_csar_file_path(
"csar_with_invalid_default_instantiation_level.zip")
file_path = self._get_csar_zip_from_dir(
'csar_with_invalid_default_instantiation_level')
exc = self.assertRaises(exceptions.InvalidCSAR,
csar_utils.load_csar_data,
self.context, constants.UUID, file_path)
@ -98,8 +130,8 @@ class TestCSARUtils(testtools.TestCase):
@mock.patch('tacker.common.csar_utils.extract_csar_zip_file')
def test_load_csar_data_without_vnfd_info(
self, mock_extract_csar_zip_file):
file_path = self._get_csar_file_path(
"csar_without_vnfd_info.zip")
file_path = self._get_csar_zip_from_dir(
'csar_without_vnfd_info')
exc = self.assertRaises(exceptions.InvalidCSAR,
csar_utils.load_csar_data,
self.context, constants.UUID, file_path)
@ -108,8 +140,8 @@ class TestCSARUtils(testtools.TestCase):
@mock.patch('tacker.common.csar_utils.extract_csar_zip_file')
def test_load_csar_data_with_artifacts_and_without_sw_image_data(
self, mock_extract_csar_zip_file):
file_path = self._get_csar_file_path(
"csar_without_sw_image_data.zip")
file_path = self._get_csar_zip_from_dir(
'csar_without_sw_image_data')
exc = self.assertRaises(exceptions.InvalidCSAR,
csar_utils.load_csar_data,
self.context, constants.UUID, file_path)
@ -120,8 +152,8 @@ class TestCSARUtils(testtools.TestCase):
@mock.patch('tacker.common.csar_utils.extract_csar_zip_file')
def test_load_csar_data_with_multiple_sw_image_data(
self, mock_extract_csar_zip_file):
file_path = self._get_csar_file_path(
"csar_with_multiple_sw_image_data.zip")
file_path = self._get_csar_zip_from_dir(
'csar_with_multiple_sw_image_data')
exc = self.assertRaises(exceptions.InvalidCSAR,
csar_utils.load_csar_data,
self.context, constants.UUID, file_path)
@ -132,8 +164,8 @@ class TestCSARUtils(testtools.TestCase):
@mock.patch('tacker.common.csar_utils.extract_csar_zip_file')
def test_csar_with_missing_sw_image_data_in_main_template(
self, mock_extract_csar_zip_file):
file_path = self._get_csar_file_path(
"csar_with_missing_sw_image_data_in_main_template.zip")
file_path = self._get_csar_zip_from_dir(
'csar_with_missing_sw_image_data_in_main_template')
exc = self.assertRaises(exceptions.InvalidCSAR,
csar_utils.load_csar_data,
self.context, constants.UUID, file_path)
@ -144,7 +176,7 @@ class TestCSARUtils(testtools.TestCase):
@mock.patch('tacker.common.csar_utils.extract_csar_zip_file')
def test_load_csar_data_without_flavour_info(
self, mock_extract_csar_zip_file):
file_path = self._get_csar_file_path("csar_without_flavour_info.zip")
file_path = self._get_csar_zip_from_dir('csar_without_flavour_info')
exc = self.assertRaises(exceptions.InvalidCSAR,
csar_utils.load_csar_data,
self.context, constants.UUID, file_path)
@ -153,8 +185,8 @@ class TestCSARUtils(testtools.TestCase):
@mock.patch('tacker.common.csar_utils.extract_csar_zip_file')
def test_load_csar_data_without_flavour_info_in_main_template(
self, mock_extract_csar_zip_file):
file_path = self._get_csar_file_path(
"csar_without_flavour_info_in_main_template.zip")
file_path = self._get_csar_zip_from_dir(
'csar_without_flavour_info_in_main_template')
exc = self.assertRaises(exceptions.InvalidCSAR,
csar_utils.load_csar_data,
self.context, constants.UUID, file_path)
@ -171,7 +203,8 @@ class TestCSARUtils(testtools.TestCase):
@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 = self._get_csar_file_path("csar_without_policies.zip")
file_path = self._get_csar_zip_from_dir(
'csar_without_policies')
vnf_data, flavours = csar_utils.load_csar_data(
self.context, constants.UUID, file_path)
self.assertIsNone(flavours[0].get('instantiation_levels'))

View File

@ -18,9 +18,11 @@ import os
from oslo_config import cfg
import shutil
import tempfile
import uuid
import yaml
import zipfile
from tacker.tests import utils
from tacker.tests import uuidsentinel
@ -73,32 +75,27 @@ def make_vnfd_files_list(csar_path):
return files_list
def create_fake_csar_dir(vnf_package_id, single_yaml_csar=False):
base_path = os.path.dirname(os.path.abspath(__file__))
csar_file = ('sample_vnfpkg_no_meta_single_vnfd.zip' if single_yaml_csar
else 'sample_vnf_package_csar.zip')
sample_vnf_package_zip = os.path.join(base_path, "../../etc/samples",
csar_file)
tmpdir = tempfile.mkdtemp()
fake_csar = os.path.join('/tmp/', vnf_package_id)
os.rename(tmpdir, fake_csar)
with zipfile.ZipFile(sample_vnf_package_zip, 'r') as zf:
zf.extractall(fake_csar)
cfg.CONF.set_override('vnf_package_csar_path', '/tmp',
def create_fake_csar_dir(vnf_package_id, temp_dir,
csar_without_tosca_meta=False):
csar_dir = ('sample_vnfpkg_no_meta_single_vnfd' if csar_without_tosca_meta
else 'vnfpkgm1')
fake_csar = os.path.join(temp_dir, vnf_package_id)
cfg.CONF.set_override('vnf_package_csar_path', temp_dir,
group='vnf_package')
utils.copy_csar_files(fake_csar, csar_dir, csar_without_tosca_meta)
return fake_csar
def get_expected_vnfd_data():
base_path = os.path.dirname(os.path.abspath(__file__))
sample_vnf_package_zip = os.path.join(
base_path, "../../etc/samples/sample_vnf_package_csar.zip")
def get_expected_vnfd_data(zip_file=None):
if zip_file:
csar_temp_dir = tempfile.mkdtemp()
with zipfile.ZipFile(sample_vnf_package_zip, 'r') as zf:
with zipfile.ZipFile(zip_file, 'r') as zf:
zf.extractall(csar_temp_dir)
else:
unique_name = str(uuid.uuid4())
csar_temp_dir = os.path.join('/tmp', unique_name)
utils.copy_csar_files(csar_temp_dir, 'vnfpkgm1', read_vnfd_only=True)
file_names = ['TOSCA-Metadata/TOSCA.meta',
'Definitions/etsi_nfv_sol001_vnfd_types.yaml',
@ -108,8 +105,9 @@ def get_expected_vnfd_data():
'Definitions/etsi_nfv_sol001_common_types.yaml']
file_path_and_data = {}
for file_name in file_names:
with io.open(os.path.join(csar_temp_dir, file_name)) as f:
file_path_and_data.update({file_name: yaml.dump(yaml.safe_load(
io.open(os.path.join(csar_temp_dir, file_name))))})
f))})
shutil.rmtree(csar_temp_dir)
return file_path_and_data

View File

@ -18,6 +18,7 @@ import shutil
import sys
from unittest import mock
import fixtures
from glance_store import exceptions as store_exceptions
from oslo_config import cfg
from six.moves import urllib
@ -37,6 +38,7 @@ from tacker.tests.unit.conductor import fakes
from tacker.tests.unit.db.base import SqlTestCase
from tacker.tests.unit.objects import fakes as fake_obj
from tacker.tests.unit.vnflcm import fakes as vnflcm_fakes
from tacker.tests import utils
from tacker.tests import uuidsentinel
CONF = tacker.conf.CONF
@ -60,6 +62,7 @@ class TestConductor(SqlTestCase):
self._mock_vnfm_plugin()
self.conductor = conductor_server.Conductor('host')
self.vnf_package = self._create_vnf_package()
self.temp_dir = self.useFixture(fixtures.TempDir()).path
def _mock_vnfm_plugin(self):
self.vnfm_plugin = mock.Mock(wraps=FakeVNFMPlugin())
@ -131,16 +134,17 @@ class TestConductor(SqlTestCase):
mock_delete_csar.assert_called()
def test_get_vnf_package_vnfd_with_tosca_meta_file_in_csar(self):
fake_csar = fakes.create_fake_csar_dir(self.vnf_package.id)
expected_data = fakes.get_expected_vnfd_data()
fake_csar = fakes.create_fake_csar_dir(self.vnf_package.id,
self.temp_dir)
result = self.conductor.get_vnf_package_vnfd(self.context,
self.vnf_package)
expected_data = fakes.get_expected_vnfd_data()
self.assertEqual(expected_data, result)
shutil.rmtree(fake_csar)
def test_get_vnf_package_vnfd_with_single_yaml_csar(self):
fake_csar = fakes.create_fake_csar_dir(self.vnf_package.id,
single_yaml_csar=True)
fake_csar = fakes.create_fake_csar_dir(
self.vnf_package.id, self.temp_dir, csar_without_tosca_meta=True)
result = self.conductor.get_vnf_package_vnfd(self.context,
self.vnf_package)
# only one key present in the result shows that it contains only one
@ -151,19 +155,18 @@ class TestConductor(SqlTestCase):
@mock.patch.object(glance_store, 'load_csar')
def test_get_vnf_package_vnfd_download_from_glance_store(self,
mock_load_csar):
fake_csar = os.path.join('/tmp/', self.vnf_package.id)
cfg.CONF.set_override('vnf_package_csar_path', '/tmp',
fake_csar = os.path.join(self.temp_dir, self.vnf_package.id)
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir,
group='vnf_package')
# Scenario in which csar path is not present in the local storage.
base_path = os.path.dirname(os.path.abspath(__file__))
sample_vnf_package = os.path.join(
base_path, "../../etc/samples/sample_vnf_package_csar.zip")
mock_load_csar.return_value = sample_vnf_package
expected_data = fakes.get_expected_vnfd_data()
fake_csar_zip, _ = utils.create_csar_with_unique_vnfd_id(
'./tacker/tests/etc/samples/etsi/nfv/vnfpkgm1')
mock_load_csar.return_value = fake_csar_zip
expected_data = fakes.get_expected_vnfd_data(zip_file=fake_csar_zip)
result = self.conductor.get_vnf_package_vnfd(self.context,
self.vnf_package)
self.assertEqual(expected_data, result)
shutil.rmtree(fake_csar)
os.remove(fake_csar_zip)
@mock.patch.object(glance_store, 'load_csar')
def test_get_vnf_package_vnfd_exception_from_glance_store(self,
@ -176,7 +179,8 @@ class TestConductor(SqlTestCase):
@mock.patch.object(conductor_server.Conductor, '_read_vnfd_files')
def test_get_vnf_package_vnfd_exception_from_read_vnfd_files(
self, mock_read_vnfd_files):
fake_csar = fakes.create_fake_csar_dir(self.vnf_package.id)
fake_csar = fakes.create_fake_csar_dir(self.vnf_package.id,
self.temp_dir)
mock_read_vnfd_files.side_effect = yaml.YAMLError
self.assertRaises(exceptions.FailedToGetVnfdData,
self.conductor.get_vnf_package_vnfd, self.context,

View File

@ -26,6 +26,7 @@ from tacker import objects
from tacker.objects import fields
from tacker.tests.unit.db import base as db_base
from tacker.tests.unit.vnflcm import fakes
from tacker.tests import utils as test_utils
from tacker.tests import uuidsentinel
from tacker.vnflcm import vnflcm_driver
from tacker.vnfm import vim_client
@ -127,24 +128,6 @@ class TestVnflcmDriver(db_base.SqlTestCase):
'test_project'}, 'vim_type': 'openstack'}
self.vim_client.get_vim.return_value = vim_obj
def _copy_csar_files(self, fake_csar_path, csar_file_name):
sample_vnf_package = os.path.join(
"./tacker/tests/etc/samples/etsi/nfv", csar_file_name)
shutil.copytree(sample_vnf_package, fake_csar_path)
common_files_path = os.path.join(
"./tacker/tests/etc/samples/etsi/nfv/common/")
tosca_definition_file_path = os.path.join(common_files_path,
"Definitions/")
for (dpath, _, fnames) in os.walk(tosca_definition_file_path):
if not fnames:
continue
for fname in fnames:
src_file = os.path.join(dpath, fname)
shutil.copy(src_file, os.path.join(fake_csar_path,
"Definitions"))
shutil.copytree(os.path.join(common_files_path, "Files/"),
os.path.join(fake_csar_path, "Files/"))
@mock.patch.object(objects.VnfResource, 'create')
@mock.patch.object(objects.VnfPackageVnfd, 'get_by_id')
@mock.patch.object(objects.VnfInstance, "save")
@ -162,7 +145,7 @@ class TestVnflcmDriver(db_base.SqlTestCase):
fake_csar = os.path.join(self.temp_dir, vnf_package_id)
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir,
group='vnf_package')
self._copy_csar_files(fake_csar, "vnflcm4")
test_utils.copy_csar_files(fake_csar, "vnflcm4")
self._mock_vnf_manager()
driver = vnflcm_driver.VnfLcmDriver()
driver.instantiate_vnf(self.context, vnf_instance_obj,
@ -192,7 +175,7 @@ class TestVnflcmDriver(db_base.SqlTestCase):
fake_csar = os.path.join(self.temp_dir, vnf_package_id)
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir,
group='vnf_package')
self._copy_csar_files(fake_csar, "vnflcm4")
test_utils.copy_csar_files(fake_csar, "vnflcm4")
self._mock_vnf_manager()
driver = vnflcm_driver.VnfLcmDriver()
driver.instantiate_vnf(self.context, vnf_instance_obj,
@ -222,7 +205,7 @@ class TestVnflcmDriver(db_base.SqlTestCase):
fake_csar = os.path.join(self.temp_dir, vnf_package_id)
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir,
group='vnf_package')
self._copy_csar_files(fake_csar, "vnflcm4")
test_utils.copy_csar_files(fake_csar, "vnflcm4")
self._mock_vnf_manager()
driver = vnflcm_driver.VnfLcmDriver()
driver.instantiate_vnf(self.context, vnf_instance_obj,
@ -252,7 +235,7 @@ class TestVnflcmDriver(db_base.SqlTestCase):
fake_csar = os.path.join(self.temp_dir, vnf_package_id)
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir,
group='vnf_package')
self._copy_csar_files(fake_csar, "vnflcm4")
test_utils.copy_csar_files(fake_csar, "vnflcm4")
self._mock_vnf_manager(fail_method_name="instantiate_vnf")
driver = vnflcm_driver.VnfLcmDriver()
error = self.assertRaises(exceptions.VnfInstantiationFailed,
@ -288,7 +271,7 @@ class TestVnflcmDriver(db_base.SqlTestCase):
fake_csar = os.path.join(self.temp_dir, vnf_package_id)
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir,
group='vnf_package')
self._copy_csar_files(fake_csar, "vnflcm4")
test_utils.copy_csar_files(fake_csar, "vnflcm4")
self._mock_vnf_manager(fail_method_name='create_wait')
driver = vnflcm_driver.VnfLcmDriver()
error = self.assertRaises(exceptions.VnfInstantiationWaitFailed,
@ -322,7 +305,7 @@ class TestVnflcmDriver(db_base.SqlTestCase):
fake_csar = os.path.join(self.temp_dir, vnf_package_id)
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir,
group='vnf_package')
self._copy_csar_files(
test_utils.copy_csar_files(
fake_csar, "sample_vnf_package_csar_with_short_notation")
self._mock_vnf_manager(vnf_resource_count=2)
driver = vnflcm_driver.VnfLcmDriver()
@ -452,7 +435,7 @@ class TestVnflcmDriver(db_base.SqlTestCase):
fake_csar = os.path.join(self.temp_dir, vnf_package_id)
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir,
group='vnf_package')
self._copy_csar_files(fake_csar, "vnflcm4")
test_utils.copy_csar_files(fake_csar, "vnflcm4")
mock_vnf_resource_list.return_value = [fakes.return_vnf_resource()]
# Heal as per SOL003 i.e. without vnfcInstanceId
heal_vnf_req = objects.HealVnfRequest()
@ -536,7 +519,7 @@ class TestVnflcmDriver(db_base.SqlTestCase):
fake_csar = os.path.join(self.temp_dir, vnf_package_id)
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir,
group='vnf_package')
self._copy_csar_files(fake_csar, "vnflcm4")
test_utils.copy_csar_files(fake_csar, "vnflcm4")
mock_vnf_resource_list.return_value = [fakes.return_vnf_resource()]
# Heal as per SOL003 i.e. without vnfcInstanceId
heal_vnf_req = objects.HealVnfRequest()

View File

@ -20,10 +20,9 @@ import io
import iso8601
import os
import shutil
import tempfile
import uuid
import webob
import yaml
import zipfile
from tacker.api.vnfpkgm.v1.router import VnfpkgmAPIRouter
from tacker import context
@ -32,6 +31,7 @@ from tacker.objects import vnf_package as vnf_package_obj
from tacker.objects import vnf_package_vnfd as vnf_package_vnfd_obj
from tacker.objects import vnf_software_image as vnf_software_image_obj
from tacker.tests import constants
from tacker.tests import utils
from tacker.tests import uuidsentinel
from tacker import wsgi
@ -231,27 +231,27 @@ def wsgi_app_v1(fake_auth_context=None):
return api_v1
def return_vnfd_data(multiple_yaml_files=True):
base_path = os.path.dirname(os.path.abspath(__file__))
sample_vnf_package_zip = os.path.join(
base_path, "../../etc/samples/sample_vnf_package_csar.zip")
csar_temp_dir = tempfile.mkdtemp()
with zipfile.ZipFile(sample_vnf_package_zip, 'r') as zf:
zf.extractall(csar_temp_dir)
file_names = ['Definitions/etsi_nfv_sol001_vnfd_types.yaml']
if multiple_yaml_files:
file_names.extend(['TOSCA-Metadata/TOSCA.meta',
def return_vnfd_data(csar_without_tosca_meta=False):
csar_dir = ('sample_vnfpkg_no_meta_single_vnfd'
if csar_without_tosca_meta else 'vnfpkgm1')
unique_name = str(uuid.uuid4())
csar_temp_dir = os.path.join('/tmp', unique_name)
utils.copy_csar_files(csar_temp_dir, csar_dir, csar_without_tosca_meta,
read_vnfd_only=True)
if csar_without_tosca_meta:
file_names = ['vnfd_helloworld_single.yaml']
else:
file_names = ['TOSCA-Metadata/TOSCA.meta',
'Definitions/helloworld3_types.yaml',
'Definitions/helloworld3_df_simple.yaml',
'Definitions/helloworld3_top.vnfd.yaml',
'Definitions/etsi_nfv_sol001_common_types.yaml'])
'Definitions/etsi_nfv_sol001_common_types.yaml',
'Definitions/etsi_nfv_sol001_vnfd_types.yaml']
file_path_and_data = {}
for file_name in file_names:
with io.open(os.path.join(csar_temp_dir, file_name)) as f:
file_path_and_data.update({file_name: yaml.dump(yaml.safe_load(
io.open(os.path.join(csar_temp_dir, file_name))))})
f))})
shutil.rmtree(csar_temp_dir)
return file_path_and_data

View File

@ -519,8 +519,6 @@ class TestController(base.TestCase):
mock_vnf_by_id,
mock_upload_vnf_package_content,
mock_glance_store):
file_path = "tacker/tests/etc/samples/test_data.zip"
file_obj = open(file_path, "rb")
updates = {'onboarding_state': 'CREATED',
'operational_state': 'DISABLED'}
vnf_package_dict = fakes.fake_vnf_package(updates)
@ -534,20 +532,19 @@ class TestController(base.TestCase):
% constants.UUID)
req.headers['Content-Type'] = 'application/zip'
req.method = 'PUT'
req.body = jsonutils.dump_as_bytes(file_obj)
req.body = jsonutils.dump_as_bytes(mock.mock_open())
resp = req.get_response(self.app)
mock_glance_store.assert_called()
self.assertEqual(http_client.ACCEPTED, resp.status_code)
def test_upload_vnf_package_content_with_invalid_uuid(self):
file_path = "tacker/tests/etc/samples/test_data.zip"
file_obj = open(file_path, "rb")
req = fake_request.HTTPRequest.blank(
'/vnf_packages/%s/package_content'
% constants.INVALID_UUID)
exception = self.assertRaises(exc.HTTPNotFound,
self.controller.upload_vnf_package_content,
req, constants.INVALID_UUID, body=file_obj)
req, constants.INVALID_UUID,
body=mock.mock_open())
self.assertEqual(
"Can not find requested vnf package: %s" % constants.INVALID_UUID,
exception.explanation)
@ -555,15 +552,13 @@ class TestController(base.TestCase):
@mock.patch.object(vnf_package.VnfPackage, "get_by_id")
def test_upload_vnf_package_content_without_vnf_pack(self,
mock_vnf_by_id):
file_path = "tacker/tests/etc/samples/test_data.zip"
file_obj = open(file_path, "rb")
msg = _("Can not find requested vnf package: %s") % constants.UUID
mock_vnf_by_id.side_effect = exc.HTTPNotFound(explanation=msg)
req = fake_request.HTTPRequest.blank(
'/vnf_packages/%s/package_content' % constants.UUID)
exception = self.assertRaises(
exc.HTTPNotFound, self.controller.upload_vnf_package_content,
req, constants.UUID, body=file_obj)
req, constants.UUID, body=mock.mock_open())
self.assertEqual(
"Can not find requested vnf package: %s" % constants.UUID,
exception.explanation)
@ -571,8 +566,6 @@ class TestController(base.TestCase):
@mock.patch.object(vnf_package.VnfPackage, "get_by_id")
def test_upload_vnf_package_content_with_invalid_status(self,
mock_vnf_by_id):
file_path = "tacker/tests/etc/samples/test_data.zip"
file_obj = open(file_path, "rb")
vnf_obj = fakes.return_vnfpkg_obj()
vnf_obj.__setattr__('onboarding_state', 'ONBOARDED')
mock_vnf_by_id.return_value = vnf_obj
@ -580,7 +573,7 @@ class TestController(base.TestCase):
'/vnf_packages/%s/package_content' % constants.UUID)
self.assertRaises(exc.HTTPConflict,
self.controller.upload_vnf_package_content,
req, constants.UUID, body=file_obj)
req, constants.UUID, body=mock.mock_open())
@mock.patch.object(urllib.request, 'urlopen')
@mock.patch.object(VNFPackageRPCAPI, "upload_vnf_package_from_uri")
@ -847,7 +840,7 @@ class TestController(base.TestCase):
mock_vnf_by_id,
mock_get_vnf_package_vnfd):
mock_vnf_by_id.return_value = fakes.return_vnfpkg_obj()
fake_vnfd_data = fakes.return_vnfd_data(multiple_yaml_files=False)
fake_vnfd_data = fakes.return_vnfd_data(csar_without_tosca_meta=True)
mock_get_vnf_package_vnfd.return_value = fake_vnfd_data
req = fake_request.HTTPRequest.blank(
'/vnf_packages/%s/vnfd'

View File

@ -15,6 +15,7 @@
import base64
import http.server
import os
import shutil
import threading
from oslo_utils import uuidutils
@ -105,6 +106,46 @@ def create_csar_with_unique_vnfd_id(csar_dir):
return tempname, unique_id
def copy_csar_files(fake_csar_path, csar_dir_name,
csar_without_tosca_meta=False, read_vnfd_only=False):
"""Copy csar directory to temporary directory
:param fake_csar_path: a temporary directory in which csar data will be
copied.
:param csar_dir_name: the relative path of csar directory with respect to
'./tacker/tests/etc/samples/etsi/nfv' directory.
for ex. 'vnfpkgm1'.
:param csar_without_tosca_meta: when set to 'True', it will only copy root
level yaml file and image file.
:param read_vnfd_only: when set to 'True', it won't copy the image file
from source directory.
"""
sample_vnf_package = os.path.join(
"./tacker/tests/etc/samples/etsi/nfv", csar_dir_name)
shutil.copytree(sample_vnf_package, fake_csar_path)
common_files_path = os.path.join(
"./tacker/tests/etc/samples/etsi/nfv/common/")
if not read_vnfd_only:
# Copying image file.
shutil.copytree(os.path.join(common_files_path, "Files/"),
os.path.join(fake_csar_path, "Files/"))
if csar_without_tosca_meta:
return
# Copying common vnfd files.
tosca_definition_file_path = os.path.join(common_files_path,
"Definitions/")
for (dpath, _, fnames) in os.walk(tosca_definition_file_path):
if not fnames:
continue
for fname in fnames:
src_file = os.path.join(dpath, fname)
shutil.copy(src_file, os.path.join(fake_csar_path,
"Definitions"))
class AuthHandler(http.server.SimpleHTTPRequestHandler):
'''Main class to present webpages and authentication.'''