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 a1ea50e678e..5b2c008f536 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 1d5e39261d6..8907ce02bc6 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 56b7b608de2..fbdb4a2f81c 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 120fa5e2be3..98bdefdfbaf 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 ba2dee44dba..137d802c2a4 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 7a4b5692fd1..4d20ee5c6c8 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 dfc3f0465ce..dd4df0dc445 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 1b15f705777..4dff7a054fc 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 28dff447be6..60f19a5cecf 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 086ad7c6cc4..1ba3817a8e6 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 596c2c61059..7f4adc5206e 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 0887d04fa41..58b4d63ee87 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 d5e64fab514..016c104da19 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 49f54fdbeef..13386f7111e 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 787a301944c..82eccf7eccf 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 9a1c4472408..4939ede390d 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 4120a39c015..23dc3613259 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 b140408f7bd..3f515bf9a1d 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 f5f16a1dead..13a9c1fe887 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 780f4f3ae2f..a1de07edf8b 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 5dcbf95dc79..ae951f1e4bc 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 3ecb98bf951..b37f59e4006 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 a8cd5171ae9..ed36345156d 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 3e646a7fc2e..28fe0ba87cb 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 b96e0c63cf1..2fb61188d48 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 337cddf11f0..0a9c8a5d9f9 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 1637a816d07..4f2179bd6d5 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 cc78220f2e1..ee7c5c8faf6 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 b3a492c3b01..c7b709b8f71 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 c9e9d0950d9..9a9e87aadb0 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 afbbb01507b..e71263b53d2 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 b3e5fabead9..b48a9379bb9 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 712e494f876..8c2c416306c 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 a7351ea2d1a..b6c6e1eeac0 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 91a97ea6186..c6855b7c6cf 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 15b2e070f5c..e9f707c3d1b 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 fd31f02d905..94f4e6f3a12 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 6457d0f2bb3..88ffb588a59 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 91d04a630ba..4dfe58ef4e1 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 0aa5fd4e00c..9ad4433b069 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 ca8ee9f6f34..ed645546d5a 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 16c602f4be1..6de10ad3e21 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 01610f6201e..1ac7efc411e 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 d46a1407290..905d14804ca 100644 --- a/nova/conductor/manager.py +++ b/nova/conductor/manager.py @@ -25,6 +25,7 @@ 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 @@ def build_instances(self, context, instances, image, filter_properties, 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 @@ def safe_image_show(ctx, image_id): 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 @@ def rebuild_instance(self, context, instance, orig_image_ref, image_ref, 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 @@ def schedule_and_build_instances(self, context, build_requests, '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 e4a07a94507..5331200de0d 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 @@ def _execute(self): (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 b75360c1700..8c411374ae8 100644 --- a/nova/tests/unit/conductor/tasks/test_migrate.py +++ b/nova/tests/unit/conductor/tasks/test_migrate.py @@ -54,14 +54,17 @@ def _generate_task(self): 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 @@ def test_execute(self, quotas_mock, prep_resize_mock, 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 @@ def test_execute(self, quotas_mock, prep_resize_mock, 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 c27bf1e62a9..cb8ad23fc90 100644 --- a/nova/tests/unit/conductor/test_conductor.py +++ b/nova/tests/unit/conductor/test_conductor.py @@ -379,8 +379,9 @@ def test_cold_migrate(self): 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 @@ def test_build_instances(self, mock_refresh): # 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 @@ def test_build_instances(self, mock_refresh): 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 @@ def test_build_instances_scheduler_group_failure( 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 @@ def test_build_instances_scheduler_group_failure( '_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 @@ def test_build_instances_no_instance_mapping(self, _mock_set_state, 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 @@ def test_build_instances_no_instance_mapping(self, _mock_set_state, '_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 @@ def test_build_instances_no_host_mapping(self, _mock_set_state, 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 @@ def test_build_instances_no_host_mapping(self, _mock_set_state, '_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 @@ def test_build_instances_update_instance_mapping(self, _mock_set_state, 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 @@ def do_test(): 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 @@ def do_test(mock_build_and_run): 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 @@ def do_test(mock_pop_inst_map, mock_build_and_run): 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 @@ def setUp(self): 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 @@ def _build_and_run_instance(ctxt, *args, **kwargs): 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 @@ def test_resize_no_valid_host_error_msg(self): 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 @@ def test_build_instances_instance_not_found(self): 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 @@ def test_build_instances_info_cache_not_found(self, build_request_spec, '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):