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()
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)
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()
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)
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)
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()
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, )
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)
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)
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)
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()
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)
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)
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())