diff --git a/lib/objects.py b/lib/objects.py index 424c19852dc8424840054d0270a52d8897ccda26..bb7c1c8624a6d187bd965be95cefea2e4334497f 100644 --- a/lib/objects.py +++ b/lib/objects.py @@ -390,6 +390,50 @@ class Disk(ConfigObject): raise errors.ProgrammerError("Disk.RecordGrow called for unsupported" " disk type %s" % self.dev_type) + def SetPhysicalID(self, target_node, nodes_ip): + """Convert the logical ID to the physical ID. + + This is used only for drbd, which needs ip/port configuration. + + The routine descends down and updates its children also, because + this helps when the only the top device is passed to the remote + node. + + Arguments: + - target_node: the node we wish to configure for + - nodes_ip: a mapping of node name to ip + + The target_node must exist in in nodes_ip, and must be one of the + nodes in the logical ID for each of the DRBD devices encountered + in the disk tree. + + """ + if self.children: + for child in self.children: + child.SetPhysicalID(target_node, nodes_ip) + + if self.logical_id is None and self.physical_id is not None: + return + if self.dev_type in constants.LDS_DRBD: + pnode, snode, port = self.logical_id + if target_node not in (pnode, snode): + raise errors.ConfigurationError("DRBD device not knowing node %s" % + target_node) + pnode_ip = nodes_ip.get(pnode, None) + snode_ip = nodes_ip.get(snode, None) + if pnode_ip is None or snode_ip is None: + raise errors.ConfigurationError("Can't find primary or secondary node" + " for %s" % str(self)) + if pnode == target_node: + self.physical_id = (pnode_ip, port, + snode_ip, port) + else: # it must be secondary, we tested above + self.physical_id = (snode_ip, port, + pnode_ip, port) + else: + self.physical_id = self.logical_id + return + def ToDict(self): """Disk-specific conversion to standard python types.