package org.ovirt.engine.ui.uicommonweb.models.vms; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.ovirt.engine.core.common.businessentities.ActionGroup; import org.ovirt.engine.core.common.businessentities.Cluster; import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.StoragePool; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VmBase; import org.ovirt.engine.core.common.businessentities.VmPool; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.StringHelper; import org.ovirt.engine.ui.uicommonweb.Linq; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; import org.ovirt.engine.ui.uicommonweb.models.SystemTreeItemModel; import org.ovirt.engine.ui.uicommonweb.models.storage.DisksAllocationModel; import org.ovirt.engine.ui.uicommonweb.models.templates.LatestVmTemplate; import org.ovirt.engine.ui.uicommonweb.models.vms.instancetypes.ExistingPoolInstanceTypeManager; import org.ovirt.engine.ui.uicommonweb.models.vms.instancetypes.InstanceTypeManager; import org.ovirt.engine.ui.uicommonweb.validation.ExistingPoolNameLengthValidation; import org.ovirt.engine.ui.uicommonweb.validation.IValidation; public class ExistingPoolModelBehavior extends PoolModelBehaviorBase { private final VM pool; private final VmPool actualPool; private InstanceTypeManager instanceTypeManager; public ExistingPoolModelBehavior(VM pool, VmPool actualPool) { this.pool = pool; this.actualPool = actualPool; } @Override public void initialize(SystemTreeItemModel systemTreeSelectedItem) { super.initialize(systemTreeSelectedItem); if (!StringHelper.isNullOrEmpty(pool.getVmPoolSpiceProxy())) { getModel().getSpiceProxyEnabled().setEntity(true); getModel().getSpiceProxy().setEntity(pool.getVmPoolSpiceProxy()); getModel().getSpiceProxy().setIsChangeable(true); } instanceTypeManager = new ExistingPoolInstanceTypeManager(getModel(), pool); instanceTypeManager.setAlwaysEnabledFieldUpdate(true); getModel().getCustomProperties().setIsChangeable(false); getModel().getCustomPropertySheet().setIsChangeable(false); } @Override protected void changeDefaultHost() { super.changeDefaultHost(); doChangeDefaultHost(pool.getDedicatedVmForVdsList()); } @Override public void postDataCenterWithClusterSelectedItemChanged() { super.postDataCenterWithClusterSelectedItemChanged(); Collection<DataCenterWithCluster> dataCenterWithClusters = getModel().getDataCenterWithClustersList().getItems(); DataCenterWithCluster selectDataCenterWithCluster = Linq.firstOrNull(dataCenterWithClusters, new Linq.DataCenterWithClusterPredicate(pool.getStoragePoolId(), pool.getClusterId())); getModel().getDataCenterWithClustersList() .setSelectedItem((selectDataCenterWithCluster != null) ? selectDataCenterWithCluster : Linq.firstOrNull(dataCenterWithClusters)); getModel().getCpuSharesAmount().setEntity(pool.getCpuShares()); updateCpuSharesSelection(); if (!isCustomCompatibilityVersionChangeInProgress) { initTemplate(); } instanceTypeManager.updateAll(); } public void initTemplate() { setupTemplateWithVersion(pool.getVmtGuid(), pool.isUseLatestVersion(), true); } @Override public void templateWithVersion_SelectedItemChanged() { super.templateWithVersion_SelectedItemChanged(); getModel().setIsDisksAvailable(true); VmTemplate template = getModel().getTemplateWithVersion().getSelectedItem().getTemplateVersion(); if (template == null) { return; } boolean isLatestPropertyChanged = pool.isUseLatestVersion() != (template instanceof LatestVmTemplate); // template ID changed but latest is not set, as it would cause false-positives boolean isTemplateIdChangedSinceInit = !pool.getVmtGuid().equals(template.getId()) && !pool.isUseLatestVersion(); // check if template-version selected requires to manually load the model instead of using the InstanceTypeManager if (isTemplateIdChangedSinceInit || isLatestPropertyChanged) { setupWindowFromVmBase(template); } else { setupWindowFromVmBase(pool.getStaticData()); } } public void setupWindowFromVmBase(VmBase from) { doChangeDefaultHost(from.getDedicatedVmForVdsList()); getModel().getCustomPropertySheet().deserialize(from.getCustomProperties()); setupWindowModelFrom(from); } @Override public void updateIsDisksAvailable() { getModel().setIsDisksAvailable(getModel().getDisks() != null); } @Override protected void postInitStorageDomains() { ArrayList<DiskModel> disks = (ArrayList<DiskModel>) getModel().getDisks(); if (disks == null) { return; } ActionGroup actionGroup = getModel().isCreateInstanceOnly() ? ActionGroup.CREATE_INSTANCE : ActionGroup.CREATE_VM; StoragePool dataCenter = getModel().getSelectedDataCenter(); AsyncDataProvider.getInstance().getPermittedStorageDomainsByStoragePoolId(asyncQuery(storageDomains -> { ArrayList<DiskModel> disks1 = (ArrayList<DiskModel>) getModel().getDisks(); ArrayList<StorageDomain> activeStorageDomains = filterStorageDomains(storageDomains); DisksAllocationModel disksAllocationModel = getModel().getDisksAllocationModel(); disksAllocationModel.setActiveStorageDomains(activeStorageDomains); getModel().getStorageDomain().setItems(activeStorageDomains); for (DiskModel diskModel : disks1) { // Setting Quota diskModel.getQuota().setItems(getModel().getQuota().getItems()); diskModel.getQuota().setIsChangeable(false); ArrayList<Guid> storageIds = ((DiskImage) diskModel.getDisk()).getStorageIds(); for (DiskImage disk : pool.getDiskList()) { if (diskModel.getDisk() instanceof DiskImage && ((DiskImage) diskModel.getDisk()).getImageId().equals(disk.getImageTemplateId())) { storageIds = new ArrayList<>(disk.getStorageIds()); break; } } if (storageIds == null || storageIds.size() == 0) { continue; } Guid storageId = storageIds.get(0); StorageDomain storageDomain = activeStorageDomains.stream() .filter(new Linq.IdPredicate<>(storageId)) .findFirst() .orElse(null); List<StorageDomain> diskStorageDomains = new ArrayList<>(); diskStorageDomains.add(storageDomain); diskModel.getStorageDomain().setItems(diskStorageDomains); diskModel.getStorageDomain().setIsChangeable(false); } }), dataCenter.getId(), actionGroup); getModel().getDisksAllocationModel().initializeAutoSelectTarget(false, actualPool.isAutoStorageSelect()); } public boolean validate() { boolean parentValidation = super.validate(); if (getModel().getNumOfDesktops().getIsValid()) { getModel().getNumOfDesktops().validateEntity(new IValidation[] { new ExistingPoolNameLengthValidation( getModel().getName().getEntity(), getModel().getAssignedVms().getEntity() + getModel().getNumOfDesktops().getEntity(), getModel().getOSType().getSelectedItem() ) } ); return getModel().getNumOfDesktops().getIsValid() && parentValidation; } return parentValidation; } @Override protected List<Cluster> filterClusters(List<Cluster> clusters) { return AsyncDataProvider.getInstance().filterByArchitecture(clusters, pool.getClusterArch()); } @Override public InstanceTypeManager getInstanceTypeManager() { return instanceTypeManager; } }