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 os
import shutil import shutil
import tempfile
import testtools import testtools
from unittest import mock from unittest import mock
import uuid
import zipfile
from tacker.common import csar_utils from tacker.common import csar_utils
from tacker.common import exceptions from tacker.common import exceptions
@ -29,15 +32,12 @@ class TestCSARUtils(testtools.TestCase):
def setUp(self): def setUp(self):
super(TestCSARUtils, self).setUp() super(TestCSARUtils, self).setUp()
self.context = context.get_admin_context() 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') @mock.patch('tacker.common.csar_utils.extract_csar_zip_file')
def test_load_csar_data(self, mock_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( vnf_data, flavours = csar_utils.load_csar_data(
self.context, constants.UUID, file_path) self.context, constants.UUID, file_path)
self.assertEqual(vnf_data['descriptor_version'], '1.0') 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') @mock.patch('tacker.common.csar_utils.extract_csar_zip_file')
def test_load_csar_data_with_single_yaml( def test_load_csar_data_with_single_yaml(
self, mock_extract_csar_zip_file): self, mock_extract_csar_zip_file):
file_path = self._get_csar_file_path( file_path, _ = utils.create_csar_with_unique_vnfd_id(
"sample_vnfpkg_no_meta_single_vnfd.zip") './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( vnf_data, flavours = csar_utils.load_csar_data(
self.context, constants.UUID, file_path) self.context, constants.UUID, file_path)
self.assertEqual(vnf_data['descriptor_version'], '1.0') self.assertEqual(vnf_data['descriptor_version'], '1.0')
@ -57,11 +59,41 @@ class TestCSARUtils(testtools.TestCase):
self.assertEqual(flavours[0]['flavour_id'], 'simple') self.assertEqual(flavours[0]['flavour_id'], 'simple')
self.assertIsNotNone(flavours[0]['sw_images']) 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') @mock.patch('tacker.common.csar_utils.extract_csar_zip_file')
def test_load_csar_data_without_instantiation_level( def test_load_csar_data_without_instantiation_level(
self, mock_extract_csar_zip_file): self, mock_extract_csar_zip_file):
file_path = self._get_csar_file_path( file_path = self._get_csar_zip_from_dir(
"csar_without_instantiation_level.zip") 'csar_without_instantiation_level')
exc = self.assertRaises(exceptions.InvalidCSAR, exc = self.assertRaises(exceptions.InvalidCSAR,
csar_utils.load_csar_data, csar_utils.load_csar_data,
self.context, constants.UUID, file_path) self.context, constants.UUID, file_path)
@ -72,8 +104,8 @@ class TestCSARUtils(testtools.TestCase):
@mock.patch('tacker.common.csar_utils.extract_csar_zip_file') @mock.patch('tacker.common.csar_utils.extract_csar_zip_file')
def test_load_csar_data_with_invalid_instantiation_level( def test_load_csar_data_with_invalid_instantiation_level(
self, mock_extract_csar_zip_file): self, mock_extract_csar_zip_file):
file_path = self._get_csar_file_path( file_path = self._get_csar_zip_from_dir(
"csar_invalid_instantiation_level.zip") 'csar_invalid_instantiation_level')
exc = self.assertRaises(exceptions.InvalidCSAR, exc = self.assertRaises(exceptions.InvalidCSAR,
csar_utils.load_csar_data, csar_utils.load_csar_data,
self.context, constants.UUID, file_path) self.context, constants.UUID, file_path)
@ -85,8 +117,8 @@ class TestCSARUtils(testtools.TestCase):
@mock.patch('tacker.common.csar_utils.extract_csar_zip_file') @mock.patch('tacker.common.csar_utils.extract_csar_zip_file')
def test_load_csar_data_with_invalid_default_instantiation_level( def test_load_csar_data_with_invalid_default_instantiation_level(
self, mock_extract_csar_zip_file): self, mock_extract_csar_zip_file):
file_path = self._get_csar_file_path( file_path = self._get_csar_zip_from_dir(
"csar_with_invalid_default_instantiation_level.zip") 'csar_with_invalid_default_instantiation_level')
exc = self.assertRaises(exceptions.InvalidCSAR, exc = self.assertRaises(exceptions.InvalidCSAR,
csar_utils.load_csar_data, csar_utils.load_csar_data,
self.context, constants.UUID, file_path) self.context, constants.UUID, file_path)
@ -98,8 +130,8 @@ class TestCSARUtils(testtools.TestCase):
@mock.patch('tacker.common.csar_utils.extract_csar_zip_file') @mock.patch('tacker.common.csar_utils.extract_csar_zip_file')
def test_load_csar_data_without_vnfd_info( def test_load_csar_data_without_vnfd_info(
self, mock_extract_csar_zip_file): self, mock_extract_csar_zip_file):
file_path = self._get_csar_file_path( file_path = self._get_csar_zip_from_dir(
"csar_without_vnfd_info.zip") 'csar_without_vnfd_info')
exc = self.assertRaises(exceptions.InvalidCSAR, exc = self.assertRaises(exceptions.InvalidCSAR,
csar_utils.load_csar_data, csar_utils.load_csar_data,
self.context, constants.UUID, file_path) self.context, constants.UUID, file_path)
@ -108,8 +140,8 @@ class TestCSARUtils(testtools.TestCase):
@mock.patch('tacker.common.csar_utils.extract_csar_zip_file') @mock.patch('tacker.common.csar_utils.extract_csar_zip_file')
def test_load_csar_data_with_artifacts_and_without_sw_image_data( def test_load_csar_data_with_artifacts_and_without_sw_image_data(
self, mock_extract_csar_zip_file): self, mock_extract_csar_zip_file):
file_path = self._get_csar_file_path( file_path = self._get_csar_zip_from_dir(
"csar_without_sw_image_data.zip") 'csar_without_sw_image_data')
exc = self.assertRaises(exceptions.InvalidCSAR, exc = self.assertRaises(exceptions.InvalidCSAR,
csar_utils.load_csar_data, csar_utils.load_csar_data,
self.context, constants.UUID, file_path) self.context, constants.UUID, file_path)
@ -120,8 +152,8 @@ class TestCSARUtils(testtools.TestCase):
@mock.patch('tacker.common.csar_utils.extract_csar_zip_file') @mock.patch('tacker.common.csar_utils.extract_csar_zip_file')
def test_load_csar_data_with_multiple_sw_image_data( def test_load_csar_data_with_multiple_sw_image_data(
self, mock_extract_csar_zip_file): self, mock_extract_csar_zip_file):
file_path = self._get_csar_file_path( file_path = self._get_csar_zip_from_dir(
"csar_with_multiple_sw_image_data.zip") 'csar_with_multiple_sw_image_data')
exc = self.assertRaises(exceptions.InvalidCSAR, exc = self.assertRaises(exceptions.InvalidCSAR,
csar_utils.load_csar_data, csar_utils.load_csar_data,
self.context, constants.UUID, file_path) self.context, constants.UUID, file_path)
@ -132,8 +164,8 @@ class TestCSARUtils(testtools.TestCase):
@mock.patch('tacker.common.csar_utils.extract_csar_zip_file') @mock.patch('tacker.common.csar_utils.extract_csar_zip_file')
def test_csar_with_missing_sw_image_data_in_main_template( def test_csar_with_missing_sw_image_data_in_main_template(
self, mock_extract_csar_zip_file): self, mock_extract_csar_zip_file):
file_path = self._get_csar_file_path( file_path = self._get_csar_zip_from_dir(
"csar_with_missing_sw_image_data_in_main_template.zip") 'csar_with_missing_sw_image_data_in_main_template')
exc = self.assertRaises(exceptions.InvalidCSAR, exc = self.assertRaises(exceptions.InvalidCSAR,
csar_utils.load_csar_data, csar_utils.load_csar_data,
self.context, constants.UUID, file_path) self.context, constants.UUID, file_path)
@ -144,7 +176,7 @@ class TestCSARUtils(testtools.TestCase):
@mock.patch('tacker.common.csar_utils.extract_csar_zip_file') @mock.patch('tacker.common.csar_utils.extract_csar_zip_file')
def test_load_csar_data_without_flavour_info( def test_load_csar_data_without_flavour_info(
self, mock_extract_csar_zip_file): 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, exc = self.assertRaises(exceptions.InvalidCSAR,
csar_utils.load_csar_data, csar_utils.load_csar_data,
self.context, constants.UUID, file_path) self.context, constants.UUID, file_path)
@ -153,8 +185,8 @@ class TestCSARUtils(testtools.TestCase):
@mock.patch('tacker.common.csar_utils.extract_csar_zip_file') @mock.patch('tacker.common.csar_utils.extract_csar_zip_file')
def test_load_csar_data_without_flavour_info_in_main_template( def test_load_csar_data_without_flavour_info_in_main_template(
self, mock_extract_csar_zip_file): self, mock_extract_csar_zip_file):
file_path = self._get_csar_file_path( file_path = self._get_csar_zip_from_dir(
"csar_without_flavour_info_in_main_template.zip") 'csar_without_flavour_info_in_main_template')
exc = self.assertRaises(exceptions.InvalidCSAR, exc = self.assertRaises(exceptions.InvalidCSAR,
csar_utils.load_csar_data, csar_utils.load_csar_data,
self.context, constants.UUID, file_path) self.context, constants.UUID, file_path)
@ -171,7 +203,8 @@ class TestCSARUtils(testtools.TestCase):
@mock.patch('tacker.common.csar_utils.extract_csar_zip_file') @mock.patch('tacker.common.csar_utils.extract_csar_zip_file')
def test_load_csar_data_without_policies( def test_load_csar_data_without_policies(
self, mock_extract_csar_zip_file): 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( vnf_data, flavours = csar_utils.load_csar_data(
self.context, constants.UUID, file_path) self.context, constants.UUID, file_path)
self.assertIsNone(flavours[0].get('instantiation_levels')) self.assertIsNone(flavours[0].get('instantiation_levels'))

View File

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

View File

@ -18,6 +18,7 @@ import shutil
import sys import sys
from unittest import mock from unittest import mock
import fixtures
from glance_store import exceptions as store_exceptions from glance_store import exceptions as store_exceptions
from oslo_config import cfg from oslo_config import cfg
from six.moves import urllib 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.db.base import SqlTestCase
from tacker.tests.unit.objects import fakes as fake_obj from tacker.tests.unit.objects import fakes as fake_obj
from tacker.tests.unit.vnflcm import fakes as vnflcm_fakes from tacker.tests.unit.vnflcm import fakes as vnflcm_fakes
from tacker.tests import utils
from tacker.tests import uuidsentinel from tacker.tests import uuidsentinel
CONF = tacker.conf.CONF CONF = tacker.conf.CONF
@ -60,6 +62,7 @@ class TestConductor(SqlTestCase):
self._mock_vnfm_plugin() self._mock_vnfm_plugin()
self.conductor = conductor_server.Conductor('host') self.conductor = conductor_server.Conductor('host')
self.vnf_package = self._create_vnf_package() self.vnf_package = self._create_vnf_package()
self.temp_dir = self.useFixture(fixtures.TempDir()).path
def _mock_vnfm_plugin(self): def _mock_vnfm_plugin(self):
self.vnfm_plugin = mock.Mock(wraps=FakeVNFMPlugin()) self.vnfm_plugin = mock.Mock(wraps=FakeVNFMPlugin())
@ -131,16 +134,17 @@ class TestConductor(SqlTestCase):
mock_delete_csar.assert_called() mock_delete_csar.assert_called()
def test_get_vnf_package_vnfd_with_tosca_meta_file_in_csar(self): def test_get_vnf_package_vnfd_with_tosca_meta_file_in_csar(self):
fake_csar = fakes.create_fake_csar_dir(self.vnf_package.id) fake_csar = fakes.create_fake_csar_dir(self.vnf_package.id,
expected_data = fakes.get_expected_vnfd_data() self.temp_dir)
result = self.conductor.get_vnf_package_vnfd(self.context, result = self.conductor.get_vnf_package_vnfd(self.context,
self.vnf_package) self.vnf_package)
expected_data = fakes.get_expected_vnfd_data()
self.assertEqual(expected_data, result) self.assertEqual(expected_data, result)
shutil.rmtree(fake_csar) shutil.rmtree(fake_csar)
def test_get_vnf_package_vnfd_with_single_yaml_csar(self): def test_get_vnf_package_vnfd_with_single_yaml_csar(self):
fake_csar = fakes.create_fake_csar_dir(self.vnf_package.id, fake_csar = fakes.create_fake_csar_dir(
single_yaml_csar=True) self.vnf_package.id, self.temp_dir, csar_without_tosca_meta=True)
result = self.conductor.get_vnf_package_vnfd(self.context, result = self.conductor.get_vnf_package_vnfd(self.context,
self.vnf_package) self.vnf_package)
# only one key present in the result shows that it contains only one # 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') @mock.patch.object(glance_store, 'load_csar')
def test_get_vnf_package_vnfd_download_from_glance_store(self, def test_get_vnf_package_vnfd_download_from_glance_store(self,
mock_load_csar): mock_load_csar):
fake_csar = os.path.join('/tmp/', self.vnf_package.id) fake_csar = os.path.join(self.temp_dir, self.vnf_package.id)
cfg.CONF.set_override('vnf_package_csar_path', '/tmp', cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir,
group='vnf_package') group='vnf_package')
# Scenario in which csar path is not present in the local storage. fake_csar_zip, _ = utils.create_csar_with_unique_vnfd_id(
base_path = os.path.dirname(os.path.abspath(__file__)) './tacker/tests/etc/samples/etsi/nfv/vnfpkgm1')
sample_vnf_package = os.path.join( mock_load_csar.return_value = fake_csar_zip
base_path, "../../etc/samples/sample_vnf_package_csar.zip") expected_data = fakes.get_expected_vnfd_data(zip_file=fake_csar_zip)
mock_load_csar.return_value = sample_vnf_package
expected_data = fakes.get_expected_vnfd_data()
result = self.conductor.get_vnf_package_vnfd(self.context, result = self.conductor.get_vnf_package_vnfd(self.context,
self.vnf_package) self.vnf_package)
self.assertEqual(expected_data, result) self.assertEqual(expected_data, result)
shutil.rmtree(fake_csar) shutil.rmtree(fake_csar)
os.remove(fake_csar_zip)
@mock.patch.object(glance_store, 'load_csar') @mock.patch.object(glance_store, 'load_csar')
def test_get_vnf_package_vnfd_exception_from_glance_store(self, 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') @mock.patch.object(conductor_server.Conductor, '_read_vnfd_files')
def test_get_vnf_package_vnfd_exception_from_read_vnfd_files( def test_get_vnf_package_vnfd_exception_from_read_vnfd_files(
self, mock_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 mock_read_vnfd_files.side_effect = yaml.YAMLError
self.assertRaises(exceptions.FailedToGetVnfdData, self.assertRaises(exceptions.FailedToGetVnfdData,
self.conductor.get_vnf_package_vnfd, self.context, 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.objects import fields
from tacker.tests.unit.db import base as db_base from tacker.tests.unit.db import base as db_base
from tacker.tests.unit.vnflcm import fakes from tacker.tests.unit.vnflcm import fakes
from tacker.tests import utils as test_utils
from tacker.tests import uuidsentinel from tacker.tests import uuidsentinel
from tacker.vnflcm import vnflcm_driver from tacker.vnflcm import vnflcm_driver
from tacker.vnfm import vim_client from tacker.vnfm import vim_client
@ -127,24 +128,6 @@ class TestVnflcmDriver(db_base.SqlTestCase):
'test_project'}, 'vim_type': 'openstack'} 'test_project'}, 'vim_type': 'openstack'}
self.vim_client.get_vim.return_value = vim_obj 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.VnfResource, 'create')
@mock.patch.object(objects.VnfPackageVnfd, 'get_by_id') @mock.patch.object(objects.VnfPackageVnfd, 'get_by_id')
@mock.patch.object(objects.VnfInstance, "save") @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) fake_csar = os.path.join(self.temp_dir, vnf_package_id)
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir, cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir,
group='vnf_package') group='vnf_package')
self._copy_csar_files(fake_csar, "vnflcm4") test_utils.copy_csar_files(fake_csar, "vnflcm4")
self._mock_vnf_manager() self._mock_vnf_manager()
driver = vnflcm_driver.VnfLcmDriver() driver = vnflcm_driver.VnfLcmDriver()
driver.instantiate_vnf(self.context, vnf_instance_obj, 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) fake_csar = os.path.join(self.temp_dir, vnf_package_id)
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir, cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir,
group='vnf_package') group='vnf_package')
self._copy_csar_files(fake_csar, "vnflcm4") test_utils.copy_csar_files(fake_csar, "vnflcm4")
self._mock_vnf_manager() self._mock_vnf_manager()
driver = vnflcm_driver.VnfLcmDriver() driver = vnflcm_driver.VnfLcmDriver()
driver.instantiate_vnf(self.context, vnf_instance_obj, 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) fake_csar = os.path.join(self.temp_dir, vnf_package_id)
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir, cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir,
group='vnf_package') group='vnf_package')
self._copy_csar_files(fake_csar, "vnflcm4") test_utils.copy_csar_files(fake_csar, "vnflcm4")
self._mock_vnf_manager() self._mock_vnf_manager()
driver = vnflcm_driver.VnfLcmDriver() driver = vnflcm_driver.VnfLcmDriver()
driver.instantiate_vnf(self.context, vnf_instance_obj, 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) fake_csar = os.path.join(self.temp_dir, vnf_package_id)
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir, cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir,
group='vnf_package') 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") self._mock_vnf_manager(fail_method_name="instantiate_vnf")
driver = vnflcm_driver.VnfLcmDriver() driver = vnflcm_driver.VnfLcmDriver()
error = self.assertRaises(exceptions.VnfInstantiationFailed, 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) fake_csar = os.path.join(self.temp_dir, vnf_package_id)
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir, cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir,
group='vnf_package') 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') self._mock_vnf_manager(fail_method_name='create_wait')
driver = vnflcm_driver.VnfLcmDriver() driver = vnflcm_driver.VnfLcmDriver()
error = self.assertRaises(exceptions.VnfInstantiationWaitFailed, 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) fake_csar = os.path.join(self.temp_dir, vnf_package_id)
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir, cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir,
group='vnf_package') group='vnf_package')
self._copy_csar_files( test_utils.copy_csar_files(
fake_csar, "sample_vnf_package_csar_with_short_notation") fake_csar, "sample_vnf_package_csar_with_short_notation")
self._mock_vnf_manager(vnf_resource_count=2) self._mock_vnf_manager(vnf_resource_count=2)
driver = vnflcm_driver.VnfLcmDriver() driver = vnflcm_driver.VnfLcmDriver()
@ -452,7 +435,7 @@ class TestVnflcmDriver(db_base.SqlTestCase):
fake_csar = os.path.join(self.temp_dir, vnf_package_id) fake_csar = os.path.join(self.temp_dir, vnf_package_id)
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir, cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir,
group='vnf_package') 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()] mock_vnf_resource_list.return_value = [fakes.return_vnf_resource()]
# Heal as per SOL003 i.e. without vnfcInstanceId # Heal as per SOL003 i.e. without vnfcInstanceId
heal_vnf_req = objects.HealVnfRequest() 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) fake_csar = os.path.join(self.temp_dir, vnf_package_id)
cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir, cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir,
group='vnf_package') 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()] mock_vnf_resource_list.return_value = [fakes.return_vnf_resource()]
# Heal as per SOL003 i.e. without vnfcInstanceId # Heal as per SOL003 i.e. without vnfcInstanceId
heal_vnf_req = objects.HealVnfRequest() heal_vnf_req = objects.HealVnfRequest()

View File

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

View File

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

View File

@ -15,6 +15,7 @@
import base64 import base64
import http.server import http.server
import os import os
import shutil
import threading import threading
from oslo_utils import uuidutils from oslo_utils import uuidutils
@ -105,6 +106,46 @@ def create_csar_with_unique_vnfd_id(csar_dir):
return tempname, unique_id 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): class AuthHandler(http.server.SimpleHTTPRequestHandler):
'''Main class to present webpages and authentication.''' '''Main class to present webpages and authentication.'''