Check for same primary node before disk attachment
authorLisa Velden <velden@google.com>
Mon, 11 Jan 2016 11:09:47 +0000 (12:09 +0100)
committerLisa Velden <velden@google.com>
Mon, 11 Jan 2016 11:40:15 +0000 (12:40 +0100)
Make sure a DRBD disk has the same primary node as the instance where it
will be attached to.

Signed-off-by: Lisa Velden <velden@google.com>
Reviewed-by: Klaus Aehlig <aehlig@google.com>

lib/cmdlib/instance_set_params.py
lib/objects.py

index b402483..a35e95c 100644 (file)
@@ -408,6 +408,13 @@ class LUInstanceSetParams(LogicalUnit):
                                  " are %s" %
                                  (disk.nodes, instance_nodes),
                                  errors.ECODE_INVAL)
+    # Make sure a DRBD disk has the same primary node as the instance where it
+    # will be attached to.
+    disk_primary = disk.GetPrimaryNode(self.instance.primary_node)
+    if self.instance.primary_node != disk_primary:
+      raise errors.OpExecError("The disks' primary node is %s whereas the "
+                               "instance's primary node is %s."
+                               % (disk_primary, self.instance.primary_node))
 
   def ExpandNames(self):
     self._ExpandAndLockInstance()
index 633353d..96e7092 100644 (file)
@@ -675,6 +675,17 @@ class Disk(ConfigObject):
       raise errors.ProgrammerError("Unhandled device type %s" % self.dev_type)
     return result
 
+  def GetPrimaryNode(self, node_uuid):
+    """This function returns the primary node of the device.
+
+    If the device is not a DRBD device, we still return the node the device
+    lives on.
+
+    """
+    if self.dev_type in constants.DTS_DRBD:
+      return self.logical_id[0]
+    return node_uuid
+
   def ComputeNodeTree(self, parent_node_uuid):
     """Compute the node/disk tree for this disk and its children.