예제 #1
0
파일: bmc.py 프로젝트: anthonydillon/maas
    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
예제 #2
0
파일: bmc.py 프로젝트: anthonydillon/maas
 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)