package org.ovirt.engine.ui.uicommonweb.models.vms; import java.util.ArrayList; import java.util.List; import org.ovirt.engine.core.common.businessentities.Cluster; import org.ovirt.engine.core.common.businessentities.StoragePool; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; import org.ovirt.engine.ui.uicommonweb.models.SystemTreeItemModel; import org.ovirt.engine.ui.uicommonweb.models.TabName; import org.ovirt.engine.ui.uicommonweb.models.vms.instancetypes.InstanceTypeManager; import org.ovirt.engine.ui.uicommonweb.models.vms.instancetypes.NewPoolInstanceTypeManager; import org.ovirt.engine.ui.uicommonweb.validation.IValidation; import org.ovirt.engine.ui.uicommonweb.validation.NewPoolNameLengthValidation; import org.ovirt.engine.ui.uicompat.ConstantsManager; public class NewPoolModelBehavior extends PoolModelBehaviorBase { private InstanceTypeManager instanceTypeManager; @Override public void initialize(SystemTreeItemModel systemTreeSelectedItem) { super.initialize(systemTreeSelectedItem); getModel().getVmType().setIsChangeable(true); getModel().getPoolStateful().setIsChangeable(true); templateValidate(); instanceTypeManager = new NewPoolInstanceTypeManager(getModel()); getModel().getVmInitModel().init(null); getModel().getDisksAllocationModel().initializeAutoSelectTarget(true, false); } @Override protected void commonInitialize() { super.commonInitialize(); getModel().getPoolStateful().getEntityChangedEvent().addListener(new UpdateTemplateWithVersionListener() { @Override protected boolean isAddLatestVersion() { return !getModel().getPoolStateful().getEntity(); } }); } @Override protected void postDataCentersLoaded(List<StoragePool> dataCenters) { if (!dataCenters.isEmpty()) { super.postDataCentersLoaded(dataCenters); } else { getModel().disableEditing(ConstantsManager.getInstance().getConstants().notAvailableWithNoUpDC()); } } @Override public void postDataCenterWithClusterSelectedItemChanged() { super.postDataCenterWithClusterSelectedItemChanged(); final DataCenterWithCluster dataCenterWithCluster = getModel().getDataCenterWithClustersList().getSelectedItem(); StoragePool dataCenter = getModel().getSelectedDataCenter(); if (dataCenter == null) { return; } AsyncDataProvider.getInstance().getTemplateListByDataCenter(asyncQuery(templatesByDataCenter -> { List<VmTemplate> properArchitectureTemplates = AsyncDataProvider.getInstance().filterTemplatesByArchitecture(templatesByDataCenter, dataCenterWithCluster.getCluster().getArchitecture()); List<VmTemplate> templatesWithoutBlank = new ArrayList<>(); for (VmTemplate template : properArchitectureTemplates) { final boolean isBlankOrVersionOfBlank = template.getId().equals(Guid.Empty) || template.getBaseTemplateId().equals(Guid.Empty); if (!isBlankOrVersionOfBlank) { templatesWithoutBlank.add(template); } } // A workaround - mark the process of CustomCompatibilityVersionChange as finished in case of an empty templates list for the // new pool. // The reason is that in case of an empty templates list, the getTemplateWithVersion event won't be raised and therefore // CustomCompatibilityVersion won't be reset by a selected template. if (templatesWithoutBlank.isEmpty()) { setCustomCompatibilityVersionChangeInProgress(false); } initTemplateWithVersion(templatesWithoutBlank, null, false); }), dataCenter.getId()); instanceTypeManager.updateAll(); } @Override public void templateWithVersion_SelectedItemChanged() { super.templateWithVersion_SelectedItemChanged(); VmTemplate template = getModel().getTemplateWithVersion().getSelectedItem() != null ? getModel().getTemplateWithVersion().getSelectedItem().getTemplateVersion() : null; if (template == null) { return; } setupWindowModelFrom(template); doChangeDefaultHost(template.getDedicatedVmForVdsList()); updateRngDevice(template.getId()); getModel().getCustomPropertySheet().deserialize(template.getCustomProperties()); } @Override public boolean validate() { boolean parentValidation = super.validate(); if (getModel().getName().getIsValid()) { getModel().getName().validateEntity(new IValidation[] { new NewPoolNameLengthValidation( getModel().getName().getEntity(), getModel().getNumOfDesktops().getEntity(), getModel().getOSType().getSelectedItem() ) }); final boolean isNameValid = getModel().getName().getIsValid(); getModel().setValidTab(TabName.GENERAL_TAB, getModel().isValidTab(TabName.GENERAL_TAB) && isNameValid); return getModel().getName().getIsValid() && parentValidation; } return parentValidation; } private void templateValidate() { AsyncDataProvider.getInstance().countAllTemplates(asyncQuery(count -> { if (count <= 1) { getModel().disableEditing(ConstantsManager.getInstance().getConstants().notAvailableWithNoTemplates()); } })); } @Override protected List<Cluster> filterClusters(List<Cluster> clusters) { return AsyncDataProvider.getInstance().filterClustersWithoutArchitecture(clusters); } @Override public InstanceTypeManager getInstanceTypeManager() { return instanceTypeManager; } @Override public void enableSinglePCI(boolean enabled) { super.enableSinglePCI(enabled); getModel().getIsSingleQxlEnabled().setEntity(enabled); } }