Retire tap-as-a-service-tempest-plugin: Remove project content

Change-Id: I9b8f06664afea6331990caeacecb8d4abb56cff4
This commit is contained in:
elajkat 2024-07-10 08:59:05 +02:00 committed by Dr. Jens Harbott
parent ca1b905adb
commit 0621787700
26 changed files with 14 additions and 2583 deletions

58
.gitignore vendored
View File

@ -1,58 +0,0 @@
*.py[cod]
# C extensions
*.so
# Packages
*.egg
*.egg-info
dist
build
.eggs
eggs
parts
bin
var
sdist
develop-eggs
.installed.cfg
lib
lib64
# Installer logs
pip-log.txt
# Unit test / coverage reports
.coverage
.tox
nosetests.xml
.testrepository
.stestr
.venv
# Translations
*.mo
# Mr Developer
.mr.developer.cfg
.project
.pydevproject
# Complexity
output/*.html
output/*/index.html
# Sphinx
doc/build
# pbr generates these
AUTHORS
ChangeLog
# Editors
*~
.*.swp
.*sw?
# Files created by releasenotes build
releasenotes/build

View File

@ -1,3 +0,0 @@
# Format is:
# <preferred e-mail> <other e-mail 1>
# <preferred e-mail> <other e-mail 2>

View File

@ -1,264 +0,0 @@
- project:
templates:
- check-requirements
- tempest-plugin-jobs
check:
jobs:
- tap-as-a-service-tempest-plugin:
voting: false
nodeset: openstack-single-node-focal
- tap-as-a-service-tempest-plugin-train:
voting: false
- tap-as-a-service-tempest-plugin-stein:
voting: false
- tap-as-a-service-tempest-plugin-rocky:
voting: false
- tap-as-a-service-tempest-plugin-queens:
voting: false
- tap-as-a-service-tempest-plugin-pike:
voting: false
- job:
name: tap-as-a-service-tempest-plugin
parent: devstack-tempest
description: |
Perform setup common to all tap-as-a-service tempest tests
roles:
- zuul: openstack/devstack
required-projects:
- openstack/devstack-gate
- openstack/neutron
- openstack/tap-as-a-service
- x/tap-as-a-service-tempest-plugin
- openstack/tempest
vars:
tempest_test_regex: ^neutron_taas_tempest_plugin\.
tempest_concurrency: 4
tox_envlist: all
network_api_extensions_common:
- agent
- allowed-address-pairs
- auto-allocated-topology
- availability_zone
- binding
- default-subnetpools
- dhcp_agent_scheduler
- dns-domain-ports
- dns-integration
- empty-string-filtering
- ext-gw-mode
- external-net
- extra_dhcp_opt
- extraroute
- filter-validation
- fip-port-details
- flavors
- floatingip-pools
- ip-substring-filtering
- l3-flavors
- l3-ha
- l3_agent_scheduler
- logging
- metering
- multi-provider
- net-mtu
- net-mtu-writable
- network-ip-availability
- network_availability_zone
- pagination
- port-resource-request
- port-mac-address-regenerate
- port-security
- port-security-groups-filtering
- project-id
- provider
- qos
- qos-bw-minimum-ingress
- qos-fip
- quotas
- quota_details
- rbac-policies
- router
- router_availability_zone
- security-group
- segment
- service-type
- sorting
- standard-attr-description
- standard-attr-revisions
- standard-attr-segment
- standard-attr-tag
- standard-attr-timestamp
- subnet_allocation
- trunk
- trunk-details
- uplink-status-propagation
network_api_extensions_tempest:
- taas
- taas-vlan-filter
devstack_localrc:
TEMPEST_PLUGINS: /opt/stack/tap-as-a-service-tempest-plugin
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
tap-as-a-service: git://opendev.org/openstack/tap-as-a-service.git
# tempest_plugins:
# - tap-as-a-service-tempest-plugin
devstack_services:
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
# Disable OVN services
br-ex-tcpdump: false
br-int-flows: false
ovn-controller: false
ovn-northd: false
ovs-vswitchd: false
ovsdb-server: false
q-ovn-metadata-agent: false
# Neutron services
q-agt: true
q-dhcp: true
q-l3: true
q-meta: true
q-metering: 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$
- job:
name: tap-as-a-service-tempest-plugin-base
parent: tap-as-a-service-tempest-plugin
- job:
name: tap-as-a-service-tempest-plugin-train
parent: tap-as-a-service-tempest-plugin
override-checkout: stable/train
- job:
name: tap-as-a-service-tempest-plugin-stein
parent: tap-as-a-service-tempest-plugin
override-checkout: stable/stein
- job:
name: tap-as-a-service-tempest-plugin-rocky
parent: tap-as-a-service-tempest-plugin
override-checkout: stable/rocky
nodeset: openstack-single-node-xenial
vars:
network_api_extensions_tempest:
- taas
devstack_localrc:
USE_PYTHON3: false
tempest_black_regex: |
(?x) # Ignore comments and whitespaces
# bug 1814937
neutron_taas_tempest_plugin\.tests\.api\.test_taas\.TaaSExtensionTestJSON\.test_delete_tap_resources_after_ts_port_delete
- job:
name: tap-as-a-service-tempest-plugin-queens
parent: tap-as-a-service-tempest-plugin
override-checkout: stable/queens
nodeset: openstack-single-node-xenial
vars:
network_api_extensions_tempest:
- taas
devstack_localrc:
USE_PYTHON3: false
tempest_black_regex: |
(?x) # Ignore comments and whitespaces
# bug 1814937
neutron_taas_tempest_plugin\.tests\.api\.test_taas\.TaaSExtensionTestJSON\.test_delete_tap_resources_after_ts_port_delete
- job:
name: tap-as-a-service-tempest-plugin-pike
parent: tap-as-a-service-tempest-plugin
override-checkout: stable/pike
nodeset: openstack-single-node-xenial
vars:
network_api_extensions_tempest:
- taas
devstack_localrc:
USE_PYTHON3: false
tempest_black_regex: |
(?x) # Ignore comments and whitespaces
# bug 1814937
neutron_taas_tempest_plugin\.tests\.api\.test_taas\.TaaSExtensionTestJSON\.test_delete_tap_resources_after_ts_port_delete
- project-template:
name: tap-as-a-service-tempest-plugin-jobs
check:
jobs:
- tap-as-a-service-tempest-plugin
gate:
jobs:
- tap-as-a-service-tempest-plugin
- project-template:
name: tap-as-a-service-tempest-plugin-jobs-rocky
check:
jobs:
- tap-as-a-service-tempest-plugin-rocky
gate:
jobs:
- tap-as-a-service-tempest-plugin-rocky
- project-template:
name: tap-as-a-service-tempest-plugin-jobs-queens
check:
jobs:
- tap-as-a-service-tempest-plugin-queens
gate:
jobs:
- tap-as-a-service-tempest-plugin-queens
- project-template:
name: tap-as-a-service-tempest-plugin-jobs-pike
check:
jobs:
- tap-as-a-service-tempest-plugin-pike
gate:
jobs:
- tap-as-a-service-tempest-plugin-pike

View File

@ -1,17 +0,0 @@
If you would like to contribute to the development of OpenStack, you must
follow the steps in this page:
https://docs.openstack.org/infra/manual/developers.html
If you already have a good understanding of how the system works and your
OpenStack accounts are set up, you can skip to the development workflow
section of this documentation to learn how changes to OpenStack should be
submitted for review via the Gerrit tool:
https://docs.openstack.org/infra/manual/developers.html#development-workflow
Pull requests submitted through GitHub will be ignored.
Bugs should be filed on Launchpad, not GitHub:
https://bugs.launchpad.net/tap-as-a-service

176
LICENSE
View File

@ -1,176 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.

View File

@ -1,5 +1,15 @@
===================================
Tempest plugin for Tap as a Service
===================================
This project is no longer maintained.
The contents of this repository are still available in the Git
source code management system. To see the contents of this
repository before it reached its end of life, please check out the
previous commit with "git checkout HEAD^1".
The content of tap-as-a-service-tempest-plugin was moved to
neutron-tempest-plugin and maintained there:
https://opendev.org/openstack/neutron-tempest-plugin/src/branch/master/neutron_tempest_plugin/tap_as_a_service
For any further questions, please email
openstack-discuss@lists.openstack.org or join #openstack-dev on
OFTC.
This repository contains tempest plugin for tap-as-a-service.

