summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.zuul.yaml87
-rw-r--r--doc/source/admin/interoperable-image-import.rst10
-rw-r--r--etc/rootwrap.conf27
-rw-r--r--glance/api/v2/images.py2
-rw-r--r--glance/async_/__init__.py (renamed from glance/async/__init__.py)0
-rw-r--r--glance/async_/flows/__init__.py (renamed from glance/async/flows/__init__.py)0
-rw-r--r--glance/async_/flows/_internal_plugins/__init__.py (renamed from glance/async/flows/_internal_plugins/__init__.py)0
-rw-r--r--glance/async_/flows/_internal_plugins/web_download.py (renamed from glance/async/flows/_internal_plugins/web_download.py)0
-rw-r--r--glance/async_/flows/api_image_import.py (renamed from glance/async/flows/api_image_import.py)4
-rw-r--r--glance/async_/flows/base_import.py (renamed from glance/async/flows/base_import.py)2
-rw-r--r--glance/async_/flows/convert.py (renamed from glance/async/flows/convert.py)0
-rw-r--r--glance/async_/flows/introspect.py (renamed from glance/async/flows/introspect.py)2
-rw-r--r--glance/async_/flows/ovf_process.py (renamed from glance/async/flows/ovf_process.py)0
-rw-r--r--glance/async_/flows/plugins/__init__.py (renamed from glance/async/flows/plugins/__init__.py)0
-rw-r--r--glance/async_/flows/plugins/image_conversion.py (renamed from glance/async/flows/plugins/image_conversion.py)2
-rw-r--r--glance/async_/flows/plugins/inject_image_metadata.py (renamed from glance/async/flows/plugins/inject_image_metadata.py)0
-rw-r--r--glance/async_/flows/plugins/no_op.py (renamed from glance/async/flows/plugins/no_op.py)0
-rw-r--r--glance/async_/flows/plugins/plugin_opts.py (renamed from glance/async/flows/plugins/plugin_opts.py)8
-rw-r--r--glance/async_/taskflow_executor.py (renamed from glance/async/taskflow_executor.py)4
-rw-r--r--glance/async_/utils.py (renamed from glance/async/utils.py)0
-rw-r--r--glance/common/utils.py2
-rw-r--r--glance/domain/__init__.py2
-rw-r--r--glance/opts.py19
-rw-r--r--glance/tests/stubs.py23
-rw-r--r--glance/tests/unit/async_/__init__.py (renamed from glance/tests/unit/async/__init__.py)0
-rw-r--r--glance/tests/unit/async_/flows/__init__.py (renamed from glance/tests/unit/async/flows/__init__.py)0
-rw-r--r--glance/tests/unit/async_/flows/plugins/__init__.py (renamed from glance/tests/unit/async/flows/plugins/__init__.py)0
-rw-r--r--glance/tests/unit/async_/flows/plugins/test_inject_image_metadata.py (renamed from glance/tests/unit/async/flows/plugins/test_inject_image_metadata.py)2
-rw-r--r--glance/tests/unit/async_/flows/test_api_image_import.py (renamed from glance/tests/unit/async/flows/test_api_image_import.py)4
-rw-r--r--glance/tests/unit/async_/flows/test_convert.py (renamed from glance/tests/unit/async/flows/test_convert.py)4
-rw-r--r--glance/tests/unit/async_/flows/test_import.py (renamed from glance/tests/unit/async/flows/test_import.py)6
-rw-r--r--glance/tests/unit/async_/flows/test_introspect.py (renamed from glance/tests/unit/async/flows/test_introspect.py)4
-rw-r--r--glance/tests/unit/async_/flows/test_ovf_process.py (renamed from glance/tests/unit/async/flows/test_ovf_process.py)2
-rw-r--r--glance/tests/unit/async_/flows/test_web_download.py (renamed from glance/tests/unit/async/flows/test_web_download.py)2
-rw-r--r--glance/tests/unit/async_/test_async.py (renamed from glance/tests/unit/async/test_async.py)12
-rw-r--r--glance/tests/unit/async_/test_taskflow_executor.py (renamed from glance/tests/unit/async/test_taskflow_executor.py)2
-rw-r--r--glance/tests/unit/test_domain.py14
-rw-r--r--glance/tests/unit/test_notifier.py6
-rw-r--r--glance/tests/unit/v2/test_images_resource.py38
-rw-r--r--releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po17
-rw-r--r--setup.cfg19
-rw-r--r--test-requirements.txt1
42 files changed, 187 insertions, 140 deletions
diff --git a/.zuul.yaml b/.zuul.yaml
index 225b140..8ec164a 100644
--- a/.zuul.yaml
+++ b/.zuul.yaml
@@ -184,22 +184,105 @@
184 tox_envlist: functional-py35 184 tox_envlist: functional-py35
185 185
186- project: 186- project:
187 templates:
188 - check-requirements
189 - integrated-gate
190 - integrated-gate-py35
191 - openstack-lower-constraints-jobs
192 - openstack-python-jobs
193 - openstack-python35-jobs
194 - openstack-python36-jobs
195 - periodic-stable-jobs
196 - publish-openstack-docs-pti
197 - release-notes-jobs-python3
187 check: 198 check:
188 jobs: 199 jobs:
189 - openstack-tox-functional 200 - openstack-tox-functional
190 - openstack-tox-functional-py35 201 - openstack-tox-functional-py35
191 - openstack-tox-lower-constraints
192 - glance-eventlet-ssl-handshake-broken-py35: 202 - glance-eventlet-ssl-handshake-broken-py35:
193 voting: false 203 voting: false
204 - devstack-plugin-ceph-tempest:
205 voting: false
206 irrelevant-files:
207 - ^(test-|)requirements.txt$
208 - ^.*\.rst$
209 - ^api-ref/.*$
210 - ^doc/.*$
211 - ^releasenotes/.*$
212 - ^setup.cfg$
213 - ^tox.ini$
214 - tempest-full:
215 irrelevant-files:
216 - ^(test-|)requirements.txt$
217 - ^.*\.rst$
218 - ^api-ref/.*$
219 - ^doc/.*$
220 - ^releasenotes/.*$
221 - ^setup.cfg$
222 - ^tox.ini$
223 - neutron-grenade:
224 irrelevant-files:
225 - ^(test-|)requirements.txt$
226 - ^.*\.rst$
227 - ^api-ref/.*$
228 - ^doc/.*$
229 - ^releasenotes/.*$
230 - ^setup.cfg$
231 - ^tox.ini$
194 gate: 232 gate:
195 jobs: 233 jobs:
196 - openstack-tox-functional 234 - openstack-tox-functional
197 - openstack-tox-functional-py35 235 - openstack-tox-functional-py35
198 - openstack-tox-lower-constraints 236 - tempest-full:
237 irrelevant-files:
238 - ^(test-|)requirements.txt$
239 - ^.*\.rst$
240 - ^api-ref/.*$
241 - ^doc/.*$
242 - ^releasenotes/.*$
243 - ^setup.cfg$
244 - ^tox.ini$
245 - neutron-grenade:
246 irrelevant-files:
247 - ^(test-|)requirements.txt$
248 - ^.*\.rst$
249 - ^api-ref/.*$
250 - ^doc/.*$
251 - ^releasenotes/.*$
252 - ^setup.cfg$
253 - ^tox.ini$
254
199 experimental: 255 experimental:
200 jobs: 256 jobs:
201 - barbican-simple-crypto-devstack-tempest 257 - barbican-simple-crypto-devstack-tempest
202 - glance-dsvm-grenade-multinode 258 - glance-dsvm-grenade-multinode
259 - devstack-plugin-ceph-tempest-py3:
260 irrelevant-files:
261 - ^(test-|)requirements.txt$
262 - ^.*\.rst$
263 - ^api-ref/.*$
264 - ^doc/.*$
265 - ^releasenotes/.*$
266 - ^setup.cfg$
267 - ^tox.ini$
268 - legacy-tempest-dsvm-neutron-pg-full:
269 irrelevant-files:
270 - ^(test-|)requirements.txt$
271 - ^.*\.rst$
272 - ^api-ref/.*$
273 - ^doc/.*$
274 - ^releasenotes/.*$
275 - ^setup.cfg$
276 - ^tox.ini$
277 - legacy-tempest-dsvm-neutron-full-opensuse-423:
278 irrelevant-files:
279 - ^(test-|)requirements.txt$
280 - ^.*\.rst$
281 - ^api-ref/.*$
282 - ^doc/.*$
283 - ^releasenotes/.*$
284 - ^setup.cfg$
285 - ^tox.ini$
203 periodic: 286 periodic:
204 jobs: 287 jobs:
205 - glance-tox-functional-oslo-tips 288 - glance-tox-functional-oslo-tips
diff --git a/doc/source/admin/interoperable-image-import.rst b/doc/source/admin/interoperable-image-import.rst
index f93fdc0..b1b2ae2 100644
--- a/doc/source/admin/interoperable-image-import.rst
+++ b/doc/source/admin/interoperable-image-import.rst
@@ -243,17 +243,17 @@ specified in the ``glance-image-import.conf`` file. The plugins are loaded by
243the Glance project team, these are already registered for you.) 243the Glance project team, these are already registered for you.)
244 244
245A plugin must be written in Python as a `Taskflow "Task" object`_. The file 245A plugin must be written in Python as a `Taskflow "Task" object`_. The file
246containing this object must be present in the ``glance/async/flows/plugins`` 246containing this object must be present in the ``glance/async_/flows/plugins``
247directory. The plugin file must contain a ``get_flow`` function that returns a 247directory. The plugin file must contain a ``get_flow`` function that returns a
248Taskflow Task object wrapped in a linear flow. See the ``no_op`` plugin, 248Taskflow Task object wrapped in a linear flow. See the ``no_op`` plugin,
249located at ``glance/async/flows/plugins/no_op.py`` for an example of how to do 249located at ``glance/async_/flows/plugins/no_op.py`` for an example of how to do
250this. 250this.
251 251
252Specifying the plugins to be used 252Specifying the plugins to be used
253~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
254 254
255First, the plugin code must exist in the directory 255First, the plugin code must exist in the directory
256``glance/async/flows/plugins``. The name of a plugin is the filename (without 256``glance/async_/flows/plugins``. The name of a plugin is the filename (without
257extension) of the file containing the plugin code. For example, a file named 257extension) of the file containing the plugin code. For example, a file named
258``fred_mertz.py`` would contain the plugin ``fred_mertz``. 258``fred_mertz.py`` would contain the plugin ``fred_mertz``.
259 259
@@ -269,7 +269,7 @@ of the form::
269 269
270For example:: 270For example::
271 271
272 no_op = glance.async.flows.plugins.no_op:get_flow 272 no_op = glance.async_.flows.plugins.no_op:get_flow
273 273
274Make sure any plugin you want to use is included here. 274Make sure any plugin you want to use is included here.
275 275
@@ -337,7 +337,7 @@ required.
337 The first section, ``image_import_opts``, is used to enable the plugin by 337 The first section, ``image_import_opts``, is used to enable the plugin by
338 specifying the plugin name as one of the elements of the list that is the 338 specifying the plugin name as one of the elements of the list that is the
339 value of the `image_import_plugins` parameter. The plugin name is simply 339 value of the `image_import_plugins` parameter. The plugin name is simply
340 the module name under glance/async/flows/plugins/ 340 the module name under glance/async\_/flows/plugins/
341 341
342 The second section, ``inject_metadata_properties``, is where you set the 342 The second section, ``inject_metadata_properties``, is where you set the
343 parameters for the injection plugin. (Note that the values you specify here 343 parameters for the injection plugin. (Note that the values you specify here
diff --git a/etc/rootwrap.conf b/etc/rootwrap.conf
deleted file mode 100644
index 7ba70fb..0000000
--- a/etc/rootwrap.conf
+++ /dev/null
@@ -1,27 +0,0 @@
1# Configuration for glance-rootwrap
2# This file should be owned by (and only-writable by) the root user
3
4[DEFAULT]
5# List of directories to load filter definitions from (separated by ',').
6# These directories MUST all be only writeable by root !
7filters_path=/etc/glance/rootwrap.d,/usr/share/glance/rootwrap
8
9# List of directories to search executables in, in case filters do not
10# explicitely specify a full path (separated by ',')
11# If not specified, defaults to system PATH environment variable.
12# These directories MUST all be only writeable by root !
13exec_dirs=/sbin,/usr/sbin,/bin,/usr/bin
14
15# Enable logging to syslog
16# Default value is False
17use_syslog=False
18
19# Which syslog facility to use.
20# Valid values include auth, authpriv, syslog, local0, local1...
21# Default value is 'syslog'
22syslog_log_facility=syslog
23
24# Which messages to log.
25# INFO means log all usage
26# ERROR means only log unsuccessful attempts
27syslog_log_level=ERROR
diff --git a/glance/api/v2/images.py b/glance/api/v2/images.py
index f551bb1..c005546 100644
--- a/glance/api/v2/images.py
+++ b/glance/api/v2/images.py
@@ -391,6 +391,8 @@ class ImagesController(object):
391 # NOTE(flwang): _locations_proxy's setattr method will check if 391 # NOTE(flwang): _locations_proxy's setattr method will check if
392 # the update is acceptable. 392 # the update is acceptable.
393 image.locations = value 393 image.locations = value
394 if image.status == 'queued':
395 image.status = 'active'
394 except (exception.BadStoreUri, exception.DuplicateLocation) as e: 396 except (exception.BadStoreUri, exception.DuplicateLocation) as e:
395 raise webob.exc.HTTPBadRequest(explanation=e.msg) 397 raise webob.exc.HTTPBadRequest(explanation=e.msg)
396 except ValueError as ve: # update image status failed. 398 except ValueError as ve: # update image status failed.
diff --git a/glance/async/__init__.py b/glance/async_/__init__.py
index b637745..b637745 100644
--- a/glance/async/__init__.py
+++ b/glance/async_/__init__.py
diff --git a/glance/async/flows/__init__.py b/glance/async_/flows/__init__.py
index e69de29..e69de29 100644
--- a/glance/async/flows/__init__.py
+++ b/glance/async_/flows/__init__.py
diff --git a/glance/async/flows/_internal_plugins/__init__.py b/glance/async_/flows/_internal_plugins/__init__.py
index 9efada3..9efada3 100644
--- a/glance/async/flows/_internal_plugins/__init__.py
+++ b/glance/async_/flows/_internal_plugins/__init__.py
diff --git a/glance/async/flows/_internal_plugins/web_download.py b/glance/async_/flows/_internal_plugins/web_download.py
index a58e5d0..a58e5d0 100644
--- a/glance/async/flows/_internal_plugins/web_download.py
+++ b/glance/async_/flows/_internal_plugins/web_download.py
diff --git a/glance/async/flows/api_image_import.py b/glance/async_/flows/api_image_import.py
index dc08d37..0511f18 100644
--- a/glance/async/flows/api_image_import.py
+++ b/glance/async_/flows/api_image_import.py
@@ -23,8 +23,8 @@ from taskflow.patterns import linear_flow as lf
23from taskflow import retry 23from taskflow import retry
24from taskflow import task 24from taskflow import task
25 25
26import glance.async.flows._internal_plugins as internal_plugins 26import glance.async_.flows._internal_plugins as internal_plugins
27import glance.async.flows.plugins as import_plugins 27import glance.async_.flows.plugins as import_plugins
28from glance.common import exception 28from glance.common import exception
29from glance.common.scripts.image_import import main as image_import 29from glance.common.scripts.image_import import main as image_import
30from glance.common.scripts import utils as script_utils 30from glance.common.scripts import utils as script_utils
diff --git a/glance/async/flows/base_import.py b/glance/async_/flows/base_import.py
index 18e7655..66a0be1 100644
--- a/glance/async/flows/base_import.py
+++ b/glance/async_/flows/base_import.py
@@ -30,7 +30,7 @@ from taskflow import retry
30from taskflow import task 30from taskflow import task
31from taskflow.types import failure 31from taskflow.types import failure
32 32
33from glance.async import utils 33from glance.async_ import utils
34from glance.common import exception 34from glance.common import exception
35from glance.common.scripts.image_import import main as image_import 35from glance.common.scripts.image_import import main as image_import
36from glance.common.scripts import utils as script_utils 36from glance.common.scripts import utils as script_utils
diff --git a/glance/async/flows/convert.py b/glance/async_/flows/convert.py
index d1b9f1a..d1b9f1a 100644
--- a/glance/async/flows/convert.py
+++ b/glance/async_/flows/convert.py
diff --git a/glance/async/flows/introspect.py b/glance/async_/flows/introspect.py
index 4d39daf..b5f1fb1 100644
--- a/glance/async/flows/introspect.py
+++ b/glance/async_/flows/introspect.py
@@ -21,7 +21,7 @@ from oslo_utils import encodeutils
21from oslo_utils import excutils 21from oslo_utils import excutils
22from taskflow.patterns import linear_flow as lf 22from taskflow.patterns import linear_flow as lf
23 23
24from glance.async import utils 24from glance.async_ import utils
25from glance.i18n import _LE 25from glance.i18n import _LE
26 26
27 27
diff --git a/glance/async/flows/ovf_process.py b/glance/async_/flows/ovf_process.py
index 79357de..79357de 100644
--- a/glance/async/flows/ovf_process.py
+++ b/glance/async_/flows/ovf_process.py
diff --git a/glance/async/flows/plugins/__init__.py b/glance/async_/flows/plugins/__init__.py
index d920cb0..d920cb0 100644
--- a/glance/async/flows/plugins/__init__.py
+++ b/glance/async_/flows/plugins/__init__.py
diff --git a/glance/async/flows/plugins/image_conversion.py b/glance/async_/flows/plugins/image_conversion.py
index 1d7adcf..53f81de 100644
--- a/glance/async/flows/plugins/image_conversion.py
+++ b/glance/async_/flows/plugins/image_conversion.py
@@ -24,7 +24,7 @@ from oslo_utils import excutils
24from taskflow.patterns import linear_flow as lf 24from taskflow.patterns import linear_flow as lf
25from taskflow import task 25from taskflow import task
26 26
27from glance.async import utils 27from glance.async_ import utils
28from glance.i18n import _ 28from glance.i18n import _
29 29
30LOG = logging.getLogger(__name__) 30LOG = logging.getLogger(__name__)
diff --git a/glance/async/flows/plugins/inject_image_metadata.py b/glance/async_/flows/plugins/inject_image_metadata.py
index 24010a8..24010a8 100644
--- a/glance/async/flows/plugins/inject_image_metadata.py
+++ b/glance/async_/flows/plugins/inject_image_metadata.py
diff --git a/glance/async/flows/plugins/no_op.py b/glance/async_/flows/plugins/no_op.py
index 35c290f..35c290f 100644
--- a/glance/async/flows/plugins/no_op.py
+++ b/glance/async_/flows/plugins/no_op.py
diff --git a/glance/async/flows/plugins/plugin_opts.py b/glance/async_/flows/plugins/plugin_opts.py
index 709b78c..173f23c 100644
--- a/glance/async/flows/plugins/plugin_opts.py
+++ b/glance/async_/flows/plugins/plugin_opts.py
@@ -14,8 +14,8 @@
14# under the License. 14# under the License.
15 15
16 16
17import glance.async.flows.plugins.image_conversion 17import glance.async_.flows.plugins.image_conversion
18import glance.async.flows.plugins.inject_image_metadata 18import glance.async_.flows.plugins.inject_image_metadata
19 19
20 20
21# Note(jokke): This list contains tuples of config options for import plugins. 21# Note(jokke): This list contains tuples of config options for import plugins.
@@ -27,9 +27,9 @@ import glance.async.flows.plugins.inject_image_metadata
27# registered under at the config file. 27# registered under at the config file.
28PLUGIN_OPTS = [ 28PLUGIN_OPTS = [
29 ('inject_metadata_properties', 29 ('inject_metadata_properties',
30 glance.async.flows.plugins.inject_image_metadata.inject_metadata_opts), 30 glance.async_.flows.plugins.inject_image_metadata.inject_metadata_opts),
31 ('image_conversion', 31 ('image_conversion',
32 glance.async.flows.plugins.image_conversion.conversion_plugin_opts), 32 glance.async_.flows.plugins.image_conversion.conversion_plugin_opts),
33] 33]
34 34
35 35
diff --git a/glance/async/taskflow_executor.py b/glance/async_/taskflow_executor.py
index 3fe810d..943c33c 100644
--- a/glance/async/taskflow_executor.py
+++ b/glance/async_/taskflow_executor.py
@@ -23,7 +23,7 @@ from stevedore import driver
23from taskflow import engines 23from taskflow import engines
24from taskflow.listeners import logging as llistener 24from taskflow.listeners import logging as llistener
25 25
26import glance.async 26import glance.async_
27from glance.common import exception 27from glance.common import exception
28from glance.common.scripts import utils as script_utils 28from glance.common.scripts import utils as script_utils
29from glance.i18n import _, _LE 29from glance.i18n import _, _LE
@@ -85,7 +85,7 @@ CONF = cfg.CONF
85CONF.register_opts(taskflow_executor_opts, group='taskflow_executor') 85CONF.register_opts(taskflow_executor_opts, group='taskflow_executor')
86 86
87 87
88class TaskExecutor(glance.async.TaskExecutor): 88class TaskExecutor(glance.async_.TaskExecutor):
89 89
90 def __init__(self, context, task_repo, image_repo, image_factory): 90 def __init__(self, context, task_repo, image_repo, image_factory):
91 self.context = context 91 self.context = context
diff --git a/glance/async/utils.py b/glance/async_/utils.py
index 6a5054e..6a5054e 100644
--- a/glance/async/utils.py
+++ b/glance/async_/utils.py
diff --git a/glance/common/utils.py b/glance/common/utils.py
index 05ff3df..92df5bf 100644
--- a/glance/common/utils.py
+++ b/glance/common/utils.py
@@ -128,7 +128,7 @@ def cooperative_read(fd):
128MAX_COOP_READER_BUFFER_SIZE = 134217728 # 128M seems like a sane buffer limit 128MAX_COOP_READER_BUFFER_SIZE = 134217728 # 128M seems like a sane buffer limit
129 129
130CONF.import_group('import_filtering_opts', 130CONF.import_group('import_filtering_opts',
131 'glance.async.flows._internal_plugins') 131 'glance.async_.flows._internal_plugins')
132 132
133 133
134def validate_import_uri(uri): 134def validate_import_uri(uri):
diff --git a/glance/domain/__init__.py b/glance/domain/__init__.py
index 2d5b7af..7feb1ed 100644
--- a/glance/domain/__init__.py
+++ b/glance/domain/__init__.py
@@ -513,7 +513,7 @@ class TaskExecutorFactory(object):
513 TaskExecutorFactory.eventlet_deprecation_warned = True 513 TaskExecutorFactory.eventlet_deprecation_warned = True
514 task_executor = 'taskflow' 514 task_executor = 'taskflow'
515 515
516 executor_cls = ('glance.async.%s_executor.' 516 executor_cls = ('glance.async_.%s_executor.'
517 'TaskExecutor' % task_executor) 517 'TaskExecutor' % task_executor)
518 LOG.debug("Loading %s executor", task_executor) 518 LOG.debug("Loading %s executor", task_executor)
519 executor = importutils.import_class(executor_cls) 519 executor = importutils.import_class(executor_cls)
diff --git a/glance/opts.py b/glance/opts.py
index 93caf40..4d9b1ea 100644
--- a/glance/opts.py
+++ b/glance/opts.py
@@ -28,11 +28,11 @@ from osprofiler import opts as profiler
28 28
29import glance.api.middleware.context 29import glance.api.middleware.context
30import glance.api.versions 30import glance.api.versions
31import glance.async.flows._internal_plugins 31import glance.async_.flows._internal_plugins
32import glance.async.flows.api_image_import 32import glance.async_.flows.api_image_import
33import glance.async.flows.convert 33import glance.async_.flows.convert
34from glance.async.flows.plugins import plugin_opts 34from glance.async_.flows.plugins import plugin_opts
35import glance.async.taskflow_executor 35import glance.async_.taskflow_executor
36import glance.common.config 36import glance.common.config
37import glance.common.location_strategy 37import glance.common.location_strategy
38import glance.common.location_strategy.store_type 38import glance.common.location_strategy.store_type
@@ -71,8 +71,8 @@ _api_opts = [
71 ('image_format', glance.common.config.image_format_opts), 71 ('image_format', glance.common.config.image_format_opts),
72 ('task', glance.common.config.task_opts), 72 ('task', glance.common.config.task_opts),
73 ('taskflow_executor', list(itertools.chain( 73 ('taskflow_executor', list(itertools.chain(
74 glance.async.taskflow_executor.taskflow_executor_opts, 74 glance.async_.taskflow_executor.taskflow_executor_opts,
75 glance.async.flows.convert.convert_task_opts))), 75 glance.async_.flows.convert.convert_task_opts))),
76 ('store_type_location_strategy', 76 ('store_type_location_strategy',
77 glance.common.location_strategy.store_type.store_type_opts), 77 glance.common.location_strategy.store_type.store_type_opts),
78 profiler.list_opts()[0], 78 profiler.list_opts()[0],
@@ -109,9 +109,10 @@ _manage_opts = [
109 (None, []) 109 (None, [])
110] 110]
111_image_import_opts = [ 111_image_import_opts = [
112 ('image_import_opts', glance.async.flows.api_image_import.api_import_opts), 112 ('image_import_opts',
113 glance.async_.flows.api_image_import.api_import_opts),
113 ('import_filtering_opts', 114 ('import_filtering_opts',
114 glance.async.flows._internal_plugins.import_filtering_opts), 115 glance.async_.flows._internal_plugins.import_filtering_opts),
115] 116]
116 117
117 118
diff --git a/glance/tests/stubs.py b/glance/tests/stubs.py
index 80bf5c8..5aa027a 100644
--- a/glance/tests/stubs.py
+++ b/glance/tests/stubs.py
@@ -193,26 +193,3 @@ def stub_out_registry_and_store_server(stubs, base_dir, **kwargs):
193 glance.common.client.BaseClient._sendable) 193 glance.common.client.BaseClient._sendable)
194 stubs.Set(glance.common.client.BaseClient, '_sendable', 194 stubs.Set(glance.common.client.BaseClient, '_sendable',
195 fake_sendable) 195 fake_sendable)
196
197
198def stub_out_registry_server(stubs, **kwargs):
199 """Mocks calls to 127.0.0.1 on 9191 for testing.
200
201 Done so that a real Glance Registry server does not need to be up and
202 running.
203 """
204 def fake_get_connection_type(client):
205 """Returns the proper connection type."""
206 DEFAULT_REGISTRY_PORT = 9191
207
208 if (client.port == DEFAULT_REGISTRY_PORT and
209 client.host == '0.0.0.0'):
210 rserver = kwargs.pop("registry", None)
211 return FakeRegistryConnection(registry=rserver)
212
213 def fake_image_iter(self):
214 for i in self.response.app_iter:
215 yield i
216
217 stubs.Set(glance.common.client.BaseClient, 'get_connection_type',
218 fake_get_connection_type)
diff --git a/glance/tests/unit/async/__init__.py b/glance/tests/unit/async_/__init__.py
index e69de29..e69de29 100644
--- a/glance/tests/unit/async/__init__.py
+++ b/glance/tests/unit/async_/__init__.py
diff --git a/glance/tests/unit/async/flows/__init__.py b/glance/tests/unit/async_/flows/__init__.py
index e69de29..e69de29 100644
--- a/glance/tests/unit/async/flows/__init__.py
+++ b/glance/tests/unit/async_/flows/__init__.py
diff --git a/glance/tests/unit/async/flows/plugins/__init__.py b/glance/tests/unit/async_/flows/plugins/__init__.py
index e69de29..e69de29 100644
--- a/glance/tests/unit/async/flows/plugins/__init__.py
+++ b/glance/tests/unit/async_/flows/plugins/__init__.py
diff --git a/glance/tests/unit/async/flows/plugins/test_inject_image_metadata.py b/glance/tests/unit/async_/flows/plugins/test_inject_image_metadata.py
index 8234607..8bc7c11 100644
--- a/glance/tests/unit/async/flows/plugins/test_inject_image_metadata.py
+++ b/glance/tests/unit/async_/flows/plugins/test_inject_image_metadata.py
@@ -19,7 +19,7 @@ import os
19import glance_store 19import glance_store
20from oslo_config import cfg 20from oslo_config import cfg
21 21
22import glance.async.flows.plugins.inject_image_metadata as inject_metadata 22import glance.async_.flows.plugins.inject_image_metadata as inject_metadata
23from glance.common import utils 23from glance.common import utils
24from glance import domain 24from glance import domain
25from glance import gateway 25from glance import gateway
diff --git a/glance/tests/unit/async/flows/test_api_image_import.py b/glance/tests/unit/async_/flows/test_api_image_import.py
index 20aa6da..5519027 100644
--- a/glance/tests/unit/async/flows/test_api_image_import.py
+++ b/glance/tests/unit/async_/flows/test_api_image_import.py
@@ -17,7 +17,7 @@ import mock
17 17
18from oslo_config import cfg 18from oslo_config import cfg
19 19
20import glance.async.flows.api_image_import as import_flow 20import glance.async_.flows.api_image_import as import_flow
21import glance.tests.utils as test_utils 21import glance.tests.utils as test_utils
22 22
23CONF = cfg.CONF 23CONF = cfg.CONF
@@ -52,7 +52,7 @@ class TestApiImageImportTask(test_utils.BaseTestCase):
52 self.mock_task_repo = mock.MagicMock() 52 self.mock_task_repo = mock.MagicMock()
53 self.mock_image_repo = mock.MagicMock() 53 self.mock_image_repo = mock.MagicMock()
54 54
55 @mock.patch('glance.async.flows.api_image_import._VerifyStaging.__init__') 55 @mock.patch('glance.async_.flows.api_image_import._VerifyStaging.__init__')
56 @mock.patch('taskflow.patterns.linear_flow.Flow.add') 56 @mock.patch('taskflow.patterns.linear_flow.Flow.add')
57 @mock.patch('taskflow.patterns.linear_flow.__init__') 57 @mock.patch('taskflow.patterns.linear_flow.__init__')
58 def _pass_uri(self, mock_lf_init, mock_flow_add, mock_VS_init, 58 def _pass_uri(self, mock_lf_init, mock_flow_add, mock_VS_init,
diff --git a/glance/tests/unit/async/flows/test_convert.py b/glance/tests/unit/async_/flows/test_convert.py
index b3c3848..8b141e2 100644
--- a/glance/tests/unit/async/flows/test_convert.py
+++ b/glance/tests/unit/async_/flows/test_convert.py
@@ -22,8 +22,8 @@ from oslo_concurrency import processutils
22from oslo_config import cfg 22from oslo_config import cfg
23import six 23import six
24 24
25from glance.async.flows import convert 25from glance.async_.flows import convert
26from glance.async import taskflow_executor 26from glance.async_ import taskflow_executor
27from glance.common.scripts import utils as script_utils 27from glance.common.scripts import utils as script_utils
28from glance.common import utils 28from glance.common import utils
29from glance import domain 29from glance import domain
diff --git a/glance/tests/unit/async/flows/test_import.py b/glance/tests/unit/async_/flows/test_import.py
index 70752d8..e3d1a4a 100644
--- a/glance/tests/unit/async/flows/test_import.py
+++ b/glance/tests/unit/async_/flows/test_import.py
@@ -25,9 +25,9 @@ from six.moves import urllib
25from taskflow import task 25from taskflow import task
26from taskflow.types import failure 26from taskflow.types import failure
27 27
28import glance.async.flows.base_import as import_flow 28import glance.async_.flows.base_import as import_flow
29from glance.async import taskflow_executor 29from glance.async_ import taskflow_executor
30from glance.async import utils as async_utils 30from glance.async_ import utils as async_utils
31from glance.common.scripts.image_import import main as image_import 31from glance.common.scripts.image_import import main as image_import
32from glance.common.scripts import utils as script_utils 32from glance.common.scripts import utils as script_utils
33from glance.common import utils 33from glance.common import utils
diff --git a/glance/tests/unit/async/flows/test_introspect.py b/glance/tests/unit/async_/flows/test_introspect.py
index 869f99d..573c441 100644
--- a/glance/tests/unit/async/flows/test_introspect.py
+++ b/glance/tests/unit/async_/flows/test_introspect.py
@@ -20,8 +20,8 @@ import glance_store
20from oslo_concurrency import processutils 20from oslo_concurrency import processutils
21from oslo_config import cfg 21from oslo_config import cfg
22 22
23from glance.async.flows import introspect 23from glance.async_.flows import introspect
24from glance.async import utils as async_utils 24from glance.async_ import utils as async_utils
25from glance import domain 25from glance import domain
26import glance.tests.utils as test_utils 26import glance.tests.utils as test_utils
27 27
diff --git a/glance/tests/unit/async/flows/test_ovf_process.py b/glance/tests/unit/async_/flows/test_ovf_process.py
index 5646cae..0a70bc2 100644
--- a/glance/tests/unit/async/flows/test_ovf_process.py
+++ b/glance/tests/unit/async_/flows/test_ovf_process.py
@@ -24,7 +24,7 @@ try:
24except ImportError: 24except ImportError:
25 from defusedxml.ElementTree import ParseError 25 from defusedxml.ElementTree import ParseError
26 26
27from glance.async.flows import ovf_process 27from glance.async_.flows import ovf_process
28import glance.tests.utils as test_utils 28import glance.tests.utils as test_utils
29from oslo_config import cfg 29from oslo_config import cfg
30 30
diff --git a/glance/tests/unit/async/flows/test_web_download.py b/glance/tests/unit/async_/flows/test_web_download.py
index ca62f0a..5384320 100644
--- a/glance/tests/unit/async/flows/test_web_download.py
+++ b/glance/tests/unit/async_/flows/test_web_download.py
@@ -19,7 +19,7 @@ from glance_store._drivers import filesystem
19from glance_store import backend 19from glance_store import backend
20from oslo_config import cfg 20from oslo_config import cfg
21 21
22from glance.async.flows._internal_plugins import web_download 22from glance.async_.flows._internal_plugins import web_download
23 23
24import glance.common.exception 24import glance.common.exception
25import glance.common.scripts.utils as script_utils 25import glance.common.scripts.utils as script_utils
diff --git a/glance/tests/unit/async/test_async.py b/glance/tests/unit/async_/test_async.py
index 8efa48a..d6a1212 100644
--- a/glance/tests/unit/async/test_async.py
+++ b/glance/tests/unit/async_/test_async.py
@@ -16,7 +16,7 @@
16 16
17import mock 17import mock
18 18
19import glance.async 19import glance.async_
20import glance.tests.utils as test_utils 20import glance.tests.utils as test_utils
21 21
22 22
@@ -28,10 +28,10 @@ class TestTaskExecutor(test_utils.BaseTestCase):
28 self.task_repo = mock.Mock() 28 self.task_repo = mock.Mock()
29 self.image_repo = mock.Mock() 29 self.image_repo = mock.Mock()
30 self.image_factory = mock.Mock() 30 self.image_factory = mock.Mock()
31 self.executor = glance.async.TaskExecutor(self.context, 31 self.executor = glance.async_.TaskExecutor(self.context,
32 self.task_repo, 32 self.task_repo,
33 self.image_repo, 33 self.image_repo,
34 self.image_factory) 34 self.image_factory)
35 35
36 def test_begin_processing(self): 36 def test_begin_processing(self):
37 # setup 37 # setup
@@ -40,7 +40,7 @@ class TestTaskExecutor(test_utils.BaseTestCase):
40 task = mock.Mock() 40 task = mock.Mock()
41 41
42 with mock.patch.object( 42 with mock.patch.object(
43 glance.async.TaskExecutor, 43 glance.async_.TaskExecutor,
44 '_run') as mock_run: 44 '_run') as mock_run:
45 self.task_repo.get.return_value = task 45 self.task_repo.get.return_value = task
46 self.executor.begin_processing(task_id) 46 self.executor.begin_processing(task_id)
diff --git a/glance/tests/unit/async/test_taskflow_executor.py b/glance/tests/unit/async_/test_taskflow_executor.py
index c1a4ef6..222ad4d 100644
--- a/glance/tests/unit/async/test_taskflow_executor.py
+++ b/glance/tests/unit/async_/test_taskflow_executor.py
@@ -19,7 +19,7 @@ import glance_store
19from oslo_config import cfg 19from oslo_config import cfg
20from taskflow import engines 20from taskflow import engines
21 21
22from glance.async import taskflow_executor 22from glance.async_ import taskflow_executor
23from glance.common.scripts.image_import import main as image_import 23from glance.common.scripts.image_import import main as image_import
24from glance import domain 24from glance import domain
25import glance.tests.utils as test_utils 25import glance.tests.utils as test_utils
diff --git a/glance/tests/unit/test_domain.py b/glance/tests/unit/test_domain.py
index 5ab5cf7..97037f3 100644
--- a/glance/tests/unit/test_domain.py
+++ b/glance/tests/unit/test_domain.py
@@ -21,8 +21,8 @@ import mock
21from oslo_config import cfg 21from oslo_config import cfg
22import oslo_utils.importutils 22import oslo_utils.importutils
23 23
24import glance.async 24import glance.async_
25from glance.async import taskflow_executor 25from glance.async_ import taskflow_executor
26from glance.common import exception 26from glance.common import exception
27from glance.common import timeutils 27from glance.common import timeutils
28from glance import domain 28from glance import domain
@@ -467,12 +467,12 @@ class TestTask(test_utils.BaseTestCase):
467 self.task.expires_at 467 self.task.expires_at
468 ) 468 )
469 469
470 @mock.patch.object(glance.async.TaskExecutor, 'begin_processing') 470 @mock.patch.object(glance.async_.TaskExecutor, 'begin_processing')
471 def test_run(self, mock_begin_processing): 471 def test_run(self, mock_begin_processing):
472 executor = glance.async.TaskExecutor(context=mock.ANY, 472 executor = glance.async_.TaskExecutor(context=mock.ANY,
473 task_repo=mock.ANY, 473 task_repo=mock.ANY,
474 image_repo=mock.ANY, 474 image_repo=mock.ANY,
475 image_factory=mock.ANY) 475 image_factory=mock.ANY)
476 self.task.run(executor) 476 self.task.run(executor)
477 477
478 mock_begin_processing.assert_called_once_with(self.task.task_id) 478 mock_begin_processing.assert_called_once_with(self.task.task_id)
diff --git a/glance/tests/unit/test_notifier.py b/glance/tests/unit/test_notifier.py
index 04f56f3..346ef5a 100644
--- a/glance/tests/unit/test_notifier.py
+++ b/glance/tests/unit/test_notifier.py
@@ -22,7 +22,7 @@ from oslo_config import cfg
22import oslo_messaging 22import oslo_messaging
23import webob 23import webob
24 24
25import glance.async 25import glance.async_
26from glance.common import exception 26from glance.common import exception
27from glance.common import timeutils 27from glance.common import timeutils
28import glance.context 28import glance.context
@@ -681,7 +681,7 @@ class TestTaskNotifications(utils.BaseTestCase):
681 self.assertEqual(0, len(output_logs)) 681 self.assertEqual(0, len(output_logs))
682 682
683 def test_task_run_notification(self): 683 def test_task_run_notification(self):
684 with mock.patch('glance.async.TaskExecutor') as mock_executor: 684 with mock.patch('glance.async_.TaskExecutor') as mock_executor:
685 executor = mock_executor.return_value 685 executor = mock_executor.return_value
686 executor._run.return_value = mock.Mock() 686 executor._run.return_value = mock.Mock()
687 self.task_proxy.run(executor=mock_executor) 687 self.task_proxy.run(executor=mock_executor)
@@ -694,7 +694,7 @@ class TestTaskNotifications(utils.BaseTestCase):
694 694
695 def test_task_run_notification_disabled(self): 695 def test_task_run_notification_disabled(self):
696 self.config(disabled_notifications=['task.run']) 696 self.config(disabled_notifications=['task.run'])
697 with mock.patch('glance.async.TaskExecutor') as mock_executor: 697 with mock.patch('glance.async_.TaskExecutor') as mock_executor:
698 executor = mock_executor.return_value 698 executor = mock_executor.return_value
699 executor._run.return_value = mock.Mock() 699 executor._run.return_value = mock.Mock()
700 self.task_proxy.run(executor=mock_executor) 700 self.task_proxy.run(executor=mock_executor)
diff --git a/glance/tests/unit/v2/test_images_resource.py b/glance/tests/unit/v2/test_images_resource.py
index 5eb3841..30379d4 100644
--- a/glance/tests/unit/v2/test_images_resource.py
+++ b/glance/tests/unit/v2/test_images_resource.py
@@ -1720,14 +1720,24 @@ class TestImagesController(base.IsolatedUnitTest):
1720 self.assertEqual(2, len(output.locations)) 1720 self.assertEqual(2, len(output.locations))
1721 self.assertEqual(new_location, output.locations[1]) 1721 self.assertEqual(new_location, output.locations[1])
1722 1722
1723 def test_replace_location_possible_on_queued(self): 1723 @mock.patch.object(glance.quota, '_calc_required_size')
1724 self.skipTest('This test is intermittently failing at the gate. ' 1724 @mock.patch.object(glance.location, '_check_image_location')
1725 'See bug #1649300') 1725 @mock.patch.object(glance.location.ImageRepoProxy, '_set_acls')
1726 @mock.patch.object(store, 'get_size_from_uri_and_backend')
1727 @mock.patch.object(store, 'get_size_from_backend')
1728 def test_replace_location_on_queued(self,
1729 mock_get_size,
1730 mock_get_size_uri,
1731 mock_set_acls,
1732 mock_check_loc,
1733 mock_calc):
1734 mock_calc.return_value = 1
1735 mock_get_size.return_value = 1
1736 mock_get_size_uri.return_value = 1
1726 self.config(show_multiple_locations=True) 1737 self.config(show_multiple_locations=True)
1727 self.images = [ 1738 self.images = [
1728 _db_fixture('1', owner=TENANT1, checksum=CHKSUM, 1739 _db_fixture('1', owner=TENANT1, checksum=CHKSUM,
1729 name='1', 1740 name='1',
1730 is_public=True,
1731 disk_format='raw', 1741 disk_format='raw',
1732 container_format='bare', 1742 container_format='bare',
1733 status='queued'), 1743 status='queued'),
@@ -1741,15 +1751,26 @@ class TestImagesController(base.IsolatedUnitTest):
1741 self.assertEqual('1', output.image_id) 1751 self.assertEqual('1', output.image_id)
1742 self.assertEqual(1, len(output.locations)) 1752 self.assertEqual(1, len(output.locations))
1743 self.assertEqual(new_location, output.locations[0]) 1753 self.assertEqual(new_location, output.locations[0])
1754 self.assertEqual('active', output.status)
1744 1755
1745 def test_add_location_possible_on_queued(self): 1756 @mock.patch.object(glance.quota, '_calc_required_size')
1746 self.skipTest('This test is intermittently failing at the gate. ' 1757 @mock.patch.object(glance.location, '_check_image_location')
1747 'See bug #1649300') 1758 @mock.patch.object(glance.location.ImageRepoProxy, '_set_acls')
1759 @mock.patch.object(store, 'get_size_from_uri_and_backend')
1760 @mock.patch.object(store, 'get_size_from_backend')
1761 def test_add_location_on_queued(self,
1762 mock_get_size,
1763 mock_get_size_uri,
1764 mock_set_acls,
1765 mock_check_loc,
1766 mock_calc):
1767 mock_calc.return_value = 1
1768 mock_get_size.return_value = 1
1769 mock_get_size_uri.return_value = 1
1748 self.config(show_multiple_locations=True) 1770 self.config(show_multiple_locations=True)
1749 self.images = [ 1771 self.images = [
1750 _db_fixture('1', owner=TENANT1, checksum=CHKSUM, 1772 _db_fixture('1', owner=TENANT1, checksum=CHKSUM,
1751 name='1', 1773 name='1',
1752 is_public=True,
1753 disk_format='raw', 1774 disk_format='raw',
1754 container_format='bare', 1775 container_format='bare',
1755 status='queued'), 1776 status='queued'),
@@ -1763,6 +1784,7 @@ class TestImagesController(base.IsolatedUnitTest):
1763 self.assertEqual('1', output.image_id) 1784 self.assertEqual('1', output.image_id)
1764 self.assertEqual(1, len(output.locations)) 1785 self.assertEqual(1, len(output.locations))
1765 self.assertEqual(new_location, output.locations[0]) 1786 self.assertEqual(new_location, output.locations[0])
1787 self.assertEqual('active', output.status)
1766 1788
1767 def _test_update_locations_status(self, image_status, update): 1789 def _test_update_locations_status(self, image_status, update):
1768 self.config(show_multiple_locations=True) 1790 self.config(show_multiple_locations=True)
diff --git a/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po b/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
index 076ea6b..63c1020 100644
--- a/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
+++ b/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
@@ -4,11 +4,11 @@ msgid ""
4msgstr "" 4msgstr ""
5"Project-Id-Version: Glance Release Notes\n" 5"Project-Id-Version: Glance Release Notes\n"
6"Report-Msgid-Bugs-To: \n" 6"Report-Msgid-Bugs-To: \n"
7"POT-Creation-Date: 2018-08-16 22:24+0000\n" 7"POT-Creation-Date: 2018-09-21 23:35+0000\n"
8"MIME-Version: 1.0\n" 8"MIME-Version: 1.0\n"
9"Content-Type: text/plain; charset=UTF-8\n" 9"Content-Type: text/plain; charset=UTF-8\n"
10"Content-Transfer-Encoding: 8bit\n" 10"Content-Transfer-Encoding: 8bit\n"
11"PO-Revision-Date: 2018-08-17 09:31+0000\n" 11"PO-Revision-Date: 2018-09-27 12:04+0000\n"
12"Last-Translator: Andi Chandler <andi@gowling.com>\n" 12"Last-Translator: Andi Chandler <andi@gowling.com>\n"
13"Language-Team: English (United Kingdom)\n" 13"Language-Team: English (United Kingdom)\n"
14"Language: en_GB\n" 14"Language: en_GB\n"
@@ -111,21 +111,12 @@ msgstr "16.0.0"
111msgid "16.0.1" 111msgid "16.0.1"
112msgstr "16.0.1" 112msgstr "16.0.1"
113 113
114msgid "17.0.0.0b1" 114msgid "17.0.0"
115msgstr "17.0.0.0b1" 115msgstr "17.0.0"
116
117msgid "17.0.0.0b2"
118msgstr "17.0.0.0b2"
119
120msgid "17.0.0.0b3"
121msgstr "17.0.0.0b3"
122 116
123msgid "17.0.0.0rc1" 117msgid "17.0.0.0rc1"
124msgstr "17.0.0.0rc1" 118msgstr "17.0.0.0rc1"
125 119
126msgid "17.0.0.0rc1-6"
127msgstr "17.0.0.0rc1-6"
128
129msgid "" 120msgid ""
130"A new interoperable image import method, ``web-download`` is introduced." 121"A new interoperable image import method, ``web-download`` is introduced."
131msgstr "" 122msgstr ""
diff --git a/setup.cfg b/setup.cfg
index 9e373f5..653fc31 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -27,7 +27,6 @@ data_files =
27 etc/glance-api-paste.ini 27 etc/glance-api-paste.ini
28 etc/glance-registry-paste.ini 28 etc/glance-registry-paste.ini
29 etc/policy.json 29 etc/policy.json
30 etc/rootwrap.conf
31 etc/glance/metadefs = etc/metadefs/* 30 etc/glance/metadefs = etc/metadefs/*
32packages = 31packages =
33 glance 32 glance
@@ -64,21 +63,21 @@ glance.database.metadata_backend =
64 sqlalchemy = glance.db.sqlalchemy.metadata 63 sqlalchemy = glance.db.sqlalchemy.metadata
65 64
66glance.flows = 65glance.flows =
67 api_image_import = glance.async.flows.api_image_import:get_flow 66 api_image_import = glance.async_.flows.api_image_import:get_flow
68 import = glance.async.flows.base_import:get_flow 67 import = glance.async_.flows.base_import:get_flow
69 68
70glance.flows.import = 69glance.flows.import =
71 convert = glance.async.flows.convert:get_flow 70 convert = glance.async_.flows.convert:get_flow
72 introspect = glance.async.flows.introspect:get_flow 71 introspect = glance.async_.flows.introspect:get_flow
73 ovf_process = glance.async.flows.ovf_process:get_flow 72 ovf_process = glance.async_.flows.ovf_process:get_flow
74 73
75glance.image_import.plugins = 74glance.image_import.plugins =
76 no_op = glance.async.flows.plugins.no_op:get_flow 75 no_op = glance.async_.flows.plugins.no_op:get_flow
77 inject_image_metadata=glance.async.flows.plugins.inject_image_metadata:get_flow 76 inject_image_metadata=glance.async_.flows.plugins.inject_image_metadata:get_flow
78 image_conversion=glance.async.flows.plugins.image_conversion:get_flow 77 image_conversion=glance.async_.flows.plugins.image_conversion:get_flow
79 78
80glance.image_import.internal_plugins = 79glance.image_import.internal_plugins =
81 web_download = glance.async.flows._internal_plugins.web_download:get_flow 80 web_download = glance.async_.flows._internal_plugins.web_download:get_flow
82 81
83 82
84[egg_info] 83[egg_info]
diff --git a/test-requirements.txt b/test-requirements.txt
index 01a708b..4234414 100644
--- a/test-requirements.txt
+++ b/test-requirements.txt
@@ -28,6 +28,5 @@ doc8>=0.6.0 # Apache-2.0
28PyMySQL>=0.7.6 # MIT License 28PyMySQL>=0.7.6 # MIT License
29psycopg2>=2.6.2 # LGPL/ZPL 29psycopg2>=2.6.2 # LGPL/ZPL
30pysendfile>=2.0.0 # MIT 30pysendfile>=2.0.0 # MIT
31qpid-python>=0.26;python_version=='2.7' # Apache-2.0
32xattr>=0.9.2 # MIT 31xattr>=0.9.2 # MIT
33python-swiftclient>=3.2.0 # Apache-2.0 32python-swiftclient>=3.2.0 # Apache-2.0