Merge "Fix missing "raise" before cls.skipException"
diff --git a/README.rst b/README.rst
index f19bda9..ef0ff00 100644
--- a/README.rst
+++ b/README.rst
@@ -1,10 +1,3 @@
-========================
-Team and repository tags
-========================
-
-.. image:: https://governance.openstack.org/tc/badges/patrole.svg
-    :target: https://governance.openstack.org/tc/reference/tags/index.html
-
 Patrole - RBAC Integration Tempest Plugin
 =========================================
 
@@ -24,10 +17,16 @@
 
 * Free software: Apache license
 * Documentation: https://docs.openstack.org/patrole/latest
-* Source: https://git.openstack.org/cgit/openstack/patrole
+* Source: https://opendev.org/openstack/patrole
 * Bugs: https://storyboard.openstack.org/#!/project/openstack/patrole
 * Release notes: https://docs.openstack.org/releasenotes/patrole/
 
+Team and repository tags
+------------------------
+
+.. image:: https://governance.openstack.org/tc/badges/patrole.svg
+    :target: https://governance.openstack.org/tc/reference/tags/index.html
+
 .. _design-principles:
 
 Design Principles
@@ -75,8 +74,8 @@
 .. _Tempest plugin: https://docs.openstack.org/tempest/latest/plugin.html
 .. _Tempest design principles: https://docs.openstack.org/tempest/latest/overview.html#design-principles
 .. _policy in code: https://specs.openstack.org/openstack/oslo-specs/specs/newton/policy-in-code.html
-.. _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
+.. _Nova repository: https://opendev.org/openstack/nova/src/branch/master/nova/policies
+.. _Keystone repository: https://opendev.org/openstack/keystone/src/branch/master/keystone/common/policies
 
 Features
 --------
@@ -123,7 +122,7 @@
 #. You first need to install Patrole. This is done with pip after you check out
    the Patrole repo::
 
-    $ git clone https://git.openstack.org/openstack/patrole
+    $ git clone https://opendev.org/openstack/patrole
     $ pip install patrole/
 
    This can be done within a venv.
@@ -174,7 +173,7 @@
    the Patrole repository. To configure Patrole's logging, see the
    `Patrole Configuration Guide <https://docs.openstack.org/patrole/latest/configuration.html#patrole-configuration>`_.
 
-.. _Tempest: https://git.openstack.org/cgit/openstack/tempest
+.. _Tempest: https://opendev.org/openstack/tempest/
 .. _Tempest_quickstart: https://docs.openstack.org/tempest/latest/overview.html#quickstart
 .. _tempest_run: https://docs.openstack.org/tempest/latest/run.html
 .. _testr: https://testrepository.readthedocs.org/en/latest/MANUAL.html
diff --git a/doc/requirements.txt b/doc/requirements.txt
index b03ff2c..3a1bb3d 100644
--- a/doc/requirements.txt
+++ b/doc/requirements.txt
@@ -6,3 +6,4 @@
 openstackdocstheme>=1.20.0 # Apache-2.0
 reno>=2.5.0 # Apache-2.0
 sphinxcontrib-apidoc>=0.2.0  # BSD
+sphinxcontrib-svg2pdfconverter>=0.1.0 # BSD
diff --git a/doc/source/conf.py b/doc/source/conf.py
index 1d82bc0..4fa65e6 100755
--- a/doc/source/conf.py
+++ b/doc/source/conf.py
@@ -30,6 +30,7 @@
     'sphinx.ext.autodoc',
     'sphinx.ext.todo',
     'sphinx.ext.viewcode',
+    'sphinxcontrib.rsvgconverter',
     'openstackdocstheme',
     'oslo_config.sphinxconfiggen',
     'sphinxcontrib.apidoc',
@@ -94,15 +95,18 @@
 # Output file base name for HTML help builder.
 htmlhelp_basename = 'patroledoc'
 
+# Example configuration for intersphinx: refer to the Python standard library.
+#intersphinx_mapping = {'http://docs.python.org/': None}
+
+# -- Options for LaTeX output -------------------------------------------------
+
 # Grouping the document tree into LaTeX files. List of tuples
 # (source start file, target name, title, author, documentclass
 # [howto/manual]).
 latex_documents = [
-    ('index',
-     'patrole.tex',
-     u'patrole Documentation',
-     u'Patrole Developers', 'manual'),
+    ('index', 'doc-patrole.tex', u'Patrole: Tempest Plugin for RBAC Testing',
+     u'OpenStack Foundation', 'manual'),
 ]
 
-# Example configuration for intersphinx: refer to the Python standard library.
-#intersphinx_mapping = {'http://docs.python.org/': None}
+# Disable usage of xindy https://bugzilla.redhat.com/show_bug.cgi?id=1643664
+latex_use_xindy = False
\ No newline at end of file
diff --git a/doc/source/index.rst b/doc/source/index.rst
index 816908a..c7251ee 100644
--- a/doc/source/index.rst
+++ b/doc/source/index.rst
@@ -71,7 +71,12 @@
    framework/rbac_utils
    framework/code/modules
 
-Indices and tables
-==================
+Search
+======
 
-* :ref:`search`
+.. only:: html
+
+  * :ref:`Patrole document search <search>`: Search the contents of this document.
+
+* `OpenStack wide search <https://docs.openstack.org>`_: Search the wider
+  set of OpenStack documentation, including forums.
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 c5fbef6..74f8110 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
@@ -59,6 +59,12 @@
         cls.server = cls.create_test_server(wait_until='ACTIVE')
         cls.volume = cls.create_volume()
 
+    def _detach_volume_and_wait_until_available(self, server, volume):
+        self.servers_client.detach_volume(server['id'],
+                                          volume['id'])
+        waiters.wait_for_volume_resource_status(self.volumes_client,
+                                                volume['id'], 'available')
+
     def _recreate_volume(self):
         try:
             # In case detachment failed, update the DB status of the volume
@@ -190,7 +196,8 @@
             # Swap volume from "volume1" to "volume2"
             self.servers_client.update_attached_volume(
                 self.server['id'], volume1['id'], volumeId=volume2['id'])
-        self.addCleanup(self._detach_volume, self.server, volume2)
+        self.addCleanup(self._detach_volume_and_wait_until_available,
+                        self.server, volume2)
         waiters.wait_for_volume_resource_status(self.volumes_client,
                                                 volume1['id'], 'available')
         waiters.wait_for_volume_resource_status(self.volumes_client,
diff --git a/releasenotes/notes/patrole-train-release-7d493ff5039f1715.yaml b/releasenotes/notes/patrole-train-release-7d493ff5039f1715.yaml
new file mode 100644
index 0000000..ad3acd8
--- /dev/null
+++ b/releasenotes/notes/patrole-train-release-7d493ff5039f1715.yaml
@@ -0,0 +1,17 @@
+---
+prelude: |
+    This release is to tag the Patrole for OpenStack Train release.
+    This release marks the start of Train release support in Patrole.
+    After this release, Patrole will support below OpenStack Releases:
+
+    * Train
+    * Stein
+    * Rocky
+    * Queens
+
+    Current development of Patrole is for OpenStack Ussuri development
+    cycle. Every Patrole commit is also tested against master during
+    the Ussuri cycle. However, this does not necessarily mean that using
+    Patrole as of this tag will work against a Ussuri (or future release)
+    cloud.
+    To be on safe side, use this tag to test the OpenStack Train release.
diff --git a/releasenotes/source/index.rst b/releasenotes/source/index.rst
index a51c1e4..543561f 100644
--- a/releasenotes/source/index.rst
+++ b/releasenotes/source/index.rst
@@ -6,6 +6,7 @@
    :maxdepth: 1
 
    unreleased
+   v0.7.0
    v0.6.0
    v0.5.0
    v0.4.0
diff --git a/releasenotes/source/v0.7.0.rst b/releasenotes/source/v0.7.0.rst
new file mode 100644
index 0000000..a63fa04
--- /dev/null
+++ b/releasenotes/source/v0.7.0.rst
@@ -0,0 +1,6 @@
+=====================
+v0.7.0 Release Notes
+=====================
+
+.. release-notes:: 0.7.0 Release Notes
+   :version: 0.7.0
diff --git a/tox.ini b/tox.ini
index 9e2772c..b7e02e6 100644
--- a/tox.ini
+++ b/tox.ini
@@ -64,6 +64,15 @@
   sphinx-build -W -b html doc/source doc/build/html
 whitelist_externals = rm
 
+[testenv:pdf-docs]
+basepython = python3
+deps = {[testenv:docs]deps}
+whitelist_externals =
+   make
+commands =
+   sphinx-build -W -b latex doc/source doc/build/pdf
+   make -C doc/build/pdf
+
 [testenv:releasenotes]
 basepython = python3
 deps =