Пример #1
0
 def create_volume_group(self, params):
     """Create a volume group."""
     node = self._get_node_or_permission_error(params)
     form = CreateVolumeGroupForm(node=node, data=params)
     if not form.is_valid():
         raise HandlerError(form.errors)
     else:
         form.save()
Пример #2
0
 def test_is_not_valid_if_invalid_uuid(self):
     node = factory.make_Node()
     block_device = factory.make_PhysicalBlockDevice(node=node)
     data = {
         'name': factory.make_name("name"),
         'uuid': factory.make_string(size=32),
         'block_devices': [block_device.id],
     }
     form = CreateVolumeGroupForm(node, data=data)
     self.assertFalse(form.is_valid(),
                      "Should be invalid because of an invalid uuid.")
     self.assertEqual({'uuid': ["Enter a valid value."]}, form._errors)
Пример #3
0
    def create_volume_group(self, params):
        """Create a volume group."""
        # Only admin users can perform delete.
        if not reload_object(self.user).is_superuser:
            raise HandlerPermissionError()

        node = self.get_object(params)
        form = CreateVolumeGroupForm(node=node, data=params)
        if not form.is_valid():
            raise HandlerError(form.errors)
        else:
            form.save()
Пример #4
0
 def test_creates_volume_group_with_boot_disk(self):
     node = factory.make_Node(with_boot_disk=False)
     boot_disk = factory.make_PhysicalBlockDevice(node=node)
     data = {
         'name': factory.make_name("vg"),
         'block_devices': [boot_disk.id],
     }
     form = CreateVolumeGroupForm(node, data=data)
     self.assertTrue(form.is_valid(), form._errors)
     volume_group = form.save()
     boot_partition = boot_disk.get_partitiontable().partitions.first()
     self.assertEqual(
         boot_partition.get_effective_filesystem().filesystem_group.id,
         volume_group.id)
Пример #5
0
 def test_creates_volume_group_with_name_and_uuid(self):
     node = factory.make_Node()
     block_device = factory.make_PhysicalBlockDevice(node=node)
     name = factory.make_name("vg")
     vguuid = "%s" % uuid.uuid4()
     data = {
         'name': name,
         'uuid': vguuid,
         'block_devices': [block_device.id],
     }
     form = CreateVolumeGroupForm(node, data=data)
     self.assertTrue(form.is_valid(), form._errors)
     volume_group = form.save()
     self.assertEqual(name, volume_group.name)
     self.assertEqual(vguuid, volume_group.uuid)
Пример #6
0
    def create(self, request, system_id):
        """@description-title Create a volume group
        @description Create a volume group belonging to a machine with the
        given system_id.

        Note that at least one valid block device or partition is required.

        @param (string) "{system_id}" [required=true] The machine system_id on
        which to create the volume group.

        @param (string) "name" [required=true] Name of the volume group.

        @param (string) "uuid" [required=false] (optional) UUID of the volume
        group.

        @param (string) "block_devices" [required=false] Block devices to add
        to the volume group.

        @param (string) "partitions" [required=false] Partitions to add to the
        volume group.

        @success (http-status-code) "server-success" 200
        @success (json) "success-json" A JSON object containing the new volume
        group.
        @success-example "success-json" [exkey=vol-groups-create] placeholder
        text

        @error (http-status-code) "404" 404
        @error (content) "not-found" The requested machine is not found.
        @error-example "not-found"
            Not Found

        @error (http-status-code) "409" 409
        @error (content) "not-ready" The requested machine is not ready.
        """
        machine = Machine.objects.get_node_or_404(
            system_id, request.user, NodePermission.admin
        )
        if machine.status != NODE_STATUS.READY:
            raise NodeStateViolation(
                "Cannot create volume group because the machine is not Ready."
            )
        form = CreateVolumeGroupForm(machine, data=request.data)
        if not form.is_valid():
            raise MAASAPIValidationError(form.errors)
        else:
            return form.save()
Пример #7
0
 def test_is_not_valid_missing_block_devices_and_partitions(self):
     node = factory.make_Node()
     vguuid = "%s" % uuid.uuid4()
     data = {"name": factory.make_name("name"), "uuid": vguuid}
     form = CreateVolumeGroupForm(node, data=data)
     self.assertFalse(
         form.is_valid(),
         "Should be invalid because of missing block_devices and "
         "partitions.",
     )
     self.assertEqual(
         {
             "__all__":
             ["At least one valid block device or partition is required."]
         },
         form._errors,
     )
Пример #8
0
 def test_is_not_valid_if_partition_does_not_belong_to_node(self):
     node = factory.make_Node()
     partition = factory.make_Partition()
     data = {
         'name': factory.make_name("name"),
         'partitions': [partition.id],
     }
     form = CreateVolumeGroupForm(node, data=data)
     self.assertFalse(
         form.is_valid(), "Should be invalid because of partition does not "
         "belonging to node.")
     self.assertEqual(
         {
             'partitions': [
                 "Select a valid choice. %s is not one of the available "
                 "choices." % partition.id,
             ]
         }, form._errors)
