From 771b9eaa71742b7a158c2e7759a3046ea5a6fc3a Mon Sep 17 00:00:00 2001 From: Matt Riedemann Date: Fri, 31 Aug 2018 18:14:25 -0400 Subject: [PATCH] Null out instance.availability_zone on shelve offload When a user shelve offloads a server, the compute manager nulls out the instance host and node attributes. However the availability_zone attribute is left set on the instance so the API will show the instance as in an AZ when really it's not, because an instance that is not on a host is not in a host aggregate so it can't be in an AZ. Keep in mind that there are two ways an instance can be in an AZ: 1. The user specifically requests to create the server in the AZ. 2. The user does not request an AZ and one is assigned via the selected host during server create (or resize, etc). For the first case, the server will always remain in the user-requested AZ even after shelve/unshelve. But in the second case, unshelving the server can result in the server being spawned on a new host in a different AZ - the scheduler does not restrict the AZ in that second case. This change nulls out the instance.availability_zone just like the host and node fields on shelve offload since it's confusing to show a shelved offloaded server in an AZ that doesn't have a host. Final note: the _nil_out_instance_obj_host_and_node method is also called during server create if the build fails and is aborted or rescheduled to another host, and in the case that unshelve fails. In the case of a server build reschedule, conductor will set the instance.availability_zone appropriately based on the alternate host for the reschedule. In the other failure cases, leaving the instance AZ null is appropriate. Change-Id: I25a4f36027390def83cfe25f4f3b4af9660da502 Closes-Bug: #1790221 --- .../instance-delete-end_not_scheduled.json | 1 + .../instance-delete-start_not_scheduled.json | 1 + doc/notification_samples/instance-shelve_offload-end.json | 1 + nova/compute/manager.py | 3 +++ nova/tests/functional/test_servers.py | 3 ++- 5 files changed, 8 insertions(+), 1 deletion(-) diff --git a/doc/notification_samples/instance-delete-end_not_scheduled.json b/doc/notification_samples/instance-delete-end_not_scheduled.json index 7cd0045e5427..1fd3c6959f82 100644 --- a/doc/notification_samples/instance-delete-end_not_scheduled.json +++ b/doc/notification_samples/instance-delete-end_not_scheduled.json @@ -3,6 +3,7 @@ "payload":{ "$ref":"common_payloads/InstanceActionPayload.json#", "nova_object.data":{ + "availability_zone": null, "block_devices":[], "deleted_at":"2012-10-29T13:42:11Z", "host":null, diff --git a/doc/notification_samples/instance-delete-start_not_scheduled.json b/doc/notification_samples/instance-delete-start_not_scheduled.json index 32be5a3bb4d2..60597f9e851a 100644 --- a/doc/notification_samples/instance-delete-start_not_scheduled.json +++ b/doc/notification_samples/instance-delete-start_not_scheduled.json @@ -3,6 +3,7 @@ "payload":{ "$ref":"common_payloads/InstanceActionPayload.json#", "nova_object.data":{ + "availability_zone": null, "block_devices":[], "host":null, "ip_addresses":[], diff --git a/doc/notification_samples/instance-shelve_offload-end.json b/doc/notification_samples/instance-shelve_offload-end.json index d7a563557cf4..05df5ddd6175 100644 --- a/doc/notification_samples/instance-shelve_offload-end.json +++ b/doc/notification_samples/instance-shelve_offload-end.json @@ -3,6 +3,7 @@ "payload":{ "$ref": "common_payloads/InstanceActionPayload.json#", "nova_object.data":{ + "availability_zone": null, "state": "shelved_offloaded", "power_state": "shutdown", "host": null, diff --git a/nova/compute/manager.py b/nova/compute/manager.py index b0a308c97c94..5ed5734b6431 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -578,6 +578,9 @@ class ComputeManager(manager.Manager): # to the database layer. instance.host = None instance.node = None + # If the instance is not on a host, it's not in an aggregate and + # therefore is not in an availability zone. + instance.availability_zone = None def _set_instance_obj_error_state(self, context, instance, clean_task_state=False): diff --git a/nova/tests/functional/test_servers.py b/nova/tests/functional/test_servers.py index fd055bd5d9b9..6090eda6a3c4 100644 --- a/nova/tests/functional/test_servers.py +++ b/nova/tests/functional/test_servers.py @@ -2755,7 +2755,8 @@ class ServerMovingTests(integrated_helpers.ProviderUsageBaseTestCase): self.api.post_server_action(server['id'], req) self._wait_for_server_parameter( self.api, server, {'status': 'SHELVED_OFFLOADED', - 'OS-EXT-SRV-ATTR:host': None}) + 'OS-EXT-SRV-ATTR:host': None, + 'OS-EXT-AZ:availability_zone': ''}) source_usages = self._get_provider_usages(source_rp_uuid) self.assertEqual({'VCPU': 0, 'MEMORY_MB': 0,