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

Reply via email to