The function BuildHooksEnv in LUInstanceRemove, calls the function
BuildInstanceHookEnvByObject which needs to query the config to get
the secondary_nodes/disks of an instance. The function BuildHooksEnv
will be called before and after the Exec function. The second time
it will fail to query for the secondary_nodes/disks of the instance as
the instance will not be available at the config any more.

This patch changes BuildInstanceHookEnvByObject to allow it
to override the secondary_nodes/disks of an instance.
---
 lib/cmdlib/backup.py         |  7 ++++++-
 lib/cmdlib/instance.py       |  6 +++++-
 lib/cmdlib/instance_utils.py | 16 +++++++++++++---
 3 files changed, 24 insertions(+), 5 deletions(-)

diff --git a/lib/cmdlib/backup.py b/lib/cmdlib/backup.py
index 67582c4..4787e3d 100644
--- a/lib/cmdlib/backup.py
+++ b/lib/cmdlib/backup.py
@@ -173,7 +173,9 @@ class LUBackupExport(LogicalUnit):
       "REMOVE_INSTANCE": str(bool(self.op.remove_instance)),
       }
 
-    env.update(BuildInstanceHookEnvByObject(self, self.instance))
+    env.update(BuildInstanceHookEnvByObject(
+      self, self.instance,
+      secondary_nodes=self.secondary_nodes, disks=self.inst_disks))
 
     return env
 
@@ -312,6 +314,9 @@ class LUBackupExport(LogicalUnit):
         raise errors.OpPrereqError("Zeroing timeout options can only be used"
                                    " only with the --zero-free-space option")
 
+    self.secondary_nodes = self.instance.secondary_nodes
+    self.inst_disks = self.instance.disks
+
   def _CleanupExports(self, feedback_fn):
     """Removes exports of current instance from all other nodes.
 
diff --git a/lib/cmdlib/instance.py b/lib/cmdlib/instance.py
index 3a7a5ac..e5e29fd 100644
--- a/lib/cmdlib/instance.py
+++ b/lib/cmdlib/instance.py
@@ -1794,7 +1794,9 @@ class LUInstanceRemove(LogicalUnit):
     This runs on master, primary and secondary nodes of the instance.
 
     """
-    env = BuildInstanceHookEnvByObject(self, self.instance)
+    env = BuildInstanceHookEnvByObject(self, self.instance,
+                                       secondary_nodes=self.secondary_nodes,
+                                       disks=self.inst_disks)
     env["SHUTDOWN_TIMEOUT"] = self.op.shutdown_timeout
     return env
 
@@ -1815,6 +1817,8 @@ class LUInstanceRemove(LogicalUnit):
     self.instance = self.cfg.GetInstanceInfo(self.op.instance_uuid)
     assert self.instance is not None, \
       "Cannot retrieve locked instance %s" % self.op.instance_name
+    self.secondary_nodes = self.instance.secondary_nodes
+    self.inst_disks = self.instance.disks
 
   def Exec(self, feedback_fn):
     """Remove the instance.
diff --git a/lib/cmdlib/instance_utils.py b/lib/cmdlib/instance_utils.py
index 4670397..628c1bb 100644
--- a/lib/cmdlib/instance_utils.py
+++ b/lib/cmdlib/instance_utils.py
@@ -147,7 +147,8 @@ def BuildInstanceHookEnv(name, primary_node_name, 
secondary_node_names, os_type,
   return env
 
 
-def BuildInstanceHookEnvByObject(lu, instance, override=None):
+def BuildInstanceHookEnvByObject(lu, instance, secondary_nodes=None,
+                                 disks=None, override=None):
   """Builds instance related env variables for hooks from an object.
 
   @type lu: L{LogicalUnit}
@@ -165,10 +166,19 @@ def BuildInstanceHookEnvByObject(lu, instance, 
override=None):
   cluster = lu.cfg.GetClusterInfo()
   bep = cluster.FillBE(instance)
   hvp = cluster.FillHV(instance)
+
+  # Override secondary_nodes
+  if secondary_nodes is None:
+    secondary_nodes = instance.secondary_nodes
+
+  # Override disks
+  if disks is None:
+    disks = instance.disks
+
   args = {
     "name": instance.name,
     "primary_node_name": lu.cfg.GetNodeName(instance.primary_node),
-    "secondary_node_names": lu.cfg.GetNodeNames(instance.secondary_nodes),
+    "secondary_node_names": lu.cfg.GetNodeNames(secondary_nodes),
     "os_type": instance.os,
     "status": instance.admin_state,
     "maxmem": bep[constants.BE_MAXMEM],
@@ -177,7 +187,7 @@ def BuildInstanceHookEnvByObject(lu, instance, 
override=None):
     "nics": NICListToTuple(lu, instance.nics),
     "disk_template": instance.disk_template,
     "disks": [(disk.name, disk.uuid, disk.size, disk.mode)
-              for disk in instance.disks],
+              for disk in disks],
     "bep": bep,
     "hvp": hvp,
     "hypervisor_name": instance.hypervisor,
-- 
1.9.1

Reply via email to