Skip to content
Snippets Groups Projects
Commit 55efe6da authored by Iustin Pop's avatar Iustin Pop
Browse files

Convert instance reinstall to multi instance model


This patch converts ‘gnt-instance reinstall’ from single-instance to
multi-instance model; since this is dangerours, it's required to pass
“--force --force-multiple” to skip the confirmation.

Signed-off-by: default avatarIustin Pop <iustin@google.com>
Reviewed-by: default avatarGuido Trotter <ultrotter@google.com>
parent d4dd4b74
No related branches found
No related tags found
No related merge requests found
...@@ -1229,31 +1229,47 @@ instance5: 11225 ...@@ -1229,31 +1229,47 @@ instance5: 11225
<cmdsynopsis> <cmdsynopsis>
<command>reinstall</command> <command>reinstall</command>
<arg choice="opt">-o <replaceable>os-type</replaceable></arg> <arg choice="opt">-o <replaceable>os-type</replaceable></arg>
<arg choice="opt">-f <replaceable>force</replaceable></arg>
<arg>--select-os</arg> <arg>--select-os</arg>
<arg choice="opt">-f <replaceable>force</replaceable></arg>
<arg>--force-multiple</arg>
<sbr>
<group choice="opt">
<arg>--instance</arg>
<arg>--node</arg>
<arg>--primary</arg>
<arg>--secondary</arg>
<arg>--all</arg>
</group>
<arg>--submit</arg> <arg>--submit</arg>
<arg choice="req"><replaceable>instance</replaceable></arg> <arg choice="opt" rep="repeat"><replaceable>instance</replaceable></arg>
</cmdsynopsis> </cmdsynopsis>
<para> <para>
Reinstalls the operating system on the given instance. The Reinstalls the operating system on the given instance(s). The
instance must be stopped when running this command. If the instance(s) must be stopped when running this command. If the
<option>--os-type</option> is specified, the operating <option>--os-type</option> is specified, the operating
system is changed. system is changed.
</para> </para>
<para>
Since reinstall is potentially dangerous command, the user
will be required to confirm this action, unless the
<option>-f</option> flag is passed.
</para>
<para> <para>
The <option>--select-os</option> option switches to an The <option>--select-os</option> option switches to an
interactive OS reinstall. The user is prompted to select the OS interactive OS reinstall. The user is prompted to select the OS
template from the list of available OS templates. template from the list of available OS templates.
</para> </para>
<para>
Since this is a potentially dangerous command, the user will
be required to confirm this action, unless the
<option>-f</option> flag is passed. When multiple instances
are selected (either by passing multiple arguments or by
using the <option>--node</option>,
<option>--primary</option>, <option>--secondary</option> or
<option>--all</option> options), the user must pass both the
<option>--force</option> and
<option>--force-multiple</option> options to skip the
interactive confirmation.
</para>
<para> <para>
The <option>--submit</option> option is used to send the job to The <option>--submit</option> option is used to send the job to
the master daemon but not wait for its completion. The job the master daemon but not wait for its completion. The job
......
...@@ -116,7 +116,7 @@ def _ExpandMultiNames(mode, names, client=None): ...@@ -116,7 +116,7 @@ def _ExpandMultiNames(mode, names, client=None):
return inames return inames
def _ConfirmOperation(inames, text): def _ConfirmOperation(inames, text, extra=""):
"""Ask the user to confirm an operation on a list of instances. """Ask the user to confirm an operation on a list of instances.
This function is used to request confirmation for doing an operation This function is used to request confirmation for doing an operation
...@@ -133,8 +133,8 @@ def _ConfirmOperation(inames, text): ...@@ -133,8 +133,8 @@ def _ConfirmOperation(inames, text):
""" """
count = len(inames) count = len(inames)
msg = ("The %s will operate on %d instances.\n" msg = ("The %s will operate on %d instances.\n%s"
"Do you want to continue?" % (text, count)) "Do you want to continue?" % (text, count, extra))
affected = ("\nAffected instances:\n" + affected = ("\nAffected instances:\n" +
"\n".join([" %s" % name for name in inames])) "\n".join([" %s" % name for name in inames]))
...@@ -505,8 +505,15 @@ def ReinstallInstance(opts, args): ...@@ -505,8 +505,15 @@ def ReinstallInstance(opts, args):
@return: the desired exit code @return: the desired exit code
""" """
instance_name = args[0] # first, compute the desired name list
if opts.multi_mode is None:
opts.multi_mode = _SHUTDOWN_INSTANCES
inames = _ExpandMultiNames(opts.multi_mode, args)
if not inames:
raise errors.OpPrereqError("Selection filter does not match any instances")
# second, if requested, ask for an OS
if opts.select_os is True: if opts.select_os is True:
op = opcodes.OpDiagnoseOS(output_fields=["name", "valid"], names=[]) op = opcodes.OpDiagnoseOS(output_fields=["name", "valid"], names=[])
result = SubmitOpCode(op) result = SubmitOpCode(op)
...@@ -528,23 +535,35 @@ def ReinstallInstance(opts, args): ...@@ -528,23 +535,35 @@ def ReinstallInstance(opts, args):
choices) choices)
if selected == 'exit': if selected == 'exit':
ToStdout("User aborted reinstall, exiting") ToStderr("User aborted reinstall, exiting")
return 1 return 1
os_name = selected os_name = selected
else: else:
os_name = opts.os os_name = opts.os
if not opts.force: # third, get confirmation: multi-reinstall requires --force-multi
usertext = ("This will reinstall the instance %s and remove" # *and* --force, single-reinstall just --force
" all data. Continue?") % instance_name multi_on = opts.multi_mode != _SHUTDOWN_INSTANCES or len(inames) > 1
if not AskUser(usertext): if multi_on:
warn_msg = "Note: this will remove *all* data for the below instances!\n"
if not ((opts.force_multi and opts.force) or
_ConfirmOperation(inames, "reinstall", extra=warn_msg)):
return 1 return 1
else:
if not opts.force:
usertext = ("This will reinstall the instance %s and remove"
" all data. Continue?") % instance_name
if not AskUser(usertext):
return 1
jex = JobExecutor(verbose=multi_on)
for instance_name in inames:
op = opcodes.OpReinstallInstance(instance_name=instance_name,
os_type=os_name)
jex.QueueJob(instance_name, op)
op = opcodes.OpReinstallInstance(instance_name=instance_name, jex.WaitOrShow(not opts.submit_only)
os_type=os_name)
SubmitOrSend(op, opts)
return 0 return 0
...@@ -1372,8 +1391,11 @@ commands = { ...@@ -1372,8 +1391,11 @@ commands = {
" The default field" " The default field"
" list is (in order): %s." % ", ".join(_LIST_DEF_FIELDS), " list is (in order): %s." % ", ".join(_LIST_DEF_FIELDS),
), ),
'reinstall': (ReinstallInstance, ARGS_ONE, 'reinstall': (ReinstallInstance, ARGS_ANY,
[DEBUG_OPT, FORCE_OPT, os_opt, [DEBUG_OPT, FORCE_OPT, os_opt,
m_force_multi,
m_node_opt, m_pri_node_opt, m_sec_node_opt,
m_clust_opt, m_inst_opt,
make_option("--select-os", dest="select_os", make_option("--select-os", dest="select_os",
action="store_true", default=False, action="store_true", default=False,
help="Interactive OS reinstall, lists available" help="Interactive OS reinstall, lists available"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment