def _create_iscsi_block_device(self, discovered_bd, machine, name=None): """Create's a new `ISCSIBlockDevice` for `machine`. `ISCSIBlockDevice.target` are unique. So if one exists on another machine it will be moved from that machine to this machine. """ if name is None: name = machine.get_next_block_device_name() target = get_iscsi_target(discovered_bd.iscsi_target) block_device, created = ISCSIBlockDevice.objects.get_or_create( target=target, defaults={ 'name': name, 'node': machine, 'size': discovered_bd.size, 'block_size': discovered_bd.block_size, 'tags': discovered_bd.tags, }) if not created: podlog.warning( "%s: ISCSI block device with target %s was discovered on " "machine %s and was moved from %s." % (self.name, target, machine.hostname, block_device.node.hostname)) block_device.name = name block_device.node = machine block_device.size = discovered_bd.size block_device.block_size = discovered_bd.block_size block_device.tags = discovered_bd.tags block_device.save() return block_device
def _sync_block_devices(self, block_devices, existing_machine): """Sync the `block_devices` to the `existing_machine`.""" model_mapping = { '%s/%s' % (block_device.model, block_device.serial): block_device for block_device in block_devices if (block_device.type == BlockDeviceType.PHYSICAL and block_device.model and block_device.serial) } path_mapping = { block_device.id_path: block_device for block_device in block_devices if (block_device.type == BlockDeviceType.PHYSICAL and ( not block_device.model or not block_device.serial)) } iscsi_mapping = { block_device.iscsi_target: block_device for block_device in block_devices if block_device.type == BlockDeviceType.ISCSI } existing_block_devices = map(lambda bd: bd.actual_instance, existing_machine.blockdevice_set.all()) for block_device in existing_block_devices: if isinstance(block_device, PhysicalBlockDevice): if block_device.model and block_device.serial: key = '%s/%s' % (block_device.model, block_device.serial) if key in model_mapping: self._sync_block_device(model_mapping.pop(key), block_device) else: block_device.delete() else: if block_device.id_path in path_mapping: self._sync_block_device( path_mapping.pop(block_device.id_path), block_device) else: block_device.delete() elif isinstance(block_device, ISCSIBlockDevice): target = get_iscsi_target(block_device.target) if target in iscsi_mapping: self._sync_block_device(iscsi_mapping.pop(target), block_device) else: block_device.delete() for _, discovered_block_device in model_mapping.items(): self._create_physical_block_device(discovered_block_device, existing_machine) for _, discovered_block_device in path_mapping.items(): self._create_physical_block_device(discovered_block_device, existing_machine) for _, discovered_block_device in iscsi_mapping.items(): self._create_iscsi_block_device(discovered_block_device, existing_machine)