View File

@ -1,47 +0,0 @@
# Copyright (c) 2018 AT&T Corporation
# All Rights Reserved.
#
# 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 oslo_config import cfg
from tempest import config
CONF = config.CONF
taas_plugin_group = cfg.OptGroup(name='taas_plugin_options',
title='TaaS Tempest Plugin Options')
TaaSPluginGroup = [
cfg.StrOpt('provider_physical_network',
default='',
help='Physical network to be used for creating SRIOV network.'),
cfg.StrOpt('provider_segmentation_id',
default='',
help='Segmentation-id to be used for creating SRIOV network.'),
cfg.StrOpt('vlan_filter',
default='',
help='Comma separated list of VLANs to be mirrored '
'for a Tap-Flow.'),
cfg.StrOpt('advanced_image_ref',
default='',
help='Valid advanced image uuid to be used in tests. '
'Must contain tcpdump preinstalled.'),
cfg.StrOpt('advanced_image_ssh_user',
default='ubuntu',
help='Name of ssh user to use with advanced image in tests.'),
cfg.StrOpt('advanced_image_flavor_ref',
default='d1',
help='Valid flavor to use with advanced image in tests.'),
]

View File

@ -1,39 +0,0 @@
# Copyright (c) 2015 Midokura SARL
# All Rights Reserved.
#
# 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 os
from tempest.test_discover import plugins
from neutron_taas_tempest_plugin import config as project_config
class NeutronTaaSPlugin(plugins.TempestPlugin):
def get_opt_lists(self):
return [(project_config.taas_plugin_group.name,
project_config.TaaSPluginGroup)]
def load_tests(self):
this_dir = os.path.dirname(os.path.abspath(__file__))
# top_level_dir = $(this_dir)/..
top_level_dir = os.path.split(this_dir)[0]
test_dir = os.path.join(top_level_dir,
'neutron_taas_tempest_plugin/tests')
return (test_dir, top_level_dir)
def register_opts(self, conf):
conf.register_group(project_config.taas_plugin_group)
conf.register_opts(project_config.TaaSPluginGroup,
project_config.taas_plugin_group)

View File

@ -1,66 +0,0 @@
# Copyright (c) 2015 Midokura SARL
# All Rights Reserved.
#
# 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

@ -1,22 +0,0 @@
# Copyright (c) 2015 Midokura SARL
# All Rights Reserved.
#
# 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.api.network import base
from neutron_taas_tempest_plugin.tests import taas_client
class BaseTaaSTest(taas_client.TaaSClientMixin, base.BaseNetworkTest):
pass

View File

@ -1,133 +0,0 @@
# Copyright (c) 2018 AT&T Intellectual Property. All other rights reserved.
# Copyright (c) 2015 Midokura SARL
# All Rights Reserved.
#
# 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_taas_tempest_plugin.tests.api 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

@ -1,22 +0,0 @@
# Copyright (c) 2015 Midokura SARL
# All Rights Reserved.
#
# 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 neutron_taas_tempest_plugin.tests.scenario import manager
from neutron_taas_tempest_plugin.tests import taas_client
class TaaSScenarioTest(taas_client.TaaSClientMixin,
manager.NetworkScenarioTest):
pass

File diff suppressed because it is too large Load Diff

View File

@ -1,277 +0,0 @@
# Copyright (c) 2015 Midokura SARL
# All Rights Reserved.
#
# 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 oslo_log import log as logging
from tempest.common import utils
from tempest import config
from tempest.lib.common.utils import data_utils
from tempest.lib.common.utils import test_utils
from tempest.lib import decorators
from tempest.lib import exceptions as lib_exc
import testtools
from neutron_taas_tempest_plugin.tests.scenario import base
CONF = config.CONF
LOG = logging.getLogger(__name__)
# pylint: disable=too-many-ancestors
class TestTaaS(base.TaaSScenarioTest):
"""Config Requirement in tempest.conf:
- project_network_cidr_bits- specifies the subnet range for each network
- project_network_cidr
- public_network_id.
"""
@classmethod
@utils.requires_ext(extension='taas', service='network')
@utils.requires_ext(extension='security-group', service='network')
@utils.requires_ext(extension='router', service='network')
def skip_checks(cls):
super(TestTaaS, cls).skip_checks()
@classmethod
def resource_setup(cls):
LOG.debug("Initializing TaaSScenarioTest Setup")
super(TestTaaS, cls).resource_setup()
LOG.debug("TaaSScenarioTest Setup done.")
def _create_server(self, network, security_group=None):
"""Create a server
Creates a server having a port on given network and security group.
"""
keys = self.create_keypair()
kwargs = {}
if security_group is not None:
kwargs['security_groups'] = [{'name': security_group['name']}]
server = self.create_server(
key_name=keys['name'],
networks=[{'uuid': network['id']}],
wait_until='ACTIVE',
**kwargs)
return server, keys
def _create_test_server(self, network, security_group):
"""Create a server
Creates a server having a port on given network and security group;
Also creates a floting IP if port is not an sriov port.
"""
pub_network_id = CONF.network.public_network_id
server, keys = self._create_server(
network, security_group=security_group)
private_key = keys['private_key']
vnic_type = CONF.network.port_vnic_type
server_floating_ip = None
if vnic_type != 'direct':
server_floating_ip = self.create_floating_ip(server,
pub_network_id)
fixed_ip = list(server['addresses'].values())[0][0]['addr']
return server, private_key, fixed_ip, server_floating_ip
@testtools.skipUnless(CONF.taas_plugin_options.provider_physical_network,
'Provider physical network parameter not provided.')
@utils.requires_ext(extension="provider", service="network")
def _create_network_sriov(self, networks_client=None,
tenant_id=None,
namestart='network-smoke-sriov-',
port_security_enabled=True):
if not networks_client:
networks_client = self.networks_client
if not tenant_id:
tenant_id = networks_client.tenant_id
name = data_utils.rand_name(namestart)
network_kwargs = dict(name=name, tenant_id=tenant_id)
# Neutron disables port security by default so we have to check the
# config before trying to create the network with
# port_security_enabled
if CONF.network_feature_enabled.port_security:
network_kwargs['port_security_enabled'] = port_security_enabled
if CONF.network.port_vnic_type and \
CONF.network.port_vnic_type == 'direct':
network_kwargs['provider:network_type'] = 'vlan'
if CONF.taas_plugin_options.provider_segmentation_id:
if CONF.taas_plugin_options.provider_segmentation_id == '0':
network_kwargs['provider:network_type'] = 'flat'
else:
network_kwargs['provider:segmentation_id'] = \
CONF.taas_plugin_options.provider_segmentation_id
network_kwargs['provider:physical_network'] = \
CONF.taas_plugin_options.provider_physical_network
result = networks_client.create_network(**network_kwargs)
network = result['network']
self.assertEqual(network['name'], name)
self.addCleanup(test_utils.call_and_ignore_notfound_exc,
networks_client.delete_network,
network['id'])
return network
@testtools.skipUnless(CONF.taas_plugin_options.provider_physical_network,
'Provider physical network parameter not provided.')
@utils.requires_ext(extension="provider", service="network")
def create_networks_sriov(self, networks_client=None,
routers_client=None, subnets_client=None,
tenant_id=None, dns_nameservers=None,
port_security_enabled=True):
"""Create a network with a subnet connected to a router.
The baremetal driver is a special case since all nodes are
on the same shared network.
:param tenant_id: id of tenant to create resources in.
:param dns_nameservers: list of dns servers to send to subnet.
:returns: network, subnet, router
"""
router = None
if CONF.network.shared_physical_network:
# NOTE(Shrews): This exception is for environments where tenant
# credential isolation is available, but network separation is
# not (the current baremetal case). Likely can be removed when
# test account mgmt is reworked:
# https://blueprints.launchpad.net/tempest/+spec/test-accounts
if not CONF.compute.fixed_network_name:
msg = 'fixed_network_name must be specified in config'
raise lib_exc.InvalidConfiguration(msg)
network = self._get_network_by_name(
CONF.compute.fixed_network_name)
subnet = None
else:
network = self._create_network_sriov(
networks_client=networks_client,
tenant_id=tenant_id,
port_security_enabled=port_security_enabled)
subnet_kwargs = dict(network=network,
subnets_client=subnets_client,
routers_client=routers_client)
# use explicit check because empty list is a valid option
if dns_nameservers is not None:
subnet_kwargs['dns_nameservers'] = dns_nameservers
subnet = self._create_subnet(**subnet_kwargs)
return network, subnet, router
def _create_topology(self):
"""Topology
+----------+ +----------+
| "server" | | "server" |
| VM-1 | | VM-2 |
| | | |
+----+-----+ +----+-----+
| |
| |
+----+----+----+----+----+----+-----+
|
|
|
+------+------+
| "server" |
| tap-service |
+-------------+
"""
LOG.debug('Starting Topology Creation')
resp = {}
# Create Network1 and Subnet1.
vnic_type = CONF.network.port_vnic_type
if vnic_type == 'direct':
self.network1, self.subnet1, self.router1 = \
self.create_networks_sriov()
else:
self.network1, self.subnet1, self.router1 = self.create_networks()
resp['network1'] = self.network1
resp['subnet1'] = self.subnet1
resp['router1'] = self.router1
# Create a security group allowing icmp and ssh traffic.
security_group = self._create_security_group()
# Create 3 VMs and assign them a floating IP each.
server1, private_key1, server_fixed_ip_1, server_floating_ip_1 = (
self._create_test_server(self.network1, security_group))
server2, private_key2, server_fixed_ip_2, server_floating_ip_2 = (
self._create_test_server(self.network1, security_group))
server3, private_key3, server_fixed_ip_3, server_floating_ip_3 = (
self._create_test_server(self.network1, security_group))
# Store the received information to be used later
resp['server1'] = server1
resp['private_key1'] = private_key1
resp['server_fixed_ip_1'] = server_fixed_ip_1
resp['server_floating_ip_1'] = server_floating_ip_1
resp['server2'] = server2
resp['private_key2'] = private_key2
resp['server_fixed_ip_2'] = server_fixed_ip_2
resp['server_floating_ip_2'] = server_floating_ip_2
resp['server3'] = server3
resp['private_key3'] = private_key3
resp['server_fixed_ip_3'] = server_fixed_ip_3
resp['server_floating_ip_3'] = server_floating_ip_3
return resp
@utils.services('network')
@utils.requires_ext(extension="taas-vlan-filter", service="network")
@decorators.attr(type='slow')
@decorators.idempotent_id('40903cbd-0e3c-464d-b311-dc77d3894e65')
def test_tap_flow_data_mirroring(self):
"""Create test topology and TaaS resources
Creates test topology consisting of 3 servers, one routable network,
ports and TaaS resources, i.e. tap-service and tap-flow using those
ports.
"""
topology = self._create_topology()
# Fetch source port and tap-service port to be used for creating
# Tap Service and Tap flow.
source_port = self.os_admin.ports_client.list_ports(
network_id=topology['network1']['id'],
device_id=topology['server1']['id']
)['ports'][0]
tap_service_port = self.os_admin.ports_client.list_ports(
network_id=topology['network1']['id'],
device_id=topology['server3']['id']
)['ports'][0]
# Create Tap-Service.
tap_service = self.create_tap_service(port_id=tap_service_port['id'])
LOG.debug('TaaS Config options: vlan-filter: %s',
CONF.taas_plugin_options.vlan_filter)
# Create Tap-Flow.
vnic_type = CONF.network.port_vnic_type
vlan_filter = None
if vnic_type == 'direct':
vlan_filter = '108-117,126,135-144'
if CONF.taas_plugin_options.vlan_filter:
vlan_filter = CONF.taas_plugin_options.vlan_filter
elif topology['network1']['provider:segmentation_id'] != '0':
vlan_filter = topology['network1']['provider:segmentation_id']
tap_flow = self.create_tap_flow(tap_service_id=tap_service['id'],
direction='BOTH',
source_port=source_port['id'],
vlan_filter=vlan_filter)
self.assertEqual(tap_flow['vlan_filter'], vlan_filter)

View File

@ -1,245 +0,0 @@
# Copyright (c) 2019 AT&T
# All Rights Reserved.
#
# 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 contextlib import contextmanager
from oslo_log import log
import testtools
from tempest.common import utils
from tempest import config
from tempest.lib.common.utils.linux import remote_client
from tempest.lib import decorators
from neutron_taas_tempest_plugin.tests.scenario import base
CONF = config.CONF
LOG = log.getLogger(__name__)
class TestTaaSTrafficScenarios(base.TaaSScenarioTest):
@classmethod
def setup_clients(cls):
super(TestTaaSTrafficScenarios, cls).setup_clients()
if CONF.image_feature_enabled.api_v1:
cls.image_client = cls.os_primary.image_client
elif CONF.image_feature_enabled.api_v2:
cls.image_client = cls.os_primary.image_client_v2
else:
raise cls.skipException(
'Either api_v1 or api_v2 must be True in '
'[image-feature-enabled].')
@classmethod
@utils.requires_ext(extension="router", service="network")
def resource_setup(cls):
super(TestTaaSTrafficScenarios, cls).resource_setup()
for ext in ['taas']:
if not utils.is_extension_enabled(ext, 'network'):
msg = "%s Extension not enabled." % ext
raise cls.skipException(msg)
cls.network, cls.subnet, cls.router = cls.create_networks()
cls.provider_network = None
cls.keypair = cls.create_keypair()
cls.secgroup = cls._create_security_group()
@contextmanager
def _setup_topology(self, taas=True, use_taas_cloud_image=False,
provider_net=False):
"""Setup topology for the test
+------------+
| monitor vm |
+-----+------+
|
+-----v---+
+--+ network <--+
| +----^----+ |
| | |
| +----+-+ +---+--+
| | vm 1 | | vm 2 |
| +------+ +------+
|
| +--------+
+--> router |
+-----+--+
|
+-----v------+
| public net |
+------------+
"""
if provider_net:
if CONF.taas_plugin_options.provider_physical_network:
self.provider_network = self._setup_provider_network()
else:
msg = "provider_physical_network not provided"
raise self.skipException(msg)
self.mon_port, mon_fip = self._create_server_with_floatingip(
use_taas_cloud_image=use_taas_cloud_image,
provider_net=provider_net)
self.left_port, left_fip = self._create_server_with_floatingip(
provider_net=provider_net)
self.right_port, right_fip = self._create_server_with_floatingip(
provider_net=provider_net)
if taas:
LOG.debug("Create TAAS service")
tap_service = self.create_tap_service(port_id=self.mon_port['id'])
self.create_tap_flow(tap_service_id=tap_service['id'],
direction='BOTH',
source_port=self.left_port['id'])
self.create_tap_flow(tap_service_id=tap_service['id'],
direction='BOTH',
source_port=self.right_port['id'])
user = CONF.validation.image_ssh_user
if use_taas_cloud_image:
user = CONF.taas_plugin_options.advanced_image_ssh_user
self.monitor_client = remote_client.RemoteClient(
mon_fip['floating_ip_address'], user,
pkey=self.keypair['private_key'])
self.left_client = remote_client.RemoteClient(
left_fip['floating_ip_address'], CONF.validation.image_ssh_user,
pkey=self.keypair['private_key'])
self.right_client = remote_client.RemoteClient(
right_fip['floating_ip_address'], CONF.validation.image_ssh_user,
pkey=self.keypair['private_key'])
yield
def _check_icmp_traffic(self):
log_location = "/tmp/tcpdumplog"
right_ip = self.right_port['fixed_ips'][0]['ip_address']
left_ip = self.left_port['fixed_ips'][0]['ip_address']
# Run tcpdump in background
self._run_in_background(self.monitor_client,
"sudo tcpdump -n -nn > %s" % log_location)
# Ensure tcpdump is up and running
psax = self.monitor_client.exec_command("ps -ax")
self.assertTrue("tcpdump" in psax)
# Run traffic from left_vm to right_vm
self.left_client.exec_command("ping -c 50 %s" % right_ip)
# Collect tcpdump results
output = self.monitor_client.exec_command("cat %s" % log_location)
self.assertTrue(len(output) > 0)
looking_for = ["IP %s > %s: ICMP echo request" % (left_ip, right_ip),
"IP %s > %s: ICMP echo reply" % (right_ip, left_ip)]
results = []
for tcpdump_line in looking_for:
results.append(tcpdump_line in output)
return all(results)
def _test_taas_connectivity(self, use_provider_net=False):
"""Ensure TAAS doesn't break connectivity
This test creates TAAS service between two servers and checks that
it doesn't break basic connectivity between them.
"""
# Check uninterrupted traffic between VMs
with self._setup_topology(provider_net=use_provider_net):
# Left to right
self._check_remote_connectivity(
self.left_client,
self.right_port['fixed_ips'][0]['ip_address'])
# Right to left
self._check_remote_connectivity(
self.right_client,
self.left_port['fixed_ips'][0]['ip_address'])
# TAAS vm to right
self._check_remote_connectivity(
self.monitor_client,
self.right_port['fixed_ips'][0]['ip_address'])
# TAAS vm to left
self._check_remote_connectivity(
self.monitor_client,
self.left_port['fixed_ips'][0]['ip_address'])
@decorators.idempotent_id('ff414b7d-e81c-47f2-b6c8-53bc2f1e9b00')
@decorators.attr(type='slow')
@utils.services('compute', 'network')
def test_taas_provider_network_connectivity(self):
self._test_taas_connectivity(use_provider_net=True)
@decorators.idempotent_id('e3c52e91-7abf-4dfd-8687-f7c071cdd333')
@decorators.attr(type='slow')
@utils.services('compute', 'network')
def test_taas_network_connectivity(self):
self._test_taas_connectivity(use_provider_net=False)
@decorators.idempotent_id('fcb15ca3-ef61-11e9-9792-f45c89c47e11')
@testtools.skipUnless(CONF.taas_plugin_options.advanced_image_ref,
'Cloud image not found.')
@decorators.attr(type='slow')
@utils.services('compute', 'network')
def test_taas_forwarded_traffic_positive(self):
"""Check that TAAS forwards traffic as expected"""
with self._setup_topology(use_taas_cloud_image=True):
# Check that traffic was forwarded to TAAS service
self.assertTrue(self._check_icmp_traffic())
@decorators.idempotent_id('6c54d9c5-075a-4a1f-bbe6-12c3c9abf1e2')
@testtools.skipUnless(CONF.taas_plugin_options.advanced_image_ref,
'Cloud image not found.')
@decorators.attr(type='slow')
@utils.services('compute', 'network')
def test_taas_forwarded_traffic_negative(self):
"""Check that TAAS doesn't forward traffic"""
with self._setup_topology(taas=False, use_taas_cloud_image=True):
# Check that traffic was NOT forwarded to TAAS service
self.assertFalse(self._check_icmp_traffic())
@decorators.idempotent_id('fcb15ca3-ef61-11e9-9792-f45c89c47e12')
@testtools.skipUnless(CONF.taas_plugin_options.advanced_image_ref,
'Cloud image not found.')
@decorators.attr(type='slow')
@utils.services('compute', 'network')
def test_taas_forwarded_traffic_provider_net_positive(self):
"""Check that TAAS forwards traffic as expected in provider network"""
with self._setup_topology(use_taas_cloud_image=True,
provider_net=True):
# Check that traffic was forwarded to TAAS service
self.assertTrue(self._check_icmp_traffic())
@decorators.idempotent_id('6c54d9c5-075a-4a1f-bbe6-12c3c9abf1e3')
@testtools.skipUnless(CONF.taas_plugin_options.advanced_image_ref,
'Cloud image not found.')
@decorators.attr(type='slow')
@utils.services('compute', 'network')
def test_taas_forwarded_traffic_provider_net_negative(self):
"""Check that TAAS doesn't forward traffic in provider network"""
with self._setup_topology(taas=False, use_taas_cloud_image=True,
provider_net=True):
# Check that traffic was NOT forwarded to TAAS service
self.assertFalse(self._check_icmp_traffic())

View File

@ -1,84 +0,0 @@
# Copyright (c) 2015 Midokura SARL
# All Rights Reserved.
#
# 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 import config
from tempest.lib.common.utils import data_utils
from tempest.lib.common.utils import test_utils
from neutron_taas_tempest_plugin.services import client
CONF = config.CONF
class TaaSClientMixin(object):
@classmethod
def resource_setup(cls):
super(TaaSClientMixin, cls).resource_setup()
os_primary = cls.os_primary
cls.tap_services_client = 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 = 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

@ -1,5 +0,0 @@
# The order of packages is significant, because pip processes them in the order
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
pbr>=5.5.0 # Apache-2.0

View File

@ -1,45 +0,0 @@
[metadata]
name = tap-as-a-service-tempest-plugin
summary = Tempest plugin for Tap-as-a-Service
description-file =
README.rst
author = OpenStack
author-email = openstack-discuss@lists.openstack.org
home-page = http://www.openstack.org/
classifier =
Environment :: OpenStack
Intended Audience :: Information Technology
Intended Audience :: System Administrators
License :: OSI Approved :: Apache Software License
Operating System :: POSIX :: Linux
Programming Language :: Python
Programming Language :: Python :: 2
Programming Language :: Python :: 2.7
Programming Language :: Python :: 3
Programming Language :: Python :: 3.5
[files]
packages =
neutron_taas_tempest_plugin
[build_sphinx]
source-dir = doc/source
build-dir = doc/build
all_files = 1
[upload_sphinx]
upload-dir = doc/build/html
[build_releasenotes]
build-dir = releasenotes/build
source-dir = releasenotes/source
all_files = 1
[entry_points]
tempest.test_plugins =
tap-as-a-service-tempest-plugin = neutron_taas_tempest_plugin.plugin:NeutronTaaSPlugin
[pbr]
autodoc_index_modules = True
warnerrors = True

