Merge "Revert "Update master for stable/stein""
diff --git a/.gitreview b/.gitreview
index 2fa0844..b6894d8 100644
--- a/.gitreview
+++ b/.gitreview
@@ -1,4 +1,4 @@
 [gerrit]
-host=review.openstack.org
+host=review.opendev.org
 port=29418
 project=openstack/patrole.git
diff --git a/.zuul.yaml b/.zuul.yaml
index 380a20b..f9d972e 100644
--- a/.zuul.yaml
+++ b/.zuul.yaml
@@ -9,7 +9,7 @@
       - name: openstack/patrole
     timeout: 7800
     roles:
-      - zuul: openstack-dev/devstack
+      - zuul: openstack/devstack
     # Define common irrelevant files to use everywhere else
     irrelevant-files: &patrole-irrelevant-files
       - ^(test-|)requirements.txt$
@@ -21,10 +21,10 @@
       - ^releasenotes/.*
       - ^setup.cfg$
     vars:
-      devstack_localrc:
-        TEMPEST_PLUGINS: "'/opt/stack/patrole'"
+      tempest_plugins:
+        - patrole
       devstack_plugins:
-        patrole: https://git.openstack.org/openstack/patrole.git
+        patrole: https://opendev.org/openstack/patrole.git
       devstack_services:
         tempest: true
         neutron: true
@@ -47,15 +47,15 @@
     branches:
       - master
     required-projects:
-      - openstack-infra/devstack-gate
+      - openstack/devstack-gate
       - openstack/tempest
       - openstack/patrole
     irrelevant-files: *patrole-irrelevant-files
     vars:
-      devstack_localrc:
-        TEMPEST_PLUGINS: "'{{ ansible_user_dir }}/src/git.openstack.org/openstack/patrole'"
+      tempest_plugins:
+        - patrole
       devstack_plugins:
-        patrole: https://git.openstack.org/openstack/patrole.git
+        patrole: https://opendev.org/openstack/patrole.git
       devstack_services:
         tempest: true
         neutron: true
@@ -94,22 +94,36 @@
         RBAC_TEST_ROLES: reader
 
 - job:
+    name: patrole-member-stein
+    parent: patrole-member
+    override-checkout: stable/stein
+
+- job:
     name: patrole-member-rocky
     nodeset: openstack-single-node-xenial
     parent: patrole-member
     override-checkout: stable/rocky
+    vars:
+      devstack_localrc:
+        TEMPEST_PLUGINS: /opt/stack/patrole
 
 - job:
     name: patrole-member-queens
     nodeset: openstack-single-node-xenial
     parent: patrole-member
     override-checkout: stable/queens
+    vars:
+      devstack_localrc:
+        TEMPEST_PLUGINS: /opt/stack/patrole
 
 - job:
     name: patrole-member-pike
     nodeset: openstack-single-node-xenial
     parent: patrole-member
     override-checkout: stable/pike
+    vars:
+      devstack_localrc:
+        TEMPEST_PLUGINS: /opt/stack/patrole
 
 - job:
     name: patrole-multinode-admin
@@ -159,12 +173,13 @@
       - name: openstack/patrole
       - name: openstack/neutron-tempest-plugin
     vars:
-      devstack_localrc:
-        TEMPEST_PLUGINS: "'/opt/stack/patrole /opt/stack/neutron-tempest-plugin'"
+      tempest_plugins:
+        - patrole
+        - neutron-tempest-plugin
       devstack_plugins:
-        neutron: https://git.openstack.org/openstack/neutron.git
-        patrole: https://git.openstack.org/openstack/patrole.git
-        neutron-tempest-plugin: https://git.openstack.org/openstack/neutron-tempest-plugin.git
+        neutron: https://opendev.org/openstack/neutron.git
+        patrole: https://opendev.org/openstack/patrole.git
+        neutron-tempest-plugin: https://opendev.org/openstack/neutron-tempest-plugin.git
       devstack_services:
         tempest: true
         neutron: true
@@ -192,10 +207,8 @@
     templates:
       - openstack-cover-jobs
       - openstack-lower-constraints-jobs
-      - openstack-python36-jobs
-      - openstack-python37-jobs
+      - openstack-python3-train-jobs
       - openstack-python-jobs
-      - openstack-python35-jobs
       - check-requirements
       - publish-openstack-docs-pti
       - release-notes-jobs-python3
@@ -204,10 +217,10 @@
         - patrole-admin
         - patrole-member
         - patrole-reader
+        - patrole-member-stein
         - patrole-member-rocky
         - patrole-member-queens
         - patrole-member-pike
-        - patrole-py35-member
         - patrole-multinode-admin
         - patrole-multinode-member
         - patrole-extension-admin
@@ -218,6 +231,7 @@
         - patrole-member
     periodic-stable:
       jobs:
+        - patrole-member-stein
         - patrole-member-rocky
         - patrole-member-queens
         - patrole-member-pike
diff --git a/doc/requirements.txt b/doc/requirements.txt
index 67530ff..b03ff2c 100644
--- a/doc/requirements.txt
+++ b/doc/requirements.txt
@@ -1,7 +1,8 @@
 # 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.
-sphinx!=1.6.6,!=1.6.7,>=1.6.2 # BSD
-openstackdocstheme>=1.18.1 # Apache-2.0
+sphinx!=1.6.6,!=1.6.7,>=1.6.2,<2.0.0;python_version=='2.7' # BSD
+sphinx!=1.6.6,!=1.6.7,!=2.1.0,>=1.6.2;python_version>='3.4' # BSD
+openstackdocstheme>=1.20.0 # Apache-2.0
 reno>=2.5.0 # Apache-2.0
 sphinxcontrib-apidoc>=0.2.0  # BSD
diff --git a/doc/source/conf.py b/doc/source/conf.py
index 45d8021..57d763e 100755
--- a/doc/source/conf.py
+++ b/doc/source/conf.py
@@ -63,7 +63,7 @@
 master_doc = 'index'
 
 # General information about the project.
-project = u'patrole'
+
 copyright = u'2017, Patrole Developers'
 
 # If true, '()' will be appended to :func: etc. cross-reference text.
@@ -93,15 +93,15 @@
 html_last_updated_fmt = '%Y-%m-%d %H:%M'
 
 # Output file base name for HTML help builder.
-htmlhelp_basename = '%sdoc' % project
+htmlhelp_basename = 'patroledoc'
 
 # Grouping the document tree into LaTeX files. List of tuples
 # (source start file, target name, title, author, documentclass
 # [howto/manual]).
 latex_documents = [
     ('index',
-     '%s.tex' % project,
-     u'%s Documentation' % project,
+     'patrole.tex',
+     u'patrole Documentation',
      u'Patrole Developers', 'manual'),
 ]
 
diff --git a/doc/source/configuration.rst b/doc/source/configuration.rst
index 05716fe..1e7fe8f 100644
--- a/doc/source/configuration.rst
+++ b/doc/source/configuration.rst
@@ -74,7 +74,7 @@
 For more information on feature flags, reference the relevant
 `Tempest documentation`_.
 
-.. _Tempest documentation: https://docs.openstack.org/tempest/latest/HACKING.html#1-new-tests-for-new-features
+.. _Tempest documentation: https://docs.openstack.org/tempest/latest/HACKING.html#new-tests-for-new-features
 
 Sample Configuration File
 -------------------------
diff --git a/doc/source/rbac-overview.rst b/doc/source/rbac-overview.rst
index 747eab8..68e86ac 100644
--- a/doc/source/rbac-overview.rst
+++ b/doc/source/rbac-overview.rst
@@ -274,7 +274,7 @@
 .. _Nova repository: https://git.openstack.org/cgit/openstack/nova/tree/nova/policies
 .. _Keystone repository: https://git.openstack.org/cgit/openstack/keystone/tree/keystone/common/policies
 .. _governance goal: https://governance.openstack.org/tc/goals/queens/policy-in-code.html
-.. _scope types: https://docs.openstack.org/keystone/latest/admin/identity-tokens.html#authorization-scopes
+.. _scope types: https://docs.openstack.org/keystone/latest/admin/tokens-overview.html#authorization-scopes
 .. _policy.yaml: https://docs.openstack.org/ocata/config-reference/policy-yaml-file.html
 .. _oslo.policy: https://docs.openstack.org/oslo.policy/latest/
 .. _policy documentation: https://docs.openstack.org/kilo/config-reference/content/policy-json-file.html
diff --git a/patrole_tempest_plugin/tests/api/compute/test_server_actions_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_server_actions_rbac.py
index 5f27c9f..dfb36ca 100644
--- a/patrole_tempest_plugin/tests/api/compute/test_server_actions_rbac.py
+++ b/patrole_tempest_plugin/tests/api/compute/test_server_actions_rbac.py
@@ -42,6 +42,11 @@
         cls.admin_servers_client = cls.os_admin.servers_client
 
     @classmethod
+    def setup_credentials(cls):
+        cls.set_network_resources(network=True, subnet=True, router=True)
+        super(ServerActionsRbacTest, cls).setup_credentials()
+
+    @classmethod
     def resource_setup(cls):
         super(ServerActionsRbacTest, cls).resource_setup()
         cls.server_id = cls.create_test_server(wait_until='ACTIVE')['id']
@@ -358,6 +363,11 @@
     max_microversion = 'latest'
 
     @classmethod
+    def setup_credentials(cls):
+        cls.set_network_resources(network=True, subnet=True, router=True)
+        super(ServerActionsV214RbacTest, cls).setup_credentials()
+
+    @classmethod
     def resource_setup(cls):
         super(ServerActionsV214RbacTest, cls).resource_setup()
         cls.server_id = cls.create_test_server(wait_until='ACTIVE')['id']
@@ -390,6 +400,11 @@
     max_microversion = 'latest'
 
     @classmethod
+    def setup_credentials(cls):
+        cls.set_network_resources(network=True, subnet=True, router=True)
+        super(ServerActionsV216RbacTest, cls).setup_credentials()
+
+    @classmethod
     def resource_setup(cls):
         super(ServerActionsV216RbacTest, cls).resource_setup()
         cls.server_id = cls.create_test_server(wait_until='ACTIVE')['id']
diff --git a/patrole_tempest_plugin/tests/api/compute/test_server_consoles_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_server_consoles_rbac.py
index 7e2693d..076ad05 100644
--- a/patrole_tempest_plugin/tests/api/compute/test_server_consoles_rbac.py
+++ b/patrole_tempest_plugin/tests/api/compute/test_server_consoles_rbac.py
@@ -31,6 +31,11 @@
             raise cls.skipException('Console output not available.')
 
     @classmethod
+    def setup_credentials(cls):
+        cls.set_network_resources(network=True, subnet=True, router=True)
+        super(ServerConsolesRbacTest, cls).setup_credentials()
+
+    @classmethod
     def resource_setup(cls):
         super(ServerConsolesRbacTest, cls).resource_setup()
         cls.server_id = cls.create_test_server(wait_until='ACTIVE')['id']
@@ -55,6 +60,11 @@
             raise cls.skipException('Console output not available.')
 
     @classmethod
+    def setup_credentials(cls):
+        cls.set_network_resources(network=True, subnet=True, router=True)
+        super(ServerConsolesMaxV25RbacTest, cls).setup_credentials()
+
+    @classmethod
     def resource_setup(cls):
         super(ServerConsolesMaxV25RbacTest, cls).resource_setup()
         cls.server_id = cls.create_test_server(wait_until='ACTIVE')['id']
@@ -80,6 +90,11 @@
             raise cls.skipException('Console output not available.')
 
     @classmethod
+    def setup_credentials(cls):
+        cls.set_network_resources(network=True, subnet=True, router=True)
+        super(ServerConsolesV26RbacTest, cls).setup_credentials()
+
+    @classmethod
     def resource_setup(cls):
         super(ServerConsolesV26RbacTest, cls).resource_setup()
         cls.server_id = cls.create_test_server(wait_until='ACTIVE')['id']
