)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e4188af1e2110df699e410c7f2d8f9b99dc8e138","unresolved":false,"context_lines":[{"line_number":36,"context_line":"This change adds an additional check to aggregate an Update Aggregate API call."},{"line_number":37,"context_line":"With the check, it\u0027s not possible to rename AZ if the corresponding"},{"line_number":38,"context_line":"aggregate has instances in any hosts."},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"PUT /os-aggregates/{aggregate_id} and"},{"line_number":41,"context_line":"POST /os-aggregates/{aggregate_id}/action return HTTP 400 for"},{"line_number":42,"context_line":"availability zone renaming if the hosts of the aggregate have any instances."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"9fdfeff1_37d22a36","line":39,"updated":"2019-02-06 20:24:32.000000000","message":"Another issue I think we could hit is:\n\n1. create an instance in AZ1\n2. shelve offload that instance\n3. rename the AZ to AZ2\n4. unshelve the instance - at this point it will fail to schedule because AZ1 doesn\u0027t exist but that\u0027s what the RequestSpec is pointing at\n\nI\u0027m not saying we need to deal with that here, but it\u0027s a problem as seen from this spec: https://review.openstack.org/#/c/624689/\n\nSo maybe the answer for that problem is just implementing that spec to support passing a new AZ when unshelving a server.\n\nOtherwise we\u0027d have to do something like check to see if there are instances in SHELVED_OFFLOADED status where their associated AZ points at the AZ being renamed, which is way more complicated than we want to deal with here in the API that is doing a simple count.","commit_id":"b3454959b22edc16c6a932bfae872fa2522df07a"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"da7fb1c90846cadcbfd8590c09289b28f5cabf5e","unresolved":false,"context_lines":[{"line_number":36,"context_line":"This change adds an additional check to aggregate an Update Aggregate API call."},{"line_number":37,"context_line":"With the check, it\u0027s not possible to rename AZ if the corresponding"},{"line_number":38,"context_line":"aggregate has instances in any hosts."},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"PUT /os-aggregates/{aggregate_id} and"},{"line_number":41,"context_line":"POST /os-aggregates/{aggregate_id}/action return HTTP 400 for"},{"line_number":42,"context_line":"availability zone renaming if the hosts of the aggregate have any instances."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"9fdfeff1_026c6534","line":39,"in_reply_to":"9fdfeff1_37d22a36","updated":"2019-02-08 11:36:19.000000000","message":"Aren\u0027t shelved instance got into filter _get_count_by_hosts?\nI thought they have not deleted flag.","commit_id":"b3454959b22edc16c6a932bfae872fa2522df07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e4188af1e2110df699e410c7f2d8f9b99dc8e138","unresolved":false,"context_lines":[{"line_number":37,"context_line":"With the check, it\u0027s not possible to rename AZ if the corresponding"},{"line_number":38,"context_line":"aggregate has instances in any hosts."},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"PUT /os-aggregates/{aggregate_id} and"},{"line_number":41,"context_line":"POST /os-aggregates/{aggregate_id}/action return HTTP 400 for"},{"line_number":42,"context_line":"availability zone renaming if the hosts of the aggregate have any instances."},{"line_number":43,"context_line":"It\u0027s similar to conflicting AZ names error already available."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"9fdfeff1_979af66b","line":40,"updated":"2019-02-06 20:24:32.000000000","message":"What do you think about updating the API reference for these operations to mention the restriction?\n\nhttps://developer.openstack.org/api-ref/compute/?expanded\u003d#host-aggregates-os-aggregates\n\nThe problem is, for clouds that don\u0027t have this fix they will still allow the broken behavior. So maybe we should say something in those docs saying you should not attempt to rename an availability zone when there are instances in it since that can corrupt the instance system metadata such that nova will be unable to migrate the instance.\n\nGranted, we could do the API reference warning separate from this change.","commit_id":"b3454959b22edc16c6a932bfae872fa2522df07a"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"da7fb1c90846cadcbfd8590c09289b28f5cabf5e","unresolved":false,"context_lines":[{"line_number":37,"context_line":"With the check, it\u0027s not possible to rename AZ if the corresponding"},{"line_number":38,"context_line":"aggregate has instances in any hosts."},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"PUT /os-aggregates/{aggregate_id} and"},{"line_number":41,"context_line":"POST /os-aggregates/{aggregate_id}/action return HTTP 400 for"},{"line_number":42,"context_line":"availability zone renaming if the hosts of the aggregate have any instances."},{"line_number":43,"context_line":"It\u0027s similar to conflicting AZ names error already available."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"9fdfeff1_425b4d86","line":40,"in_reply_to":"9fdfeff1_979af66b","updated":"2019-02-08 11:36:19.000000000","message":"That\u0027s great. Out customers hit several times into that issue.","commit_id":"b3454959b22edc16c6a932bfae872fa2522df07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d5b9616d495c687c5ddccdf2174bd64992eeb903","unresolved":false,"context_lines":[{"line_number":37,"context_line":"With the check, it\u0027s not possible to rename AZ if the corresponding"},{"line_number":38,"context_line":"aggregate has instances in any hosts."},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"PUT /os-aggregates/{aggregate_id} and"},{"line_number":41,"context_line":"POST /os-aggregates/{aggregate_id}/action return HTTP 400 for"},{"line_number":42,"context_line":"availability zone renaming if the hosts of the aggregate have any instances."},{"line_number":43,"context_line":"It\u0027s similar to conflicting AZ names error already available."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"9fdfeff1_e65875fb","line":40,"in_reply_to":"9fdfeff1_979af66b","updated":"2019-02-06 21:20:21.000000000","message":"You could rebase on this change:\n\nhttps://review.openstack.org/#/c/635315/","commit_id":"b3454959b22edc16c6a932bfae872fa2522df07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e4188af1e2110df699e410c7f2d8f9b99dc8e138","unresolved":false,"context_lines":[{"line_number":38,"context_line":"aggregate has instances in any hosts."},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"PUT /os-aggregates/{aggregate_id} and"},{"line_number":41,"context_line":"POST /os-aggregates/{aggregate_id}/action return HTTP 400 for"},{"line_number":42,"context_line":"availability zone renaming if the hosts of the aggregate have any instances."},{"line_number":43,"context_line":"It\u0027s similar to conflicting AZ names error already available."},{"line_number":44,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"9fdfeff1_ec44d976","line":41,"range":{"start_line":41,"start_character":54,"end_line":41,"end_character":57},"updated":"2019-02-06 20:24:32.000000000","message":"Arguably this should be a 409 since the request is OK if it passes schema validation but the state of the system is in conflict. To rename the aggregate, the admin needs to move instances out of that aggregate or delete them. Although I guess this is just re-using InvalidAggregateActionUpdate(Meta) which already returns a 400. OK.","commit_id":"b3454959b22edc16c6a932bfae872fa2522df07a"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"da7fb1c90846cadcbfd8590c09289b28f5cabf5e","unresolved":false,"context_lines":[{"line_number":38,"context_line":"aggregate has instances in any hosts."},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"PUT /os-aggregates/{aggregate_id} and"},{"line_number":41,"context_line":"POST /os-aggregates/{aggregate_id}/action return HTTP 400 for"},{"line_number":42,"context_line":"availability zone renaming if the hosts of the aggregate have any instances."},{"line_number":43,"context_line":"It\u0027s similar to conflicting AZ names error already available."},{"line_number":44,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"9fdfeff1_e24921b7","line":41,"range":{"start_line":41,"start_character":54,"end_line":41,"end_character":57},"in_reply_to":"9fdfeff1_ec44d976","updated":"2019-02-08 11:36:19.000000000","message":"Probably 409 is good, but I made it similar to conflicting az error.","commit_id":"b3454959b22edc16c6a932bfae872fa2522df07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e4188af1e2110df699e410c7f2d8f9b99dc8e138","unresolved":false,"context_lines":[{"line_number":41,"context_line":"POST /os-aggregates/{aggregate_id}/action return HTTP 400 for"},{"line_number":42,"context_line":"availability zone renaming if the hosts of the aggregate have any instances."},{"line_number":43,"context_line":"It\u0027s similar to conflicting AZ names error already available."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Change-Id: Ic27195e46502067c87ee9c71a811a3ca3f610b73"},{"line_number":46,"context_line":"Closes-Bug: #1378904"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"9fdfeff1_175b662e","line":44,"updated":"2019-02-06 20:24:32.000000000","message":"I\u0027m surprised you don\u0027t need to depend on this tempest change.\n\nhttps://review.openstack.org/#/c/615159/","commit_id":"b3454959b22edc16c6a932bfae872fa2522df07a"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"da7fb1c90846cadcbfd8590c09289b28f5cabf5e","unresolved":false,"context_lines":[{"line_number":41,"context_line":"POST /os-aggregates/{aggregate_id}/action return HTTP 400 for"},{"line_number":42,"context_line":"availability zone renaming if the hosts of the aggregate have any instances."},{"line_number":43,"context_line":"It\u0027s similar to conflicting AZ names error already available."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Change-Id: Ic27195e46502067c87ee9c71a811a3ca3f610b73"},{"line_number":46,"context_line":"Closes-Bug: #1378904"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"9fdfeff1_62d3f1d6","line":44,"in_reply_to":"9fdfeff1_175b662e","updated":"2019-02-08 11:36:19.000000000","message":"In this patch, I do a fix for update only, neither add host nor delete.","commit_id":"b3454959b22edc16c6a932bfae872fa2522df07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e4188af1e2110df699e410c7f2d8f9b99dc8e138","unresolved":false,"context_lines":[{"line_number":43,"context_line":"It\u0027s similar to conflicting AZ names error already available."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Change-Id: Ic27195e46502067c87ee9c71a811a3ca3f610b73"},{"line_number":46,"context_line":"Closes-Bug: #1378904"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"9fdfeff1_8c2aed8d","line":46,"updated":"2019-02-06 20:24:32.000000000","message":"Bug 1782539 is a duplicate it looks like, and the one I\u0027d been tracking off and on for a long time. Note that this has come up at the Stein PTG (L839 https://etherpad.openstack.org/p/nova-ptg-stein) and the mailing list http://lists.openstack.org/pipermail/openstack-operators/2018-March/015029.html and the agreement was always to block AZ renames while there were instances in the AZ, so I\u0027m in favor of the direction.","commit_id":"b3454959b22edc16c6a932bfae872fa2522df07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c9135f6b84e0db0d7e22383e310bff1f40f1019e","unresolved":false,"context_lines":[{"line_number":42,"context_line":"availability zone renaming if the hosts of the aggregate have any instances."},{"line_number":43,"context_line":"It\u0027s similar to conflicting AZ names error already available."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Depends-On: https://review.openstack.org/638028/"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Change-Id: Ic27195e46502067c87ee9c71a811a3ca3f610b73"},{"line_number":48,"context_line":"Closes-Bug: #1378904"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"9fdfeff1_97a5e849","line":45,"updated":"2019-02-22 15:09:34.000000000","message":"I\u0027m not sure if we need this anymore?","commit_id":"db0a7fad87ac828b48dabead0ee4a65ab296ed16"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"66114e6a7327943af8886e78d289862349f9eedf","unresolved":false,"context_lines":[{"line_number":42,"context_line":"availability zone renaming if the hosts of the aggregate have any instances."},{"line_number":43,"context_line":"It\u0027s similar to conflicting AZ names error already available."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Depends-On: https://review.openstack.org/638028/"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Change-Id: Ic27195e46502067c87ee9c71a811a3ca3f610b73"},{"line_number":48,"context_line":"Closes-Bug: #1378904"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"9fdfeff1_622b4dea","line":45,"updated":"2019-03-01 16:57:29.000000000","message":"We can drop this now too I think since the issue in tempest was fixed in PS12.","commit_id":"960c35b1511b6c69e3e8d6085db194726d9ecb4f"}],"nova/compute/api.py":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0fb120a2856b4ce15688b520a9239b195ad8e088","unresolved":false,"context_lines":[{"line_number":4669,"context_line":"                                                  msg)"},{"line_number":4670,"context_line":"            instance_count_by_cell \u003d nova_context.scatter_gather_skip_cell0("},{"line_number":4671,"context_line":"                context, objects.InstanceList.get_count_by_hosts, _hosts)"},{"line_number":4672,"context_line":"            if any(cnt for cnt in instance_count_by_cell.values()):"},{"line_number":4673,"context_line":"                msg \u003d _(\"One or more host has instances\")"},{"line_number":4674,"context_line":"                self._raise_invalid_aggregate_exc(action_name, aggregate.id,"},{"line_number":4675,"context_line":"                                                  msg)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f4e5783_791cf869","line":4672,"updated":"2017-10-11 12:56:37.000000000","message":"That could be a very large set of instances (so possibly a performance issue) but meh, it\u0027s an admin API.","commit_id":"1756db5823d1551771e00e090c5fee13d69018fb"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"9a1bef4e2b822fa4760fc17f055e32a303976f76","unresolved":false,"context_lines":[{"line_number":4669,"context_line":"                                                  msg)"},{"line_number":4670,"context_line":"            instance_count_by_cell \u003d nova_context.scatter_gather_skip_cell0("},{"line_number":4671,"context_line":"                context, objects.InstanceList.get_count_by_hosts, _hosts)"},{"line_number":4672,"context_line":"            if any(cnt for cnt in instance_count_by_cell.values()):"},{"line_number":4673,"context_line":"                msg \u003d _(\"One or more host has instances\")"},{"line_number":4674,"context_line":"                self._raise_invalid_aggregate_exc(action_name, aggregate.id,"},{"line_number":4675,"context_line":"                                                  msg)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f4e5783_b0371eb1","line":4672,"in_reply_to":"5f4e5783_791cf869","updated":"2017-10-11 15:57:48.000000000","message":"Yes, almost the same for the quotas count. I hope MySql query cache can help a little here.","commit_id":"1756db5823d1551771e00e090c5fee13d69018fb"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0fb120a2856b4ce15688b520a9239b195ad8e088","unresolved":false,"context_lines":[{"line_number":4766,"context_line":""},{"line_number":4767,"context_line":"        self.is_safe_to_update_az(context, aggregate.metadata,"},{"line_number":4768,"context_line":"                                  hosts\u003d[host_name], aggregate\u003daggregate,"},{"line_number":4769,"context_line":"                                  action_name\u003dAGGREGATE_ACTION_DELETE)"},{"line_number":4770,"context_line":"        compute_utils.notify_about_aggregate_action("},{"line_number":4771,"context_line":"            context\u003dcontext,"},{"line_number":4772,"context_line":"            aggregate\u003daggregate,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f4e5783_d63f3bd4","line":4769,"updated":"2017-10-11 12:56:37.000000000","message":"That\u0027s a separate concern from the original bug.\nIf you want to remove a host from an aggregate, you should always accept it IMHO and I don\u0027t see why we would need to avoid removing the host from the AZ if there are current instances in the host ?","commit_id":"1756db5823d1551771e00e090c5fee13d69018fb"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4469ad3683c2d0fb295a4d58ffcb9988deb04cf1","unresolved":false,"context_lines":[{"line_number":4766,"context_line":""},{"line_number":4767,"context_line":"        self.is_safe_to_update_az(context, aggregate.metadata,"},{"line_number":4768,"context_line":"                                  hosts\u003d[host_name], aggregate\u003daggregate,"},{"line_number":4769,"context_line":"                                  action_name\u003dAGGREGATE_ACTION_DELETE)"},{"line_number":4770,"context_line":"        compute_utils.notify_about_aggregate_action("},{"line_number":4771,"context_line":"            context\u003dcontext,"},{"line_number":4772,"context_line":"            aggregate\u003daggregate,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f4e5783_fe376eaf","line":4769,"in_reply_to":"5f4e5783_6d3b0deb","updated":"2017-10-13 08:40:05.000000000","message":"You\u0027re mixing two concerns here. Let me explain a little bit more : an instance is only stuck within an AZ if you specify the AZ as a boot flag (or if you set something for the schedule_default_zone conf option).\nIn such case and only if that, instance.availability_zone is set in the DB table and corresponds to the user ask. \n***It\u0027s not meant to be the current AZ where the instance is*** but rather what the user asked for.\n\nCorrespondingly, it\u0027s perfectly fine to have instance.az not being modified when the instance is moved from one AZ to another. It\u0027s not a bug, it\u0027s rather saying \"meh, this is what the user asked for\".\n\nSo, honestly, I don\u0027t see a problem with your usecase. Fine with me if instance.az \u003d\u003d \u0027nova\u0027 (this is the default since \u0027nova\u0027 is the default value for default_availability_zone conf opt) doesn\u0027t match with the host AZ, it\u0027s not meant to be.","commit_id":"1756db5823d1551771e00e090c5fee13d69018fb"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"9a1bef4e2b822fa4760fc17f055e32a303976f76","unresolved":false,"context_lines":[{"line_number":4766,"context_line":""},{"line_number":4767,"context_line":"        self.is_safe_to_update_az(context, aggregate.metadata,"},{"line_number":4768,"context_line":"                                  hosts\u003d[host_name], aggregate\u003daggregate,"},{"line_number":4769,"context_line":"                                  action_name\u003dAGGREGATE_ACTION_DELETE)"},{"line_number":4770,"context_line":"        compute_utils.notify_about_aggregate_action("},{"line_number":4771,"context_line":"            context\u003dcontext,"},{"line_number":4772,"context_line":"            aggregate\u003daggregate,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f4e5783_6d3b0deb","line":4769,"in_reply_to":"5f4e5783_d63f3bd4","updated":"2017-10-11 15:57:48.000000000","message":"See the case I thought about:\n\n1) Create aggregate + AZ.\n2) Add host to aggregate.\n3) Boot instance in the created AZ (we now have AZ in instances.availability_zone table).\n4) Remove host from aggregate (instances.availability_zone still have the same value).\n\nProbably it\u0027s kind of internal bug that can have effect in the future.","commit_id":"1756db5823d1551771e00e090c5fee13d69018fb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e4188af1e2110df699e410c7f2d8f9b99dc8e138","unresolved":false,"context_lines":[{"line_number":5309,"context_line":"            aggregate.save()"},{"line_number":5310,"context_line":"        self.is_safe_to_update_az(context, values, aggregate\u003daggregate,"},{"line_number":5311,"context_line":"                                  action_name\u003dAGGREGATE_ACTION_UPDATE,"},{"line_number":5312,"context_line":"                                  check_no_instances_on_host\u003dTrue)"},{"line_number":5313,"context_line":"        if values:"},{"line_number":5314,"context_line":"            aggregate.update_metadata(values)"},{"line_number":5315,"context_line":"            aggregate.updated_at \u003d timeutils.utcnow()"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_b73ffab3","line":5312,"range":{"start_line":5312,"start_character":53,"end_line":5312,"end_character":60},"updated":"2019-02-06 20:24:32.000000000","message":"check_no_instances_in_az seems like a better name - since the AZ is made up of multiple hosts.","commit_id":"b3454959b22edc16c6a932bfae872fa2522df07a"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"da7fb1c90846cadcbfd8590c09289b28f5cabf5e","unresolved":false,"context_lines":[{"line_number":5309,"context_line":"            aggregate.save()"},{"line_number":5310,"context_line":"        self.is_safe_to_update_az(context, values, aggregate\u003daggregate,"},{"line_number":5311,"context_line":"                                  action_name\u003dAGGREGATE_ACTION_UPDATE,"},{"line_number":5312,"context_line":"                                  check_no_instances_on_host\u003dTrue)"},{"line_number":5313,"context_line":"        if values:"},{"line_number":5314,"context_line":"            aggregate.update_metadata(values)"},{"line_number":5315,"context_line":"            aggregate.updated_at \u003d timeutils.utcnow()"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_c2e3bda3","line":5312,"range":{"start_line":5312,"start_character":53,"end_line":5312,"end_character":60},"in_reply_to":"9fdfeff1_b73ffab3","updated":"2019-02-08 11:36:19.000000000","message":"Done","commit_id":"b3454959b22edc16c6a932bfae872fa2522df07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e4188af1e2110df699e410c7f2d8f9b99dc8e138","unresolved":false,"context_lines":[{"line_number":5405,"context_line":"                        objects.InstanceList.get_count_by_hosts,"},{"line_number":5406,"context_line":"                        _hosts))"},{"line_number":5407,"context_line":"                if any(cnt for cnt in instance_count_by_cell.values()):"},{"line_number":5408,"context_line":"                    msg \u003d _(\"One or more host has instances\")"},{"line_number":5409,"context_line":"                    self._raise_invalid_aggregate_exc("},{"line_number":5410,"context_line":"                        action_name, aggregate.id, msg)"},{"line_number":5411,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_57880e70","line":5408,"range":{"start_line":5408,"start_character":26,"end_line":5408,"end_character":61},"updated":"2019-02-06 20:24:32.000000000","message":"nit: \"One or more hosts contain instances in this zone.\"","commit_id":"b3454959b22edc16c6a932bfae872fa2522df07a"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"da7fb1c90846cadcbfd8590c09289b28f5cabf5e","unresolved":false,"context_lines":[{"line_number":5405,"context_line":"                        objects.InstanceList.get_count_by_hosts,"},{"line_number":5406,"context_line":"                        _hosts))"},{"line_number":5407,"context_line":"                if any(cnt for cnt in instance_count_by_cell.values()):"},{"line_number":5408,"context_line":"                    msg \u003d _(\"One or more host has instances\")"},{"line_number":5409,"context_line":"                    self._raise_invalid_aggregate_exc("},{"line_number":5410,"context_line":"                        action_name, aggregate.id, msg)"},{"line_number":5411,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_a2f2396e","line":5408,"range":{"start_line":5408,"start_character":26,"end_line":5408,"end_character":61},"in_reply_to":"9fdfeff1_57880e70","updated":"2019-02-08 11:36:19.000000000","message":"Done","commit_id":"b3454959b22edc16c6a932bfae872fa2522df07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b3bdd4f83b01c388afd1cd332654880a1575dcd5","unresolved":false,"context_lines":[{"line_number":5369,"context_line":"    def is_safe_to_update_az(self, context, metadata, aggregate,"},{"line_number":5370,"context_line":"                             hosts\u003dNone,"},{"line_number":5371,"context_line":"                             action_name\u003dAGGREGATE_ACTION_ADD,"},{"line_number":5372,"context_line":"                             check_no_instances_in_az\u003dFalse):"},{"line_number":5373,"context_line":"        \"\"\"Determine if updates alter an aggregate\u0027s availability zone."},{"line_number":5374,"context_line":""},{"line_number":5375,"context_line":"            :param context: local context"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_06716ca8","line":5372,"range":{"start_line":5372,"start_character":29,"end_line":5372,"end_character":53},"updated":"2019-02-14 14:36:40.000000000","message":"Sorry for missing this before but it would be nice to document this in the docstring as well.","commit_id":"558d93d8cd9c574d093b5fb45ac746df796df03e"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"64a34805989dfb3eb60e76ffa10e02f2422116e9","unresolved":false,"context_lines":[{"line_number":5369,"context_line":"    def is_safe_to_update_az(self, context, metadata, aggregate,"},{"line_number":5370,"context_line":"                             hosts\u003dNone,"},{"line_number":5371,"context_line":"                             action_name\u003dAGGREGATE_ACTION_ADD,"},{"line_number":5372,"context_line":"                             check_no_instances_in_az\u003dFalse):"},{"line_number":5373,"context_line":"        \"\"\"Determine if updates alter an aggregate\u0027s availability zone."},{"line_number":5374,"context_line":""},{"line_number":5375,"context_line":"            :param context: local context"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_0833a415","line":5372,"range":{"start_line":5372,"start_character":29,"end_line":5372,"end_character":53},"in_reply_to":"9fdfeff1_06716ca8","updated":"2019-02-15 13:31:35.000000000","message":"Done","commit_id":"558d93d8cd9c574d093b5fb45ac746df796df03e"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"fe5df94168439a74b50412e88b5b24841e65b786","unresolved":false,"context_lines":[{"line_number":5402,"context_line":"                                                  msg)"},{"line_number":5403,"context_line":"            if check_no_instances_in_az:"},{"line_number":5404,"context_line":"                instance_count_by_cell \u003d ("},{"line_number":5405,"context_line":"                    nova_context.scatter_gather_skip_cell0("},{"line_number":5406,"context_line":"                        context,"},{"line_number":5407,"context_line":"                        objects.InstanceList.get_count_by_hosts,"},{"line_number":5408,"context_line":"                        _hosts))"}],"source_content_type":"text/x-python","patch_set":10,"id":"9fdfeff1_677a7ff1","line":5405,"updated":"2019-02-18 11:34:40.000000000","message":"++","commit_id":"3cf0a9738a19d2b74c7d78459d20866b4460895d"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"fe5df94168439a74b50412e88b5b24841e65b786","unresolved":false,"context_lines":[{"line_number":5409,"context_line":"                if any(cnt for cnt in instance_count_by_cell.values()):"},{"line_number":5410,"context_line":"                    msg \u003d _(\"One or more hosts contain instances in this zone\")"},{"line_number":5411,"context_line":"                    self._raise_invalid_aggregate_exc("},{"line_number":5412,"context_line":"                        action_name, aggregate.id, msg)"},{"line_number":5413,"context_line":""},{"line_number":5414,"context_line":"    def _raise_invalid_aggregate_exc(self, action_name, aggregate_id, reason):"},{"line_number":5415,"context_line":"        if action_name \u003d\u003d AGGREGATE_ACTION_ADD:"}],"source_content_type":"text/x-python","patch_set":10,"id":"9fdfeff1_672cbf01","line":5412,"updated":"2019-02-18 11:34:40.000000000","message":"all good given the API policy https://docs.openstack.org/nova/latest/contributor/microversions.html#when-do-i-need-a-new-microversion\n\n\"We silently failed to do what was asked\" \u003e NOTAFEATURE.","commit_id":"3cf0a9738a19d2b74c7d78459d20866b4460895d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cdf963e4a3165cc41d4d134fc118774c64d62a2c","unresolved":false,"context_lines":[{"line_number":5400,"context_line":"                        \"%s\") % conflicting_azs"},{"line_number":5401,"context_line":"                self._raise_invalid_aggregate_exc(action_name, aggregate.id,"},{"line_number":5402,"context_line":"                                                  msg)"},{"line_number":5403,"context_line":"            if check_no_instances_in_az:"},{"line_number":5404,"context_line":"                instance_count_by_cell \u003d ("},{"line_number":5405,"context_line":"                    nova_context.scatter_gather_skip_cell0("},{"line_number":5406,"context_line":"                        context,"}],"source_content_type":"text/x-python","patch_set":11,"id":"9fdfeff1_c6a9b1dd","line":5403,"updated":"2019-02-20 18:02:53.000000000","message":"I think the problem in Tempest is that this fails anytime the AZ is passed but doesn\u0027t handle the case that the AZ is passed but doesn\u0027t change. I had to fix tempest so that the POST set_metadata action would not drop the AZ when there were instances in it, but it\u0027s still failing on the PUT because even though the AZ isn\u0027t changing, this code doesn\u0027t detect that.","commit_id":"bb07f084f1f3356991bbbb1c59150f4e96139fbf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6f434916b2506b038c516f743b473b8abc6a2d1d","unresolved":false,"context_lines":[{"line_number":5382,"context_line":"                there is no instances on any hosts of the aggregate"},{"line_number":5383,"context_line":""},{"line_number":5384,"context_line":"        \"\"\""},{"line_number":5385,"context_line":"        if \u0027availability_zone\u0027 in metadata:"},{"line_number":5386,"context_line":"            if not metadata[\u0027availability_zone\u0027]:"},{"line_number":5387,"context_line":"                msg \u003d _(\"Aggregate %s does not support empty named \""},{"line_number":5388,"context_line":"                        \"availability zone\") % aggregate.name"}],"source_content_type":"text/x-python","patch_set":12,"id":"9fdfeff1_32fe8a05","line":5385,"updated":"2019-02-22 15:14:30.000000000","message":"The tempest test is doing the POST set_metadata action and was not passing the availability_zone, which is effectively dropping the AZ from the aggregate, correct?\n\nThe original tempest failure was the PUT because tempest passes the AZ in that case:\n\nhttp://logs.openstack.org/06/509206/10/gate/nova-next/eeab08e/job-output.txt.gz#_2019-02-19_18_20_12_797926\n\nhttps://review.openstack.org/#/c/638028/2/tempest/scenario/test_aggregates_basic_ops.py@119\n\nBut because of this condition, if the caller does the POST set_metadata and does not include the \u0027availability_zone\u0027, don\u0027t we need an additional check if check_no_instances_in_az is True and \u0027availability_zone\u0027 is not in metadata but the aggregate has an AZ so we don\u0027t drop the AZ name while it has instances in it?","commit_id":"db0a7fad87ac828b48dabead0ee4a65ab296ed16"}],"nova/objects/instance.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e4188af1e2110df699e410c7f2d8f9b99dc8e138","unresolved":false,"context_lines":[{"line_number":1574,"context_line":"    @staticmethod"},{"line_number":1575,"context_line":"    @db_api.pick_context_manager_reader"},{"line_number":1576,"context_line":"    def _get_count_by_hosts(context, hosts):"},{"line_number":1577,"context_line":"        not_soft_deleted \u003d or_("},{"line_number":1578,"context_line":"            models.Instance.vm_state !\u003d vm_states.SOFT_DELETED,"},{"line_number":1579,"context_line":"            models.Instance.vm_state \u003d\u003d null())"},{"line_number":1580,"context_line":"        return context.session.query(models.Instance).\\"},{"line_number":1581,"context_line":"            filter_by(deleted\u003d0).\\"},{"line_number":1582,"context_line":"            filter(not_soft_deleted).\\"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_175e06e6","line":1579,"range":{"start_line":1577,"start_character":8,"end_line":1579,"end_character":47},"updated":"2019-02-06 20:24:32.000000000","message":"I see this is copied from above, but I\u0027m not totally sure it makes sense here since technically I can soft delete an instance and before the reclaim interval reaps it in the compute service, it\u0027s technically still available on that host and I can restore it:\n\nhttps://developer.openstack.org/api-ref/compute/?expanded\u003drestore-soft-deleted-instance-restore-action-detail#restore-soft-deleted-instance-restore-action\n\nAlso there is no test for this filtering.","commit_id":"b3454959b22edc16c6a932bfae872fa2522df07a"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"da7fb1c90846cadcbfd8590c09289b28f5cabf5e","unresolved":false,"context_lines":[{"line_number":1574,"context_line":"    @staticmethod"},{"line_number":1575,"context_line":"    @db_api.pick_context_manager_reader"},{"line_number":1576,"context_line":"    def _get_count_by_hosts(context, hosts):"},{"line_number":1577,"context_line":"        not_soft_deleted \u003d or_("},{"line_number":1578,"context_line":"            models.Instance.vm_state !\u003d vm_states.SOFT_DELETED,"},{"line_number":1579,"context_line":"            models.Instance.vm_state \u003d\u003d null())"},{"line_number":1580,"context_line":"        return context.session.query(models.Instance).\\"},{"line_number":1581,"context_line":"            filter_by(deleted\u003d0).\\"},{"line_number":1582,"context_line":"            filter(not_soft_deleted).\\"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_02030544","line":1579,"range":{"start_line":1577,"start_character":8,"end_line":1579,"end_character":47},"in_reply_to":"9fdfeff1_175e06e6","updated":"2019-02-08 11:36:19.000000000","message":"Removed soft delete filtering.","commit_id":"b3454959b22edc16c6a932bfae872fa2522df07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e4188af1e2110df699e410c7f2d8f9b99dc8e138","unresolved":false,"context_lines":[{"line_number":1583,"context_line":"            filter(models.Instance.host.in_(hosts)).count()"},{"line_number":1584,"context_line":""},{"line_number":1585,"context_line":"    @classmethod"},{"line_number":1586,"context_line":"    def get_count_by_hosts(cls, context, hosts):"},{"line_number":1587,"context_line":"        return cls._get_count_by_hosts(context, hosts)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_d7c15e82","line":1586,"updated":"2019-02-06 20:24:32.000000000","message":"Cool, I can re-use this here:\n\nhttps://github.com/openstack/nova/blob/b01da49dfc38057a751cb59f4a7a99dd7f20b6ff/nova/api/openstack/compute/services.py#L228","commit_id":"b3454959b22edc16c6a932bfae872fa2522df07a"},{"author":{"_account_id":26286,"name":"huanhongda","email":"hongda.xun@easystack.cn","username":"huanhongda"},"change_message_id":"d3c298009c8df0f2a80e6d4e6c654162c54bee71","unresolved":false,"context_lines":[{"line_number":1319,"context_line":"    # Version 2.2: Pagination for get_active_by_window_joined()"},{"line_number":1320,"context_line":"    # Version 2.3: Add get_count_by_vm_state()"},{"line_number":1321,"context_line":"    # Version 2.4: Add get_counts()"},{"line_number":1322,"context_line":"    VERSION \u003d \u00272.4\u0027"},{"line_number":1323,"context_line":""},{"line_number":1324,"context_line":"    fields \u003d {"},{"line_number":1325,"context_line":"        \u0027objects\u0027: fields.ListOfObjectsField(\u0027Instance\u0027),"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_cc99396d","line":1322,"range":{"start_line":1322,"start_character":4,"end_line":1322,"end_character":19},"updated":"2019-02-15 01:49:20.000000000","message":"Should you change the version as you added a new method ?","commit_id":"558d93d8cd9c574d093b5fb45ac746df796df03e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"532265272bc9e864151ed2fd6ca150f52181e1c7","unresolved":false,"context_lines":[{"line_number":1319,"context_line":"    # Version 2.2: Pagination for get_active_by_window_joined()"},{"line_number":1320,"context_line":"    # Version 2.3: Add get_count_by_vm_state()"},{"line_number":1321,"context_line":"    # Version 2.4: Add get_counts()"},{"line_number":1322,"context_line":"    VERSION \u003d \u00272.4\u0027"},{"line_number":1323,"context_line":""},{"line_number":1324,"context_line":"    fields \u003d {"},{"line_number":1325,"context_line":"        \u0027objects\u0027: fields.ListOfObjectsField(\u0027Instance\u0027),"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_02e4d83a","line":1322,"range":{"start_line":1322,"start_character":4,"end_line":1322,"end_character":19},"in_reply_to":"9fdfeff1_2b522214","updated":"2019-02-15 20:37:51.000000000","message":"nova.tests.unit.objects.test_objects would have failed if a version change was required (as Andrey says, it\u0027s not a remotable method).","commit_id":"558d93d8cd9c574d093b5fb45ac746df796df03e"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"51677a9ab05161a47cffa2b6105550595f05b1c0","unresolved":false,"context_lines":[{"line_number":1319,"context_line":"    # Version 2.2: Pagination for get_active_by_window_joined()"},{"line_number":1320,"context_line":"    # Version 2.3: Add get_count_by_vm_state()"},{"line_number":1321,"context_line":"    # Version 2.4: Add get_counts()"},{"line_number":1322,"context_line":"    VERSION \u003d \u00272.4\u0027"},{"line_number":1323,"context_line":""},{"line_number":1324,"context_line":"    fields \u003d {"},{"line_number":1325,"context_line":"        \u0027objects\u0027: fields.ListOfObjectsField(\u0027Instance\u0027),"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_2b522214","line":1322,"range":{"start_line":1322,"start_character":4,"end_line":1322,"end_character":19},"in_reply_to":"9fdfeff1_c3cca4bc","updated":"2019-02-15 13:34:26.000000000","message":"In this case, it\u0027s not necessary.\nThe method is not remotable and used only within nova-api.","commit_id":"558d93d8cd9c574d093b5fb45ac746df796df03e"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"29af4463c9cf77a8781bf080ab08a9eeaf462f44","unresolved":false,"context_lines":[{"line_number":1319,"context_line":"    # Version 2.2: Pagination for get_active_by_window_joined()"},{"line_number":1320,"context_line":"    # Version 2.3: Add get_count_by_vm_state()"},{"line_number":1321,"context_line":"    # Version 2.4: Add get_counts()"},{"line_number":1322,"context_line":"    VERSION \u003d \u00272.4\u0027"},{"line_number":1323,"context_line":""},{"line_number":1324,"context_line":"    fields \u003d {"},{"line_number":1325,"context_line":"        \u0027objects\u0027: fields.ListOfObjectsField(\u0027Instance\u0027),"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_c3cca4bc","line":1322,"range":{"start_line":1322,"start_character":4,"end_line":1322,"end_character":19},"in_reply_to":"9fdfeff1_cc99396d","updated":"2019-02-15 08:41:55.000000000","message":"Hmm, seems valid comment","commit_id":"558d93d8cd9c574d093b5fb45ac746df796df03e"}],"nova/tests/functional/test_aggregates.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b3bdd4f83b01c388afd1cd332654880a1575dcd5","unresolved":false,"context_lines":[{"line_number":212,"context_line":""},{"line_number":213,"context_line":"class AggregateUpdateTest(AggregateRequestFiltersTest):"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    def test_set_az_for_aggreate_no_instances(self):"},{"line_number":216,"context_line":"        self._set_az_aggregate(\u0027only-host1\u0027, \u0027fake-az\u0027)"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    def test_fail_set_az(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_4689b472","line":215,"range":{"start_line":215,"start_character":8,"end_line":215,"end_character":45},"updated":"2019-02-14 14:36:40.000000000","message":"Docstring or comment on the test would be nice - this is showing that you can change the az name of an aggregate when it does not contain any servers.","commit_id":"558d93d8cd9c574d093b5fb45ac746df796df03e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b3bdd4f83b01c388afd1cd332654880a1575dcd5","unresolved":false,"context_lines":[{"line_number":215,"context_line":"    def test_set_az_for_aggreate_no_instances(self):"},{"line_number":216,"context_line":"        self._set_az_aggregate(\u0027only-host1\u0027, \u0027fake-az\u0027)"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    def test_fail_set_az(self):"},{"line_number":219,"context_line":"        az \u003d \u0027fake-az\u0027"},{"line_number":220,"context_line":"        self._set_az_aggregate(\u0027only-host1\u0027, az)"},{"line_number":221,"context_line":"        self._boot_server(az\u003daz)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_a69980c4","line":218,"range":{"start_line":218,"start_character":8,"end_line":218,"end_character":24},"updated":"2019-02-14 14:36:40.000000000","message":"same comment about documenting the test","commit_id":"558d93d8cd9c574d093b5fb45ac746df796df03e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b3bdd4f83b01c388afd1cd332654880a1575dcd5","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        self.assertRaisesRegex("},{"line_number":223,"context_line":"            client.OpenStackApiException,"},{"line_number":224,"context_line":"            \u0027One or more hosts contain instances in this zone.\u0027,"},{"line_number":225,"context_line":"            self._set_az_aggregate, \u0027only-host1\u0027, \u0027new\u0027 + az)"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"class AggregateMetadataUpdateTest(AggregateUpdateTest):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_e63ea889","line":225,"updated":"2019-02-14 14:36:40.000000000","message":"We could further expand this test to show that if we soft delete the instance and try to change the az it still fails, and then if we delete the instance and change the az it works.","commit_id":"558d93d8cd9c574d093b5fb45ac746df796df03e"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"64a34805989dfb3eb60e76ffa10e02f2422116e9","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        self.assertRaisesRegex("},{"line_number":223,"context_line":"            client.OpenStackApiException,"},{"line_number":224,"context_line":"            \u0027One or more hosts contain instances in this zone.\u0027,"},{"line_number":225,"context_line":"            self._set_az_aggregate, \u0027only-host1\u0027, \u0027new\u0027 + az)"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"class AggregateMetadataUpdateTest(AggregateUpdateTest):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_482c4cab","line":225,"in_reply_to":"9fdfeff1_e63ea889","updated":"2019-02-15 13:31:35.000000000","message":"Yes, updated the test.","commit_id":"558d93d8cd9c574d093b5fb45ac746df796df03e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b3bdd4f83b01c388afd1cd332654880a1575dcd5","unresolved":false,"context_lines":[{"line_number":239,"context_line":"                \u0027availability_zone\u0027: az,"},{"line_number":240,"context_line":"            },"},{"line_number":241,"context_line":"        }"},{"line_number":242,"context_line":"        self.admin_api.put_aggregate(agg[\u0027id\u0027], body)"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"class TenantAggregateFilterTest(AggregateRequestFiltersTest):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_a6c74096","line":242,"range":{"start_line":242,"start_character":23,"end_line":242,"end_character":36},"updated":"2019-02-14 14:36:40.000000000","message":"OK this is the difference from _set_az_aggregate in AggregateRequestFiltersTest which uses the POST to overwrite the metadata dict, this just updates the metadata dict. Sneaky. :)","commit_id":"558d93d8cd9c574d093b5fb45ac746df796df03e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"95c10fab25b5ffec278cae44fb48015ecd52ea93","unresolved":false,"context_lines":[{"line_number":224,"context_line":"    def test_fail_set_az(self):"},{"line_number":225,"context_line":"        \"\"\"Check it is not possible to update a non-empty aggregate."},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        Check you cannot change the AZ name an aggregate when it"},{"line_number":228,"context_line":"        contains any servers."},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_62704473","line":227,"range":{"start_line":227,"start_character":44,"end_line":227,"end_character":46},"updated":"2019-02-15 20:50:07.000000000","message":"nit: of an","commit_id":"9efc55d86eeef789b794747fe40f8e603161f0dd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e382c871b7203300b56a12b98e477a9a2d65ddb4","unresolved":false,"context_lines":[{"line_number":224,"context_line":"    def test_fail_set_az(self):"},{"line_number":225,"context_line":"        \"\"\"Check it is not possible to update a non-empty aggregate."},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        Check you cannot change the AZ name an aggregate when it"},{"line_number":228,"context_line":"        contains any servers."},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_8280c8c0","line":227,"range":{"start_line":227,"start_character":44,"end_line":227,"end_character":46},"in_reply_to":"9fdfeff1_62704473","updated":"2019-02-15 21:02:14.000000000","message":"Done","commit_id":"9efc55d86eeef789b794747fe40f8e603161f0dd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"95c10fab25b5ffec278cae44fb48015ecd52ea93","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        contains any servers."},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        \"\"\""},{"line_number":231,"context_line":"        self.flags(reclaim_instance_interval\u003d300)"},{"line_number":232,"context_line":"        az \u003d \u0027fake-az\u0027"},{"line_number":233,"context_line":"        self._set_az_aggregate(\u0027only-host1\u0027, az)"},{"line_number":234,"context_line":"        server \u003d self._boot_server(az\u003daz)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_820c48ec","line":231,"range":{"start_line":231,"start_character":8,"end_line":231,"end_character":49},"updated":"2019-02-15 20:50:07.000000000","message":"nit: comment about this being for the SOFT_DELETE case would be good - and moving it closer to the actual SOFT_DELETE scenario.","commit_id":"9efc55d86eeef789b794747fe40f8e603161f0dd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e382c871b7203300b56a12b98e477a9a2d65ddb4","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        contains any servers."},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        \"\"\""},{"line_number":231,"context_line":"        self.flags(reclaim_instance_interval\u003d300)"},{"line_number":232,"context_line":"        az \u003d \u0027fake-az\u0027"},{"line_number":233,"context_line":"        self._set_az_aggregate(\u0027only-host1\u0027, az)"},{"line_number":234,"context_line":"        server \u003d self._boot_server(az\u003daz)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_a2838cca","line":231,"range":{"start_line":231,"start_character":8,"end_line":231,"end_character":49},"in_reply_to":"9fdfeff1_820c48ec","updated":"2019-02-15 21:02:14.000000000","message":"Done","commit_id":"9efc55d86eeef789b794747fe40f8e603161f0dd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"95c10fab25b5ffec278cae44fb48015ecd52ea93","unresolved":false,"context_lines":[{"line_number":237,"context_line":"            \u0027One or more hosts contain instances in this zone.\u0027,"},{"line_number":238,"context_line":"            self._set_az_aggregate, \u0027only-host1\u0027, \u0027new\u0027 + az)"},{"line_number":239,"context_line":"        self.api.delete_server(server[\u0027id\u0027])"},{"line_number":240,"context_line":"        self._wait_for_state_change(server, \u0027ACTIVE\u0027)"},{"line_number":241,"context_line":"        self.assertRaisesRegex("},{"line_number":242,"context_line":"            client.OpenStackApiException,"},{"line_number":243,"context_line":"            \u0027One or more hosts contain instances in this zone.\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_22fb1cbe","line":240,"range":{"start_line":240,"start_character":8,"end_line":240,"end_character":53},"updated":"2019-02-15 20:50:07.000000000","message":"If we just deleted the server, why does it go to ACTIVE? Shouldn\u0027t we be waiting for SOFT_DELETED status?\n\n(later)\n\nOh right this isn\u0027t waiting for the status to be ACTIVE, it\u0027s waiting for the status to change *from* ACTIVE. So confusing...\n\nUsing from_status\u003d\u0027ACTIVE\u0027 would be more clear or asserting the status is \u0027SOFT_DELETED\u0027 would avoid confusion.","commit_id":"9efc55d86eeef789b794747fe40f8e603161f0dd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e382c871b7203300b56a12b98e477a9a2d65ddb4","unresolved":false,"context_lines":[{"line_number":237,"context_line":"            \u0027One or more hosts contain instances in this zone.\u0027,"},{"line_number":238,"context_line":"            self._set_az_aggregate, \u0027only-host1\u0027, \u0027new\u0027 + az)"},{"line_number":239,"context_line":"        self.api.delete_server(server[\u0027id\u0027])"},{"line_number":240,"context_line":"        self._wait_for_state_change(server, \u0027ACTIVE\u0027)"},{"line_number":241,"context_line":"        self.assertRaisesRegex("},{"line_number":242,"context_line":"            client.OpenStackApiException,"},{"line_number":243,"context_line":"            \u0027One or more hosts contain instances in this zone.\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_426e602f","line":240,"range":{"start_line":240,"start_character":8,"end_line":240,"end_character":53},"in_reply_to":"9fdfeff1_22fb1cbe","updated":"2019-02-15 21:02:14.000000000","message":"Done","commit_id":"9efc55d86eeef789b794747fe40f8e603161f0dd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"95c10fab25b5ffec278cae44fb48015ecd52ea93","unresolved":false,"context_lines":[{"line_number":245,"context_line":"        self.api.api_post("},{"line_number":246,"context_line":"            \u0027/servers/%s/action\u0027 % server[\u0027id\u0027], {\u0027forceDelete\u0027: None})"},{"line_number":247,"context_line":"        self._wait_for_state_change(server, \u0027SOFT_DELETED\u0027)"},{"line_number":248,"context_line":"        self.computes[\u0027host1\u0027]._run_pending_deletes(self.context)"},{"line_number":249,"context_line":"        self._set_az_aggregate(\u0027only-host1\u0027, \u0027new\u0027 + az)"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_62912452","line":248,"range":{"start_line":248,"start_character":31,"end_line":248,"end_character":51},"updated":"2019-02-15 20:50:07.000000000","message":"This is the wrong method, I think you\u0027re thinking of _reclaim_queued_deletes which uses the reclaim_instance_interval option but clearly you don\u0027t need it since the server is already gone via the forceDelete call. This test must be using the CastAsCall fixture otherwise you\u0027d be hitting a race potentially if the API responds before the compute service deletes the instance.","commit_id":"9efc55d86eeef789b794747fe40f8e603161f0dd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f7ab911ebc5195fb518fbf34c52baf073a2e9f61","unresolved":false,"context_lines":[{"line_number":245,"context_line":"        self.api.api_post("},{"line_number":246,"context_line":"            \u0027/servers/%s/action\u0027 % server[\u0027id\u0027], {\u0027forceDelete\u0027: None})"},{"line_number":247,"context_line":"        self._wait_for_state_change(server, \u0027SOFT_DELETED\u0027)"},{"line_number":248,"context_line":"        self.computes[\u0027host1\u0027]._run_pending_deletes(self.context)"},{"line_number":249,"context_line":"        self._set_az_aggregate(\u0027only-host1\u0027, \u0027new\u0027 + az)"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_e293d44d","line":248,"range":{"start_line":248,"start_character":31,"end_line":248,"end_character":51},"in_reply_to":"9fdfeff1_62912452","updated":"2019-02-15 20:52:34.000000000","message":"This test isn\u0027t using CastAsCall so I think you\u0027re getting lucky.","commit_id":"9efc55d86eeef789b794747fe40f8e603161f0dd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e382c871b7203300b56a12b98e477a9a2d65ddb4","unresolved":false,"context_lines":[{"line_number":245,"context_line":"        self.api.api_post("},{"line_number":246,"context_line":"            \u0027/servers/%s/action\u0027 % server[\u0027id\u0027], {\u0027forceDelete\u0027: None})"},{"line_number":247,"context_line":"        self._wait_for_state_change(server, \u0027SOFT_DELETED\u0027)"},{"line_number":248,"context_line":"        self.computes[\u0027host1\u0027]._run_pending_deletes(self.context)"},{"line_number":249,"context_line":"        self._set_az_aggregate(\u0027only-host1\u0027, \u0027new\u0027 + az)"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_0274d8fc","line":248,"range":{"start_line":248,"start_character":31,"end_line":248,"end_character":51},"in_reply_to":"9fdfeff1_e293d44d","updated":"2019-02-15 21:02:14.000000000","message":"I\u0027ve changed this to use self._wait_until_deleted which is safer since technically _wait_for_state_change could blow up with a 404.","commit_id":"9efc55d86eeef789b794747fe40f8e603161f0dd"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"fe5df94168439a74b50412e88b5b24841e65b786","unresolved":false,"context_lines":[{"line_number":252,"context_line":"        self._set_az_aggregate(\u0027only-host1\u0027, \u0027new\u0027 + az)"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"# NOTE: this test case has the same test methods as AggregatePostTest"},{"line_number":256,"context_line":"# but for the AZ update it uses PUT /os-aggregates/{aggregate_id} method"},{"line_number":257,"context_line":"class AggregatePutTest(AggregatePostTest):"},{"line_number":258,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"9fdfeff1_4783bbcb","line":255,"range":{"start_line":255,"start_character":2,"end_line":255,"end_character":6},"updated":"2019-02-18 11:34:40.000000000","message":"In general, the pattern is NOTE(owner) but meh.","commit_id":"3cf0a9738a19d2b74c7d78459d20866b4460895d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"506de484e600dd1ecc4c3a2b3f621d2da268f4d8","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        self._wait_until_deleted(server)"},{"line_number":251,"context_line":"        # Now we can rename the AZ since the server is gone."},{"line_number":252,"context_line":"        self._set_az_aggregate(\u0027only-host1\u0027, \u0027new\u0027 + az)"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"# NOTE: this test case has the same test methods as AggregatePostTest"},{"line_number":256,"context_line":"# but for the AZ update it uses PUT /os-aggregates/{aggregate_id} method"}],"source_content_type":"text/x-python","patch_set":11,"id":"9fdfeff1_c69211a0","line":253,"updated":"2019-02-20 18:04:19.000000000","message":"We probably need another test where we create an az with an instance in it and we PUT (update) the name of the aggregate but don\u0027t change the AZ. That\u0027s what Tempest is failing on I think.","commit_id":"bb07f084f1f3356991bbbb1c59150f4e96139fbf"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"9101e1c299758209f7709c4b62123d8607a2891c","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        self._wait_until_deleted(server)"},{"line_number":251,"context_line":"        # Now we can rename the AZ since the server is gone."},{"line_number":252,"context_line":"        self._set_az_aggregate(\u0027only-host1\u0027, \u0027new\u0027 + az)"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"# NOTE: this test case has the same test methods as AggregatePostTest"},{"line_number":256,"context_line":"# but for the AZ update it uses PUT /os-aggregates/{aggregate_id} method"}],"source_content_type":"text/x-python","patch_set":11,"id":"9fdfeff1_232de645","line":253,"in_reply_to":"9fdfeff1_c69211a0","updated":"2019-02-22 11:07:32.000000000","message":"fixed behavior and added a test","commit_id":"bb07f084f1f3356991bbbb1c59150f4e96139fbf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c2e9969077f08f1b13df3ec1eb726d815cf2e909","unresolved":false,"context_lines":[{"line_number":177,"context_line":"        srv \u003d self.admin_api.get_server(server[\u0027id\u0027])"},{"line_number":178,"context_line":"        return srv[\u0027OS-EXT-SRV-ATTR:host\u0027]"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    def _set_az_aggregate(self, agg, az, skip_az\u003dFalse):"},{"line_number":181,"context_line":"        \"\"\"Set the availability_zone of an aggregate"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        :param agg: Name of the nova aggregate"}],"source_content_type":"text/x-python","patch_set":13,"id":"9fdfeff1_e27dfd1b","line":180,"range":{"start_line":180,"start_character":41,"end_line":180,"end_character":48},"updated":"2019-03-01 16:53:52.000000000","message":"This is kind of odd to use here when the whole point of this method is to set the az on the aggregate. We should probably just make our own call where we need this.","commit_id":"960c35b1511b6c69e3e8d6085db194726d9ecb4f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c2e9969077f08f1b13df3ec1eb726d815cf2e909","unresolved":false,"context_lines":[{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    def test_cannot_delete_az(self):"},{"line_number":265,"context_line":"        az \u003d \u0027fake-az\u0027"},{"line_number":266,"context_line":"        self._set_az_aggregate(\u0027only-host1\u0027, az)"},{"line_number":267,"context_line":"        self._set_az_aggregate(\u0027only-host1\u0027, az, skip_az\u003dTrue)"},{"line_number":268,"context_line":"        agg \u003d objects.Aggregate.get_by_id("},{"line_number":269,"context_line":"            self.context, self.aggregates[\u0027only-host1\u0027][\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":13,"id":"9fdfeff1_a273754d","line":266,"updated":"2019-03-01 16:53:52.000000000","message":"So here you set the az on the aggregate.","commit_id":"960c35b1511b6c69e3e8d6085db194726d9ecb4f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c2e9969077f08f1b13df3ec1eb726d815cf2e909","unresolved":false,"context_lines":[{"line_number":264,"context_line":"    def test_cannot_delete_az(self):"},{"line_number":265,"context_line":"        az \u003d \u0027fake-az\u0027"},{"line_number":266,"context_line":"        self._set_az_aggregate(\u0027only-host1\u0027, az)"},{"line_number":267,"context_line":"        self._set_az_aggregate(\u0027only-host1\u0027, az, skip_az\u003dTrue)"},{"line_number":268,"context_line":"        agg \u003d objects.Aggregate.get_by_id("},{"line_number":269,"context_line":"            self.context, self.aggregates[\u0027only-host1\u0027][\u0027id\u0027])"},{"line_number":270,"context_line":"        # request with empty availability_zone key does not change"}],"source_content_type":"text/x-python","patch_set":13,"id":"9fdfeff1_628fcd22","line":267,"updated":"2019-03-01 16:53:52.000000000","message":"Here you set some metadata but the AZ will still be set.","commit_id":"960c35b1511b6c69e3e8d6085db194726d9ecb4f"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"7db8f8437cd141fd8955a81c474f51359c7c13f8","unresolved":false,"context_lines":[{"line_number":261,"context_line":"        # Now we can rename the AZ since the server is gone."},{"line_number":262,"context_line":"        self._set_az_aggregate(\u0027only-host1\u0027, \u0027new\u0027 + az)"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    def test_cannot_delete_az(self):"},{"line_number":265,"context_line":"        az \u003d \u0027fake-az\u0027"},{"line_number":266,"context_line":"        self._set_az_aggregate(\u0027only-host1\u0027, az)"},{"line_number":267,"context_line":"        self._set_az_aggregate(\u0027only-host1\u0027, az, skip_az\u003dTrue)"},{"line_number":268,"context_line":"        agg \u003d objects.Aggregate.get_by_id("},{"line_number":269,"context_line":"            self.context, self.aggregates[\u0027only-host1\u0027][\u0027id\u0027])"},{"line_number":270,"context_line":"        # request with empty availability_zone key does not change"},{"line_number":271,"context_line":"        # aggregate AZ"},{"line_number":272,"context_line":"        self.assertEqual(az, agg.availability_zone)"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"# NOTE: this test case has the same test methods as AggregatePostTest"}],"source_content_type":"text/x-python","patch_set":13,"id":"9fdfeff1_b794838c","line":272,"range":{"start_line":264,"start_character":0,"end_line":272,"end_character":51},"updated":"2019-02-25 18:50:01.000000000","message":"this I\u0027m talking about","commit_id":"960c35b1511b6c69e3e8d6085db194726d9ecb4f"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"65871f3cced3a1aa8c09355d375f84185d3272c1","unresolved":false,"context_lines":[{"line_number":252,"context_line":"        az \u003d \u0027fake-az\u0027"},{"line_number":253,"context_line":"        self._set_az_aggregate(\u0027only-host1\u0027, az)"},{"line_number":254,"context_line":"        server \u003d self._boot_server(az\u003daz)"},{"line_number":255,"context_line":"        self.assertRaisesRegex("},{"line_number":256,"context_line":"            client.OpenStackApiException,"},{"line_number":257,"context_line":"            \u0027One or more hosts contain instances in this zone.\u0027,"},{"line_number":258,"context_line":"            self._set_az_aggregate, \u0027only-host1\u0027, \u0027new\u0027 + az)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"        # Configure for the SOFT_DELETED scenario."},{"line_number":261,"context_line":"        self.flags(reclaim_instance_interval\u003d300)"}],"source_content_type":"text/x-python","patch_set":14,"id":"9fdfeff1_e085d95a","line":258,"range":{"start_line":255,"start_character":0,"end_line":258,"end_character":61},"updated":"2019-03-04 12:50:46.000000000","message":"nit: response code (400) should be asserted.","commit_id":"8e19ef4173906da0b7c761da4de0728a2fd71e24"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a0ff25c4e876241e5f84de4264828d616e37eee9","unresolved":false,"context_lines":[{"line_number":252,"context_line":"        az \u003d \u0027fake-az\u0027"},{"line_number":253,"context_line":"        self._set_az_aggregate(\u0027only-host1\u0027, az)"},{"line_number":254,"context_line":"        server \u003d self._boot_server(az\u003daz)"},{"line_number":255,"context_line":"        self.assertRaisesRegex("},{"line_number":256,"context_line":"            client.OpenStackApiException,"},{"line_number":257,"context_line":"            \u0027One or more hosts contain instances in this zone.\u0027,"},{"line_number":258,"context_line":"            self._set_az_aggregate, \u0027only-host1\u0027, \u0027new\u0027 + az)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"        # Configure for the SOFT_DELETED scenario."},{"line_number":261,"context_line":"        self.flags(reclaim_instance_interval\u003d300)"}],"source_content_type":"text/x-python","patch_set":14,"id":"9fdfeff1_5f8fc0cc","line":258,"range":{"start_line":255,"start_character":0,"end_line":258,"end_character":61},"in_reply_to":"9fdfeff1_e085d95a","updated":"2019-03-05 17:01:31.000000000","message":"This is kinda assumed by the fact that it raised an exception and has the right message (L257) right?","commit_id":"8e19ef4173906da0b7c761da4de0728a2fd71e24"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"65871f3cced3a1aa8c09355d375f84185d3272c1","unresolved":false,"context_lines":[{"line_number":262,"context_line":"        self.api.delete_server(server[\u0027id\u0027])"},{"line_number":263,"context_line":"        server \u003d self._wait_for_state_change(server, from_status\u003d\u0027ACTIVE\u0027)"},{"line_number":264,"context_line":"        self.assertEqual(\u0027SOFT_DELETED\u0027, server[\u0027status\u0027])"},{"line_number":265,"context_line":"        self.assertRaisesRegex("},{"line_number":266,"context_line":"            client.OpenStackApiException,"},{"line_number":267,"context_line":"            \u0027One or more hosts contain instances in this zone.\u0027,"},{"line_number":268,"context_line":"            self._set_az_aggregate, \u0027only-host1\u0027, \u0027new\u0027 + az)"},{"line_number":269,"context_line":"        # Force delete the SOFT_DELETED server."},{"line_number":270,"context_line":"        self.api.api_post("},{"line_number":271,"context_line":"            \u0027/servers/%s/action\u0027 % server[\u0027id\u0027], {\u0027forceDelete\u0027: None})"}],"source_content_type":"text/x-python","patch_set":14,"id":"9fdfeff1_807acd74","line":268,"range":{"start_line":265,"start_character":0,"end_line":268,"end_character":61},"updated":"2019-03-04 12:50:46.000000000","message":"ditto","commit_id":"8e19ef4173906da0b7c761da4de0728a2fd71e24"}],"nova/tests/unit/compute/test_compute.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e4188af1e2110df699e410c7f2d8f9b99dc8e138","unresolved":false,"context_lines":[{"line_number":12292,"context_line":"            self.api.placement_client"},{"line_number":12293,"context_line":"        mock_report_client.assert_called_once_with()"},{"line_number":12294,"context_line":""},{"line_number":12295,"context_line":"    @mock.patch(\u0027nova.objects.InstanceList.get_count_by_hosts\u0027, mock.Mock())"},{"line_number":12296,"context_line":"    def test_update_aggregate_metadata_with_instances_fails(self):"},{"line_number":12297,"context_line":"        aggr \u003d self.api.create_aggregate("},{"line_number":12298,"context_line":"            self.context, \u0027fake_aggregate\u0027, \u0027fake_zone\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_37b78adb","line":12295,"updated":"2019-02-06 20:24:32.000000000","message":"Rather than do unit tests I would much rather see functional tests for this, which should be pretty easy to write in here somewhere:\n\nhttps://github.com/openstack/nova/blob/b01da49dfc38057a751cb59f4a7a99dd7f20b6ff/nova/tests/functional/test_aggregates.py","commit_id":"b3454959b22edc16c6a932bfae872fa2522df07a"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"da7fb1c90846cadcbfd8590c09289b28f5cabf5e","unresolved":false,"context_lines":[{"line_number":12292,"context_line":"            self.api.placement_client"},{"line_number":12293,"context_line":"        mock_report_client.assert_called_once_with()"},{"line_number":12294,"context_line":""},{"line_number":12295,"context_line":"    @mock.patch(\u0027nova.objects.InstanceList.get_count_by_hosts\u0027, mock.Mock())"},{"line_number":12296,"context_line":"    def test_update_aggregate_metadata_with_instances_fails(self):"},{"line_number":12297,"context_line":"        aggr \u003d self.api.create_aggregate("},{"line_number":12298,"context_line":"            self.context, \u0027fake_aggregate\u0027, \u0027fake_zone\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_c2fc1d40","line":12295,"in_reply_to":"9fdfeff1_37b78adb","updated":"2019-02-08 11:36:19.000000000","message":"Done","commit_id":"b3454959b22edc16c6a932bfae872fa2522df07a"}],"releasenotes/notes/bug-1378904-disable-az-rename-b22a558a20b12706.yaml":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e4188af1e2110df699e410c7f2d8f9b99dc8e138","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"other:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    PUT /os-aggregates/{aggregate_id} and"},{"line_number":5,"context_line":"    POST /os-aggregates/{aggregate_id}/action return HTTP 400 for"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"9fdfeff1_17b606db","line":2,"range":{"start_line":2,"start_character":0,"end_line":2,"end_character":5},"updated":"2019-02-06 20:24:32.000000000","message":"Let\u0027s change to the \"fixes\" section.","commit_id":"b3454959b22edc16c6a932bfae872fa2522df07a"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"da7fb1c90846cadcbfd8590c09289b28f5cabf5e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"other:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    PUT /os-aggregates/{aggregate_id} and"},{"line_number":5,"context_line":"    POST /os-aggregates/{aggregate_id}/action return HTTP 400 for"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"9fdfeff1_8294d5e9","line":2,"range":{"start_line":2,"start_character":0,"end_line":2,"end_character":5},"in_reply_to":"9fdfeff1_17b606db","updated":"2019-02-08 11:36:19.000000000","message":"Changed the release note.","commit_id":"b3454959b22edc16c6a932bfae872fa2522df07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e4188af1e2110df699e410c7f2d8f9b99dc8e138","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"other:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    PUT /os-aggregates/{aggregate_id} and"},{"line_number":5,"context_line":"    POST /os-aggregates/{aggregate_id}/action return HTTP 400 for"},{"line_number":6,"context_line":"    availability zone renaming if the hosts of the aggregate have any instances."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"9fdfeff1_d7c71e45","line":4,"range":{"start_line":4,"start_character":4,"end_line":4,"end_character":37},"updated":"2019-02-06 20:24:32.000000000","message":"Encluse in double back-ticks:\n\n``PUT /os-aggregates/{aggregate_id}``","commit_id":"b3454959b22edc16c6a932bfae872fa2522df07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e4188af1e2110df699e410c7f2d8f9b99dc8e138","unresolved":false,"context_lines":[{"line_number":2,"context_line":"other:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    PUT /os-aggregates/{aggregate_id} and"},{"line_number":5,"context_line":"    POST /os-aggregates/{aggregate_id}/action return HTTP 400 for"},{"line_number":6,"context_line":"    availability zone renaming if the hosts of the aggregate have any instances."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"9fdfeff1_77c43241","line":5,"range":{"start_line":5,"start_character":4,"end_line":5,"end_character":46},"updated":"2019-02-06 20:24:32.000000000","message":"same","commit_id":"b3454959b22edc16c6a932bfae872fa2522df07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e4188af1e2110df699e410c7f2d8f9b99dc8e138","unresolved":false,"context_lines":[{"line_number":2,"context_line":"other:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    PUT /os-aggregates/{aggregate_id} and"},{"line_number":5,"context_line":"    POST /os-aggregates/{aggregate_id}/action return HTTP 400 for"},{"line_number":6,"context_line":"    availability zone renaming if the hosts of the aggregate have any instances."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"9fdfeff1_97c19631","line":5,"range":{"start_line":5,"start_character":46,"end_line":5,"end_character":52},"updated":"2019-02-06 20:24:32.000000000","message":"will now return","commit_id":"b3454959b22edc16c6a932bfae872fa2522df07a"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"29af4463c9cf77a8781bf080ab08a9eeaf462f44","unresolved":false,"context_lines":[{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    ``PUT /os-aggregates/{aggregate_id}`` and"},{"line_number":5,"context_line":"    ``POST /os-aggregates/{aggregate_id}/action`` will now return HTTP 400 for"},{"line_number":6,"context_line":"    availability zone renaming if the hosts of the aggregate have any instances."}],"source_content_type":"text/x-yaml","patch_set":7,"id":"9fdfeff1_6375b863","line":5,"range":{"start_line":5,"start_character":6,"end_line":5,"end_character":47},"updated":"2019-02-15 08:41:55.000000000","message":"I think you should be more specific about this action is set_metadata","commit_id":"558d93d8cd9c574d093b5fb45ac746df796df03e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1452e62ee6bc0dbc6cd4ff2bd9f62e0a7a8c37f7","unresolved":false,"context_lines":[{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    ``PUT /os-aggregates/{aggregate_id}`` and"},{"line_number":5,"context_line":"    ``POST /os-aggregates/{aggregate_id}/action`` will now return HTTP 400 for"},{"line_number":6,"context_line":"    availability zone renaming if the hosts of the aggregate have any instances."}],"source_content_type":"text/x-yaml","patch_set":7,"id":"9fdfeff1_02bdb800","line":5,"range":{"start_line":5,"start_character":6,"end_line":5,"end_character":47},"in_reply_to":"9fdfeff1_4b48c65a","updated":"2019-02-15 20:39:10.000000000","message":"Yeah good point since there are 3 different \u0027action\u0027 routes for this API.","commit_id":"558d93d8cd9c574d093b5fb45ac746df796df03e"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"ffe58bca799ac91faa730d258fb14573cabf8e33","unresolved":false,"context_lines":[{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    ``PUT /os-aggregates/{aggregate_id}`` and"},{"line_number":5,"context_line":"    ``POST /os-aggregates/{aggregate_id}/action`` will now return HTTP 400 for"},{"line_number":6,"context_line":"    availability zone renaming if the hosts of the aggregate have any instances."}],"source_content_type":"text/x-yaml","patch_set":7,"id":"9fdfeff1_4b48c65a","line":5,"range":{"start_line":5,"start_character":6,"end_line":5,"end_character":47},"in_reply_to":"9fdfeff1_6375b863","updated":"2019-02-15 13:34:47.000000000","message":"Done","commit_id":"558d93d8cd9c574d093b5fb45ac746df796df03e"}]}
