Merge "Tests for DNS integration"
diff --git a/.zuul.yaml b/.zuul.yaml
index 0ea94bc..ba7e158 100644
--- a/.zuul.yaml
+++ b/.zuul.yaml
@@ -12,6 +12,7 @@
irrelevant-files:
- ^(test-|)requirements.txt$
- ^releasenotes/.*$
+ - ^doc/.*$
- ^setup.cfg$
- job:
@@ -28,6 +29,7 @@
irrelevant-files:
- ^(test-|)requirements.txt$
- ^releasenotes/.*$
+ - ^doc/.*$
- ^setup.cfg$
voting: false
@@ -46,6 +48,7 @@
irrelevant-files:
- ^(test-|)requirements.txt$
- ^releasenotes/.*$
+ - ^doc/.*$
- ^setup.cfg$
voting: false
diff --git a/devstack/README.rst b/devstack/README.rst
new file mode 100644
index 0000000..e605fcf
--- /dev/null
+++ b/devstack/README.rst
@@ -0,0 +1,21 @@
+====================
+Enabling in Devstack
+====================
+
+**WARNING**: the stack.sh script must be run in a disposable VM that is not
+being created automatically, see the README.md file in the "devstack"
+repository. See contrib/vagrant to create a vagrant VM.
+
+1. Download DevStack::
+
+ git clone https://git.openstack.org/openstack-dev/devstack.git
+ cd devstack
+
+2. Add this repo as an external repository::
+
+ > cat local.conf
+ [[local|localrc]]
+ enable_plugin neutron-tempest-plugin https://git.openstack.org/openstack/neutron-tempest-plugin
+
+3. run ``stack.sh``
+
diff --git a/devstack/plugin.sh b/devstack/plugin.sh
new file mode 100644
index 0000000..a2009ea
--- /dev/null
+++ b/devstack/plugin.sh
@@ -0,0 +1,13 @@
+# install_neutron_tempest_plugin
+function install_neutron_tempest_plugin {
+ setup_dev_lib "neutron-tempest-plugin"
+}
+
+if [[ "$1" == "stack" ]]; then
+ case "$2" in
+ install)
+ echo_summary "Installing neutron-tempest-plugin"
+ install_neutron_tempest_plugin
+ ;;
+ esac
+fi
diff --git a/devstack/settings b/devstack/settings
new file mode 100644
index 0000000..614376f
--- /dev/null
+++ b/devstack/settings
@@ -0,0 +1,3 @@
+GITREPO["neutron-tempest-plugin"]=${NEUTRON_TEMPEST_REPO:-${GIT_BASE}/openstack/neutron-tempest-plugin.git}
+GITDIR["neutron-tempest-plugin"]=$DEST/neutron-tempest-plugin
+GITBRANCH["neutron-tempest-plugin"]=master
diff --git a/neutron_tempest_plugin/api/admin/test_external_network_extension.py b/neutron_tempest_plugin/api/admin/test_external_network_extension.py
index b59d10e..cd4635c 100644
--- a/neutron_tempest_plugin/api/admin/test_external_network_extension.py
+++ b/neutron_tempest_plugin/api/admin/test_external_network_extension.py
@@ -110,6 +110,47 @@
body = self.admin_client.show_network(net_id)['network']
self.assertTrue(body['router:external'])
+ @decorators.idempotent_id('beddbe9d-304c-4577-8bbe-9b61d0a449b4')
+ def test_external_conversion_on_policy_delete(self):
+ net_id = self._create_network(external=False)['id']
+ policy = self.admin_client.create_rbac_policy(
+ object_type='network', object_id=net_id,
+ action='access_as_external',
+ target_tenant='*')
+ body = self.admin_client.show_network(net_id)['network']
+ self.assertTrue(body['router:external'])
+ self.admin_client.delete_rbac_policy(policy['rbac_policy']['id'])
+ body = self.admin_client.show_network(net_id)['network']
+ self.assertFalse(body['router:external'])
+
+ @decorators.idempotent_id('fb938b8e-d1d2-4bf8-823a-1b3c79c98a25')
+ def test_external_conversion_on_one_policy_delete(self):
+ net_id = self._create_network(external=False)['id']
+ self.admin_client.create_rbac_policy(
+ object_type='network', object_id=net_id,
+ action='access_as_external',
+ target_tenant=self.admin_client.tenant_id)
+ body = self.admin_client.show_network(net_id)['network']
+ self.assertTrue(body['router:external'])
+ policy2 = self.admin_client.create_rbac_policy(
+ object_type='network', object_id=net_id,
+ action='access_as_external',
+ target_tenant=self.client2.tenant_id)
+ self.admin_client.delete_rbac_policy(policy2['rbac_policy']['id'])
+ body = self.admin_client.show_network(net_id)['network']
+ self.assertTrue(body['router:external'])
+
+ @decorators.idempotent_id('046aff1a-3962-4e2b-9a3b-93a24f255fd0')
+ def test_external_network_on_shared_policy_delete(self):
+ net_id = self._create_network(external=True)['id']
+ policy = self.admin_client.create_rbac_policy(
+ object_type='network', object_id=net_id,
+ action='access_as_shared',
+ target_tenant='*')
+ self.admin_client.delete_rbac_policy(policy['rbac_policy']['id'])
+ body = self.admin_client.show_network(net_id)['network']
+ self.assertTrue(body['router:external'])
+
@decorators.idempotent_id('01364c50-bfb6-46c4-b44c-edc4564d61cf')
def test_policy_allows_tenant_to_allocate_floatingip(self):
net = self._create_network(external=False)
diff --git a/neutron_tempest_plugin/api/admin/test_floating_ips_admin_actions.py b/neutron_tempest_plugin/api/admin/test_floating_ips_admin_actions.py
index 7601e7a..3607060 100644
--- a/neutron_tempest_plugin/api/admin/test_floating_ips_admin_actions.py
+++ b/neutron_tempest_plugin/api/admin/test_floating_ips_admin_actions.py
@@ -47,6 +47,7 @@
body = self.client.create_floatingip(
floating_network_id=self.ext_net_id)
floating_ip = body['floatingip']
+ self.addCleanup(self.client.delete_floatingip, floating_ip['id'])
project_id = self.create_project()['id']
port = self.admin_client.create_port(network_id=self.network['id'],
diff --git a/neutron_tempest_plugin/api/admin/test_routers_ha.py b/neutron_tempest_plugin/api/admin/test_routers_ha.py
index fafe209..b8227bd 100644
--- a/neutron_tempest_plugin/api/admin/test_routers_ha.py
+++ b/neutron_tempest_plugin/api/admin/test_routers_ha.py
@@ -10,6 +10,7 @@
# License for the specific language governing permissions and limitations
# under the License.
+from tempest.common import utils as tutils
from tempest.lib.common.utils import data_utils
from tempest.lib import decorators
@@ -19,6 +20,7 @@
class RoutersTestHA(base.BaseRouterTest):
required_extensions = ['router', 'l3-ha']
+ HA_NETWORK_NAME_TEMPL = "HA network tenant %s"
@classmethod
def resource_setup(cls):
@@ -31,8 +33,8 @@
super(RoutersTestHA, cls).resource_setup()
name = data_utils.rand_name('pretest-check')
router = cls.admin_client.create_router(name)
+ cls.admin_client.delete_router(router['router']['id'])
if 'ha' not in router['router']:
- cls.admin_client.delete_router(router['router']['id'])
msg = "'ha' attribute not found. HA Possibly not enabled"
raise cls.skipException(msg)
@@ -46,10 +48,8 @@
The router is created and the "ha" attribute is set to True
"""
name = data_utils.rand_name('router')
- router = self.admin_client.create_router(name, ha=True)
- self.addCleanup(self.admin_client.delete_router,
- router['router']['id'])
- self.assertTrue(router['router']['ha'])
+ router = self._create_admin_router(name, ha=True)
+ self.assertTrue(router['ha'])
@decorators.idempotent_id('97b5f7ef-2192-4fa3-901e-979cd5c1097a')
def test_legacy_router_creation(self):
@@ -63,10 +63,8 @@
as opposed to a "High Availability Router"
"""
name = data_utils.rand_name('router')
- router = self.admin_client.create_router(name, ha=False)
- self.addCleanup(self.admin_client.delete_router,
- router['router']['id'])
- self.assertFalse(router['router']['ha'])
+ router = self.create_admin_router(name, ha=False)
+ self.assertFalse(router['ha'])
@decorators.idempotent_id('5a6bfe82-5b23-45a4-b027-5160997d4753')
def test_legacy_router_update_to_ha(self):
@@ -82,11 +80,36 @@
"""
name = data_utils.rand_name('router')
# router needs to be in admin state down in order to be upgraded to HA
- router = self.admin_client.create_router(name, ha=False,
- admin_state_up=False)
- self.addCleanup(self.admin_client.delete_router,
- router['router']['id'])
- self.assertFalse(router['router']['ha'])
- router = self.admin_client.update_router(router['router']['id'],
+ router = self._create_admin_router(name, ha=False,
+ admin_state_up=False)
+ self.assertFalse(router['ha'])
+ router = self.admin_client.update_router(router['id'],
ha=True)
self.assertTrue(router['router']['ha'])
+
+ @decorators.idempotent_id('0d8c0c8f-3809-4acc-a2c8-e0941333ff6c')
+ @tutils.requires_ext(extension="provider", service="network")
+ def test_delete_ha_router_keeps_ha_network_segment_data(self):
+ """Test deleting an HA router keeps correct segment data for network.
+
+ Each tenant with HA router has an HA network. The HA network is a
+ normal tenant network with segmentation data like type (vxlan) and
+ segmenation id. This test makes sure that after an HA router is
+ deleted, those segmentation data are kept in HA network. This tests
+ regression of https://bugs.launchpad.net/neutron/+bug/1732543.
+ """
+ for i in range(2):
+ router = self._create_admin_router(
+ data_utils.rand_name('router%d' % i),
+ ha=True)
+ ha_net_name = self.HA_NETWORK_NAME_TEMPL % router['tenant_id']
+ ha_network_pre_delete = self.admin_client.list_networks(
+ name=ha_net_name)['networks'][0]
+ segmentation_id = ha_network_pre_delete['provider:segmentation_id']
+ self._delete_router(router['id'], self.admin_client)
+
+ ha_network_post_delete = self.admin_client.show_network(
+ ha_network_pre_delete['id'])['network']
+ self.assertEqual(
+ ha_network_post_delete['provider:segmentation_id'],
+ segmentation_id)
diff --git a/neutron_tempest_plugin/api/base.py b/neutron_tempest_plugin/api/base.py
index 8cd44ee..68b5680 100644
--- a/neutron_tempest_plugin/api/base.py
+++ b/neutron_tempest_plugin/api/base.py
@@ -415,17 +415,18 @@
return qos_rule
@classmethod
- def delete_router(cls, router):
- body = cls.client.list_router_interfaces(router['id'])
+ def delete_router(cls, router, client=None):
+ client = client or cls.client
+ body = client.list_router_interfaces(router['id'])
interfaces = [port for port in body['ports']
if port['device_owner'] in const.ROUTER_INTERFACE_OWNERS]
for i in interfaces:
try:
- cls.client.remove_router_interface_with_subnet_id(
+ client.remove_router_interface_with_subnet_id(
router['id'], i['fixed_ips'][0]['subnet_id'])
except lib_exc.NotFound:
pass
- cls.client.delete_router(router['id'])
+ client.delete_router(router['id'])
@classmethod
def create_address_scope(cls, name, is_admin=False, **kwargs):
diff --git a/neutron_tempest_plugin/api/base_routers.py b/neutron_tempest_plugin/api/base_routers.py
index c8d3783..52db742 100644
--- a/neutron_tempest_plugin/api/base_routers.py
+++ b/neutron_tempest_plugin/api/base_routers.py
@@ -13,6 +13,8 @@
# License for the specific language governing permissions and limitations
# under the License.
+from tempest.lib import exceptions
+
from neutron_tempest_plugin.api import base
@@ -21,9 +23,12 @@
# as some router operations, such as enabling or disabling SNAT
# require admin credentials by default
- def _cleanup_router(self, router):
- self.delete_router(router)
- self.routers.remove(router)
+ def _cleanup_router(self, router, client=None):
+ try:
+ self.delete_router(router, client)
+ self.routers.remove(router)
+ except exceptions.NotFound:
+ pass
def _create_router(self, name, admin_state_up=False,
external_network_id=None, enable_snat=None):
@@ -33,6 +38,12 @@
self.addCleanup(self._cleanup_router, router)
return router
+ def _create_admin_router(self, *args, **kwargs):
+ router = self.create_admin_router(*args, **kwargs)
+ self.addCleanup(
+ self._cleanup_router, router, self.os_admin.network_client)
+ return router
+
def _delete_router(self, router_id, network_client=None):
client = network_client or self.client
client.delete_router(router_id)
diff --git a/neutron_tempest_plugin/common/utils.py b/neutron_tempest_plugin/common/utils.py
index ecccd18..d6d0aee 100644
--- a/neutron_tempest_plugin/common/utils.py
+++ b/neutron_tempest_plugin/common/utils.py
@@ -19,6 +19,7 @@
"""Utilities and helper functions."""
import eventlet
+import functools
import threading
import time
@@ -70,3 +71,19 @@
#pylint: disable=raising-bad-type
raise exception
raise WaitTimeout("Timed out after %d seconds" % timeout)
+
+
+# TODO(haleyb): move to neutron-lib
+# code copied from neutron repository - neutron/tests/base.py
+def unstable_test(reason):
+ def decor(f):
+ @functools.wraps(f)
+ def inner(self, *args, **kwargs):
+ try:
+ return f(self, *args, **kwargs)
+ except Exception as e:
+ msg = ("%s was marked as unstable because of %s, "
+ "failure was: %s") % (self.id(), reason, e)
+ raise self.skipTest(msg)
+ return inner
+ return decor
diff --git a/neutron_tempest_plugin/scenario/base.py b/neutron_tempest_plugin/scenario/base.py
index 9fe6a94..2bb6344 100644
--- a/neutron_tempest_plugin/scenario/base.py
+++ b/neutron_tempest_plugin/scenario/base.py
@@ -76,27 +76,24 @@
zone, and Y is the compute host name.
"""
- name = kwargs.get('name', data_utils.rand_name('server-test'))
- security_groups = kwargs.get(
- 'security_groups', [{'name': 'default'}])
- availability_zone = kwargs.get('availability_zone')
+ kwargs.setdefault('name', data_utils.rand_name('server-test'))
- server_args = {
- 'name': name,
- 'flavorRef': flavor_ref,
- 'imageRef': image_ref,
- 'key_name': key_name,
- 'networks': networks,
- 'security_groups': security_groups
- }
+ # We cannot use setdefault() here because caller could have passed
+ # security_groups=None and we don't want to pass None to
+ # client.create_server()
+ if not kwargs.get('security_groups'):
+ kwargs['security_groups'] = [{'name': 'default'}]
- if availability_zone:
- server_args['availability_zone'] = availability_zone
+ client = self.os_primary.servers_client
+ if kwargs.get('availability_zone'):
client = self.os_admin.servers_client
- else:
- client = self.os_primary.servers_client
- server = client.create_server(**server_args)
+ server = client.create_server(
+ flavorRef=flavor_ref,
+ imageRef=image_ref,
+ key_name=key_name,
+ networks=networks,
+ **kwargs)
self.addCleanup(test_utils.call_and_ignore_notfound_exc,
waiters.wait_for_server_termination,
@@ -119,8 +116,8 @@
return body['keypair']
@classmethod
- def create_secgroup_rules(cls, rule_list, client=None,
- secgroup_id=None):
+ def create_secgroup_rules(cls, rule_list, secgroup_id=None,
+ client=None):
client = client or cls.os_primary.network_client
if not secgroup_id:
sgs = client.list_security_groups()['security_groups']
@@ -153,7 +150,7 @@
'port_range_max': 22,
'remote_ip_prefix': '0.0.0.0/0'}]
client = client or cls.os_primary.network_client
- cls.create_secgroup_rules(rule_list, client,
+ cls.create_secgroup_rules(rule_list, client=client,
secgroup_id=secgroup_id)
@classmethod
@@ -168,7 +165,7 @@
'port_range_max': 0, # code
'remote_ip_prefix': '0.0.0.0/0'}]
client = client or cls.os_primary.network_client
- cls.create_secgroup_rules(rule_list, client,
+ cls.create_secgroup_rules(rule_list, client=client,
secgroup_id=secgroup_id)
@classmethod
diff --git a/neutron_tempest_plugin/scenario/test_floatingip.py b/neutron_tempest_plugin/scenario/test_floatingip.py
index 5fcbdc0..0febce2 100644
--- a/neutron_tempest_plugin/scenario/test_floatingip.py
+++ b/neutron_tempest_plugin/scenario/test_floatingip.py
@@ -22,6 +22,7 @@
from testscenarios.scenarios import multiply_scenarios
from neutron_tempest_plugin.common import ssh
+from neutron_tempest_plugin.common import utils as common_utils
from neutron_tempest_plugin import config
from neutron_tempest_plugin.scenario import base
from neutron_tempest_plugin.scenario import constants
@@ -134,6 +135,7 @@
same_network = True
+ @common_utils.unstable_test("bug 1717302")
@decorators.idempotent_id('05c4e3b3-7319-4052-90ad-e8916436c23b')
def test_east_west(self):
self._test_east_west()
@@ -151,6 +153,7 @@
same_network = False
+ @common_utils.unstable_test("bug 1717302")
@decorators.idempotent_id('f18f0090-3289-4783-b956-a0f8ac511e8b')
def test_east_west(self):
self._test_east_west()
diff --git a/neutron_tempest_plugin/scenario/test_security_groups.py b/neutron_tempest_plugin/scenario/test_security_groups.py
index faaeb84..1244535 100644
--- a/neutron_tempest_plugin/scenario/test_security_groups.py
+++ b/neutron_tempest_plugin/scenario/test_security_groups.py
@@ -62,6 +62,34 @@
pkey=self.keypair['private_key']))
return server_ssh_clients, fips, servers
+ def _test_ip_prefix(self, rule_list, should_succeed):
+ # Add specific remote prefix to VMs and check connectivity
+ ssh_secgrp_name = data_utils.rand_name('ssh_secgrp')
+ icmp_secgrp_name = data_utils.rand_name('icmp_secgrp_with_cidr')
+ ssh_secgrp = self.os_primary.network_client.create_security_group(
+ name=ssh_secgrp_name)
+ self.create_loginable_secgroup_rule(
+ secgroup_id=ssh_secgrp['security_group']['id'])
+ icmp_secgrp = self.os_primary.network_client.create_security_group(
+ name=icmp_secgrp_name)
+ self.create_secgroup_rules(
+ rule_list, secgroup_id=icmp_secgrp['security_group']['id'])
+ for sec_grp in (ssh_secgrp, icmp_secgrp):
+ self.security_groups.append(sec_grp['security_group'])
+ security_groups_list = [{'name': ssh_secgrp_name},
+ {'name': icmp_secgrp_name}]
+ server_ssh_clients, fips, servers = self.create_vm_testing_sec_grp(
+ security_groups=security_groups_list)
+
+ # make sure ssh connectivity works
+ self.check_connectivity(fips[0]['floating_ip_address'],
+ CONF.validation.image_ssh_user,
+ self.keypair['private_key'])
+
+ # make sure ICMP connectivity works
+ self.check_remote_connectivity(server_ssh_clients[0], fips[1][
+ 'fixed_ip_address'], should_succeed=should_succeed)
+
@decorators.idempotent_id('3d73ec1a-2ec6-45a9-b0f8-04a283d9d764')
def test_default_sec_grp_scenarios(self):
server_ssh_clients, fips, _ = self.create_vm_testing_sec_grp()
@@ -167,34 +195,18 @@
@decorators.idempotent_id('3d73ec1a-2ec6-45a9-b0f8-04a283d9d664')
def test_ip_prefix(self):
- # Add specific remote prefix to VMs and check connectivity
- ssh_secgrp_name = data_utils.rand_name('ssh_secgrp')
- icmp_secgrp_name = data_utils.rand_name('icmp_secgrp_with_cidr')
cidr = self.subnet['cidr']
- ssh_secgrp = self.os_primary.network_client.create_security_group(
- name=ssh_secgrp_name)
- self.create_loginable_secgroup_rule(
- secgroup_id=ssh_secgrp['security_group']['id'])
-
rule_list = [{'protocol': constants.PROTO_NUM_ICMP,
'direction': constants.INGRESS_DIRECTION,
'remote_ip_prefix': cidr}]
- icmp_secgrp = self.os_primary.network_client.create_security_group(
- name=icmp_secgrp_name)
- self.create_secgroup_rules(
- rule_list, secgroup_id=icmp_secgrp['security_group']['id'])
- for sec_grp in (ssh_secgrp, icmp_secgrp):
- self.security_groups.append(sec_grp['security_group'])
- security_groups_list = [{'name': ssh_secgrp_name},
- {'name': icmp_secgrp_name}]
- server_ssh_clients, fips, servers = self.create_vm_testing_sec_grp(
- security_groups=security_groups_list)
+ self._test_ip_prefix(rule_list, should_succeed=True)
- # make sure ssh connectivity works
- self.check_connectivity(fips[0]['floating_ip_address'],
- CONF.validation.image_ssh_user,
- self.keypair['private_key'])
-
- # make sure ICMP connectivity works
- self.check_remote_connectivity(server_ssh_clients[0], fips[1][
- 'fixed_ip_address'])
+ @decorators.attr(type='negative')
+ @decorators.idempotent_id('a01cd2ef-3cfc-4614-8aac-9d1333ea21dd')
+ def test_ip_prefix_negative(self):
+ # define bad CIDR
+ cidr = '10.100.0.254/32'
+ rule_list = [{'protocol': constants.PROTO_NUM_ICMP,
+ 'direction': constants.INGRESS_DIRECTION,
+ 'remote_ip_prefix': cidr}]
+ self._test_ip_prefix(rule_list, should_succeed=False)
diff --git a/playbooks/neutron-tempest-plugin-api/run.yaml b/playbooks/neutron-tempest-plugin-api/run.yaml
index 3470bd4..12638cc 100644
--- a/playbooks/neutron-tempest-plugin-api/run.yaml
+++ b/playbooks/neutron-tempest-plugin-api/run.yaml
@@ -27,23 +27,13 @@
cmd: |
set -e
set -x
- cat << 'EOF' >>"/tmp/dg-local.conf"
- [[local|localrc]]
- TEMPEST_PLUGINS='/opt/stack/new/neutron-tempest-plugin'
- EOF
- executable: /bin/bash
- chdir: '{{ ansible_user_dir }}/workspace'
- environment: '{{ zuul | zuul_legacy_vars }}'
-
- - shell:
- cmd: |
- set -e
- set -x
export PYTHONUNBUFFERED=true
export DEVSTACK_GATE_TEMPEST=1
+ export DEVSTACK_GATE_TEMPEST_ALL_PLUGINS=1
export DEVSTACK_GATE_NEUTRON=1
export DEVSTACK_GATE_EXERCISES=0
export DEVSTACK_GATE_TEMPEST_REGEX="neutron_tempest_plugin.api"
+ export DEVSTACK_LOCAL_CONFIG="enable_plugin neutron-tempest-plugin git://git.openstack.org/openstack/neutron-tempest-plugin"
export BRANCH_OVERRIDE=default
if [ "$BRANCH_OVERRIDE" != "default" ] ; then
export OVERRIDE_ZUUL_BRANCH=$BRANCH_OVERRIDE
diff --git a/playbooks/neutron-tempest-plugin-dvr-multinode-scenario/run.yaml b/playbooks/neutron-tempest-plugin-dvr-multinode-scenario/run.yaml
index d68747c..2102bb5 100644
--- a/playbooks/neutron-tempest-plugin-dvr-multinode-scenario/run.yaml
+++ b/playbooks/neutron-tempest-plugin-dvr-multinode-scenario/run.yaml
@@ -1,4 +1,4 @@
-- hosts: all
+- hosts: primary
name: neutron-tempest-plugin-dvr-multinode-scenario
tasks:
@@ -27,23 +27,13 @@
cmd: |
set -e
set -x
- cat << 'EOF' >>"/tmp/dg-local.conf"
- [[local|localrc]]
- TEMPEST_PLUGINS='/opt/stack/new/neutron-tempest-plugin'
- EOF
- executable: /bin/bash
- chdir: '{{ ansible_user_dir }}/workspace'
- environment: '{{ zuul | zuul_legacy_vars }}'
-
- - shell:
- cmd: |
- set -e
- set -x
export PYTHONUNBUFFERED=true
export DEVSTACK_GATE_TEMPEST=1
+ export DEVSTACK_GATE_TEMPEST_ALL_PLUGINS=1
export DEVSTACK_GATE_NEUTRON=1
export DEVSTACK_GATE_CONFIGDRIVE=0
export DEVSTACK_GATE_TEMPEST_REGEX="(neutron_tempest_plugin.scenario)"
+ export DEVSTACK_LOCAL_CONFIG="enable_plugin neutron-tempest-plugin git://git.openstack.org/openstack/neutron-tempest-plugin"
export TEMPEST_CONCURRENCY=2
# Test DVR works multinode
export DEVSTACK_GATE_NEUTRON_DVR=1
diff --git a/playbooks/neutron-tempest-plugin-scenario-linuxbridge/run.yaml b/playbooks/neutron-tempest-plugin-scenario-linuxbridge/run.yaml
index f2be130..65e8b12 100644
--- a/playbooks/neutron-tempest-plugin-scenario-linuxbridge/run.yaml
+++ b/playbooks/neutron-tempest-plugin-scenario-linuxbridge/run.yaml
@@ -31,7 +31,6 @@
[[local|localrc]]
Q_AGENT=linuxbridge
PHYSICAL_NETWORK=default
- TEMPEST_PLUGINS='/opt/stack/new/neutron-tempest-plugin'
EOF
executable: /bin/bash
@@ -44,9 +43,11 @@
set -x
export PYTHONUNBUFFERED=true
export DEVSTACK_GATE_TEMPEST=1
+ export DEVSTACK_GATE_TEMPEST_ALL_PLUGINS=1
export DEVSTACK_GATE_NEUTRON=1
export DEVSTACK_GATE_EXERCISES=0
export DEVSTACK_GATE_TEMPEST_REGEX="(neutron_tempest_plugin.scenario)"
+ export DEVSTACK_LOCAL_CONFIG="enable_plugin neutron-tempest-plugin git://git.openstack.org/openstack/neutron-tempest-plugin"
export BRANCH_OVERRIDE=default
if [ "$BRANCH_OVERRIDE" != "default" ] ; then
export OVERRIDE_ZUUL_BRANCH=$BRANCH_OVERRIDE