package org.ovirt.engine.ui.uicommonweb.models.vms; import java.util.Arrays; import org.ovirt.engine.core.common.VdcActionUtils; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VmDiskOperationParameterBase; import org.ovirt.engine.core.common.businessentities.StoragePool; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.storage.CinderDisk; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; import org.ovirt.engine.core.common.businessentities.storage.DiskStorageType; import org.ovirt.engine.core.common.businessentities.storage.LunDisk; import org.ovirt.engine.core.common.businessentities.storage.ScsiGenericIO; import org.ovirt.engine.core.common.businessentities.storage.StorageType; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.ui.frontend.Frontend; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; import org.ovirt.engine.ui.uicommonweb.validation.IValidation; import org.ovirt.engine.ui.uicommonweb.validation.NonNegativeLongNumberValidation; import org.ovirt.engine.ui.uicommonweb.validation.NotEmptyValidation; import org.ovirt.engine.ui.uicompat.IFrontendActionAsyncCallback; public class EditDiskModel extends AbstractDiskModel { public EditDiskModel() { } @Override public void initialize() { super.initialize(); setDiskVmElement(getDisk().getDiskVmElementForVm(getVm().getId())); disableNonChangeableEntities(); getAlias().setEntity(getDisk().getDiskAlias()); getDescription().setEntity(getDisk().getDiskDescription()); getIsShareable().setEntity(getDisk().isShareable()); getIsWipeAfterDelete().setEntity(getDisk().isWipeAfterDelete()); getIsScsiPassthrough().setEntity(getDisk().isScsiPassthrough()); getIsSgIoUnfiltered().setEntity(getDisk().getSgio() == ScsiGenericIO.UNFILTERED); getIsReadOnly().setEntity(getDiskVmElement().isReadOnly()); getIsBootable().setEntity(getDiskVmElement().isBoot()); getPassDiscard().setEntity(getDiskVmElement().isPassDiscard()); switch (getDisk().getDiskStorageType()) { case IMAGE: DiskImage diskImage = (DiskImage) getDisk(); getDiskStorageType().setEntity(DiskStorageType.IMAGE); getSize().setEntity((int) diskImage.getSizeInGigabytes()); getVolumeType().setSelectedItem(diskImage.getVolumeType()); boolean isExtendImageSizeEnabled = getVm() != null && !diskImage.isDiskSnapshot() && VdcActionUtils.canExecute(Arrays.asList(getVm()), VM.class, VdcActionType.ExtendImageSize); getSizeExtend().setIsChangeable(isExtendImageSizeEnabled); break; case LUN: LunDisk lunDisk = (LunDisk) getDisk(); getDiskStorageType().setEntity(DiskStorageType.LUN); getStorageType().setIsAvailable(false); getSize().setEntity(lunDisk.getLun().getDeviceSize()); getSizeExtend().setIsAvailable(false); getIsUsingScsiReservation().setEntity(getDiskVmElement().isUsingScsiReservation()); break; case CINDER: CinderDisk cinderDisk = (CinderDisk) getDisk(); getDiskStorageType().setEntity(DiskStorageType.CINDER); getSize().setEntity((int) cinderDisk.getSizeInGigabytes()); getSizeExtend().setIsChangeable(true); break; } updateReadOnlyChangeability(); updatePassDiscardChangeability(); updateWipeAfterDeleteChangeability(); } @Override protected void datacenter_SelectedItemChanged() { super.datacenter_SelectedItemChanged(); // this needs to be executed after the data center is loaded because the update quota needs both values if (getDisk().getDiskStorageType() == DiskStorageType.IMAGE) { Guid storageDomainId = ((DiskImage) getDisk()).getStorageIds().get(0); AsyncDataProvider.getInstance().getStorageDomainById(new AsyncQuery<>(storageDomain -> getStorageDomain().setSelectedItem(storageDomain)), storageDomainId); } else if (getDisk().getDiskStorageType() == DiskStorageType.LUN) { LunDisk lunDisk = (LunDisk) getDisk(); getDiskStorageType().setEntity(DiskStorageType.LUN); getSize().setEntity(lunDisk.getLun().getDeviceSize()); getSizeExtend().setIsAvailable(false); } } @Override public boolean getIsNew() { return false; } @Override protected boolean isDatacenterAvailable(StoragePool dataCenter) { return true; } @Override protected DiskImage getDiskImage() { return (DiskImage) getDisk(); } @Override protected LunDisk getLunDisk() { return (LunDisk) getDisk(); } @Override protected CinderDisk getCinderDisk() { return (CinderDisk) getDisk(); } @Override public void store(IFrontendActionAsyncCallback callback) { if (getProgress() != null || !validate()) { return; } startProgress(); VmDiskOperationParameterBase parameters = new VmDiskOperationParameterBase(getDiskVmElement(), getDisk()); IFrontendActionAsyncCallback onFinished = callback != null ? callback : result -> { EditDiskModel diskModel = (EditDiskModel) result.getState(); diskModel.stopProgress(); diskModel.cancel(); }; Frontend.getInstance().runAction(VdcActionType.UpdateVmDisk, parameters, onFinished, this); } @Override public boolean validate() { getSizeExtend().validateEntity(new IValidation[] { new NotEmptyValidation(), new NonNegativeLongNumberValidation() }); return super.validate() && getSizeExtend().getIsValid(); } private void disableNonChangeableEntities() { getStorageDomain().setIsChangeable(false); getHost().setIsChangeable(false); getStorageType().setIsChangeable(false); getDataCenter().setIsChangeable(false); getVolumeType().setIsChangeable(false); getSize().setIsChangeable(false); getCinderVolumeType().setIsChangeable(false); getDiskStorageType().setIsChangeable(false); if (!isEditEnabled()) { getIsShareable().setIsChangeable(false); getIsBootable().setIsChangeable(false); getDiskInterface().setIsChangeable(false); getPassDiscard().setIsChangeable(false); getIsReadOnly().setIsChangeable(false); } } @Override protected void updateStorageDomains(final StoragePool datacenter) { AsyncDataProvider.getInstance().getStorageDomainById(new AsyncQuery<>(storageDomain -> getStorageDomain().setSelectedItem(storageDomain)), getStorageDomainId()); } @Override protected void updateVolumeType(StorageType storageType) { // do nothing } @Override protected void updateCinderVolumeTypes() { getCinderVolumeType().setSelectedItem(getDisk().getCinderVolumeType()); } }