diff --git a/lib/cmdlib.py b/lib/cmdlib.py index 443746bd8d264ccee4e6f4178d1b77bf71519af3..4140623f9d235b736445c99bc982a07b5bfaa3a3 100644 --- a/lib/cmdlib.py +++ b/lib/cmdlib.py @@ -3691,51 +3691,50 @@ class LUMigrateInstance(LogicalUnit): return self._ExecMigration() -def _CreateBlockDevOnPrimary(lu, node, instance, device, info): - """Create a tree of block devices on the primary node. - - This always creates all devices. - - """ - if device.children: - for child in device.children: - _CreateBlockDevOnPrimary(lu, node, instance, child, info) - - lu.cfg.SetDiskID(device, node) - result = lu.rpc.call_blockdev_create(node, device, device.size, - instance.name, True, info) - msg = result.RemoteFailMsg() - if msg: - raise errors.OpExecError("Can't create block device %s on primary" - " node %s: %s" % (device, node, msg)) - if device.physical_id is None: - device.physical_id = result.data[1] - - -def _CreateBlockDevOnSecondary(lu, node, instance, device, force, info): - """Create a tree of block devices on a secondary node. +def _CreateBlockDev(lu, node, instance, device, force_create, + info, force_open): + """Create a tree of block devices on a given node. If this device type has to be created on secondaries, create it and all its children. If not, just recurse to children keeping the same 'force' value. + @param lu: the lu on whose behalf we execute + @param node: the node on which to create the device + @type instance: L{objects.Instance} + @param instance: the instance which owns the device + @type device: L{objects.Disk} + @param device: the device to create + @type force_create: boolean + @param force_create: whether to force creation of this device; this + will be change to True whenever we find a device which has + CreateOnSecondary() attribute + @param info: the extra 'metadata' we should attach to the device + (this will be represented as a LVM tag) + @type force_open: boolean + @param force_open: this parameter will be passes to the + L{backend.CreateBlockDevice} function where it specifies + whether we run on primary or not, and it affects both + the child assembly and the device own Open() execution + """ if device.CreateOnSecondary(): - force = True + force_create = True if device.children: for child in device.children: - _CreateBlockDevOnSecondary(lu, node, instance, child, force, info) + _CreateBlockDev(lu, node, instance, child, force_create, + info, force_open) - if not force: + if not force_create: return lu.cfg.SetDiskID(device, node) new_id = lu.rpc.call_blockdev_create(node, device, device.size, - instance.name, False, info) + instance.name, force_open, info) if new_id.failed or not new_id.data: - raise errors.OpExecError("Can't create block device %s on secondary" + raise errors.OpExecError("Can't create block device %s on" " node %s" % (device, node)) if device.physical_id is None: device.physical_id = new_id @@ -3859,15 +3858,14 @@ def _CreateDisks(lu, instance): """ info = _GetInstanceInfoText(instance) + pnode = instance.primary_node if instance.disk_template == constants.DT_FILE: file_storage_dir = os.path.dirname(instance.disks[0].logical_id[1]) - result = lu.rpc.call_file_storage_dir_create(instance.primary_node, - file_storage_dir) + result = lu.rpc.call_file_storage_dir_create(pnode, file_storage_dir) if result.failed or not result.data: - raise errors.OpExecError("Could not connect to node '%s'" % - instance.primary_node) + raise errors.OpExecError("Could not connect to node '%s'" % pnode) if not result.data[0]: raise errors.OpExecError("Failed to create directory '%s'" % @@ -3879,12 +3877,9 @@ def _CreateDisks(lu, instance): logging.info("Creating volume %s for instance %s", device.iv_name, instance.name) #HARDCODE - for secondary_node in instance.secondary_nodes: - _CreateBlockDevOnSecondary(lu, secondary_node, instance, - device, False, info) - #HARDCODE - _CreateBlockDevOnPrimary(lu, instance.primary_node, - instance, device, info) + for node in instance.all_nodes: + f_create = node == pnode + _CreateBlockDev(lu, node, instance, device, f_create, info, f_create) def _RemoveDisks(lu, instance): @@ -4821,12 +4816,10 @@ class LUReplaceDisks(LogicalUnit): iv_names[dev.iv_name] = (dev, old_lvs, new_lvs) info("creating new local storage on %s for %s" % (tgt_node, dev.iv_name)) - # since we *always* want to create this LV, we use the - # _Create...OnPrimary (which forces the creation), even if we - # are talking about the secondary node + # we pass force_create=True to force the LVM creation for new_lv in new_lvs: - _CreateBlockDevOnPrimary(self, tgt_node, instance, new_lv, - _GetInstanceInfoText(instance)) + _CreateBlockDev(self, tgt_node, instance, new_lv, True, + _GetInstanceInfoText(instance), False) # Step: for each lv, detach+rename*2+attach self.proc.LogStep(4, steps_total, "change drbd configuration") @@ -4989,12 +4982,10 @@ class LUReplaceDisks(LogicalUnit): for idx, dev in enumerate(instance.disks): info("adding new local storage on %s for disk/%d" % (new_node, idx)) - # since we *always* want to create this LV, we use the - # _Create...OnPrimary (which forces the creation), even if we - # are talking about the secondary node + # we pass force_create=True to force LVM creation for new_lv in dev.children: - _CreateBlockDevOnPrimary(self, new_node, instance, new_lv, - _GetInstanceInfoText(instance)) + _CreateBlockDev(self, new_node, instance, new_lv, True, + _GetInstanceInfoText(instance), False) # Step 4: dbrd minors and drbd setups changes # after this, we must manually remove the drbd minors on both the @@ -5026,8 +5017,8 @@ class LUReplaceDisks(LogicalUnit): logical_id=new_alone_id, children=dev.children) try: - _CreateBlockDevOnSecondary(self, new_node, instance, new_drbd, False, - _GetInstanceInfoText(instance)) + _CreateBlockDev(self, new_node, instance, new_drbd, False, + _GetInstanceInfoText(instance), False) except error.BlockDeviceError: self.cfg.ReleaseDRBDMinors(instance.name) raise @@ -5690,21 +5681,15 @@ class LUSetInstanceParams(LogicalUnit): new_disk.iv_name, instance.name) # Note: this needs to be kept in sync with _CreateDisks #HARDCODE - for secondary_node in instance.secondary_nodes: + for node in instance.all_nodes: + f_create = node == instance.primary_node try: - _CreateBlockDevOnSecondary(self, secondary_node, instance, - new_disk, False, info) + _CreateBlockDev(self, node, instance, new_disk, + f_create, info, f_create) except error.OpExecError, err: self.LogWarning("Failed to create volume %s (%s) on" - " secondary node %s: %s", - new_disk.iv_name, new_disk, secondary_node, err) - #HARDCODE - try: - _CreateBlockDevOnPrimary(self, instance.primary_node, - instance, new_disk, info) - except errors.OpExecError, err: - self.LogWarning("Failed to create volume %s on primary: %s", - new_disk.iv_name, err) + " node %s: %s", + new_disk.iv_name, new_disk, node, err) result.append(("disk/%d" % disk_idx_base, "add:size=%s,mode=%s" % (new_disk.size, new_disk.mode))) else: