Transform instance.resize_confirm notification

The instance.resize_confirm.start and instance.resize_confirm.end
notifications are transformed to the versioned framework.

Change-Id: I6a51542216340299d250576714e303f74e0ceb0f
Co-Authored-By: Takashi Natsume <natsume.takashi@lab.ntt.co.jp>
Co-Authored-By: stewie925 <st3wty@att.com>
Co-Authored-By: MikeG451 <michael.glaser@att.com>
Implements: bp versioned-notification-transformation-queens
This commit is contained in:
Béla Vancsics 2017-07-19 11:48:17 +02:00 committed by Takashi NATSUME
parent 4f26e91a0b
commit 8ec0b43904
7 changed files with 108 additions and 10 deletions

View File

@ -0,0 +1,18 @@
{
"event_type":"instance.resize_confirm.end",
"payload": {
"$ref": "common_payloads/InstanceActionPayload.json#",
"nova_object.data": {
"flavor": {
"nova_object.data": {
"flavorid": "2",
"memory_mb": 2048,
"name": "m1.small",
"root_gb":20
}
}
}
},
"priority":"INFO",
"publisher_id":"nova-compute:compute"
}

View File

@ -0,0 +1,19 @@
{
"event_type":"instance.resize_confirm.start",
"payload": {
"$ref": "common_payloads/InstanceActionPayload.json#",
"nova_object.data": {
"flavor": {
"nova_object.data": {
"flavorid": "2",
"memory_mb": 2048,
"name": "m1.small",
"root_gb":20
}
},
"state": "resized"
}
},
"priority":"INFO",
"publisher_id":"nova-compute:compute"
}

View File

@ -3685,6 +3685,9 @@ class ComputeManager(manager.Manager):
"""Destroys the source instance.""" """Destroys the source instance."""
self._notify_about_instance_usage(context, instance, self._notify_about_instance_usage(context, instance,
"resize.confirm.start") "resize.confirm.start")
compute_utils.notify_about_instance_action(context, instance,
self.host, action=fields.NotificationAction.RESIZE_CONFIRM,
phase=fields.NotificationPhase.START)
with self._error_out_instance_on_exception(context, instance): with self._error_out_instance_on_exception(context, instance):
# NOTE(danms): delete stashed migration information # NOTE(danms): delete stashed migration information
@ -3739,6 +3742,9 @@ class ComputeManager(manager.Manager):
self._notify_about_instance_usage( self._notify_about_instance_usage(
context, instance, "resize.confirm.end", context, instance, "resize.confirm.end",
network_info=network_info) network_info=network_info)
compute_utils.notify_about_instance_action(context, instance,
self.host, action=fields.NotificationAction.RESIZE_CONFIRM,
phase=fields.NotificationPhase.END)
def _delete_allocation_after_move(self, context, instance, migration, def _delete_allocation_after_move(self, context, instance, migration,
flavor, nodename): flavor, nodename):

View File

@ -455,8 +455,8 @@ class InstanceStateUpdatePayload(base.NotificationPayloadBase):
@base.notification_sample('instance-rebuild-error.json') @base.notification_sample('instance-rebuild-error.json')
@base.notification_sample('instance-interface_detach-start.json') @base.notification_sample('instance-interface_detach-start.json')
@base.notification_sample('instance-interface_detach-end.json') @base.notification_sample('instance-interface_detach-end.json')
# @base.notification_sample('instance-resize_confirm-start.json') @base.notification_sample('instance-resize_confirm-start.json')
# @base.notification_sample('instance-resize_confirm-end.json') @base.notification_sample('instance-resize_confirm-end.json')
# @base.notification_sample('instance-resize_prep-start.json') # @base.notification_sample('instance-resize_prep-start.json')
@base.notification_sample('instance-resize_revert-start.json') @base.notification_sample('instance-resize_revert-start.json')
@base.notification_sample('instance-resize_revert-end.json') @base.notification_sample('instance-resize_revert-end.json')

View File

@ -220,7 +220,7 @@ class TestOpenStackClient(object):
headers['Content-Type'] = 'application/json' headers['Content-Type'] = 'application/json'
kwargs['body'] = jsonutils.dumps(body) kwargs['body'] = jsonutils.dumps(body)
kwargs.setdefault('check_response_status', [200, 201, 202]) kwargs.setdefault('check_response_status', [200, 201, 202, 204])
return APIResponse(self.api_request(relative_uri, **kwargs)) return APIResponse(self.api_request(relative_uri, **kwargs))
def api_put(self, relative_uri, body, **kwargs): def api_put(self, relative_uri, body, **kwargs):

View File

@ -257,7 +257,6 @@ class TestInstanceNotificationSample(
self._test_shelve_and_shelve_offload_server, self._test_shelve_and_shelve_offload_server,
self._test_unshelve_server, self._test_unshelve_server,
self._test_resize_and_revert_server, self._test_resize_and_revert_server,
self._test_resize_confirm_server,
self._test_snapshot_server, self._test_snapshot_server,
self._test_reboot_server, self._test_reboot_server,
self._test_reboot_server_error, self._test_reboot_server_error,
@ -1155,8 +1154,35 @@ class TestInstanceNotificationSample(
'uuid': server['id']}, 'uuid': server['id']},
actual=fake_notifier.VERSIONED_NOTIFICATIONS[6]) actual=fake_notifier.VERSIONED_NOTIFICATIONS[6])
def _test_resize_confirm_server(self, server): def test_resize_confirm_server(self):
pass server = self._boot_a_server(
extra_params={'networks': [{'port': self.neutron.port_1['id']}]})
self._attach_volume_to_server(server, self.cinder.SWAP_OLD_VOL)
self.admin_api.post_extra_spec(
'2', {"extra_specs": {"hw:watchdog_action": "disabled"}})
self.flags(allow_resize_to_same_host=True)
post = {'resize': {'flavorRef': '2'}}
self.api.post_server_action(server['id'], post)
self._wait_for_state_change(self.api, server, 'VERIFY_RESIZE')
fake_notifier.reset()
post = {'confirmResize': None}
self.api.post_server_action(server['id'], post)
self._wait_for_state_change(self.api, server, 'ACTIVE')
self.assertEqual(2, len(fake_notifier.VERSIONED_NOTIFICATIONS))
self._verify_notification(
'instance-resize_confirm-start',
replacements={
'reservation_id': server['reservation_id'],
'uuid': server['id']},
actual=fake_notifier.VERSIONED_NOTIFICATIONS[0])
self._verify_notification(
'instance-resize_confirm-end',
replacements={
'reservation_id': server['reservation_id'],
'uuid': server['id']},
actual=fake_notifier.VERSIONED_NOTIFICATIONS[1])
def _test_trigger_crash_dump(self, server): def _test_trigger_crash_dump(self, server):
post = {'trigger_crash_dump': None} post = {'trigger_crash_dump': None}

View File

@ -5473,7 +5473,10 @@ class ComputeTestCase(BaseTestCase,
def test_resize_instance_forced_shutdown(self): def test_resize_instance_forced_shutdown(self):
self._test_resize_instance(clean_shutdown=False) self._test_resize_instance(clean_shutdown=False)
def _test_confirm_resize(self, power_on, numa_topology=None): @mock.patch.object(objects.BlockDeviceMappingList, 'get_by_instance_uuid')
@mock.patch.object(nova.compute.utils, 'notify_about_instance_action')
def _test_confirm_resize(self, mock_notify, mock_get_by_instance_uuid,
power_on, numa_topology=None):
# Common test case method for confirm_resize # Common test case method for confirm_resize
def fake(*args, **kwargs): def fake(*args, **kwargs):
pass pass
@ -5482,6 +5485,9 @@ class ComputeTestCase(BaseTestCase,
# Confirm the instance uses the new type in finish_resize # Confirm the instance uses the new type in finish_resize
self.assertEqual('3', instance.flavor.flavorid) self.assertEqual('3', instance.flavor.flavorid)
expected_bdm = objects.BlockDeviceMappingList(objects=[])
mock_get_by_instance_uuid.return_value = expected_bdm
old_vm_state = None old_vm_state = None
p_state = None p_state = None
if power_on: if power_on:
@ -5573,15 +5579,38 @@ class ComputeTestCase(BaseTestCase,
# Finally, confirm the resize and verify the new flavor is applied # Finally, confirm the resize and verify the new flavor is applied
instance.task_state = None instance.task_state = None
instance.save() instance.save()
self.compute.confirm_resize(self.context, instance=instance,
reservations=[], with mock.patch.object(objects.Instance, 'get_by_uuid',
migration=migration) return_value=instance) as mock_get_by_uuid:
self.compute.confirm_resize(self.context, instance=instance,
reservations=[],
migration=migration)
mock_get_by_uuid.assert_called_once_with(
self.context, instance.uuid,
expected_attrs=['metadata', 'system_metadata', 'flavor'])
# Resources from the migration (based on initial flavor) should # Resources from the migration (based on initial flavor) should
# be freed now # be freed now
self.assertEqual(self.rt.compute_nodes[NODENAME].memory_mb_used, self.assertEqual(self.rt.compute_nodes[NODENAME].memory_mb_used,
memory_mb_used + new_instance_type_ref.memory_mb) memory_mb_used + new_instance_type_ref.memory_mb)
mock_notify.assert_has_calls([
mock.call(self.context, instance,
'fake-mini', action='resize', bdms=expected_bdm,
phase='start'),
mock.call(self.context, instance,
'fake-mini', action='resize', bdms=expected_bdm,
phase='end'),
mock.call(self.context, instance,
'fake-mini', action='resize_finish', bdms=expected_bdm,
phase='start'),
mock.call(self.context, instance,
'fake-mini', action='resize_finish', bdms=expected_bdm,
phase='end'),
mock.call(self.context, instance,
'fake-mini', action='resize_confirm', phase='start'),
mock.call(self.context, instance,
'fake-mini', action='resize_confirm', phase='end')])
instance.refresh() instance.refresh()
flavor = objects.Flavor.get_by_id(self.context, flavor = objects.Flavor.get_by_id(self.context,