This extends 'gnt-instance reinstall' to support '--clear-os-parameters' and '--clear-os-parameters-private' options from 'gnt-instance modify'. E.g.:
$ gnt-instance reinstall --clear-os-parameters -o <new_os_provider> \ -O param1=val1,param2=val2 <instance_name> or $ gnt-instance reinstall --clear-os-parameters-private \ -o <new_os_provider> -O param1=val1,param2=val2 <instance_name> Signed-off-by: Yiannis Tsiouris <ts...@grnet.gr> --- lib/client/gnt_instance.py | 9 +++++++-- lib/cmdlib/instance_operation.py | 6 ++++++ lib/rapi/rlib2.py | 9 ++++++++- man/gnt-instance.rst | 7 +++++++ src/Ganeti/HTools/Repair.hs | 4 ++++ src/Ganeti/OpCodes.hs | 2 ++ src/Ganeti/OpParams.hs | 12 ++++++++++++ test/hs/Test/Ganeti/OpCodes.hs | 1 + 8 files changed, 47 insertions(+), 3 deletions(-) diff --git a/lib/client/gnt_instance.py b/lib/client/gnt_instance.py index bc4482b..17ac709 100644 --- a/lib/client/gnt_instance.py +++ b/lib/client/gnt_instance.py @@ -398,6 +398,8 @@ def ReinstallInstance(opts, args): if not AskUser(usertext): return 1 + clear_osparams_priv = opts.clear_osparams_private + jex = JobExecutor(verbose=multi_on, opts=opts) for instance_name in inames: op = opcodes.OpInstanceReinstall(instance_name=instance_name, @@ -405,7 +407,9 @@ def ReinstallInstance(opts, args): force_variant=opts.force_variant, osparams=opts.osparams, osparams_private=opts.osparams_private, - osparams_secret=opts.osparams_secret) + osparams_secret=opts.osparams_secret, + clear_osparams=opts.clear_osparams, + clear_osparams_private=clear_osparams_priv), jex.QueueJob(instance_name, op) results = jex.WaitOrShow(not opts.submit_only) @@ -1657,7 +1661,8 @@ commands = { m_pri_node_opt, m_sec_node_opt, m_clust_opt, m_inst_opt, m_node_tags_opt, m_pri_node_tags_opt, m_sec_node_tags_opt, m_inst_tags_opt, SELECT_OS_OPT] + SUBMIT_OPTS + [DRY_RUN_OPT, PRIORITY_OPT, OSPARAMS_OPT, - OSPARAMS_PRIVATE_OPT, OSPARAMS_SECRET_OPT], + OSPARAMS_PRIVATE_OPT, OSPARAMS_SECRET_OPT, + CLEAR_OSPARAMS_OPT, CLEAR_OSPARAMS_PRIVATE_OPT], "[-f] <instance>", "Reinstall a stopped instance"), "remove": ( RemoveInstance, ARGS_ONE_INSTANCE, diff --git a/lib/cmdlib/instance_operation.py b/lib/cmdlib/instance_operation.py index 048b1e4..e784a1a 100644 --- a/lib/cmdlib/instance_operation.py +++ b/lib/cmdlib/instance_operation.py @@ -372,6 +372,12 @@ class LUInstanceReinstall(LogicalUnit): self.op.osparams_secret = self.op.osparams_secret or {} # Handle the use of 'default' values. + if self.op.clear_osparams: + instance.osparams.clear() + + if self.op.clear_osparams_private: + instance.osparams_private.clear() + params_public = GetUpdatedParams(instance.osparams, self.op.osparams) params_private = GetUpdatedParams(instance.osparams_private, self.op.osparams_private) diff --git a/lib/rapi/rlib2.py b/lib/rapi/rlib2.py index 7b14e81..92156d1 100644 --- a/lib/rapi/rlib2.py +++ b/lib/rapi/rlib2.py @@ -1302,11 +1302,18 @@ def _ParseInstanceReinstallRequest(name, data): start = baserlib.CheckParameter(data, "start", exptype=bool, default=True) osparams = baserlib.CheckParameter(data, "osparams", default=None) + clear_osparams = baserlib.CheckParameter(data, "clear_osparams", + default=False) + clear_osparams_private = baserlib.CheckParameter(data, + "clear_osparams_private", + default=False) ops = [ opcodes.OpInstanceShutdown(instance_name=name), opcodes.OpInstanceReinstall(instance_name=name, os_type=ostype, - osparams=osparams), + osparams=osparams, + clear_osparams=clear_osparams, + clear_osparams_private=clear_osparams_private), ] if start: diff --git a/man/gnt-instance.rst b/man/gnt-instance.rst index f1e2640..b40ed17 100644 --- a/man/gnt-instance.rst +++ b/man/gnt-instance.rst @@ -1526,6 +1526,8 @@ REINSTALL | [{-O|\--os-parameters} *OS\_PARAMETERS*] | [--os-parameters-private} *OS\_PARAMETERS*] | [--os-parameters-secret} *OS\_PARAMETERS*] +| [--clear-os-parameters] +| [--clear-os-parameters-private] | [\--submit] [\--print-jobid] | {*instance*...} @@ -1539,6 +1541,11 @@ available OS templates. OS parameters can be overridden using ``-O (--os-parameters)`` (more documentation for this option under the **add** command). +The ``--clear-os-parameters`` option will clear all (public) OS +parameters before executing the reinstall and +``--clear-os-parameters-private`` will clear all private OS parameters +of the instance. + Since this is a potentially dangerous command, the user will be required to confirm this action, unless the ``-f`` flag is passed. When multiple instances are selected (either by passing multiple diff --git a/src/Ganeti/HTools/Repair.hs b/src/Ganeti/HTools/Repair.hs index 4220635..9d07d70 100644 --- a/src/Ganeti/HTools/Repair.hs +++ b/src/Ganeti/HTools/Repair.hs @@ -242,6 +242,8 @@ detectBroken nl inst = , opTempOsParams = Nothing , opOsparamsPrivate = Nothing , opOsparamsSecret = Nothing + , opClearOsparams = False + , opClearOsparamsPrivate = False , opForceVariant = False } ]) @@ -296,6 +298,8 @@ detectBroken nl inst = , opTempOsParams = Nothing , opOsparamsPrivate = Nothing , opOsparamsSecret = Nothing + , opClearOsparams = False + , opClearOsparamsPrivate = False , opForceVariant = False } ]) diff --git a/src/Ganeti/OpCodes.hs b/src/Ganeti/OpCodes.hs index d792190..e5012fe 100644 --- a/src/Ganeti/OpCodes.hs +++ b/src/Ganeti/OpCodes.hs @@ -534,6 +534,8 @@ $(genOpCode "OpCode" , pTempOsParams , pTempOsParamsPrivate , pTempOsParamsSecret + , pTempOsParamsClear + , pTempOsParamsPrivateClear ], "instance_name") , ("OpInstanceRemove", diff --git a/src/Ganeti/OpParams.hs b/src/Ganeti/OpParams.hs index fc0cef5..7bd893c 100644 --- a/src/Ganeti/OpParams.hs +++ b/src/Ganeti/OpParams.hs @@ -217,6 +217,8 @@ module Ganeti.OpParams , pTempOsParams , pTempOsParamsPrivate , pTempOsParamsSecret + , pTempOsParamsClear + , pTempOsParamsPrivateClear , pTempHvParams , pTempBeParams , pIgnoreFailures @@ -1392,6 +1394,16 @@ pTempOsParamsSecret = optionalField $ simpleField "osparams_secret" [t| JSObject (Secret JSValue) |] +pTempOsParamsClear :: Field +pTempOsParamsClear = + withDoc "Clear current OS parameters before instance reinstalls" $ + defaultFalse "clear_osparams" + +pTempOsParamsPrivateClear :: Field +pTempOsParamsPrivateClear = + withDoc "Clear current OS private parameters before instance reinstalls" $ + defaultFalse "clear_osparams_private" + pShutdownTimeout :: Field pShutdownTimeout = withDoc "How long to wait for instance to shut down" . diff --git a/test/hs/Test/Ganeti/OpCodes.hs b/test/hs/Test/Ganeti/OpCodes.hs index 2d7078c..b82229f 100644 --- a/test/hs/Test/Ganeti/OpCodes.hs +++ b/test/hs/Test/Ganeti/OpCodes.hs @@ -365,6 +365,7 @@ genOpCodeFromId op_id = OpCodes.OpInstanceReinstall <$> genFQDN <*> return Nothing <*> arbitrary <*> genMaybe genNameNE <*> genMaybe (pure emptyJSObject) <*> genMaybe arbitraryPrivateJSObj <*> genMaybe arbitrarySecretJSObj + <*> arbitrary <*> arbitrary "OP_INSTANCE_REMOVE" -> OpCodes.OpInstanceRemove <$> genFQDN <*> return Nothing <*> arbitrary <*> arbitrary -- 2.10.2