Пример #9
0
 def test_creates_volume_group_with_block_devices(self):
     node = factory.make_Node()
     block_devices = [
         factory.make_PhysicalBlockDevice(node=node) for _ in range(3)
     ]
     block_device_ids = [block_device.id for block_device in block_devices]
     data = {
         'name': factory.make_name("vg"),
         'block_devices': block_device_ids,
     }
     form = CreateVolumeGroupForm(node, data=data)
     self.assertTrue(form.is_valid(), form._errors)
     volume_group = form.save()
     block_devices_in_vg = [
         filesystem.block_device.actual_instance
         for filesystem in volume_group.filesystems.all()
     ]
     self.assertItemsEqual(block_devices, block_devices_in_vg)
Пример #10
0
 def test_is_not_valid_if_block_device_does_not_belong_to_node(self):
     node = factory.make_Node()
     block_device = factory.make_PhysicalBlockDevice()
     data = {
         'name': factory.make_name("name"),
         'block_devices': [block_device.id],
     }
     form = CreateVolumeGroupForm(node, data=data)
     self.assertFalse(
         form.is_valid(),
         "Should be invalid because of block device does not "
         "belonging to node.")
     self.assertEqual(
         {
             'block_devices': [
                 "Select a valid choice. %s is not one of the available "
                 "choices." % block_device.id,
             ]
         }, form._errors)
Пример #11
0
    def create(self, request, system_id):
        """Create a volume group belonging to machine.

        :param name: Name of the volume group.
        :param uuid: (optional) UUID of the volume group.
        :param block_devices: Block devices to add to the volume group.
        :param partitions: Partitions to add to the volume group.

        Returns 404 if the machine is not found.
        Returns 409 if the machine is not Ready.
        """
        machine = Machine.objects.get_node_or_404(system_id, request.user,
                                                  NodePermission.admin)
        if machine.status != NODE_STATUS.READY:
            raise NodeStateViolation(
                "Cannot create volume group because the machine is not Ready.")
        form = CreateVolumeGroupForm(machine, data=request.data)
        if not form.is_valid():
            raise MAASAPIValidationError(form.errors)
        else:
            return form.save()
Пример #12
0
 def test_creates_volume_group_with_partitions_by_name(self):
     node = factory.make_Node()
     block_device = factory.make_PhysicalBlockDevice(
         node=node,
         size=(MIN_BLOCK_DEVICE_SIZE * 3) + PARTITION_TABLE_EXTRA_SPACE,
     )
     partition_table = factory.make_PartitionTable(
         block_device=block_device)
     partitions = [
         partition_table.add_partition(size=MIN_BLOCK_DEVICE_SIZE)
         for _ in range(2)
     ]
     partition_names = [partition.name for partition in partitions]
     data = {"name": factory.make_name("vg"), "partitions": partition_names}
     form = CreateVolumeGroupForm(node, data=data)
     self.assertTrue(form.is_valid(), form._errors)
     volume_group = form.save()
     partitions_in_vg = [
         filesystem.partition
         for filesystem in volume_group.filesystems.all()
     ]
     self.assertItemsEqual(partitions, partitions_in_vg)
Пример #13
0
 def test_creates_volume_group_with_block_devices_and_partitions(self):
     node = factory.make_Node()
     block_devices = [
         factory.make_PhysicalBlockDevice(node=node) for _ in range(3)
     ]
     block_device_ids = [block_device.id for block_device in block_devices]
     block_device = factory.make_PhysicalBlockDevice(
         node=node,
         size=(MIN_BLOCK_DEVICE_SIZE * 3) + PARTITION_TABLE_EXTRA_SPACE,
     )
     partition_table = factory.make_PartitionTable(
         block_device=block_device
     )
     partitions = [
         partition_table.add_partition(size=MIN_BLOCK_DEVICE_SIZE)
         for _ in range(2)
     ]
     partition_ids = [partition.id for partition in partitions]
     data = {
         "name": factory.make_name("vg"),
         "block_devices": block_device_ids,
         "partitions": partition_ids,
     }
     form = CreateVolumeGroupForm(node, data=data)
     self.assertTrue(form.is_valid(), form._errors)
     volume_group = form.save()
     block_devices_in_vg = [
         filesystem.block_device.actual_instance
         for filesystem in volume_group.filesystems.all()
         if filesystem.block_device is not None
     ]
     partitions_in_vg = [
         filesystem.partition
         for filesystem in volume_group.filesystems.all()
         if filesystem.partition is not None
     ]
     self.assertItemsEqual(block_devices, block_devices_in_vg)
     self.assertItemsEqual(partitions, partitions_in_vg)
Пример #14
0
 def test_requires_fields(self):
     node = factory.make_Node()
     form = CreateVolumeGroupForm(node, data={})
     self.assertFalse(form.is_valid(), form.errors)
     self.assertItemsEqual(['name'], form.errors.keys())