package org.ovirt.engine.ui.uicommonweb.models.vms; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import org.ovirt.engine.core.common.businessentities.ActionGroup; import org.ovirt.engine.core.common.businessentities.StoragePool; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.businessentities.VmTemplateStatus; import org.ovirt.engine.core.common.businessentities.comparators.NameableComparator; import org.ovirt.engine.core.common.queries.GetEntitiesWithPermittedActionParameters; import org.ovirt.engine.core.common.queries.VdcQueryParametersBase; import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.ui.frontend.Frontend; import org.ovirt.engine.ui.uicommonweb.Linq; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; import org.ovirt.engine.ui.uicompat.ConstantsManager; import org.ovirt.engine.ui.uicompat.FrontendMultipleQueryAsyncResult; import org.ovirt.engine.ui.uicompat.IFrontendMultipleQueryAsyncCallback; import org.ovirt.engine.ui.uicompat.UIConstants; public class UserPortalNewTemplateVmModelBehavior extends NewTemplateVmModelBehavior implements IFrontendMultipleQueryAsyncCallback { private static final ActionGroup CREATE_VM = ActionGroup.CREATE_VM; private final UIConstants constants = ConstantsManager.getInstance().getConstants(); public UserPortalNewTemplateVmModelBehavior(VM vm) { super(vm); } public UserPortalNewTemplateVmModelBehavior() { } @Override protected void updateTemplate() { ArrayList<VdcQueryType> queryTypeList = new ArrayList<>(); queryTypeList.add(VdcQueryType.GetVmTemplatesWithPermittedAction); GetEntitiesWithPermittedActionParameters getEntitiesWithPermittedActionParameters = new GetEntitiesWithPermittedActionParameters(); getEntitiesWithPermittedActionParameters.setActionGroup(CREATE_VM); ArrayList<VdcQueryParametersBase> parametersList = new ArrayList<>(Arrays.asList(new VdcQueryParametersBase[]{getEntitiesWithPermittedActionParameters})); Frontend.getInstance().runMultipleQueries(queryTypeList, parametersList, this, getModel()); } @Override public void executed(FrontendMultipleQueryAsyncResult result) { List<VdcQueryReturnValue> returnValueList = result.getReturnValues(); ArrayList<VmTemplate> templates = returnValueList.get(0).getReturnValue(); initTemplates(templates); } private void initTemplates(List<VmTemplate> templates) { List<VmTemplate> rootTemplates = keepBaseTemplates(templates); // Filter templates list (include only templates that belong to the selected datacenter) List<VmTemplate> templatesList = new ArrayList<>(); DataCenterWithCluster dataCenterWithCluster = getModel().getDataCenterWithClustersList().getSelectedItem(); StoragePool selectedDataCenter = dataCenterWithCluster.getDataCenter(); Guid selectedDataCenterId = selectedDataCenter.getId(); if (selectedDataCenterId == null) { return; } for (VmTemplate template : rootTemplates) { Guid datacenterId = template.getStoragePoolId() == null ? Guid.Empty : template.getStoragePoolId(); if (!template.isBlank() && selectedDataCenterId.equals(datacenterId) && template.getStatus() == VmTemplateStatus.OK) { templatesList.add(template); } } Collections.sort(templatesList, new NameableComparator()); List<VmTemplate> filteredTemplates = AsyncDataProvider.getInstance().filterTemplatesByArchitecture(templatesList, dataCenterWithCluster.getCluster().getArchitecture()); getModel().getIsSubTemplate().setEntity(false); if (filteredTemplates.isEmpty()) { // it is not allowed to create sub-templates of Blank template getModel().getIsSubTemplate().setIsChangeable(false, constants.someNonDefaultTemplateHasToExistFirst()); return; } getModel().getIsSubTemplate().setIsChangeable(true); VmTemplate currentTemplate = Linq.firstOrNull(templates, new Linq.IdPredicate<>(getVm().getVmtGuid())); getModel().getBaseTemplate().setItems(filteredTemplates); getModel().getBaseTemplate().setSelectedItem(Linq.firstOrNull(filteredTemplates, new Linq.IdPredicate<>(currentTemplate.getBaseTemplateId()))); } }