package org.ovirt.engine.ui.uicommonweb.models.vms; import java.util.ArrayList; import java.util.List; import org.ovirt.engine.core.common.action.AddDiskParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.StoragePool; import org.ovirt.engine.core.common.businessentities.StoragePoolStatus; import org.ovirt.engine.core.common.businessentities.VmDeviceId; 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.DiskVmElement; import org.ovirt.engine.core.common.businessentities.storage.LUNs; import org.ovirt.engine.core.common.businessentities.storage.LunDisk; import org.ovirt.engine.core.common.businessentities.storage.StorageType; import org.ovirt.engine.core.common.businessentities.storage.VolumeFormat; import org.ovirt.engine.core.common.businessentities.storage.VolumeType; import org.ovirt.engine.core.common.queries.ConfigurationValues; import org.ovirt.engine.ui.frontend.Frontend; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; import org.ovirt.engine.ui.uicommonweb.models.SystemTreeItemModel; import org.ovirt.engine.ui.uicommonweb.models.SystemTreeItemType; import org.ovirt.engine.ui.uicommonweb.models.hosts.ValueEventArgs; import org.ovirt.engine.ui.uicommonweb.models.storage.LunModel; import org.ovirt.engine.ui.uicommonweb.models.storage.SanStorageModelBase; import org.ovirt.engine.ui.uicommonweb.validation.IValidation; import org.ovirt.engine.ui.uicommonweb.validation.IntegerValidation; import org.ovirt.engine.ui.uicommonweb.validation.NotEmptyValidation; import org.ovirt.engine.ui.uicompat.Event; import org.ovirt.engine.ui.uicompat.IEventListener; import org.ovirt.engine.ui.uicompat.IFrontendActionAsyncCallback; public class NewDiskModel extends AbstractDiskModel { private boolean descriptionDerivedFromLunId; private IEventListener lunSelectionChangedEventListener = new IEventListener <ValueEventArgs<LunModel>>() { @Override public void eventRaised(Event<? extends ValueEventArgs<LunModel>> ev, Object sender, ValueEventArgs<LunModel> args) { String description = getDescription().getEntity(); if (description == null || description.isEmpty() || descriptionDerivedFromLunId) { LunModel selectedLunModel = args.getValue(); if (selectedLunModel.getLunId() != null) { int numOfChars = (Integer) AsyncDataProvider.getInstance().getConfigValuePreConverted(ConfigurationValues.PopulateDirectLUNDiskDescriptionWithLUNId); if (numOfChars == 0) { return; } String newDescription; if (numOfChars <= -1 || numOfChars >= selectedLunModel.getLunId().length()) { newDescription = selectedLunModel.getLunId(); } else { newDescription = selectedLunModel.getLunId().substring(selectedLunModel.getLunId().length() - numOfChars); } getDescription().setEntity(newDescription); descriptionDerivedFromLunId = true; } } updatePassDiscardChangeability(); } }; public NewDiskModel() { } public NewDiskModel(SystemTreeItemModel systemTreeSelectedItem) { setSystemTreeSelectedItem(systemTreeSelectedItem); } @Override public void initialize() { super.initialize(); setDiskVmElement(new DiskVmElement(new VmDeviceId(null, getIsFloating() ? null : getVm().getId()))); if (!getIsFloating()) { if (getIsBootable().getIsChangable()) { getIsBootable().setEntity(true); } updateSuggestedDiskAliasFromServer(); getIsPlugged().setIsAvailable(true); } else { // Read only disk can be created only in the scope of VM. getIsReadOnly().setIsAvailable(false); getIsPlugged().setEntity(false); getIsBootable().setIsAvailable(false); getDiskInterface().setIsAvailable(false); getPassDiscard().setIsAvailable(false); // set using scsi reservation to be invisible getIsUsingScsiReservation().setIsAvailable(false); getIsUsingScsiReservation().setEntity(false); } getSizeExtend().setIsAvailable(false); } @Override public void initialize(List<DiskModel> currentDisks) { super.initialize(currentDisks); setDiskVmElement(new DiskVmElement(new VmDeviceId(null, getIsFloating() ? null : getVm().getId()))); } public void updateSuggestedDiskAliasFromServer() { AsyncDataProvider.getInstance().getNextAvailableDiskAliasNameByVMId(new AsyncQuery<>(suggestedDiskAlias -> getAlias().setEntity(suggestedDiskAlias)), getVm().getId()); } @Override public boolean getIsNew() { return true; } @Override protected boolean isDatacenterAvailable(StoragePool dataCenter) { boolean isStatusUp = dataCenter.getStatus() == StoragePoolStatus.Up; boolean isInTreeContext = true; if (getSystemTreeSelectedItem() != null && getSystemTreeSelectedItem().getType() != SystemTreeItemType.System) { switch (getSystemTreeSelectedItem().getType()) { case DataCenter: StoragePool selectedDataCenter = (StoragePool) getSystemTreeSelectedItem().getEntity(); isInTreeContext = selectedDataCenter.getId().equals(dataCenter.getId()); default: break; } } return isStatusUp && isInTreeContext; } @Override protected DiskImage getDiskImage() { return new DiskImage(); } @Override protected LunDisk getLunDisk() { return new LunDisk(); } @Override protected CinderDisk getCinderDisk() { return new CinderDisk(); } @Override public void flush() { if (!validate()) { return; } super.flush(); switch (getDiskStorageType().getEntity()) { case LUN: LunDisk lunDisk = (LunDisk) getDisk(); LUNs luns = getSanStorageModelBase().getAddedLuns().get(0).getEntity(); luns.setLunType(getStorageType().getSelectedItem()); lunDisk.setLun(luns); break; case CINDER: CinderDisk cinderDisk = (CinderDisk) getDisk(); cinderDisk.setSizeInGigabytes(getSize().getEntity()); cinderDisk.setVolumeFormat(VolumeFormat.RAW); cinderDisk.setCinderVolumeType(getCinderVolumeType().getSelectedItem()); break; default: DiskImage diskImage = (DiskImage) getDisk(); if (getSize() != null && getSize().getEntity() != null) { diskImage.setSizeInGigabytes(getSize().getEntity()); } diskImage.setVolumeType(getVolumeType().getSelectedItem()); diskImage.setVolumeFormat(AsyncDataProvider.getInstance().getDiskVolumeFormat(diskImage.getVolumeType(), getStorageDomain().getSelectedItem().getStorageType())); break; } } @Override public void store(IFrontendActionAsyncCallback callback) { if (getProgress() != null || !validate()) { return; } startProgress(); AddDiskParameters parameters = new AddDiskParameters(getDiskVmElement(), getDisk()); parameters.setPlugDiskToVm(getIsPlugged().getEntity()); if (getDiskStorageType().getEntity() == DiskStorageType.IMAGE || getDiskStorageType().getEntity() == DiskStorageType.CINDER) { StorageDomain storageDomain = getStorageDomain().getSelectedItem(); parameters.setStorageDomainId(storageDomain.getId()); } IFrontendActionAsyncCallback onFinished = callback != null ? callback : result -> { NewDiskModel diskModel = (NewDiskModel) result.getState(); diskModel.stopProgress(); diskModel.cancel(); postSave(); }; Frontend.getInstance().runAction(VdcActionType.AddDisk, parameters, onFinished, this); } protected void postSave() { // empty by default } @Override public boolean validate() { if (getDiskStorageType().getEntity() == DiskStorageType.LUN && getSanStorageModelBase() != null) { getSanStorageModelBase().validate(); if (!getSanStorageModelBase().getIsValid()) { return false; } ArrayList<String> partOfSdLunsMessages = getSanStorageModelBase().getPartOfSdLunsMessages(); if (!partOfSdLunsMessages.isEmpty() && !getSanStorageModelBase().isForce()) { forceCreationWarning(partOfSdLunsMessages); return false; } } StorageType storageType = getStorageDomain().getSelectedItem() == null ? StorageType.UNKNOWN : getStorageDomain().getSelectedItem().getStorageType(); IntegerValidation sizeValidation = new IntegerValidation(); sizeValidation.setMinimum(getMinimumDiskSize()); if (storageType.isBlockDomain()) { sizeValidation.setMaximum((Integer) AsyncDataProvider.getInstance().getConfigValuePreConverted(ConfigurationValues.MaxBlockDiskSize)); } getSize().validateEntity(new IValidation[] { new NotEmptyValidation(), sizeValidation }); getStorageDomain().validateSelectedItem(new IValidation[] { new NotEmptyValidation() }); return super.validate() && getSize().getIsValid() && getStorageDomain().getIsValid(); } protected int getMinimumDiskSize() { return 1; } @Override protected void updateVolumeType(StorageType storageType) { getVolumeType().setSelectedItem(storageType.isBlockDomain() ? VolumeType.Preallocated : VolumeType.Sparse); volumeType_SelectedItemChanged(); } @Override public void setSanStorageModelBase(SanStorageModelBase sanStorageModelBase) { super.setSanStorageModelBase(sanStorageModelBase); if (!sanStorageModelBase.getLunSelectionChangedEvent().getListeners().contains(lunSelectionChangedEventListener)) { sanStorageModelBase.getLunSelectionChangedEvent().addListener(lunSelectionChangedEventListener); } } @Override protected void diskStorageType_EntityChanged() { super.diskStorageType_EntityChanged(); if (descriptionDerivedFromLunId) { getDescription().setEntity(null); } descriptionDerivedFromLunId = false; } }