From: Dimitris Aragiorgis Date: Fri, 12 Jul 2013 12:33:48 +0000 (+0300) Subject: Hotplug: client support X-Git-Tag: debian/2.8.2+snapshot1+b64v1+hotplug+ippoolfix+rapifix-1wheezy~1^2~17 X-Git-Url: https://code.grnet.gr/git/ganeti-local/commitdiff_plain/5b0ec49463b063d238e70b2f3110b9c7eb071ecf Hotplug: client support Add --hotplug option. Only used in OpInstanceSetParams. If this is omitted, modifications become effective after reboot. Ask user confirmation in case NIC modify + hotplug because it will be done via removing old NIC (and the corresponding tap) and adding a new one in the same PCI slot. Corresponding mods in haskell opcode definitions. Signed-off-by: Dimitris Aragiorgis --- diff --git a/lib/cli.py b/lib/cli.py index a265c26..723b221 100644 --- a/lib/cli.py +++ b/lib/cli.py @@ -95,6 +95,7 @@ __all__ = [ "GLOBAL_FILEDIR_OPT", "HID_OS_OPT", "GLOBAL_SHARED_FILEDIR_OPT", + "HOTPLUG_OPT", "HVLIST_OPT", "HVOPTS_OPT", "HYPERVISOR_OPT", @@ -1638,6 +1639,10 @@ INCLUDEDEFAULTS_OPT = cli_option("--include-defaults", dest="include_defaults", default=False, action="store_true", help="Include default values") +HOTPLUG_OPT = cli_option("--hotplug", dest="hotplug", + action="store_true", default=False, + help="Try to hotplug device") + #: Options provided by all commands COMMON_OPTS = [DEBUG_OPT, REASON_OPT] diff --git a/lib/client/gnt_instance.py b/lib/client/gnt_instance.py index 8ee9ca9..6aae105 100644 --- a/lib/client/gnt_instance.py +++ b/lib/client/gnt_instance.py @@ -1313,6 +1313,14 @@ def SetInstanceParams(opts, args): allowed_values=[constants.VALUE_DEFAULT]) nics = _ConvertNicDiskModifications(opts.nics) + for action, _, __ in nics: + if action == constants.DDM_MODIFY and opts.hotplug: + usertext = ("You are about to hot-modify a NIC. This will be done" + " by removing the exisiting and then adding a new one." + " Network connection might be lost. Continue?") + if not AskUser(usertext): + return 1 + disks = _ParseDiskSizes(_ConvertNicDiskModifications(opts.disks)) if (opts.disk_template and @@ -1332,6 +1340,7 @@ def SetInstanceParams(opts, args): op = opcodes.OpInstanceSetParams(instance_name=args[0], nics=nics, disks=disks, + hotplug=opts.hotplug, disk_template=opts.disk_template, remote_node=opts.node, pnode=opts.new_primary_node, @@ -1354,10 +1363,11 @@ def SetInstanceParams(opts, args): ToStdout("Modified instance %s", args[0]) for param, data in result: ToStdout(" - %-5s -> %s", param, data) - ToStdout("Please don't forget that most parameters take effect" - " only at the next (re)start of the instance initiated by" - " ganeti; restarting from within the instance will" - " not be enough.") + if not opts.hotplug: + ToStdout("Please don't forget that most parameters take effect" + " only at the next (re)start of the instance initiated by" + " ganeti; restarting from within the instance will" + " not be enough.") return 0 @@ -1535,7 +1545,7 @@ commands = { DISK_TEMPLATE_OPT, SINGLE_NODE_OPT, OS_OPT, FORCE_VARIANT_OPT, OSPARAMS_OPT, DRY_RUN_OPT, PRIORITY_OPT, NWSYNC_OPT, OFFLINE_INST_OPT, ONLINE_INST_OPT, IGNORE_IPOLICY_OPT, RUNTIME_MEM_OPT, - NOCONFLICTSCHECK_OPT, NEW_PRIMARY_OPT], + NOCONFLICTSCHECK_OPT, NEW_PRIMARY_OPT, HOTPLUG_OPT], "", "Alters the parameters of an instance"), "shutdown": ( GenericManyOps("shutdown", _ShutdownInstance), [ArgInstance()], diff --git a/src/Ganeti/OpCodes.hs b/src/Ganeti/OpCodes.hs index edcdcd1..5fa0932 100644 --- a/src/Ganeti/OpCodes.hs +++ b/src/Ganeti/OpCodes.hs @@ -397,6 +397,7 @@ $(genOpCode "OpCode" , pWaitForSync , pOffline , pIpConflictsCheck + , pHotplug ]) , ("OpInstanceGrowDisk", [ pInstanceName diff --git a/src/Ganeti/OpParams.hs b/src/Ganeti/OpParams.hs index a1e445c..ba56d5f 100644 --- a/src/Ganeti/OpParams.hs +++ b/src/Ganeti/OpParams.hs @@ -94,6 +94,7 @@ module Ganeti.OpParams , pHvState , pDiskState , pIgnoreIpolicy + , pHotplug , pAllowRuntimeChgs , pInstDisks , pDiskTemplate @@ -702,6 +703,10 @@ pDiskParams = optionalField $ simpleField "diskparams" [t| GenericContainer DiskTemplate UncheckedDict |] +-- | Whether to hotplug device. +pHotplug :: Field +pHotplug = defaultFalse "hotplug" + -- * Parameters for node resource model -- | Set hypervisor states. diff --git a/test/hs/Test/Ganeti/OpCodes.hs b/test/hs/Test/Ganeti/OpCodes.hs index 494563f..2bdfc0f 100644 --- a/test/hs/Test/Ganeti/OpCodes.hs +++ b/test/hs/Test/Ganeti/OpCodes.hs @@ -264,7 +264,7 @@ instance Arbitrary OpCodes.OpCode where pure emptyJSObject <*> arbitrary <*> pure emptyJSObject <*> arbitrary <*> genMaybe genNodeNameNE <*> genMaybe genNodeNameNE <*> genMaybe genNameNE <*> pure emptyJSObject <*> arbitrary <*> - arbitrary <*> arbitrary + arbitrary <*> arbitrary <*> arbitrary "OP_INSTANCE_GROW_DISK" -> OpCodes.OpInstanceGrowDisk <$> genFQDN <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary