diff options
-rw-r--r-- | CONTRIBUTING.rst | 4 | ||||
-rw-r--r-- | HACKING.rst | 2 | ||||
-rw-r--r-- | README.rst | 10 | ||||
-rw-r--r-- | doc/source/cli/details.rst | 19 | ||||
-rw-r--r-- | doc/source/cli/property-keys.rst | 2 | ||||
-rw-r--r-- | doc/source/conf.py | 2 | ||||
-rw-r--r-- | glanceclient/common/http.py | 8 | ||||
-rw-r--r-- | glanceclient/common/https.py | 86 | ||||
-rw-r--r-- | glanceclient/shell.py | 9 | ||||
-rw-r--r-- | glanceclient/tests/functional/test_readonly_glance.py | 9 | ||||
-rw-r--r-- | glanceclient/v2/metadefs.py | 95 | ||||
-rw-r--r-- | requirements.txt | 2 | ||||
-rw-r--r-- | setup.cfg | 2 | ||||
-rw-r--r-- | test-requirements.txt | 4 |
14 files changed, 78 insertions, 176 deletions
diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index 35564c5..b5c7c42 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -1,13 +1,13 @@ If you would like to contribute to the development of OpenStack, you must follow the steps documented at: - http://docs.openstack.org/infra/manual/developers.html#development-workflow + https://docs.openstack.org/infra/manual/developers.html#development-workflow Once those steps have been completed, changes to OpenStack should be submitted for review via the Gerrit tool, following the workflow documented at: - http://docs.openstack.org/infra/manual/developers.html#development-workflow + https://docs.openstack.org/infra/manual/developers.html#development-workflow Pull requests submitted through GitHub will be ignored. diff --git a/HACKING.rst b/HACKING.rst index fa8a64a..16b4a18 100644 --- a/HACKING.rst +++ b/HACKING.rst @@ -2,7 +2,7 @@ Glance Style Commandments ========================= - Step 1: Read the OpenStack Style Commandments - http://docs.openstack.org/developer/hacking/ + https://docs.openstack.org/hacking/latest/ - Step 2: Read on @@ -2,8 +2,8 @@ Team and repository tags ======================== -.. image:: http://governance.openstack.org/badges/python-glanceclient.svg - :target: http://governance.openstack.org/reference/tags/index.html +.. image:: https://governance.openstack.org/tc/badges/python-glanceclient.svg + :target: https://governance.openstack.org/tc/reference/tags/index.html :alt: The following tags have been asserted for Python bindings to the OpenStack Images API: "project:official", @@ -46,11 +46,11 @@ See release notes and more at `<http://docs.openstack.org/python-glanceclient/>` * `How to Contribute`_ .. _PyPi: https://pypi.python.org/pypi/python-glanceclient -.. _Online Documentation: http://docs.openstack.org/python-glanceclient +.. _Online Documentation: https://docs.openstack.org/python-glanceclient/latest/ .. _Launchpad project: https://launchpad.net/python-glanceclient .. _Blueprints: https://blueprints.launchpad.net/python-glanceclient .. _Bugs: https://bugs.launchpad.net/python-glanceclient .. _Source: https://git.openstack.org/cgit/openstack/python-glanceclient -.. _How to Contribute: http://docs.openstack.org/infra/manual/developers.html -.. _Specs: http://specs.openstack.org/openstack/glance-specs/ +.. _How to Contribute: https://docs.openstack.org/infra/manual/developers.html +.. _Specs: https://specs.openstack.org/openstack/glance-specs/ diff --git a/doc/source/cli/details.rst b/doc/source/cli/details.rst index f303c09..400c1ed 100644 --- a/doc/source/cli/details.rst +++ b/doc/source/cli/details.rst @@ -20,7 +20,7 @@ glance usage .. code-block:: console - usage: glance [--version] [-d] [-v] [--get-schema] [--no-ssl-compression] [-f] + usage: glance [--version] [-d] [-v] [--get-schema] [-f] [--os-image-url OS_IMAGE_URL] [--os-image-api-version OS_IMAGE_API_VERSION] [--profile HMAC_KEY] [--key-file OS_KEY] [--ca-file OS_CACERT] @@ -64,11 +64,6 @@ glance optional arguments that generates portions of the help text. Ignored with API version 1. -``--no-ssl-compression`` - **DEPRECATED!** This option is deprecated and not used - anymore. SSL compression should be disabled by default - by the system SSL library. - ``-f, --force`` Prevent select actions from requesting user confirmation. @@ -174,7 +169,7 @@ Create a new image. ``--architecture <ARCHITECTURE>`` Operating system architecture as specified in - http://docs.openstack.org/user-guide/common/cli-manage-images.html + https://docs.openstack.org/glance/latest/user/common-image-properties.html#architecture ``--protected [True|False]`` If true, image will not be deletable. @@ -213,7 +208,7 @@ Create a new image. Common name of operating system distribution as specified in - http://docs.openstack.org/user-guide/common/cli-manage-images.html + https://docs.openstack.org/glance/latest/user/common-image-properties.html#os-distro ``--id <ID>`` An identifier for the image @@ -468,7 +463,7 @@ Update an existing image. ``--architecture <ARCHITECTURE>`` Operating system architecture as specified in - http://docs.openstack.org/user-guide/common/cli-manage-images.html + https://docs.openstack.org/glance/latest/user/common-image-properties.html#architecture ``--protected [True|False]`` If true, image will not be deletable. @@ -504,7 +499,7 @@ Update an existing image. Common name of operating system distribution as specified in - http://docs.openstack.org/user-guide/common/cli-manage-images.html + https://docs.openstack.org/glance/latest/user/common-image-properties.html#os-distro ``--owner <OWNER>`` Owner of the image @@ -1182,8 +1177,8 @@ Associate resource type with a metadata definitions namespace. ``--name <NAME>`` Resource type names should be aligned with Heat - resource types whenever possible: http://docs.openstac - k.org/developer/heat/template_guide/openstack.html + resource types whenever possible: + https://docs.openstack.org/heat/latest/template_guide/openstack.html ``--properties-target <PROPERTIES_TARGET>`` Some resource types allow more than one key / value diff --git a/doc/source/cli/property-keys.rst b/doc/source/cli/property-keys.rst index 7996bc7..2763357 100644 --- a/doc/source/cli/property-keys.rst +++ b/doc/source/cli/property-keys.rst @@ -15,7 +15,7 @@ For example: Behavior set using image properties overrides behavior set using flavors. For more information, refer to the `Manage images - <https://docs.openstack.org/admin-guide/common/cli-manage-images.html>`_ + <https://docs.openstack.org/glance/latest/admin/manage-images.html>`_ in the OpenStack Administrator Guide. .. list-table:: Image service property keys diff --git a/doc/source/conf.py b/doc/source/conf.py index 574b931..98ab8c9 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -83,6 +83,6 @@ html_last_updated_fmt = '%Y-%m-%d %H:%M' # Grouping the document tree for man pages. # List of tuples 'sourcefile', 'target', u'title', u'Authors name', 'manual' man_pages = [ - ('man/glance', 'glance', u'Client for OpenStack Images API', + ('cli/glance', 'glance', u'Client for OpenStack Images API', [u'OpenStack Foundation'], 1), ] diff --git a/glanceclient/common/http.py b/glanceclient/common/http.py index 35ef282..fc635ff 100644 --- a/glanceclient/common/http.py +++ b/glanceclient/common/http.py @@ -24,7 +24,6 @@ from oslo_utils import importutils from oslo_utils import netutils import requests import six -import warnings try: import json @@ -146,13 +145,6 @@ class HTTPClient(_BaseHTTPClient): self.timeout = float(kwargs.get('timeout', 600)) if self.endpoint.startswith("https"): - compression = kwargs.get('ssl_compression', True) - - if compression is False: - # Note: This is not seen by default. (python must be - # run with -Wd) - warnings.warn('The "ssl_compression" argument has been ' - 'deprecated.', DeprecationWarning) if kwargs.get('insecure', False) is True: self.session.verify = False diff --git a/glanceclient/common/https.py b/glanceclient/common/https.py index 36015e5..deb7eb0 100644 --- a/glanceclient/common/https.py +++ b/glanceclient/common/https.py @@ -18,17 +18,8 @@ import ssl import struct import OpenSSL -from requests import adapters -from requests import compat -try: - from requests.packages.urllib3 import connectionpool - from requests.packages.urllib3 import poolmanager -except ImportError: - from urllib3 import connectionpool - from urllib3 import poolmanager -from oslo_utils import encodeutils import six # NOTE(jokke): simplified transition to py3, behaves like py2 xrange from six.moves import range @@ -135,83 +126,6 @@ def to_bytes(s): return s -class HTTPSAdapter(adapters.HTTPAdapter): - """This adapter will be used just when ssl compression should be disabled. - - The init method overwrites the default https pool by setting - glanceclient's one. - """ - def __init__(self, *args, **kwargs): - classes_by_scheme = poolmanager.pool_classes_by_scheme - classes_by_scheme["glance+https"] = HTTPSConnectionPool - super(HTTPSAdapter, self).__init__(*args, **kwargs) - - def request_url(self, request, proxies): - # NOTE(flaper87): Make sure the url is encoded, otherwise - # python's standard httplib will fail with a TypeError. - url = super(HTTPSAdapter, self).request_url(request, proxies) - if six.PY2: - url = encodeutils.safe_encode(url) - return url - - def _create_glance_httpsconnectionpool(self, url): - kw = self.poolmanager.connection_pool_kw - # Parse the url to get the scheme, host, and port - parsed = compat.urlparse(url) - # If there is no port specified, we should use the standard HTTPS port - port = parsed.port or 443 - host = parsed.netloc.rsplit(':', 1)[0] - pool = HTTPSConnectionPool(host, port, **kw) - - with self.poolmanager.pools.lock: - self.poolmanager.pools[(parsed.scheme, host, port)] = pool - - return pool - - def get_connection(self, url, proxies=None): - try: - return super(HTTPSAdapter, self).get_connection(url, proxies) - except KeyError: - # NOTE(sigamvirus24): This works around modifying a module global - # which fixes bug #1396550 - # The scheme is most likely glance+https but check anyway - if not url.startswith('glance+https://'): - raise - - return self._create_glance_httpsconnectionpool(url) - - def cert_verify(self, conn, url, verify, cert): - super(HTTPSAdapter, self).cert_verify(conn, url, verify, cert) - conn.ca_certs = verify[0] - conn.insecure = verify[1] - - -class HTTPSConnectionPool(connectionpool.HTTPSConnectionPool): - """A replacement for the default HTTPSConnectionPool. - - HTTPSConnectionPool will be instantiated when a new - connection is requested to the HTTPSAdapter. This - implementation overwrites the _new_conn method and - returns an instances of glanceclient's VerifiedHTTPSConnection - which handles no compression. - - ssl_compression is hard-coded to False because this will - be used just when the user sets --no-ssl-compression. - """ - - scheme = 'glance+https' - - def _new_conn(self): - self.num_connections += 1 - return VerifiedHTTPSConnection(host=self.host, - port=self.port, - key_file=self.key_file, - cert_file=self.cert_file, - cacert=self.ca_certs, - insecure=self.insecure, - ssl_compression=False) - - class OpenSSLConnectionDelegator(object): """An OpenSSL.SSL.Connection delegator. diff --git a/glanceclient/shell.py b/glanceclient/shell.py index 5aaaf39..55862cf 100644 --- a/glanceclient/shell.py +++ b/glanceclient/shell.py @@ -155,14 +155,6 @@ class OpenStackImagesShell(object): 'of schema that generates portions of the ' 'help text. Ignored with API version 1.') - parser.add_argument('--no-ssl-compression', - dest='ssl_compression', - default=True, action='store_false', - help='DEPRECATED! This option is deprecated ' - 'and not used anymore. SSL compression ' - 'should be disabled by default by the ' - 'system SSL library.') - parser.add_argument('-f', '--force', dest='force', default=False, action='store_true', @@ -434,7 +426,6 @@ class OpenStackImagesShell(object): 'cacert': args.os_cacert, 'cert': args.os_cert, 'key': args.os_key, - 'ssl_compression': args.ssl_compression } else: ks_session = loading.load_session_from_argparse_arguments(args) diff --git a/glanceclient/tests/functional/test_readonly_glance.py b/glanceclient/tests/functional/test_readonly_glance.py index 822bbcc..ccd49d6 100644 --- a/glanceclient/tests/functional/test_readonly_glance.py +++ b/glanceclient/tests/functional/test_readonly_glance.py @@ -109,12 +109,3 @@ class SimpleReadOnlyGlanceClientTest(base.ClientTestBase): def test_debug_list(self): self.glance('--os-image-api-version 2 image-list', flags='--debug') - - def test_no_ssl_compression(self): - # Test deprecating this hasn't broken anything - out = self.glance('--os-image-api-version 1 ' - '--no-ssl-compression image-list') - endpoints = self.parser.listing(out) - self.assertTableStruct(endpoints, [ - 'ID', 'Name', 'Disk Format', 'Container Format', - 'Size', 'Status']) diff --git a/glanceclient/v2/metadefs.py b/glanceclient/v2/metadefs.py index 8cfe222..a6df87a 100644 --- a/glanceclient/v2/metadefs.py +++ b/glanceclient/v2/metadefs.py @@ -72,7 +72,8 @@ class NamespaceController(object): if elem in namespace: del namespace[elem] - url = '/v2/metadefs/namespaces/{0}'.format(namespace_name) + url = '/v2/metadefs/namespaces/%(namespace)s' % { + 'namespace': namespace_name} # Pass the original wrapped value to http client. resp, _ = self.http_client.put(url, data=namespace.wrapped) # Get request id from `put` request so it can be passed to the @@ -92,7 +93,8 @@ class NamespaceController(object): if kwargs: query_params = '?%s' % query_params - url = '/v2/metadefs/namespaces/{0}{1}'.format(namespace, query_params) + url = '/v2/metadefs/namespaces/%(namespace)s%(query_params)s' % { + 'namespace': namespace, 'query_params': query_params} header = header or {} resp, body = self.http_client.get(url, headers=header) # NOTE(bcwaldon): remove 'self' for now until we have an elegant @@ -188,7 +190,8 @@ class NamespaceController(object): @utils.add_req_id_to_object() def delete(self, namespace): """Delete a namespace.""" - url = '/v2/metadefs/namespaces/{0}'.format(namespace) + url = '/v2/metadefs/namespaces/%(namespace)s' % { + 'namespace': namespace} resp, body = self.http_client.delete(url) return (resp, body), resp @@ -212,8 +215,8 @@ class ResourceTypeController(object): except (warlock.InvalidOperation, ValueError) as e: raise TypeError(encodeutils.exception_to_unicode(e)) - url = '/v2/metadefs/namespaces/{0}/resource_types'.format(namespace, - res_type) + url = '/v2/metadefs/namespaces/%(namespace)s/resource_types' % { + 'namespace': namespace} resp, body = self.http_client.post(url, data=res_type) body.pop('self', None) return self.model(**body), resp @@ -221,8 +224,9 @@ class ResourceTypeController(object): @utils.add_req_id_to_object() def deassociate(self, namespace, resource): """Deassociate a resource type with a namespace.""" - url = '/v2/metadefs/namespaces/{0}/resource_types/{1}'. \ - format(namespace, resource) + url = ('/v2/metadefs/namespaces/%(namespace)s/' + 'resource_types/%(resource)s') % { + 'namespace': namespace, 'resource': resource} resp, body = self.http_client.delete(url) return (resp, body), resp @@ -240,7 +244,8 @@ class ResourceTypeController(object): @utils.add_req_id_to_generator() def get(self, namespace): - url = '/v2/metadefs/namespaces/{0}/resource_types'.format(namespace) + url = '/v2/metadefs/namespaces/%(namespace)s/resource_types' % { + 'namespace': namespace} resp, body = self.http_client.get(url) body.pop('self', None) for resource_type in body['resource_type_associations']: @@ -270,8 +275,8 @@ class PropertyController(object): except (warlock.InvalidOperation, ValueError) as e: raise TypeError(encodeutils.exception_to_unicode(e)) - url = '/v2/metadefs/namespaces/{0}/properties'.format(namespace) - + url = '/v2/metadefs/namespaces/%(namespace)s/properties' % { + 'namespace': namespace} resp, body = self.http_client.post(url, data=prop) body.pop('self', None) return self.model(**body), resp @@ -290,8 +295,9 @@ class PropertyController(object): except warlock.InvalidOperation as e: raise TypeError(encodeutils.exception_to_unicode(e)) - url = '/v2/metadefs/namespaces/{0}/properties/{1}'.format(namespace, - prop_name) + url = ('/v2/metadefs/namespaces/%(namespace)s/' + 'properties/%(prop_name)s') % { + 'namespace': namespace, 'prop_name': prop_name} # Pass the original wrapped value to http client. resp, _ = self.http_client.put(url, data=prop.wrapped) # Get request id from `put` request so it can be passed to the @@ -306,8 +312,9 @@ class PropertyController(object): @utils.add_req_id_to_object() def _get(self, namespace, prop_name, header=None): - url = '/v2/metadefs/namespaces/{0}/properties/{1}'.format(namespace, - prop_name) + url = ('/v2/metadefs/namespaces/%(namespace)s/' + 'properties/%(prop_name)s') % { + 'namespace': namespace, 'prop_name': prop_name} header = header or {} resp, body = self.http_client.get(url, headers=header) body.pop('self', None) @@ -320,7 +327,8 @@ class PropertyController(object): :returns: generator over list of objects """ - url = '/v2/metadefs/namespaces/{0}/properties'.format(namespace) + url = '/v2/metadefs/namespaces/%(namespace)s/properties' % { + 'namespace': namespace} resp, body = self.http_client.get(url) @@ -331,15 +339,17 @@ class PropertyController(object): @utils.add_req_id_to_object() def delete(self, namespace, prop_name): """Delete a property.""" - url = '/v2/metadefs/namespaces/{0}/properties/{1}'.format(namespace, - prop_name) + url = ('/v2/metadefs/namespaces/%(namespace)s/' + 'properties/%(prop_name)s') % { + 'namespace': namespace, 'prop_name': prop_name} resp, body = self.http_client.delete(url) return (resp, body), resp @utils.add_req_id_to_object() def delete_all(self, namespace): """Delete all properties in a namespace.""" - url = '/v2/metadefs/namespaces/{0}/properties'.format(namespace) + url = '/v2/metadefs/namespaces/%(namespace)s/properties' % { + 'namespace': namespace} resp, body = self.http_client.delete(url) return (resp, body), resp @@ -367,7 +377,8 @@ class ObjectController(object): except (warlock.InvalidOperation, ValueError) as e: raise TypeError(encodeutils.exception_to_unicode(e)) - url = '/v2/metadefs/namespaces/{0}/objects'.format(namespace) + url = '/v2/metadefs/namespaces/%(namespace)s/objects' % { + 'namespace': namespace} resp, body = self.http_client.post(url, data=obj) body.pop('self', None) @@ -393,8 +404,9 @@ class ObjectController(object): if elem in obj: del obj[elem] - url = '/v2/metadefs/namespaces/{0}/objects/{1}'.format(namespace, - object_name) + url = ('/v2/metadefs/namespaces/%(namespace)s/' + 'objects/%(object_name)s') % { + 'namespace': namespace, 'object_name': object_name} # Pass the original wrapped value to http client. resp, _ = self.http_client.put(url, data=obj.wrapped) # Get request id from `put` request so it can be passed to the @@ -409,8 +421,9 @@ class ObjectController(object): @utils.add_req_id_to_object() def _get(self, namespace, object_name, header=None): - url = '/v2/metadefs/namespaces/{0}/objects/{1}'.format(namespace, - object_name) + url = ('/v2/metadefs/namespaces/%(namespace)s/' + 'objects/%(object_name)s') % { + 'namespace': namespace, 'object_name': object_name} header = header or {} resp, body = self.http_client.get(url, headers=header) body.pop('self', None) @@ -422,7 +435,8 @@ class ObjectController(object): :returns: generator over list of objects """ - url = '/v2/metadefs/namespaces/{0}/objects'.format(namespace,) + url = '/v2/metadefs/namespaces/%(namespace)s/objects' % { + 'namespace': namespace} resp, body = self.http_client.get(url) for obj in body['objects']: @@ -431,15 +445,17 @@ class ObjectController(object): @utils.add_req_id_to_object() def delete(self, namespace, object_name): """Delete an object.""" - url = '/v2/metadefs/namespaces/{0}/objects/{1}'.format(namespace, - object_name) + url = ('/v2/metadefs/namespaces/%(namespace)s/' + 'objects/%(object_name)s') % { + 'namespace': namespace, 'object_name': object_name} resp, body = self.http_client.delete(url) return (resp, body), resp @utils.add_req_id_to_object() def delete_all(self, namespace): """Delete all objects in a namespace.""" - url = '/v2/metadefs/namespaces/{0}/objects'.format(namespace) + url = '/v2/metadefs/namespaces/%(namespace)s/objects' % { + 'namespace': namespace} resp, body = self.http_client.delete(url) return (resp, body), resp @@ -463,8 +479,8 @@ class TagController(object): :param tag_name: The name of the new tag to create. """ - url = ('/v2/metadefs/namespaces/{0}/tags/{1}'.format(namespace, - tag_name)) + url = '/v2/metadefs/namespaces/%(namespace)s/tags/%(tag_name)s' % { + 'namespace': namespace, 'tag_name': tag_name} resp, body = self.http_client.post(url) body.pop('self', None) @@ -488,7 +504,8 @@ class TagController(object): raise TypeError(encodeutils.exception_to_unicode(e)) tags = {'tags': md_tag_list} - url = '/v2/metadefs/namespaces/{0}/tags'.format(namespace) + url = '/v2/metadefs/namespaces/%(namespace)s/tags' % { + 'namespace': namespace} resp, body = self.http_client.post(url, data=tags) body.pop('self', None) @@ -515,8 +532,8 @@ class TagController(object): if elem in tag: del tag[elem] - url = '/v2/metadefs/namespaces/{0}/tags/{1}'.format(namespace, - tag_name) + url = '/v2/metadefs/namespaces/%(namespace)s/tags/%(tag_name)s' % { + 'namespace': namespace, 'tag_name': tag_name} # Pass the original wrapped value to http client. resp, _ = self.http_client.put(url, data=tag.wrapped) # Get request id from `put` request so it can be passed to the @@ -531,8 +548,8 @@ class TagController(object): @utils.add_req_id_to_object() def _get(self, namespace, tag_name, header=None): - url = '/v2/metadefs/namespaces/{0}/tags/{1}'.format(namespace, - tag_name) + url = '/v2/metadefs/namespaces/%(namespace)s/tags/%(tag_name)s' % { + 'namespace': namespace, 'tag_name': tag_name} header = header or {} resp, body = self.http_client.get(url, headers=header) body.pop('self', None) @@ -544,7 +561,8 @@ class TagController(object): :returns: generator over list of tags. """ - url = '/v2/metadefs/namespaces/{0}/tags'.format(namespace) + url = '/v2/metadefs/namespaces/%(namespace)s/tags' % { + 'namespace': namespace} resp, body = self.http_client.get(url) for tag in body['tags']: @@ -553,14 +571,15 @@ class TagController(object): @utils.add_req_id_to_object() def delete(self, namespace, tag_name): """Delete a tag.""" - url = '/v2/metadefs/namespaces/{0}/tags/{1}'.format(namespace, - tag_name) + url = '/v2/metadefs/namespaces/%(namespace)s/tags/%(tag_name)s' % { + 'namespace': namespace, 'tag_name': tag_name} resp, body = self.http_client.delete(url) return (resp, body), resp @utils.add_req_id_to_object() def delete_all(self, namespace): """Delete all tags in a namespace.""" - url = '/v2/metadefs/namespaces/{0}/tags'.format(namespace) + url = '/v2/metadefs/namespaces/%(namespace)s/tags' % { + 'namespace': namespace} resp, body = self.http_client.delete(url) return (resp, body), resp diff --git a/requirements.txt b/requirements.txt index 0bd7356..ca2a418 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,7 @@ pbr!=2.1.0,>=2.0.0 # Apache-2.0 Babel!=2.4.0,>=2.3.4 # BSD PrettyTable<0.8,>=0.7.1 # BSD -keystoneauth1>=2.21.0 # Apache-2.0 +keystoneauth1>=3.0.1 # Apache-2.0 requests>=2.14.2 # Apache-2.0 warlock!=1.3.0,<2,>=1.0.1 # Apache-2.0 six>=1.9.0 # MIT @@ -6,7 +6,7 @@ description-file = license = Apache License, Version 2.0 author = OpenStack author-email = openstack-dev@lists.openstack.org -home-page = http://docs.openstack.org/developer/python-glanceclient +home-page = https://docs.openstack.org/python-glanceclient/latest/ classifier = Development Status :: 5 - Production/Stable Environment :: Console diff --git a/test-requirements.txt b/test-requirements.txt index 2400b32..2c9bfb4 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -6,7 +6,7 @@ hacking!=0.13.0,<0.14,>=0.12.0 # Apache-2.0 coverage!=4.4,>=4.0 # Apache-2.0 mock>=2.0 # BSD ordereddict # MIT -os-client-config>=1.27.0 # Apache-2.0 +os-client-config>=1.28.0 # Apache-2.0 openstackdocstheme>=1.11.0 # Apache-2.0 reno!=2.3.1,>=1.8.0 # Apache-2.0 sphinx>=1.6.2 # BSD @@ -15,4 +15,4 @@ testtools>=1.4.0 # MIT testscenarios>=0.4 # Apache-2.0/BSD fixtures>=3.0.0 # Apache-2.0/BSD requests-mock>=1.1 # Apache-2.0 -tempest>=14.0.0 # Apache-2.0 +tempest>=16.1.0 # Apache-2.0 |