)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2f6ae740921ddc88d5972ced1877f50c496d85ab","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The \u0027requested_destination\u0027, \u0027network_metadata\u0027, \u0027retry\u0027 fields"},{"line_number":10,"context_line":"in the RequestSpec object are reset when saving the object currently."},{"line_number":11,"context_line":"So make them not be reset when saving the object."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I2131558f0edfe603ee1e8d8bae66a3caf5182a58"},{"line_number":14,"context_line":"Closes-Bug: #1815153"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"9fdfeff1_60f31275","line":11,"range":{"start_line":11,"start_character":0,"end_line":11,"end_character":49},"updated":"2019-02-20 14:07:59.000000000","message":"It would be good to explain in the commit message *why* this is a problem. The summary is it\u0027s a problem when one part of the operation sets some fields, like in the API, which are meant to be used in another part of the operation, like conductor, but some other change is saved in between which resets the field that was set (but not persisted) in the API so the part of conductor that needed to use that field no longer gets it.\n\nA simple example is cold migrating a server with a specified host. The API sets the requested_destination so conductor will pass that information to the scheduler to restrict the cold migration to that host. But the heal_reqspec_is_bfv code in between makes an update to the RequestSpec which resets the requested_destination so the server could end up being cold migrated to some other host than the one that was requested by the API user.","commit_id":"ae5f4cdcbc0896fb4ac67b3b76587da0b4e38190"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"40149328e16e69ce5888e2fdac731bc6a7a8f9ad","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The \u0027requested_destination\u0027, \u0027network_metadata\u0027, \u0027retry\u0027 fields"},{"line_number":10,"context_line":"in the RequestSpec object are reset when saving the object currently."},{"line_number":11,"context_line":"So make them not be reset when saving the object."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I2131558f0edfe603ee1e8d8bae66a3caf5182a58"},{"line_number":14,"context_line":"Closes-Bug: #1815153"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"9fdfeff1_9427f8c7","line":11,"range":{"start_line":11,"start_character":0,"end_line":11,"end_character":49},"in_reply_to":"9fdfeff1_60f31275","updated":"2019-02-26 00:34:59.000000000","message":"Done","commit_id":"ae5f4cdcbc0896fb4ac67b3b76587da0b4e38190"}],"nova/objects/request_spec.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2f6ae740921ddc88d5972ced1877f50c496d85ab","unresolved":false,"context_lines":[{"line_number":523,"context_line":"                # None and we\u0027ll lose what is set (but not persisted) on the"},{"line_number":524,"context_line":"                # object."},{"line_number":525,"context_line":"                continue"},{"line_number":526,"context_line":"            elif key \u003d\u003d \u0027retry\u0027:"},{"line_number":527,"context_line":"                # NOTE(takashin): Do not override the \u0027retry\u0027 field"},{"line_number":528,"context_line":"                # which is not a persistent. It is not lazy-loadable field."},{"line_number":529,"context_line":"                # If it is not set, set None."}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_23b994e8","line":526,"range":{"start_line":526,"start_character":12,"end_line":526,"end_character":32},"updated":"2019-02-20 14:07:59.000000000","message":"Why don\u0027t we just handle this with the other 3 in the condition above? The field doesn\u0027t get persisted, nor does it get overwritten if its already set on spec. Why do we need to set it to None if it wasn\u0027t originally set? Since it\u0027s not persisted, we shouldn\u0027t hit a case where the setattr on L533 tries to set it from the DB.","commit_id":"ae5f4cdcbc0896fb4ac67b3b76587da0b4e38190"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"40149328e16e69ce5888e2fdac731bc6a7a8f9ad","unresolved":false,"context_lines":[{"line_number":523,"context_line":"                # None and we\u0027ll lose what is set (but not persisted) on the"},{"line_number":524,"context_line":"                # object."},{"line_number":525,"context_line":"                continue"},{"line_number":526,"context_line":"            elif key \u003d\u003d \u0027retry\u0027:"},{"line_number":527,"context_line":"                # NOTE(takashin): Do not override the \u0027retry\u0027 field"},{"line_number":528,"context_line":"                # which is not a persistent. It is not lazy-loadable field."},{"line_number":529,"context_line":"                # If it is not set, set None."}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_541f506b","line":526,"range":{"start_line":526,"start_character":12,"end_line":526,"end_character":32},"in_reply_to":"9fdfeff1_23b994e8","updated":"2019-02-26 00:34:59.000000000","message":"Done","commit_id":"ae5f4cdcbc0896fb4ac67b3b76587da0b4e38190"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2f6ae740921ddc88d5972ced1877f50c496d85ab","unresolved":false,"context_lines":[{"line_number":525,"context_line":"                continue"},{"line_number":526,"context_line":"            elif key \u003d\u003d \u0027retry\u0027:"},{"line_number":527,"context_line":"                # NOTE(takashin): Do not override the \u0027retry\u0027 field"},{"line_number":528,"context_line":"                # which is not a persistent. It is not lazy-loadable field."},{"line_number":529,"context_line":"                # If it is not set, set None."},{"line_number":530,"context_line":"                if not spec.obj_attr_is_set(key):"},{"line_number":531,"context_line":"                    setattr(spec, key, None)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_40612e11","line":528,"range":{"start_line":528,"start_character":31,"end_line":528,"end_character":43},"updated":"2019-02-20 14:07:59.000000000","message":"persisted","commit_id":"ae5f4cdcbc0896fb4ac67b3b76587da0b4e38190"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2f6ae740921ddc88d5972ced1877f50c496d85ab","unresolved":false,"context_lines":[{"line_number":527,"context_line":"                # NOTE(takashin): Do not override the \u0027retry\u0027 field"},{"line_number":528,"context_line":"                # which is not a persistent. It is not lazy-loadable field."},{"line_number":529,"context_line":"                # If it is not set, set None."},{"line_number":530,"context_line":"                if not spec.obj_attr_is_set(key):"},{"line_number":531,"context_line":"                    setattr(spec, key, None)"},{"line_number":532,"context_line":"            elif key in spec_obj:"},{"line_number":533,"context_line":"                setattr(spec, key, getattr(spec_obj, key))"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_43fdb806","line":530,"range":{"start_line":530,"start_character":23,"end_line":530,"end_character":43},"updated":"2019-02-20 14:07:59.000000000","message":"This will always be False because what we\u0027re doing in this method is setting fields on spec (which is a RequestSpec object) based on the results from the db_spec. It looks like you should be looking at spec_obj here instead.","commit_id":"ae5f4cdcbc0896fb4ac67b3b76587da0b4e38190"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"40149328e16e69ce5888e2fdac731bc6a7a8f9ad","unresolved":false,"context_lines":[{"line_number":527,"context_line":"                # NOTE(takashin): Do not override the \u0027retry\u0027 field"},{"line_number":528,"context_line":"                # which is not a persistent. It is not lazy-loadable field."},{"line_number":529,"context_line":"                # If it is not set, set None."},{"line_number":530,"context_line":"                if not spec.obj_attr_is_set(key):"},{"line_number":531,"context_line":"                    setattr(spec, key, None)"},{"line_number":532,"context_line":"            elif key in spec_obj:"},{"line_number":533,"context_line":"                setattr(spec, key, getattr(spec_obj, key))"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_a53be8ce","line":530,"range":{"start_line":530,"start_character":23,"end_line":530,"end_character":43},"in_reply_to":"9fdfeff1_43fdb806","updated":"2019-02-26 00:34:59.000000000","message":"\u003e This will always be False\n\nNo. When saving a request spec object, there is a case that the \u0027retry\u0027 has already been set in \u0027spec\u0027.\n\nAnd retry is not stored in the DB if retry is None. The field is not lazy loadable, so it should be set in that case.\n\nhttps://github.com/openstack/nova/blob/29e5b0ad7bde210f95885656768f0480d06882c0/nova/objects/request_spec.py#L600","commit_id":"ae5f4cdcbc0896fb4ac67b3b76587da0b4e38190"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"927fd73b049a5fa4340017ff3d51580a0cf3fd2c","unresolved":false,"context_lines":[{"line_number":536,"context_line":"                continue"},{"line_number":537,"context_line":"            elif key \u003d\u003d \u0027retry\u0027:"},{"line_number":538,"context_line":"                # NOTE(takashin): Do not override the \u0027retry\u0027 field"},{"line_number":539,"context_line":"                # which is not a persistent. It is not lazy-loadable field."},{"line_number":540,"context_line":"                # If it is not set, set None."},{"line_number":541,"context_line":"                if not spec.obj_attr_is_set(key):"},{"line_number":542,"context_line":"                    setattr(spec, key, None)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5fc1f717_013d9aba","line":539,"range":{"start_line":539,"start_character":31,"end_line":539,"end_character":43},"updated":"2019-03-05 20:31:04.000000000","message":"persisted","commit_id":"67d5970445818f2f245cf1b6d9d46c36fb220f04"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c562137a3324d23efe0f79cc98553d2e2e0469e4","unresolved":false,"context_lines":[{"line_number":539,"context_line":"                # which is not a persistent. It is not lazy-loadable field."},{"line_number":540,"context_line":"                # If it is not set, set None."},{"line_number":541,"context_line":"                if not spec.obj_attr_is_set(key):"},{"line_number":542,"context_line":"                    setattr(spec, key, None)"},{"line_number":543,"context_line":"            elif key in spec_obj:"},{"line_number":544,"context_line":"                setattr(spec, key, getattr(spec_obj, key))"},{"line_number":545,"context_line":"        spec._context \u003d context"}],"source_content_type":"text/x-python","patch_set":7,"id":"5fc1f717_8d6221d8","line":542,"updated":"2019-03-05 17:36:26.000000000","message":"Seems like maybe all of these should have default\u003dNone and just use obj_set_defaults() here. This works too, but it\u0027s a little less obvious I think (hence all the comments).","commit_id":"67d5970445818f2f245cf1b6d9d46c36fb220f04"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"927fd73b049a5fa4340017ff3d51580a0cf3fd2c","unresolved":false,"context_lines":[{"line_number":539,"context_line":"                # which is not a persistent. It is not lazy-loadable field."},{"line_number":540,"context_line":"                # If it is not set, set None."},{"line_number":541,"context_line":"                if not spec.obj_attr_is_set(key):"},{"line_number":542,"context_line":"                    setattr(spec, key, None)"},{"line_number":543,"context_line":"            elif key in spec_obj:"},{"line_number":544,"context_line":"                setattr(spec, key, getattr(spec_obj, key))"},{"line_number":545,"context_line":"        spec._context \u003d context"}],"source_content_type":"text/x-python","patch_set":7,"id":"5fc1f717_619a5ec6","line":542,"in_reply_to":"5fc1f717_8d6221d8","updated":"2019-03-05 20:31:04.000000000","message":"Yeah in PS6 I asked why we can\u0027t just handle \u0027retry\u0027 with the others above on L528 and I guess the difference is that \u0027retry\u0027 is not lazy-loadable (as the comment says) so if something tries to use it we\u0027d get an AttributeError. But before this change we wouldn\u0027t set the retry attribute if it wasn\u0027t in the database either, right? Anyway, it\u0027s not a big deal, but I agree it would be nice to handle this all more generically.","commit_id":"67d5970445818f2f245cf1b6d9d46c36fb220f04"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"927fd73b049a5fa4340017ff3d51580a0cf3fd2c","unresolved":false,"context_lines":[{"line_number":601,"context_line":"            if \u0027instance_group\u0027 in spec and spec.instance_group:"},{"line_number":602,"context_line":"                spec.instance_group.members \u003d None"},{"line_number":603,"context_line":"                spec.instance_group.hosts \u003d None"},{"line_number":604,"context_line":"            # NOTE(mriedem): Don\u0027t persist retries or requested_destination"},{"line_number":605,"context_line":"            # since those are per-request"},{"line_number":606,"context_line":"            for excluded in (\u0027retry\u0027, \u0027requested_destination\u0027,"},{"line_number":607,"context_line":"                             \u0027requested_resources\u0027):"},{"line_number":608,"context_line":"                if excluded in spec and getattr(spec, excluded):"},{"line_number":609,"context_line":"                    setattr(spec, excluded, None)"},{"line_number":610,"context_line":"            # NOTE(stephenfin): Don\u0027t persist network metadata since we have"},{"line_number":611,"context_line":"            # no need for it after scheduling"},{"line_number":612,"context_line":"            if \u0027network_metadata\u0027 in spec and spec.network_metadata:"},{"line_number":613,"context_line":"                del spec.network_metadata"},{"line_number":614,"context_line":""},{"line_number":615,"context_line":"            db_updates \u003d {\u0027spec\u0027: jsonutils.dumps(spec.obj_to_primitive())}"},{"line_number":616,"context_line":"            if \u0027instance_uuid\u0027 in updates:"}],"source_content_type":"text/x-python","patch_set":7,"id":"5fc1f717_01ab5ad6","line":613,"range":{"start_line":604,"start_character":12,"end_line":613,"end_character":41},"updated":"2019-03-05 20:31:04.000000000","message":"Blech, more stuff I\u0027d like to make generic, but we don\u0027t need to in this change (which needs to be backported).","commit_id":"67d5970445818f2f245cf1b6d9d46c36fb220f04"}],"nova/tests/functional/regressions/test_bug_1815153.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2f6ae740921ddc88d5972ced1877f50c496d85ab","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    \u0027requested_destination\u0027 is not set when the \u0027heal_reqspec_is_bfv\u0027 method"},{"line_number":45,"context_line":"    is called."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    * Live migration without a destination host."},{"line_number":48,"context_line":"    * Unshelve a server"},{"line_number":49,"context_line":"    \"\"\""},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_c33e88b8","line":47,"updated":"2019-02-20 14:07:59.000000000","message":"Why don\u0027t you test live migration *with* a requested destination host?","commit_id":"ae5f4cdcbc0896fb4ac67b3b76587da0b4e38190"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"20268353370e8c8890b8b3dbadc72884fe369964","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    \u0027requested_destination\u0027 is not set when the \u0027heal_reqspec_is_bfv\u0027 method"},{"line_number":45,"context_line":"    is called."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    * Live migration without a destination host."},{"line_number":48,"context_line":"    * Unshelve a server"},{"line_number":49,"context_line":"    \"\"\""},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5fc1f717_ac1a7614","line":47,"in_reply_to":"5fc1f717_c1bb120c","updated":"2019-03-06 02:06:09.000000000","message":"You are correct.\nI will submit a follow-up patch to add a test for live migration and fix some nits.","commit_id":"ae5f4cdcbc0896fb4ac67b3b76587da0b4e38190"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"927fd73b049a5fa4340017ff3d51580a0cf3fd2c","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    \u0027requested_destination\u0027 is not set when the \u0027heal_reqspec_is_bfv\u0027 method"},{"line_number":45,"context_line":"    is called."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    * Live migration without a destination host."},{"line_number":48,"context_line":"    * Unshelve a server"},{"line_number":49,"context_line":"    \"\"\""},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5fc1f717_c1bb120c","line":47,"in_reply_to":"9fdfeff1_978a9a61","updated":"2019-03-05 20:31:04.000000000","message":"I don\u0027t think that\u0027s true. self.destination in the live migration task is set if the user is forcing a destination host, but if the user asks for a host but is not specifying force\u003dTrue then we still run that requested host through the scheduler, which is the same case as cold migrating with a specified host.\n\nhttps://github.com/openstack/nova/blob/c43c1d3fb9da5dd0a13e1f15623a696212f095ff/nova/compute/api.py#L4452-L4467","commit_id":"ae5f4cdcbc0896fb4ac67b3b76587da0b4e38190"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"40149328e16e69ce5888e2fdac731bc6a7a8f9ad","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    \u0027requested_destination\u0027 is not set when the \u0027heal_reqspec_is_bfv\u0027 method"},{"line_number":45,"context_line":"    is called."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    * Live migration without a destination host."},{"line_number":48,"context_line":"    * Unshelve a server"},{"line_number":49,"context_line":"    \"\"\""},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_978a9a61","line":47,"in_reply_to":"9fdfeff1_c33e88b8","updated":"2019-02-26 00:34:59.000000000","message":"Because the \u0027heal_reqspec_is_bfv\u0027 is not called when a requested destination is set.\n\nhttps://github.com/openstack/nova/blob/29e5b0ad7bde210f95885656768f0480d06882c0/nova/conductor/tasks/live_migrate.py#L370","commit_id":"ae5f4cdcbc0896fb4ac67b3b76587da0b4e38190"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2f6ae740921ddc88d5972ced1877f50c496d85ab","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        self.api.put_service("},{"line_number":121,"context_line":"            source_compute_id, {\u0027forced_down\u0027: \u0027true\u0027})"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        # Cold migrate a server with a target host and being not forced."},{"line_number":124,"context_line":"        # If requested_destination is reset, the server is moved to a host"},{"line_number":125,"context_line":"        # that is not a source host and a target host."},{"line_number":126,"context_line":"        # In that case, the response code is 202."}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_c395288a","line":123,"range":{"start_line":123,"start_character":50,"end_line":123,"end_character":72},"updated":"2019-02-20 14:07:59.000000000","message":"You can remove this part - there is no \u0027force\u0027 flag on the migrate API (for good reason).","commit_id":"ae5f4cdcbc0896fb4ac67b3b76587da0b4e38190"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"40149328e16e69ce5888e2fdac731bc6a7a8f9ad","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        self.api.put_service("},{"line_number":121,"context_line":"            source_compute_id, {\u0027forced_down\u0027: \u0027true\u0027})"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        # Cold migrate a server with a target host and being not forced."},{"line_number":124,"context_line":"        # If requested_destination is reset, the server is moved to a host"},{"line_number":125,"context_line":"        # that is not a source host and a target host."},{"line_number":126,"context_line":"        # In that case, the response code is 202."}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_37372eb3","line":123,"range":{"start_line":123,"start_character":50,"end_line":123,"end_character":72},"in_reply_to":"9fdfeff1_c395288a","updated":"2019-02-26 00:34:59.000000000","message":"Done","commit_id":"ae5f4cdcbc0896fb4ac67b3b76587da0b4e38190"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2f6ae740921ddc88d5972ced1877f50c496d85ab","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        # Cold migrate a server with a target host and being not forced."},{"line_number":124,"context_line":"        # If requested_destination is reset, the server is moved to a host"},{"line_number":125,"context_line":"        # that is not a source host and a target host."},{"line_number":126,"context_line":"        # In that case, the response code is 202."},{"line_number":127,"context_line":"        # If requested_destination is not reset, no valid host error (400) is"},{"line_number":128,"context_line":"        # returned because a target host is down."}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_c3da0878","line":125,"range":{"start_line":125,"start_character":22,"end_line":125,"end_character":54},"updated":"2019-02-20 14:07:59.000000000","message":"the requested target_host.","commit_id":"ae5f4cdcbc0896fb4ac67b3b76587da0b4e38190"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"40149328e16e69ce5888e2fdac731bc6a7a8f9ad","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        # Cold migrate a server with a target host and being not forced."},{"line_number":124,"context_line":"        # If requested_destination is reset, the server is moved to a host"},{"line_number":125,"context_line":"        # that is not a source host and a target host."},{"line_number":126,"context_line":"        # In that case, the response code is 202."},{"line_number":127,"context_line":"        # If requested_destination is not reset, no valid host error (400) is"},{"line_number":128,"context_line":"        # returned because a target host is down."}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_775056d6","line":125,"range":{"start_line":125,"start_character":22,"end_line":125,"end_character":54},"in_reply_to":"9fdfeff1_c3da0878","updated":"2019-02-26 00:34:59.000000000","message":"Done","commit_id":"ae5f4cdcbc0896fb4ac67b3b76587da0b4e38190"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2f6ae740921ddc88d5972ced1877f50c496d85ab","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        # that is not a source host and a target host."},{"line_number":126,"context_line":"        # In that case, the response code is 202."},{"line_number":127,"context_line":"        # If requested_destination is not reset, no valid host error (400) is"},{"line_number":128,"context_line":"        # returned because a target host is down."},{"line_number":129,"context_line":"        ex \u003d self.assertRaises(client.OpenStackApiException,"},{"line_number":130,"context_line":"                               self.api.post_server_action,"},{"line_number":131,"context_line":"                               server[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_e3d70c4f","line":128,"range":{"start_line":128,"start_character":27,"end_line":128,"end_character":28},"updated":"2019-02-20 14:07:59.000000000","message":"the","commit_id":"ae5f4cdcbc0896fb4ac67b3b76587da0b4e38190"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"40149328e16e69ce5888e2fdac731bc6a7a8f9ad","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        # that is not a source host and a target host."},{"line_number":126,"context_line":"        # In that case, the response code is 202."},{"line_number":127,"context_line":"        # If requested_destination is not reset, no valid host error (400) is"},{"line_number":128,"context_line":"        # returned because a target host is down."},{"line_number":129,"context_line":"        ex \u003d self.assertRaises(client.OpenStackApiException,"},{"line_number":130,"context_line":"                               self.api.post_server_action,"},{"line_number":131,"context_line":"                               server[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_974dba3c","line":128,"range":{"start_line":128,"start_character":27,"end_line":128,"end_character":28},"in_reply_to":"9fdfeff1_e3d70c4f","updated":"2019-02-26 00:34:59.000000000","message":"Done","commit_id":"ae5f4cdcbc0896fb4ac67b3b76587da0b4e38190"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2f6ae740921ddc88d5972ced1877f50c496d85ab","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        # Make sure \u0027is_bfv\u0027 is set."},{"line_number":138,"context_line":"        reqspec \u003d objects.RequestSpec.get_by_instance_uuid(self.ctxt,"},{"line_number":139,"context_line":"                                                           server[\u0027id\u0027])"},{"line_number":140,"context_line":"        self.assertIn(\u0027is_bfv\u0027, reqspec)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def test_evacuate(self):"},{"line_number":143,"context_line":"        server \u003d self._create_server()"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_a3ba6407","line":140,"updated":"2019-02-20 14:07:59.000000000","message":"Also assert that it is False.","commit_id":"ae5f4cdcbc0896fb4ac67b3b76587da0b4e38190"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"40149328e16e69ce5888e2fdac731bc6a7a8f9ad","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        # Make sure \u0027is_bfv\u0027 is set."},{"line_number":138,"context_line":"        reqspec \u003d objects.RequestSpec.get_by_instance_uuid(self.ctxt,"},{"line_number":139,"context_line":"                                                           server[\u0027id\u0027])"},{"line_number":140,"context_line":"        self.assertIn(\u0027is_bfv\u0027, reqspec)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def test_evacuate(self):"},{"line_number":143,"context_line":"        server \u003d self._create_server()"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_37bc0edb","line":140,"in_reply_to":"9fdfeff1_a3ba6407","updated":"2019-02-26 00:34:59.000000000","message":"Done","commit_id":"ae5f4cdcbc0896fb4ac67b3b76587da0b4e38190"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2f6ae740921ddc88d5972ced1877f50c496d85ab","unresolved":false,"context_lines":[{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        # Evacuate a server with a target host and being not forced."},{"line_number":157,"context_line":"        # If requested_destination is reset, the server is moved to a host"},{"line_number":158,"context_line":"        # that is not a source host and a target host."},{"line_number":159,"context_line":"        # Its status becomes \u0027ACTIVE\u0027."},{"line_number":160,"context_line":"        # If requested_destination is not reset, a status of the server"},{"line_number":161,"context_line":"        # becomes \u0027ERROR\u0027 because a target host is down."}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_633a3c99","line":158,"range":{"start_line":158,"start_character":22,"end_line":158,"end_character":54},"updated":"2019-02-20 14:07:59.000000000","message":"the target host.","commit_id":"ae5f4cdcbc0896fb4ac67b3b76587da0b4e38190"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"40149328e16e69ce5888e2fdac731bc6a7a8f9ad","unresolved":false,"context_lines":[{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        # Evacuate a server with a target host and being not forced."},{"line_number":157,"context_line":"        # If requested_destination is reset, the server is moved to a host"},{"line_number":158,"context_line":"        # that is not a source host and a target host."},{"line_number":159,"context_line":"        # Its status becomes \u0027ACTIVE\u0027."},{"line_number":160,"context_line":"        # If requested_destination is not reset, a status of the server"},{"line_number":161,"context_line":"        # becomes \u0027ERROR\u0027 because a target host is down."}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_17ac6a9d","line":158,"range":{"start_line":158,"start_character":22,"end_line":158,"end_character":54},"in_reply_to":"9fdfeff1_633a3c99","updated":"2019-02-26 00:34:59.000000000","message":"Done","commit_id":"ae5f4cdcbc0896fb4ac67b3b76587da0b4e38190"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2f6ae740921ddc88d5972ced1877f50c496d85ab","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        # that is not a source host and a target host."},{"line_number":159,"context_line":"        # Its status becomes \u0027ACTIVE\u0027."},{"line_number":160,"context_line":"        # If requested_destination is not reset, a status of the server"},{"line_number":161,"context_line":"        # becomes \u0027ERROR\u0027 because a target host is down."},{"line_number":162,"context_line":"        self.api.post_server_action("},{"line_number":163,"context_line":"            server[\u0027id\u0027], {\u0027evacuate\u0027: {\u0027host\u0027: target_host}})"},{"line_number":164,"context_line":"        expected_params \u003d {\u0027OS-EXT-SRV-ATTR:host\u0027: original_host,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_2344341b","line":161,"range":{"start_line":161,"start_character":34,"end_line":161,"end_character":35},"updated":"2019-02-20 14:07:59.000000000","message":"the","commit_id":"ae5f4cdcbc0896fb4ac67b3b76587da0b4e38190"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"40149328e16e69ce5888e2fdac731bc6a7a8f9ad","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        # that is not a source host and a target host."},{"line_number":159,"context_line":"        # Its status becomes \u0027ACTIVE\u0027."},{"line_number":160,"context_line":"        # If requested_destination is not reset, a status of the server"},{"line_number":161,"context_line":"        # becomes \u0027ERROR\u0027 because a target host is down."},{"line_number":162,"context_line":"        self.api.post_server_action("},{"line_number":163,"context_line":"            server[\u0027id\u0027], {\u0027evacuate\u0027: {\u0027host\u0027: target_host}})"},{"line_number":164,"context_line":"        expected_params \u003d {\u0027OS-EXT-SRV-ATTR:host\u0027: original_host,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_779a966f","line":161,"range":{"start_line":161,"start_character":34,"end_line":161,"end_character":35},"in_reply_to":"9fdfeff1_2344341b","updated":"2019-02-26 00:34:59.000000000","message":"Done","commit_id":"ae5f4cdcbc0896fb4ac67b3b76587da0b4e38190"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2f6ae740921ddc88d5972ced1877f50c496d85ab","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        # Make sure \u0027is_bfv\u0027 is set."},{"line_number":170,"context_line":"        reqspec \u003d objects.RequestSpec.get_by_instance_uuid(self.ctxt,"},{"line_number":171,"context_line":"                                                           server[\u0027id\u0027])"},{"line_number":172,"context_line":"        self.assertIn(\u0027is_bfv\u0027, reqspec)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_430378bf","line":172,"updated":"2019-02-20 14:07:59.000000000","message":"Same, assert it\u0027s False.","commit_id":"ae5f4cdcbc0896fb4ac67b3b76587da0b4e38190"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"40149328e16e69ce5888e2fdac731bc6a7a8f9ad","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        # Make sure \u0027is_bfv\u0027 is set."},{"line_number":170,"context_line":"        reqspec \u003d objects.RequestSpec.get_by_instance_uuid(self.ctxt,"},{"line_number":171,"context_line":"                                                           server[\u0027id\u0027])"},{"line_number":172,"context_line":"        self.assertIn(\u0027is_bfv\u0027, reqspec)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_378ace1a","line":172,"in_reply_to":"9fdfeff1_430378bf","updated":"2019-02-26 00:34:59.000000000","message":"Done","commit_id":"ae5f4cdcbc0896fb4ac67b3b76587da0b4e38190"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"927fd73b049a5fa4340017ff3d51580a0cf3fd2c","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        reqspec \u003d objects.RequestSpec.get_by_instance_uuid(self.ctxt,"},{"line_number":139,"context_line":"                                                           server[\u0027id\u0027])"},{"line_number":140,"context_line":"        self.assertIn(\u0027is_bfv\u0027, reqspec)"},{"line_number":141,"context_line":"        self.assertIs(reqspec.is_bfv, False)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def test_evacuate(self):"},{"line_number":144,"context_line":"        server \u003d self._create_server()"}],"source_content_type":"text/x-python","patch_set":7,"id":"5fc1f717_e1496e32","line":141,"updated":"2019-03-05 20:31:04.000000000","message":"nit: use self.assertFalse(reqspec.is_bfv)","commit_id":"67d5970445818f2f245cf1b6d9d46c36fb220f04"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"927fd73b049a5fa4340017ff3d51580a0cf3fd2c","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        reqspec \u003d objects.RequestSpec.get_by_instance_uuid(self.ctxt,"},{"line_number":172,"context_line":"                                                           server[\u0027id\u0027])"},{"line_number":173,"context_line":"        self.assertIn(\u0027is_bfv\u0027, reqspec)"},{"line_number":174,"context_line":"        self.assertIs(reqspec.is_bfv, False)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5fc1f717_615fbee5","line":174,"updated":"2019-03-05 20:31:04.000000000","message":"same","commit_id":"67d5970445818f2f245cf1b6d9d46c36fb220f04"}],"nova/tests/unit/objects/test_request_spec.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2f6ae740921ddc88d5972ced1877f50c496d85ab","unresolved":false,"context_lines":[{"line_number":660,"context_line":"            req_obj.create()"},{"line_number":661,"context_line":"            mock_create_in_db.assert_called_once()"},{"line_number":662,"context_line":"            updates \u003d mock_create_in_db.mock_calls[0][1][1]"},{"line_number":663,"context_line":"            # assert that the following fields is not stored in the db"},{"line_number":664,"context_line":"            # 1. network_metadata"},{"line_number":665,"context_line":"            # 2. requested_destination"},{"line_number":666,"context_line":"            # 3. requested_resources"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_c3f688d9","line":663,"range":{"start_line":663,"start_character":47,"end_line":663,"end_character":49},"updated":"2019-02-20 14:07:59.000000000","message":"are","commit_id":"ae5f4cdcbc0896fb4ac67b3b76587da0b4e38190"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"40149328e16e69ce5888e2fdac731bc6a7a8f9ad","unresolved":false,"context_lines":[{"line_number":660,"context_line":"            req_obj.create()"},{"line_number":661,"context_line":"            mock_create_in_db.assert_called_once()"},{"line_number":662,"context_line":"            updates \u003d mock_create_in_db.mock_calls[0][1][1]"},{"line_number":663,"context_line":"            # assert that the following fields is not stored in the db"},{"line_number":664,"context_line":"            # 1. network_metadata"},{"line_number":665,"context_line":"            # 2. requested_destination"},{"line_number":666,"context_line":"            # 3. requested_resources"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_37ddee13","line":663,"range":{"start_line":663,"start_character":47,"end_line":663,"end_character":49},"in_reply_to":"9fdfeff1_c3f688d9","updated":"2019-02-26 00:34:59.000000000","message":"Done","commit_id":"ae5f4cdcbc0896fb4ac67b3b76587da0b4e38190"}]}