diff --git a/patrole_tempest_plugin/tests/api/compute/test_server_metadata_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_server_metadata_rbac.py
index 07201fc..55536ad 100644
--- a/patrole_tempest_plugin/tests/api/compute/test_server_metadata_rbac.py
+++ b/patrole_tempest_plugin/tests/api/compute/test_server_metadata_rbac.py
@@ -22,6 +22,11 @@
 class ServerMetadataRbacTest(rbac_base.BaseV2ComputeRbacTest):
 
     @classmethod
+    def setup_credentials(cls):
+        cls.set_network_resources(network=True, subnet=True, router=True)
+        super(ServerMetadataRbacTest, cls).setup_credentials()
+
+    @classmethod
     def resource_setup(cls):
         super(ServerMetadataRbacTest, cls).resource_setup()
         cls.server = cls.create_test_server(metadata={}, wait_until='ACTIVE')
diff --git a/patrole_tempest_plugin/tests/api/compute/test_server_misc_policy_actions_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_server_misc_policy_actions_rbac.py
index 1e07758..d1e896b 100644
--- a/patrole_tempest_plugin/tests/api/compute/test_server_misc_policy_actions_rbac.py
+++ b/patrole_tempest_plugin/tests/api/compute/test_server_misc_policy_actions_rbac.py
@@ -51,6 +51,11 @@
     credentials = ['primary', 'admin']
 
     @classmethod
+    def setup_credentials(cls):
+        cls.set_network_resources(network=True, subnet=True, router=True)
+        super(MiscPolicyActionsRbacTest, cls).setup_credentials()
+
+    @classmethod
     def resource_setup(cls):
         super(MiscPolicyActionsRbacTest, cls).resource_setup()
         cls.server = cls.create_test_server(wait_until='ACTIVE')
diff --git a/patrole_tempest_plugin/tests/api/compute/test_server_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_server_rbac.py
index a5968ea..8592e12 100644
--- a/patrole_tempest_plugin/tests/api/compute/test_server_rbac.py
+++ b/patrole_tempest_plugin/tests/api/compute/test_server_rbac.py
@@ -33,6 +33,11 @@
 class ComputeServersRbacTest(base.BaseV2ComputeRbacTest):
 
     @classmethod
+    def setup_credentials(cls):
+        cls.set_network_resources(network=True, subnet=True, router=True)
+        super(ComputeServersRbacTest, cls).setup_credentials()
+
+    @classmethod
     def setup_clients(cls):
         super(ComputeServersRbacTest, cls).setup_clients()
         cls.networks_client = cls.os_primary.networks_client
diff --git a/patrole_tempest_plugin/tests/api/compute/test_server_tags_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_server_tags_rbac.py
index f1c08c5..8a386f6 100644
--- a/patrole_tempest_plugin/tests/api/compute/test_server_tags_rbac.py
+++ b/patrole_tempest_plugin/tests/api/compute/test_server_tags_rbac.py
@@ -34,6 +34,11 @@
             raise cls.skipException(msg)
 
     @classmethod
+    def setup_credentials(cls):
+        cls.set_network_resources(network=True, subnet=True, router=True)
+        super(ServerTagsRbacTest, cls).setup_credentials()
+
+    @classmethod
     def resource_setup(cls):
         super(ServerTagsRbacTest, cls).resource_setup()
         cls.server = cls.create_test_server(wait_until='ACTIVE')
diff --git a/patrole_tempest_plugin/tests/api/compute/test_server_volume_attachments_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_server_volume_attachments_rbac.py
index c34a437..c5fbef6 100644
--- a/patrole_tempest_plugin/tests/api/compute/test_server_volume_attachments_rbac.py
+++ b/patrole_tempest_plugin/tests/api/compute/test_server_volume_attachments_rbac.py
@@ -37,6 +37,11 @@
 class ServerVolumeAttachmentRbacTest(rbac_base.BaseV2ComputeRbacTest):
 
     @classmethod
+    def setup_credentials(cls):
+        cls.set_network_resources(network=True, subnet=True, router=True)
+        super(ServerVolumeAttachmentRbacTest, cls).setup_credentials()
+
+    @classmethod
     def setup_clients(cls):
         super(ServerVolumeAttachmentRbacTest, cls).setup_clients()
         cls.volumes_client = cls.os_primary.volumes_client_latest
