From d54449af44212e01762285832b9c7c1ad4de1eb3 Mon Sep 17 00:00:00 2001 From: Abhishek Kekane Date: Tue, 9 Feb 2021 09:41:15 +0000 Subject: [PATCH] Utilize newly added tasks database fields Made provision to pass image_id, request_id and user_id information while creating new task. Partially-Implements: blueprint messages-api Change-Id: I299a222eeef81431143db3ba7fc08365c924326b --- glance/api/v2/images.py | 6 ++- glance/api/v2/tasks.py | 28 ++++++++++-- glance/db/__init__.py | 9 ++++ glance/db/simple/api.py | 6 ++- glance/db/sqlalchemy/api.py | 5 ++- glance/domain/__init__.py | 19 ++++++-- glance/domain/proxy.py | 3 ++ glance/tests/functional/v2/test_tasks.py | 5 ++- .../flows/plugins/test_image_conversion.py | 4 ++ .../plugins/test_inject_image_metadata.py | 3 ++ .../tests/unit/async_/flows/test_convert.py | 3 ++ .../unit/async_/flows/test_copy_image.py | 4 ++ glance/tests/unit/async_/flows/test_import.py | 3 ++ .../unit/async_/flows/test_introspect.py | 4 ++ .../unit/async_/flows/test_web_download.py | 4 ++ .../unit/async_/test_taskflow_executor.py | 5 +++ glance/tests/unit/test_auth.py | 43 +++++++++++++++---- glance/tests/unit/test_db.py | 9 +++- glance/tests/unit/test_domain.py | 37 ++++++++++++++-- glance/tests/unit/test_notifier.py | 42 +++++++++++++++++- glance/tests/unit/v2/test_images_resource.py | 5 ++- glance/tests/unit/v2/test_tasks_resource.py | 31 ++++++++++++- 22 files changed, 248 insertions(+), 30 deletions(-) diff --git a/glance/api/v2/images.py b/glance/api/v2/images.py index 1d519c2afc..a5b383c12e 100644 --- a/glance/api/v2/images.py +++ b/glance/api/v2/images.py @@ -1,4 +1,3 @@ -# Copyright 2012 OpenStack Foundation. # All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may @@ -333,7 +332,10 @@ class ImagesController(object): try: import_task = task_factory.new_task(task_type='api_image_import', owner=ctxt.owner, - task_input=task_input) + task_input=task_input, + image_id=image_id, + user_id=ctxt.user_id, + request_id=ctxt.request_id) # NOTE(danms): Try to grab the lock for this task try: diff --git a/glance/api/v2/tasks.py b/glance/api/v2/tasks.py index c3d71c6d6f..ea76e322bd 100644 --- a/glance/api/v2/tasks.py +++ b/glance/api/v2/tasks.py @@ -74,9 +74,13 @@ class TasksController(object): executor_factory = self.gateway.get_task_executor_factory(ctxt) task_repo = self.gateway.get_task_repo(ctxt) try: - new_task = task_factory.new_task(task_type=task['type'], - owner=ctxt.owner, - task_input=task['input']) + new_task = task_factory.new_task( + task_type=task['type'], + owner=ctxt.owner, + task_input=task['input'], + image_id=task['input'].get('image_id'), + user_id=ctxt.user_id, + request_id=ctxt.request_id) task_repo.add(new_task) task_executor = executor_factory.new_task_executor(ctxt) pool = common.get_thread_pool("tasks_pool") @@ -281,6 +285,12 @@ class ResponseSerializer(wsgi.JSONResponseSerializer): 'self': self._get_task_location(task), 'schema': '/v2/schemas/task' } + if task.image_id: + task_view['image_id'] = task.image_id + if task.request_id: + task_view['request_id'] = task.request_id + if task.user_id: + task_view['user_id'] = task.user_id if task.expires_at: task_view['expires_at'] = timeutils.isotime(task.expires_at) task_view = schema.filter(task_view) # domain @@ -376,6 +386,18 @@ _TASK_SCHEMA = { " when appropriate (usually on failure)"), "type": "string", }, + "image_id": { + "description": _("Image associated with the task"), + "type": "string", + }, + "request_id": { + "description": _("Human-readable informative request-id"), + "type": "string", + }, + "user_id": { + "description": _("User associated with the task"), + "type": "string", + }, "expires_at": { "description": _("Datetime when this resource would be" " subject to removal"), diff --git a/glance/db/__init__.py b/glance/db/__init__.py index 3cf537fa04..a44355b552 100644 --- a/glance/db/__init__.py +++ b/glance/db/__init__.py @@ -343,6 +343,9 @@ class TaskRepo(object): task_input=db_task['input'], result=db_task['result'], message=db_task['message'], + image_id=db_task['image_id'], + user_id=db_task['user_id'], + request_id=db_task['request_id'], ) def _format_task_stub_from_db(self, db_task): @@ -354,6 +357,9 @@ class TaskRepo(object): expires_at=db_task['expires_at'], created_at=db_task['created_at'], updated_at=db_task['updated_at'], + image_id=db_task['image_id'], + user_id=db_task['user_id'], + request_id=db_task['request_id'], ) def _format_task_to_db(self, task): @@ -367,6 +373,9 @@ class TaskRepo(object): 'expires_at': task.expires_at, 'created_at': task.created_at, 'updated_at': task.updated_at, + 'image_id': task.image_id, + 'request_id': task.request_id, + 'user_id': task.user_id, } return task diff --git a/glance/db/simple/api.py b/glance/db/simple/api.py index 21c1defbee..2bdc633a6b 100644 --- a/glance/db/simple/api.py +++ b/glance/db/simple/api.py @@ -177,6 +177,9 @@ def _task_format(task_id, **values): 'updated_at': dt, 'deleted_at': None, 'deleted': False, + 'image_id': None, + 'request_id': None, + 'user_id': None, } task.update(values) return task @@ -922,7 +925,8 @@ def task_create(context, values): required_attributes = ['type', 'status', 'input'] allowed_attributes = ['id', 'type', 'status', 'input', 'result', 'owner', 'message', 'expires_at', 'created_at', - 'updated_at', 'deleted_at', 'deleted'] + 'updated_at', 'deleted_at', 'deleted', + 'image_id', 'request_id', 'user_id'] if task_id in DATA['tasks']: raise exception.Duplicate() diff --git a/glance/db/sqlalchemy/api.py b/glance/db/sqlalchemy/api.py index 3c84c27d28..33f747e33e 100644 --- a/glance/db/sqlalchemy/api.py +++ b/glance/db/sqlalchemy/api.py @@ -1807,7 +1807,10 @@ def _task_format(task_ref, task_info_ref=None): 'created_at': task_ref['created_at'], 'updated_at': task_ref['updated_at'], 'deleted_at': task_ref['deleted_at'], - 'deleted': task_ref['deleted'] + 'deleted': task_ref['deleted'], + 'image_id': task_ref['image_id'], + 'request_id': task_ref['request_id'], + 'user_id': task_ref['user_id'], } if task_info_ref: diff --git a/glance/domain/__init__.py b/glance/domain/__init__.py index 49c4f07d28..d45abdf6e9 100644 --- a/glance/domain/__init__.py +++ b/glance/domain/__init__.py @@ -356,6 +356,7 @@ class Task(object): _supported_task_status = ('pending', 'processing', 'success', 'failure') def __init__(self, task_id, task_type, status, owner, + image_id, user_id, request_id, expires_at, created_at, updated_at, task_input, result, message): @@ -379,6 +380,9 @@ class Task(object): self.task_input = task_input self.result = result self.message = message + self.image_id = image_id + self.request_id = request_id + self.user_id = user_id @property def status(self): @@ -449,7 +453,8 @@ class Task(object): class TaskStub(object): def __init__(self, task_id, task_type, status, owner, - expires_at, created_at, updated_at): + expires_at, created_at, updated_at, + image_id, user_id, request_id): self.task_id = task_id self._status = status self.type = task_type @@ -457,6 +462,9 @@ class TaskStub(object): self.expires_at = expires_at self.created_at = created_at self.updated_at = updated_at + self.image_id = image_id + self.request_id = request_id + self.user_id = user_id @property def status(self): @@ -465,8 +473,8 @@ class TaskStub(object): class TaskFactory(object): - def new_task(self, task_type, owner, - task_input=None, **kwargs): + def new_task(self, task_type, owner, image_id, user_id, + request_id, task_input=None, **kwargs): task_id = str(uuid.uuid4()) status = 'pending' # Note(nikhil): expires_at would be set on the task, only when it @@ -479,12 +487,15 @@ class TaskFactory(object): task_type, status, owner, + image_id, + user_id, + request_id, expires_at, created_at, updated_at, task_input, kwargs.get('result'), - kwargs.get('message') + kwargs.get('message'), ) diff --git a/glance/domain/proxy.py b/glance/domain/proxy.py index 2572aba128..8c7325cccb 100644 --- a/glance/domain/proxy.py +++ b/glance/domain/proxy.py @@ -237,6 +237,9 @@ class Task(object): task_input = _proxy('base', 'task_input') result = _proxy('base', 'result') message = _proxy('base', 'message') + image_id = _proxy('base', 'image_id') + request_id = _proxy('base', 'request_id') + user_id = _proxy('base', 'user_id') def begin_processing(self): self.base.begin_processing() diff --git a/glance/tests/functional/v2/test_tasks.py b/glance/tests/functional/v2/test_tasks.py index 3dcfff646a..a980ed0d02 100644 --- a/glance/tests/functional/v2/test_tasks.py +++ b/glance/tests/functional/v2/test_tasks.py @@ -102,7 +102,10 @@ class TestTasks(functional.FunctionalTest): u'status', u'type', u'result', - u'updated_at']) + u'updated_at', + u'request_id', + u'user_id', + ]) self.assertEqual(checked_keys, set(task.keys())) expected_task = { 'status': 'pending', diff --git a/glance/tests/unit/async_/flows/plugins/test_image_conversion.py b/glance/tests/unit/async_/flows/plugins/test_image_conversion.py index 2dc4dc6f74..736391aff1 100644 --- a/glance/tests/unit/async_/flows/plugins/test_image_conversion.py +++ b/glance/tests/unit/async_/flows/plugins/test_image_conversion.py @@ -74,7 +74,11 @@ class TestConvertImageTask(test_utils.BaseTestCase): task_ttl = CONF.task.task_time_to_live self.task_type = 'import' + request_id = 'fake_request_id' + user_id = 'fake_user' self.task = self.task_factory.new_task(self.task_type, TENANT1, + self.image_id, user_id, + request_id, task_time_to_live=task_ttl, task_input=task_input) 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 b5fdc65d8a..076e81571c 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 @@ -70,7 +70,10 @@ class TestInjectImageMetadataTask(test_utils.BaseTestCase): task_ttl = CONF.task.task_time_to_live self.task_type = 'import' + request_id = 'fake_request_id' + user_id = 'fake_user' self.task = self.task_factory.new_task(self.task_type, TENANT1, + UUID1, user_id, request_id, task_time_to_live=task_ttl, task_input=task_input) diff --git a/glance/tests/unit/async_/flows/test_convert.py b/glance/tests/unit/async_/flows/test_convert.py index 50ca55c969..99466eeb44 100644 --- a/glance/tests/unit/async_/flows/test_convert.py +++ b/glance/tests/unit/async_/flows/test_convert.py @@ -64,7 +64,10 @@ class TestImportTask(test_utils.BaseTestCase): task_ttl = CONF.task.task_time_to_live self.task_type = 'import' + request_id = 'fake_request_id' + user_id = 'fake_user' self.task = self.task_factory.new_task(self.task_type, TENANT1, + UUID1, user_id, request_id, task_time_to_live=task_ttl, task_input=task_input) diff --git a/glance/tests/unit/async_/flows/test_copy_image.py b/glance/tests/unit/async_/flows/test_copy_image.py index fa79053a9c..bf5b4227f0 100644 --- a/glance/tests/unit/async_/flows/test_copy_image.py +++ b/glance/tests/unit/async_/flows/test_copy_image.py @@ -90,7 +90,11 @@ class TestCopyImageTask(test_utils.BaseTestCase): task_ttl = CONF.task.task_time_to_live self.task_type = 'import' + request_id = 'fake_request_id' + user_id = 'fake_user' self.task = self.task_factory.new_task(self.task_type, TENANT1, + self.image_id, user_id, + request_id, task_time_to_live=task_ttl, task_input=task_input) diff --git a/glance/tests/unit/async_/flows/test_import.py b/glance/tests/unit/async_/flows/test_import.py index f945ed00f2..270e94925c 100644 --- a/glance/tests/unit/async_/flows/test_import.py +++ b/glance/tests/unit/async_/flows/test_import.py @@ -86,7 +86,10 @@ class TestImportTask(test_utils.BaseTestCase): task_ttl = CONF.task.task_time_to_live self.task_type = 'import' + request_id = 'fake_request_id' + user_id = 'fake_user' self.task = self.task_factory.new_task(self.task_type, TENANT1, + UUID1, user_id, request_id, task_time_to_live=task_ttl, task_input=task_input) diff --git a/glance/tests/unit/async_/flows/test_introspect.py b/glance/tests/unit/async_/flows/test_introspect.py index db171bdeb1..f7c6542321 100644 --- a/glance/tests/unit/async_/flows/test_introspect.py +++ b/glance/tests/unit/async_/flows/test_introspect.py @@ -44,7 +44,11 @@ class TestImportTask(test_utils.BaseTestCase): task_ttl = CONF.task.task_time_to_live self.task_type = 'import' + image_id = 'fake_image_id' + user_id = 'fake_user' + request_id = 'fake_request_id' self.task = self.task_factory.new_task(self.task_type, TENANT1, + image_id, user_id, request_id, task_time_to_live=task_ttl, task_input=task_input) diff --git a/glance/tests/unit/async_/flows/test_web_download.py b/glance/tests/unit/async_/flows/test_web_download.py index 02bf37f782..f18ef1c182 100644 --- a/glance/tests/unit/async_/flows/test_web_download.py +++ b/glance/tests/unit/async_/flows/test_web_download.py @@ -56,7 +56,11 @@ class TestWebDownloadTask(test_utils.BaseTestCase): task_ttl = CONF.task.task_time_to_live self.task_type = 'import' + request_id = 'fake_request_id' + user_id = 'fake_user' self.task = self.task_factory.new_task(self.task_type, TENANT1, + self.image_id, user_id, + request_id, task_time_to_live=task_ttl, task_input=task_input) diff --git a/glance/tests/unit/async_/test_taskflow_executor.py b/glance/tests/unit/async_/test_taskflow_executor.py index b31ad85011..eb337e7d6f 100644 --- a/glance/tests/unit/async_/test_taskflow_executor.py +++ b/glance/tests/unit/async_/test_taskflow_executor.py @@ -63,8 +63,13 @@ class TestTaskExecutor(test_utils.BaseTestCase): task_ttl = CONF.task.task_time_to_live self.task_type = 'import' + image_id = 'fake-image-id' + request_id = 'fake_request_id' + user_id = 'fake_user' self.task_factory = domain.TaskFactory() self.task = self.task_factory.new_task(self.task_type, TENANT1, + image_id, user_id, + request_id, task_time_to_live=task_ttl, task_input=task_input) diff --git a/glance/tests/unit/test_auth.py b/glance/tests/unit/test_auth.py index f3600e9978..afd49f9303 100644 --- a/glance/tests/unit/test_auth.py +++ b/glance/tests/unit/test_auth.py @@ -871,8 +871,12 @@ class TestImmutableTask(utils.BaseTestCase): task_factory = glance.domain.TaskFactory() self.context = glance.context.RequestContext(tenant=TENANT2) task_type = 'import' + image_id = 'fake_image_id' + user_id = 'fake_user' + request_id = 'fake_request_id' owner = TENANT2 - task = task_factory.new_task(task_type, owner) + task = task_factory.new_task(task_type, owner, image_id, + user_id, request_id) self.task = authorization.ImmutableTaskProxy(task) def _test_change(self, attr, value): @@ -938,8 +942,12 @@ class TestImmutableTaskStub(utils.BaseTestCase): task_factory = glance.domain.TaskFactory() self.context = glance.context.RequestContext(tenant=TENANT2) task_type = 'import' + image_id = 'fake_image_id' + user_id = 'fake_user' + request_id = 'fake_request_id' owner = TENANT2 - task = task_factory.new_task(task_type, owner) + task = task_factory.new_task(task_type, owner, image_id, + user_id, request_id) self.task = authorization.ImmutableTaskStubProxy(task) def _test_change(self, attr, value): @@ -992,6 +1000,9 @@ class TestTaskFactoryProxy(utils.BaseTestCase): self.task_type = 'import' self.task_input = '{"loc": "fake"}' self.owner = 'foo' + self.image_id = 'fake_image_id' + self.user_id = 'fake_user' + self.request_id = 'fake_request_id' self.request1 = unittest_utils.get_fake_request(tenant=TENANT1) self.request2 = unittest_utils.get_fake_request(tenant=TENANT2) @@ -999,7 +1010,9 @@ class TestTaskFactoryProxy(utils.BaseTestCase): def test_task_create_default_owner(self): owner = self.request1.context.owner task = self.task_factory.new_task(task_type=self.task_type, - owner=owner) + owner=owner, image_id=self.image_id, + user_id=self.user_id, + request_id=self.request_id) self.assertEqual(TENANT1, task.owner) def test_task_create_wrong_owner(self): @@ -1007,14 +1020,18 @@ class TestTaskFactoryProxy(utils.BaseTestCase): self.task_factory.new_task, task_type=self.task_type, task_input=self.task_input, - owner=self.owner) + owner=self.owner, image_id=self.image_id, + user_id=self.user_id, + request_id=self.request_id) def test_task_create_owner_as_None(self): self.assertRaises(exception.Forbidden, self.task_factory.new_task, task_type=self.task_type, task_input=self.task_input, - owner=None) + owner=None, image_id=self.image_id, + user_id=self.user_id, + request_id=self.request_id) def test_task_create_admin_context_owner_as_None(self): self.context.is_admin = True @@ -1022,7 +1039,9 @@ class TestTaskFactoryProxy(utils.BaseTestCase): self.task_factory.new_task, task_type=self.task_type, task_input=self.task_input, - owner=None) + owner=None, image_id=self.image_id, + user_id=self.user_id, + request_id=self.request_id) class TestTaskRepoProxy(utils.BaseTestCase): @@ -1049,11 +1068,17 @@ class TestTaskRepoProxy(utils.BaseTestCase): super(TestTaskRepoProxy, self).setUp() task_factory = glance.domain.TaskFactory() task_type = 'import' + image_id = 'fake_image_id' + user_id = 'fake_user' + request_id = 'fake_request_id' owner = None self.fixtures = [ - task_factory.new_task(task_type, owner), - task_factory.new_task(task_type, owner), - task_factory.new_task(task_type, owner), + task_factory.new_task(task_type, owner, image_id, + user_id, request_id), + task_factory.new_task(task_type, owner, image_id, + user_id, request_id), + task_factory.new_task(task_type, owner, image_id, + user_id, request_id), ] self.context = glance.context.RequestContext(tenant=TENANT1) task_repo = self.TaskRepoStub(self.fixtures) diff --git a/glance/tests/unit/test_db.py b/glance/tests/unit/test_db.py index f2c2414e20..6c6ba0fa16 100644 --- a/glance/tests/unit/test_db.py +++ b/glance/tests/unit/test_db.py @@ -800,13 +800,20 @@ class TestTaskRepo(test_utils.BaseTestCase): def test_add_task(self): task_type = 'import' - task = self.task_factory.new_task(task_type, None, + image_id = 'fake_image_id' + user_id = 'fake_user' + request_id = 'fake_request_id' + task = self.task_factory.new_task(task_type, None, image_id, + user_id, request_id, task_input=self.fake_task_input) self.assertEqual(task.updated_at, task.created_at) self.task_repo.add(task) retrieved_task = self.task_repo.get(task.task_id) self.assertEqual(task.updated_at, retrieved_task.updated_at) self.assertEqual(self.fake_task_input, retrieved_task.task_input) + self.assertEqual(image_id, task.image_id) + self.assertEqual(user_id, task.user_id) + self.assertEqual(request_id, task.request_id) def test_save_task(self): task = self.task_repo.get(UUID1) diff --git a/glance/tests/unit/test_domain.py b/glance/tests/unit/test_domain.py index b1f4137dda..c7d112a439 100644 --- a/glance/tests/unit/test_domain.py +++ b/glance/tests/unit/test_domain.py @@ -325,7 +325,11 @@ class TestTaskFactory(test_utils.BaseTestCase): task_type = 'import' owner = TENANT1 task_input = 'input' + image_id = 'fake_image_id' + user_id = 'fake_user' + request_id = 'fake_request_id' task = self.task_factory.new_task(task_type, owner, + image_id, user_id, request_id, task_input=task_input, result='test_result', message='test_message') @@ -339,15 +343,21 @@ class TestTaskFactory(test_utils.BaseTestCase): self.assertEqual(task_input, task.task_input) self.assertEqual('test_message', task.message) self.assertEqual('test_result', task.result) + self.assertEqual(image_id, task.image_id) + self.assertEqual(user_id, task.user_id) + self.assertEqual(request_id, task.request_id) def test_new_task_invalid_type(self): task_type = 'blah' + image_id = 'fake_image_id' + user_id = 'fake_user' + request_id = 'fake_request_id' owner = TENANT1 self.assertRaises( exception.InvalidTaskType, self.task_factory.new_task, task_type, - owner, + owner, image_id, user_id, request_id ) @@ -357,10 +367,14 @@ class TestTask(test_utils.BaseTestCase): super(TestTask, self).setUp() self.task_factory = domain.TaskFactory() task_type = 'import' + image_id = 'fake_image_id' + user_id = 'fake_user' + request_id = 'fake_request_id' owner = TENANT1 task_ttl = CONF.task.task_time_to_live self.task = self.task_factory.new_task(task_type, - owner, + owner, image_id, user_id, + request_id, task_time_to_live=task_ttl) def test_task_invalid_status(self): @@ -373,6 +387,9 @@ class TestTask(test_utils.BaseTestCase): task_type='import', status=status, owner=None, + image_id='fake_image_id', + user_id='fake_user', + request_id='fake_request_id', expires_at=None, created_at=timeutils.utcnow(), updated_at=timeutils.utcnow(), @@ -485,6 +502,9 @@ class TestTaskStub(test_utils.BaseTestCase): self.task_type = 'import' self.owner = TENANT1 self.task_ttl = CONF.task.task_time_to_live + self.image_id = 'fake_image_id' + self.user_id = 'fake_user' + self.request_id = 'fake_request_id' def test_task_stub_init(self): self.task_factory = domain.TaskFactory() @@ -495,7 +515,10 @@ class TestTaskStub(test_utils.BaseTestCase): self.owner, 'expires_at', 'created_at', - 'updated_at' + 'updated_at', + self.image_id, + self.user_id, + self.request_id, ) self.assertEqual(self.task_id, task.task_id) self.assertEqual(self.task_type, task.type) @@ -504,6 +527,9 @@ class TestTaskStub(test_utils.BaseTestCase): self.assertEqual('expires_at', task.expires_at) self.assertEqual('created_at', task.created_at) self.assertEqual('updated_at', task.updated_at) + self.assertEqual(self.image_id, task.image_id) + self.assertEqual(self.user_id, task.user_id) + self.assertEqual(self.request_id, task.request_id) def test_task_stub_get_status(self): status = 'pending' @@ -514,7 +540,10 @@ class TestTaskStub(test_utils.BaseTestCase): self.owner, 'expires_at', 'created_at', - 'updated_at' + 'updated_at', + self.image_id, + self.user_id, + self.request_id, ) self.assertEqual(status, task.status) diff --git a/glance/tests/unit/test_notifier.py b/glance/tests/unit/test_notifier.py index 72819745b4..14f525f87f 100644 --- a/glance/tests/unit/test_notifier.py +++ b/glance/tests/unit/test_notifier.py @@ -633,6 +633,9 @@ class TestTaskNotifications(utils.BaseTestCase): expires_at=None, created_at=DATETIME, updated_at=DATETIME, + image_id='fake_image_id', + user_id='fake_user', + request_id='fake_request_id', ) self.task = Task( @@ -645,7 +648,10 @@ class TestTaskNotifications(utils.BaseTestCase): updated_at=DATETIME, task_input=task_input, result='res', - message='blah' + message='blah', + image_id='fake_image_id', + user_id='fake_user', + request_id='fake_request_id', ) self.context = glance.context.RequestContext( tenant=TENANT2, @@ -694,6 +700,11 @@ class TestTaskNotifications(utils.BaseTestCase): ) if 'location' in output_log['payload']: self.fail('Notification contained location field.') + # Verify newly added fields 'image_id', 'user_id' and + # 'request_id' are not part of notification yet + self.assertTrue('image_id' not in output_log['payload']) + self.assertTrue('user_id' not in output_log['payload']) + self.assertTrue('request_id' not in output_log['payload']) def test_task_create_notification_disabled(self): self.config(disabled_notifications=['task.create']) @@ -724,6 +735,11 @@ class TestTaskNotifications(utils.BaseTestCase): ) if 'location' in output_log['payload']: self.fail('Notification contained location field.') + # Verify newly added fields 'image_id', 'user_id' and + # 'request_id' are not part of notification yet + self.assertTrue('image_id' not in output_log['payload']) + self.assertTrue('user_id' not in output_log['payload']) + self.assertTrue('request_id' not in output_log['payload']) def test_task_delete_notification_disabled(self): self.config(disabled_notifications=['task.delete']) @@ -742,6 +758,15 @@ class TestTaskNotifications(utils.BaseTestCase): self.assertEqual('INFO', output_log['notification_type']) self.assertEqual('task.run', output_log['event_type']) self.assertEqual(self.task.task_id, output_log['payload']['id']) + self.assertFalse( + self.task.image_id in output_log['payload'] + ) + self.assertFalse( + self.task.user_id in output_log['payload'] + ) + self.assertFalse( + self.task.request_id in output_log['payload'] + ) def test_task_run_notification_disabled(self): self.config(disabled_notifications=['task.run']) @@ -760,6 +785,11 @@ class TestTaskNotifications(utils.BaseTestCase): self.assertEqual('INFO', output_log['notification_type']) self.assertEqual('task.processing', output_log['event_type']) self.assertEqual(self.task.task_id, output_log['payload']['id']) + # Verify newly added fields 'image_id', 'user_id' and + # 'request_id' are not part of notification yet + self.assertTrue('image_id' not in output_log['payload']) + self.assertTrue('user_id' not in output_log['payload']) + self.assertTrue('request_id' not in output_log['payload']) def test_task_processing_notification_disabled(self): self.config(disabled_notifications=['task.processing']) @@ -776,6 +806,11 @@ class TestTaskNotifications(utils.BaseTestCase): self.assertEqual('INFO', output_log['notification_type']) self.assertEqual('task.success', output_log['event_type']) self.assertEqual(self.task.task_id, output_log['payload']['id']) + # Verify newly added fields 'image_id', 'user_id' and + # 'request_id' are not part of notification yet + self.assertTrue('image_id' not in output_log['payload']) + self.assertTrue('user_id' not in output_log['payload']) + self.assertTrue('request_id' not in output_log['payload']) def test_task_success_notification_disabled(self): self.config(disabled_notifications=['task.processing', 'task.success']) @@ -792,6 +827,11 @@ class TestTaskNotifications(utils.BaseTestCase): self.assertEqual('INFO', output_log['notification_type']) self.assertEqual('task.failure', output_log['event_type']) self.assertEqual(self.task.task_id, output_log['payload']['id']) + # Verify newly added fields 'image_id', 'user_id' and + # 'request_id' are not part of notification yet + self.assertTrue('image_id' not in output_log['payload']) + self.assertTrue('user_id' not in output_log['payload']) + self.assertTrue('request_id' not in output_log['payload']) def test_task_failure_notification_disabled(self): self.config(disabled_notifications=['task.failure']) diff --git a/glance/tests/unit/v2/test_images_resource.py b/glance/tests/unit/v2/test_images_resource.py index bbc2677626..2ba7656531 100644 --- a/glance/tests/unit/v2/test_images_resource.py +++ b/glance/tests/unit/v2/test_images_resource.py @@ -3053,7 +3053,10 @@ class TestImagesController(base.IsolatedUnitTest): 'backend': mock.ANY} mock_new_task.assert_called_with(task_type='api_image_import', owner=TENANT2, - task_input=expected_input) + task_input=expected_input, + image_id=UUID4, + user_id=request.context.user_id, + request_id=request.context.request_id) def test_image_import_copy_not_allowed_by_policy(self): # Make sure that if the policy check fails, we fail a copy-image with diff --git a/glance/tests/unit/v2/test_tasks_resource.py b/glance/tests/unit/v2/test_tasks_resource.py index 5fcee6b278..a2f7eb3ef9 100644 --- a/glance/tests/unit/v2/test_tasks_resource.py +++ b/glance/tests/unit/v2/test_tasks_resource.py @@ -56,6 +56,9 @@ def _db_fixture(task_id, **kwargs): 'input': {}, 'result': None, 'owner': None, + 'image_id': 'fake_image_id', + 'user_id': 'fake_user', + 'request_id': 'fake_request_id', 'message': None, 'expires_at': default_datetime + datetime.timedelta(days=365), 'created_at': default_datetime, @@ -79,7 +82,10 @@ def _domain_fixture(task_id, **kwargs): 'updated_at': kwargs.get('updated_at', default_datetime), 'task_input': kwargs.get('task_input', {}), 'message': kwargs.get('message'), - 'result': kwargs.get('result') + 'result': kwargs.get('result'), + 'image_id': kwargs.get('image_id'), + 'user_id': kwargs.get('user_id'), + 'request_id': kwargs.get('request_id'), } task = glance.domain.Task(**task_properties) return task @@ -726,19 +732,31 @@ class TestTasksSerializer(test_utils.BaseTestCase): self.fixtures = [ _domain_fixture(UUID1, type='import', status='pending', task_input={'loc': 'fake'}, result={}, - owner=TENANT1, message='', created_at=DATETIME, + owner=TENANT1, image_id='fake_image_id', + user_id='fake_user', + request_id='fake_request_id', + message='', created_at=DATETIME, updated_at=DATETIME), _domain_fixture(UUID2, type='import', status='processing', task_input={'loc': 'bake'}, owner=TENANT2, + image_id='fake_image_id', + user_id='fake_user', + request_id='fake_request_id', message='', created_at=DATETIME, updated_at=DATETIME, result={}), _domain_fixture(UUID3, type='import', status='success', task_input={'loc': 'foo'}, owner=TENANT3, + image_id='fake_image_id', + user_id='fake_user', + request_id='fake_request_id', message='', created_at=DATETIME, updated_at=DATETIME, result={}, expires_at=DATETIME), _domain_fixture(UUID4, type='import', status='failure', task_input={'loc': 'boo'}, owner=TENANT4, + image_id='fake_image_id', + user_id='fake_user', + request_id='fake_request_id', message='', created_at=DATETIME, updated_at=DATETIME, result={}, expires_at=DATETIME), @@ -843,6 +861,9 @@ class TestTasksSerializer(test_utils.BaseTestCase): 'expires_at': ISOTIME, 'self': '/v2/tasks/%s' % UUID4, 'schema': '/v2/schemas/task', + 'image_id': 'fake_image_id', + 'user_id': 'fake_user', + 'request_id': 'fake_request_id', } response = webob.Response() self.serializer.get(response, self.fixtures[3]) @@ -863,6 +884,9 @@ class TestTasksSerializer(test_utils.BaseTestCase): 'updated_at': ISOTIME, 'self': '/v2/tasks/%s' % UUID1, 'schema': '/v2/schemas/task', + 'image_id': 'fake_image_id', + 'user_id': 'fake_user', + 'request_id': 'fake_request_id', } response = webob.Response() self.serializer.get(response, self.fixtures[0]) @@ -882,6 +906,9 @@ class TestTasksSerializer(test_utils.BaseTestCase): 'updated_at': ISOTIME, 'self': '/v2/tasks/%s' % UUID2, 'schema': '/v2/schemas/task', + 'image_id': 'fake_image_id', + 'user_id': 'fake_user', + 'request_id': 'fake_request_id', } response = webob.Response()