except Exception, err: # pylint: disable=W0703
_Fail("Failed to get migration status: %s", err, exc=True)
+def HotAddDisk(instance, disk, dev_path, seq):
+ """Hot add a nic
+
+ """
+ hyper = hypervisor.GetHypervisor(instance.hypervisor)
+ return hyper.HotAddDisk(instance, disk, dev_path, seq)
+
+def HotDelDisk(instance, disk, seq):
+ """Hot add a nic
+
+ """
+ hyper = hypervisor.GetHypervisor(instance.hypervisor)
+ return hyper.HotDelDisk(instance, disk, seq)
+
+def HotAddNic(instance, nic, seq):
+ """Hot add a nic
+
+ """
+ hyper = hypervisor.GetHypervisor(instance.hypervisor)
+ return hyper.HotAddNic(instance, nic, seq)
+
+def HotDelNic(instance, nic, seq):
+ """Hot add a nic
+
+ """
+ hyper = hypervisor.GetHypervisor(instance.hypervisor)
+ return hyper.HotDelNic(instance, nic, seq)
+
def BlockdevCreate(disk, size, owner, on_primary, info):
"""Creates a block device for an instance.
import base64
import pycurl
import threading
+import copy
from ganeti import utils
from ganeti import objects
rpc_defs.ED_INST_DICT: self._InstDict,
rpc_defs.ED_INST_DICT_HVP_BEP: self._InstDictHvpBep,
rpc_defs.ED_INST_DICT_OSP_DP: self._InstDictOspDp,
+ rpc_defs.ED_NIC_DICT: self._NicDict,
# Encoders annotating disk parameters
rpc_defs.ED_DISKS_DICT_DP: self._DisksDictDP,
_generated_rpc.RpcClientDnsOnly.__init__(self)
_generated_rpc.RpcClientDefault.__init__(self)
+ def _NicDict(self, nic):
+ """Convert the given nic to a dict and encapsulate netinfo
+
+ """
+ n = copy.deepcopy(nic)
+ return n.ToDict()
+
def _InstDict(self, instance, hvp=None, bep=None, osp=None):
"""Convert the given instance to a dict.
ED_COMPRESS,
ED_BLOCKDEV_RENAME,
ED_DISKS_DICT_DP,
- ED_SINGLE_DISK_DICT_DP) = range(1, 14)
+ ED_SINGLE_DISK_DICT_DP,
+ ED_NIC_DICT) = range(1, 15)
def _Prepare(calls):
("reinstall", None, None),
("debug", None, None),
], None, None, "Starts an instance"),
+ ("hot_add_nic", SINGLE, None, TMO_NORMAL, [
+ ("instance", ED_INST_DICT, "Instance object"),
+ ("nic", ED_NIC_DICT, "Nic dict to hotplug"),
+ ("seq", None, "Nic seq to hotplug"),
+ ], None, None, "Adds a nic to a running instance"),
+ ("hot_del_nic", SINGLE, None, TMO_NORMAL, [
+ ("instance", ED_INST_DICT, "Instance object"),
+ ("nic", ED_NIC_DICT, "nic dict to remove"),
+ ("seq", None, "Nic seq to hotplug"),
+ ], None, None, "Removes a nic to a running instance"),
+ ("hot_add_disk", SINGLE, None, TMO_NORMAL, [
+ ("instance", ED_INST_DICT, "Instance object"),
+ ("disk", ED_OBJECT_DICT, "Disk dict to hotplug"),
+ ("dev_path", None, "Device path"),
+ ("seq", None, "Disk seq to hotplug"),
+ ], None, None, "Adds a nic to a running instance"),
+ ("hot_del_disk", SINGLE, None, TMO_NORMAL, [
+ ("instance", ED_INST_DICT, "Instance object"),
+ ("disk", ED_OBJECT_DICT, "Disk dict to remove"),
+ ("seq", None, "Disk seq to hotplug"),
+ ], None, None, "Removes a nic to a running instance"),
]
_IMPEXP_CALLS = [
return backend.StartInstance(instance, startup_paused)
@staticmethod
+ def perspective_hot_add_disk(params):
+ """Hotplugs a nic to a running instance.
+
+ """
+ (idict, ddict, dev_path, seq) = params
+ logging.info("%s %s", idict, ddict)
+ instance = objects.Instance.FromDict(idict)
+ disk = objects.Disk.FromDict(ddict)
+ return backend.HotAddDisk(instance, disk, dev_path, seq)
+
+ @staticmethod
+ def perspective_hot_del_disk(params):
+ """Hotplugs a nic to a running instance.
+
+ """
+ (idict, ddict, seq) = params
+ logging.info("%s %s", idict, ddict)
+ instance = objects.Instance.FromDict(idict)
+ disk = objects.Disk.FromDict(ddict)
+ return backend.HotDelDisk(instance, disk, seq)
+
+ @staticmethod
+ def perspective_hot_add_nic(params):
+ """Hotplugs a nic to a running instance.
+
+ """
+ (idict, ndict, seq) = params
+ logging.info("%s %s", idict, ndict)
+ instance = objects.Instance.FromDict(idict)
+ nic = objects.NIC.FromDict(ndict)
+ return backend.HotAddNic(instance, nic, seq)
+
+ @staticmethod
+ def perspective_hot_del_nic(params):
+ """Hotplugs a nic to a running instance.
+
+ """
+ (idict, ndict, seq) = params
+ logging.info("%s %s", idict, ndict)
+ instance = objects.Instance.FromDict(idict)
+ nic = objects.NIC.FromDict(ndict)
+ return backend.HotDelNic(instance, nic, seq)
+
+ @staticmethod
def perspective_migration_info(params):
"""Gather information about an instance to be migrated.