package org.ovirt.engine.ui.uicommonweb.models.vms;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import org.ovirt.engine.core.common.businessentities.ActionGroup;
import org.ovirt.engine.core.common.businessentities.Cluster;
import org.ovirt.engine.core.common.businessentities.StoragePool;
import org.ovirt.engine.core.common.businessentities.StoragePoolStatus;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.VmTemplate;
import org.ovirt.engine.core.common.businessentities.VmTemplateStatus;
import org.ovirt.engine.core.common.queries.GetEntitiesWithPermittedActionParameters;
import org.ovirt.engine.core.common.queries.VdcQueryParametersBase;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.ui.frontend.AsyncQuery;
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.vms.instancetypes.InstanceTypeManager;
import org.ovirt.engine.ui.uicommonweb.models.vms.instancetypes.NewVmInstanceTypeManager;
import org.ovirt.engine.ui.uicompat.ConstantsManager;
import org.ovirt.engine.ui.uicompat.FrontendMultipleQueryAsyncResult;
import org.ovirt.engine.ui.uicompat.IFrontendMultipleQueryAsyncCallback;
@SuppressWarnings("unused")
public class UserPortalNewVmModelBehavior extends NewVmModelBehavior implements IFrontendMultipleQueryAsyncCallback {
private InstanceTypeManager instanceTypeManager;
private ActionGroup actionGroup;
@Override
public void initialize(SystemTreeItemModel systemTreeSelectedItem) {
actionGroup = getModel().isCreateInstanceOnly() ? ActionGroup.CREATE_INSTANCE : ActionGroup.CREATE_VM;
commonInitialize();
// The custom properties tab should be hidden on the User Portal
getModel().setIsCustomPropertiesTabAvailable(false);
getModel().getIsSoundcardEnabled().setIsChangeable(true);
getModel().getVmType().setIsChangeable(true);
getModel().getVmId().setIsAvailable(true);
// Get datacenters with permitted create action
AsyncDataProvider.getInstance().getDataCentersWithPermittedActionOnClusters(new AsyncQuery<>(
returnValue -> {
final List<StoragePool> dataCenters = new ArrayList<>();
for (StoragePool a : returnValue) {
if (a.getStatus() == StoragePoolStatus.Up) {
dataCenters.add(a);
}
}
if (!dataCenters.isEmpty()) {
AsyncDataProvider.getInstance().getClustersWithPermittedAction(
new AsyncQuery<>(clusters -> {
// filter clusters without cpu name
clusters = AsyncDataProvider.getInstance().filterClustersWithoutArchitecture(clusters);
getModel().setDataCentersAndClusters(getModel(),
dataCenters,
clusters, null);
}),
actionGroup, true, false);
} else {
getModel().disableEditing(ConstantsManager.getInstance().getConstants().notAvailableWithNoUpDCWithClusterWithPermissions());
}
}), actionGroup, true, false);
instanceTypeManager = new NewVmInstanceTypeManager(getModel());
}
@Override
public void dataCenterWithClusterSelectedItemChanged() {
super.dataCenterWithClusterSelectedItemChanged();
ArrayList<VdcQueryType> queryTypeList = new ArrayList<>();
queryTypeList.add(VdcQueryType.GetVmTemplatesWithPermittedAction);
GetEntitiesWithPermittedActionParameters getEntitiesWithPermittedActionParameters =
new GetEntitiesWithPermittedActionParameters();
getEntitiesWithPermittedActionParameters.setActionGroup(actionGroup);
ArrayList<VdcQueryParametersBase> parametersList =
new ArrayList<>(Arrays.asList(new VdcQueryParametersBase[]{
getEntitiesWithPermittedActionParameters}));
// Get clusters and templates
Frontend.getInstance().runMultipleQueries(queryTypeList, parametersList, this, getModel());
}
@Override
public void executed(FrontendMultipleQueryAsyncResult result) {
initCdImage();
}
@Override
protected void initTemplateWithVersion(List<VmTemplate> templates, Guid previousTemplateId, boolean useLatest, boolean addLatest) {
DataCenterWithCluster dataCenterWithCluster = this.getModel().getDataCenterWithClustersList().getSelectedItem();
StoragePool selectedDataCenter = dataCenterWithCluster.getDataCenter();
Guid selectedDataCenterId = selectedDataCenter.getId();
if (selectedDataCenterId == null) {
return;
}
List<VmTemplate> templatesInDataCenter = new ArrayList<>();
for (VmTemplate template : templates) {
if (Objects.equals(template.getStoragePoolId(), selectedDataCenterId) || template.isBlank()) {
templatesInDataCenter.add(template);
}
}
List<VmTemplate> properArchitectureTemplates = AsyncDataProvider.getInstance()
.filterTemplatesByArchitecture(
templatesInDataCenter,
dataCenterWithCluster.getCluster().getArchitecture());
List<VmTemplate> properStateTemplates = new ArrayList<>();
for (VmTemplate template : properArchitectureTemplates) {
if (template.getStatus().equals(VmTemplateStatus.OK)) {
properStateTemplates.add(template);
}
}
super.initTemplateWithVersion(properStateTemplates, previousTemplateId, useLatest, getModel().getIsStateless().getEntity());
updateIsDisksAvailable();
}
/**
* User can't change default host from the portal, however if the template was created
* with a specific host the vm needs to be added with the same host.
* The super method does just that.
*/
@Override
protected void doChangeDefaultHost(List<Guid> hostGuids) {
super.doChangeDefaultHost(hostGuids);
}
@Override
protected void getHostListByCluster(Cluster cluster, AsyncQuery<List<VDS>> query) {
AsyncDataProvider.getInstance().getHostListByClusterId(query, cluster.getId());
}
@Override
public InstanceTypeManager getInstanceTypeManager() {
return instanceTypeManager;
}
@Override
protected void updateNumaEnabled() {
}
}