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.

Conflicts:
      doc/notification_samples/instance-delete-end_not_scheduled.json
      doc/notification_samples/instance-delete-start_not_scheduled.json

NOTE(mriedem): The conflict is due to not having change
If0693eab2ed31b5fbfe6cbafa5d67b69c2ed8442 in Rocky.

Change-Id: I25a4f36027390def83cfe25f4f3b4af9660da502
Closes-Bug: #1790221
(cherry picked from commit 771b9eaa71)
This commit is contained in:
Matt Riedemann 2018-08-31 18:14:25 -04:00
parent 24531a3583
commit b3060a9d31
3 changed files with 6 additions and 1 deletions

View File

@ -3,6 +3,7 @@
"payload":{
"$ref": "common_payloads/InstanceActionPayload.json#",
"nova_object.data":{
"availability_zone": null,
"state": "shelved_offloaded",
"power_state": "shutdown",
"host": null,

View File

@ -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):

View File

@ -2601,7 +2601,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,