Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Show volume's usage in "Add disk" dialog as a Form helper text #756

Merged
merged 1 commit into from
Jul 19, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 27 additions & 25 deletions src/components/vm/disks/diskAdd.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
*/
import React, { useState, useEffect } from 'react';
import {
Alert, Bullseye, Button, Checkbox,
Bullseye, Button, Checkbox,
ExpandableSection, Form, FormGroup,
FormSelect, FormSelectOption,
Grid,
Expand Down Expand Up @@ -64,7 +64,23 @@ function getFilteredVolumes(vmStoragePool, disks) {
return filteredVolumesSorted;
}

const SelectExistingVolume = ({ idPrefix, storagePoolName, existingVolumeName, onValueChanged, vmStoragePools, vmDisks }) => {
function getDiskUsageMessage(vms, storagePool, volumeName) {
const isVolumeUsed = getStorageVolumesUsage(vms, storagePool);

if (!isVolumeUsed[volumeName] || (isVolumeUsed[volumeName].length === 0))
return null;

const vmsUsing = isVolumeUsed[volumeName].join(', ');
const volume = storagePool.volumes.find(vol => vol.name === volumeName);

let message = cockpit.format(_("This volume is already used by $0."), vmsUsing);
if (volume.format === "raw")
message += " " + _("Attaching it will make this disk shareable for every VM using it.");

return message;
}

const SelectExistingVolume = ({ idPrefix, storagePoolName, existingVolumeName, onValueChanged, vmStoragePools, vmDisks, vms }) => {
const vmStoragePool = vmStoragePools.find(pool => pool.name == storagePoolName);
const filteredVolumes = getFilteredVolumes(vmStoragePool, vmDisks);

Expand All @@ -86,11 +102,16 @@ const SelectExistingVolume = ({ idPrefix, storagePoolName, existingVolumeName, o
initiallySelected = "empty";
}

const diskUsageMessage = getDiskUsageMessage(vms, vmStoragePools.find(pool => pool.name === storagePoolName), existingVolumeName);
return (
<FormGroup fieldId={`${idPrefix}-select-volume`} label={_("Volume")}>
<FormGroup fieldId={`${idPrefix}-select-volume`}
label={_("Volume")}
helperText={diskUsageMessage}
validated="warning">
<FormSelect id={`${idPrefix}-select-volume`}
onChange={value => onValueChanged('existingVolumeName', value)}
value={initiallySelected}
validated={diskUsageMessage && "warning"}
isDisabled={!filteredVolumes.length}>
{content}
</FormSelect>
Expand Down Expand Up @@ -272,21 +293,6 @@ const CreateNewDisk = ({
);
};

const ChangeShareable = ({ idPrefix, vms, storagePool, volumeName }) => {
const isVolumeUsed = getStorageVolumesUsage(vms, storagePool);
const volume = storagePool.volumes.find(vol => vol.name === volumeName);

if (!isVolumeUsed[volumeName] || (isVolumeUsed[volumeName].length === 0))
return null;

const vmsUsing = isVolumeUsed[volumeName].join(', ') + '.';
let text = _("This volume is already used by: ") + vmsUsing;
if (volume.format === "raw")
text += _("Attaching it will make this disk shareable for every VM using it.");

return <Alert isInline variant='warning' id={`${idPrefix}-vms-usage`} title={text} />;
};

const UseExistingDisk = ({
existingVolumeName,
idPrefix,
Expand All @@ -304,18 +310,14 @@ const UseExistingDisk = ({
validationFailed={validationFailed}
onValueChanged={onValueChanged}
vmStoragePools={vmStoragePools} />
{vmStoragePools.length > 0 && <>
{vmStoragePools.length > 0 &&
<SelectExistingVolume idPrefix={idPrefix}
vms={vms}
storagePoolName={storagePoolName}
existingVolumeName={existingVolumeName}
onValueChanged={onValueChanged}
vmStoragePools={vmStoragePools}
vmDisks={vm.disks} />
<ChangeShareable idPrefix={idPrefix}
vms={vms}
storagePool={vmStoragePools.find(pool => pool.name === storagePoolName)}
volumeName={existingVolumeName} />
</>}
vmDisks={vm.disks} />}
</>
);
};
Expand Down
9 changes: 9 additions & 0 deletions test/check-machines-disks
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,7 @@ class TestMachinesDisks(VirtualMachinesCase):
prefix = "#vm-subVmTest1-disks-adddisk"

self.createVm("subVmTest1")
self.createVm("subVmTest2")

self.login_and_go("/machines")
b.wait_in_text("body", "Virtual machines")
Expand Down Expand Up @@ -257,6 +258,14 @@ class TestMachinesDisks(VirtualMachinesCase):
b.wait_in_text("#vm-subVmTest1-disks-vdc-used", "0")
b.wait_in_text("#vm-subVmTest1-disks-vdc-capacity", "0.12") # 128 MB

# Check a warning message about a volume being used by another VM
b.click(f"{prefix}")
b.click(f"{prefix}-useexisting")
b.select_from_dropdown("#vm-subVmTest1-disks-adddisk-existing-select-pool", "images")
b.select_from_dropdown("#vm-subVmTest1-disks-adddisk-existing-select-volume", "subVmTest2-2.img")
b.wait_in_text("#vm-subVmTest1-disks-adddisk-existing-select-volume-helper", "used by subVmTest2")
b.click(".pf-c-modal-box__footer button:contains(Cancel)")

# Test remove disk - by external action
m.execute("virsh detach-disk subVmTest1 vdc")
print("Restarting vm-subVmTest1, might take a while")
Expand Down