Commit 7350b17b authored by Giacomo Bernini's avatar Giacomo Bernini
Browse files

Merge branch '2.7.1-dev-SOL005-reference-descriptors' into '2.7.1-dev'

SOL005 - Implementation of additional test steps for checks against NSD and VNFD content in v2.7.1

See merge request !146
parents 47589eb5 cf2703af
......@@ -22,6 +22,7 @@ GET Individual Network Service Descriptor Information
Check HTTP Response Status Code Is 200
Check HTTP Response Body Json Schema Is NsdInfo
Check HTTP Response Header Contains ETag
Check HTTP Response Body NsInstance content against NS Descriptor
Check HTTP Response Body NsdInfo Identifier matches the requested Network Service Descriptor Information
GET Individual Network Service Descriptor Information with invalid resource identifier
......
......@@ -18,7 +18,8 @@ GET Individual NSD Management Subscription
... Post-Conditions: none
Get Individual NSD Management Subscription
Check HTTP Response Status Code Is 200
Check HTTP Response Body Json Schema Is PkgmSubscription
Check HTTP Response Body Json Schema Is NsdmSubscription
Check HTTP Response Body NsdmSubscription content against NS Descriptor
Check HTTP Response Body Subscription Identifier matches the requested Subscription
GET Individual NSD Management Subscription with invalid resource identifier
......
......@@ -10,6 +10,8 @@ Library JSONSchemaLibrary schemas/
Library RequestsLibrary
Library Process
Library String
Variables descriptors/SOL006/NSD/nsd_SOL006.yaml
Variables descriptors/SOL001/NSD/nsd_SOL001.yaml
*** Keywords ***
GET all Network Service Descriptors Information
......@@ -784,8 +786,9 @@ Send Post Request for NSD Management Subscription
Log Trying to create a new subscription
Set Headers {"Accept": "${ACCEPT_JSON}"}
Set Headers {"Content-Type": "${CONTENT_TYPE_JSON}"}
Run Keyword If ${check_descriptors} == 1 PARSE the NS Descriptor File
${template}= Get File jsons/subscriptions.json
${body}= Format String ${template} notifCallbackUri=${notifCallbackUri}
${body}= Format String ${template} notifCallbackUri=${notifCallbackUri} nsdId=${NS_DescriptorID} nsdName=${NS_Name} nsdVersion=${NS_Version} nsdDesigner=${Designer} nsdInvariantId=${NS_InvariantId}
Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"Authorization": "${AUTHORIZATION}"}
REST.POST ${apiRoot}/${apiName}/${apiMajorVersion}/subscriptions ${body}
${output}= Output response
......@@ -798,8 +801,9 @@ Send POST Request for Duplicated NSD Management Subscription
Log Trying to create a subscription with an already created content
Set Headers {"Accept": "${ACCEPT_JSON}"}
Set Headers {"Content-Type": "${CONTENT_TYPE_JSON}"}
Run Keyword If ${check_descriptors} == 1 PARSE the NS Descriptor File
${template}= Get File jsons/subscriptions.json
${body}= Format String ${template} notifCallbackUri=${notifCallbackUri}
${body}= Format String ${template} notifCallbackUri=${notifCallbackUri} nsdId=${NS_DescriptorID} nsdName=${NS_Name} nsdVersion=${NS_Version} nsdDesigner=${Designer} nsdInvariantId=${NS_InvariantId}
Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"Authorization": "${AUTHORIZATION}"}
REST.POST ${apiRoot}/${apiName}/${apiMajorVersion}/subscriptions ${body}
${output}= Output response
......@@ -1313,3 +1317,53 @@ Send DELETE Request for PNFD Archive Manifest
REST.DELETE ${apiRoot}/${apiName}/${apiMajorVersion}/ns_descriptors/${pnfdInfoId}/manifest
${output}= Output response
Set Suite Variable ${response} ${output}
Check HTTP Response Body NsInstance content against NS Descriptor
#${check_descriptors} flag, 1 to check descriptors
Run Keyword If ${check_descriptors} == 1 Check Individual NsdInfo Content for NSD
Check Individual NsdInfo Content for NSD
PARSE the NS Descriptor File
Match the Response Attributes with NS Descriptors
PARSE the NS Descriptor File
Run Keyword If '${descriptorType}'=='SOL001' Fetch Information from SOL001 NS descriptor file ELSE Fetch Information from SOL006 NS descriptor file
Fetch Information from SOL001 NS descriptor file
${ns_descriptor_id}= Get Variable Value ${topology_template.node_templates.properties.descriptorId}
${designer}= Get Variable Value ${topology_template.node_templates.properties.designer}
${version}= Get Variable Value ${topology_template.node_templates.properties.version}
${name}= Get Variable Value ${topology_template.node_templates.properties.name}
${invariantId}= Get Variable Value ${topology_template.node_templates.properties.invariantId}
Set Global Variable ${NS_DescriptorID} ${ns_descriptor_id}
Set Global Variable ${Designer} ${designer}
Set Global Variable ${NS_Version} ${version}
Set Global Variable ${NS_Name} ${name}
Set Global Variable ${NS_InvariantID} ${invariantId}
Fetch Information from SOL006 NS descriptor file
${nsd_id}= Get Variable Value ${nfv.nsd[0].id}
Set Global Variable ${NS_DescriptorID} ${nsd_id}
Match the Response Attributes with NS Descriptors
Should Be Equal As Strings ${response['body']['nsdId']} ${NSDescriptor_ID}
Run Keyword If '${descriptorType}'=='SOL001' Should Be Equal As Strings ${response['body']['nsdName']} ${NS_Name}
Run Keyword If '${descriptorType}'=='SOL001' Should Be Equal As Strings ${response['body']['nsdVersion']} ${NS_Version}
Run Keyword If '${descriptorType}'=='SOL001' Should Be Equal As Strings ${response['body']['nsdDesigner']} ${Designer}
Run Keyword If '${descriptorType}'=='SOL001' Should Be Equal As Strings ${response['body']['nsdInvariantId']} ${NS_InvariantID}
Check HTTP Response Body NsdmSubscription content against NS Descriptor
#${check_descriptors} flag, 1 to check descriptors
Run Keyword If ${check_descriptors} == 1 Check Individual NsdmSubscription Content for NSD
Check Individual NsdmSubscription Content for NSD
PARSE the NS Descriptor File
Match the NsdmSubscription Response Attributes with NS Descriptors
Match the NsdmSubscription Response Attributes with NS Descriptors
Should Be Equal As Strings ${response['body']['filter']['nsdId']} ${NSDescriptor_ID}
Run Keyword If '${descriptorType}'=='SOL001' Should Be Equal As Strings ${response['body']['filter']['nsdName']} ${NS_Name}
Run Keyword If '${descriptorType}'=='SOL001' Should Be Equal As Strings ${response['body']['filter']['nsdVersion']} ${NS_Version}
Run Keyword If '${descriptorType}'=='SOL001' Should Be Equal As Strings ${response['body']['filter']['nsdDesigner']} ${Designer}
Run Keyword If '${descriptorType}'=='SOL001' Should Be Equal As Strings ${response['body']['filter']['nsdInvariantId']} ${NS_InvariantID}
......@@ -154,6 +154,7 @@ Create new Network Service Descriptor Resource
Check HTTP Response Body Json Schema Is NsdInfo
Check HTTP Response Header Contains Location
Check Postcondition NsdInfo Exists
Check HTTP Response Body NsInstance content against NS Descriptor
PUT all Network Service Descriptors - Method not implemented
[Documentation] Test ID: 5.3.1.1.12
......
......@@ -6,6 +6,7 @@ Library JSONLibrary
Library String
Library REST ${NFVO_SCHEMA}://${NFVO_HOST}:${NFVO_PORT} ssl_verify=false
Suite Setup Check resource existence and get CallbackUri
Resource NSDManagementKeywords.robot
*** Test Cases ***
NSD Onboarding Notification
......@@ -112,8 +113,9 @@ Post NSD Onboarding Notification
Set Headers {"Accept":"${ACCEPT_JSON}"}
Set Headers {"Content-Type": "${CONTENT_TYPE_JSON}"}
Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"Authorization":"${AUTHORIZATION}"}
Run Keyword If ${check_descriptors} == 1 PARSE the NS Descriptor File
${template} = Get File jsons/notifications/NsdOnBoardingNotification.json
${body}= Format String ${template} subscriptionId=${subscriptionId} nsdInfoId=${nsdInfoId}
${body}= Format String ${template} subscriptionId=${subscriptionId} nsdInfoId=${nsdInfoId} nsdId=${NS_DescriptorID}
Post ${callbackResp} ${body}
${outputResponse}= Output response
Set Global Variable ${response} ${outputResponse}
......@@ -123,8 +125,9 @@ Post NSD Onboarding Failure Notification
Set Headers {"Accept":"${ACCEPT_JSON}"}
Set Headers {"Content-Type": "${CONTENT_TYPE_JSON}"}
Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"Authorization":"${AUTHORIZATION}"}
Run Keyword If ${check_descriptors} == 1 PARSE the NS Descriptor File
${template} = Get File jsons/notifications/NsdOnBoardingFailureNotification.json
${body}= Format String ${template} subscriptionId=${subscriptionId} nsdInfoId=${nsdInfoId}
${body}= Format String ${template} subscriptionId=${subscriptionId} nsdInfoId=${nsdInfoId} nsdId=${NS_DescriptorID}
Post ${callbackResp} ${body}
${outputResponse}= Output response
Set Global Variable ${response} ${outputResponse}
......@@ -134,8 +137,9 @@ Post NSD Change Notification
Set Headers {"Accept":"${ACCEPT_JSON}"}
Set Headers {"Content-Type": "${CONTENT_TYPE_JSON}"}
Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"Authorization":"${AUTHORIZATION}"}
Run Keyword If ${check_descriptors} == 1 PARSE the NS Descriptor File
${template} = Get File jsons/notifications/NsdChangeNotification.json
${body}= Format String ${template} subscriptionId=${subscriptionId} nsdInfoId=${nsdInfoId}
${body}= Format String ${template} subscriptionId=${subscriptionId} nsdInfoId=${nsdInfoId} nsdId=${NS_DescriptorID}
Post ${callbackResp} ${body}
${outputResponse}= Output response
Set Global Variable ${response} ${outputResponse}
......@@ -145,8 +149,9 @@ Post NSD Deletion Notification
Set Headers {"Accept":"${ACCEPT_JSON}"}
Set Headers {"Content-Type": "${CONTENT_TYPE_JSON}"}
Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"Authorization":"${AUTHORIZATION}"}
Run Keyword If ${check_descriptors} == 1 PARSE the NS Descriptor File
${template} = Get File jsons/notifications/NsdDeletionNotification.json
${body}= Format String ${template} subscriptionId=${subscriptionId} nsdInfoId=${nsdInfoId}
${body}= Format String ${template} subscriptionId=${subscriptionId} nsdInfoId=${nsdInfoId} nsdId=${NS_DescriptorID}
Post ${callbackResp} ${body}
${outputResponse}= Output response
Set Global Variable ${response} ${outputResponse}
......
tosca_definitions_version: "tosca_simple_yaml_1_2"
tosca_default_namespace: "toscanfv"
description: "Referenxce NSD descriptor "
metadata:
descriptor_id: "NSD_WITH_2_VNF"
vendor: "ETSI"
version: "1.0"
topology_template:
substitution_mappings:
node_type: "tosca.nodes.nfv.NS"
requirements:
right: [VNF_A, ext_a_right]
left: [VNF_B, ext_b_left]
mgmt_a: [VNF_A, management_vnf_a]
mgmt_b: [VNF_B, management_vnf_b]
node_templates:
VNF_A:
type: "tosca.nodes.nfv.VNF"
properties:
descriptor_id: "VNF-A"
descriptor_version: "1.0"
provider: "ETSI TST WG"
product_name: "VNF-A"
software_version: "1.0"
product_info_name: "VNF-A"
product_info_description: "TST010 reference VNF-A"
flavour_id: "VNF-A_flavor"
flavour_description: "VNF-A flavor"
vnfm_info:
- 'etsivnfm:v2.3.1'
requirements:
virtualLink:
ext_a_right: "vl_right"
management_vnf_a: "vl_mgmt"
int_a_data: "vl_data"
VNF_B:
type: "tosca.nodes.nfv.VNF"
properties:
descriptorId: "VNF-B"
descriptorVersion: "1.0"
provider: "ETSI TST WG"
productName: "VNF-B"
softwareVersion: "1.0"
productInfoName: "VNF-B"
productInfoDescription: "TST010 reference VNF-A"
defaultLocalizationLanguage: null
flavourId: "VNF-B_flavor"
flavourDescription: "VNF-B flavor"
vnfm_info:
- 'etsivnfm:v2.3.1'
requirements:
virtualLink:
ext_b_left: "vl_left"
management_vnf_b: "vl_mgmt"
int_b_data: "vl_data"
NS_with_2_VNF:
type: "tosca.nodes.nfv.NS"
properties:
descriptorId: "NS with 2 VNFs"
designer: "ETSI TST WG"
version: "1.0"
name: "ns_with_2_vnfs"
invariantId: "ns_with_2_vnfs"
requirements:
virtualLink:
- "vl_left"
- "vl_right"
- "vl_mgmt"
- "vl_data"
vl_left:
type: "tosca.nodes.nfv.NsVirtualLink"
properties:
description: "VNF-B external connetivity"
vlProfile:
max_bitrate_requirements:
root: 1000
min_bitrate_requirements:
root: 1000
connectivityType:
layer_protocols: [ipv4]
vl_right:
type: "tosca.nodes.nfv.NsVirtualLink"
properties:
description: "VNF-A external connectivity"
vlProfile:
max_bitrate_requirements:
root: 1000
min_bitrate_requirements:
root: 1000
connectivityType:
layer_protocols: [ipv4]
vl_mgmt:
type: "tosca.nodes.nfv.NsVirtualLink"
properties:
description: "Management network"
vlProfile:
max_bitrate_requirements:
root: 1000
min_bitrate_requirements:
root: 1000
connectivityType:
layer_protocols: [ipv4]
vl_data:
type: "tosca.nodes.nfv.NsVirtualLink"
properties:
description: "Internal network that interconnect VNF-A and VNF-B"
vlProfile:
max_bitrate_requirements:
root: 1000
min_bitrate_requirements:
root: 1000
connectivityType:
layer_protocols: [ipv4]
nfv:
vnfd:
- id: VNF-A
provider: ETSI TST WG
product-name: TST010 reference VNF-A
software-version: '1.0'
version: '1.0'
vnfm-info: ETSI VNFM
vdu:
- id: vdu-a-1
name: VNF A VDU 1
int-cpd:
- id: right
layer-protocol: ethernet
- id: management
layer-protocol: ethernet
- id: left
layer-protocol: ethernet
virtual-compute-desc: vdu-a-1-vcd
virtual-storage-desc: vdu-a-1-vsd
sw-image-desc: asa-image
virtual-compute-desc:
id: vdu-a-1-vcd
virtual-memory:
size: '4.0'
virtual-cpu:
num-virtual-cpu: '2'
virtual-storage-desc:
id: vdu-a-1-vsd
type-of-storage: root-storage
size-of-storage: '0'
sw-image-desc:
id: vdu-a-1-image
name: vdu-a-1 image
version: '1.1'
checksum:
algorithm: sha-224
hash: somehashfortst010
container-format: bare
disk-format: qcow2
min-disk: '1'
min-ram: '2.0'
size: '1'
image: 'http://someurl.com/vnf-a.qcow2'
int-virtual-link-desc:
- id: right-vl
flavour:
id: right-vl-flavour
qos:
latency: '1'
packet-delay-variation: '1'
packet-loss-ratio: '0.02'
connectivity-type:
layer-protocol: ethernet
ext-cpd:
- id: ext-a-right
int-virtual-link-desc: right-vl
layer-protocol: ethernet
- id: management
int-cpd:
vdu-id: vdu-a-1
cpd: management
layer-protocol: ethernet
- id: ext-a-left
int-cpd:
vdu-id: vdu-a-1
cpd: left
layer-protocol: ethernet
df:
id: normal
vdu-profile:
id: vdu-a-1
min-number-of-instances: '1'
max-number-of-instances: '2'
virtual-link-profile:
id: right-vl
flavour: right-vl-flavour
max-bit-rate-requirements:
root: '10'
min-bit-rate-requirements:
root: '1'
virtual-link-protocol-data:
associated-layer-protocol: ipv4
l3-protocol-data:
name: right-network
ip-version: ipv4
cidr: 10.10.10.0/32
gateway-ip: 10.10.10.1
dhcp-enabled: 'true'
instantiation-level:
- id: double
vdu-level:
vdu-id: vdu-a-1
number-of-instances: '2'
- id: single
vdu-level:
vdu-id: vdu-a-1
number-of-instances: '1'
default-instantiation-level: single
lcm-operations-configuration:
scale-vnf-to-level-op-config:
arbitrary-target-levels-supported: 'true'
terminate-vnf-op-config:
min-graceful-termination: '1'
operate-vnf-op-config:
min-graceful-stop-timeout: '1'
- id: VNF-B
provider: ETSI TST WG
product-name: TST010 reference VNF-B
software-version: '2.0'
version: '2.0'
vnfm-info: ETSI VNFM
vdu:
- id: vdu-b-1
name: VNF-B VDU 1
int-cpd:
- id: left
layer-protocol: ethernet
- id: management
layer-protocol: ethernet
- id: right
layer-protocol: ethernet
virtual-compute-desc: vdu-b-1-vcd
virtual-storage-desc: vdu-b-1-vsd
sw-image-desc: vdu-b-1-image
virtual-compute-desc:
id: vdu-b-1-vcd
virtual-memory:
size: '4.0'
virtual-cpu:
num-virtual-cpu: '2'
virtual-storage-desc:
id: vdu-b-1-vsd
type-of-storage: root-storage
size-of-storage: '0'
sw-image-desc:
id: vdu-b-1-image
name: VNF-B image
version: '1.1'
checksum:
algorithm: sha-224
hash: somehashfortst010
container-format: bare
disk-format: qcow2
min-disk: '1'
min-ram: '2.0'
size: '1'
image: 'http://someurl.com/VNF-B.qcow2'
ext-cpd:
- id: ext-b-left
int-cpd:
vdu-id: vdu-b-1
cpd: left
layer-protocol: ethernet
- id: management
int-cpd:
vdu-id: vdu-b-1
cpd: management
layer-protocol: ethernet
- id: ext-b-right
int-cpd:
vdu-id: vdu-b-1
cpd: right
layer-protocol: ethernet
df:
id: normal
vdu-profile:
id: vdu-b-1
min-number-of-instances: '1'
max-number-of-instances: '2'
instantiation-level:
- id: double
vdu-level:
vdu-id: vdu-b-1
number-of-instances: '2'
- id: single
vdu-level:
vdu-id: vdu-b-1
number-of-instances: '1'
default-instantiation-level: single
lcm-operations-configuration:
scale-vnf-to-level-op-config:
arbitrary-target-levels-supported: 'true'
terminate-vnf-op-config:
min-graceful-termination: '1'
operate-vnf-op-config:
min-graceful-stop-timeout: '1'
nsd:
- id: tst010-nsd
vnfd-id:
- VNF-A
- VNF-B
sapd:
- id: right-sap
vnf:
vnfd-id: VNF-A
ext-cpd-id: ext-a-right
- id: management-sap
virtual-link-desc: mgmt
- id: left-sap
vnf:
vnfd-id: VNF-B
ext-cpd-id: ext-b-left
virtual-link-desc:
- id: mgmt
connectivity-type:
layer-protocol: ipv4
df:
id: normal
qos:
latency: '0'
packet-delay-variation: '0'
- id: A-to-B
connectivity-type:
layer-protocol: ethernet
df:
id: normal
qos:
latency: '0'
packet-delay-variation: '0'
df:
- id: normal
vnf-profile:
- id: vnf-a-profile
vnfd-id: VNF-A
flavour-id: normal
instantiation-level: single
min-number-of-instances: '1'
max-number-of-instances: '1'
virtual-link-connectivity:
- virtual-link-profile-id: mgmt
constituent-cpd-id:
constituent-base-element-id: vdu-a-1
constituent-cpd-id: management
- virtual-link-profile-id: A-to-B
constituent-cpd-id:
constituent-base-element-id: vdu-a-1
constituent-cpd-id: left
- id: vnf-b-profile
vnfd-id: VNF-B
flavour-id: normal
instantiation-level: single
min-number-of-instances: '1'
max-number-of-instances: '1'
virtual-link-connectivity:
- virtual-link-profile-id: mgmt
constituent-cpd-id:
constituent-base-element-id: vdu-b-1
constituent-cpd-id: management
- virtual-link-profile-id: A-to-B
constituent-cpd-id:
constituent-base-element-id: vdu-b-1
constituent-cpd-id: right
virtual-link-profile:
- id: mgmt
virtual-link-desc-id: mgmt
flavour-id: normal
max-bitrate-requirements:
root: '1000'
min-bitrate-requirements:
root: '0'
- id: A-to-B
virtual-link-desc-id: A-to-B
flavour-id: normal
max-bitrate-requirements:
root: '10000000'
min-bitrate-requirements:
root: '0'
ns-instantiation-level:
- id: normal
description: Single VNF-A and VNF-B
vnf-to-level-mapping:
- vnf-profile-id: vnf-a-profile
number-of-instances: '1'
- vnf-profile-id: vnf-b-profile
number-of-instances: '1'
- id: double-A
description: Single VNF-B and Double VNF-A
vnf-to-level-mapping:
- vnf-profile-id: vnf-a-profile
number-of-instances: '2'
- vnf-profile-id: vnf-b-profile
number-of-instances: '1'
default-instantiation-level: normal
......@@ -91,4 +91,13 @@ ${notifCallbackUri} http://172.22.1.7:9091/nsd/subscriptions
${filter_ok} callbackUri=${notifCallbackUri}
${filter_ko} nfvId=f9f130e4-05eb-4082-a676-4c97d13a883d # Not existant filter attribute-based
${callbackResp} 127.0.0.1
\ No newline at end of file
${callbackResp} 127.0.0.1
${check_descriptors} 1
${descriptorType} SOL001
${NS_DescriptorID}
${Designer}
${NS_Name}
${NS_Version}
${NS_InvariantId}
......@@ -4,7 +4,7 @@
"subscriptionId":"{subscriptionId}",
"timeStamp":"",