Allow resizes and migrates during live upgrade
This patch completes the changes needed to havana's compute rpc api to allow live upgrades to icehouse. Specifically, these changes are needed to allow resizes and migrates to work. Before havana compute nodes get put in a mixed environment with icehouse compute nodes, they need to be speaking version 3.0 messages. Change-Id: If09bd38c9d8c3beb5b95107c497699dec47aa3ef Closes-bug: #1258253
This commit is contained in:
parent
a7e2a4114a
commit
2c63cae921
|
@ -3181,8 +3181,10 @@
|
|||
# Options defined in nova.compute.rpcapi
|
||||
#
|
||||
|
||||
# Set a version cap for messages sent to compute services
|
||||
# (string value)
|
||||
# Set a version cap for messages sent to compute services. If
|
||||
# you plan to do a live upgrade from havana to icehouse, you
|
||||
# should set this option to "icehouse-compat" before beginning
|
||||
# the live upgrade procedure. (string value)
|
||||
#compute=<None>
|
||||
|
||||
|
||||
|
|
|
@ -36,7 +36,10 @@ CONF = cfg.CONF
|
|||
CONF.register_opts(rpcapi_opts)
|
||||
|
||||
rpcapi_cap_opt = cfg.StrOpt('compute',
|
||||
help='Set a version cap for messages sent to compute services')
|
||||
help='Set a version cap for messages sent to compute services. If you '
|
||||
'plan to do a live upgrade from havana to icehouse, you should '
|
||||
'set this option to "icehouse-compat" before beginning the live '
|
||||
'upgrade procedure.')
|
||||
CONF.register_opt(rpcapi_cap_opt, 'upgrade_levels')
|
||||
|
||||
|
||||
|
@ -59,6 +62,17 @@ def _compute_host(host, instance):
|
|||
return instance['host']
|
||||
|
||||
|
||||
def _get_version(version):
|
||||
# NOTE(russellb) If "[upgrade_levels] compute=icehouse-compat" is set in
|
||||
# the config, we switch into a special mode where we send 3.0 as the
|
||||
# version number instead of 2.latest. 3.0 == 2.latest, and both Havana
|
||||
# and Icehouse compute nodes support 3.0. This allows for a live
|
||||
# upgrade environment with a mix of Havana and Icehouse compute nodes.
|
||||
if CONF.upgrade_levels.compute == 'icehouse-compat':
|
||||
return ComputeAPI.VERSION_ALIASES['icehouse-compat']
|
||||
return version
|
||||
|
||||
|
||||
class ComputeAPI(rpcclient.RpcProxy):
|
||||
'''Client side of the compute rpc API.
|
||||
|
||||
|
@ -216,6 +230,7 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
|
||||
VERSION_ALIASES = {
|
||||
'grizzly': '2.27',
|
||||
'icehouse-compat': '3.0',
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
|
@ -240,14 +255,16 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
'''
|
||||
|
||||
aggregate_p = jsonutils.to_primitive(aggregate)
|
||||
cctxt = self.client.prepare(server=host, version='2.14')
|
||||
cctxt = self.client.prepare(server=host,
|
||||
version=_get_version('2.14'))
|
||||
cctxt.cast(ctxt, 'add_aggregate_host',
|
||||
aggregate=aggregate_p, host=host_param,
|
||||
slave_info=slave_info)
|
||||
|
||||
def add_fixed_ip_to_instance(self, ctxt, instance, network_id):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance))
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=_get_version('2.0'))
|
||||
cctxt.cast(ctxt, 'add_fixed_ip_to_instance',
|
||||
instance=instance_p, network_id=network_id)
|
||||
|
||||
|
@ -255,21 +272,23 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
requested_ip):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version='2.25')
|
||||
version=_get_version('2.25'))
|
||||
return cctxt.call(ctxt, 'attach_interface',
|
||||
instance=instance_p, network_id=network_id,
|
||||
port_id=port_id, requested_ip=requested_ip)
|
||||
|
||||
def attach_volume(self, ctxt, instance, volume_id, mountpoint):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance))
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=_get_version('2.0'))
|
||||
cctxt.cast(ctxt, 'attach_volume',
|
||||
instance=instance_p, volume_id=volume_id,
|
||||
mountpoint=mountpoint)
|
||||
|
||||
def change_instance_metadata(self, ctxt, instance, diff):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance))
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=_get_version('2.0'))
|
||||
cctxt.cast(ctxt, 'change_instance_metadata',
|
||||
instance=instance_p, diff=diff)
|
||||
|
||||
|
@ -281,7 +300,8 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
version = '2.0'
|
||||
instance = jsonutils.to_primitive(
|
||||
objects_base.obj_to_primitive(instance))
|
||||
cctxt = self.client.prepare(server=destination, version=version)
|
||||
cctxt = self.client.prepare(server=destination,
|
||||
version=_get_version(version))
|
||||
return cctxt.call(ctxt, 'check_can_live_migrate_destination',
|
||||
instance=instance,
|
||||
block_migration=block_migration,
|
||||
|
@ -295,7 +315,7 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
instance = jsonutils.to_primitive(
|
||||
objects_base.obj_to_primitive(instance))
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=version)
|
||||
version=_get_version(version))
|
||||
return cctxt.call(ctxt, 'check_can_live_migrate_source',
|
||||
instance=instance,
|
||||
dest_check_data=dest_check_data)
|
||||
|
@ -303,7 +323,7 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
def check_instance_shared_storage(self, ctxt, instance, data):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version='2.28')
|
||||
version=_get_version('2.28'))
|
||||
return cctxt.call(ctxt, 'check_instance_shared_storage',
|
||||
instance=instance_p,
|
||||
data=data)
|
||||
|
@ -319,7 +339,7 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
objects_base.obj_to_primitive(migration))
|
||||
version = '2.7'
|
||||
cctxt = self.client.prepare(server=_compute_host(host, instance),
|
||||
version=version)
|
||||
version=_get_version(version))
|
||||
rpc_method = cctxt.cast if cast else cctxt.call
|
||||
return rpc_method(ctxt, 'confirm_resize',
|
||||
instance=instance, migration=migration,
|
||||
|
@ -328,13 +348,14 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
def detach_interface(self, ctxt, instance, port_id):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version='2.25')
|
||||
version=_get_version('2.25'))
|
||||
cctxt.cast(ctxt, 'detach_interface',
|
||||
instance=instance_p, port_id=port_id)
|
||||
|
||||
def detach_volume(self, ctxt, instance, volume_id):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance))
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=_get_version('2.0'))
|
||||
cctxt.cast(ctxt, 'detach_volume',
|
||||
instance=instance_p, volume_id=volume_id)
|
||||
|
||||
|
@ -348,7 +369,8 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
migration = jsonutils.to_primitive(
|
||||
objects_base.obj_to_primitive(migration))
|
||||
version = '2.8'
|
||||
cctxt = self.client.prepare(server=host, version=version)
|
||||
cctxt = self.client.prepare(server=host,
|
||||
version=_get_version(version))
|
||||
cctxt.cast(ctxt, 'finish_resize',
|
||||
instance=instance, migration=migration,
|
||||
image=image, disk_info=disk_info, reservations=reservations)
|
||||
|
@ -363,49 +385,55 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
migration = jsonutils.to_primitive(
|
||||
objects_base.obj_to_primitive(migration))
|
||||
version = '2.13'
|
||||
cctxt = self.client.prepare(server=host, version=version)
|
||||
cctxt = self.client.prepare(server=host,
|
||||
version=_get_version(version))
|
||||
cctxt.cast(ctxt, 'finish_revert_resize',
|
||||
instance=instance, migration=migration,
|
||||
reservations=reservations)
|
||||
|
||||
def get_console_output(self, ctxt, instance, tail_length):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance))
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=_get_version('2.0'))
|
||||
return cctxt.call(ctxt, 'get_console_output',
|
||||
instance=instance_p, tail_length=tail_length)
|
||||
|
||||
def get_console_pool_info(self, ctxt, console_type, host):
|
||||
cctxt = self.client.prepare(server=host)
|
||||
cctxt = self.client.prepare(server=host,
|
||||
version=_get_version('2.0'))
|
||||
return cctxt.call(ctxt, 'get_console_pool_info',
|
||||
console_type=console_type)
|
||||
|
||||
def get_console_topic(self, ctxt, host):
|
||||
cctxt = self.client.prepare(server=host)
|
||||
cctxt = self.client.prepare(server=host,
|
||||
version=_get_version('2.0'))
|
||||
return cctxt.call(ctxt, 'get_console_topic')
|
||||
|
||||
def get_diagnostics(self, ctxt, instance):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance))
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=_get_version('2.0'))
|
||||
return cctxt.call(ctxt, 'get_diagnostics',
|
||||
instance=instance_p)
|
||||
|
||||
def get_vnc_console(self, ctxt, instance, console_type):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance))
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=_get_version('2.0'))
|
||||
return cctxt.call(ctxt, 'get_vnc_console',
|
||||
instance=instance_p, console_type=console_type)
|
||||
|
||||
def get_spice_console(self, ctxt, instance, console_type):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version='2.24')
|
||||
version=_get_version('2.24'))
|
||||
return cctxt.call(ctxt, 'get_spice_console',
|
||||
instance=instance_p, console_type=console_type)
|
||||
|
||||
def validate_console_port(self, ctxt, instance, port, console_type):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version='2.26')
|
||||
version=_get_version('2.26'))
|
||||
return cctxt.call(ctxt, 'validate_console_port',
|
||||
instance=instance_p, port=port,
|
||||
console_type=console_type)
|
||||
|
@ -419,17 +447,20 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
:param mode:
|
||||
:param host: This is the host to send the message to.
|
||||
'''
|
||||
cctxt = self.client.prepare(server=host)
|
||||
cctxt = self.client.prepare(server=host,
|
||||
version=_get_version('2.0'))
|
||||
return cctxt.call(ctxt, 'host_maintenance_mode',
|
||||
host=host_param, mode=mode)
|
||||
|
||||
def host_power_action(self, ctxt, action, host):
|
||||
cctxt = self.client.prepare(server=host)
|
||||
cctxt = self.client.prepare(server=host,
|
||||
version=_get_version('2.0'))
|
||||
return cctxt.call(ctxt, 'host_power_action', action=action)
|
||||
|
||||
def inject_file(self, ctxt, instance, path, file_contents):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance))
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=_get_version('2.0'))
|
||||
cctxt.cast(ctxt, 'inject_file',
|
||||
instance=instance_p, path=path,
|
||||
file_contents=file_contents)
|
||||
|
@ -442,13 +473,14 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
objects_base.obj_to_primitive(instance))
|
||||
version = '2.0'
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=version)
|
||||
version=_get_version(version))
|
||||
cctxt.cast(ctxt, 'inject_network_info', instance=instance)
|
||||
|
||||
def live_migration(self, ctxt, instance, dest, block_migration, host,
|
||||
migrate_data=None):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=host)
|
||||
cctxt = self.client.prepare(server=host,
|
||||
version=_get_version('2.0'))
|
||||
cctxt.cast(ctxt, 'live_migration', instance=instance_p,
|
||||
dest=dest, block_migration=block_migration,
|
||||
migrate_data=migrate_data)
|
||||
|
@ -461,31 +493,35 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
instance = jsonutils.to_primitive(
|
||||
objects_base.obj_to_primitive(instance))
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=version)
|
||||
version=_get_version(version))
|
||||
cctxt.cast(ctxt, 'pause_instance', instance=instance)
|
||||
|
||||
def post_live_migration_at_destination(self, ctxt, instance,
|
||||
block_migration, host):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=host)
|
||||
cctxt = self.client.prepare(server=host,
|
||||
version=_get_version('2.0'))
|
||||
return cctxt.call(ctxt,
|
||||
'post_live_migration_at_destination',
|
||||
instance=instance_p, block_migration=block_migration)
|
||||
|
||||
def power_off_instance(self, ctxt, instance):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance))
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=_get_version('2.0'))
|
||||
cctxt.cast(ctxt, 'power_off_instance', instance=instance_p)
|
||||
|
||||
def power_on_instance(self, ctxt, instance):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance))
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=_get_version('2.0'))
|
||||
cctxt.cast(ctxt, 'power_on_instance', instance=instance_p)
|
||||
|
||||
def pre_live_migration(self, ctxt, instance, block_migration, disk,
|
||||
host, migrate_data=None):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=host, version='2.21')
|
||||
cctxt = self.client.prepare(server=host,
|
||||
version=_get_version('2.21'))
|
||||
return cctxt.call(ctxt, 'pre_live_migration',
|
||||
instance=instance_p,
|
||||
block_migration=block_migration,
|
||||
|
@ -502,7 +538,8 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
version = '2.20'
|
||||
instance_type_p = jsonutils.to_primitive(instance_type)
|
||||
image_p = jsonutils.to_primitive(image)
|
||||
cctxt = self.client.prepare(server=host, version=version)
|
||||
cctxt = self.client.prepare(server=host,
|
||||
version=_get_version(version))
|
||||
cctxt.cast(ctxt, 'prep_resize',
|
||||
instance=instance,
|
||||
instance_type=instance_type_p,
|
||||
|
@ -520,7 +557,7 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
else:
|
||||
version = '2.32'
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=version)
|
||||
version=_get_version(version))
|
||||
cctxt.cast(ctxt, 'reboot_instance',
|
||||
instance=instance,
|
||||
block_device_info=block_device_info,
|
||||
|
@ -532,7 +569,7 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
instance_p = jsonutils.to_primitive(instance)
|
||||
bdms_p = jsonutils.to_primitive(bdms)
|
||||
cctxt = self.client.prepare(server=_compute_host(host, instance),
|
||||
version='2.22')
|
||||
version=_get_version('2.22'))
|
||||
cctxt.cast(ctxt, 'rebuild_instance',
|
||||
instance=instance_p, new_pass=new_pass,
|
||||
injected_files=injected_files, image_ref=image_ref,
|
||||
|
@ -541,7 +578,8 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
recreate=recreate, on_shared_storage=on_shared_storage)
|
||||
|
||||
def refresh_provider_fw_rules(self, ctxt, host):
|
||||
cctxt = self.client.prepare(server=host)
|
||||
cctxt = self.client.prepare(server=host,
|
||||
version=_get_version('2.0'))
|
||||
cctxt.cast(ctxt, 'refresh_provider_fw_rules')
|
||||
|
||||
def remove_aggregate_host(self, ctxt, aggregate, host_param, host,
|
||||
|
@ -556,26 +594,30 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
'''
|
||||
|
||||
aggregate_p = jsonutils.to_primitive(aggregate)
|
||||
cctxt = self.client.prepare(server=host, version='2.15')
|
||||
cctxt = self.client.prepare(server=host,
|
||||
version=_get_version('2.15'))
|
||||
cctxt.cast(ctxt, 'remove_aggregate_host',
|
||||
aggregate=aggregate_p, host=host_param,
|
||||
slave_info=slave_info)
|
||||
|
||||
def remove_fixed_ip_from_instance(self, ctxt, instance, address):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance))
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=_get_version('2.0'))
|
||||
cctxt.cast(ctxt, 'remove_fixed_ip_from_instance',
|
||||
instance=instance_p, address=address)
|
||||
|
||||
def remove_volume_connection(self, ctxt, instance, volume_id, host):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=host)
|
||||
cctxt = self.client.prepare(server=host,
|
||||
version=_get_version('2.0'))
|
||||
return cctxt.call(ctxt, 'remove_volume_connection',
|
||||
instance=instance_p, volume_id=volume_id)
|
||||
|
||||
def rescue_instance(self, ctxt, instance, rescue_password):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance))
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=_get_version('2.0'))
|
||||
cctxt.cast(ctxt, 'rescue_instance',
|
||||
instance=instance_p,
|
||||
rescue_password=rescue_password)
|
||||
|
@ -588,7 +630,7 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
objects_base.obj_to_primitive(instance))
|
||||
version = '2.0'
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=version)
|
||||
version=_get_version(version))
|
||||
cctxt.cast(ctxt, 'reset_network', instance=instance)
|
||||
|
||||
def resize_instance(self, ctxt, instance, migration, image, instance_type,
|
||||
|
@ -603,7 +645,7 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
version = '2.16'
|
||||
instance_type_p = jsonutils.to_primitive(instance_type)
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=version)
|
||||
version=_get_version(version))
|
||||
cctxt.cast(ctxt, 'resize_instance',
|
||||
instance=instance, migration=migration,
|
||||
image=image, reservations=reservations,
|
||||
|
@ -617,7 +659,7 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
instance = jsonutils.to_primitive(
|
||||
objects_base.obj_to_primitive(instance))
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=version)
|
||||
version=_get_version(version))
|
||||
cctxt.cast(ctxt, 'resume_instance', instance=instance)
|
||||
|
||||
def revert_resize(self, ctxt, instance, migration, host,
|
||||
|
@ -631,14 +673,15 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
objects_base.obj_to_primitive(migration))
|
||||
version = '2.12'
|
||||
cctxt = self.client.prepare(server=_compute_host(host, instance),
|
||||
version=version)
|
||||
version=_get_version(version))
|
||||
cctxt.cast(ctxt, 'revert_resize',
|
||||
instance=instance, migration=migration,
|
||||
reservations=reservations)
|
||||
|
||||
def rollback_live_migration_at_destination(self, ctxt, instance, host):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=host)
|
||||
cctxt = self.client.prepare(server=host,
|
||||
version=_get_version('2.0'))
|
||||
cctxt.cast(ctxt, 'rollback_live_migration_at_destination',
|
||||
instance=instance_p)
|
||||
|
||||
|
@ -659,34 +702,38 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
msg_kwargs['legacy_bdm_in_spec'] = legacy_bdm_in_spec
|
||||
else:
|
||||
version = '2.19'
|
||||
cctxt = self.client.prepare(server=host, version=version)
|
||||
cctxt = self.client.prepare(server=host,
|
||||
version=_get_version(version))
|
||||
cctxt.cast(ctxt, 'run_instance', **msg_kwargs)
|
||||
|
||||
def set_admin_password(self, ctxt, instance, new_pass):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance))
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=_get_version('2.0'))
|
||||
return cctxt.call(ctxt, 'set_admin_password',
|
||||
instance=instance_p, new_pass=new_pass)
|
||||
|
||||
def set_host_enabled(self, ctxt, enabled, host):
|
||||
cctxt = self.client.prepare(server=host)
|
||||
cctxt = self.client.prepare(server=host,
|
||||
version=_get_version('2.0'))
|
||||
return cctxt.call(ctxt, 'set_host_enabled', enabled=enabled)
|
||||
|
||||
def swap_volume(self, ctxt, instance, old_volume_id, new_volume_id):
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version='2.34')
|
||||
version=_get_version('2.34'))
|
||||
cctxt.cast(ctxt, 'swap_volume',
|
||||
instance=instance, old_volume_id=old_volume_id,
|
||||
new_volume_id=new_volume_id)
|
||||
|
||||
def get_host_uptime(self, ctxt, host):
|
||||
cctxt = self.client.prepare(server=host)
|
||||
cctxt = self.client.prepare(server=host,
|
||||
version=_get_version('2.0'))
|
||||
return cctxt.call(ctxt, 'get_host_uptime')
|
||||
|
||||
def reserve_block_device_name(self, ctxt, instance, device, volume_id):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version='2.3')
|
||||
version=_get_version('2.3'))
|
||||
return cctxt.call(ctxt, 'reserve_block_device_name',
|
||||
instance=instance_p, device=device,
|
||||
volume_id=volume_id)
|
||||
|
@ -694,7 +741,7 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
def live_snapshot_instance(self, ctxt, instance, image_id):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version='2.30')
|
||||
version=_get_version('2.30'))
|
||||
cctxt.cast(ctxt, 'live_snapshot_instance',
|
||||
instance=instance_p, image_id=image_id)
|
||||
|
||||
|
@ -711,7 +758,7 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
extra_kwargs = dict(image_type='backup')
|
||||
version = '2.0'
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=version)
|
||||
version=_get_version(version))
|
||||
cctxt.cast(ctxt, method,
|
||||
instance=instance,
|
||||
image_id=image_id,
|
||||
|
@ -731,7 +778,7 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
rotation=None)
|
||||
version = '2.0'
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=version)
|
||||
version=_get_version(version))
|
||||
cctxt.cast(ctxt, 'snapshot_instance',
|
||||
instance=instance,
|
||||
image_id=image_id,
|
||||
|
@ -745,7 +792,7 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
instance = jsonutils.to_primitive(
|
||||
objects_base.obj_to_primitive(instance))
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=version)
|
||||
version=_get_version(version))
|
||||
cctxt.cast(ctxt, 'start_instance', instance=instance)
|
||||
|
||||
def stop_instance(self, ctxt, instance, do_cast=True):
|
||||
|
@ -756,7 +803,7 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
instance = jsonutils.to_primitive(
|
||||
objects_base.obj_to_primitive(instance))
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=version)
|
||||
version=_get_version(version))
|
||||
rpc_method = cctxt.cast if do_cast else cctxt.call
|
||||
return rpc_method(ctxt, 'stop_instance', instance=instance)
|
||||
|
||||
|
@ -768,7 +815,7 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
instance = jsonutils.to_primitive(
|
||||
objects_base.obj_to_primitive(instance))
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=version)
|
||||
version=_get_version(version))
|
||||
cctxt.cast(ctxt, 'suspend_instance', instance=instance)
|
||||
|
||||
def terminate_instance(self, ctxt, instance, bdms, reservations=None):
|
||||
|
@ -779,7 +826,7 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
instance = jsonutils.to_primitive(instance)
|
||||
bdms_p = jsonutils.to_primitive(bdms)
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=version)
|
||||
version=_get_version(version))
|
||||
cctxt.cast(ctxt, 'terminate_instance',
|
||||
instance=instance, bdms=bdms_p,
|
||||
reservations=reservations)
|
||||
|
@ -792,12 +839,13 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
instance = jsonutils.to_primitive(
|
||||
objects_base.obj_to_primitive(instance))
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=version)
|
||||
version=_get_version(version))
|
||||
cctxt.cast(ctxt, 'unpause_instance', instance=instance)
|
||||
|
||||
def unrescue_instance(self, ctxt, instance):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance))
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=_get_version('2.0'))
|
||||
cctxt.cast(ctxt, 'unrescue_instance', instance=instance_p)
|
||||
|
||||
def soft_delete_instance(self, ctxt, instance, reservations=None):
|
||||
|
@ -807,28 +855,30 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
version = '2.27'
|
||||
instance = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=version)
|
||||
version=_get_version(version))
|
||||
cctxt.cast(ctxt, 'soft_delete_instance',
|
||||
instance=instance, reservations=reservations)
|
||||
|
||||
def restore_instance(self, ctxt, instance):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance))
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=_get_version('2.0'))
|
||||
cctxt.cast(ctxt, 'restore_instance', instance=instance_p)
|
||||
|
||||
def shelve_instance(self, ctxt, instance, image_id=None):
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version='2.31')
|
||||
version=_get_version('2.31'))
|
||||
cctxt.cast(ctxt, 'shelve_instance',
|
||||
instance=instance, image_id=image_id)
|
||||
|
||||
def shelve_offload_instance(self, ctxt, instance):
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version='2.31')
|
||||
version=_get_version('2.31'))
|
||||
cctxt.cast(ctxt, 'shelve_offload_instance', instance=instance)
|
||||
|
||||
def unshelve_instance(self, ctxt, instance, host, image=None):
|
||||
cctxt = self.client.prepare(server=host, version='2.31')
|
||||
cctxt = self.client.prepare(server=host,
|
||||
version=_get_version('2.31'))
|
||||
cctxt.cast(ctxt, 'unshelve_instance',
|
||||
instance=instance, image=image)
|
||||
|
||||
|
@ -836,7 +886,7 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
create_info):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version='2.44')
|
||||
version=_get_version('2.44'))
|
||||
cctxt.cast(ctxt, 'volume_snapshot_create', instance=instance_p,
|
||||
volume_id=volume_id, create_info=create_info)
|
||||
|
||||
|
@ -844,7 +894,7 @@ class ComputeAPI(rpcclient.RpcProxy):
|
|||
delete_info):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version='2.44')
|
||||
version=_get_version('2.44'))
|
||||
cctxt.cast(ctxt, 'volume_snapshot_delete', instance=instance_p,
|
||||
volume_id=volume_id, snapshot_id=snapshot_id,
|
||||
delete_info=delete_info)
|
||||
|
@ -878,18 +928,21 @@ class SecurityGroupAPI(rpcclient.RpcProxy):
|
|||
self.client = self.get_client()
|
||||
|
||||
def refresh_security_group_rules(self, ctxt, security_group_id, host):
|
||||
cctxt = self.client.prepare(server=host)
|
||||
cctxt = self.client.prepare(server=host,
|
||||
version=_get_version('2.0'))
|
||||
cctxt.cast(ctxt, 'refresh_security_group_rules',
|
||||
security_group_id=security_group_id)
|
||||
|
||||
def refresh_security_group_members(self, ctxt, security_group_id,
|
||||
host):
|
||||
cctxt = self.client.prepare(server=host)
|
||||
cctxt = self.client.prepare(server=host,
|
||||
version=_get_version('2.0'))
|
||||
cctxt.cast(ctxt, 'refresh_security_group_members',
|
||||
security_group_id=security_group_id)
|
||||
|
||||
def refresh_instance_security_rules(self, ctxt, host, instance):
|
||||
instance_p = jsonutils.to_primitive(instance)
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance))
|
||||
cctxt = self.client.prepare(server=_compute_host(None, instance),
|
||||
version=_get_version('2.0'))
|
||||
cctxt.cast(ctxt, 'refresh_instance_security_rules',
|
||||
instance=instance_p)
|
||||
|
|
|
@ -431,3 +431,10 @@ class ComputeRpcAPITestCase(test.TestCase):
|
|||
self._test_compute_api('volume_snapshot_delete', 'cast',
|
||||
instance=self.fake_instance, volume_id='fake_id',
|
||||
snapshot_id='fake_id2', delete_info={}, version='2.44')
|
||||
|
||||
def test_get_version(self):
|
||||
self.assertEqual(compute_rpcapi._get_version('2.0'), '2.0')
|
||||
self.flags(compute='grizzly', group='upgrade_levels')
|
||||
self.assertEqual(compute_rpcapi._get_version('2.0'), '2.0')
|
||||
self.flags(compute='icehouse-compat', group='upgrade_levels')
|
||||
self.assertEqual(compute_rpcapi._get_version('2.0'), '3.0')
|
||||
|
|
Loading…
Reference in New Issue