Merge "Add tap-as-a-service API tests"

This commit is contained in:
Zuul 2021-09-23 18:17:45 +00:00 committed by Gerrit Code Review
commit 6acf7ee0f0
8 changed files with 365 additions and 0 deletions

View File

@ -0,0 +1,129 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from tempest.common import utils
from tempest import config
from tempest.lib import decorators
from tempest.lib import exceptions as lib_exc
from neutron_tempest_plugin.tap_as_a_service import base
CONF = config.CONF
class TaaSExtensionTestJSON(base.BaseTaasTest):
@classmethod
@utils.requires_ext(extension='taas', service='network')
def skip_checks(cls):
super(TaaSExtensionTestJSON, cls).skip_checks()
@classmethod
def resource_setup(cls):
super(TaaSExtensionTestJSON, cls).resource_setup()
cls.network = cls.create_network()
cls.ts_port = cls.create_port(cls.network)
cls.tf_port = cls.create_port(cls.network)
cls.tf2_port = cls.create_port(cls.network)
@decorators.idempotent_id('b993c14e-797a-4c91-b4da-8cb1a450aa2f')
def test_create_tap_service_and_flow(self):
"""create tap service adn tap flow
Test create tap service and flow.
"""
tap_service = self.create_tap_service(port_id=self.ts_port['id'])
self.create_tap_flow(tap_service_id=tap_service['id'],
direction='BOTH', source_port=self.tf_port['id'])
@decorators.idempotent_id('897a0aaf-1b55-4ea8-9d9f-1bc0fd09cb60')
@utils.requires_ext(extension='taas-vlan-filter', service='network')
def test_create_tap_service_and_flow_vlan_filter(self):
"""create tap service with vlan_filter
Test create tap service with additional vlan_filter argument.
"""
tap_service = self.create_tap_service(port_id=self.ts_port['id'])
tap_flow = self.create_tap_flow(tap_service_id=tap_service['id'],
direction='BOTH',
source_port=self.tf_port['id'],
vlan_filter='189,279,999-1008')
self.assertEqual(tap_flow['vlan_filter'], '189,279,999-1008')
@decorators.idempotent_id('d7a2115d-16b4-41cf-95a6-dcebc3682b24')
def test_delete_tap_resources_after_ts_port_delete(self):
"""delete tap resources after ts port delete
Test delete tap resources after deletion of ts port.
"""
tap_service = self.create_tap_service(port_id=self.ts_port['id'])
tap_flow = self.create_tap_flow(tap_service_id=tap_service['id'],
direction='BOTH',
source_port=self.tf2_port['id'])
# delete ts_port; it shall also delete the associated tap-service and
# subsequently the tap-flow as well
self.ports_client.delete_port(self.ts_port['id'])
# Attempt tap-service deletion; it should throw not found exception.
self.assertRaises(lib_exc.NotFound,
self.tap_services_client.delete_tap_service,
tap_service['id'])
# Attempt tap-flow deletion; it should throw not found exception.
self.assertRaises(lib_exc.NotFound,
self.tap_flows_client.delete_tap_flow,
tap_flow['id'])
@decorators.idempotent_id('9ba4edfd-4002-4c44-b02b-6c4f71b40a92')
def test_delete_tap_resources_after_tf_port_delete(self):
"""delete tap resources after tf port delete
Test delete tap service after deletion of tf port.
"""
tap_service = self.create_tap_service(port_id=self.ts_port['id'])
tap_flow = self.create_tap_flow(tap_service_id=tap_service['id'],
direction='BOTH',
source_port=self.tf_port['id'])
# delete tf port; it shall also delete the associated tap-flow
self.ports_client.delete_port(self.tf_port['id'])
# Attempt tap-flow deletion; it should throw not found exception.
self.assertRaises(lib_exc.NotFound,
self.tap_flows_client.delete_tap_flow,
tap_flow['id'])
# delete tap service; it shall go fine
self.tap_services_client.delete_tap_service(tap_service['id'])
@decorators.idempotent_id('687089b8-b045-496d-86bf-030b380039d1')
def test_create_and_update_tap_service(self):
"""create and update tap service
Test update tap service - update description.
"""
tap_service = self.create_tap_service(port_id=self.ts_port['id'])
# Update description of the tap service
self.update_tap_service(
tap_service['id'],
description='Tap Service Description Updated')
@decorators.idempotent_id('bb4d5482-37fc-46b5-85a5-5867e9adbfae')
def test_create_and_update_tap_flow(self):
"""create and update tap flow
Test update tap flow - update description.
"""
tap_service = self.create_tap_service(port_id=self.ts_port['id'])
tap_flow = self.create_tap_flow(
tap_service_id=tap_service['id'],
direction='BOTH', source_port=self.tf_port['id'])
# Update description of the tap flow
self.update_tap_flow(
tap_flow['id'],
description='Tap Flow Description Updated')