View File

@ -1,29 +0,0 @@
# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
#
# 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.
# THIS FILE IS MANAGED BY THE GLOBAL REQUIREMENTS REPO - DO NOT EDIT
import setuptools
# In python < 2.7.4, a lazy loading of package `pbr` will break
# setuptools if some other modules registered functions in `atexit`.
# solution from: http://bugs.python.org/issue15881#msg170215
try:
import multiprocessing # noqa
except ImportError:
pass
setuptools.setup(
setup_requires=['pbr>=2.0.0'],
pbr=True)

View File

@ -1,13 +0,0 @@
# The order of packages is significant, because pip processes them in the order
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
hacking>=3.0.0,<3.1 # Apache-2.0
coverage>=5.2.1 # Apache-2.0
python-subunit>=1.4.0 # Apache-2.0/BSD
sphinx!=1.6.6,!=1.6.7,>=1.6.2 # BSD
oslosphinx>=4.7.0 # Apache-2.0
oslotest>=4.4.1 # Apache-2.0
os-testr>=1.0.0 # Apache-2.0
reno>=2.5.0 # Apache-2.0

34
tox.ini
View File

@ -1,34 +0,0 @@
[tox]
envlist = pep8
minversion = 1.8
skipsdist = True
[testenv]
setenv = VIRTUAL_ENV={envdir}
PYTHONWARNINGS=default::DeprecationWarning
usedevelop = True
install_command = pip install {opts} {packages}
deps = -c{env:UPPER_CONSTRAINTS_FILE:https://opendev.org/openstack/requirements/raw/branch/master/upper-constraints.txt}
-r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt
commands = find . -type f -name "*.py[c|o]" -delete
find . -type l -name "*.py[c|o]" -delete
find . -type d -name "__pycache__" -delete
ostestr --regex '{posargs}'
whitelist_externals = find
[testenv:pep8]
commands =
flake8
[testenv:venv]
commands = {posargs}
[flake8]
# E123, E125 skipped as they are invalid PEP-8.
# W504 Line break occurred after a binary operator
show-source = True
ignore = E123,E125,W504
builtins = _
exclude=.venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,build