From 03b4c67b22f49d325386bc3ebd2ade79b44fa699 Mon Sep 17 00:00:00 2001 From: Dan Smith Date: Wed, 15 Mar 2017 08:34:04 -0700 Subject: [PATCH] Set instance.availability_zone whenever we schedule This ensures that instance.availability_zone reflects what AZ the instance is actually in. In the case where no AZ was requested at boot, previously this would always be some default value, which isn't as useful to the things that need to consider what AZ the instance is actually in (without doing all the aggregate math to determine it on the fly). Related to blueprint cells-aware-api Change-Id: I8d426f2635232ffc4b510548a905794ca88d7f99 --- .../instance-create-end.json | 2 +- .../instance-create-error.json | 2 +- .../instance-create-start.json | 2 +- .../instance-delete-end.json | 2 +- .../instance-delete-start.json | 2 +- .../instance-pause-end.json | 2 +- .../instance-pause-start.json | 2 +- .../instance-power_off-end.json | 2 +- .../instance-power_off-start.json | 2 +- .../instance-power_on-end.json | 2 +- .../instance-power_on-start.json | 2 +- .../instance-reboot-end.json | 4 +- .../instance-reboot-error.json | 4 +- .../instance-reboot-start.json | 4 +- .../instance-rebuild-end.json | 2 +- .../instance-rebuild-error.json | 2 +- .../instance-rebuild-start.json | 2 +- .../instance-resize-end.json | 2 +- .../instance-resize-start.json | 2 +- .../instance-resize_finish-end.json | 2 +- .../instance-resize_finish-start.json | 2 +- .../instance-restore-end.json | 2 +- .../instance-restore-start.json | 2 +- .../instance-resume-end.json | 2 +- .../instance-resume-start.json | 2 +- .../instance-shelve-end.json | 2 +- .../instance-shelve-start.json | 2 +- .../instance-shelve_offload-end.json | 2 +- .../instance-shelve_offload-start.json | 2 +- .../instance-shutdown-end.json | 2 +- .../instance-shutdown-start.json | 2 +- .../instance-snapshot-end.json | 2 +- .../instance-snapshot-start.json | 2 +- .../instance-suspend-end.json | 2 +- .../instance-suspend-start.json | 2 +- .../instance-unpause-end.json | 2 +- .../instance-unpause-start.json | 2 +- .../instance-unshelve-end.json | 2 +- .../instance-unshelve-start.json | 2 +- doc/notification_samples/instance-update.json | 2 +- .../instance-volume_swap-end.json | 2 +- .../instance-volume_swap-error.json | 2 +- .../instance-volume_swap-start.json | 2 +- nova/conductor/manager.py | 18 ++++++- nova/conductor/tasks/migrate.py | 5 ++ .../unit/conductor/tasks/test_migrate.py | 8 ++- nova/tests/unit/conductor/test_conductor.py | 50 +++++++++++-------- 47 files changed, 104 insertions(+), 69 deletions(-) diff --git a/doc/notification_samples/instance-create-end.json b/doc/notification_samples/instance-create-end.json index a1ea50e678..5b2c008f53 100644 --- a/doc/notification_samples/instance-create-end.json +++ b/doc/notification_samples/instance-create-end.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-create-error.json b/doc/notification_samples/instance-create-error.json index 1d5e39261d..8907ce02bc 100644 --- a/doc/notification_samples/instance-create-error.json +++ b/doc/notification_samples/instance-create-error.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-create-start.json b/doc/notification_samples/instance-create-start.json index 56b7b608de..fbdb4a2f81 100644 --- a/doc/notification_samples/instance-create-start.json +++ b/doc/notification_samples/instance-create-start.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-delete-end.json b/doc/notification_samples/instance-delete-end.json index 120fa5e2be..98bdefdfba 100644 --- a/doc/notification_samples/instance-delete-end.json +++ b/doc/notification_samples/instance-delete-end.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":"2012-10-29T13:42:11Z", "display_name":"some-server", diff --git a/doc/notification_samples/instance-delete-start.json b/doc/notification_samples/instance-delete-start.json index ba2dee44db..137d802c2a 100644 --- a/doc/notification_samples/instance-delete-start.json +++ b/doc/notification_samples/instance-delete-start.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-pause-end.json b/doc/notification_samples/instance-pause-end.json index 7a4b5692fd..4d20ee5c6c 100644 --- a/doc/notification_samples/instance-pause-end.json +++ b/doc/notification_samples/instance-pause-end.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-pause-start.json b/doc/notification_samples/instance-pause-start.json index dfc3f0465c..dd4df0dc44 100644 --- a/doc/notification_samples/instance-pause-start.json +++ b/doc/notification_samples/instance-pause-start.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-power_off-end.json b/doc/notification_samples/instance-power_off-end.json index 1b15f70577..4dff7a054f 100644 --- a/doc/notification_samples/instance-power_off-end.json +++ b/doc/notification_samples/instance-power_off-end.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-power_off-start.json b/doc/notification_samples/instance-power_off-start.json index 28dff447be..60f19a5cec 100644 --- a/doc/notification_samples/instance-power_off-start.json +++ b/doc/notification_samples/instance-power_off-start.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-power_on-end.json b/doc/notification_samples/instance-power_on-end.json index 086ad7c6cc..1ba3817a8e 100644 --- a/doc/notification_samples/instance-power_on-end.json +++ b/doc/notification_samples/instance-power_on-end.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-power_on-start.json b/doc/notification_samples/instance-power_on-start.json index 596c2c6105..7f4adc5206 100644 --- a/doc/notification_samples/instance-power_on-start.json +++ b/doc/notification_samples/instance-power_on-start.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-reboot-end.json b/doc/notification_samples/instance-reboot-end.json index 0887d04fa4..58b4d63ee8 100644 --- a/doc/notification_samples/instance-reboot-end.json +++ b/doc/notification_samples/instance-reboot-end.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":null, - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", @@ -71,4 +71,4 @@ }, "priority":"INFO", "publisher_id":"nova-compute:compute" -} \ No newline at end of file +} diff --git a/doc/notification_samples/instance-reboot-error.json b/doc/notification_samples/instance-reboot-error.json index d5e64fab51..016c104da1 100644 --- a/doc/notification_samples/instance-reboot-error.json +++ b/doc/notification_samples/instance-reboot-error.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture": null, - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", @@ -81,4 +81,4 @@ }, "priority":"ERROR", "publisher_id":"nova-compute:compute" -} \ No newline at end of file +} diff --git a/doc/notification_samples/instance-reboot-start.json b/doc/notification_samples/instance-reboot-start.json index 49f54fdbee..13386f7111 100644 --- a/doc/notification_samples/instance-reboot-start.json +++ b/doc/notification_samples/instance-reboot-start.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":null, - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", @@ -71,4 +71,4 @@ }, "priority":"INFO", "publisher_id":"nova-compute:compute" -} \ No newline at end of file +} diff --git a/doc/notification_samples/instance-rebuild-end.json b/doc/notification_samples/instance-rebuild-end.json index 787a301944..82eccf7ecc 100755 --- a/doc/notification_samples/instance-rebuild-end.json +++ b/doc/notification_samples/instance-rebuild-end.json @@ -62,7 +62,7 @@ "os_type": null, "uuid": "b271fcb9-75c3-4c76-84eb-6ccad1150ece", "locked": false, - "availability_zone": null, + "availability_zone": "nova", "ramdisk_id": "", "architecture": null, "progress": 0, diff --git a/doc/notification_samples/instance-rebuild-error.json b/doc/notification_samples/instance-rebuild-error.json index 9a1c447240..4939ede390 100755 --- a/doc/notification_samples/instance-rebuild-error.json +++ b/doc/notification_samples/instance-rebuild-error.json @@ -4,7 +4,7 @@ "nova_object.name": "InstanceActionPayload", "nova_object.data": { "state": "active", - "availability_zone": null, + "availability_zone": "nova", "kernel_id": "", "host_name": "some-server", "progress": 0, diff --git a/doc/notification_samples/instance-rebuild-start.json b/doc/notification_samples/instance-rebuild-start.json index 4120a39c01..23dc361325 100755 --- a/doc/notification_samples/instance-rebuild-start.json +++ b/doc/notification_samples/instance-rebuild-start.json @@ -64,7 +64,7 @@ } ], "tenant_id": "6f70656e737461636b20342065766572", - "availability_zone": null, + "availability_zone": "nova", "host": "compute", "image_uuid": "a2459075-d96c-40d5-893e-577ff92e721c", "state": "active", diff --git a/doc/notification_samples/instance-resize-end.json b/doc/notification_samples/instance-resize-end.json index b140408f7b..3f515bf9a1 100644 --- a/doc/notification_samples/instance-resize-end.json +++ b/doc/notification_samples/instance-resize-end.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-resize-start.json b/doc/notification_samples/instance-resize-start.json index f5f16a1dea..13a9c1fe88 100644 --- a/doc/notification_samples/instance-resize-start.json +++ b/doc/notification_samples/instance-resize-start.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-resize_finish-end.json b/doc/notification_samples/instance-resize_finish-end.json index 780f4f3ae2..a1de07edf8 100644 --- a/doc/notification_samples/instance-resize_finish-end.json +++ b/doc/notification_samples/instance-resize_finish-end.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-resize_finish-start.json b/doc/notification_samples/instance-resize_finish-start.json index 5dcbf95dc7..ae951f1e4b 100644 --- a/doc/notification_samples/instance-resize_finish-start.json +++ b/doc/notification_samples/instance-resize_finish-start.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-restore-end.json b/doc/notification_samples/instance-restore-end.json index 3ecb98bf95..b37f59e400 100644 --- a/doc/notification_samples/instance-restore-end.json +++ b/doc/notification_samples/instance-restore-end.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-restore-start.json b/doc/notification_samples/instance-restore-start.json index a8cd5171ae..ed36345156 100644 --- a/doc/notification_samples/instance-restore-start.json +++ b/doc/notification_samples/instance-restore-start.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-resume-end.json b/doc/notification_samples/instance-resume-end.json index 3e646a7fc2..28fe0ba87c 100644 --- a/doc/notification_samples/instance-resume-end.json +++ b/doc/notification_samples/instance-resume-end.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-resume-start.json b/doc/notification_samples/instance-resume-start.json index b96e0c63cf..2fb61188d4 100644 --- a/doc/notification_samples/instance-resume-start.json +++ b/doc/notification_samples/instance-resume-start.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-shelve-end.json b/doc/notification_samples/instance-shelve-end.json index 337cddf11f..0a9c8a5d9f 100644 --- a/doc/notification_samples/instance-shelve-end.json +++ b/doc/notification_samples/instance-shelve-end.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-shelve-start.json b/doc/notification_samples/instance-shelve-start.json index 1637a816d0..4f2179bd6d 100644 --- a/doc/notification_samples/instance-shelve-start.json +++ b/doc/notification_samples/instance-shelve-start.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-shelve_offload-end.json b/doc/notification_samples/instance-shelve_offload-end.json index cc78220f2e..ee7c5c8faf 100644 --- a/doc/notification_samples/instance-shelve_offload-end.json +++ b/doc/notification_samples/instance-shelve_offload-end.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-shelve_offload-start.json b/doc/notification_samples/instance-shelve_offload-start.json index b3a492c3b0..c7b709b8f7 100644 --- a/doc/notification_samples/instance-shelve_offload-start.json +++ b/doc/notification_samples/instance-shelve_offload-start.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-shutdown-end.json b/doc/notification_samples/instance-shutdown-end.json index c9e9d0950d..9a9e87aadb 100644 --- a/doc/notification_samples/instance-shutdown-end.json +++ b/doc/notification_samples/instance-shutdown-end.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-shutdown-start.json b/doc/notification_samples/instance-shutdown-start.json index afbbb01507..e71263b53d 100644 --- a/doc/notification_samples/instance-shutdown-start.json +++ b/doc/notification_samples/instance-shutdown-start.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-snapshot-end.json b/doc/notification_samples/instance-snapshot-end.json index b3e5fabead..b48a9379bb 100644 --- a/doc/notification_samples/instance-snapshot-end.json +++ b/doc/notification_samples/instance-snapshot-end.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-snapshot-start.json b/doc/notification_samples/instance-snapshot-start.json index 712e494f87..8c2c416306 100644 --- a/doc/notification_samples/instance-snapshot-start.json +++ b/doc/notification_samples/instance-snapshot-start.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-suspend-end.json b/doc/notification_samples/instance-suspend-end.json index a7351ea2d1..b6c6e1eeac 100644 --- a/doc/notification_samples/instance-suspend-end.json +++ b/doc/notification_samples/instance-suspend-end.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-suspend-start.json b/doc/notification_samples/instance-suspend-start.json index 91a97ea618..c6855b7c6c 100644 --- a/doc/notification_samples/instance-suspend-start.json +++ b/doc/notification_samples/instance-suspend-start.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-unpause-end.json b/doc/notification_samples/instance-unpause-end.json index 15b2e070f5..e9f707c3d1 100644 --- a/doc/notification_samples/instance-unpause-end.json +++ b/doc/notification_samples/instance-unpause-end.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-unpause-start.json b/doc/notification_samples/instance-unpause-start.json index fd31f02d90..94f4e6f3a1 100644 --- a/doc/notification_samples/instance-unpause-start.json +++ b/doc/notification_samples/instance-unpause-start.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-unshelve-end.json b/doc/notification_samples/instance-unshelve-end.json index 6457d0f2bb..88ffb588a5 100644 --- a/doc/notification_samples/instance-unshelve-end.json +++ b/doc/notification_samples/instance-unshelve-end.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-unshelve-start.json b/doc/notification_samples/instance-unshelve-start.json index 91d04a630b..4dfe58ef4e 100644 --- a/doc/notification_samples/instance-unshelve-start.json +++ b/doc/notification_samples/instance-unshelve-start.json @@ -3,7 +3,7 @@ "payload":{ "nova_object.data":{ "architecture":"x86_64", - "availability_zone":null, + "availability_zone": "nova", "created_at":"2012-10-29T13:42:11Z", "deleted_at":null, "display_name":"some-server", diff --git a/doc/notification_samples/instance-update.json b/doc/notification_samples/instance-update.json index 0aa5fd4e00..9ad4433b06 100644 --- a/doc/notification_samples/instance-update.json +++ b/doc/notification_samples/instance-update.json @@ -11,7 +11,7 @@ "nova_object.namespace": "nova", "nova_object.version": "1.0" }, - "availability_zone": null, + "availability_zone": "nova", "bandwidth": [], "created_at": "2012-10-29T13:42:11Z", "deleted_at": null, diff --git a/doc/notification_samples/instance-volume_swap-end.json b/doc/notification_samples/instance-volume_swap-end.json index ca8ee9f6f3..ed645546d5 100644 --- a/doc/notification_samples/instance-volume_swap-end.json +++ b/doc/notification_samples/instance-volume_swap-end.json @@ -3,7 +3,7 @@ "payload": { "nova_object.data": { "architecture": "x86_64", - "availability_zone": null, + "availability_zone": "nova", "created_at": "2012-10-29T13:42:11Z", "deleted_at": null, "display_name": "some-server", diff --git a/doc/notification_samples/instance-volume_swap-error.json b/doc/notification_samples/instance-volume_swap-error.json index 16c602f4be..6de10ad3e2 100644 --- a/doc/notification_samples/instance-volume_swap-error.json +++ b/doc/notification_samples/instance-volume_swap-error.json @@ -3,7 +3,7 @@ "payload": { "nova_object.data": { "architecture": "x86_64", - "availability_zone": null, + "availability_zone": "nova", "created_at": "2012-10-29T13:42:11Z", "deleted_at": null, "display_name": "some-server", diff --git a/doc/notification_samples/instance-volume_swap-start.json b/doc/notification_samples/instance-volume_swap-start.json index 01610f6201..1ac7efc411 100644 --- a/doc/notification_samples/instance-volume_swap-start.json +++ b/doc/notification_samples/instance-volume_swap-start.json @@ -3,7 +3,7 @@ "payload": { "nova_object.data": { "architecture": "x86_64", - "availability_zone": null, + "availability_zone": "nova", "created_at": "2012-10-29T13:42:11Z", "deleted_at": null, "display_name": "some-server", diff --git a/nova/conductor/manager.py b/nova/conductor/manager.py index d46a140729..905d14804c 100644 --- a/nova/conductor/manager.py +++ b/nova/conductor/manager.py @@ -25,6 +25,7 @@ from oslo_utils import excutils from oslo_utils import versionutils import six +from nova import availability_zones from nova.compute import instance_actions from nova.compute import rpcapi as compute_rpcapi from nova.compute import task_states @@ -575,8 +576,13 @@ class ComputeTaskManager(base.Base): return for (instance, host) in six.moves.zip(instances, hosts): + instance.availability_zone = ( + availability_zones.get_host_availability_zone(context, + host['host'])) try: - instance.refresh() + # NOTE(danms): This saves the az change above, refreshes our + # instance, and tells us if it has been deleted underneath us + instance.save() except (exception.InstanceNotFound, exception.InstanceInfoCacheNotFound): LOG.debug('Instance deleted during build', instance=instance) @@ -698,6 +704,9 @@ class ComputeTaskManager(base.Base): scheduler_utils.populate_filter_properties( filter_properties, host_state) (host, node) = (host_state['host'], host_state['nodename']) + instance.availability_zone = ( + availability_zones.get_host_availability_zone( + context, host)) self.compute_rpcapi.unshelve_instance( context, instance, host, image=image, filter_properties=filter_properties, node=node) @@ -790,6 +799,10 @@ class ComputeTaskManager(base.Base): compute_utils.notify_about_instance_usage( self.notifier, context, instance, "rebuild.scheduled") + instance.availability_zone = ( + availability_zones.get_host_availability_zone( + context, host)) + self.compute_rpcapi.rebuild_instance(context, instance=instance, new_pass=new_pass, @@ -947,6 +960,9 @@ class ComputeTaskManager(base.Base): 'was already deleted.', instance=instance) continue else: + instance.availability_zone = ( + availability_zones.get_host_availability_zone( + context, host['host'])) with obj_target_cell(instance, cell): instance.create() diff --git a/nova/conductor/tasks/migrate.py b/nova/conductor/tasks/migrate.py index e4a07a9450..5331200de0 100644 --- a/nova/conductor/tasks/migrate.py +++ b/nova/conductor/tasks/migrate.py @@ -12,6 +12,7 @@ from oslo_serialization import jsonutils +from nova import availability_zones from nova.conductor.tasks import base from nova import objects from nova.scheduler import utils as scheduler_utils @@ -67,6 +68,10 @@ class MigrationTask(base.TaskBase): (host, node) = (host_state['host'], host_state['nodename']) + self.instance.availability_zone = ( + availability_zones.get_host_availability_zone( + self.context, host)) + # FIXME(sbauza): Serialize/Unserialize the legacy dict because of # oslo.messaging #1529084 to transform datetime values into strings. # tl;dr: datetimes in dicts are not accepted as correct values by the diff --git a/nova/tests/unit/conductor/tasks/test_migrate.py b/nova/tests/unit/conductor/tasks/test_migrate.py index b75360c170..8c411374ae 100644 --- a/nova/tests/unit/conductor/tasks/test_migrate.py +++ b/nova/tests/unit/conductor/tasks/test_migrate.py @@ -54,14 +54,17 @@ class MigrationTaskTestCase(test.NoDBTestCase): compute_rpcapi.ComputeAPI(), scheduler_client.SchedulerClient()) + @mock.patch('nova.availability_zones.get_host_availability_zone') @mock.patch.object(objects.RequestSpec, 'from_components') @mock.patch.object(scheduler_utils, 'setup_instance_group') @mock.patch.object(scheduler_client.SchedulerClient, 'select_destinations') @mock.patch.object(compute_rpcapi.ComputeAPI, 'prep_resize') @mock.patch.object(objects.Quotas, 'from_reservations') def test_execute(self, quotas_mock, prep_resize_mock, - sel_dest_mock, sig_mock, request_spec_from_components): + sel_dest_mock, sig_mock, request_spec_from_components, + az_mock): sel_dest_mock.return_value = self.hosts + az_mock.return_value = 'myaz' task = self._generate_task() request_spec_from_components.return_value = self.request_spec legacy_request_spec = self.request_spec.to_legacy_request_spec_dict() @@ -74,7 +77,7 @@ class MigrationTaskTestCase(test.NoDBTestCase): self.context, self.instance.uuid, self.request_spec.image, task.flavor, self.instance.numa_topology, self.instance.pci_requests, expected_props, None, - self.instance.availability_zone) + None) quotas_mock.assert_called_once_with(self.context, self.reservations, instance=self.instance) sig_mock.assert_called_once_with(self.context, legacy_request_spec, @@ -88,6 +91,7 @@ class MigrationTaskTestCase(test.NoDBTestCase): filter_properties=self.filter_properties, node=self.hosts[0]['nodename'], clean_shutdown=self.clean_shutdown) self.assertFalse(quotas_mock.return_value.rollback.called) + az_mock.assert_called_once_with(self.context, 'host1') def test_rollback(self): task = self._generate_task() diff --git a/nova/tests/unit/conductor/test_conductor.py b/nova/tests/unit/conductor/test_conductor.py index c27bf1e62a..cb8ad23fc9 100644 --- a/nova/tests/unit/conductor/test_conductor.py +++ b/nova/tests/unit/conductor/test_conductor.py @@ -379,8 +379,9 @@ class _BaseTaskTestCase(object): def test_cold_migrate_forced_shutdown(self): self._test_cold_migrate(clean_shutdown=False) - @mock.patch('nova.objects.Instance.refresh') - def test_build_instances(self, mock_refresh): + @mock.patch('nova.availability_zones.get_host_availability_zone') + @mock.patch('nova.objects.Instance.save') + def test_build_instances(self, mock_save, mock_getaz): instance_type = flavors.get_default_flavor() # NOTE(danms): Avoid datetime timezone issues with converted flavors instance_type.created_at = None @@ -455,6 +456,8 @@ class _BaseTaskTestCase(object): # build_instances() is a cast, we need to wait for it to complete self.useFixture(cast_as_call.CastAsCall(self.stubs)) + mock_getaz.return_value = 'myaz' + self.conductor.build_instances(self.context, instances=instances, image={'fake_data': 'should_pass_silently'}, @@ -465,6 +468,9 @@ class _BaseTaskTestCase(object): security_groups='security_groups', block_device_mapping='block_device_mapping', legacy_bdm=False) + mock_getaz.assert_has_calls([ + mock.call(self.context, 'host1'), + mock.call(self.context, 'host2')]) @mock.patch.object(scheduler_utils, 'build_request_spec') @mock.patch.object(scheduler_utils, 'setup_instance_group') @@ -608,7 +614,7 @@ class _BaseTaskTestCase(object): state_mock.assert_has_calls(set_state_calls) cleanup_mock.assert_has_calls(cleanup_network_calls) - @mock.patch.object(objects.Instance, 'refresh') + @mock.patch.object(objects.Instance, 'save') @mock.patch.object(objects.InstanceMapping, 'get_by_instance_uuid', side_effect=exc.InstanceMappingNotFound(uuid='fake')) @mock.patch.object(objects.HostMapping, 'get_by_host') @@ -618,7 +624,7 @@ class _BaseTaskTestCase(object): '_set_vm_state_and_notify') def test_build_instances_no_instance_mapping(self, _mock_set_state, mock_select_dests, mock_get_by_host, mock_get_inst_map_by_uuid, - _mock_refresh): + _mock_save): mock_select_dests.return_value = [ {'host': 'host1', 'nodename': 'node1', 'limits': []}, @@ -649,7 +655,7 @@ class _BaseTaskTestCase(object): mock.call(self.context, instances[1].uuid)]) self.assertFalse(mock_get_by_host.called) - @mock.patch.object(objects.Instance, 'refresh') + @mock.patch.object(objects.Instance, 'save') @mock.patch.object(objects.InstanceMapping, 'get_by_instance_uuid') @mock.patch.object(objects.HostMapping, 'get_by_host', side_effect=exc.HostMappingNotFound(name='fake')) @@ -659,7 +665,7 @@ class _BaseTaskTestCase(object): '_set_vm_state_and_notify') def test_build_instances_no_host_mapping(self, _mock_set_state, mock_select_dests, mock_get_by_host, mock_get_inst_map_by_uuid, - _mock_refresh): + _mock_save): mock_select_dests.return_value = [ {'host': 'host1', 'nodename': 'node1', 'limits': []}, @@ -698,7 +704,7 @@ class _BaseTaskTestCase(object): mock_get_by_host.assert_has_calls([mock.call(self.context, 'host1'), mock.call(self.context, 'host2')]) - @mock.patch.object(objects.Instance, 'refresh') + @mock.patch.object(objects.Instance, 'save') @mock.patch.object(objects.InstanceMapping, 'get_by_instance_uuid') @mock.patch.object(objects.HostMapping, 'get_by_host') @mock.patch.object(scheduler_client.SchedulerClient, @@ -707,7 +713,7 @@ class _BaseTaskTestCase(object): '_set_vm_state_and_notify') def test_build_instances_update_instance_mapping(self, _mock_set_state, mock_select_dests, mock_get_by_host, mock_get_inst_map_by_uuid, - _mock_refresh): + _mock_save): mock_select_dests.return_value = [ {'host': 'host1', 'nodename': 'node1', 'limits': []}, @@ -751,7 +757,7 @@ class _BaseTaskTestCase(object): mock_get_by_host.assert_has_calls([mock.call(self.context, 'host1'), mock.call(self.context, 'host2')]) - @mock.patch.object(objects.Instance, 'refresh', new=mock.MagicMock()) + @mock.patch.object(objects.Instance, 'save', new=mock.MagicMock()) @mock.patch.object(objects.BuildRequest, 'get_by_instance_uuid') @mock.patch.object(scheduler_client.SchedulerClient, 'select_destinations') @@ -796,7 +802,7 @@ class _BaseTaskTestCase(object): for build_req in build_req_mocks: build_req.destroy.assert_called_once_with() - @mock.patch.object(objects.Instance, 'refresh', new=mock.MagicMock()) + @mock.patch.object(objects.Instance, 'save', new=mock.MagicMock()) @mock.patch.object(objects.BuildRequest, 'get_by_instance_uuid', side_effect=exc.BuildRequestNotFound(uuid='fake')) @mock.patch.object(scheduler_client.SchedulerClient, @@ -839,7 +845,7 @@ class _BaseTaskTestCase(object): do_test() @mock.patch.object(objects.Service, 'get_minimum_version', return_value=12) - @mock.patch.object(objects.Instance, 'refresh', new=mock.MagicMock()) + @mock.patch.object(objects.Instance, 'save', new=mock.MagicMock()) @mock.patch.object(objects.BuildRequest, 'get_by_instance_uuid', side_effect=exc.BuildRequestNotFound(uuid='fake')) @mock.patch.object(scheduler_client.SchedulerClient, @@ -886,7 +892,7 @@ class _BaseTaskTestCase(object): mock_service_version.assert_called_once_with(self.context, 'nova-osapi_compute') - @mock.patch.object(objects.Instance, 'refresh', new=mock.MagicMock()) + @mock.patch.object(objects.Instance, 'save', new=mock.MagicMock()) @mock.patch.object(scheduler_client.SchedulerClient, 'select_destinations') @mock.patch.object(conductor_manager.ComputeTaskManager, @@ -1432,13 +1438,16 @@ class ConductorTaskTestCase(_BaseTaskTestCase, test_compute.BaseTestCase): objects=[bdm]) self.params = params + @mock.patch('nova.availability_zones.get_host_availability_zone') @mock.patch('nova.compute.rpcapi.ComputeAPI.build_and_run_instance') @mock.patch('nova.scheduler.rpcapi.SchedulerAPI.select_destinations') def test_schedule_and_build_instances(self, select_destinations, - build_and_run_instance): + build_and_run_instance, + get_az): select_destinations.return_value = [{'host': 'fake-host', 'nodename': 'fake-nodename', 'limits': None}] + get_az.return_value = 'myaz' params = self.params details = {} @@ -1453,6 +1462,7 @@ class ConductorTaskTestCase(_BaseTaskTestCase, test_compute.BaseTestCase): build_and_run_instance.side_effect = _build_and_run_instance self.conductor.schedule_and_build_instances(**params) self.assertTrue(build_and_run_instance.called) + get_az.assert_called_once_with(mock.ANY, 'fake-host') instance_uuid = details['instance'].uuid bdms = objects.BlockDeviceMappingList.get_by_instance_uuid( @@ -2227,8 +2237,8 @@ class ConductorTaskTestCase(_BaseTaskTestCase, test_compute.BaseTestCase): def test_build_instances_instance_not_found(self): instances = [fake_instance.fake_instance_obj(self.context) for i in range(2)] - self.mox.StubOutWithMock(instances[0], 'refresh') - self.mox.StubOutWithMock(instances[1], 'refresh') + self.mox.StubOutWithMock(instances[0], 'save') + self.mox.StubOutWithMock(instances[1], 'save') image = {'fake-data': 'should_pass_silently'} spec = {'fake': 'specs', 'instance_properties': instances[0]} @@ -2244,9 +2254,9 @@ class ConductorTaskTestCase(_BaseTaskTestCase, test_compute.BaseTestCase): spec, filter_properties).AndReturn( [{'host': 'host1', 'nodename': 'node1', 'limits': []}, {'host': 'host2', 'nodename': 'node2', 'limits': []}]) - instances[0].refresh().AndRaise( + instances[0].save().AndRaise( exc.InstanceNotFound(instance_id=instances[0].uuid)) - instances[1].refresh() + instances[1].save() self.conductor_manager.compute_rpcapi.build_and_run_instance( self.context, instance=instances[1], host='host2', image={'fake-data': 'should_pass_silently'}, request_spec=spec, @@ -2289,16 +2299,16 @@ class ConductorTaskTestCase(_BaseTaskTestCase, test_compute.BaseTestCase): 'instance_properties': instances[0]} build_request_spec.return_value = spec with test.nested( - mock.patch.object(instances[0], 'refresh', + mock.patch.object(instances[0], 'save', side_effect=exc.InstanceInfoCacheNotFound( instance_uuid=instances[0].uuid)), - mock.patch.object(instances[1], 'refresh'), + mock.patch.object(instances[1], 'save'), mock.patch.object(objects.RequestSpec, 'from_primitives'), mock.patch.object(self.conductor_manager.scheduler_client, 'select_destinations', return_value=destinations), mock.patch.object(self.conductor_manager.compute_rpcapi, 'build_and_run_instance') - ) as (inst1_refresh, inst2_refresh, from_primitives, + ) as (inst1_save, inst2_save, from_primitives, select_destinations, build_and_run_instance):