Compute RPC client bump to 5.0

This adds the usual compatibility logic for allowing 5.0 and 4.x for a
version-spanning release. This also adds a queens version alias.

Change-Id: I98dc2a588ee9ddfe0c4d8ce1d7fe59f1fc9e9fa8
This commit is contained in:
Dan Smith 2018-02-05 14:10:53 -08:00
parent 00341ff6e0
commit eae37a27ca
5 changed files with 247 additions and 189 deletions

View File

@ -341,6 +341,13 @@ class ComputeAPI(object):
* 4.21 - prep_resize() now gets a 'host_list' parameter representing
potential alternate hosts for retries within a cell.
* 4.22 - Add request_spec to rebuild_instance()
... Version 5.0 is functionally equivalent to 4.22, aside from
removing deprecated parameters. Queens sends 5.0 by default,
can accept 4.x calls from Pike nodes, and can be pinned to 4.x
for Pike compatibility. All new changes should go against 5.x.
* 5.0 - Remove 4.x compatibility
'''
VERSION_ALIASES = {
@ -352,11 +359,12 @@ class ComputeAPI(object):
'newton': '4.13',
'ocata': '4.13',
'pike': '4.18',
'queens': '5.0',
}
def __init__(self):
super(ComputeAPI, self).__init__()
target = messaging.Target(topic=RPC_TOPIC, version='4.0')
target = messaging.Target(topic=RPC_TOPIC, version='5.0')
upgrade_level = CONF.upgrade_levels.compute
if upgrade_level == 'auto':
version_cap = self._determine_version_cap(target)
@ -367,6 +375,24 @@ class ComputeAPI(object):
default_client = self.get_client(target, version_cap, serializer)
self.router = rpc.ClientRouter(default_client)
def _ver(self, ctxt, old):
"""Determine compatibility version.
This is to be used when we could send either the current major or
a revision of the previous major when they are equivalent. This
should only be used by calls that are the exact same in the current
and previous major versions. Returns either old, or the current major
version.
:param old: The version under the previous major version that should
be sent if we're pinned to it.
"""
client = self.router.client(ctxt)
if client.can_send_version('5.0'):
return '5.0'
else:
return old
def _determine_version_cap(self, target):
global LAST_VERSION
if LAST_VERSION:
@ -422,7 +448,7 @@ class ComputeAPI(object):
parameter for the remote method.
:param host: This is the host to send the message to.
'''
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=host, version=version)
cctxt.cast(ctxt, 'add_aggregate_host',
@ -430,7 +456,7 @@ class ComputeAPI(object):
slave_info=slave_info)
def add_fixed_ip_to_instance(self, ctxt, instance, network_id):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
cctxt.cast(ctxt, 'add_fixed_ip_to_instance',
@ -441,7 +467,7 @@ class ComputeAPI(object):
kw = {'instance': instance, 'network_id': network_id,
'port_id': port_id, 'requested_ip': requested_ip,
'tag': tag}
version = '4.16'
version = self._ver(ctxt, '4.16')
client = self.router.client(ctxt)
if not client.can_send_version(version):
@ -459,13 +485,13 @@ class ComputeAPI(object):
return cctxt.call(ctxt, 'attach_interface', **kw)
def attach_volume(self, ctxt, instance, bdm):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
cctxt.cast(ctxt, 'attach_volume', instance=instance, bdm=bdm)
def change_instance_metadata(self, ctxt, instance, diff):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
cctxt.cast(ctxt, 'change_instance_metadata',
@ -473,7 +499,7 @@ class ComputeAPI(object):
def check_can_live_migrate_destination(self, ctxt, instance, destination,
block_migration, disk_over_commit):
version = '4.11'
version = self._ver(ctxt, '4.11')
client = self.router.client(ctxt)
if not client.can_send_version(version):
# NOTE(eliqiao): This is a new feature that is only available
@ -501,7 +527,7 @@ class ComputeAPI(object):
def check_can_live_migrate_source(self, ctxt, instance, dest_check_data):
dest_check_data_obj = dest_check_data
version = '4.8'
version = self._ver(ctxt, '4.8')
client = self.router.client(ctxt)
if not client.can_send_version(version):
version = '4.0'
@ -521,27 +547,32 @@ class ComputeAPI(object):
return result
def check_instance_shared_storage(self, ctxt, instance, data, host=None):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(host, instance), version=version)
return cctxt.call(ctxt, 'check_instance_shared_storage',
instance=instance,
data=data)
# TODO(melwitt): Remove the reservations parameter in version 5.0 of the
# RPC API.
def confirm_resize(self, ctxt, instance, migration, host,
reservations=None, cast=True):
version = '4.0'
cctxt = self.router.client(ctxt).prepare(
cast=True):
client = self.router.client(ctxt)
# NOTE(danms): We had a deprecation in 5.0, which means we need to
# try to send that, as 4.max is not equivalent for us
version = '5.0'
msg_args = {}
if not client.can_send_version(version):
version = '4.0'
msg_args['reservations'] = None
cctxt = client.prepare(
server=_compute_host(host, instance), version=version)
rpc_method = cctxt.cast if cast else cctxt.call
return rpc_method(ctxt, 'confirm_resize',
instance=instance, migration=migration,
reservations=reservations)
**msg_args)
def detach_interface(self, ctxt, instance, port_id):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
cctxt.cast(ctxt, 'detach_interface',
@ -549,7 +580,7 @@ class ComputeAPI(object):
def detach_volume(self, ctxt, instance, volume_id, attachment_id=None):
extra = {'attachment_id': attachment_id}
version = '4.7'
version = self._ver(ctxt, '4.7')
client = self.router.client(ctxt)
if not client.can_send_version(version):
version = '4.0'
@ -559,56 +590,64 @@ class ComputeAPI(object):
cctxt.cast(ctxt, 'detach_volume',
instance=instance, volume_id=volume_id, **extra)
# TODO(melwitt): Remove the reservations parameter in version 5.0 of the
# RPC API.
def finish_resize(self, ctxt, instance, migration, image, disk_info,
host, reservations=None):
version = '4.0'
cctxt = self.router.client(ctxt).prepare(
def finish_resize(self, ctxt, instance, migration, image, disk_info, host):
client = self.router.client(ctxt)
# NOTE(danms): We had a deprecation in 5.0, which means we need to
# try to send that, as 4.max is not equivalent for us
version = '5.0'
msg_args = {}
if not client.can_send_version(version):
version = '4.0'
msg_args['reservations'] = None
cctxt = client.prepare(
server=host, version=version)
cctxt.cast(ctxt, 'finish_resize',
instance=instance, migration=migration,
image=image, disk_info=disk_info, reservations=reservations)
image=image, disk_info=disk_info, **msg_args)
# TODO(melwitt): Remove the reservations parameter in version 5.0 of the
# RPC API.
def finish_revert_resize(self, ctxt, instance, migration, host,
reservations=None):
version = '4.0'
cctxt = self.router.client(ctxt).prepare(
def finish_revert_resize(self, ctxt, instance, migration, host):
client = self.router.client(ctxt)
# NOTE(danms): We had a deprecation in 5.0, which means we need to
# try to send that, as 4.max is not equivalent for us
version = '5.0'
msg_args = {}
if not client.can_send_version(version):
version = '4.0'
msg_args['reservations'] = None
cctxt = client.prepare(
server=host, version=version)
cctxt.cast(ctxt, 'finish_revert_resize',
instance=instance, migration=migration,
reservations=reservations)
**msg_args)
def get_console_output(self, ctxt, instance, tail_length):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
return cctxt.call(ctxt, 'get_console_output',
instance=instance, tail_length=tail_length)
def get_console_pool_info(self, ctxt, host, console_type):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=host, version=version)
return cctxt.call(ctxt, 'get_console_pool_info',
console_type=console_type)
def get_console_topic(self, ctxt, host):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=host, version=version)
return cctxt.call(ctxt, 'get_console_topic')
def get_diagnostics(self, ctxt, instance):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
return cctxt.call(ctxt, 'get_diagnostics', instance=instance)
def get_instance_diagnostics(self, ctxt, instance):
version = '4.14'
version = self._ver(ctxt, '4.14')
client = self.router.client(ctxt)
if not client.can_send_version(version):
# NOTE(snikitin): Since version 4.14 method
@ -622,42 +661,42 @@ class ComputeAPI(object):
return cctxt.call(ctxt, 'get_instance_diagnostics', instance=instance)
def get_vnc_console(self, ctxt, instance, console_type):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
return cctxt.call(ctxt, 'get_vnc_console',
instance=instance, console_type=console_type)
def get_spice_console(self, ctxt, instance, console_type):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
return cctxt.call(ctxt, 'get_spice_console',
instance=instance, console_type=console_type)
def get_rdp_console(self, ctxt, instance, console_type):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
return cctxt.call(ctxt, 'get_rdp_console',
instance=instance, console_type=console_type)
def get_mks_console(self, ctxt, instance, console_type):
version = '4.3'
version = self._ver(ctxt, '4.3')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
return cctxt.call(ctxt, 'get_mks_console',
instance=instance, console_type=console_type)
def get_serial_console(self, ctxt, instance, console_type):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
return cctxt.call(ctxt, 'get_serial_console',
instance=instance, console_type=console_type)
def validate_console_port(self, ctxt, instance, port, console_type):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
return cctxt.call(ctxt, 'validate_console_port',
@ -673,20 +712,20 @@ class ComputeAPI(object):
:param mode:
:param host: This is the host to send the message to.
'''
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=host, version=version)
return cctxt.call(ctxt, 'host_maintenance_mode',
host=host_param, mode=mode)
def host_power_action(self, ctxt, host, action):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=host, version=version)
return cctxt.call(ctxt, 'host_power_action', action=action)
def inject_network_info(self, ctxt, instance):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
cctxt.cast(ctxt, 'inject_network_info', instance=instance)
@ -694,7 +733,7 @@ class ComputeAPI(object):
def live_migration(self, ctxt, instance, dest, block_migration, host,
migration, migrate_data=None):
args = {'migration': migration}
version = '4.8'
version = self._ver(ctxt, '4.8')
client = self.router.client(ctxt)
if not client.can_send_version(version):
version = '4.2'
@ -710,7 +749,7 @@ class ComputeAPI(object):
migrate_data=migrate_data, **args)
def live_migration_force_complete(self, ctxt, instance, migration):
version = '4.12'
version = self._ver(ctxt, '4.12')
kwargs = {}
client = self.router.client(ctxt)
if not client.can_send_version(version):
@ -723,21 +762,21 @@ class ComputeAPI(object):
**kwargs)
def live_migration_abort(self, ctxt, instance, migration_id):
version = '4.10'
version = self._ver(ctxt, '4.10')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
cctxt.cast(ctxt, 'live_migration_abort', instance=instance,
migration_id=migration_id)
def pause_instance(self, ctxt, instance):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
cctxt.cast(ctxt, 'pause_instance', instance=instance)
def post_live_migration_at_destination(self, ctxt, instance,
block_migration, host):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=host, version=version)
return cctxt.call(ctxt, 'post_live_migration_at_destination',
@ -746,7 +785,7 @@ class ComputeAPI(object):
def pre_live_migration(self, ctxt, instance, block_migration, disk,
host, migrate_data=None):
migrate_data_orig = migrate_data
version = '4.8'
version = self._ver(ctxt, '4.8')
client = self.router.client(ctxt)
if not client.can_send_version(version):
version = '4.0'
@ -766,17 +805,14 @@ class ComputeAPI(object):
else:
return result
# TODO(melwitt): Remove the reservations parameter in version 5.0 of the
# RPC API.
def prep_resize(self, ctxt, instance, image, instance_type, host,
migration, reservations=None, request_spec=None,
migration, request_spec=None,
filter_properties=None, node=None,
clean_shutdown=True, host_list=None):
image_p = jsonutils.to_primitive(image)
msg_args = {'instance': instance,
'instance_type': instance_type,
'image': image_p,
'reservations': reservations,
'request_spec': request_spec,
'filter_properties': filter_properties,
'node': node,
@ -784,7 +820,12 @@ class ComputeAPI(object):
'clean_shutdown': clean_shutdown,
'host_list': host_list}
client = self.router.client(ctxt)
version = '4.21'
# NOTE(danms): We had a deprecation in 5.0, which means we need to
# try to send that, as 4.max is not equivalent for us
version = '5.0'
if not client.can_send_version(version):
version = '4.21'
msg_args['reservations'] = None
if not client.can_send_version(version):
version = '4.18'
del msg_args['host_list']
@ -800,7 +841,7 @@ class ComputeAPI(object):
def reboot_instance(self, ctxt, instance, block_device_info,
reboot_type):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
cctxt.cast(ctxt, 'reboot_instance',
@ -823,7 +864,7 @@ class ComputeAPI(object):
'scheduled_node': node,
'limits': limits,
'request_spec': request_spec}
version = '4.22'
version = self._ver(ctxt, '4.22')
client = self.router.client(ctxt)
if not client.can_send_version(version):
version = '4.5'
@ -853,7 +894,7 @@ class ComputeAPI(object):
parameter for the remote method.
:param host: This is the host to send the message to.
'''
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=host, version=version)
cctxt.cast(ctxt, 'remove_aggregate_host',
@ -861,14 +902,14 @@ class ComputeAPI(object):
slave_info=slave_info)
def remove_fixed_ip_from_instance(self, ctxt, instance, address):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
cctxt.cast(ctxt, 'remove_fixed_ip_from_instance',
instance=instance, address=address)
def remove_volume_connection(self, ctxt, instance, volume_id, host):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=host, version=version)
return cctxt.call(ctxt, 'remove_volume_connection',
@ -876,7 +917,7 @@ class ComputeAPI(object):
def rescue_instance(self, ctxt, instance, rescue_password,
rescue_image_ref=None, clean_shutdown=True):
version = '4.0'
version = self._ver(ctxt, '4.0')
msg_args = {'rescue_password': rescue_password,
'clean_shutdown': clean_shutdown,
'rescue_image_ref': rescue_image_ref,
@ -887,22 +928,25 @@ class ComputeAPI(object):
cctxt.cast(ctxt, 'rescue_instance', **msg_args)
def reset_network(self, ctxt, instance):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
cctxt.cast(ctxt, 'reset_network', instance=instance)
# TODO(melwitt): Remove the reservations parameter in version 5.0 of the
# RPC API.
def resize_instance(self, ctxt, instance, migration, image, instance_type,
reservations=None, clean_shutdown=True):
clean_shutdown=True):
msg_args = {'instance': instance, 'migration': migration,
'image': image, 'reservations': reservations,
'image': image,
'instance_type': instance_type,
'clean_shutdown': clean_shutdown,
}
version = '4.1'
# NOTE(danms): We had a deprecation in 5.0, which means we need to
# try to send that, as 4.max is not equivalent for us
version = '5.0'
client = self.router.client(ctxt)
if not client.can_send_version(version):
version = '4.1'
msg_args['reservations'] = None
if not client.can_send_version(version):
msg_args['instance_type'] = objects_base.obj_to_primitive(
instance_type)
@ -912,24 +956,30 @@ class ComputeAPI(object):
cctxt.cast(ctxt, 'resize_instance', **msg_args)
def resume_instance(self, ctxt, instance):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
cctxt.cast(ctxt, 'resume_instance', instance=instance)
def revert_resize(self, ctxt, instance, migration, host,
reservations=None):
version = '4.0'
cctxt = self.router.client(ctxt).prepare(
def revert_resize(self, ctxt, instance, migration, host):
client = self.router.client(ctxt)
# NOTE(danms): We had a deprecation in 5.0, which means we need to
# try to send that, as 4.max is not equivalent for us
version = '5.0'
msg_args = {}
if not client.can_send_version(version):
version = '4.0'
msg_args['reservations'] = None
cctxt = client.prepare(
server=_compute_host(host, instance), version=version)
cctxt.cast(ctxt, 'revert_resize',
instance=instance, migration=migration,
reservations=reservations)
**msg_args)
def rollback_live_migration_at_destination(self, ctxt, instance, host,
destroy_disks=True,
migrate_data=None):
version = '4.8'
version = self._ver(ctxt, '4.8')
client = self.router.client(ctxt)
if not client.can_send_version(version):
version = '4.0'
@ -943,21 +993,21 @@ class ComputeAPI(object):
instance=instance, **extra)
def set_admin_password(self, ctxt, instance, new_pass):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
return cctxt.call(ctxt, 'set_admin_password',
instance=instance, new_pass=new_pass)
def set_host_enabled(self, ctxt, host, enabled):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=host, version=version)
return cctxt.call(ctxt, 'set_host_enabled', enabled=enabled)
def swap_volume(self, ctxt, instance, old_volume_id, new_volume_id,
new_attachment_id=None):
version = '4.17'
version = self._ver(ctxt, '4.17')
client = self.router.client(ctxt)
kwargs = dict(instance=instance,
old_volume_id=old_volume_id,
@ -971,7 +1021,7 @@ class ComputeAPI(object):
cctxt.cast(ctxt, 'swap_volume', **kwargs)
def get_host_uptime(self, ctxt, host):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=host, version=version)
return cctxt.call(ctxt, 'get_host_uptime')
@ -983,7 +1033,7 @@ class ComputeAPI(object):
'volume_id': volume_id, 'disk_bus': disk_bus,
'device_type': device_type, 'tag': tag,
'multiattach': multiattach}
version = '4.20'
version = self._ver(ctxt, '4.20')
client = self.router.client(ctxt)
if not client.can_send_version(version):
@ -1011,7 +1061,7 @@ class ComputeAPI(object):
def backup_instance(self, ctxt, instance, image_id, backup_type,
rotation):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
cctxt.cast(ctxt, 'backup_instance',
@ -1021,7 +1071,7 @@ class ComputeAPI(object):
rotation=rotation)
def snapshot_instance(self, ctxt, instance, image_id):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
cctxt.cast(ctxt, 'snapshot_instance',
@ -1029,7 +1079,7 @@ class ComputeAPI(object):
image_id=image_id)
def start_instance(self, ctxt, instance):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
cctxt.cast(ctxt, 'start_instance', instance=instance)
@ -1037,55 +1087,64 @@ class ComputeAPI(object):
def stop_instance(self, ctxt, instance, do_cast=True, clean_shutdown=True):
msg_args = {'instance': instance,
'clean_shutdown': clean_shutdown}
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
rpc_method = cctxt.cast if do_cast else cctxt.call
return rpc_method(ctxt, 'stop_instance', **msg_args)
def suspend_instance(self, ctxt, instance):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
cctxt.cast(ctxt, 'suspend_instance', instance=instance)
# TODO(melwitt): Remove the reservations parameter in version 5.0 of the
# RPC API.
def terminate_instance(self, ctxt, instance, bdms, reservations=None,
delete_type=None):
def terminate_instance(self, ctxt, instance, bdms, delete_type=None):
# NOTE(rajesht): The `delete_type` parameter is passed because
# the method signature has to match with `terminate_instance()`
# method of cells rpcapi.
version = '4.0'
cctxt = self.router.client(ctxt).prepare(
client = self.router.client(ctxt)
# NOTE(danms): We had a deprecation in 5.0, which means we need to
# try to send that, as 4.max is not equivalent for us
version = '5.0'
msg_args = {}
if not client.can_send_version(version):
version = '4.0'
msg_args['reservations'] = None
cctxt = client.prepare(
server=_compute_host(None, instance), version=version)
cctxt.cast(ctxt, 'terminate_instance',
instance=instance, bdms=bdms,
reservations=reservations)
**msg_args)
def unpause_instance(self, ctxt, instance):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
cctxt.cast(ctxt, 'unpause_instance', instance=instance)
def unrescue_instance(self, ctxt, instance):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
cctxt.cast(ctxt, 'unrescue_instance', instance=instance)
# TODO(melwitt): Remove the reservations parameter in version 5.0 of the
# RPC API.
def soft_delete_instance(self, ctxt, instance, reservations=None):
version = '4.0'
cctxt = self.router.client(ctxt).prepare(
def soft_delete_instance(self, ctxt, instance):
client = self.router.client(ctxt)
# NOTE(danms): We had a deprecation in 5.0, which means we need to
# try to send that, as 4.max is not equivalent for us
version = '5.0'
msg_args = {}
if not client.can_send_version(version):
version = '4.0'
msg_args['reservations'] = None
cctxt = client.prepare(
server=_compute_host(None, instance), version=version)
cctxt.cast(ctxt, 'soft_delete_instance',
instance=instance, reservations=reservations)
instance=instance, **msg_args)
def restore_instance(self, ctxt, instance):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
cctxt.cast(ctxt, 'restore_instance', instance=instance)
@ -1094,7 +1153,7 @@ class ComputeAPI(object):
clean_shutdown=True):
msg_args = {'instance': instance, 'image_id': image_id,
'clean_shutdown': clean_shutdown}
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
cctxt.cast(ctxt, 'shelve_instance', **msg_args)
@ -1102,14 +1161,14 @@ class ComputeAPI(object):
def shelve_offload_instance(self, ctxt, instance,
clean_shutdown=True):
msg_args = {'instance': instance, 'clean_shutdown': clean_shutdown}
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
cctxt.cast(ctxt, 'shelve_offload_instance', **msg_args)
def unshelve_instance(self, ctxt, instance, host, image=None,
filter_properties=None, node=None):
version = '4.0'
version = self._ver(ctxt, '4.0')
msg_kwargs = {
'instance': instance,
'image': image,
@ -1122,7 +1181,7 @@ class ComputeAPI(object):
def volume_snapshot_create(self, ctxt, instance, volume_id,
create_info):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
cctxt.cast(ctxt, 'volume_snapshot_create', instance=instance,
@ -1130,7 +1189,7 @@ class ComputeAPI(object):
def volume_snapshot_delete(self, ctxt, instance, volume_id, snapshot_id,
delete_info):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
cctxt.cast(ctxt, 'volume_snapshot_delete', instance=instance,
@ -1141,7 +1200,7 @@ class ComputeAPI(object):
instance = instances[0]
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(host, instance),
version='4.0')
version=self._ver(ctxt, '4.0'))
cctxt.cast(ctxt, 'external_instance_event', instances=instances,
events=events)
@ -1167,7 +1226,7 @@ class ComputeAPI(object):
"host_list": host_list,
}
client = self.router.client(ctxt)
version = '4.19'
version = self._ver(ctxt, '4.19')
if not client.can_send_version(version):
version = '4.0'
kwargs.pop("host_list")
@ -1175,20 +1234,20 @@ class ComputeAPI(object):
cctxt.cast(ctxt, 'build_and_run_instance', **kwargs)
def quiesce_instance(self, ctxt, instance):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
return cctxt.call(ctxt, 'quiesce_instance', instance=instance)
def unquiesce_instance(self, ctxt, instance, mapping=None):
version = '4.0'
version = self._ver(ctxt, '4.0')
cctxt = self.router.client(ctxt).prepare(
server=_compute_host(None, instance), version=version)
cctxt.cast(ctxt, 'unquiesce_instance', instance=instance,
mapping=mapping)
def refresh_instance_security_rules(self, ctxt, instance, host):
version = '4.4'
version = self._ver(ctxt, '4.4')
client = self.router.client(ctxt)
if not client.can_send_version(version):
version = '4.0'
@ -1199,7 +1258,7 @@ class ComputeAPI(object):
instance=instance)
def trigger_crash_dump(self, ctxt, instance):
version = '4.6'
version = self._ver(ctxt, '4.6')
client = self.router.client(ctxt)
if not client.can_send_version(version):

View File

@ -297,7 +297,7 @@ class MigrationTask(base.TaskBase):
# RPC cast to the destination host to start the migration process.
self.compute_rpcapi.prep_resize(
self.context, self.instance, legacy_spec['image'],
self.flavor, host, migration, self.reservations,
self.flavor, host, migration,
request_spec=legacy_spec, filter_properties=legacy_props,
node=node, clean_shutdown=self.clean_shutdown,
host_list=self.host_list)

View File

@ -184,12 +184,12 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
def test_add_fixed_ip_to_instance(self):
self._test_compute_api('add_fixed_ip_to_instance', 'cast',
instance=self.fake_instance_obj, network_id='id',
version='4.0')
version='5.0')
def test_attach_interface(self):
self._test_compute_api('attach_interface', 'call',
instance=self.fake_instance_obj, network_id='id',
port_id='id2', version='4.16', requested_ip='192.168.1.50',
port_id='id2', version='5.0', requested_ip='192.168.1.50',
tag='foo')
def test_attach_interface_raises(self):
@ -212,7 +212,7 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
rpcapi.attach_interface, ctxt, instance,
'fake_network', 'fake_port', 'fake_requested_ip',
tag='foo')
can_send_mock.assert_called_once_with('4.16')
can_send_mock.assert_called_with('4.16')
def test_attach_interface_downgrades_version(self):
ctxt = context.RequestContext('fake_user', 'fake_project')
@ -234,7 +234,7 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
rpcapi.attach_interface(ctxt, instance, 'fake_network',
'fake_port', 'fake_requested_ip')
can_send_mock.assert_called_once_with('4.16')
can_send_mock.assert_called_with('4.16')
prepare_mock.assert_called_once_with(server=instance['host'],
version='4.0')
call_mock.assert_called_once_with(ctxt, 'attach_interface',
@ -246,36 +246,36 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
def test_attach_volume(self):
self._test_compute_api('attach_volume', 'cast',
instance=self.fake_instance_obj, bdm=self.fake_volume_bdm,
version='4.0')
version='5.0')
def test_change_instance_metadata(self):
self._test_compute_api('change_instance_metadata', 'cast',
instance=self.fake_instance_obj, diff={}, version='4.0')
instance=self.fake_instance_obj, diff={}, version='5.0')
def test_check_instance_shared_storage(self):
self._test_compute_api('check_instance_shared_storage', 'call',
instance=self.fake_instance_obj, data='foo',
version='4.0')
version='5.0')
def test_confirm_resize_cast(self):
self._test_compute_api('confirm_resize', 'cast',
instance=self.fake_instance_obj, migration={'id': 'foo'},
host='host', reservations=list('fake_res'))
host='host')
def test_confirm_resize_call(self):
self._test_compute_api('confirm_resize', 'call',
instance=self.fake_instance_obj, migration={'id': 'foo'},
host='host', reservations=list('fake_res'))
host='host')
def test_detach_interface(self):
self._test_compute_api('detach_interface', 'cast',
version='4.0', instance=self.fake_instance_obj,
version='5.0', instance=self.fake_instance_obj,
port_id='fake_id')
def test_detach_volume(self):
self._test_compute_api('detach_volume', 'cast',
instance=self.fake_instance_obj, volume_id='id',
attachment_id='fake_id', version='4.7')
attachment_id='fake_id', version='5.0')
def test_detach_volume_no_attachment_id(self):
ctxt = context.RequestContext('fake_user', 'fake_project')
@ -297,7 +297,7 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
rpcapi.detach_volume(ctxt, instance=instance,
volume_id='id', attachment_id='fake_id')
# assert our mocks were called as expected
can_send_mock.assert_called_once_with('4.7')
can_send_mock.assert_called_with('4.7')
prepare_mock.assert_called_once_with(server=instance['host'],
version='4.0')
cast_mock.assert_called_once_with(ctxt, 'detach_volume',
@ -307,18 +307,17 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
def test_finish_resize(self):
self._test_compute_api('finish_resize', 'cast',
instance=self.fake_instance_obj, migration={'id': 'foo'},
image='image', disk_info='disk_info', host='host',
reservations=list('fake_res'))
image='image', disk_info='disk_info', host='host')
def test_finish_revert_resize(self):
self._test_compute_api('finish_revert_resize', 'cast',
instance=self.fake_instance_obj, migration={'id': 'fake_id'},
host='host', reservations=list('fake_res'))
host='host')
def test_get_console_output(self):
self._test_compute_api('get_console_output', 'call',
instance=self.fake_instance_obj, tail_length='tl',
version='4.0')
version='5.0')
def test_get_console_pool_info(self):
self._test_compute_api('get_console_pool_info', 'call',
@ -329,43 +328,43 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
def test_get_diagnostics(self):
self._test_compute_api('get_diagnostics', 'call',
instance=self.fake_instance_obj, version='4.0')
instance=self.fake_instance_obj, version='5.0')
def test_get_instance_diagnostics(self):
expected_args = {'instance': self.fake_instance_obj}
self._test_compute_api('get_instance_diagnostics', 'call',
expected_args, instance=self.fake_instance_obj,
version='4.14')
version='5.0')
def test_get_vnc_console(self):
self._test_compute_api('get_vnc_console', 'call',
instance=self.fake_instance_obj, console_type='type',
version='4.0')
version='5.0')
def test_get_spice_console(self):
self._test_compute_api('get_spice_console', 'call',
instance=self.fake_instance_obj, console_type='type',
version='4.0')
version='5.0')
def test_get_rdp_console(self):
self._test_compute_api('get_rdp_console', 'call',
instance=self.fake_instance_obj, console_type='type',
version='4.0')
version='5.0')
def test_get_serial_console(self):
self._test_compute_api('get_serial_console', 'call',
instance=self.fake_instance_obj, console_type='serial',
version='4.0')
version='5.0')
def test_get_mks_console(self):
self._test_compute_api('get_mks_console', 'call',
instance=self.fake_instance_obj, console_type='webmks',
version='4.3')
version='5.0')
def test_validate_console_port(self):
self._test_compute_api('validate_console_port', 'call',
instance=self.fake_instance_obj, port="5900",
console_type="novnc", version='4.0')
console_type="novnc", version='5.0')
def test_host_maintenance_mode(self):
self._test_compute_api('host_maintenance_mode', 'call',
@ -384,14 +383,14 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
instance=self.fake_instance_obj, dest='dest',
block_migration='blockity_block', host='tsoh',
migration='migration',
migrate_data={}, version='4.8')
migrate_data={}, version='5.0')
def test_live_migration_force_complete(self):
migration = migration_obj.Migration()
migration.id = 1
migration.source_compute = 'fake'
ctxt = context.RequestContext('fake_user', 'fake_project')
version = '4.12'
version = '5.0'
rpcapi = compute_rpcapi.ComputeAPI()
rpcapi.router.client = mock.Mock()
mock_client = mock.MagicMock()
@ -432,12 +431,12 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
def test_live_migration_abort(self):
self._test_compute_api('live_migration_abort', 'cast',
instance=self.fake_instance_obj,
migration_id='1', version='4.10')
migration_id='1', version='5.0')
def test_post_live_migration_at_destination(self):
self._test_compute_api('post_live_migration_at_destination', 'call',
instance=self.fake_instance_obj,
block_migration='block_migration', host='host', version='4.0')
block_migration='block_migration', host='host', version='5.0')
def test_pause_instance(self):
self._test_compute_api('pause_instance', 'cast',
@ -445,14 +444,13 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
def test_soft_delete_instance(self):
self._test_compute_api('soft_delete_instance', 'cast',
instance=self.fake_instance_obj,
reservations=['uuid1', 'uuid2'])
instance=self.fake_instance_obj)
def test_swap_volume(self):
self._test_compute_api('swap_volume', 'cast',
instance=self.fake_instance_obj, old_volume_id='oldid',
new_volume_id='newid', new_attachment_id=uuids.attachment_id,
version='4.17')
version='5.0')
def test_swap_volume_cannot_send_version_4_17(self):
"""Tests that if the RPC client cannot send version 4.17 we drop back
@ -477,13 +475,13 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
def test_restore_instance(self):
self._test_compute_api('restore_instance', 'cast',
instance=self.fake_instance_obj, version='4.0')
instance=self.fake_instance_obj, version='5.0')
def test_pre_live_migration(self):
self._test_compute_api('pre_live_migration', 'call',
instance=self.fake_instance_obj,
block_migration='block_migration', disk='disk', host='host',
migrate_data=None, version='4.8')
migrate_data=None, version='5.0')
def test_prep_resize(self):
expected_args = {'migration': 'migration'}
@ -491,19 +489,18 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
instance=self.fake_instance_obj,
instance_type=self.fake_flavor_obj,
image='fake_image', host='host',
reservations=list('fake_res'),
request_spec='fake_spec',
filter_properties={'fakeprop': 'fakeval'},
migration='migration',
node='node', clean_shutdown=True, host_list=None,
version='4.21')
version='5.0')
self.flags(compute='4.0', group='upgrade_levels')
expected_args = {'instance_type': self.fake_flavor}
expected_args = {'instance_type': self.fake_flavor,
'reservations': None}
self._test_compute_api('prep_resize', 'cast', expected_args,
instance=self.fake_instance_obj,
instance_type=self.fake_flavor_obj,
image='fake_image', host='host',
reservations=list('fake_res'),
request_spec='fake_spec',
filter_properties={'fakeprop': 'fakeval'},
migration='migration',
@ -522,7 +519,7 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
bdms=[], instance=self.fake_instance_obj, host='new_host',
orig_sys_metadata=None, recreate=True, on_shared_storage=True,
preserve_ephemeral=True, migration=None, node=None,
limits=None, request_spec=None, version='4.22')
limits=None, request_spec=None, version='5.0')
def test_rebuild_instance_remove_request_spec(self):
self.flags(group='upgrade_levels', compute='4.21')
@ -545,7 +542,7 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
self._test_compute_api('reserve_block_device_name', 'call',
instance=self.fake_instance_obj, device='device',
volume_id='id', disk_bus='ide', device_type='cdrom',
tag='foo', multiattach=True, version='4.20',
tag='foo', multiattach=True, version='5.0',
_return_value=objects_block_dev.BlockDeviceMapping())
def test_reserve_block_device_name_raises(self):
@ -558,7 +555,7 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
rpcapi.router.client.return_value = mock_client
with test.nested(
mock.patch.object(mock_client, 'can_send_version',
side_effect=[False, False]),
side_effect=[False, False, False, False]),
mock.patch.object(mock_client, 'prepare',
return_value=cctxt_mock)
) as (
@ -567,7 +564,8 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
self.assertRaises(exception.TaggedAttachmentNotSupported,
rpcapi.reserve_block_device_name, ctxt, instance,
'fake_device', 'fake_volume_id', tag='foo')
can_send_calls = [mock.call('4.20'), mock.call('4.15')]
can_send_calls = [mock.call('5.0'), mock.call('4.20'),
mock.call('4.15')]
can_send_mock.assert_has_calls(can_send_calls)
def test_reserve_block_device_name_downgrades_version(self):
@ -581,7 +579,7 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
rpcapi.router.client.return_value = mock_client
with test.nested(
mock.patch.object(mock_client, 'can_send_version',
side_effect=[False, False]),
side_effect=[False, False, False, False]),
mock.patch.object(mock_client, 'prepare',
return_value=cctxt_mock)
) as (
@ -590,7 +588,8 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
rpcapi.reserve_block_device_name(ctxt, instance, 'fake_device',
'fake_volume_id')
can_send_calls = [mock.call('4.20'), mock.call('4.15')]
can_send_calls = [mock.call('5.0'), mock.call('4.20'),
mock.call('4.15')]
can_send_mock.assert_has_calls(can_send_calls)
prepare_mock.assert_called_once_with(server=instance['host'],
version='4.0')
@ -624,7 +623,7 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
rpcapi.reserve_block_device_name, ctxt, instance,
'fake_device', 'fake_volume_id',
multiattach=True)
can_send_mock.assert_called_once_with('4.20')
can_send_mock.assert_has_calls([mock.call('5.0'), mock.call('4.20')])
def test_reserve_block_device_name_downgrades_version_multiattach(self):
"""Tests that if multiattach=False and the compute service is too
@ -640,7 +639,7 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
rpcapi.router.client.return_value = mock_client
with test.nested(
mock.patch.object(mock_client, 'can_send_version',
side_effect=[False, True]),
side_effect=[False, False, True]),
mock.patch.object(mock_client, 'prepare',
return_value=cctxt_mock)
) as (
@ -649,7 +648,8 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
rpcapi.reserve_block_device_name(
ctxt, instance, 'fake_device', 'fake_volume_id', tag='foo')
can_send_calls = [mock.call('4.20'), mock.call('4.15')]
can_send_calls = [mock.call('5.0'), mock.call('4.20'),
mock.call('4.15')]
can_send_mock.assert_has_calls(can_send_calls)
prepare_mock.assert_called_once_with(server=instance['host'],
version='4.15')
@ -662,7 +662,7 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
expected_args = {'instance': self.fake_instance_obj}
self._test_compute_api('refresh_instance_security_rules', 'cast',
expected_args, host='fake_host',
instance=self.fake_instance_obj, version='4.4')
instance=self.fake_instance_obj, version='5.0')
def test_remove_aggregate_host(self):
self._test_compute_api('remove_aggregate_host', 'cast',
@ -672,18 +672,18 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
def test_remove_fixed_ip_from_instance(self):
self._test_compute_api('remove_fixed_ip_from_instance', 'cast',
instance=self.fake_instance_obj, address='addr',
version='4.0')
version='5.0')
def test_remove_volume_connection(self):
self._test_compute_api('remove_volume_connection', 'call',
instance=self.fake_instance_obj, volume_id='id', host='host',
version='4.0')
version='5.0')
def test_rescue_instance(self):
self._test_compute_api('rescue_instance', 'cast',
instance=self.fake_instance_obj, rescue_password='pw',
rescue_image_ref='fake_image_ref',
clean_shutdown=True, version='4.0')
clean_shutdown=True, version='5.0')
def test_reset_network(self):
self._test_compute_api('reset_network', 'cast',
@ -693,14 +693,13 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
self._test_compute_api('resize_instance', 'cast',
instance=self.fake_instance_obj, migration={'id': 'fake_id'},
image='image', instance_type=self.fake_flavor_obj,
reservations=list('fake_res'),
clean_shutdown=True, version='4.1')
clean_shutdown=True, version='5.0')
self.flags(compute='4.0', group='upgrade_levels')
expected_args = {'instance_type': self.fake_flavor}
expected_args = {'instance_type': self.fake_flavor,
'reservations': None}
self._test_compute_api('resize_instance', 'cast', expected_args,
instance=self.fake_instance_obj, migration={'id': 'fake_id'},
image='image', instance_type=self.fake_flavor_obj,
reservations=list('fake_res'),
clean_shutdown=True, version='4.0')
def test_resume_instance(self):
@ -710,12 +709,12 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
def test_revert_resize(self):
self._test_compute_api('revert_resize', 'cast',
instance=self.fake_instance_obj, migration={'id': 'fake_id'},
host='host', reservations=list('fake_res'))
host='host')
def test_set_admin_password(self):
self._test_compute_api('set_admin_password', 'call',
instance=self.fake_instance_obj, new_pass='pw',
version='4.0')
version='5.0')
def test_set_host_enabled(self):
self._test_compute_api('set_host_enabled', 'call',
@ -740,12 +739,12 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
def test_stop_instance_cast(self):
self._test_compute_api('stop_instance', 'cast',
instance=self.fake_instance_obj,
clean_shutdown=True, version='4.0')
clean_shutdown=True, version='5.0')
def test_stop_instance_call(self):
self._test_compute_api('stop_instance', 'call',
instance=self.fake_instance_obj,
clean_shutdown=True, version='4.0')
clean_shutdown=True, version='5.0')
def test_suspend_instance(self):
self._test_compute_api('suspend_instance', 'cast',
@ -754,7 +753,7 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
def test_terminate_instance(self):
self._test_compute_api('terminate_instance', 'cast',
instance=self.fake_instance_obj, bdms=[],
reservations=['uuid1', 'uuid2'], version='4.0')
version='5.0')
def test_unpause_instance(self):
self._test_compute_api('unpause_instance', 'cast',
@ -762,39 +761,39 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
def test_unrescue_instance(self):
self._test_compute_api('unrescue_instance', 'cast',
instance=self.fake_instance_obj, version='4.0')
instance=self.fake_instance_obj, version='5.0')
def test_shelve_instance(self):
self._test_compute_api('shelve_instance', 'cast',
instance=self.fake_instance_obj, image_id='image_id',
clean_shutdown=True, version='4.0')
clean_shutdown=True, version='5.0')
def test_shelve_offload_instance(self):
self._test_compute_api('shelve_offload_instance', 'cast',
instance=self.fake_instance_obj,
clean_shutdown=True, version='4.0')
clean_shutdown=True, version='5.0')
def test_unshelve_instance(self):
self._test_compute_api('unshelve_instance', 'cast',
instance=self.fake_instance_obj, host='host', image='image',
filter_properties={'fakeprop': 'fakeval'}, node='node',
version='4.0')
version='5.0')
def test_volume_snapshot_create(self):
self._test_compute_api('volume_snapshot_create', 'cast',
instance=self.fake_instance_obj, volume_id='fake_id',
create_info={}, version='4.0')
create_info={}, version='5.0')
def test_volume_snapshot_delete(self):
self._test_compute_api('volume_snapshot_delete', 'cast',
instance=self.fake_instance_obj, volume_id='fake_id',
snapshot_id='fake_id2', delete_info={}, version='4.0')
snapshot_id='fake_id2', delete_info={}, version='5.0')
def test_external_instance_event(self):
self._test_compute_api('external_instance_event', 'cast',
instances=[self.fake_instance_obj],
events=['event'],
version='4.0')
version='5.0')
def test_build_and_run_instance(self):
self._test_compute_api('build_and_run_instance', 'cast',
@ -803,7 +802,7 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
admin_password='passwd', injected_files=None,
requested_networks=['network1'], security_groups=None,
block_device_mapping=None, node='node', limits=[],
host_list=None, version='4.19')
host_list=None, version='5.0')
def test_build_and_run_instance_4_18(self):
ctxt = context.RequestContext('fake_user', 'fake_project')
@ -849,22 +848,22 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
def test_quiesce_instance(self):
self._test_compute_api('quiesce_instance', 'call',
instance=self.fake_instance_obj, version='4.0')
instance=self.fake_instance_obj, version='5.0')
def test_unquiesce_instance(self):
self._test_compute_api('unquiesce_instance', 'cast',
instance=self.fake_instance_obj, mapping=None, version='4.0')
instance=self.fake_instance_obj, mapping=None, version='5.0')
def test_trigger_crash_dump(self):
self._test_compute_api('trigger_crash_dump', 'cast',
instance=self.fake_instance_obj, version='4.6')
instance=self.fake_instance_obj, version='5.0')
def test_trigger_crash_dump_incompatible(self):
self.flags(compute='4.0', group='upgrade_levels')
self.assertRaises(exception.TriggerCrashDumpNotSupported,
self._test_compute_api,
'trigger_crash_dump', 'cast',
instance=self.fake_instance_obj, version='4.6')
instance=self.fake_instance_obj, version='5.0')
def _test_simple_call(self, method, inargs, callargs, callret,
calltype='call', can_send=False):
@ -881,7 +880,7 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
ctxt = context.RequestContext()
result = getattr(rpc, method)(ctxt, **inargs)
call.assert_called_once_with(ctxt, method, **callargs)
rpc.router.client.assert_called_once_with(ctxt)
rpc.router.client.assert_called_with(ctxt)
return result
return _test()
@ -986,7 +985,7 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
calltype='cast')
def test_check_can_live_migrate_destination_old_compute(self):
self.flags(compute='4.10', group='upgrade_levels')
self.flags(compute='4.0', group='upgrade_levels')
self.assertRaises(exception.LiveMigrationWithOldNovaNotSupported,
self._test_compute_api,
'check_can_live_migrate_destination', 'call',

View File

@ -81,7 +81,7 @@ class MigrationTaskTestCase(test.NoDBTestCase):
selection = self.host_lists[0][0]
prep_resize_mock.assert_called_once_with(
self.context, self.instance, legacy_request_spec['image'],
self.flavor, selection.service_host, None, self.reservations,
self.flavor, selection.service_host, None,
request_spec=legacy_request_spec,
filter_properties=self.filter_properties, node=selection.nodename,
clean_shutdown=self.clean_shutdown, host_list=[])
@ -139,7 +139,7 @@ class MigrationTaskTestCase(test.NoDBTestCase):
prep_resize_mock.assert_called_once_with(
self.context, self.instance, legacy_request_spec['image'],
self.flavor, selection.service_host, task._migration,
self.reservations, request_spec=legacy_request_spec,
request_spec=legacy_request_spec,
filter_properties=self.filter_properties, node=selection.nodename,
clean_shutdown=self.clean_shutdown, host_list=[])
az_mock.assert_called_once_with(self.context, 'host1')

View File

@ -2397,7 +2397,7 @@ class ConductorTaskTestCase(_BaseTaskTestCase, test_compute.BaseTestCase):
[inst_obj.uuid], return_objects=True, return_alternates=True)
prep_resize_mock.assert_called_once_with(
self.context, inst_obj, legacy_request_spec['image'],
flavor, hosts[0]['host'], None, [resvs],
flavor, hosts[0]['host'], None,
request_spec=legacy_request_spec,
filter_properties=legacy_filter_props,
node=hosts[0]['nodename'], clean_shutdown=True, host_list=[])