diff --git a/patrole_tempest_plugin/tests/api/network/test_networks_rbac.py b/patrole_tempest_plugin/tests/api/network/test_networks_rbac.py
index 9c715b5..56ce83b 100644
--- a/patrole_tempest_plugin/tests/api/network/test_networks_rbac.py
+++ b/patrole_tempest_plugin/tests/api/network/test_networks_rbac.py
@@ -256,6 +256,7 @@
         with self.override_role():
             self._update_network(net_id=network['id'], router_external=True)
 
+    @decorators.skip_because(bug='2005489', bug_type='storyboard')
     @utils.requires_ext(extension='provider', service='network')
     @rbac_rule_validation.action(
         service="neutron",
@@ -281,6 +282,7 @@
                 "Plugin does not support updating provider attributes",
                 str(exc))
 
+    @decorators.skip_because(bug='2005489', bug_type='storyboard')
     @utils.requires_ext(extension='provider', service='network')
     @rbac_rule_validation.action(
         service="neutron",
@@ -306,6 +308,7 @@
                 "Plugin does not support updating provider attributes",
                 str(exc))
 
+    @decorators.skip_because(bug='2005489', bug_type='storyboard')
     @utils.requires_ext(extension='provider', service='network')
     @rbac_rule_validation.action(
         service="neutron",
diff --git a/patrole_tempest_plugin/tests/api/network/test_segments_rbac.py b/patrole_tempest_plugin/tests/api/network/test_segments_rbac.py
index 8b0061d..1e6d7f1 100644
--- a/patrole_tempest_plugin/tests/api/network/test_segments_rbac.py
+++ b/patrole_tempest_plugin/tests/api/network/test_segments_rbac.py
@@ -46,7 +46,7 @@
         # With 2+ concurrency, tests that ran in the same moment may fail due
         # to usage conflict. To prevent it we select segmentation to start
         # randomly.
-        segmentation_id = random.randint(1000, 5000)
+        segmentation_id = random.randint(1000, 5000)  # nosec
         while segmentation_id in segmentation_ids:
             segmentation_id += 1
 
diff --git a/patrole_tempest_plugin/tests/api/volume/test_volume_actions_rbac.py b/patrole_tempest_plugin/tests/api/volume/test_volume_actions_rbac.py
index 079d5b4..497c8ce 100644
--- a/patrole_tempest_plugin/tests/api/volume/test_volume_actions_rbac.py
+++ b/patrole_tempest_plugin/tests/api/volume/test_volume_actions_rbac.py
@@ -37,13 +37,22 @@
         cls.image_client = cls.os_primary.image_client_v2
 
     @classmethod
+    def setup_credentials(cls):
+        cls.set_network_resources(network=True, subnet=True, router=True)
+        super(VolumesActionsV3RbacTest, cls).setup_credentials()
+
+    @classmethod
     def resource_setup(cls):
         super(VolumesActionsV3RbacTest, cls).resource_setup()
         cls.volume = cls.create_volume()
 
     def _create_server(self):
+        tenant_network = self.get_tenant_network()
         server, _ = compute.create_test_server(
-            self.os_primary, wait_until='ACTIVE')
+            self.os_primary, tenant_network=tenant_network,
+            wait_until='ACTIVE')
+        self.addCleanup(waiters.wait_for_server_termination,
+                        self.servers_client, server['id'])
         self.addCleanup(test_utils.call_and_ignore_notfound_exc,
                         self.servers_client.delete_server, server['id'])
         return server
diff --git a/setup.cfg b/setup.cfg
index 12e2184..6e29ac4 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -16,8 +16,8 @@
     Programming Language :: Python :: 2
     Programming Language :: Python :: 2.7
     Programming Language :: Python :: 3
-    Programming Language :: Python :: 3.3
-    Programming Language :: Python :: 3.5
+    Programming Language :: Python :: 3.6
+    Programming Language :: Python :: 3.7
 
 [files]
 packages =
diff --git a/tox.ini b/tox.ini
index aa7bcd4..9e2772c 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,6 +1,6 @@
 [tox]
 minversion = 2.0
-envlist = pep8,py35,py36,py37,py27
+envlist = pep8,py36,py37,py27
 skipsdist = True
 
 [testenv]