diff --git a/daemons/ganeti-noded b/daemons/ganeti-noded
index 3a2b4a092d5ae99cb4a35d0b8e917d6fffa5cdee..ac90090845ac366cd0de093a78c7c1fa3c2d0e12 100755
--- a/daemons/ganeti-noded
+++ b/daemons/ganeti-noded
@@ -365,7 +365,8 @@ class NodeHttpServer(http.server.HttpServer):
"""
inst_s = params[0]
inst = objects.Instance.FromDict(inst_s)
- return backend.InstanceOsAdd(inst)
+ reinstall = params[1]
+ return backend.InstanceOsAdd(inst, reinstall)
@staticmethod
def perspective_instance_run_rename(params):
diff --git a/lib/backend.py b/lib/backend.py
index 18d439e869c08ff0f27edff13218e99dc81d7a6d..183286b36aea2b2e39ce567b30399cf5c707e44c 100644
--- a/lib/backend.py
+++ b/lib/backend.py
@@ -673,11 +673,13 @@ def GetAllInstancesInfo(hypervisor_list):
return output
-def InstanceOsAdd(instance):
+def InstanceOsAdd(instance, reinstall):
"""Add an OS to an instance.
@type instance: L{objects.Instance}
@param instance: Instance whose OS is to be installed
+ @type reinstall: boolean
+ @param reinstall: whether this is an instance reinstall
@rtype: boolean
@return: the success of the operation
@@ -693,6 +695,8 @@ def InstanceOsAdd(instance):
(os_name, os_dir, os_err))
create_env = OSEnvironment(instance)
+ if reinstall:
+ create_env['INSTANCE_REINSTALL'] = "1"
logfile = "%s/add-%s-%s-%d.log" % (constants.LOG_OS_DIR, instance.os,
instance.name, int(time.time()))
diff --git a/lib/cmdlib.py b/lib/cmdlib.py
index ab404492995c6093be89fc392b57bfbb17fd2f4f..c9eae6859ae3ad7ed386b5cb7e61b2e809ecfff0 100644
--- a/lib/cmdlib.py
+++ b/lib/cmdlib.py
@@ -2995,7 +2995,7 @@ class LUReinstallInstance(LogicalUnit):
_StartInstanceDisks(self, inst, None)
try:
feedback_fn("Running the instance OS create scripts...")
- result = self.rpc.call_instance_os_add(inst.primary_node, inst)
+ result = self.rpc.call_instance_os_add(inst.primary_node, inst, True)
msg = result.RemoteFailMsg()
if msg:
raise errors.OpExecError("Could not install OS for instance %s"
@@ -4763,7 +4763,7 @@ class LUCreateInstance(LogicalUnit):
if iobj.disk_template != constants.DT_DISKLESS:
if self.op.mode == constants.INSTANCE_CREATE:
feedback_fn("* running the instance OS create scripts...")
- result = self.rpc.call_instance_os_add(pnode_name, iobj)
+ result = self.rpc.call_instance_os_add(pnode_name, iobj, False)
msg = result.RemoteFailMsg()
if msg:
raise errors.OpExecError("Could not add os for instance %s"
diff --git a/lib/rpc.py b/lib/rpc.py
index 70dd3128ac955de41256b31a2d64c26631e3a9cc..599de0ac966726202663a0c4008cabeeb4aba872 100644
--- a/lib/rpc.py
+++ b/lib/rpc.py
@@ -524,14 +524,14 @@ class RpcRunner(object):
return self._SingleNodeCall(node, "instance_reboot",
[self._InstDict(instance), reboot_type])
- def call_instance_os_add(self, node, inst):
+ def call_instance_os_add(self, node, inst, reinstall):
"""Installs an OS on the given instance.
This is a single-node call.
"""
return self._SingleNodeCall(node, "instance_os_add",
- [self._InstDict(inst)])
+ [self._InstDict(inst), reinstall])
def call_instance_run_rename(self, node, inst, old_name):
"""Run the OS rename script for an instance.
diff --git a/man/ganeti-os-interface.sgml b/man/ganeti-os-interface.sgml
index 5a127e4986d0ab9d1aace9e4200ac08e44a12880..c61ea5ab5ae0f8b5c45f68d56d243215afcd640f 100644
--- a/man/ganeti-os-interface.sgml
+++ b/man/ganeti-os-interface.sgml
@@ -215,6 +215,11 @@
according to this name. It can configure the IP statically or
not, depending on the deployment environment.</para>
+ <para>The <envar>INSTANCE_REINSTALL</envar> variable is set to '1' when
+ this create request is reinstalling and existing instance, rather than
+ creating one anew. This can be used, for example, to preserve some
+ data in the old instance in an os-specific way.</para>
+
</refsect2>
<refsect2>