diff -Nru glance-16.0.0/api-ref/source/v2/images-images-v2.inc glance-16.0.1/api-ref/source/v2/images-images-v2.inc --- glance-16.0.0/api-ref/source/v2/images-images-v2.inc 2018-02-28 11:31:34.000000000 +0000 +++ glance-16.0.1/api-ref/source/v2/images-images-v2.inc 2018-04-24 18:17:16.000000000 +0000 @@ -82,6 +82,14 @@ recoverable. * - deactivated - The image data is not available for use. + * - uploading + - Data has been staged as part of the interoperable image import process. + It is not yet available for use. + *(Since Image API 2.6)* + * - importing + - The image data is being processed as part of the interoperable image + import process, but is not yet available for use. + *(Since Image API 2.6)* **Image visibility** diff -Nru glance-16.0.0/api-ref/source/v2/samples/schemas-image-show-response.json glance-16.0.1/api-ref/source/v2/samples/schemas-image-show-response.json --- glance-16.0.0/api-ref/source/v2/samples/schemas-image-show-response.json 2018-02-28 11:31:29.000000000 +0000 +++ glance-16.0.1/api-ref/source/v2/samples/schemas-image-show-response.json 2018-04-24 18:17:09.000000000 +0000 @@ -198,7 +198,9 @@ "killed", "deleted", "pending_delete", - "deactivated" + "deactivated", + "uploading", + "importing" ], "readOnly": true, "type": "string" diff -Nru glance-16.0.0/api-ref/source/v2/samples/schemas-images-list-response.json glance-16.0.1/api-ref/source/v2/samples/schemas-images-list-response.json --- glance-16.0.0/api-ref/source/v2/samples/schemas-images-list-response.json 2018-02-28 11:31:29.000000000 +0000 +++ glance-16.0.1/api-ref/source/v2/samples/schemas-images-list-response.json 2018-04-24 18:17:09.000000000 +0000 @@ -219,7 +219,9 @@ "killed", "deleted", "pending_delete", - "deactivated" + "deactivated", + "uploading", + "importing" ], "readOnly": true, "type": "string" diff -Nru glance-16.0.0/AUTHORS glance-16.0.1/AUTHORS --- glance-16.0.0/AUTHORS 2018-02-28 11:34:07.000000000 +0000 +++ glance-16.0.1/AUTHORS 2018-04-24 18:19:40.000000000 +0000 @@ -294,6 +294,7 @@ Michael Still Michal Dulko Mike Abrams +Mike Bayer Mike Fedosin Mike Fedosin Mike Lundy diff -Nru glance-16.0.0/ChangeLog glance-16.0.1/ChangeLog --- glance-16.0.0/ChangeLog 2018-02-28 11:34:06.000000000 +0000 +++ glance-16.0.1/ChangeLog 2018-04-24 18:19:40.000000000 +0000 @@ -1,6 +1,22 @@ CHANGES ======= +16.0.1 +------ + +* Releasenotes for 16.0.1 +* Update image schema with Image API 2.6 statuses +* Update installation guide: no uwsgi for glance +* Use 'Default' as sample install domain name +* Functional tests for new Image Import API +* Update auth\_url in install docs +* Fix web-download fails with default node\_staging\_uri +* Python 3.5: Image Import fails with Unicode Error +* Use oslo\_db.sqlalchemy.test\_fixtures +* Use config opt value to determine import methods +* Add barbican-tempest experimental job +* Imported Translations from Zanata + 16.0.0 ------ diff -Nru glance-16.0.0/debian/changelog glance-16.0.1/debian/changelog --- glance-16.0.0/debian/changelog 2018-02-28 23:23:54.000000000 +0000 +++ glance-16.0.1/debian/changelog 2018-05-03 21:59:23.000000000 +0000 @@ -1,8 +1,16 @@ -glance (2:16.0.0-0ubuntu1~cloud0) xenial-queens; urgency=medium +glance (2:16.0.1-0ubuntu1.1~cloud0) xenial-queens; urgency=medium * New upstream release for the Ubuntu Cloud Archive. - -- Openstack Ubuntu Testing Bot Wed, 28 Feb 2018 23:23:54 +0000 + -- Openstack Ubuntu Testing Bot Thu, 03 May 2018 21:59:23 +0000 + +glance (2:16.0.1-0ubuntu1.1) bionic; urgency=medium + + * New stable point release for OpenStack Queens (LP: #1767128). + * d/p/add-root-tar-support.patch: Rebased. + * d/gbp.conf: Create stable/queens branch. + + -- Corey Bryant Wed, 02 May 2018 15:11:30 -0400 glance (2:16.0.0-0ubuntu1) bionic; urgency=medium diff -Nru glance-16.0.0/debian/gbp.conf glance-16.0.1/debian/gbp.conf --- glance-16.0.0/debian/gbp.conf 2018-02-28 18:46:27.000000000 +0000 +++ glance-16.0.1/debian/gbp.conf 2018-05-02 19:11:30.000000000 +0000 @@ -1,5 +1,5 @@ [DEFAULT] -debian-branch = master +debian-branch = stable/queens upstream-tag = %(version)s pristine-tar = True diff -Nru glance-16.0.0/debian/patches/add-root-tar-support.patch glance-16.0.1/debian/patches/add-root-tar-support.patch --- glance-16.0.0/debian/patches/add-root-tar-support.patch 2018-02-28 18:46:27.000000000 +0000 +++ glance-16.0.1/debian/patches/add-root-tar-support.patch 2018-05-02 19:11:30.000000000 +0000 @@ -13,7 +13,7 @@ --- a/doc/source/user/glanceapi.rst +++ b/doc/source/user/glanceapi.rst -@@ -514,7 +514,7 @@ +@@ -516,7 +516,7 @@ This header is required, unless reserving an image. Valid values are one of ``aki``, ``ari``, ``ami``, ``raw``, ``iso``, ``vhd``, ``vhdx``, ``vdi``, @@ -24,7 +24,7 @@ --- a/etc/glance-api.conf +++ b/etc/glance-api.conf -@@ -3277,7 +3277,7 @@ +@@ -3466,7 +3466,7 @@ # Supported values for the 'disk_format' image attribute (list value) # Deprecated group/name - [DEFAULT]/disk_formats @@ -46,7 +46,7 @@ deprecated_opts=[cfg.DeprecatedOpt('disk_formats', --- a/glance/tests/unit/v2/test_images_resource.py +++ b/glance/tests/unit/v2/test_images_resource.py -@@ -3879,7 +3879,7 @@ +@@ -4093,7 +4093,7 @@ def test_default_disk_formats(self): schema = glance.api.v2.images.get_schema() expected = [None, 'ami', 'ari', 'aki', 'vhd', 'vhdx', 'vmdk', diff -Nru glance-16.0.0/doc/source/install/get-started.rst glance-16.0.1/doc/source/install/get-started.rst --- glance-16.0.0/doc/source/install/get-started.rst 2018-02-28 11:31:29.000000000 +0000 +++ glance-16.0.1/doc/source/install/get-started.rst 2018-04-24 18:17:09.000000000 +0000 @@ -41,6 +41,18 @@ glance-api Accepts Image API calls for image discovery, retrieval, and storage. + .. note:: + + An OpenStack Community Goal in the Pike release was `Control Plane API + endpoints deployment via WSGI`_. As currently constituted, however, + glance-api is **not suitable** to be run in such a configuration. Instead + we recommend that Glance be run in the traditional manner as a standalone + server. See the "Known Issues" section of the `Glance Release Notes`_ for + the Pike and Queens releases for more information. + + .. _`Control Plane API endpoints deployment via WSGI`: https://governance.openstack.org/tc/goals/pike/deploy-api-in-wsgi.html + .. _`Glance Release Notes`: https://docs.openstack.org/releasenotes/glance/index.html + glance-registry Stores, processes, and retrieves metadata about images. Metadata includes items such as size and type. diff -Nru glance-16.0.0/doc/source/install/index.rst glance-16.0.1/doc/source/install/index.rst --- glance-16.0.0/doc/source/install/index.rst 2018-02-28 11:31:29.000000000 +0000 +++ glance-16.0.1/doc/source/install/index.rst 2018-04-24 18:17:16.000000000 +0000 @@ -23,23 +23,3 @@ get-started install.rst verify.rst - -Ocata -~~~~~ - -To install Glance, see the Ocata Image service install guide for -each distribution: - -- `Ubuntu `__ -- `CentOS and RHEL `__ -- `openSUSE and SUSE Linux Enterprise `__ - -Newton -~~~~~~ - -To install Glance, see the Newton Image service install guide for -each distribution: - -- `Ubuntu `__ -- `CentOS and RHEL `__ -- `openSUSE and SUSE Linux Enterprise `__ diff -Nru glance-16.0.0/doc/source/install/install-debian.rst glance-16.0.1/doc/source/install/install-debian.rst --- glance-16.0.0/doc/source/install/install-debian.rst 2018-02-28 11:31:29.000000000 +0000 +++ glance-16.0.1/doc/source/install/install-debian.rst 2018-04-24 18:17:16.000000000 +0000 @@ -210,11 +210,11 @@ [keystone_authtoken] # ... auth_uri = http://controller:5000 - auth_url = http://controller:35357 + auth_url = http://controller:5000 memcached_servers = controller:11211 auth_type = password - project_domain_name = default - user_domain_name = default + project_domain_name = Default + user_domain_name = Default project_name = service username = glance password = GLANCE_PASS @@ -275,11 +275,11 @@ [keystone_authtoken] # ... auth_uri = http://controller:5000 - auth_url = http://controller:35357 + auth_url = http://controller:5000 memcached_servers = controller:11211 auth_type = password - project_domain_name = default - user_domain_name = default + project_domain_name = Default + user_domain_name = Default project_name = service username = glance password = GLANCE_PASS diff -Nru glance-16.0.0/doc/source/install/install-obs.rst glance-16.0.1/doc/source/install/install-obs.rst --- glance-16.0.0/doc/source/install/install-obs.rst 2018-02-28 11:31:29.000000000 +0000 +++ glance-16.0.1/doc/source/install/install-obs.rst 2018-04-24 18:17:16.000000000 +0000 @@ -224,11 +224,11 @@ [keystone_authtoken] # ... auth_uri = http://controller:5000 - auth_url = http://controller:35357 + auth_url = http://controller:5000 memcached_servers = controller:11211 auth_type = password - project_domain_name = default - user_domain_name = default + project_domain_name = Default + user_domain_name = Default project_name = service username = glance password = GLANCE_PASS @@ -289,11 +289,11 @@ [keystone_authtoken] # ... auth_uri = http://controller:5000 - auth_url = http://controller:35357 + auth_url = http://controller:5000 memcached_servers = controller:11211 auth_type = password - project_domain_name = default - user_domain_name = default + project_domain_name = Default + user_domain_name = Default project_name = service username = glance password = GLANCE_PASS diff -Nru glance-16.0.0/doc/source/install/install-rdo.rst glance-16.0.1/doc/source/install/install-rdo.rst --- glance-16.0.0/doc/source/install/install-rdo.rst 2018-02-28 11:31:29.000000000 +0000 +++ glance-16.0.1/doc/source/install/install-rdo.rst 2018-04-24 18:17:16.000000000 +0000 @@ -210,11 +210,11 @@ [keystone_authtoken] # ... auth_uri = http://controller:5000 - auth_url = http://controller:35357 + auth_url = http://controller:5000 memcached_servers = controller:11211 auth_type = password - project_domain_name = default - user_domain_name = default + project_domain_name = Default + user_domain_name = Default project_name = service username = glance password = GLANCE_PASS @@ -275,11 +275,11 @@ [keystone_authtoken] # ... auth_uri = http://controller:5000 - auth_url = http://controller:35357 + auth_url = http://controller:5000 memcached_servers = controller:11211 auth_type = password - project_domain_name = default - user_domain_name = default + project_domain_name = Default + user_domain_name = Default project_name = service username = glance password = GLANCE_PASS diff -Nru glance-16.0.0/doc/source/install/install-ubuntu.rst glance-16.0.1/doc/source/install/install-ubuntu.rst --- glance-16.0.0/doc/source/install/install-ubuntu.rst 2018-02-28 11:31:29.000000000 +0000 +++ glance-16.0.1/doc/source/install/install-ubuntu.rst 2018-04-24 18:17:16.000000000 +0000 @@ -210,11 +210,11 @@ [keystone_authtoken] # ... auth_uri = http://controller:5000 - auth_url = http://controller:35357 + auth_url = http://controller:5000 memcached_servers = controller:11211 auth_type = password - project_domain_name = default - user_domain_name = default + project_domain_name = Default + user_domain_name = Default project_name = service username = glance password = GLANCE_PASS @@ -275,11 +275,11 @@ [keystone_authtoken] # ... auth_uri = http://controller:5000 - auth_url = http://controller:35357 + auth_url = http://controller:5000 memcached_servers = controller:11211 auth_type = password - project_domain_name = default - user_domain_name = default + project_domain_name = Default + user_domain_name = Default project_name = service username = glance password = GLANCE_PASS diff -Nru glance-16.0.0/glance/api/v2/images.py glance-16.0.1/glance/api/v2/images.py --- glance-16.0.0/glance/api/v2/images.py 2018-02-28 11:31:29.000000000 +0000 +++ glance-16.0.1/glance/api/v2/images.py 2018-04-24 18:17:09.000000000 +0000 @@ -817,7 +817,7 @@ except KeyError: msg = _("Import request requires a 'name' field.") raise webob.exc.HTTPBadRequest(explanation=msg) - if method_name not in ['glance-direct', 'web-download']: + if method_name not in CONF.enabled_import_methods: msg = _("Unknown import method name '%s'.") % method_name raise webob.exc.HTTPBadRequest(explanation=msg) @@ -968,7 +968,8 @@ 'readOnly': True, 'description': _('Status of the image'), 'enum': ['queued', 'saving', 'active', 'killed', - 'deleted', 'pending_delete', 'deactivated'], + 'deleted', 'uploading', 'importing', + 'pending_delete', 'deactivated'], }, 'visibility': { 'type': 'string', diff -Nru glance-16.0.0/glance/async/flows/api_image_import.py glance-16.0.1/glance/async/flows/api_image_import.py --- glance-16.0.0/glance/async/flows/api_image_import.py 2018-02-28 11:31:29.000000000 +0000 +++ glance-16.0.1/glance/async/flows/api_image_import.py 2018-04-24 18:17:09.000000000 +0000 @@ -307,10 +307,11 @@ import_method = kwargs.get('import_req')['method']['name'] uri = kwargs.get('import_req')['method'].get('uri') + separator = '' + if not CONF.node_staging_uri.endswith('/'): + separator = '/' + if not uri and import_method == 'glance-direct': - separator = '' - if not CONF.node_staging_uri.endswith('/'): - separator = '/' uri = separator.join((CONF.node_staging_uri, str(image_id))) flow = lf.Flow(task_type, retry=retry.AlwaysRevert()) @@ -318,8 +319,6 @@ if import_method == 'web-download': downloadToStaging = internal_plugins.get_import_plugin(**kwargs) flow.add(downloadToStaging) - if not CONF.node_staging_uri.endswith('/'): - separator = '/' file_uri = separator.join((CONF.node_staging_uri, str(image_id))) else: file_uri = uri diff -Nru glance-16.0.0/glance/common/scripts/utils.py glance-16.0.1/glance/common/scripts/utils.py --- glance-16.0.0/glance/common/scripts/utils.py 2018-02-28 11:31:29.000000000 +0000 +++ glance-16.0.1/glance/common/scripts/utils.py 2018-04-24 18:17:09.000000000 +0000 @@ -136,6 +136,6 @@ # # We're not using StringIO or other tools to avoid reading everything # into memory. Some images may be quite heavy. - return open(uri, "r") + return open(uri, "rb") return urllib.request.urlopen(uri) diff -Nru glance-16.0.0/glance/locale/en_GB/LC_MESSAGES/glance.po glance-16.0.1/glance/locale/en_GB/LC_MESSAGES/glance.po --- glance-16.0.0/glance/locale/en_GB/LC_MESSAGES/glance.po 2018-02-28 11:31:34.000000000 +0000 +++ glance-16.0.1/glance/locale/en_GB/LC_MESSAGES/glance.po 2018-04-24 18:17:16.000000000 +0000 @@ -12,16 +12,16 @@ msgstr "" "Project-Id-Version: glance VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2018-02-16 17:15+0000\n" +"POT-Creation-Date: 2018-02-22 09:19+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2018-02-16 02:04+0000\n" +"PO-Revision-Date: 2018-02-22 05:11+0000\n" "Last-Translator: Andi Chandler \n" -"Language: en-GB\n" +"Language: en_GB\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Generated-By: Babel 2.0\n" -"X-Generator: Zanata 3.9.6\n" +"X-Generator: Zanata 4.3.3\n" "Language-Team: English (United Kingdom)\n" #, python-format @@ -3834,6 +3834,9 @@ "database version up to \"%(e_rev)s\" revision. But, current revisions are: " "%(curr_revs)s " +msgid "Database expansion is up to date. No expansion needed." +msgstr "Database expansion is up to date. No expansion needed." + msgid "Database is currently not under Alembic's migration control." msgstr "Database is currently not under Alembic's migration control." @@ -3855,6 +3858,9 @@ msgid "Database is up to date. No upgrades needed." msgstr "Database is up to date. No upgrades needed." +msgid "Database migration is up to date. No migration needed." +msgstr "Database migration is up to date. No migration needed." + msgid "Date and time of image member creation" msgstr "Date and time of image member creation" diff -Nru glance-16.0.0/glance/locale/ko_KR/LC_MESSAGES/glance.po glance-16.0.1/glance/locale/ko_KR/LC_MESSAGES/glance.po --- glance-16.0.0/glance/locale/ko_KR/LC_MESSAGES/glance.po 2018-02-28 11:31:29.000000000 +0000 +++ glance-16.0.1/glance/locale/ko_KR/LC_MESSAGES/glance.po 2018-04-24 18:17:16.000000000 +0000 @@ -7,18 +7,18 @@ # Andreas Jaeger , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: glance 15.0.0.0b3.dev29\n" +"Project-Id-Version: glance VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2017-06-23 20:54+0000\n" +"POT-Creation-Date: 2018-02-22 09:19+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2016-04-12 05:21+0000\n" "Last-Translator: Copied by Zanata \n" -"Language: ko-KR\n" +"Language: ko_KR\n" "Plural-Forms: nplurals=1; plural=0;\n" "Generated-By: Babel 2.0\n" -"X-Generator: Zanata 3.9.6\n" +"X-Generator: Zanata 4.3.3\n" "Language-Team: Korean (South Korea)\n" #, python-format diff -Nru glance-16.0.0/glance/locale/pt_BR/LC_MESSAGES/glance.po glance-16.0.1/glance/locale/pt_BR/LC_MESSAGES/glance.po --- glance-16.0.0/glance/locale/pt_BR/LC_MESSAGES/glance.po 2018-02-28 11:31:29.000000000 +0000 +++ glance-16.0.1/glance/locale/pt_BR/LC_MESSAGES/glance.po 2018-04-24 18:17:16.000000000 +0000 @@ -10,18 +10,18 @@ # Andreas Jaeger , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: glance 15.0.0.0b3.dev29\n" +"Project-Id-Version: glance VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2017-06-23 20:54+0000\n" +"POT-Creation-Date: 2018-02-22 09:19+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2016-04-12 05:22+0000\n" "Last-Translator: Copied by Zanata \n" -"Language: pt-BR\n" +"Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "Generated-By: Babel 2.0\n" -"X-Generator: Zanata 3.9.6\n" +"X-Generator: Zanata 4.3.3\n" "Language-Team: Portuguese (Brazil)\n" #, python-format diff -Nru glance-16.0.0/glance/locale/tr_TR/LC_MESSAGES/glance.po glance-16.0.1/glance/locale/tr_TR/LC_MESSAGES/glance.po --- glance-16.0.0/glance/locale/tr_TR/LC_MESSAGES/glance.po 2018-02-28 11:31:29.000000000 +0000 +++ glance-16.0.1/glance/locale/tr_TR/LC_MESSAGES/glance.po 2018-04-24 18:17:16.000000000 +0000 @@ -7,18 +7,18 @@ # Andreas Jaeger , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: glance 15.0.0.0b3.dev29\n" +"Project-Id-Version: glance VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2017-06-23 20:54+0000\n" +"POT-Creation-Date: 2018-02-22 09:19+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2016-04-12 05:22+0000\n" "Last-Translator: Copied by Zanata \n" -"Language: tr-TR\n" +"Language: tr_TR\n" "Plural-Forms: nplurals=1; plural=0;\n" "Generated-By: Babel 2.0\n" -"X-Generator: Zanata 3.9.6\n" +"X-Generator: Zanata 4.3.3\n" "Language-Team: Turkish (Turkey)\n" #, python-format diff -Nru glance-16.0.0/glance/locale/zh_CN/LC_MESSAGES/glance.po glance-16.0.1/glance/locale/zh_CN/LC_MESSAGES/glance.po --- glance-16.0.0/glance/locale/zh_CN/LC_MESSAGES/glance.po 2018-02-28 11:31:29.000000000 +0000 +++ glance-16.0.1/glance/locale/zh_CN/LC_MESSAGES/glance.po 2018-04-24 18:17:16.000000000 +0000 @@ -13,18 +13,18 @@ # blkart , 2017. #zanata msgid "" msgstr "" -"Project-Id-Version: glance 15.0.0.0b3.dev29\n" +"Project-Id-Version: glance VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2017-06-23 20:54+0000\n" +"POT-Creation-Date: 2018-02-22 09:19+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2017-06-24 04:45+0000\n" "Last-Translator: blkart \n" -"Language: zh-CN\n" +"Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" "Generated-By: Babel 2.0\n" -"X-Generator: Zanata 3.9.6\n" +"X-Generator: Zanata 4.3.3\n" "Language-Team: Chinese (China)\n" #, python-format diff -Nru glance-16.0.0/glance/locale/zh_TW/LC_MESSAGES/glance.po glance-16.0.1/glance/locale/zh_TW/LC_MESSAGES/glance.po --- glance-16.0.0/glance/locale/zh_TW/LC_MESSAGES/glance.po 2018-02-28 11:31:29.000000000 +0000 +++ glance-16.0.1/glance/locale/zh_TW/LC_MESSAGES/glance.po 2018-04-24 18:17:16.000000000 +0000 @@ -6,18 +6,18 @@ # Andreas Jaeger , 2016. #zanata msgid "" msgstr "" -"Project-Id-Version: glance 15.0.0.0b3.dev29\n" +"Project-Id-Version: glance VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2017-06-23 20:54+0000\n" +"POT-Creation-Date: 2018-02-22 09:19+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2016-04-12 05:23+0000\n" "Last-Translator: Copied by Zanata \n" -"Language: zh-TW\n" +"Language: zh_TW\n" "Plural-Forms: nplurals=1; plural=0;\n" "Generated-By: Babel 2.0\n" -"X-Generator: Zanata 3.9.6\n" +"X-Generator: Zanata 4.3.3\n" "Language-Team: Chinese (Taiwan)\n" #, python-format diff -Nru glance-16.0.0/glance/tests/functional/db/test_migrations.py glance-16.0.1/glance/tests/functional/db/test_migrations.py --- glance-16.0.0/glance/tests/functional/db/test_migrations.py 2018-02-28 11:31:29.000000000 +0000 +++ glance-16.0.1/glance/tests/functional/db/test_migrations.py 2018-04-24 18:17:09.000000000 +0000 @@ -19,8 +19,9 @@ from alembic import command as alembic_command from alembic import script as alembic_script +from oslo_db.sqlalchemy import enginefacade +from oslo_db.sqlalchemy import test_fixtures from oslo_db.sqlalchemy import test_migrations -from oslo_db.tests.sqlalchemy import base as test_base import sqlalchemy.types as types from glance.db.sqlalchemy import alembic_migrations @@ -32,6 +33,11 @@ class AlembicMigrationsMixin(object): + def setUp(self): + super(AlembicMigrationsMixin, self).setUp() + + self.engine = enginefacade.writer.get_engine() + def _get_revisions(self, config, head=None): head = head or 'heads' scripts_dir = alembic_script.ScriptDirectory.from_config(config) @@ -62,8 +68,10 @@ with_data=True) -class TestMysqlMigrations(test_base.MySQLOpportunisticTestCase, - AlembicMigrationsMixin): +class TestMysqlMigrations(test_fixtures.OpportunisticDBTestMixin, + AlembicMigrationsMixin, + test_utils.BaseTestCase): + FIXTURE = test_fixtures.MySQLOpportunisticFixture def test_mysql_innodb_tables(self): test_utils.db_sync(engine=self.engine) @@ -86,16 +94,20 @@ self.assertEqual(0, count, "%d non InnoDB tables created" % count) -class TestPostgresqlMigrations(test_base.PostgreSQLOpportunisticTestCase, - AlembicMigrationsMixin): - pass +class TestPostgresqlMigrations(test_fixtures.OpportunisticDBTestMixin, + AlembicMigrationsMixin, + test_utils.BaseTestCase): + FIXTURE = test_fixtures.PostgresqlOpportunisticFixture -class TestSqliteMigrations(test_base.DbTestCase, AlembicMigrationsMixin): +class TestSqliteMigrations(test_fixtures.OpportunisticDBTestMixin, + AlembicMigrationsMixin, + test_utils.BaseTestCase): pass -class TestMigrations(test_base.DbTestCase, test_utils.BaseTestCase): +class TestMigrations(test_fixtures.OpportunisticDBTestMixin, + test_utils.BaseTestCase): def test_no_downgrade(self): migrate_file = versions.__path__[0] @@ -114,6 +126,9 @@ class ModelsMigrationSyncMixin(object): + def setUp(self): + super(ModelsMigrationSyncMixin, self).setUp() + self.engine = enginefacade.writer.get_engine() def get_metadata(self): for table in models_metadef.BASE_DICT.metadata.sorted_tables: @@ -156,17 +171,20 @@ class ModelsMigrationsSyncMysql(ModelsMigrationSyncMixin, test_migrations.ModelsMigrationsSync, - test_base.MySQLOpportunisticTestCase): - pass + test_fixtures.OpportunisticDBTestMixin, + test_utils.BaseTestCase): + FIXTURE = test_fixtures.MySQLOpportunisticFixture class ModelsMigrationsSyncPostgres(ModelsMigrationSyncMixin, test_migrations.ModelsMigrationsSync, - test_base.PostgreSQLOpportunisticTestCase): - pass + test_fixtures.OpportunisticDBTestMixin, + test_utils.BaseTestCase): + FIXTURE = test_fixtures.PostgresqlOpportunisticFixture class ModelsMigrationsSyncSqlite(ModelsMigrationSyncMixin, test_migrations.ModelsMigrationsSync, - test_base.DbTestCase): + test_fixtures.OpportunisticDBTestMixin, + test_utils.BaseTestCase): pass diff -Nru glance-16.0.0/glance/tests/functional/v2/test_images.py glance-16.0.1/glance/tests/functional/v2/test_images.py --- glance-16.0.0/glance/tests/functional/v2/test_images.py 2018-02-28 11:31:29.000000000 +0000 +++ glance-16.0.1/glance/tests/functional/v2/test_images.py 2018-04-24 18:17:09.000000000 +0000 @@ -15,6 +15,7 @@ import os import signal +import time import uuid from oslo_serialization import jsonutils @@ -135,6 +136,269 @@ self.assertEqual(http.UNAUTHORIZED, response.status_code) self.stop_servers() + def test_image_import_using_glance_direct(self): + self.api_server.enable_image_import = True + self.start_servers(**self.__dict__.copy()) + + # Image list should be empty + path = self._url('/v2/images') + response = requests.get(path, headers=self._headers()) + self.assertEqual(http.OK, response.status_code) + images = jsonutils.loads(response.text)['images'] + self.assertEqual(0, len(images)) + + # glance-direct should be available in discovery response + path = self._url('/v2/info/import') + response = requests.get(path, headers=self._headers()) + self.assertEqual(http.OK, response.status_code) + discovery_calls = jsonutils.loads( + response.text)['import-methods']['value'] + self.assertIn("glance-direct", discovery_calls) + + # Create an image + path = self._url('/v2/images') + headers = self._headers({'content-type': 'application/json'}) + data = jsonutils.dumps({'name': 'image-1', 'type': 'kernel', + 'disk_format': 'aki', + 'container_format': 'aki'}) + response = requests.post(path, headers=headers, data=data) + self.assertEqual(http.CREATED, response.status_code) + + # Returned image entity should have a generated id and status + image = jsonutils.loads(response.text) + image_id = image['id'] + checked_keys = set([ + u'status', + u'name', + u'tags', + u'created_at', + u'updated_at', + u'visibility', + u'self', + u'protected', + u'id', + u'file', + u'min_disk', + u'type', + u'min_ram', + u'schema', + u'disk_format', + u'container_format', + u'owner', + u'checksum', + u'size', + u'virtual_size', + ]) + self.assertEqual(checked_keys, set(image.keys())) + expected_image = { + 'status': 'queued', + 'name': 'image-1', + 'tags': [], + 'visibility': 'shared', + 'self': '/v2/images/%s' % image_id, + 'protected': False, + 'file': '/v2/images/%s/file' % image_id, + 'min_disk': 0, + 'type': 'kernel', + 'min_ram': 0, + 'schema': '/v2/schemas/image', + } + for key, value in expected_image.items(): + self.assertEqual(value, image[key], key) + + # Image list should now have one entry + path = self._url('/v2/images') + response = requests.get(path, headers=self._headers()) + self.assertEqual(http.OK, response.status_code) + images = jsonutils.loads(response.text)['images'] + self.assertEqual(1, len(images)) + self.assertEqual(image_id, images[0]['id']) + + def _verify_image_checksum_and_status(checksum=None, status=None): + # Checksum should be populated and status should be active + path = self._url('/v2/images/%s' % image_id) + response = requests.get(path, headers=self._headers()) + self.assertEqual(http.OK, response.status_code) + image = jsonutils.loads(response.text) + self.assertEqual(checksum, image['checksum']) + self.assertEqual(status, image['status']) + + # Upload some image data to staging area + path = self._url('/v2/images/%s/stage' % image_id) + headers = self._headers({'Content-Type': 'application/octet-stream'}) + response = requests.put(path, headers=headers, data='ZZZZZ') + self.assertEqual(http.NO_CONTENT, response.status_code) + + # Verify image is in uploading state and checksum is None + _verify_image_checksum_and_status(status='uploading') + + # Import image to store + path = self._url('/v2/images/%s/import' % image_id) + headers = self._headers({ + 'content-type': 'application/json', + 'X-Roles': 'admin', + }) + data = jsonutils.dumps({'method': { + 'name': 'glance-direct' + }}) + response = requests.post(path, headers=headers, data=data) + self.assertEqual(http.ACCEPTED, response.status_code) + + # Verify image is in active state and checksum is set + # NOTE(abhishekk): As import is a async call we need to provide + # some timelap to complete the call. + time.sleep(0.5) + _verify_image_checksum_and_status( + checksum='8f113e38d28a79a5a451b16048cc2b72', + status='active') + + # Ensure the size is updated to reflect the data uploaded + path = self._url('/v2/images/%s' % image_id) + response = requests.get(path, headers=self._headers()) + self.assertEqual(http.OK, response.status_code) + self.assertEqual(5, jsonutils.loads(response.text)['size']) + + # Deleting image should work + path = self._url('/v2/images/%s' % image_id) + response = requests.delete(path, headers=self._headers()) + self.assertEqual(http.NO_CONTENT, response.status_code) + + # Image list should now be empty + path = self._url('/v2/images') + response = requests.get(path, headers=self._headers()) + self.assertEqual(http.OK, response.status_code) + images = jsonutils.loads(response.text)['images'] + self.assertEqual(0, len(images)) + + self.stop_servers() + + def test_image_import_using_web_download(self): + self.api_server.enable_image_import = True + self.config(node_staging_uri="file:///tmp/staging/") + self.start_servers(**self.__dict__.copy()) + + # Image list should be empty + path = self._url('/v2/images') + response = requests.get(path, headers=self._headers()) + self.assertEqual(http.OK, response.status_code) + images = jsonutils.loads(response.text)['images'] + self.assertEqual(0, len(images)) + + # web-download should be available in discovery response + path = self._url('/v2/info/import') + response = requests.get(path, headers=self._headers()) + self.assertEqual(http.OK, response.status_code) + discovery_calls = jsonutils.loads( + response.text)['import-methods']['value'] + self.assertIn("web-download", discovery_calls) + + # Create an image + path = self._url('/v2/images') + headers = self._headers({'content-type': 'application/json'}) + data = jsonutils.dumps({'name': 'image-1', 'type': 'kernel', + 'disk_format': 'aki', + 'container_format': 'aki'}) + response = requests.post(path, headers=headers, data=data) + self.assertEqual(http.CREATED, response.status_code) + + # Returned image entity should have a generated id and status + image = jsonutils.loads(response.text) + image_id = image['id'] + checked_keys = set([ + u'status', + u'name', + u'tags', + u'created_at', + u'updated_at', + u'visibility', + u'self', + u'protected', + u'id', + u'file', + u'min_disk', + u'type', + u'min_ram', + u'schema', + u'disk_format', + u'container_format', + u'owner', + u'checksum', + u'size', + u'virtual_size', + ]) + self.assertEqual(checked_keys, set(image.keys())) + expected_image = { + 'status': 'queued', + 'name': 'image-1', + 'tags': [], + 'visibility': 'shared', + 'self': '/v2/images/%s' % image_id, + 'protected': False, + 'file': '/v2/images/%s/file' % image_id, + 'min_disk': 0, + 'type': 'kernel', + 'min_ram': 0, + 'schema': '/v2/schemas/image', + } + for key, value in expected_image.items(): + self.assertEqual(value, image[key], key) + + # Image list should now have one entry + path = self._url('/v2/images') + response = requests.get(path, headers=self._headers()) + self.assertEqual(http.OK, response.status_code) + images = jsonutils.loads(response.text)['images'] + self.assertEqual(1, len(images)) + self.assertEqual(image_id, images[0]['id']) + + def _verify_image_checksum_and_status(checksum=None, status=None): + # Checksum should be populated and status should be active + path = self._url('/v2/images/%s' % image_id) + response = requests.get(path, headers=self._headers()) + self.assertEqual(http.OK, response.status_code) + image = jsonutils.loads(response.text) + self.assertEqual(checksum, image['checksum']) + self.assertEqual(status, image['status']) + + # Verify image is in queued state and checksum is None + _verify_image_checksum_and_status(status='queued') + + # Import image to store + path = self._url('/v2/images/%s/import' % image_id) + headers = self._headers({ + 'content-type': 'application/json', + 'X-Roles': 'admin', + }) + data = jsonutils.dumps({'method': { + 'name': 'web-download', + 'uri': 'https://www.openstack.org/assets/openstack-logo/' + '2016R/OpenStack-Logo-Horizontal.eps.zip' + }}) + response = requests.post(path, headers=headers, data=data) + self.assertEqual(http.ACCEPTED, response.status_code) + + # Verify image is in active state and checksum is set + # NOTE(abhishekk): As import is a async call we need to provide + # some timelap to complete the call. + time.sleep(5) + _verify_image_checksum_and_status( + checksum='bcd65f8922f61a9e6a20572ad7aa2bdd', + status='active') + + # Deleting image should work + path = self._url('/v2/images/%s' % image_id) + response = requests.delete(path, headers=self._headers()) + self.assertEqual(http.NO_CONTENT, response.status_code) + + # Image list should now be empty + path = self._url('/v2/images') + response = requests.get(path, headers=self._headers()) + self.assertEqual(http.OK, response.status_code) + images = jsonutils.loads(response.text)['images'] + self.assertEqual(0, len(images)) + + self.stop_servers() + def test_image_lifecycle(self): # Image list should be empty self.api_server.show_multiple_locations = True diff -Nru glance-16.0.0/glance/tests/unit/async/flows/test_api_image_import.py glance-16.0.1/glance/tests/unit/async/flows/test_api_image_import.py --- glance-16.0.0/glance/tests/unit/async/flows/test_api_image_import.py 1970-01-01 00:00:00.000000000 +0000 +++ glance-16.0.1/glance/tests/unit/async/flows/test_api_image_import.py 2018-04-24 18:17:09.000000000 +0000 @@ -0,0 +1,90 @@ +# Copyright 2018 Verizon Wireless +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import mock + +from oslo_config import cfg + +import glance.async.flows.api_image_import as import_flow +import glance.tests.utils as test_utils + +CONF = cfg.CONF + +TASK_TYPE = 'api_image_import' +TASK_ID1 = 'dbbe7231-020f-4311-87e1-5aaa6da56c02' +IMAGE_ID1 = '41f5b3b0-f54c-4cef-bd45-ce3e376a142f' + + +class TestApiImageImportTask(test_utils.BaseTestCase): + + def setUp(self): + super(TestApiImageImportTask, self).setUp() + + self.wd_task_input = { + "import_req": { + "method": { + "name": "web-download", + "uri": "http://example.com/image.browncow" + } + } + } + + self.gd_task_input = { + "import_req": { + "method": { + "name": "glance-direct" + } + } + } + + self.mock_task_repo = mock.MagicMock() + self.mock_image_repo = mock.MagicMock() + + @mock.patch('glance.async.flows.api_image_import._VerifyStaging.__init__') + @mock.patch('taskflow.patterns.linear_flow.Flow.add') + @mock.patch('taskflow.patterns.linear_flow.__init__') + def _pass_uri(self, mock_lf_init, mock_flow_add, mock_VS_init, + uri, file_uri, import_req): + flow_kwargs = {"task_id": TASK_ID1, + "task_type": TASK_TYPE, + "task_repo": self.mock_task_repo, + "image_repo": self.mock_image_repo, + "image_id": IMAGE_ID1, + "import_req": import_req} + + mock_lf_init.return_value = None + mock_VS_init.return_value = None + + self.config(node_staging_uri=uri) + import_flow.get_flow(**flow_kwargs) + mock_VS_init.assert_called_with(TASK_ID1, TASK_TYPE, + self.mock_task_repo, + file_uri) + + def test_get_flow_handles_node_uri_with_ending_slash(self): + test_uri = 'file:///some/where/' + expected_uri = '{0}{1}'.format(test_uri, IMAGE_ID1) + self._pass_uri(uri=test_uri, file_uri=expected_uri, + import_req=self.gd_task_input['import_req']) + self._pass_uri(uri=test_uri, file_uri=expected_uri, + import_req=self.wd_task_input['import_req']) + + def test_get_flow_handles_node_uri_without_ending_slash(self): + test_uri = 'file:///some/where' + expected_uri = '{0}/{1}'.format(test_uri, IMAGE_ID1) + self._pass_uri(uri=test_uri, file_uri=expected_uri, + import_req=self.wd_task_input['import_req']) + self._pass_uri(uri=test_uri, file_uri=expected_uri, + import_req=self.gd_task_input['import_req']) diff -Nru glance-16.0.0/glance/tests/unit/v2/test_images_resource.py glance-16.0.1/glance/tests/unit/v2/test_images_resource.py --- glance-16.0.0/glance/tests/unit/v2/test_images_resource.py 2018-02-28 11:31:29.000000000 +0000 +++ glance-16.0.1/glance/tests/unit/v2/test_images_resource.py 2018-04-24 18:17:16.000000000 +0000 @@ -3158,10 +3158,13 @@ def test_image_import(self): self.config(enable_image_import=True) + # Bug 1754634: make sure that what's considered valid + # is determined by the config option + self.config(enabled_import_methods=['party-time']) request = unit_test_utils.get_fake_request() import_body = { "method": { - "name": "glance-direct" + "name": "party-time" } } request.body = jsonutils.dump_as_bytes(import_body) @@ -3202,18 +3205,29 @@ self.deserializer.import_image, request) - def test_import_image_invalid_import_method(self): - self.config(enable_image_import=True) + def _get_request_for_method(self, method_name): request = unit_test_utils.get_fake_request() import_body = { "method": { - "name": "abcd" + "name": method_name } } request.body = jsonutils.dump_as_bytes(import_body) - self.assertRaises(webob.exc.HTTPBadRequest, - self.deserializer.import_image, - request) + return request + + KNOWN_IMPORT_METHODS = ['glance-direct', 'web-download'] + + def test_import_image_invalid_import_method(self): + self.config(enable_image_import=True) + # Bug 1754634: make sure that what's considered valid + # is determined by the config option. So put known bad + # name in config, and known good name in request + self.config(enabled_import_methods=['bad-method-name']) + for m in self.KNOWN_IMPORT_METHODS: + request = self._get_request_for_method(m) + self.assertRaises(webob.exc.HTTPBadRequest, + self.deserializer.import_image, + request) class TestImagesDeserializerWithExtendedSchema(test_utils.BaseTestCase): diff -Nru glance-16.0.0/glance/tests/unit/v2/test_schemas_resource.py glance-16.0.1/glance/tests/unit/v2/test_schemas_resource.py --- glance-16.0.0/glance/tests/unit/v2/test_schemas_resource.py 2018-02-28 11:31:29.000000000 +0000 +++ glance-16.0.1/glance/tests/unit/v2/test_schemas_resource.py 2018-04-24 18:17:09.000000000 +0000 @@ -14,6 +14,7 @@ # under the License. import glance.api.v2.schemas +import glance.db.sqlalchemy.api as db_api import glance.tests.unit.utils as unit_test_utils import glance.tests.utils as test_utils @@ -35,6 +36,14 @@ 'locations', 'owner', 'virtual_size']) self.assertEqual(expected, set(output['properties'].keys())) + def test_image_has_correct_statuses(self): + req = unit_test_utils.get_fake_request() + output = self.controller.image(req) + self.assertEqual('image', output['name']) + expected_statuses = set(db_api.STATUSES) + actual_statuses = set(output['properties']['status']['enum']) + self.assertEqual(expected_statuses, actual_statuses) + def test_images(self): req = unit_test_utils.get_fake_request() output = self.controller.images(req) diff -Nru glance-16.0.0/glance.egg-info/pbr.json glance-16.0.1/glance.egg-info/pbr.json --- glance-16.0.0/glance.egg-info/pbr.json 2018-02-28 11:34:07.000000000 +0000 +++ glance-16.0.1/glance.egg-info/pbr.json 2018-04-24 18:19:40.000000000 +0000 @@ -1 +1 @@ -{"git_version": "ceb8b9a", "is_release": true} \ No newline at end of file +{"git_version": "42fe71f", "is_release": true} \ No newline at end of file diff -Nru glance-16.0.0/glance.egg-info/PKG-INFO glance-16.0.1/glance.egg-info/PKG-INFO --- glance-16.0.0/glance.egg-info/PKG-INFO 2018-02-28 11:34:07.000000000 +0000 +++ glance-16.0.1/glance.egg-info/PKG-INFO 2018-04-24 18:19:40.000000000 +0000 @@ -1,12 +1,11 @@ Metadata-Version: 1.1 Name: glance -Version: 16.0.0 +Version: 16.0.1 Summary: OpenStack Image Service Home-page: https://docs.openstack.org/glance/latest/ Author: OpenStack Author-email: openstack-dev@lists.openstack.org License: UNKNOWN -Description-Content-Type: UNKNOWN Description: ======================== Team and repository tags ======================== diff -Nru glance-16.0.0/glance.egg-info/SOURCES.txt glance-16.0.1/glance.egg-info/SOURCES.txt --- glance-16.0.0/glance.egg-info/SOURCES.txt 2018-02-28 11:34:09.000000000 +0000 +++ glance-16.0.1/glance.egg-info/SOURCES.txt 2018-04-24 18:19:41.000000000 +0000 @@ -628,6 +628,7 @@ glance/tests/unit/async/test_async.py glance/tests/unit/async/test_taskflow_executor.py glance/tests/unit/async/flows/__init__.py +glance/tests/unit/async/flows/test_api_image_import.py glance/tests/unit/async/flows/test_convert.py glance/tests/unit/async/flows/test_import.py glance/tests/unit/async/flows/test_introspect.py @@ -723,6 +724,7 @@ releasenotes/notes/pike-metadefs-changes-95b54e0bf8bbefd6.yaml releasenotes/notes/pike-rc-1-a5d3f6e8877b52c6.yaml releasenotes/notes/pike-rc-2-acc173005045e16a.yaml +releasenotes/notes/queens-16.0.1-e6b03a36e4df16b2.yaml releasenotes/notes/queens-metadefs-changes-daf02bef18d049f4.yaml releasenotes/notes/queens-release-b6a9f9882c794c24.yaml releasenotes/notes/queens-uwsgi-issues-4cee9e4fdf62c646.yaml diff -Nru glance-16.0.0/PKG-INFO glance-16.0.1/PKG-INFO --- glance-16.0.0/PKG-INFO 2018-02-28 11:34:09.000000000 +0000 +++ glance-16.0.1/PKG-INFO 2018-04-24 18:19:41.000000000 +0000 @@ -1,12 +1,11 @@ Metadata-Version: 1.1 Name: glance -Version: 16.0.0 +Version: 16.0.1 Summary: OpenStack Image Service Home-page: https://docs.openstack.org/glance/latest/ Author: OpenStack Author-email: openstack-dev@lists.openstack.org License: UNKNOWN -Description-Content-Type: UNKNOWN Description: ======================== Team and repository tags ======================== diff -Nru glance-16.0.0/releasenotes/notes/queens-16.0.1-e6b03a36e4df16b2.yaml glance-16.0.1/releasenotes/notes/queens-16.0.1-e6b03a36e4df16b2.yaml --- glance-16.0.0/releasenotes/notes/queens-16.0.1-e6b03a36e4df16b2.yaml 1970-01-01 00:00:00.000000000 +0000 +++ glance-16.0.1/releasenotes/notes/queens-16.0.1-e6b03a36e4df16b2.yaml 2018-04-24 18:17:16.000000000 +0000 @@ -0,0 +1,33 @@ +--- +issues: + - | + 'enabled_import_methods' is ListOpt type config option. If only one method + is enabled, the format needs to be ['method'] this is not obvious as even + the example does not have the '[' and ']' boundaries around the default + value. + - | + If signature verification fails upon creation, the image data will stay + in the backend even though the image goes to 'killed' state. The data + remains even if a user deletes the killed image record. +critical: + - | + Image Import API failure with PY35 has been fixed. + - | + Image Import method 'web-download' failure when 'node_staging_uri' ends + with '/' has been fixed. + - | + Image Import call accepting all implemented methods instead of configured + ones has been rectified. It only accepts import calls for the methods + listed in the config option 'enabled_import_methods' +fixes: + - | + Some documentation and test issues have been addressed in this release on + top of the following bugfixes: + + * Bug 1753964_: web-download fails with default node_staging_uri + * Bug 1759510_: Image Import fails with Python 3.5 + * Bug 1754634_: Image Import call does not honour enabled methods + + .. _1753964: https://code.launchpad.net/bugs/1753964 + .. _1759510: https://code.launchpad.net/bugs/1759510 + .. _1754634: https://code.launchpad.net/bugs/1754634 diff -Nru glance-16.0.0/.zuul.yaml glance-16.0.1/.zuul.yaml --- glance-16.0.0/.zuul.yaml 2018-02-28 11:31:29.000000000 +0000 +++ glance-16.0.1/.zuul.yaml 2018-04-24 18:17:16.000000000 +0000 @@ -7,3 +7,6 @@ jobs: - openstack-tox-functional - openstack-tox-functional-py35 + experimental: + jobs: + - barbican-simple-crypto-devstack-tempest