In case of DRBD, hooks run on both primary (source) and secondary
(target) nodes. To get the same behavior for DTS_EXT_MIRROR, where we
do not have secondary node, we should explicitly add target node to
hooks nodes during instance migration/failover.

CheckPrereq() of TLMigrateInstance runs before BuildHooksManager(),
thus target_node calculated by Iallocator is available under
self._migrater.target_node. Use this value instead of
self.op.target_node which can be None.

Update NEWS and related doc entries.

Signed-off-by: Dimitris Aragiorgis <[email protected]>
---
 NEWS                             |    2 ++
 doc/hooks.rst                    |    8 ++++----
 lib/cmdlib/instance_migration.py |   10 +++++++---
 3 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/NEWS b/NEWS
index 26c2616..c383d48 100644
--- a/NEWS
+++ b/NEWS
@@ -21,6 +21,8 @@ Incompatible/important changes
   checks whether there are instances still using those templates.
 - 'gnt-node list-storage' now also reports storage information about
   file-based storage types.
+- In case of non drbd instances, export *_SECONDARY environment variables
+  as empty strings (and not "None") during 'instance-migrate' related hooks.
 
 New features
 ~~~~~~~~~~~~
diff --git a/doc/hooks.rst b/doc/hooks.rst
index 3a2846a..fc37e73 100644
--- a/doc/hooks.rst
+++ b/doc/hooks.rst
@@ -379,8 +379,8 @@ and secondary before failover.
 
 :directory: instance-failover
 :env. vars: IGNORE_CONSISTENCY, SHUTDOWN_TIMEOUT, OLD_PRIMARY, OLD_SECONDARY, 
NEW_PRIMARY, NEW_SECONDARY
-:pre-execution: master node, secondary node
-:post-execution: master node, primary and secondary nodes
+:pre-execution: master node, secondary (target) node
+:post-execution: master node, primary (source) and secondary (target) nodes
 
 OP_INSTANCE_MIGRATE
 ++++++++++++++++++++
@@ -391,8 +391,8 @@ and secondary before migration.
 
 :directory: instance-migrate
 :env. vars: MIGRATE_LIVE, MIGRATE_CLEANUP, OLD_PRIMARY, OLD_SECONDARY, 
NEW_PRIMARY, NEW_SECONDARY
-:pre-execution: master node, primary and secondary nodes
-:post-execution: master node, primary and secondary nodes
+:pre-execution: master node, primary (source) and secondary (target) nodes
+:post-execution: master node, primary (source) and secondary (target) nodes
 
 
 OP_INSTANCE_REMOVE
diff --git a/lib/cmdlib/instance_migration.py b/lib/cmdlib/instance_migration.py
index 32eaf25..fc4cb5a 100644
--- a/lib/cmdlib/instance_migration.py
+++ b/lib/cmdlib/instance_migration.py
@@ -136,11 +136,12 @@ class LUInstanceFailover(LogicalUnit):
     """
     instance = self._migrater.instance
     source_node_uuid = instance.primary_node
+    target_node_uuid = self._migrater.target_node_uuid
     env = {
       "IGNORE_CONSISTENCY": self.op.ignore_consistency,
       "SHUTDOWN_TIMEOUT": self.op.shutdown_timeout,
       "OLD_PRIMARY": self.cfg.GetNodeName(source_node_uuid),
-      "NEW_PRIMARY": self.op.target_node,
+      "NEW_PRIMARY": self.cfg.GetNodeName(target_node_uuid),
       "FAILOVER_CLEANUP": self.op.cleanup,
       }
 
@@ -160,6 +161,7 @@ class LUInstanceFailover(LogicalUnit):
     """
     instance = self._migrater.instance
     nl = [self.cfg.GetMasterNode()] + list(instance.secondary_nodes)
+    nl.append(self._migrater.target_node_uuid)
     return (nl, nl + [instance.primary_node])
 
 
@@ -198,12 +200,13 @@ class LUInstanceMigrate(LogicalUnit):
     """
     instance = self._migrater.instance
     source_node_uuid = instance.primary_node
+    target_node_uuid = self._migrater.target_node_uuid
     env = BuildInstanceHookEnvByObject(self, instance)
     env.update({
       "MIGRATE_LIVE": self._migrater.live,
       "MIGRATE_CLEANUP": self.op.cleanup,
       "OLD_PRIMARY": self.cfg.GetNodeName(source_node_uuid),
-      "NEW_PRIMARY": self.op.target_node,
+      "NEW_PRIMARY": self.cfg.GetNodeName(target_node_uuid),
       "ALLOW_RUNTIME_CHANGES": self.op.allow_runtime_changes,
       })
 
@@ -211,7 +214,7 @@ class LUInstanceMigrate(LogicalUnit):
       env["OLD_SECONDARY"] = self.cfg.GetNodeName(instance.secondary_nodes[0])
       env["NEW_SECONDARY"] = self.cfg.GetNodeName(source_node_uuid)
     else:
-      env["OLD_SECONDARY"] = env["NEW_SECONDARY"] = None
+      env["OLD_SECONDARY"] = env["NEW_SECONDARY"] = ""
 
     return env
 
@@ -222,6 +225,7 @@ class LUInstanceMigrate(LogicalUnit):
     instance = self._migrater.instance
     snode_uuids = list(instance.secondary_nodes)
     nl = [self.cfg.GetMasterNode(), instance.primary_node] + snode_uuids
+    nl.append(self._migrater.target_node_uuid)
     return (nl, nl)
 
 
-- 
1.7.10.4

Reply via email to