From fb926117f623a61776b90e992126f953679ca066 Mon Sep 17 00:00:00 2001 From: Andrea Spadaccini Date: Thu, 29 Sep 2011 19:48:18 +0100 Subject: [PATCH] Add gnt-cluster commands to toggle the master IP lib/client/gnt_cluster.py: * Add activate-master-ip and deactivate-master-ip commands man/gnt-cluster.rst: * Document the new commands lib/opcodes.py lib/cmdlib.py * Add two opcodes and the LU that call the relevant RPCs test/docs_unittest.py * Silence an error about RAPI not implemented for the two new opcodes Signed-off-by: Andrea Spadaccini Reviewed-by: Michael Hanselmann Reviewed-by: Guido Trotter --- lib/client/gnt_cluster.py | 31 +++++++++++++++++++++++++++++++ lib/cmdlib.py | 24 ++++++++++++++++++++++++ lib/opcodes.py | 12 ++++++++++++ man/gnt-cluster.rst | 19 +++++++++++++++++++ test/docs_unittest.py | 2 ++ 5 files changed, 88 insertions(+) diff --git a/lib/client/gnt_cluster.py b/lib/client/gnt_cluster.py index 5637774..f3ada54 100644 --- a/lib/client/gnt_cluster.py +++ b/lib/client/gnt_cluster.py @@ -223,6 +223,32 @@ def RenameCluster(opts, args): return 0 +def ActivateMasterIp(opts, args): + """Activates the master IP. + + """ + op = opcodes.OpClusterActivateMasterIp() + SubmitOpCode(op) + return 0 + + +def DeactivateMasterIp(opts, args): + """Deactivates the master IP. + + """ + if not opts.confirm: + usertext = ("This will disable the master IP. All the open connections to" + " the master IP will be closed. To reach the master you will" + " need to use its node IP." + " Continue?") + if not AskUser(usertext): + return 1 + + op = opcodes.OpClusterDeactivateMasterIp() + SubmitOpCode(op) + return 0 + + def RedistributeConfig(opts, args): """Forces push of the cluster configuration. @@ -1411,6 +1437,11 @@ commands = { SHUTDOWN_TIMEOUT_OPT, POWER_DELAY_OPT], "[opts...] [args]", "Performs an emergency power-off on given args"), + "activate-master-ip": ( + ActivateMasterIp, ARGS_NONE, [], "", "Activates the master IP"), + "deactivate-master-ip": ( + DeactivateMasterIp, ARGS_NONE, [CONFIRM_OPT], "", + "Deactivates the master IP"), } diff --git a/lib/cmdlib.py b/lib/cmdlib.py index 9a3231b..2b2409b 100644 --- a/lib/cmdlib.py +++ b/lib/cmdlib.py @@ -3797,6 +3797,30 @@ class LUClusterRedistConf(NoHooksLU): _RedistributeAncillaryFiles(self) +class LUClusterActivateMasterIp(NoHooksLU): + """Activate the master IP on the master node. + + """ + def Exec(self, feedback_fn): + """Activate the master IP. + + """ + master = self.cfg.GetMasterNode() + self.rpc.call_node_activate_master_ip(master) + + +class LUClusterDeactivateMasterIp(NoHooksLU): + """Deactivate the master IP on the master node. + + """ + def Exec(self, feedback_fn): + """Deactivate the master IP. + + """ + master = self.cfg.GetMasterNode() + self.rpc.call_node_deactivate_master_ip(master) + + def _WaitForSync(lu, instance, disks=None, oneshot=False): """Sleep and poll for an instance's disk to sync. diff --git a/lib/opcodes.py b/lib/opcodes.py index 6b2f187..6b90ce6 100644 --- a/lib/opcodes.py +++ b/lib/opcodes.py @@ -796,6 +796,18 @@ class OpClusterRedistConf(OpCode): """ +class OpClusterActivateMasterIp(OpCode): + """Activate the master IP on the master node. + + """ + + +class OpClusterDeactivateMasterIp(OpCode): + """Deactivate the master IP on the master node. + + """ + + class OpQuery(OpCode): """Query for resources/items. diff --git a/man/gnt-cluster.rst b/man/gnt-cluster.rst index 8851119..b9b26c9 100644 --- a/man/gnt-cluster.rst +++ b/man/gnt-cluster.rst @@ -20,6 +20,13 @@ Ganeti system. COMMANDS -------- +ACTIVATE-MASTER-IP +~~~~~~~~~~~~~~~~~~ + +**activate-master-ip** + +Activates the master IP on the master node. + ADD-TAGS ~~~~~~~~ @@ -89,6 +96,18 @@ primary/secondary IPs are different). Example:: This will copy the file /tmp/test from the current node to the two named nodes. +DEACTIVATE-MASTER-IP +~~~~~~~~~~~~~~~~~~~~ + +**deactivate-master-ip** [--yes] + +Deactivates the master IP on the master node. + +This should be run only locally or on a connection to the node ip +directly, as a connection to the master ip will be broken by this +operation. Because of this risk it will require user confirmation +unless the ``--yes`` option is passed. + DESTROY ~~~~~~~ diff --git a/test/docs_unittest.py b/test/docs_unittest.py index 0db111f..c437920 100755 --- a/test/docs_unittest.py +++ b/test/docs_unittest.py @@ -56,6 +56,8 @@ RAPI_OPCODE_EXCLUDE = frozenset([ opcodes.OpNodeQueryvols, opcodes.OpOobCommand, opcodes.OpTagsSearch, + opcodes.OpClusterActivateMasterIp, + opcodes.OpClusterDeactivateMasterIp, # Difficult if not impossible opcodes.OpClusterDestroy, -- 1.7.10.4