View File

@ -0,0 +1,82 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import tempest.api.network.base as test
from tempest import config
from tempest.lib.common.utils import data_utils
from tempest.lib.common.utils import test_utils
from neutron_tempest_plugin.tap_as_a_service.services import taas_client
CONF = config.CONF
class BaseTaasTest(test.BaseAdminNetworkTest):
@classmethod
def resource_setup(cls):
super(BaseTaasTest, cls).resource_setup()
os_primary = cls.os_primary
cls.tap_services_client = taas_client.TapServicesClient(
os_primary.auth_provider,
CONF.network.catalog_type,
CONF.network.region or CONF.identity.region,
endpoint_type=CONF.network.endpoint_type,
build_interval=CONF.network.build_interval,
build_timeout=CONF.network.build_timeout,
**os_primary.default_params)
cls.tap_flows_client = taas_client.TapFlowsClient(
os_primary.auth_provider,
CONF.network.catalog_type,
CONF.network.region or CONF.identity.region,
endpoint_type=CONF.network.endpoint_type,
build_interval=CONF.network.build_interval,
build_timeout=CONF.network.build_timeout,
**os_primary.default_params)
def create_tap_service(self, **kwargs):
body = self.tap_services_client.create_tap_service(
name=data_utils.rand_name("tap_service"),
**kwargs)
tap_service = body['tap_service']
self.addCleanup(test_utils.call_and_ignore_notfound_exc,
self.tap_services_client.delete_tap_service,
tap_service['id'])
return tap_service
def create_tap_flow(self, **kwargs):
body = self.tap_flows_client.create_tap_flow(
name=data_utils.rand_name("tap_service"),
**kwargs)
tap_flow = body['tap_flow']
self.addCleanup(test_utils.call_and_ignore_notfound_exc,
self.tap_flows_client.delete_tap_flow,
tap_flow['id'])
return tap_flow
def update_tap_service(self, tap_service_id, **kwargs):
body = self.tap_services_client.update_tap_service(
tap_service_id,
**kwargs)
tap_service = body['tap_service']
self.addCleanup(test_utils.call_and_ignore_notfound_exc,
self.tap_services_client.delete_tap_service,
tap_service['id'])
def update_tap_flow(self, tap_flow_id, **kwargs):
body = self.tap_flows_client.update_tap_flow(
tap_flow_id,
**kwargs)
tap_flow = body['tap_flow']
self.addCleanup(test_utils.call_and_ignore_notfound_exc,
self.tap_flows_client.delete_tap_flow,
tap_flow['id'])

View File

@ -0,0 +1,63 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from tempest.lib.services.network import base
class TapServicesClient(base.BaseNetworkClient):
def create_tap_service(self, **kwargs):
uri = '/taas/tap_services'
post_data = {'tap_service': kwargs}
return self.create_resource(uri, post_data)
def update_tap_service(self, tap_service_id, **kwargs):
uri = '/taas/tap_services/%s' % tap_service_id
post_data = {'tap_service': kwargs}
return self.update_resource(uri, post_data)
def show_tap_service(self, tap_service_id, **fields):
uri = '/taas/tap_services/%s' % tap_service_id
return self.show_resource(uri, **fields)
def delete_tap_service(self, tap_service_id):
uri = '/taas/tap_services/%s' % tap_service_id
return self.delete_resource(uri)
def list_tap_services(self, **filters):
uri = '/taas/tap_services'
return self.list_resources(uri, **filters)
class TapFlowsClient(base.BaseNetworkClient):
def create_tap_flow(self, **kwargs):
uri = '/taas/tap_flows'
post_data = {'tap_flow': kwargs}
return self.create_resource(uri, post_data)
def update_tap_flow(self, tap_flow_id, **kwargs):
uri = '/taas/tap_flows/%s' % tap_flow_id
post_data = {'tap_flow': kwargs}
return self.update_resource(uri, post_data)
def show_tap_flow(self, tap_flow_id, **fields):
uri = '/taas/tap_flows/%s' % tap_flow_id
return self.show_resource(uri, **fields)
def delete_tap_flow(self, tap_flow_id):
uri = '/taas/tap_flows/%s' % tap_flow_id
return self.delete_resource(uri)
def list_tap_flows(self, **filters):
uri = '/taas/tap_flows'
return self.list_resources(uri, **filters)

View File

@ -896,3 +896,93 @@
devstack_localrc:
IPSEC_PACKAGE: strongswan
NETWORK_API_EXTENSIONS: "{{ (network_api_extensions_common + network_api_extensions_vpnaas) | join(',') }}"
- job:
name: neutron-tempest-plugin-tap-as-a-service
parent: neutron-tempest-plugin-base
description: |
Perform setup common to all tap-as-a-service tempest tests
roles:
- zuul: openstack/devstack
required-projects:
- openstack/devstack-gate
- openstack/neutron
- openstack/neutron-tempest-plugin
- openstack/tap-as-a-service
- openstack/tempest
vars:
tempest_test_regex: ^neutron_tempest_plugin\.tap_as_a_service
tox_envlist: all
network_api_extensions_common: *api_extensions
network_api_extensions_tempest:
- taas
- taas-vlan-filter
devstack_localrc:
NETWORK_API_EXTENSIONS: "{{ (network_api_extensions_common + network_api_extensions_tempest) | join(',') }}"
DOWNLOAD_DEFAULT_IMAGES: false
IMAGE_URLS: "http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-i386-disk.img,https://cloud-images.ubuntu.com/releases/bionic/release/ubuntu-18.04-server-cloudimg-amd64.img"
DEFAULT_IMAGE_NAME: cirros-0.3.4-i386-disk
ADVANCED_IMAGE_NAME: ubuntu-18.04-server-cloudimg-amd64
BUILD_TIMEOUT: 784
Q_AGENT: openvswitch
Q_ML2_TENANT_NETWORK_TYPE: vxlan
Q_ML2_PLUGIN_MECHANISM_DRIVERS: openvswitch
devstack_local_conf:
post-config:
/$NEUTRON_CORE_PLUGIN_CONF:
AGENT:
tunnel_types: vxlan,gre
test-config:
$TEMPEST_CONFIG:
taas_plugin_options:
advanced_image_ref: ubuntu-18.04-server-cloudimg-amd64
advanced_image_ssh_user: ubuntu
provider_physical_network: public
provider_segmentation_id: 100
image_feature_enabled:
api_v2: true
devstack_plugins:
neutron: git://opendev.org/openstack/neutron.git
neutron-tempest-plugin: https://opendev.org/openstack/neutron-tempest-plugin.git
tap-as-a-service: git://opendev.org/openstack/tap-as-a-service.git
devstack_services:
# Disable OVN services
ovn-controller: false
ovn-northd: false
ovs-vswitchd: false
ovsdb-server: false
q-ovn-metadata-agent: false
# Enable Neutron services that are not used by OVN
q-agt: true
q-dhcp: true
q-l3: true
q-meta: true
q-metering: true
br-ex-tcpdump: true
br-int-flows: true
base: false
key: true
mysql: true
rabbit: true
g-api: true
g-reg: true
n-api: true
n-cond: true
n-cpu: true
n-crt: true
n-sch: true
placement-api: true
n-api-meta: true
q-svc: true
quantum: true
taas: true
taas_openvswitch_agent: true
tempest: true
dstat: true
irrelevant-files: &tempest-irrelevant-files
- ^(test-|)requirements.txt$
- ^releasenotes/.*$
- ^doc/.*$
- ^.*\.rst$
- ^tools/.*$
- ^tox.ini$

View File

@ -186,6 +186,7 @@
- neutron-tempest-plugin-vpnaas-ussuri
- neutron-tempest-plugin-vpnaas-victoria
- neutron-tempest-plugin-vpnaas-wallaby
- neutron-tempest-plugin-tap-as-a-service
gate:
jobs: