- # Caller provided an address list
- resolver = _StaticResolver(address_list)
-
- proc = _RpcProcessor(resolver,
- netutils.GetDaemonPort(constants.NODED))
- return proc(node_list, procedure, body, read_timeout=read_timeout)
-
- def _SingleNodeCall(self, node, procedure, args, read_timeout=None):
- """Helper for making a single-node call
-
- """
- body = serializer.DumpJson(args, indent=False)
- return self._proc([node], procedure, body, read_timeout=read_timeout)[node]
-
- @classmethod
- def _StaticSingleNodeCall(cls, node, procedure, args, read_timeout=None):
- """Helper for making a single-node static call
-
- """
- body = serializer.DumpJson(args, indent=False)
- proc = _RpcProcessor(_SsconfResolver,
- netutils.GetDaemonPort(constants.NODED))
- return proc([node], procedure, body, read_timeout=read_timeout)[node]
-
- #
- # Begin RPC calls
- #
-
- @_RpcTimeout(_TMO_URGENT)
- def call_bdev_sizes(self, node_list, devices):
- """Gets the sizes of requested block devices present on a node
-
- This is a multi-node call.
-
- """
- return self._MultiNodeCall(node_list, "bdev_sizes", [devices])
-
- @_RpcTimeout(_TMO_URGENT)
- def call_lv_list(self, node_list, vg_name):
- """Gets the logical volumes present in a given volume group.
-
- This is a multi-node call.
-
- """
- return self._MultiNodeCall(node_list, "lv_list", [vg_name])
-
- @_RpcTimeout(_TMO_URGENT)
- def call_vg_list(self, node_list):
- """Gets the volume group list.
-
- This is a multi-node call.
-
- """
- return self._MultiNodeCall(node_list, "vg_list", [])
-
- @_RpcTimeout(_TMO_NORMAL)
- def call_storage_list(self, node_list, su_name, su_args, name, fields):
- """Get list of storage units.
-
- This is a multi-node call.
-
- """
- return self._MultiNodeCall(node_list, "storage_list",
- [su_name, su_args, name, fields])
-
- @_RpcTimeout(_TMO_NORMAL)
- def call_storage_modify(self, node, su_name, su_args, name, changes):
- """Modify a storage unit.
-
- This is a single-node call.
-
- """
- return self._SingleNodeCall(node, "storage_modify",
- [su_name, su_args, name, changes])
-
- @_RpcTimeout(_TMO_NORMAL)
- def call_storage_execute(self, node, su_name, su_args, name, op):
- """Executes an operation on a storage unit.
-
- This is a single-node call.
-
- """
- return self._SingleNodeCall(node, "storage_execute",
- [su_name, su_args, name, op])
-
- @_RpcTimeout(_TMO_URGENT)
- def call_bridges_exist(self, node, bridges_list):
- """Checks if a node has all the bridges given.
-
- This method checks if all bridges given in the bridges_list are
- present on the remote node, so that an instance that uses interfaces
- on those bridges can be started.
-
- This is a single-node call.
-
- """
- return self._SingleNodeCall(node, "bridges_exist", [bridges_list])
-
- @_RpcTimeout(_TMO_NORMAL)
- def call_instance_start(self, node, instance, hvp, bep, startup_paused):
- """Starts an instance.
-
- This is a single-node call.
-
- """
- idict = self._InstDict(instance, hvp=hvp, bep=bep)
- return self._SingleNodeCall(node, "instance_start", [idict, startup_paused])
-
- @_RpcTimeout(_TMO_NORMAL)
- def call_instance_shutdown(self, node, instance, timeout):
- """Stops an instance.
-
- This is a single-node call.
-
- """
- return self._SingleNodeCall(node, "instance_shutdown",
- [self._InstDict(instance), timeout])
-
- @_RpcTimeout(_TMO_NORMAL)
- def call_migration_info(self, node, instance):
- """Gather the information necessary to prepare an instance migration.
-
- This is a single-node call.
-
- @type node: string
- @param node: the node on which the instance is currently running
- @type instance: C{objects.Instance}
- @param instance: the instance definition
-
- """
- return self._SingleNodeCall(node, "migration_info",
- [self._InstDict(instance)])
-
- @_RpcTimeout(_TMO_NORMAL)
- def call_accept_instance(self, node, instance, info, target):
- """Prepare a node to accept an instance.
-
- This is a single-node call.
-
- @type node: string
- @param node: the target node for the migration
- @type instance: C{objects.Instance}
- @param instance: the instance definition
- @type info: opaque/hypervisor specific (string/data)
- @param info: result for the call_migration_info call
- @type target: string
- @param target: target hostname (usually ip address) (on the node itself)
-
- """
- return self._SingleNodeCall(node, "accept_instance",
- [self._InstDict(instance), info, target])
-
- @_RpcTimeout(_TMO_NORMAL)
- def call_instance_finalize_migration_dst(self, node, instance, info, success):
- """Finalize any target-node migration specific operation.
-
- This is called both in case of a successful migration and in case of error
- (in which case it should abort the migration).
-
- This is a single-node call.
-
- @type node: string
- @param node: the target node for the migration
- @type instance: C{objects.Instance}
- @param instance: the instance definition
- @type info: opaque/hypervisor specific (string/data)
- @param info: result for the call_migration_info call
- @type success: boolean
- @param success: whether the migration was a success or a failure
-
- """
- return self._SingleNodeCall(node, "instance_finalize_migration_dst",
- [self._InstDict(instance), info, success])
-
- @_RpcTimeout(_TMO_SLOW)
- def call_instance_migrate(self, node, instance, target, live):
- """Migrate an instance.
-
- This is a single-node call.
-
- @type node: string
- @param node: the node on which the instance is currently running
- @type instance: C{objects.Instance}
- @param instance: the instance definition
- @type target: string
- @param target: the target node name
- @type live: boolean
- @param live: whether the migration should be done live or not (the
- interpretation of this parameter is left to the hypervisor)
-
- """
- return self._SingleNodeCall(node, "instance_migrate",
- [self._InstDict(instance), target, live])
-
- @_RpcTimeout(_TMO_SLOW)
- def call_instance_finalize_migration_src(self, node, instance, success, live):
- """Finalize the instance migration on the source node.
-
- This is a single-node call.
-
- @type instance: L{objects.Instance}
- @param instance: the instance that was migrated
- @type success: bool
- @param success: whether the migration succeeded or not
- @type live: bool
- @param live: whether the user requested a live migration or not
-
- """
- return self._SingleNodeCall(node, "instance_finalize_migration_src",
- [self._InstDict(instance), success, live])
-
- @_RpcTimeout(_TMO_SLOW)
- def call_instance_get_migration_status(self, node, instance):
- """Report migration status.
-
- This is a single-node call that must be executed on the source node.
-
- @type instance: L{objects.Instance}
- @param instance: the instance that is being migrated
- @rtype: L{objects.MigrationStatus}
- @return: the status of the current migration (one of
- L{constants.HV_MIGRATION_VALID_STATUSES}), plus any additional
- progress info that can be retrieved from the hypervisor
-
- """
- result = self._SingleNodeCall(node, "instance_get_migration_status",
- [self._InstDict(instance)])
- if not result.fail_msg and result.payload is not None:
- result.payload = objects.MigrationStatus.FromDict(result.payload)
- return result
-
- @_RpcTimeout(_TMO_NORMAL)
- def call_instance_reboot(self, node, inst, reboot_type, shutdown_timeout):
- """Reboots an instance.