)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"bed321e1fad6fa399b17d3fb747ab9bb19e8bd78","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Flavio Percoco \u003cflaper87@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-01-22 11:40:34 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Taskflow Executor"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds support for a new task executor. This executor"},{"line_number":10,"context_line":"leverages the taskflow library which is responsible for dispatching"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"1a930d6b_d686ed12","line":7,"updated":"2015-01-22 17:04:40.000000000","message":"Should probably keep the subject imperative, e.g., \"Add Support for a Taskflow Executor\"","commit_id":"50db9e6a6e1c40a9c46cd2302134018b23814134"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"bed321e1fad6fa399b17d3fb747ab9bb19e8bd78","unresolved":false,"context_lines":[{"line_number":14,"context_line":"have parallel execution in which case it is possible to also configure"},{"line_number":15,"context_line":"the number of workers running at the same time."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"partially implements bp async-glance-workers"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Co-Authored by: Arnaud Legendre \u003carnaudleg@gmail.com\u003e"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"1a930d6b_b6ac01a2","line":17,"updated":"2015-01-22 17:04:40.000000000","message":"Should mention blueprint taskflow-integration here as well","commit_id":"50db9e6a6e1c40a9c46cd2302134018b23814134"}],"etc/glance-api.conf":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"6b405c926594ce225879b89d1b342e036ce3f5ad","unresolved":false,"context_lines":[{"line_number":576,"context_line":"#store_type_preference \u003d"},{"line_number":577,"context_line":""},{"line_number":578,"context_line":"[eventlet_executor]"},{"line_number":579,"context_line":"# The mode in which the engine will run. Can be \u0027serial\u0027, \u0027parallel\u0027"},{"line_number":580,"context_line":"# or \u0027worker-based\u0027."},{"line_number":581,"context_line":"#engine_mode \u003d serial"},{"line_number":582,"context_line":""}],"source_content_type":"text/plain","patch_set":1,"id":"AAAAWH%2F9gyg%3D","line":579,"updated":"2014-04-04 01:31:50.000000000","message":"Might also consider just \u0027serial\u0027, \u0027parallel\u0027, and not worker-based yet, worker based requires workers to run somewhere on some remote system (over the MQ for example) and involve more config than what is provided here (MQ config and such). Maybe a later change for that?","commit_id":"1be8d8e1264af4e3cf9c7002c22ba58e1eec13cd"},{"author":{"_account_id":8759,"name":"Arnaud Legendre","email":"arnaudleg@gmail.com","username":"arnaud"},"change_message_id":"f1f327ea7fbe784ba423b2050a63c664e12bedb3","unresolved":false,"context_lines":[{"line_number":576,"context_line":"#store_type_preference \u003d"},{"line_number":577,"context_line":""},{"line_number":578,"context_line":"[eventlet_executor]"},{"line_number":579,"context_line":"# The mode in which the engine will run. Can be \u0027serial\u0027, \u0027parallel\u0027"},{"line_number":580,"context_line":"# or \u0027worker-based\u0027."},{"line_number":581,"context_line":"#engine_mode \u003d serial"},{"line_number":582,"context_line":""}],"source_content_type":"text/plain","patch_set":1,"id":"AAAAWH%2F9aHM%3D","line":579,"in_reply_to":"AAAAWH%2F9gdw%3D","updated":"2014-04-04 18:33:01.000000000","message":"Done","commit_id":"1be8d8e1264af4e3cf9c7002c22ba58e1eec13cd"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"4e91c151a4c020d3533bbb4fdae9c359ecc44414","unresolved":false,"context_lines":[{"line_number":576,"context_line":"#store_type_preference \u003d"},{"line_number":577,"context_line":""},{"line_number":578,"context_line":"[eventlet_executor]"},{"line_number":579,"context_line":"# The mode in which the engine will run. Can be \u0027serial\u0027, \u0027parallel\u0027"},{"line_number":580,"context_line":"# or \u0027worker-based\u0027."},{"line_number":581,"context_line":"#engine_mode \u003d serial"},{"line_number":582,"context_line":""}],"source_content_type":"text/plain","patch_set":1,"id":"AAAAWH%2F9gdw%3D","line":579,"in_reply_to":"AAAAWH%2F9gyg%3D","updated":"2014-04-04 03:54:04.000000000","message":"I tend to agree this. IMHO, probably we could implement worker-based mode as a dedicated executor in glance/async in future, and provide a configuration group for it as needed. We might have more then one worker-based executor for different remote system as well.","commit_id":"1be8d8e1264af4e3cf9c7002c22ba58e1eec13cd"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"2b46883be55c882a84c82e9ee6cd0c86fedd644b","unresolved":false,"context_lines":[{"line_number":436,"context_line":""},{"line_number":437,"context_line":"[taskflow_executor]"},{"line_number":438,"context_line":"# The mode in which the engine will run. Can be \u0027serial\u0027 or \u0027parallel\u0027."},{"line_number":439,"context_line":"#engine_mode \u003d serial"},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"# The number of parallel activities executed at the same time by"},{"line_number":442,"context_line":"# the engine. The value can be greater than one when the engine mode is"}],"source_content_type":"text/plain","patch_set":17,"id":"5a890539_8765151f","line":439,"updated":"2014-12-01 02:15:12.000000000","message":"I\u0027m thinking the image introspection and conversion scenarios, so IMHO, these scenario is most like a serial workflow, i.e. image-import \u003d image-introspection -\u003e image-create(only metadata) -\u003e image-conversion -\u003e image data save/upload. So i\u0027m not really sure if we could support the parallel mode. Please let me know if I missed anything.","commit_id":"a1b015a4f8a1cdf524f0f3e628d6125ee026a15d"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"2bdb79cea580aff10a422c5eaf832ccbf85f6318","unresolved":false,"context_lines":[{"line_number":436,"context_line":""},{"line_number":437,"context_line":"[taskflow_executor]"},{"line_number":438,"context_line":"# The mode in which the engine will run. Can be \u0027serial\u0027 or \u0027parallel\u0027."},{"line_number":439,"context_line":"#engine_mode \u003d serial"},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"# The number of parallel activities executed at the same time by"},{"line_number":442,"context_line":"# the engine. The value can be greater than one when the engine mode is"}],"source_content_type":"text/plain","patch_set":17,"id":"5a890539_d3a19f47","line":439,"in_reply_to":"5a890539_8765151f","updated":"2014-12-01 07:55:24.000000000","message":"@flwang, I think the comment at the bottom of https://review.openstack.org/#/c/85211/1/glance/async/eventlet_executor.py could explain the case for your question here.\n\nThe key point which guarantee the task order is currently the taskflow executor are using linear flow in code.","commit_id":"a1b015a4f8a1cdf524f0f3e628d6125ee026a15d"},{"author":{"_account_id":8759,"name":"Arnaud Legendre","email":"arnaudleg@gmail.com","username":"arnaud"},"change_message_id":"c9120add5882d17476a8d9015e2c9d846624e165","unresolved":false,"context_lines":[{"line_number":436,"context_line":""},{"line_number":437,"context_line":"[taskflow_executor]"},{"line_number":438,"context_line":"# The mode in which the engine will run. Can be \u0027serial\u0027 or \u0027parallel\u0027."},{"line_number":439,"context_line":"#engine_mode \u003d serial"},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"# The number of parallel activities executed at the same time by"},{"line_number":442,"context_line":"# the engine. The value can be greater than one when the engine mode is"}],"source_content_type":"text/plain","patch_set":17,"id":"5a890539_9e86eeb7","line":439,"in_reply_to":"5a890539_8765151f","updated":"2014-12-03 05:44:05.000000000","message":"@flwang: there are some subtasks that can be parallel. An example of introspection:\n\n\nflow \u003d lf.Flow(task_type).add(\n        _CreateImage(task_id, task_type, task_repo, image_repo, image_factory),\n        uf.Flow(task_type).add(\n            lf.Flow(task_type).add(\n                _ImportToLocal(task_id, task_type, task_repo, uri),\n                _Introspect(task_id, task_type, image_repo),\n                _DeleteFromLocal(task_id, task_type),\n            ),\n            _ImportToStore(task_id, task_type, image_repo, uri)\n        ),\n        _SaveImage(task_id, task_type, image_repo),\n        _CompleteTask(task_id, task_type, task_repo)\n    )\n\n\nWe can upload the image to the drop location and to the final destination in parallel which makes theoretically the introspection a no-op in terms of execution time.\n\n\nI think there are several levels of workflows: the one you mention (introspect-\u003econvert-\u003e...) and the one I mention (inside introspect: create-\u003e import-\u003eintrospect-\u003edelete-\u003esave-\u003e...). I think this config variable should be used for the most granular level (the one I mention).\n\n\nsee: https://review.openstack.org/#/c/134085/1/glance/common/flows/vmdk_bare_import.py,cm for an example.\n\n\nThere is a lot of room for discussion and design decisions.\n\n\n\nLet me know if you get my point at least :)","commit_id":"a1b015a4f8a1cdf524f0f3e628d6125ee026a15d"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"9632cb503cc0537a8376f6b7e2ed49cb22f01f64","unresolved":false,"context_lines":[{"line_number":442,"context_line":""},{"line_number":443,"context_line":"# Specifies which task executor to be used to run the task scripts."},{"line_number":444,"context_line":"# The default value for task_executor is eventlet."},{"line_number":445,"context_line":"# task_executor \u003d eventlet"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"# Specifies the maximum number of eventlet threads which can be spun up by"},{"line_number":448,"context_line":"# the eventlet based task executor to perform execution of Glance tasks."}],"source_content_type":"text/plain","patch_set":22,"id":"da86d52c_8e38d2a1","line":445,"updated":"2015-02-02 22:36:28.000000000","message":"We may need to add the newly available executor in this list of options. Keeping the default as is if we do not want UpgradeImpact.","commit_id":"bc787accbdf9a0911abeb3300c01eb394986b958"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"284b90cd63f1104ce160a9e4178efbeaf308a254","unresolved":false,"context_lines":[{"line_number":442,"context_line":""},{"line_number":443,"context_line":"# Specifies which task executor to be used to run the task scripts."},{"line_number":444,"context_line":"# The default value for task_executor is eventlet."},{"line_number":445,"context_line":"# task_executor \u003d eventlet"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"# Specifies the maximum number of eventlet threads which can be spun up by"},{"line_number":448,"context_line":"# the eventlet based task executor to perform execution of Glance tasks."}],"source_content_type":"text/plain","patch_set":22,"id":"da86d52c_9244191c","line":445,"in_reply_to":"da86d52c_8e38d2a1","updated":"2015-02-04 20:02:32.000000000","message":"Done","commit_id":"bc787accbdf9a0911abeb3300c01eb394986b958"}],"glance/api/v2/tasks.py":[{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"dc59099882e2b794a28fede81a9f4d56cc70df39","unresolved":false,"context_lines":[{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        type \u003d filters.get(\u0027type\u0027)"},{"line_number":154,"context_line":"        if type:"},{"line_number":155,"context_line":"            if type not in [\u0027image_import\u0027]:"},{"line_number":156,"context_line":"                msg \u003d _(\u0027Invalid type value: %s\u0027) % type"},{"line_number":157,"context_line":"                raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":158,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAWn%2F%2F4z4%3D","line":155,"updated":"2014-04-08 18:25:16.000000000","message":"oh! please let\u0027s not change the API contract now.","commit_id":"65aa35cfd2fb5d403985bcd090c342abb618e11e"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"dc59099882e2b794a28fede81a9f4d56cc70df39","unresolved":false,"context_lines":[{"line_number":310,"context_line":"    \"type\": {"},{"line_number":311,"context_line":"        \"description\": _(\"The type of task represented by this content\"),"},{"line_number":312,"context_line":"        \"enum\": ["},{"line_number":313,"context_line":"            \"image_import\","},{"line_number":314,"context_line":"        ],"},{"line_number":315,"context_line":"        \"type\": \"string\""},{"line_number":316,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAWn%2F%2F4z0%3D","line":313,"updated":"2014-04-08 18:25:16.000000000","message":"ditto","commit_id":"65aa35cfd2fb5d403985bcd090c342abb618e11e"}],"glance/async/eventlet_executor.py":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"311bff56fb7fb7e0ea43edaaa437f9c59760c6e1","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    cfg.StrOpt(\u0027engine_mode\u0027,"},{"line_number":29,"context_line":"               default\u003d\u0027serial\u0027,"},{"line_number":30,"context_line":"               help\u003d_(\"The mode in which the engine will run. \""},{"line_number":31,"context_line":"                      \"Can be \u0027serial\u0027, \u0027parallel\u0027 or \u0027worker-based\u0027.\")),"},{"line_number":32,"context_line":"    cfg.IntOpt(\u0027max_workers\u0027,"},{"line_number":33,"context_line":"               default\u003d1,"},{"line_number":34,"context_line":"               help\u003d_(\"The number of workers (parallel activities) \""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F9g0A%3D","line":31,"updated":"2014-04-04 01:25:20.000000000","message":"Do u want to leave off the \u0027worker-based\u0027 for now, seems like this is a eventlet_executor subgroup, which to me implies its not using the worker-based model (at least currently). Maybe leave that off for now until?","commit_id":"1be8d8e1264af4e3cf9c7002c22ba58e1eec13cd"},{"author":{"_account_id":8759,"name":"Arnaud Legendre","email":"arnaudleg@gmail.com","username":"arnaud"},"change_message_id":"f1f327ea7fbe784ba423b2050a63c664e12bedb3","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    cfg.StrOpt(\u0027engine_mode\u0027,"},{"line_number":29,"context_line":"               default\u003d\u0027serial\u0027,"},{"line_number":30,"context_line":"               help\u003d_(\"The mode in which the engine will run. \""},{"line_number":31,"context_line":"                      \"Can be \u0027serial\u0027, \u0027parallel\u0027 or \u0027worker-based\u0027.\")),"},{"line_number":32,"context_line":"    cfg.IntOpt(\u0027max_workers\u0027,"},{"line_number":33,"context_line":"               default\u003d1,"},{"line_number":34,"context_line":"               help\u003d_(\"The number of workers (parallel activities) \""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F9aGE%3D","line":31,"in_reply_to":"AAAAWH%2F9g0A%3D","updated":"2014-04-04 18:33:01.000000000","message":"Done","commit_id":"1be8d8e1264af4e3cf9c7002c22ba58e1eec13cd"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"4e91c151a4c020d3533bbb4fdae9c359ecc44414","unresolved":false,"context_lines":[{"line_number":45,"context_line":"class _Task(task.Task):"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def __init__(self, task_script, task_id, task_input):"},{"line_number":48,"context_line":"        super(_Task, self).__init__()"},{"line_number":49,"context_line":"        self.task_script \u003d task_script"},{"line_number":50,"context_line":"        self.task_id \u003d task_id"},{"line_number":51,"context_line":"        self.input \u003d task_input"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F9gQA%3D","line":48,"updated":"2014-04-04 03:54:04.000000000","message":"if I understand task document correct, it seems we\u0027d better provide a unique name to each task, since it uniquely identifies that task in storage it is important that the name be relevant and identifiable if the task is recreated for subsequent resumption (if applicable).\n\nso what about something like this:\n    super(_Task, self).__init__(name\u003d\"%s-%s\" % (task_type, task_id))","commit_id":"1be8d8e1264af4e3cf9c7002c22ba58e1eec13cd"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"bf47aedb92e278a0eb3a2a4ccb59c1a8935e5548","unresolved":false,"context_lines":[{"line_number":45,"context_line":"class _Task(task.Task):"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def __init__(self, task_script, task_id, task_input):"},{"line_number":48,"context_line":"        super(_Task, self).__init__()"},{"line_number":49,"context_line":"        self.task_script \u003d task_script"},{"line_number":50,"context_line":"        self.task_id \u003d task_id"},{"line_number":51,"context_line":"        self.input \u003d task_input"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F9Z%2BE%3D","line":48,"in_reply_to":"AAAAWH%2F9gQA%3D","updated":"2014-04-04 18:33:08.000000000","message":"That would be a good idea, seems like the above name is a good one (for resumption and persistence the name becomes important, which might be a later use-case but would be good to prepare for that earlier rather than later).","commit_id":"1be8d8e1264af4e3cf9c7002c22ba58e1eec13cd"},{"author":{"_account_id":8759,"name":"Arnaud Legendre","email":"arnaudleg@gmail.com","username":"arnaud"},"change_message_id":"f1f327ea7fbe784ba423b2050a63c664e12bedb3","unresolved":false,"context_lines":[{"line_number":45,"context_line":"class _Task(task.Task):"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def __init__(self, task_script, task_id, task_input):"},{"line_number":48,"context_line":"        super(_Task, self).__init__()"},{"line_number":49,"context_line":"        self.task_script \u003d task_script"},{"line_number":50,"context_line":"        self.task_id \u003d task_id"},{"line_number":51,"context_line":"        self.input \u003d task_input"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F9aFs%3D","line":48,"in_reply_to":"AAAAWH%2F9gQA%3D","updated":"2014-04-04 18:33:01.000000000","message":"good point zhiyan","commit_id":"1be8d8e1264af4e3cf9c7002c22ba58e1eec13cd"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"4e91c151a4c020d3533bbb4fdae9c359ecc44414","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                      {\u0027type\u0027: type})"},{"line_number":84,"context_line":"            raise exception.TaskScriptImportFailure(type)"},{"line_number":85,"context_line":"        flow \u003d lf.Flow(type).add("},{"line_number":86,"context_line":"            _Task(task_script, task_id, task_input)"},{"line_number":87,"context_line":"        )"},{"line_number":88,"context_line":"        try:"},{"line_number":89,"context_line":"            engines.run(flow, self.engine_conf)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F9gR8%3D","line":86,"updated":"2014-04-04 03:54:04.000000000","message":"I\u0027m wondering is there any different between \u0027serial\u0027 and \u0027parallel\u0027 mode for us? since we have only one task in the flow.\n\nbtw, I\u0027m not sure does linear flow support parallel execution? could only unordered flow do that? thanks.","commit_id":"1be8d8e1264af4e3cf9c7002c22ba58e1eec13cd"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"4f29e6c6fb76972fbd24ede9832a741bdcfd9ad2","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                      {\u0027type\u0027: type})"},{"line_number":84,"context_line":"            raise exception.TaskScriptImportFailure(type)"},{"line_number":85,"context_line":"        flow \u003d lf.Flow(type).add("},{"line_number":86,"context_line":"            _Task(task_script, task_id, task_input)"},{"line_number":87,"context_line":"        )"},{"line_number":88,"context_line":"        try:"},{"line_number":89,"context_line":"            engines.run(flow, self.engine_conf)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F9YHw%3D","line":86,"in_reply_to":"AAAAWH%2F9Z%2F4%3D","updated":"2014-04-04 23:55:41.000000000","message":"Thanks for all your explaining.\n\nYeah, it was sensible to me (for future cases), just want to make more clear.","commit_id":"1be8d8e1264af4e3cf9c7002c22ba58e1eec13cd"},{"author":{"_account_id":8759,"name":"Arnaud Legendre","email":"arnaudleg@gmail.com","username":"arnaud"},"change_message_id":"f1f327ea7fbe784ba423b2050a63c664e12bedb3","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                      {\u0027type\u0027: type})"},{"line_number":84,"context_line":"            raise exception.TaskScriptImportFailure(type)"},{"line_number":85,"context_line":"        flow \u003d lf.Flow(type).add("},{"line_number":86,"context_line":"            _Task(task_script, task_id, task_input)"},{"line_number":87,"context_line":"        )"},{"line_number":88,"context_line":"        try:"},{"line_number":89,"context_line":"            engines.run(flow, self.engine_conf)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F9Z%2F4%3D","line":86,"in_reply_to":"AAAAWH%2F9gR8%3D","updated":"2014-04-04 18:33:01.000000000","message":"@ZhiYan: In the future, we might have some parallel preprocessing tasks or processing tasks (before/after the import), in this case you might want to have the engine in parallel mode.\nlf.Flow(type).add(uf.Flow().add(Preprocessing1(), Preprocessing2()),Task(), PostProcessing())\nsomething like that.\nSo, I think this is OK like for now. Let me know if this makes sense to you.","commit_id":"1be8d8e1264af4e3cf9c7002c22ba58e1eec13cd"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"9abd37e339dfab0aa76f87609098a739b26fb461","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                      {\u0027type\u0027: type})"},{"line_number":84,"context_line":"            raise exception.TaskScriptImportFailure(type)"},{"line_number":85,"context_line":"        flow \u003d lf.Flow(type).add("},{"line_number":86,"context_line":"            _Task(task_script, task_id, task_input)"},{"line_number":87,"context_line":"        )"},{"line_number":88,"context_line":"        try:"},{"line_number":89,"context_line":"            engines.run(flow, self.engine_conf)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F9Z%2B8%3D","line":86,"in_reply_to":"AAAAWH%2F9gR8%3D","updated":"2014-04-04 18:31:50.000000000","message":"So in this case, linear flow constraint is that the items inside of it must activate in linear ordering, so in this case (since its only 1 item it doesn\u0027t matter to much), but if it was 2 items (say X, Y) X would always activate before Y.\n\nIf X itself is composed of a subflow (and that subflow is unordered and composed of [A, B, C], then all of those A, B, C can run and will likely run in any order) before Y will run. \n\nTLDR; depending on ordering constraints and nesting different pieces can run in parallel, but in this case its only 1 task so not much room for anything parallel anyway ;)","commit_id":"1be8d8e1264af4e3cf9c7002c22ba58e1eec13cd"}],"glance/async/taskflow_executor.py":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"904c1966e9d4041c050c6b1bc8329cdde94c4553","unresolved":false,"context_lines":[{"line_number":65,"context_line":"class TaskExecutor(glance.async.TaskExecutor):"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def __init__(self, context, task_repo, image_repo, image_factory):"},{"line_number":68,"context_line":"        if not eventlet_utils.EVENTLET_AVAILABLE:"},{"line_number":69,"context_line":"            msg \u003d _(\"Cannot initialize the task executor: \""},{"line_number":70,"context_line":"                    \"Eventlet not available\")"},{"line_number":71,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa98f980_cafcb275","line":68,"updated":"2014-09-17 01:27:59.000000000","message":"So just fyi, this will likely be moving out of this utility module to somewhere else soon in the future (it will be depreciated) so it might just be easier for u guys to have your own constant instead to avoid those depreciation messages...\n\n  try:\n     import eventlet\n     EVENTLET_AVAILABLE \u003d True\n  except ImportError:\n     EVENTLET_AVAILABLE \u003d False\n\nThat\u0027s about how simple it is :)","commit_id":"725118f089b18a8e4e322b75d003c17723c33fae"},{"author":{"_account_id":8759,"name":"Arnaud Legendre","email":"arnaudleg@gmail.com","username":"arnaud"},"change_message_id":"b4bf36f6ece42ac8cc755b5ff2d007190866ed68","unresolved":false,"context_lines":[{"line_number":65,"context_line":"class TaskExecutor(glance.async.TaskExecutor):"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def __init__(self, context, task_repo, image_repo, image_factory):"},{"line_number":68,"context_line":"        if not eventlet_utils.EVENTLET_AVAILABLE:"},{"line_number":69,"context_line":"            msg \u003d _(\"Cannot initialize the task executor: \""},{"line_number":70,"context_line":"                    \"Eventlet not available\")"},{"line_number":71,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa98f980_bc740737","line":68,"in_reply_to":"fa98f980_cafcb275","updated":"2014-09-17 22:19:25.000000000","message":"sounds good to me","commit_id":"725118f089b18a8e4e322b75d003c17723c33fae"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"904c1966e9d4041c050c6b1bc8329cdde94c4553","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        self.engine_conf \u003d {"},{"line_number":78,"context_line":"            \u0027engine\u0027: CONF.taskflow_executor.engine_mode,"},{"line_number":79,"context_line":"        }"},{"line_number":80,"context_line":"        self.engine_conf[\u0027executor\u0027] \u003d eventlet_utils.GreenExecutor("},{"line_number":81,"context_line":"            CONF.taskflow_executor.max_workers)"},{"line_number":82,"context_line":"        super(TaskExecutor, self).__init__(context, task_repo, image_repo,"},{"line_number":83,"context_line":"                                           image_factory)"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa98f980_ea01766b","line":80,"updated":"2014-09-17 01:27:59.000000000","message":"U can also leave this out and taskflow will pick the executor depending on the `engine_mode`.","commit_id":"725118f089b18a8e4e322b75d003c17723c33fae"},{"author":{"_account_id":8759,"name":"Arnaud Legendre","email":"arnaudleg@gmail.com","username":"arnaud"},"change_message_id":"b4bf36f6ece42ac8cc755b5ff2d007190866ed68","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        self.engine_conf \u003d {"},{"line_number":78,"context_line":"            \u0027engine\u0027: CONF.taskflow_executor.engine_mode,"},{"line_number":79,"context_line":"        }"},{"line_number":80,"context_line":"        self.engine_conf[\u0027executor\u0027] \u003d eventlet_utils.GreenExecutor("},{"line_number":81,"context_line":"            CONF.taskflow_executor.max_workers)"},{"line_number":82,"context_line":"        super(TaskExecutor, self).__init__(context, task_repo, image_repo,"},{"line_number":83,"context_line":"                                           image_factory)"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa98f980_3c98176a","line":80,"in_reply_to":"fa98f980_ea01766b","updated":"2014-09-17 22:19:25.000000000","message":"ok","commit_id":"725118f089b18a8e4e322b75d003c17723c33fae"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"904c1966e9d4041c050c6b1bc8329cdde94c4553","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                  self.image_repo, self.image_factory)"},{"line_number":93,"context_line":"        )"},{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            engines.run(flow, self.engine_conf)"},{"line_number":96,"context_line":"        except Exception as exc:"},{"line_number":97,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":98,"context_line":"                LOG.error(_(\u0027Failed to execute task %(task_id)s: %(exc)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa98f980_aa920e49","line":95,"updated":"2014-09-17 01:27:59.000000000","message":"So I think u want engines.run(flow, self.engine_conf, executor\u003dself._executor) instead, or if u just let taskflow do it automatically all that u need to do is provide a max_workers and an engine_conf that is either {\u0027engine\u0027: \u0027serial\u0027} or {\u0027engine\u0027: \u0027parallel\u0027}, then u don\u0027t need to provide an executor at all, although if u still want to provide an executor the syntax is like the above and not putting the executor into the engine_conf dictionary.\n\nAlso u want to only provide an executor keyword argument if the engine mode is \u0027parallel\u0027, the serial mode doesn\u0027t understand what that keyword argument means and will blowup with a unknown keyword argument error.\n\nSo what I\u0027d recommend is the following:\n\n  engine_conf \u003d {\n     \u0027engine\u0027: CONF.taskflow_executor.engine_mode,\n  }\n  engine_kwargs \u003d {}\n  if CONF.taskflow_executor.engine_mode \u003d\u003d \u0027parallel\u0027:\n     engine_kwargs[\u0027max_workers\u0027] \u003d CONF.taskflow_executor.max_workers\n\n  try:\n    engines.run(flow, engine_conf, **engine_kwargs)\n  ...\n\nTaskflow could switch everything back into `engine_conf` but currently there is that type of separation (for better or worse...)","commit_id":"725118f089b18a8e4e322b75d003c17723c33fae"},{"author":{"_account_id":8759,"name":"Arnaud Legendre","email":"arnaudleg@gmail.com","username":"arnaud"},"change_message_id":"b4bf36f6ece42ac8cc755b5ff2d007190866ed68","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                  self.image_repo, self.image_factory)"},{"line_number":93,"context_line":"        )"},{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            engines.run(flow, self.engine_conf)"},{"line_number":96,"context_line":"        except Exception as exc:"},{"line_number":97,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":98,"context_line":"                LOG.error(_(\u0027Failed to execute task %(task_id)s: %(exc)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa98f980_ab1e77b9","line":95,"in_reply_to":"fa98f980_aa920e49","updated":"2014-09-17 22:19:25.000000000","message":"Done","commit_id":"725118f089b18a8e4e322b75d003c17723c33fae"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"904c1966e9d4041c050c6b1bc8329cdde94c4553","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        )"},{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            engines.run(flow, self.engine_conf)"},{"line_number":96,"context_line":"        except Exception as exc:"},{"line_number":97,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":98,"context_line":"                LOG.error(_(\u0027Failed to execute task %(task_id)s: %(exc)s\u0027) %"},{"line_number":99,"context_line":"                          {\u0027task_id\u0027: task_id, \u0027exc\u0027: exc.message})"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa98f980_aa15ae9c","line":96,"updated":"2014-09-17 01:27:59.000000000","message":"Another recommendation for the engines.run()\n\nU might want to follow what cinder is doing using engine.load() instead and associating a event listener which then logs what taskflow is doing internally, this is quite useful for debugging and others...\n\nhttps://github.com/openstack/cinder/blob/master/cinder/volume/manager.py#L372\n\nYou can either make your own listener (like cinder did) or use one of the existing ones https://github.com/openstack/taskflow/tree/master/taskflow/listeners to get more information. This kind of stuff is useful for debugging and task tracking and... \n\nAnother example is @ https://github.com/openstack/taskflow/blob/master/taskflow/examples/simple_linear_listening.py with output @ https://github.com/openstack/taskflow/blob/master/taskflow/examples/simple_linear_listening.out.txt","commit_id":"725118f089b18a8e4e322b75d003c17723c33fae"},{"author":{"_account_id":8759,"name":"Arnaud Legendre","email":"arnaudleg@gmail.com","username":"arnaud"},"change_message_id":"b4bf36f6ece42ac8cc755b5ff2d007190866ed68","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        )"},{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            engines.run(flow, self.engine_conf)"},{"line_number":96,"context_line":"        except Exception as exc:"},{"line_number":97,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":98,"context_line":"                LOG.error(_(\u0027Failed to execute task %(task_id)s: %(exc)s\u0027) %"},{"line_number":99,"context_line":"                          {\u0027task_id\u0027: task_id, \u0027exc\u0027: exc.message})"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa98f980_d618c277","line":96,"in_reply_to":"fa98f980_aa15ae9c","updated":"2014-09-17 22:19:25.000000000","message":"Done","commit_id":"725118f089b18a8e4e322b75d003c17723c33fae"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"e7db03c78ffe0c1e48db01380c187868fb497d2c","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        )"},{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            engines.run(flow, self.engine_conf)"},{"line_number":96,"context_line":"        except Exception as exc:"},{"line_number":97,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":98,"context_line":"                LOG.error(_(\u0027Failed to execute task %(task_id)s: %(exc)s\u0027) %"},{"line_number":99,"context_line":"                          {\u0027task_id\u0027: task_id, \u0027exc\u0027: exc.message})"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa98f980_6a72e612","line":96,"in_reply_to":"fa98f980_aa15ae9c","updated":"2014-09-17 01:29:52.000000000","message":"The link to the cinder listener also, to show u what can be output...\n\nhttps://github.com/openstack/cinder/blob/master/cinder/flow_utils.py#L49","commit_id":"725118f089b18a8e4e322b75d003c17723c33fae"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"7dbcc3a5cae75b3b52dc3ee6873572efb34e9ba0","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                         self.task_repo, self.image_repo, self.image_factory)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"class DynamicLogListener(base_listener.ListenerBase):"},{"line_number":75,"context_line":"    \"\"\"This is used to attach to taskflow engines while they are running."},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    It provides a bunch of useful features that expose the actions happening"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa98f980_366cae08","line":74,"updated":"2014-09-17 23:28:17.000000000","message":"Guess its about time to move this into taskflow ;)","commit_id":"32a08bad68e511d403ea87c3ee3bcf4b71440d4d"},{"author":{"_account_id":8759,"name":"Arnaud Legendre","email":"arnaudleg@gmail.com","username":"arnaud"},"change_message_id":"9e551bffc06a643c351958b5bd2622025b948a34","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                         self.task_repo, self.image_repo, self.image_factory)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"class DynamicLogListener(base_listener.ListenerBase):"},{"line_number":75,"context_line":"    \"\"\"This is used to attach to taskflow engines while they are running."},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    It provides a bunch of useful features that expose the actions happening"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa98f980_d67c42b8","line":74,"in_reply_to":"fa98f980_366cae08","updated":"2014-09-17 23:30:39.000000000","message":":)","commit_id":"32a08bad68e511d403ea87c3ee3bcf4b71440d4d"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"ee52c55eed60e3e64291d534b47bf28bcb8d7f6e","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                         self.task_repo, self.image_repo, self.image_factory)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"class DynamicLogListener(base_listener.ListenerBase):"},{"line_number":75,"context_line":"    \"\"\"This is used to attach to taskflow engines while they are running."},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    It provides a bunch of useful features that expose the actions happening"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa98f980_d1bfeca8","line":74,"in_reply_to":"fa98f980_d67c42b8","updated":"2014-09-18 00:09:57.000000000","message":"Done @  https://review.openstack.org/122272 ; check it out if u get some time. Thanks!","commit_id":"32a08bad68e511d403ea87c3ee3bcf4b71440d4d"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"29b0406152d37362fde496a473156199137cef7b","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                         self.task_repo, self.image_repo, self.image_factory)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"class DynamicLogListener(base_listener.ListenerBase):"},{"line_number":75,"context_line":"    \"\"\"This is used to attach to taskflow engines while they are running."},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    It provides a bunch of useful features that expose the actions happening"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa98f980_b275ea34","line":74,"updated":"2014-09-18 22:32:13.000000000","message":"Might be useful just to add a FIXME comment to remind people to move to https://review.openstack.org/#/c/122272/ when its possible to do that (aka when its released, likely in kilo sometime).","commit_id":"c7524862143831305806fd7035e7c28a9ba9b2d7"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"29b0406152d37362fde496a473156199137cef7b","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        self.context \u003d context"},{"line_number":168,"context_line":"        self.task_repo \u003d task_repo"},{"line_number":169,"context_line":"        self.image_repo \u003d image_repo"},{"line_number":170,"context_line":"        self.image_factory \u003d image_factory"},{"line_number":171,"context_line":"        self.engine_conf \u003d {"},{"line_number":172,"context_line":"            \u0027engine\u0027: CONF.taskflow_executor.engine_mode,"},{"line_number":173,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa98f980_92a1c697","line":170,"updated":"2014-09-18 22:32:13.000000000","message":"Cool, this will get easier when https://review.openstack.org/#/c/122065/ gets merged, less crazy then :)","commit_id":"c7524862143831305806fd7035e7c28a9ba9b2d7"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"2b46883be55c882a84c82e9ee6cd0c86fedd644b","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    and more..."},{"line_number":81,"context_line":"    \"\"\""},{"line_number":82,"context_line":"    # TODO(arnaud): use DynamicLogListener from taskflow in kilo"},{"line_number":83,"context_line":"    # https://review.openstack.org/#/c/122272/"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def __init__(self, engine,"},{"line_number":86,"context_line":"                 task_listen_for\u003d(misc.Notifier.ANY,),"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a890539_e787b9b4","line":83,"updated":"2014-12-01 02:15:12.000000000","message":"Patch had been merged, so do we still need to maintain this class in Glance repo? Please let me know if I missed anything. Thanks.","commit_id":"a1b015a4f8a1cdf524f0f3e628d6125ee026a15d"},{"author":{"_account_id":8759,"name":"Arnaud Legendre","email":"arnaudleg@gmail.com","username":"arnaud"},"change_message_id":"c9120add5882d17476a8d9015e2c9d846624e165","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    and more..."},{"line_number":81,"context_line":"    \"\"\""},{"line_number":82,"context_line":"    # TODO(arnaud): use DynamicLogListener from taskflow in kilo"},{"line_number":83,"context_line":"    # https://review.openstack.org/#/c/122272/"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def __init__(self, engine,"},{"line_number":86,"context_line":"                 task_listen_for\u003d(misc.Notifier.ANY,),"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a890539_9e518e64","line":83,"in_reply_to":"5a890539_3a598f35","updated":"2014-12-03 05:44:05.000000000","message":"Please ping me when it\u0027s released; I will rebase and remove this from here.","commit_id":"a1b015a4f8a1cdf524f0f3e628d6125ee026a15d"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"0c0d64592b3d9a86dd07163534eea20c0565b9ff","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    and more..."},{"line_number":81,"context_line":"    \"\"\""},{"line_number":82,"context_line":"    # TODO(arnaud): use DynamicLogListener from taskflow in kilo"},{"line_number":83,"context_line":"    # https://review.openstack.org/#/c/122272/"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def __init__(self, engine,"},{"line_number":86,"context_line":"                 task_listen_for\u003d(misc.Notifier.ANY,),"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a890539_3a598f35","line":83,"in_reply_to":"5a890539_93be3763","updated":"2014-12-02 21:54:49.000000000","message":"Once released; I think yes, still not released yet, hopefully this week :)","commit_id":"a1b015a4f8a1cdf524f0f3e628d6125ee026a15d"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"3f5f5a9aabb89b21c2d751ce936d0213873ee68b","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    and more..."},{"line_number":81,"context_line":"    \"\"\""},{"line_number":82,"context_line":"    # TODO(arnaud): use DynamicLogListener from taskflow in kilo"},{"line_number":83,"context_line":"    # https://review.openstack.org/#/c/122272/"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def __init__(self, engine,"},{"line_number":86,"context_line":"                 task_listen_for\u003d(misc.Notifier.ANY,),"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_b677ba01","line":83,"in_reply_to":"5a890539_9e518e64","updated":"2014-12-09 02:13:04.000000000","message":"Sounds good.","commit_id":"a1b015a4f8a1cdf524f0f3e628d6125ee026a15d"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"2bdb79cea580aff10a422c5eaf832ccbf85f6318","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    and more..."},{"line_number":81,"context_line":"    \"\"\""},{"line_number":82,"context_line":"    # TODO(arnaud): use DynamicLogListener from taskflow in kilo"},{"line_number":83,"context_line":"    # https://review.openstack.org/#/c/122272/"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def __init__(self, engine,"},{"line_number":86,"context_line":"                 task_listen_for\u003d(misc.Notifier.ANY,),"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a890539_93be3763","line":83,"in_reply_to":"5a890539_e787b9b4","updated":"2014-12-01 07:55:24.000000000","message":"seems it\u0027s redundant in glance, same question.","commit_id":"a1b015a4f8a1cdf524f0f3e628d6125ee026a15d"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"bed321e1fad6fa399b17d3fb747ab9bb19e8bd78","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"taskflow_executor_opts \u003d ["},{"line_number":42,"context_line":"    cfg.StrOpt(\u0027engine_mode\u0027,"},{"line_number":43,"context_line":"               default\u003d\u0027serial\u0027,"},{"line_number":44,"context_line":"               help\u003d_(\"The mode in which the engine will run. \""},{"line_number":45,"context_line":"                      \"Can be \u0027serial\u0027 or \u0027parallel\u0027.\")),"},{"line_number":46,"context_line":"    cfg.IntOpt(\u0027max_workers\u0027,"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a930d6b_f6d129fc","line":43,"updated":"2015-01-22 17:04:40.000000000","message":"Since there are two options, we should add\n\n    choices\u003d(\u0027serial\u0027, \u0027parallel\u0027),\n\nThis will prevent a user from mistyping the option value or providing a totally invalid one.","commit_id":"50db9e6a6e1c40a9c46cd2302134018b23814134"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"9248bf80ced1dc053acf64b59d65fe400a9ea0bc","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"taskflow_executor_opts \u003d ["},{"line_number":42,"context_line":"    cfg.StrOpt(\u0027engine_mode\u0027,"},{"line_number":43,"context_line":"               default\u003d\u0027serial\u0027,"},{"line_number":44,"context_line":"               help\u003d_(\"The mode in which the engine will run. \""},{"line_number":45,"context_line":"                      \"Can be \u0027serial\u0027 or \u0027parallel\u0027.\")),"},{"line_number":46,"context_line":"    cfg.IntOpt(\u0027max_workers\u0027,"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a930d6b_934865b4","line":43,"in_reply_to":"1a930d6b_f6d129fc","updated":"2015-01-27 14:21:22.000000000","message":"thanks","commit_id":"50db9e6a6e1c40a9c46cd2302134018b23814134"},{"author":{"_account_id":7487,"name":"hzrandd","email":"82433422@qq.com","username":"hzrandd"},"change_message_id":"c2421c49bf2955f815a8afe293962c3c7799c526","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"try:"},{"line_number":17,"context_line":"    import eventlet  # noqa"},{"line_number":18,"context_line":"    EVENTLET_AVAILABLE \u003d True"},{"line_number":19,"context_line":"except ImportError:"},{"line_number":20,"context_line":"    EVENTLET_AVAILABLE \u003d False"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"fa81d914_4648ae2d","line":18,"updated":"2015-01-28 10:18:17.000000000","message":"hzrandd\n\nThe eventlet had configured in the file of requirements.txt, \nit is no need to try-catch here.","commit_id":"0e5cdc1d089a2d9500baae4fbe76f1d34ef0a18b"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"f3fdbe7913f3dd5026c8169834015e8feaa4e063","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"try:"},{"line_number":17,"context_line":"    import eventlet  # noqa"},{"line_number":18,"context_line":"    EVENTLET_AVAILABLE \u003d True"},{"line_number":19,"context_line":"except ImportError:"},{"line_number":20,"context_line":"    EVENTLET_AVAILABLE \u003d False"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"fa81d914_f4d05e55","line":18,"in_reply_to":"fa81d914_4648ae2d","updated":"2015-01-28 16:12:18.000000000","message":"I disagree. Operators can choose to not use eventlet if I remember correctly and instead use something else to allow glance to handle multiple connections. Eventlet is only required if you\u0027re deploying glance as is. Therefore this is necessary","commit_id":"0e5cdc1d089a2d9500baae4fbe76f1d34ef0a18b"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"9632cb503cc0537a8376f6b7e2ed49cb22f01f64","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 OpenStack Foundation"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_ce272a63","line":1,"updated":"2015-02-02 22:36:28.000000000","message":"2015","commit_id":"bc787accbdf9a0911abeb3300c01eb394986b958"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"284b90cd63f1104ce160a9e4178efbeaf308a254","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 OpenStack Foundation"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_f78d47d4","line":1,"in_reply_to":"da86d52c_ce272a63","updated":"2015-02-04 20:02:32.000000000","message":"Done","commit_id":"bc787accbdf9a0911abeb3300c01eb394986b958"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"9632cb503cc0537a8376f6b7e2ed49cb22f01f64","unresolved":false,"context_lines":[{"line_number":76,"context_line":"class TaskExecutor(glance.async.TaskExecutor):"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def __init__(self, context, task_repo, image_repo, image_factory):"},{"line_number":79,"context_line":"        if not EVENTLET_AVAILABLE:"},{"line_number":80,"context_line":"            msg \u003d _(\"Cannot initialize the task executor: \""},{"line_number":81,"context_line":"                    \"Eventlet not available\")"},{"line_number":82,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_4e6dfa97","line":79,"updated":"2015-02-02 22:36:28.000000000","message":"@Joshua: how do we ensure that the eventlet modules used in this package are monkey patched? We\u0027d some issues in some of the deployments when they were not.","commit_id":"bc787accbdf9a0911abeb3300c01eb394986b958"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"f305585f77668f9581a048f15590439927b157dc","unresolved":false,"context_lines":[{"line_number":76,"context_line":"class TaskExecutor(glance.async.TaskExecutor):"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def __init__(self, context, task_repo, image_repo, image_factory):"},{"line_number":79,"context_line":"        if not EVENTLET_AVAILABLE:"},{"line_number":80,"context_line":"            msg \u003d _(\"Cannot initialize the task executor: \""},{"line_number":81,"context_line":"                    \"Eventlet not available\")"},{"line_number":82,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_0b1e8663","line":79,"in_reply_to":"da86d52c_08212cfb","updated":"2015-02-03 06:57:42.000000000","message":"From what I can tell also glance should be fine:\n\nhttps://github.com/openstack/glance/blob/master/glance/cmd/api.py#L31\n\neventlet.patcher.monkey_patch(all\u003dFalse, socket\u003dTrue, time\u003dTrue,\nselect\u003dTrue, thread\u003dTrue, os\u003dTrue)\n\nThat should do it just fine; this doesn\u0027t monkey patch \u0027select, MySQLdb, psycopg, __builtin__\u0027 which should be ok (the db libraries, unless u start to use them, but taskflow just uses sqlalchemy so it doesn\u0027t know that you are using them, the \u0027__builtin__\u0027 one I\u0027m not sure about but hopefully should be fine since you guys haven\u0027t requested that one to be monkey patched).\n\nOn further looking the \u0027builtin\u0027 one seems to monkey patch file loading (maybe glance should request that one?); https://github.com/eventlet/eventlet/blob/master/eventlet/patcher.py#L351 which then calls into https://github.com/eventlet/eventlet/blob/master/eventlet/green/builtin.py","commit_id":"bc787accbdf9a0911abeb3300c01eb394986b958"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"225d1e2d7bc7dbb8a89d5add0c24c1ff372befa1","unresolved":false,"context_lines":[{"line_number":76,"context_line":"class TaskExecutor(glance.async.TaskExecutor):"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def __init__(self, context, task_repo, image_repo, image_factory):"},{"line_number":79,"context_line":"        if not EVENTLET_AVAILABLE:"},{"line_number":80,"context_line":"            msg \u003d _(\"Cannot initialize the task executor: \""},{"line_number":81,"context_line":"                    \"Eventlet not available\")"},{"line_number":82,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_eb63f2da","line":79,"in_reply_to":"da86d52c_0b1e8663","updated":"2015-02-03 06:58:19.000000000","message":"Cut out \u0027doesn\u0027t monkey patch \u0027select\u0027\u0027 since it obviously does; its late, haha.","commit_id":"bc787accbdf9a0911abeb3300c01eb394986b958"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"2b99f441508d4fb89ebdbf236cd7b69f141af29e","unresolved":false,"context_lines":[{"line_number":76,"context_line":"class TaskExecutor(glance.async.TaskExecutor):"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def __init__(self, context, task_repo, image_repo, image_factory):"},{"line_number":79,"context_line":"        if not EVENTLET_AVAILABLE:"},{"line_number":80,"context_line":"            msg \u003d _(\"Cannot initialize the task executor: \""},{"line_number":81,"context_line":"                    \"Eventlet not available\")"},{"line_number":82,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_08212cfb","line":79,"in_reply_to":"da86d52c_4e6dfa97","updated":"2015-02-03 06:42:59.000000000","message":"So I\u0027ll assume u mean taskflow; so ensure is a tough one. \n\nMy words of advice are patch at least [os, time, thread]; but as for ensuring that happens the closest I can get is the following which will be used in taskflow when its available to be used:\n\nhttps://review.openstack.org/#/c/149730/ (this review adds a function into oslo.utils that will emit warnings when a library is used, such as taskflow, and certain eventlet modules are *not* patched); I plan on using in taskflow to check at least  [os, time, thread] are patched but before that exists I would think its safe to say that people should always be patching those (accepting eventlet is not something you can really do in piece-meal and expect it to work...)\n\nMy 2 cents :)","commit_id":"bc787accbdf9a0911abeb3300c01eb394986b958"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"284b90cd63f1104ce160a9e4178efbeaf308a254","unresolved":false,"context_lines":[{"line_number":76,"context_line":"class TaskExecutor(glance.async.TaskExecutor):"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def __init__(self, context, task_repo, image_repo, image_factory):"},{"line_number":79,"context_line":"        if not EVENTLET_AVAILABLE:"},{"line_number":80,"context_line":"            msg \u003d _(\"Cannot initialize the task executor: \""},{"line_number":81,"context_line":"                    \"Eventlet not available\")"},{"line_number":82,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_777077dc","line":79,"in_reply_to":"da86d52c_eb63f2da","updated":"2015-02-04 20:02:32.000000000","message":"Thanks for the specifics here, I think we are mostly covered from the ones being imported in Glance. I was just curious if taskflow has (may have) ones that are not in Glance and may be you can point us if we need to monkey patch them.","commit_id":"bc787accbdf9a0911abeb3300c01eb394986b958"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"3bb5fe68195e18cf3afcb16cfb309abe2c485a75","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        )"},{"line_number":107,"context_line":"        try:"},{"line_number":108,"context_line":"            engine \u003d engines.load(flow, self.engine_conf, **self.engine_kwargs)"},{"line_number":109,"context_line":"            with llistener.DynamicLogListener(engine, logger\u003dLOG):"},{"line_number":110,"context_line":"                engine.run()"},{"line_number":111,"context_line":"        except Exception as exc:"},{"line_number":112,"context_line":"            with excutils.save_and_reraise_exception():"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_444f446b","line":109,"updated":"2015-02-04 17:07:27.000000000","message":"Base on https://github.com/openstack/taskflow/blob/0.6.0/taskflow/listeners/logging.py#L106 , this should be \"llistener.DynamicLoggingListener(engine, log\u003dLOG)\"","commit_id":"bc787accbdf9a0911abeb3300c01eb394986b958"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"284b90cd63f1104ce160a9e4178efbeaf308a254","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        )"},{"line_number":107,"context_line":"        try:"},{"line_number":108,"context_line":"            engine \u003d engines.load(flow, self.engine_conf, **self.engine_kwargs)"},{"line_number":109,"context_line":"            with llistener.DynamicLogListener(engine, logger\u003dLOG):"},{"line_number":110,"context_line":"                engine.run()"},{"line_number":111,"context_line":"        except Exception as exc:"},{"line_number":112,"context_line":"            with excutils.save_and_reraise_exception():"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_57429368","line":109,"in_reply_to":"da86d52c_444f446b","updated":"2015-02-04 20:02:32.000000000","message":"Done","commit_id":"bc787accbdf9a0911abeb3300c01eb394986b958"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"d7abae42a77c6d74f3d49783b470f967238f10d5","unresolved":false,"context_lines":[{"line_number":17,"context_line":"    import eventlet  # noqa"},{"line_number":18,"context_line":"    EVENTLET_AVAILABLE \u003d True"},{"line_number":19,"context_line":"except ImportError:"},{"line_number":20,"context_line":"    EVENTLET_AVAILABLE \u003d False"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from oslo.config import cfg"},{"line_number":23,"context_line":"from oslo.utils import excutils"}],"source_content_type":"text/x-python","patch_set":23,"id":"da86d52c_a12e16a3","line":20,"updated":"2015-02-05 09:27:47.000000000","message":"This block should not be needed. We will have eventlet available anyways.","commit_id":"71a015a38e9e89cd408a64754b45b253b3309d7e"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"d7abae42a77c6d74f3d49783b470f967238f10d5","unresolved":false,"context_lines":[{"line_number":76,"context_line":"class TaskExecutor(glance.async.TaskExecutor):"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def __init__(self, context, task_repo, image_repo, image_factory):"},{"line_number":79,"context_line":"        if not EVENTLET_AVAILABLE:"},{"line_number":80,"context_line":"            msg \u003d _(\"Cannot initialize the task executor: \""},{"line_number":81,"context_line":"                    \"Eventlet not available\")"},{"line_number":82,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":23,"id":"da86d52c_e402dc08","line":79,"updated":"2015-02-05 09:27:47.000000000","message":"ditto","commit_id":"71a015a38e9e89cd408a64754b45b253b3309d7e"},{"author":{"_account_id":11356,"name":"Louis Taylor","email":"louis@kragniz.eu","username":"kragniz"},"change_message_id":"a0c5060b104cf3507582baa7910a0c630da5f5f0","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import eventlet"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from oslo.config import cfg"},{"line_number":19,"context_line":"from oslo.utils import excutils"}],"source_content_type":"text/x-python","patch_set":26,"id":"da86d52c_5b44631a","line":16,"updated":"2015-02-05 11:57:12.000000000","message":"Not required anymore.","commit_id":"c4c79d32e61c9b8bd780e297a5a3263bc7d79cbb"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"0ba2ddcfaca398f5470c0fc6337d3573c9b03a14","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import eventlet"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from oslo.config import cfg"},{"line_number":19,"context_line":"from oslo.utils import excutils"}],"source_content_type":"text/x-python","patch_set":26,"id":"da86d52c_f6e0cece","line":16,"in_reply_to":"da86d52c_5b44631a","updated":"2015-02-05 12:25:05.000000000","message":"+1","commit_id":"c4c79d32e61c9b8bd780e297a5a3263bc7d79cbb"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"b04b5401c62dd1d292d16adb264246fb601635c8","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import eventlet"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from oslo.config import cfg"},{"line_number":19,"context_line":"from oslo.utils import excutils"}],"source_content_type":"text/x-python","patch_set":26,"id":"da86d52c_0c6d3c04","line":16,"in_reply_to":"da86d52c_f6e0cece","updated":"2015-02-05 20:34:17.000000000","message":"Done","commit_id":"c4c79d32e61c9b8bd780e297a5a3263bc7d79cbb"},{"author":{"_account_id":11356,"name":"Louis Taylor","email":"louis@kragniz.eu","username":"kragniz"},"change_message_id":"a0c5060b104cf3507582baa7910a0c630da5f5f0","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import eventlet"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from oslo.config import cfg"},{"line_number":19,"context_line":"from oslo.utils import excutils"},{"line_number":20,"context_line":"from taskflow import engines"},{"line_number":21,"context_line":"from taskflow.listeners import logging as llistener"},{"line_number":22,"context_line":"from taskflow.patterns import linear_flow as lf"}],"source_content_type":"text/x-python","patch_set":26,"id":"da86d52c_9bc25b83","line":19,"updated":"2015-02-05 11:57:12.000000000","message":"Can these be changed to oslo_config and oslo_utils please?","commit_id":"c4c79d32e61c9b8bd780e297a5a3263bc7d79cbb"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"b04b5401c62dd1d292d16adb264246fb601635c8","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import eventlet"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from oslo.config import cfg"},{"line_number":19,"context_line":"from oslo.utils import excutils"},{"line_number":20,"context_line":"from taskflow import engines"},{"line_number":21,"context_line":"from taskflow.listeners import logging as llistener"},{"line_number":22,"context_line":"from taskflow.patterns import linear_flow as lf"}],"source_content_type":"text/x-python","patch_set":26,"id":"da86d52c_2c7040db","line":19,"in_reply_to":"da86d52c_36b0a6dc","updated":"2015-02-05 20:34:17.000000000","message":"Done","commit_id":"c4c79d32e61c9b8bd780e297a5a3263bc7d79cbb"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"0ba2ddcfaca398f5470c0fc6337d3573c9b03a14","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import eventlet"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from oslo.config import cfg"},{"line_number":19,"context_line":"from oslo.utils import excutils"},{"line_number":20,"context_line":"from taskflow import engines"},{"line_number":21,"context_line":"from taskflow.listeners import logging as llistener"},{"line_number":22,"context_line":"from taskflow.patterns import linear_flow as lf"}],"source_content_type":"text/x-python","patch_set":26,"id":"da86d52c_36b0a6dc","line":19,"in_reply_to":"da86d52c_9bc25b83","updated":"2015-02-05 12:25:05.000000000","message":"If the requirements aren\u0027t properly sync\u0027d, it may cause test failures so this might not be possible.","commit_id":"c4c79d32e61c9b8bd780e297a5a3263bc7d79cbb"},{"author":{"_account_id":11356,"name":"Louis Taylor","email":"louis@kragniz.eu","username":"kragniz"},"change_message_id":"a0c5060b104cf3507582baa7910a0c630da5f5f0","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from taskflow import task"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"import glance.async"},{"line_number":26,"context_line":"from glance.common import exception"},{"line_number":27,"context_line":"import glance.common.scripts as scripts"},{"line_number":28,"context_line":"from glance import i18n"},{"line_number":29,"context_line":"import glance.openstack.common.log as logging"}],"source_content_type":"text/x-python","patch_set":26,"id":"da86d52c_fb6197a9","line":26,"updated":"2015-02-05 11:57:12.000000000","message":"Not required since `raise exception.TaskExecutorCreationFailure(msg)` was removed.","commit_id":"c4c79d32e61c9b8bd780e297a5a3263bc7d79cbb"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"b04b5401c62dd1d292d16adb264246fb601635c8","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from taskflow import task"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"import glance.async"},{"line_number":26,"context_line":"from glance.common import exception"},{"line_number":27,"context_line":"import glance.common.scripts as scripts"},{"line_number":28,"context_line":"from glance import i18n"},{"line_number":29,"context_line":"import glance.openstack.common.log as logging"}],"source_content_type":"text/x-python","patch_set":26,"id":"da86d52c_ac7b50bc","line":26,"in_reply_to":"da86d52c_d6be6aad","updated":"2015-02-05 20:34:17.000000000","message":"Done","commit_id":"c4c79d32e61c9b8bd780e297a5a3263bc7d79cbb"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"0ba2ddcfaca398f5470c0fc6337d3573c9b03a14","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from taskflow import task"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"import glance.async"},{"line_number":26,"context_line":"from glance.common import exception"},{"line_number":27,"context_line":"import glance.common.scripts as scripts"},{"line_number":28,"context_line":"from glance import i18n"},{"line_number":29,"context_line":"import glance.openstack.common.log as logging"}],"source_content_type":"text/x-python","patch_set":26,"id":"da86d52c_d6be6aad","line":26,"in_reply_to":"da86d52c_fb6197a9","updated":"2015-02-05 12:25:05.000000000","message":"+1","commit_id":"c4c79d32e61c9b8bd780e297a5a3263bc7d79cbb"}],"glance/common/exception.py":[{"author":{"_account_id":11356,"name":"Louis Taylor","email":"louis@kragniz.eu","username":"kragniz"},"change_message_id":"a0c5060b104cf3507582baa7910a0c630da5f5f0","unresolved":false,"context_lines":[{"line_number":341,"context_line":"                \" %(new_status)s is not allowed\")"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"class TaskExecutorCreationFailure(TaskException):"},{"line_number":345,"context_line":"    message \u003d _(\"Task executor creation failed: %(reason)s.\")"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"da86d52c_fbd6f726","line":344,"updated":"2015-02-05 11:57:12.000000000","message":"We\u0027re not actually using this anymore. Does it need to be added?","commit_id":"c4c79d32e61c9b8bd780e297a5a3263bc7d79cbb"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"b04b5401c62dd1d292d16adb264246fb601635c8","unresolved":false,"context_lines":[{"line_number":341,"context_line":"                \" %(new_status)s is not allowed\")"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"class TaskExecutorCreationFailure(TaskException):"},{"line_number":345,"context_line":"    message \u003d _(\"Task executor creation failed: %(reason)s.\")"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"da86d52c_8c576c25","line":344,"in_reply_to":"da86d52c_fbd6f726","updated":"2015-02-05 20:34:17.000000000","message":"Done","commit_id":"c4c79d32e61c9b8bd780e297a5a3263bc7d79cbb"}],"glance/common/scripts/utils.py":[{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"d885b158a58f2cfbbb4be28ac7f16a117e06a39e","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    :param properties: Input dict to set some base properties"},{"line_number":73,"context_line":"    \"\"\""},{"line_number":74,"context_line":"    if properties is not None:"},{"line_number":75,"context_line":"        # TODO(nikhil): We can make these properties configurable while"},{"line_number":76,"context_line":"        # implementing the pipeline logic for the scripts. The below shown"},{"line_number":77,"context_line":"        # are placeholders to show that the scripts work on \u0027devstack\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa98f980_b3dd50e2","side":"PARENT","line":74,"updated":"2014-09-05 19:49:21.000000000","message":"Actually, we just need to check the case for \"properties\" dict to not be None.\n\nChecking with if not properties is causing test failures when properties dict is empty / {} .","commit_id":"186991bb9d2b8c568f3e9a0a89744fd6001ec74a"},{"author":{"_account_id":8759,"name":"Arnaud Legendre","email":"arnaudleg@gmail.com","username":"arnaud"},"change_message_id":"b147d7deadb8c0c03d896c412ffdc0292df0e6d3","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    :param properties: Input dict to set some base properties"},{"line_number":73,"context_line":"    \"\"\""},{"line_number":74,"context_line":"    if properties is not None:"},{"line_number":75,"context_line":"        # TODO(nikhil): We can make these properties configurable while"},{"line_number":76,"context_line":"        # implementing the pipeline logic for the scripts. The below shown"},{"line_number":77,"context_line":"        # are placeholders to show that the scripts work on \u0027devstack\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa98f980_813d4fdf","side":"PARENT","line":74,"in_reply_to":"fa98f980_0ebeeead","updated":"2014-09-05 23:04:24.000000000","message":"I am not sure to see what is wrong with that. That\u0027s what I had in mind :)\n\nIf properties is !\u003d than None and {}, you do not want to set the disk_format and container_format, right?","commit_id":"186991bb9d2b8c568f3e9a0a89744fd6001ec74a"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"ad226dc19e3274b30d1a3876bba8d8c88dd812a0","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    :param properties: Input dict to set some base properties"},{"line_number":73,"context_line":"    \"\"\""},{"line_number":74,"context_line":"    if properties is not None:"},{"line_number":75,"context_line":"        # TODO(nikhil): We can make these properties configurable while"},{"line_number":76,"context_line":"        # implementing the pipeline logic for the scripts. The below shown"},{"line_number":77,"context_line":"        # are placeholders to show that the scripts work on \u0027devstack\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa98f980_815c64ef","side":"PARENT","line":74,"in_reply_to":"fa98f980_813d4fdf","updated":"2014-09-07 03:37:35.000000000","message":"Think that we want to set the properties on all cases except when the variable is None.\n\nSo, proposed code -\n\n\"if not properties\" evaluates to True when:-\n\n1. properties \u003d None\n\n2. properties \u003d {}\n\nHaving, old code\n\n\"if properties is not None\"\n\nwould set the properties/evaluate to True when -\n\n1. if properties is any variable except None, which is what we need.\n\nMay be we can add a check like \"if isinstance(properties, dict)\" or something.\n\nAlso, may be adding a test for this gotcha might help. I can try to put up a quick patch for this corner case test if you want else feel free to add it to this patch.","commit_id":"186991bb9d2b8c568f3e9a0a89744fd6001ec74a"},{"author":{"_account_id":8759,"name":"Arnaud Legendre","email":"arnaudleg@gmail.com","username":"arnaud"},"change_message_id":"4dfaf975d3e4864a1ad1ecb6f86c4af2b38670b7","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    :param properties: Input dict to set some base properties"},{"line_number":73,"context_line":"    \"\"\""},{"line_number":74,"context_line":"    if properties is not None:"},{"line_number":75,"context_line":"        # TODO(nikhil): We can make these properties configurable while"},{"line_number":76,"context_line":"        # implementing the pipeline logic for the scripts. The below shown"},{"line_number":77,"context_line":"        # are placeholders to show that the scripts work on \u0027devstack\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa98f980_358e84d1","side":"PARENT","line":74,"in_reply_to":"fa98f980_815c64ef","updated":"2014-09-16 23:45:47.000000000","message":"Done","commit_id":"186991bb9d2b8c568f3e9a0a89744fd6001ec74a"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"4fb379d1fc7bbd0548e21b67307f3a5e9d00b3e2","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    :param properties: Input dict to set some base properties"},{"line_number":73,"context_line":"    \"\"\""},{"line_number":74,"context_line":"    if properties is not None:"},{"line_number":75,"context_line":"        # TODO(nikhil): We can make these properties configurable while"},{"line_number":76,"context_line":"        # implementing the pipeline logic for the scripts. The below shown"},{"line_number":77,"context_line":"        # are placeholders to show that the scripts work on \u0027devstack\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa98f980_0ebeeead","side":"PARENT","line":74,"in_reply_to":"fa98f980_b3dd50e2","updated":"2014-09-05 21:51:51.000000000","message":"I stand corrected - we need a way to pass in non-empty dict.\n\n...\nif not properties:\n...\n\nwill only work for cases when properties is \"None\" or \"{}\"","commit_id":"186991bb9d2b8c568f3e9a0a89744fd6001ec74a"},{"author":{"_account_id":8443,"name":"Georgy Okrokvertskhov","email":"gokrokvertskhov@mirantis.com","username":"gokrokvertskhov"},"change_message_id":"0308f67ef56613d85cbc3ce9d4e505908ab5a36b","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        # are placeholders to show that the scripts work on \u0027devstack\u0027"},{"line_number":78,"context_line":"        # environment."},{"line_number":79,"context_line":"        properties[\u0027disk_format\u0027] \u003d \u0027qcow2\u0027"},{"line_number":80,"context_line":"        properties[\u0027container_format\u0027] \u003d \u0027ovf\u0027"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"def validate_location_uri(location):"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a890539_88ac268e","line":80,"updated":"2014-12-01 22:43:06.000000000","message":"Is \u0027ovf\u0027 a default container format? I thought that \u0027Bare\u0027 is a default value.","commit_id":"a1b015a4f8a1cdf524f0f3e628d6125ee026a15d"},{"author":{"_account_id":8759,"name":"Arnaud Legendre","email":"arnaudleg@gmail.com","username":"arnaud"},"change_message_id":"c9120add5882d17476a8d9015e2c9d846624e165","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        # are placeholders to show that the scripts work on \u0027devstack\u0027"},{"line_number":78,"context_line":"        # environment."},{"line_number":79,"context_line":"        properties[\u0027disk_format\u0027] \u003d \u0027qcow2\u0027"},{"line_number":80,"context_line":"        properties[\u0027container_format\u0027] \u003d \u0027ovf\u0027"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"def validate_location_uri(location):"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a890539_be4acaaa","line":80,"in_reply_to":"5a890539_88ac268e","updated":"2014-12-03 05:44:05.000000000","message":"good point: I will fix that.","commit_id":"a1b015a4f8a1cdf524f0f3e628d6125ee026a15d"}],"glance/domain/__init__.py":[{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"dc59099882e2b794a28fede81a9f4d56cc70df39","unresolved":false,"context_lines":[{"line_number":308,"context_line":""},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"class Task(object):"},{"line_number":311,"context_line":"    _supported_task_type \u003d (\u0027image_import\u0027,)"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    _supported_task_status \u003d (\u0027pending\u0027, \u0027processing\u0027, \u0027success\u0027, \u0027failure\u0027)"},{"line_number":314,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAWn%2F%2F4vg%3D","line":311,"updated":"2014-04-08 18:25:16.000000000","message":"same comment about API contract as before.","commit_id":"65aa35cfd2fb5d403985bcd090c342abb618e11e"}],"glance/tests/unit/async/test_taskflow_executor.py":[{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"9632cb503cc0537a8376f6b7e2ed49cb22f01f64","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 OpenStack Foundation"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_6eff1eab","line":1,"updated":"2015-02-02 22:36:28.000000000","message":"2015","commit_id":"bc787accbdf9a0911abeb3300c01eb394986b958"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"284b90cd63f1104ce160a9e4178efbeaf308a254","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 OpenStack Foundation"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_12fe69ae","line":1,"in_reply_to":"da86d52c_6eff1eab","updated":"2015-02-04 20:02:32.000000000","message":"Done","commit_id":"bc787accbdf9a0911abeb3300c01eb394986b958"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"31d5d6adadffafd1a60415cb7cfa4d112f0d87d5","unresolved":false,"context_lines":[{"line_number":33,"context_line":"            self.image_repo,"},{"line_number":34,"context_line":"            self.image_factory)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def test_begin_processing(self):"},{"line_number":37,"context_line":"        task_id \u003d mock.ANY"},{"line_number":38,"context_line":"        task \u003d mock.Mock()"},{"line_number":39,"context_line":"        task.type \u003d mock.ANY"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa81d914_0d03d842","line":36,"updated":"2015-01-29 22:45:41.000000000","message":"This can probably get better but seems ok for now.\n\nIt\u0027d be nice to let the full taskflow executor run; but run on a fake task and use taskflows listener logic to verify expected pre/post conditions that occur during transitions that taskflow lets u know about.... That\u0027d make for some sweet testing I think...\n\nhttp://docs.openstack.org/developer/taskflow/notifications.html","commit_id":"bc787accbdf9a0911abeb3300c01eb394986b958"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"284b90cd63f1104ce160a9e4178efbeaf308a254","unresolved":false,"context_lines":[{"line_number":33,"context_line":"            self.image_repo,"},{"line_number":34,"context_line":"            self.image_factory)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def test_begin_processing(self):"},{"line_number":37,"context_line":"        task_id \u003d mock.ANY"},{"line_number":38,"context_line":"        task \u003d mock.Mock()"},{"line_number":39,"context_line":"        task.type \u003d mock.ANY"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_92297939","line":36,"in_reply_to":"fa81d914_0d03d842","updated":"2015-02-04 20:02:32.000000000","message":"noted.","commit_id":"bc787accbdf9a0911abeb3300c01eb394986b958"}],"glance/tests/unit/common/scripts/test_scripts_utils.py":[{"author":{"_account_id":8443,"name":"Georgy Okrokvertskhov","email":"gokrokvertskhov@mirantis.com","username":"gokrokvertskhov"},"change_message_id":"0308f67ef56613d85cbc3ce9d4e505908ab5a36b","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        self.assertRaises(exception.Invalid,"},{"line_number":54,"context_line":"                          script_utils.unpack_task_input, task3)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def test_set_base_image_properties(self):"},{"line_number":57,"context_line":"        properties \u003d {}"},{"line_number":58,"context_line":"        script_utils.set_base_image_properties(properties)"},{"line_number":59,"context_line":"        self.assertIn(\u0027disk_format\u0027, properties)"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a890539_e88a0a19","line":56,"updated":"2014-12-01 22:43:06.000000000","message":"This test dos not check properties values for defaults. This is a bad practice as default values are important.","commit_id":"a1b015a4f8a1cdf524f0f3e628d6125ee026a15d"},{"author":{"_account_id":8759,"name":"Arnaud Legendre","email":"arnaudleg@gmail.com","username":"arnaud"},"change_message_id":"c9120add5882d17476a8d9015e2c9d846624e165","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        self.assertRaises(exception.Invalid,"},{"line_number":54,"context_line":"                          script_utils.unpack_task_input, task3)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def test_set_base_image_properties(self):"},{"line_number":57,"context_line":"        properties \u003d {}"},{"line_number":58,"context_line":"        script_utils.set_base_image_properties(properties)"},{"line_number":59,"context_line":"        self.assertIn(\u0027disk_format\u0027, properties)"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a890539_de4796a1","line":56,"in_reply_to":"5a890539_e88a0a19","updated":"2014-12-03 05:44:05.000000000","message":"Will add tests for the default values!","commit_id":"a1b015a4f8a1cdf524f0f3e628d6125ee026a15d"},{"author":{"_account_id":11356,"name":"Louis Taylor","email":"louis@kragniz.eu","username":"kragniz"},"change_message_id":"fd76fdd91cb7a74b7bfd6f9bdc9be490345d37d1","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        properties \u003d {}"},{"line_number":58,"context_line":"        script_utils.set_base_image_properties(properties)"},{"line_number":59,"context_line":"        self.assertIn(\u0027disk_format\u0027, properties)"},{"line_number":60,"context_line":"        self.assertIn(\u0027container_format\u0027, properties)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def test_set_base_image_properties_none(self):"},{"line_number":63,"context_line":"        properties \u003d None"}],"source_content_type":"text/x-python","patch_set":18,"id":"1a930d6b_d753826a","line":60,"updated":"2015-01-21 11:51:27.000000000","message":"Reflagging missing tests for default values.\n\n    self.assertEqual(\u0027qcow2\u0027, properties[\u0027disk_format\u0027])\n    self.assertEqual(\u0027bare\u0027, properties[\u0027container_format\u0027])","commit_id":"81b151df1cdffad15be75cc41546791af9288944"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"616f52b87368243f53c4fb1fb8225edbe19ad395","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        properties \u003d {}"},{"line_number":58,"context_line":"        script_utils.set_base_image_properties(properties)"},{"line_number":59,"context_line":"        self.assertIn(\u0027disk_format\u0027, properties)"},{"line_number":60,"context_line":"        self.assertIn(\u0027container_format\u0027, properties)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def test_set_base_image_properties_none(self):"},{"line_number":63,"context_line":"        properties \u003d None"}],"source_content_type":"text/x-python","patch_set":18,"id":"1a930d6b_ffe69015","line":60,"in_reply_to":"1a930d6b_d753826a","updated":"2015-01-21 14:08:51.000000000","message":"+1","commit_id":"81b151df1cdffad15be75cc41546791af9288944"}],"requirements.txt":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"ee02c682ce837562f4439beae61a7369ed7d0ac5","unresolved":false,"context_lines":[{"line_number":22,"context_line":"ordereddict"},{"line_number":23,"context_line":"oslo.config\u003e\u003d1.2.0"},{"line_number":24,"context_line":"stevedore\u003e\u003d0.14"},{"line_number":25,"context_line":"taskflow\u003e\u003d0.1.3,\u003c0.2"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"# For Swift storage backend."},{"line_number":28,"context_line":"python-swiftclient\u003e\u003d1.6"}],"source_content_type":"text/plain","patch_set":4,"id":"AAAAWH%2F9Yy8%3D","line":25,"updated":"2014-04-04 21:22:23.000000000","message":"This should be changeable after, https://review.openstack.org/#/c/85423/ gets merged btw.","commit_id":"43f2ce20b9efe291956998292a9998c23b6a9f6d"},{"author":{"_account_id":8759,"name":"Arnaud Legendre","email":"arnaudleg@gmail.com","username":"arnaud"},"change_message_id":"55be50bba7b8c43c82ae4843cf37672f221c4d11","unresolved":false,"context_lines":[{"line_number":22,"context_line":"ordereddict"},{"line_number":23,"context_line":"oslo.config\u003e\u003d1.2.0"},{"line_number":24,"context_line":"stevedore\u003e\u003d0.14"},{"line_number":25,"context_line":"taskflow\u003e\u003d0.1.3,\u003c0.2"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"# For Swift storage backend."},{"line_number":28,"context_line":"python-swiftclient\u003e\u003d1.6"}],"source_content_type":"text/plain","patch_set":4,"id":"AAAAWH%2F9PeI%3D","line":25,"in_reply_to":"AAAAWH%2F9PhA%3D","updated":"2014-04-07 18:05:51.000000000","message":"ok! sounds good","commit_id":"43f2ce20b9efe291956998292a9998c23b6a9f6d"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"fe3b38c125ebb3a30e8c31754734d448a06c9fcf","unresolved":false,"context_lines":[{"line_number":22,"context_line":"ordereddict"},{"line_number":23,"context_line":"oslo.config\u003e\u003d1.2.0"},{"line_number":24,"context_line":"stevedore\u003e\u003d0.14"},{"line_number":25,"context_line":"taskflow\u003e\u003d0.1.3,\u003c0.2"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"# For Swift storage backend."},{"line_number":28,"context_line":"python-swiftclient\u003e\u003d1.6"}],"source_content_type":"text/plain","patch_set":4,"id":"AAAAWH%2F9PhA%3D","line":25,"in_reply_to":"AAAAWH%2F9Yy8%3D","updated":"2014-04-07 17:58:43.000000000","message":"Ok, merged, u should just be able to let requirements sync do its work here instead of manually specifiying.","commit_id":"43f2ce20b9efe291956998292a9998c23b6a9f6d"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"6f29c08f90bacd802f97292bf0634fa66791e141","unresolved":false,"context_lines":[{"line_number":26,"context_line":"ordereddict"},{"line_number":27,"context_line":"oslo.config\u003e\u003d1.4.0.0a3"},{"line_number":28,"context_line":"stevedore\u003e\u003d0.14"},{"line_number":29,"context_line":"taskflow\u003e\u003d0.3,\u003c0.4"},{"line_number":30,"context_line":"netaddr\u003e\u003d0.7.6"},{"line_number":31,"context_line":"keystonemiddleware\u003e\u003d1.0.0"},{"line_number":32,"context_line":"WSME\u003e\u003d0.6"}],"source_content_type":"text/plain","patch_set":13,"id":"fa98f980_cd048f1a","line":29,"updated":"2014-09-18 23:41:35.000000000","message":"U can bump this up as well btw.\n\ntaskflow\u003e\u003d0.4 should be fine (thats whats in the requirements repo).","commit_id":"c7524862143831305806fd7035e7c28a9ba9b2d7"},{"author":{"_account_id":11356,"name":"Louis Taylor","email":"louis@kragniz.eu","username":"kragniz"},"change_message_id":"4b3ff3d50904b6752e3705ee5b262ef8a5472420","unresolved":false,"context_lines":[{"line_number":28,"context_line":"oslo.concurrency\u003e\u003d0.3.0                 # Apache-2.0"},{"line_number":29,"context_line":"oslo.utils\u003e\u003d1.2.0                       # Apache-2.0"},{"line_number":30,"context_line":"stevedore\u003e\u003d1.1.0  # Apache-2.0"},{"line_number":31,"context_line":"taskflow\u003e\u003d0.4"},{"line_number":32,"context_line":"keystonemiddleware\u003e\u003d1.0.0"},{"line_number":33,"context_line":"WSME\u003e\u003d0.6"},{"line_number":34,"context_line":"# For openstack/common/lockutils"}],"source_content_type":"text/plain","patch_set":19,"id":"1a930d6b_46133cb8","line":31,"updated":"2015-01-22 11:57:41.000000000","message":"Should be updated to taskflow\u003e\u003d0.6","commit_id":"50db9e6a6e1c40a9c46cd2302134018b23814134"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"bed321e1fad6fa399b17d3fb747ab9bb19e8bd78","unresolved":false,"context_lines":[{"line_number":28,"context_line":"oslo.concurrency\u003e\u003d0.3.0                 # Apache-2.0"},{"line_number":29,"context_line":"oslo.utils\u003e\u003d1.2.0                       # Apache-2.0"},{"line_number":30,"context_line":"stevedore\u003e\u003d1.1.0  # Apache-2.0"},{"line_number":31,"context_line":"taskflow\u003e\u003d0.4"},{"line_number":32,"context_line":"keystonemiddleware\u003e\u003d1.0.0"},{"line_number":33,"context_line":"WSME\u003e\u003d0.6"},{"line_number":34,"context_line":"# For openstack/common/lockutils"}],"source_content_type":"text/plain","patch_set":19,"id":"1a930d6b_b6e96182","line":31,"in_reply_to":"1a930d6b_46133cb8","updated":"2015-01-22 17:04:40.000000000","message":"+1","commit_id":"50db9e6a6e1c40a9c46cd2302134018b23814134"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"665fd585d78082e4e58177dc3b9db663e818f87f","unresolved":false,"context_lines":[{"line_number":28,"context_line":"oslo.concurrency\u003e\u003d0.3.0                 # Apache-2.0"},{"line_number":29,"context_line":"oslo.utils\u003e\u003d1.2.0                       # Apache-2.0"},{"line_number":30,"context_line":"stevedore\u003e\u003d1.1.0  # Apache-2.0"},{"line_number":31,"context_line":"taskflow\u003e\u003d0.4"},{"line_number":32,"context_line":"keystonemiddleware\u003e\u003d1.0.0"},{"line_number":33,"context_line":"WSME\u003e\u003d0.6"},{"line_number":34,"context_line":"# For openstack/common/lockutils"}],"source_content_type":"text/plain","patch_set":19,"id":"1a930d6b_150e8b8d","line":31,"in_reply_to":"1a930d6b_b6e96182","updated":"2015-01-23 12:35:14.000000000","message":"+1","commit_id":"50db9e6a6e1c40a9c46cd2302134018b23814134"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"9632cb503cc0537a8376f6b7e2ed49cb22f01f64","unresolved":false,"context_lines":[{"line_number":28,"context_line":"oslo.concurrency\u003e\u003d0.3.0                 # Apache-2.0"},{"line_number":29,"context_line":"oslo.utils\u003e\u003d1.2.0                       # Apache-2.0"},{"line_number":30,"context_line":"stevedore\u003e\u003d1.1.0  # Apache-2.0"},{"line_number":31,"context_line":"taskflow\u003e\u003d0.6"},{"line_number":32,"context_line":"keystonemiddleware\u003e\u003d1.0.0"},{"line_number":33,"context_line":"WSME\u003e\u003d0.6"},{"line_number":34,"context_line":"# For openstack/common/lockutils"}],"source_content_type":"text/plain","patch_set":22,"id":"da86d52c_8ed45221","line":31,"updated":"2015-02-02 22:36:28.000000000","message":"Should we have a cap on this?","commit_id":"bc787accbdf9a0911abeb3300c01eb394986b958"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"2b99f441508d4fb89ebdbf236cd7b69f141af29e","unresolved":false,"context_lines":[{"line_number":28,"context_line":"oslo.concurrency\u003e\u003d0.3.0                 # Apache-2.0"},{"line_number":29,"context_line":"oslo.utils\u003e\u003d1.2.0                       # Apache-2.0"},{"line_number":30,"context_line":"stevedore\u003e\u003d1.1.0  # Apache-2.0"},{"line_number":31,"context_line":"taskflow\u003e\u003d0.6"},{"line_number":32,"context_line":"keystonemiddleware\u003e\u003d1.0.0"},{"line_number":33,"context_line":"WSME\u003e\u003d0.6"},{"line_number":34,"context_line":"# For openstack/common/lockutils"}],"source_content_type":"text/plain","patch_set":22,"id":"da86d52c_e8685823","line":31,"in_reply_to":"da86d52c_8ed45221","updated":"2015-02-03 06:42:59.000000000","message":"I\u0027d put a cap in the future if it becomes an issue/needed; but I wouldnt prematurely cap, if someday in the future then I think sure, or u could put \u003c1.0 if that is useful (might be...).","commit_id":"bc787accbdf9a0911abeb3300c01eb394986b958"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"284b90cd63f1104ce160a9e4178efbeaf308a254","unresolved":false,"context_lines":[{"line_number":28,"context_line":"oslo.concurrency\u003e\u003d0.3.0                 # Apache-2.0"},{"line_number":29,"context_line":"oslo.utils\u003e\u003d1.2.0                       # Apache-2.0"},{"line_number":30,"context_line":"stevedore\u003e\u003d1.1.0  # Apache-2.0"},{"line_number":31,"context_line":"taskflow\u003e\u003d0.6"},{"line_number":32,"context_line":"keystonemiddleware\u003e\u003d1.0.0"},{"line_number":33,"context_line":"WSME\u003e\u003d0.6"},{"line_number":34,"context_line":"# For openstack/common/lockutils"}],"source_content_type":"text/plain","patch_set":22,"id":"da86d52c_32d52d1c","line":31,"in_reply_to":"da86d52c_e8685823","updated":"2015-02-04 20:02:32.000000000","message":"I am okay to leave as is and revisit a bit before k3 is packaged.\n\nThanks!","commit_id":"bc787accbdf9a0911abeb3300c01eb394986b958"}]}
