summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.pre-commit-config.yaml6
-rw-r--r--.zuul.yaml4
-rw-r--r--README.rst8
-rw-r--r--bindep.txt8
-rw-r--r--doc/source/cli/nova.rst11
-rw-r--r--doc/source/contributor/contributing.rst12
-rw-r--r--doc/source/contributor/testing.rst2
-rw-r--r--doc/source/index.rst10
-rw-r--r--doc/source/user/shell.rst6
-rw-r--r--lower-constraints.txt99
-rw-r--r--novaclient/shell.py15
-rw-r--r--novaclient/tests/unit/test_shell.py26
-rw-r--r--novaclient/tests/unit/v2/test_shell.py18
-rw-r--r--novaclient/utils.py9
-rw-r--r--novaclient/v2/shell.py10
-rw-r--r--releasenotes/notes/deprecate-cli-75074850847a8452.yaml9
-rw-r--r--releasenotes/source/index.rst1
-rw-r--r--releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po267
-rw-r--r--releasenotes/source/yoga.rst6
-rw-r--r--requirements.txt7
-rw-r--r--setup.cfg4
-rw-r--r--test-requirements.txt6
-rw-r--r--tox.ini6
23 files changed, 379 insertions, 171 deletions
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 76fa799a..e782b53e 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -4,7 +4,7 @@ default_language_version:
python: python3
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v4.0.1
+ rev: v4.1.0
hooks:
- id: trailing-whitespace
- id: mixed-line-ending
@@ -16,7 +16,7 @@ repos:
- id: check-yaml
files: .*\.(yaml|yml)$
- repo: https://github.com/Lucas-C/pre-commit-hooks
- rev: v1.1.10
+ rev: v1.1.13
hooks:
- id: remove-tabs
exclude: '.*\.(svg)$'
@@ -25,7 +25,7 @@ repos:
- id: flake8
name: flake8
additional_dependencies:
- - hacking>=3.0.1,<3.1.0
+ - hacking~=4.1.0
language: python
entry: flake8
files: '^.*\.py$'
diff --git a/.zuul.yaml b/.zuul.yaml
index 12ce938d..791a19f1 100644
--- a/.zuul.yaml
+++ b/.zuul.yaml
@@ -9,7 +9,6 @@
openrc_enable_export: true
devstack_localrc:
KEYSTONE_ADMIN_ENDPOINT: true
- USE_PYTHON3: true
irrelevant-files:
- ^.*\.rst$
- ^doc/.*$
@@ -20,8 +19,7 @@
- check-requirements
- lib-forward-testing-python3
- openstack-cover-jobs
- - openstack-lower-constraints-jobs
- - openstack-python3-yoga-jobs
+ - openstack-python3-zed-jobs
- publish-openstack-docs-pti
- release-notes-jobs-python3
check:
diff --git a/README.rst b/README.rst
index fe139a7b..cdaf8653 100644
--- a/README.rst
+++ b/README.rst
@@ -16,8 +16,8 @@ Python bindings to the OpenStack Compute API
:alt: Latest Version
This is a client for the OpenStack Compute API. It provides a Python API (the
-``novaclient`` module) and a command-line script (``nova``). Each implements
-100% of the OpenStack Compute API.
+``novaclient`` module) and a deprecated command-line script (``nova``). The
+Python API implements 100% of the OpenStack Compute API.
* License: Apache License, Version 2.0
* `PyPi`_ - package installation
@@ -36,6 +36,6 @@ This is a client for the OpenStack Compute API. It provides a Python API (the
.. _Blueprints: https://blueprints.launchpad.net/python-novaclient
.. _Bugs: https://bugs.launchpad.net/python-novaclient
.. _Source: https://opendev.org/openstack/python-novaclient
-.. _How to Contribute: https://docs.openstack.org/infra/manual/developers.html
-.. _Specs: http://specs.openstack.org/openstack/nova-specs/
+.. _How to Contribute: https://docs.opendev.org/opendev/infra-manual/latest/developers.html
+.. _Specs: https://specs.openstack.org/openstack/nova-specs/
.. _Release Notes: https://docs.openstack.org/releasenotes/python-novaclient
diff --git a/bindep.txt b/bindep.txt
index db7c560c..c3ae8263 100644
--- a/bindep.txt
+++ b/bindep.txt
@@ -1,5 +1,5 @@
# This is a cross-platform list tracking distribution packages needed by tests;
-# see https://docs.openstack.org/infra/bindep/ for additional information.
+# see https://docs.opendev.org/opendev/bindep/latest/ for additional information.
build-essential [platform:dpkg]
dbus-devel [platform:rpm]
@@ -13,12 +13,8 @@ libffi-devel [platform:rpm]
libssl-dev [platform:ubuntu]
libuuid-devel [platform:rpm]
locales [platform:debian]
-python-dev [platform:dpkg]
-python-devel [platform:rpm]
+openssl
python3-all-dev [platform:ubuntu !platform:ubuntu-precise]
python3-dev [platform:dpkg]
python3-devel [platform:fedora]
-python3.4 [platform:ubuntu-trusty]
-python3.5 [platform:ubuntu-xenial]
-python34-devel [platform:centos]
uuid-dev [platform:dpkg]
diff --git a/doc/source/cli/nova.rst b/doc/source/cli/nova.rst
index 54ec9991..03145381 100644
--- a/doc/source/cli/nova.rst
+++ b/doc/source/cli/nova.rst
@@ -11,12 +11,11 @@ For help on a specific :command:`nova` command, enter:
$ nova help COMMAND
-.. note:: Over time, command line functionality will be phased out
- of the ``nova`` CLI and into the ``openstack`` CLI. Using
- the ``openstack`` client where possible is preferred but
- there is not full parity yet for all of the ``nova`` commands.
- For information on using the ``openstack`` CLI, see
- :python-openstackclient-doc:`OpenStackClient <>`.
+.. deprecated:: 17.8.0
+
+ The ``nova`` CLI has been deprecated in favour of the unified
+ ``openstack`` CLI. For information on using the ``openstack`` CLI, see
+ :python-openstackclient-doc:`OpenStackClient <>`.
.. _nova_command_usage:
diff --git a/doc/source/contributor/contributing.rst b/doc/source/contributor/contributing.rst
index 38eac4ec..10365558 100644
--- a/doc/source/contributor/contributing.rst
+++ b/doc/source/contributor/contributing.rst
@@ -11,6 +11,12 @@ communicate as a community, etc.
Below will cover the more project specific information you need to get started
with python-novaclient.
+.. important::
+
+ The ``nova`` CLI has been deprecated in favour of the unified ``openstack``
+ CLI. Changes to the Python bindings are still welcome, however, no further
+ changes should be made to the shell.
+
Communication
~~~~~~~~~~~~~
@@ -19,8 +25,8 @@ Please refer `how-to-get-involved <https://docs.openstack.org/nova/latest/contri
Contacting the Core Team
~~~~~~~~~~~~~~~~~~~~~~~~
-The overall structure of the Nova team including python-novaclient is
-documented on `the wiki <https://wiki.openstack.org/wiki/Nova#People>`_.
+The easiest way to reach the core team is via IRC, using the ``openstack-nova``
+OFTC IRC channel.
New Feature Planning
~~~~~~~~~~~~~~~~~~~~
@@ -48,5 +54,5 @@ Getting Your Patch Merged
~~~~~~~~~~~~~~~~~~~~~~~~~
All changes proposed to the python-novaclient requires two ``Code-Review +2``
-votes from python-novaclient core reviewers before one of the core reviewers
+votes from ``python-novaclient`` core reviewers before one of the core reviewers
can approve patch by giving ``Workflow +1`` vote..
diff --git a/doc/source/contributor/testing.rst b/doc/source/contributor/testing.rst
index 4a1e1938..ed0fa506 100644
--- a/doc/source/contributor/testing.rst
+++ b/doc/source/contributor/testing.rst
@@ -25,4 +25,4 @@ DevStack installation with a demo and an admin user/tenant - or clouds named
Refer to `Consistent Testing Interface`__ for more details.
-__ https://opendev.org/openstack/governance/src/branch/master/reference/project-testing-interface.rst
+__ https://governance.openstack.org/tc/reference/project-testing-interface.html
diff --git a/doc/source/index.rst b/doc/source/index.rst
index 5c088795..60791b8e 100644
--- a/doc/source/index.rst
+++ b/doc/source/index.rst
@@ -3,12 +3,12 @@
===========================================
This is a client for OpenStack Nova API. There's a :doc:`Python API
-<reference/index>` (the :mod:`novaclient` module), and a :doc:`command-line
-script </user/shell>` (installed as :program:`nova`). Each implements the
-entire OpenStack Nova API.
+<reference/index>` (the :mod:`novaclient` module), and a deprecated
+:doc:`command-line script </user/shell>` (installed as :program:`nova`).
+Each implements the entire OpenStack Nova API.
-You'll need credentials for an OpenStack cloud that implements the Compute API,
-such as TryStack, HP, or Rackspace, in order to use the nova client.
+You'll need credentials for an OpenStack cloud that implements the Compute API
+in order to use the nova client.
.. seealso::
diff --git a/doc/source/user/shell.rst b/doc/source/user/shell.rst
index 465b0fb4..de96637a 100644
--- a/doc/source/user/shell.rst
+++ b/doc/source/user/shell.rst
@@ -15,6 +15,12 @@ information. You can do this with the `--os-username`, `--os-password`,
options, but it's easier to just set them as environment variables by setting
some environment variables:
+.. deprecated:: 17.8.0
+
+ The ``nova`` CLI has been deprecated in favour of the unified
+ ``openstack`` CLI. For information on using the ``openstack`` CLI, see
+ :python-openstackclient-doc:`OpenStackClient <>`.
+
.. envvar:: OS_USERNAME
Your OpenStack Keystone user name.
diff --git a/lower-constraints.txt b/lower-constraints.txt
deleted file mode 100644
index dd3199a2..00000000
--- a/lower-constraints.txt
+++ /dev/null
@@ -1,99 +0,0 @@
-amqp==2.1.1
-appdirs==1.3.0
-asn1crypto==0.23.0
-cachetools==2.0.0
-cffi==1.14.0
-cliff==2.8.0
-cmd2==0.8.0
-contextlib2==0.4.0
-coverage==4.0
-cryptography==2.1
-ddt==1.0.1
-debtcollector==1.2.0
-decorator==4.1.0
-deprecation==1.0
-dogpile.cache==0.6.2
-eventlet==0.18.2
-extras==1.0.0
-fasteners==0.7.0
-fixtures==3.0.0
-future==0.16.0
-futurist==1.2.0
-gitdb==0.6.4
-GitPython==1.0.1
-greenlet==0.4.15
-idna==2.6
-iso8601==0.1.11
-Jinja2==2.10
-jmespath==0.9.0
-jsonpatch==1.16
-jsonpointer==1.13
-jsonschema==2.6.0
-keystoneauth1==3.5.0
-kombu==4.0.0
-linecache2==1.0.0
-MarkupSafe==1.1.1
-monotonic==0.6
-msgpack-python==0.4.0
-munch==2.1.0
-netaddr==0.7.18
-netifaces==0.10.4
-openstacksdk==0.11.2
-os-client-config==1.28.0
-os-service-types==1.2.0
-osc-lib==1.8.0
-oslo.concurrency==3.25.0
-oslo.config==5.2.0
-oslo.context==2.19.2
-oslo.i18n==3.15.3
-oslo.log==3.36.0
-oslo.messaging==5.29.0
-oslo.middleware==3.31.0
-oslo.serialization==2.18.0
-oslo.service==1.24.0
-oslo.utils==3.33.0
-osprofiler==1.4.0
-paramiko==2.0.0
-Paste==2.0.2
-PasteDeploy==1.5.0
-pbr==2.0.0
-pika==0.10.0
-pika-pool==0.1.3
-positional==1.2.1
-prettytable==0.7.2
-pyasn1==0.1.8
-pycparser==2.18
-pyinotify==0.9.6
-pyOpenSSL==17.1.0
-pyparsing==2.1.0
-pyperclip==1.5.27
-python-cinderclient==3.3.0
-python-dateutil==2.5.3
-python-glanceclient==2.8.0
-python-keystoneclient==3.8.0
-python-mimeparse==1.6.0
-python-neutronclient==6.7.0
-python-subunit==1.0.0
-pytz==2013.6
-PyYAML==3.13
-repoze.lru==0.7
-requests==2.14.2
-requests-mock==1.2.0
-requestsexceptions==1.2.0
-rfc3986==0.3.1
-Routes==2.3.1
-smmap==0.9.0
-statsd==3.2.1
-stevedore==2.0.1
-tempest==17.1.0
-tenacity==3.2.1
-stestr==2.0.0
-testscenarios==0.4
-testtools==2.2.0
-traceback2==1.4.0
-unittest2==1.1.0
-urllib3==1.21.1
-vine==1.1.4
-warlock==1.2.0
-WebOb==1.7.1
-wrapt==1.7.0
diff --git a/novaclient/shell.py b/novaclient/shell.py
index 7762be9b..468e889b 100644
--- a/novaclient/shell.py
+++ b/novaclient/shell.py
@@ -20,6 +20,7 @@ Command-line interface to the OpenStack Nova API.
import argparse
import logging
+import os
import sys
from keystoneauth1 import loading
@@ -816,9 +817,19 @@ class OpenStackHelpFormatter(argparse.HelpFormatter):
super(OpenStackHelpFormatter, self).start_section(heading)
-def main():
+def main(argv=sys.argv[1:]):
try:
- argv = [encodeutils.safe_decode(a) for a in sys.argv[1:]]
+ # Special dansmith envvar to hide the warning. Don't rely on this
+ # because we will eventually remove all this stuff.
+ if os.environ.get("NOVACLIENT_ISHOULDNTBEDOINGTHIS") != "1":
+ print(
+ _(
+ "nova CLI is deprecated and will be a removed in a future "
+ "release"
+ ),
+ file=sys.stderr,
+ )
+ argv = [encodeutils.safe_decode(a) for a in argv]
OpenStackComputeShell().main(argv)
except Exception as exc:
logger.debug(exc, exc_info=1)
diff --git a/novaclient/tests/unit/test_shell.py b/novaclient/tests/unit/test_shell.py
index 64195291..b6b708a8 100644
--- a/novaclient/tests/unit/test_shell.py
+++ b/novaclient/tests/unit/test_shell.py
@@ -624,26 +624,32 @@ class ShellTest(utils.TestCase):
self._test_service_type,
'unknown', 'compute', self.mock_client)
- @mock.patch('sys.argv', ['nova'])
@mock.patch('sys.stdout', io.StringIO())
@mock.patch('sys.stderr', io.StringIO())
def test_main_noargs(self):
# Ensure that main works with no command-line arguments
try:
- novaclient.shell.main()
+ novaclient.shell.main([])
except SystemExit:
self.fail('Unexpected SystemExit')
# We expect the normal usage as a result
- self.assertIn('Command-line interface to the OpenStack Nova API',
- sys.stdout.getvalue())
+ self.assertIn(
+ 'Command-line interface to the OpenStack Nova API',
+ sys.stdout.getvalue(),
+ )
+ # We also expect to see the deprecation warning
+ self.assertIn(
+ 'nova CLI is deprecated and will be a removed in a future release',
+ sys.stderr.getvalue(),
+ )
@mock.patch.object(novaclient.shell.OpenStackComputeShell, 'main')
def test_main_keyboard_interrupt(self, mock_compute_shell):
# Ensure that exit code is 130 for KeyboardInterrupt
mock_compute_shell.side_effect = KeyboardInterrupt()
try:
- novaclient.shell.main()
+ novaclient.shell.main([])
except SystemExit as ex:
self.assertEqual(ex.code, 130)
@@ -766,9 +772,15 @@ class ShellTest(utils.TestCase):
pass
with mock.patch('sys.stderr', io.StringIO()):
mock_compute_shell.side_effect = MyException('message')
- self.assertRaises(SystemExit, novaclient.shell.main)
+ self.assertRaises(SystemExit, novaclient.shell.main, [])
err = sys.stderr.getvalue()
- self.assertEqual(err, 'ERROR (MyException): message\n')
+ # We expect to see the error propagated
+ self.assertIn('ERROR (MyException): message\n', err)
+ # We also expect to see the deprecation warning
+ self.assertIn(
+ 'nova CLI is deprecated and will be a removed in a future release',
+ err,
+ )
class TestLoadVersionedActions(utils.TestCase):
diff --git a/novaclient/tests/unit/v2/test_shell.py b/novaclient/tests/unit/v2/test_shell.py
index e6c0fda7..da70e3cc 100644
--- a/novaclient/tests/unit/v2/test_shell.py
+++ b/novaclient/tests/unit/v2/test_shell.py
@@ -3397,7 +3397,8 @@ class ShellTest(utils.TestCase):
def test_services_list_v269_with_down_cells(self):
"""Tests nova service-list at the 2.69 microversion."""
stdout, _stderr = self.run_command('service-list', api_version='2.69')
- self.assertEqual('''\
+ self.assertEqual(
+ '''\
+--------------------------------------+--------------+-----------+------+----------+-------+---------------------+-----------------+-------------+
| Id | Binary | Host | Zone | Status | State | Updated_at | Disabled Reason | Forced down |
+--------------------------------------+--------------+-----------+------+----------+-------+---------------------+-----------------+-------------+
@@ -3406,7 +3407,8 @@ class ShellTest(utils.TestCase):
| | nova-compute | host-down | | UNKNOWN | | | | |
+--------------------------------------+--------------+-----------+------+----------+-------+---------------------+-----------------+-------------+
''', # noqa
- stdout)
+ stdout,
+ )
self.assert_called('GET', '/os-services')
def test_services_list_with_host(self):
@@ -4779,7 +4781,8 @@ class ShellTest(utils.TestCase):
def test_list_detail_v269_with_down_cells(self):
"""Tests nova list at the 2.69 microversion."""
stdout, _stderr = self.run_command('list', api_version='2.69')
- self.assertIn('''\
+ self.assertIn(
+ '''\
+------+----------------+---------+------------+-------------+----------------------------------------------+
| ID | Name | Status | Task State | Power State | Networks |
+------+----------------+---------+------------+-------------+----------------------------------------------+
@@ -4791,7 +4794,8 @@ class ShellTest(utils.TestCase):
| 9013 | sample-server4 | ACTIVE | N/A | N/A | |
+------+----------------+---------+------------+-------------+----------------------------------------------+
''', # noqa
- stdout)
+ stdout,
+ )
self.assert_called('GET', '/servers/detail')
def test_list_v269_with_down_cells(self):
@@ -4812,7 +4816,8 @@ class ShellTest(utils.TestCase):
def test_show_v269_with_down_cells(self):
stdout, _stderr = self.run_command('show 9015', api_version='2.69')
- self.assertEqual('''\
+ self.assertEqual(
+ '''\
+-----------------------------+---------------------------------------------------+
| Property | Value |
+-----------------------------+---------------------------------------------------+
@@ -4833,7 +4838,8 @@ class ShellTest(utils.TestCase):
| user_id | fake |
+-----------------------------+---------------------------------------------------+
''', # noqa
- stdout)
+ stdout,
+ )
FAKE_UUID_2 = 'c99d7632-bd66-4be9-aed5-3dd14b223a76'
self.assert_called('GET', '/servers?name=9015', pos=0)
self.assert_called('GET', '/servers?name=9015', pos=1)
diff --git a/novaclient/utils.py b/novaclient/utils.py
index fba708b5..d0219795 100644
--- a/novaclient/utils.py
+++ b/novaclient/utils.py
@@ -116,13 +116,14 @@ def service_type(stype):
return inner
-def pretty_choice_list(l):
- return ', '.join("'%s'" % i for i in l)
+def pretty_choice_list(values):
+ return ', '.join("'%s'" % x for x in values)
-def pretty_choice_dict(d):
+def pretty_choice_dict(values):
"""Returns a formatted dict as 'key=value'."""
- return pretty_choice_list(['%s=%s' % (k, d[k]) for k in sorted(d.keys())])
+ return pretty_choice_list(
+ ['%s=%s' % (k, values[k]) for k in sorted(values)])
def print_list(objs, fields, formatters={}, sortby_index=None):
diff --git a/novaclient/v2/shell.py b/novaclient/v2/shell.py
index dfe93c01..58823fc7 100644
--- a/novaclient/v2/shell.py
+++ b/novaclient/v2/shell.py
@@ -3231,15 +3231,15 @@ def _print_absolute_limits(limits):
other = {}
limit_names = []
columns = ['Name', 'Used', 'Max']
- for l in limits:
- map = limit_map.get(l.name, {'name': l.name, 'type': 'other'})
+ for limit in limits:
+ map = limit_map.get(limit.name, {'name': limit.name, 'type': 'other'})
name = map['name']
if map['type'] == 'max':
- max[name] = l.value
+ max[name] = limit.value
elif map['type'] == 'used':
- used[name] = l.value
+ used[name] = limit.value
else:
- other[name] = l.value
+ other[name] = limit.value
if 'Other' not in columns:
columns.append('Other')
if name not in limit_names:
diff --git a/releasenotes/notes/deprecate-cli-75074850847a8452.yaml b/releasenotes/notes/deprecate-cli-75074850847a8452.yaml
new file mode 100644
index 00000000..6d51ce03
--- /dev/null
+++ b/releasenotes/notes/deprecate-cli-75074850847a8452.yaml
@@ -0,0 +1,9 @@
+---
+deprecations:
+ - |
+ The ``nova`` CLI is now deprecated. This is the signal that it is
+ time to start using the openstack CLI. No new features will be
+ added to the ``nova`` CLI, though fixes to the CLI will be assessed
+ on a case by case basis. Fixes to the API bindings, development of
+ new API bindings, and changes to the compute commands in the openstack
+ CLI are exempt from this deprecation.
diff --git a/releasenotes/source/index.rst b/releasenotes/source/index.rst
index c33e50d1..68524acc 100644
--- a/releasenotes/source/index.rst
+++ b/releasenotes/source/index.rst
@@ -8,6 +8,7 @@ Contents
:maxdepth: 2
unreleased
+ yoga
xena
wallaby
victoria
diff --git a/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po b/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
new file mode 100644
index 00000000..2b450f7c
--- /dev/null
+++ b/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
@@ -0,0 +1,267 @@
+# Andi Chandler <andi@gowling.com>, 2017. #zanata
+# Andi Chandler <andi@gowling.com>, 2018. #zanata
+# Andi Chandler <andi@gowling.com>, 2022. #zanata
+msgid ""
+msgstr ""
+"Project-Id-Version: python-novaclient\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2022-06-24 11:46+0000\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"PO-Revision-Date: 2022-07-05 09:42+0000\n"
+"Last-Translator: Andi Chandler <andi@gowling.com>\n"
+"Language-Team: English (United Kingdom)\n"
+"Language: en_GB\n"
+"X-Generator: Zanata 4.3.3\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+msgid ""
+"**auto**: This tells the Compute service to automatically allocate a network "
+"for the project if one is not available and then associate an IP from that "
+"network with the server. This is the same behavior as passing nics=None "
+"before the 2.37 microversion."
+msgstr ""
+"**auto**: This tells the Compute service to automatically allocate a network "
+"for the project if one is not available and then associate an IP from that "
+"network with the server. This is the same behaviour as passing nics=None "
+"before the 2.37 microversion."
+
+msgid ""
+"**none**: This tells the Compute service to not allocate any networking for "
+"the server."
+msgstr ""
+"**none**: This tells the Compute service to not allocate any networking for "
+"the server."
+
+msgid "--all_tenants replaced by --all-tenants"
+msgstr "--all_tenants replaced by --all-tenants"
+
+msgid "--availability-zone"
+msgstr "--availability-zone"
+
+msgid "--availability_zone replaced by -- availability-zone"
+msgstr "--availability_zone replaced by -- availability-zone"
+
+msgid "--availability_zone replaced by --availability-zone"
+msgstr "--availability_zone replaced by --availability-zone"
+
+msgid "--block_device_mapping replaced by --block-device-mapping"
+msgstr "--block_device_mapping replaced by --block-device-mapping"
+
+msgid "--block_migrate replaced by --block-migrate"
+msgstr "--block_migrate replaced by --block-migrate"
+
+msgid "--bypass_url replaced by --bypass-url"
+msgstr "--bypass_url replaced by --bypass-url"
+
+msgid "--config-drive"
+msgstr "--config-drive"
+
+msgid "--console_type replaced by --console-type"
+msgstr "--console_type replaced by --console-type"
+
+msgid "--disk_over_commit replaced by --disk-over-commit"
+msgstr "--disk_over_commit replaced by --disk-over-commit"
+
+msgid "--endpoint-type replaced by --os-endpoint-type"
+msgstr "--endpoint-type replaced by --os-endpoint-type"
+
+msgid "--floating_ips replaced by --floating-ips"
+msgstr "--floating_ips replaced by --floating-ips"
+
+msgid "--injected_file_content_bytes replaced by --injected-file-content-bytes"
+msgstr ""
+"--injected_file_content_bytes replaced by --injected-file-content-bytes"
+
+msgid "--injected_files replaced by --injected-files"
+msgstr "--injected_files replaced by --injected-files"
+
+msgid "--instance_name replaced by --instance-name"
+msgstr "--instance_name replaced by --instance-name"
+
+msgid "--key-name"
+msgstr "--key-name"
+
+msgid "--key_name replaced by --key-name"
+msgstr "--key_name replaced by --key-name"
+
+msgid "--metadata_items replaced by --metadata-items"
+msgstr "--metadata_items replaced by --metadata-items"
+
+msgid "--no-config-drive"
+msgstr "--no-config-drive"
+
+msgid "--num-instance replaced by --min-count and --max-count"
+msgstr "--num-instance replaced by --min-count and --max-count"
+
+msgid "--os_auth_system replaced by --os-auth-system"
+msgstr "--os_auth_system replaced by --os-auth-system"
+
+msgid "--os_auth_url replaced by --os-auth-url"
+msgstr "--os_auth_url replaced by --os-auth-url"
+
+msgid "--os_compute_api_version replaced by --os-compute-api-version"
+msgstr "--os_compute_api_version replaced by --os-compute-api-version"
+
+msgid "--os_password replaced by --os-password"
+msgstr "--os_password replaced by --os-password"
+
+msgid "--os_region_name replaced by --os-region-name"
+msgstr "--os_region_name replaced by --os-region-name"
+
+msgid "--os_tenant_name replaced by --os-tenant-name"
+msgstr "--os_tenant_name replaced by --os-tenant-name"
+
+msgid "--os_username replaced by --os-username"
+msgstr "--os_username replaced by --os-username"
+
+msgid "--policy"
+msgstr "--policy"
+
+msgid "--power-state"
+msgstr "--power-state"
+
+msgid "--progress"
+msgstr "--progress"
+
+msgid "--pub_key replaced by --pub-key"
+msgstr "--pub_key replaced by --pub-key"
+
+msgid "--rebuild_password replaced by --rebuild-password"
+msgstr "--rebuild_password replaced by --rebuild-password"
+
+msgid "--reservation_id replaced by --reservation-id"
+msgstr "--reservation_id replaced by --reservation-id"
+
+msgid "--security_groups replaced by --sercurity-groups"
+msgstr "--security_groups replaced by --security-groups"
+
+msgid "--service_name replaced by --service-name"
+msgstr "--service_name replaced by --service-name"
+
+msgid "--service_type replaced by --service-type"
+msgstr "--service_type replaced by --service-type"
+
+msgid "--task-state"
+msgstr "--task-state"
+
+msgid "--user_data replaced by --user-data"
+msgstr "--user_data replaced by --user-data"
+
+msgid "--vm-state"
+msgstr "--vm-state"
+
+msgid "--volume_service_name replaced by --volume-service-name"
+msgstr "--volume_service_name replaced by --volume-service-name"
+
+msgid "10.0.0"
+msgstr "10.0.0"
+
+msgid "10.1.0"
+msgstr "10.1.0"
+
+msgid "10.1.1"
+msgstr "10.1.1"
+
+msgid "10.2.0"
+msgstr "10.2.0"
+
+msgid "10.3.0"
+msgstr "10.3.0"
+
+msgid "11.0.0"
+msgstr "11.0.0"
+
+msgid "11.0.1"
+msgstr "11.0.1"
+
+msgid "3.0.0"
+msgstr "3.0.0"
+
+msgid "3.3.0"
+msgstr "3.3.0"
+
+msgid "4.0.0"
+msgstr "4.0.0"
+
+msgid "4.1.0"
+msgstr "4.1.0"
+
+msgid "5.0.0"
+msgstr "5.0.0"
+
+msgid "5.1.0"
+msgstr "5.1.0"
+
+msgid "6.0.0"
+msgstr "6.0.0"
+
+msgid ":ref:`search`"
+msgstr ":ref:`search`"
+
+msgid "Current Series Release Notes"
+msgstr "Current Series Release Notes"
+
+msgid "Liberty Series Release Notes"
+msgstr "Liberty Series Release Notes"
+
+msgid "Mitaka Series Release Notes"
+msgstr "Mitaka Series Release Notes"
+
+msgid "Newton Series Release Notes"
+msgstr "Newton Series Release Notes"
+
+msgid "Ocata Series Release Notes"
+msgstr "Ocata Series Release Notes"
+
+msgid "Pike Series Release Notes"
+msgstr "Pike Series Release Notes"
+
+msgid "Queens Series Release Notes"
+msgstr "Queens Series Release Notes"
+
+msgid "Rocky Series Release Notes"
+msgstr "Rocky Series Release Notes"
+
+msgid "Stein Series Release Notes"
+msgstr "Stein Series Release Notes"
+
+msgid "Train Series Release Notes"
+msgstr "Train Series Release Notes"
+
+msgid "Ussuri Series Release Notes"
+msgstr "Ussuri Series Release Notes"
+
+msgid "Victoria Series Release Notes"
+msgstr "Victoria Series Release Notes"
+
+msgid "Wallaby Series Release Notes"
+msgstr "Wallaby Series Release Notes"
+
+msgid "Xena Series Release Notes"
+msgstr "Xena Series Release Notes"
+
+msgid "Yoga Series Release Notes"
+msgstr "Yoga Series Release Notes"
+
+msgid "secgroup-create"
+msgstr "secgroup-create"
+
+msgid "secgroup-delete"
+msgstr "secgroup-delete"
+
+msgid "secgroup-delete-default-rule"
+msgstr "secgroup-delete-default-rule"
+
+msgid "secgroup-delete-group-rule"
+msgstr "secgroup-delete-group-rule"
+
+msgid "secgroup-delete-rule"
+msgstr "secgroup-delete-rule"
+
+msgid "secgroup-list"
+msgstr "secgroup-list"
+
+msgid "secgroup-list-default-rules"
+msgstr "secgroup-list-default-rules"
diff --git a/releasenotes/source/yoga.rst b/releasenotes/source/yoga.rst
new file mode 100644
index 00000000..7cd5e908
--- /dev/null
+++ b/releasenotes/source/yoga.rst
@@ -0,0 +1,6 @@
+=========================
+Yoga Series Release Notes
+=========================
+
+.. release-notes::
+ :branch: stable/yoga
diff --git a/requirements.txt b/requirements.txt
index b93814eb..2eec1a70 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,6 +1,7 @@
-# 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.
+# Requirements lower bounds listed here are our best effort to keep them up to
+# date but we do not test them so no guarantee of having them all correct. If
+# you find any incorrect lower bounds, let us know or propose a fix.
+
pbr!=2.1.0,>=2.0.0 # Apache-2.0
keystoneauth1>=3.5.0 # Apache-2.0
iso8601>=0.1.11 # MIT
diff --git a/setup.cfg b/setup.cfg
index 66b11b73..7982b664 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -7,7 +7,7 @@ license = Apache License, Version 2.0
author = OpenStack
author_email = openstack-discuss@lists.openstack.org
home_page = https://docs.openstack.org/python-novaclient/latest
-python_requires = >=3.6
+python_requires = >=3.8
classifier =
Development Status :: 5 - Production/Stable
Environment :: Console
@@ -18,8 +18,6 @@ classifier =
Operating System :: OS Independent
Programming Language :: Python
Programming Language :: Python :: 3
- Programming Language :: Python :: 3.6
- Programming Language :: Python :: 3.7
Programming Language :: Python :: 3.8
Programming Language :: Python :: 3.9
Programming Language :: Python :: 3 :: Only
diff --git a/test-requirements.txt b/test-requirements.txt
index f2df9017..5845d2d5 100644
--- a/test-requirements.txt
+++ b/test-requirements.txt
@@ -1,8 +1,4 @@
-# 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.1,<3.1.0 # Apache-2.0
-
+hacking~=4.1.0 # Apache-2.0
bandit>=1.1.0 # Apache-2.0
coverage!=4.4,>=4.0 # Apache-2.0
ddt>=1.0.1 # MIT
diff --git a/tox.ini b/tox.ini
index 10805281..0fbe142e 100644
--- a/tox.ini
+++ b/tox.ini
@@ -101,9 +101,3 @@ import_exceptions = novaclient.i18n
# separately, outside of the requirements files.
deps = bindep
commands = bindep test
-
-[testenv:lower-constraints]
-deps =
- -c{toxinidir}/lower-constraints.txt
- -r{toxinidir}/test-requirements.txt
- -r{toxinidir}/requirements.txt