package org.ovirt.engine.ui.uicommonweb.models.vms; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; import org.ovirt.engine.core.common.businessentities.Cluster; import org.ovirt.engine.core.common.businessentities.DisplayType; import org.ovirt.engine.core.common.businessentities.StoragePool; import org.ovirt.engine.core.common.businessentities.VmBase; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.businessentities.VmWatchdog; import org.ovirt.engine.core.common.queries.IdQueryParameters; 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.AsyncCallback; import org.ovirt.engine.ui.frontend.AsyncQuery; import org.ovirt.engine.ui.frontend.Frontend; import org.ovirt.engine.ui.uicommonweb.builders.BuilderExecutor; import org.ovirt.engine.ui.uicommonweb.builders.vm.CommentVmBaseToUnitBuilder; import org.ovirt.engine.ui.uicommonweb.builders.vm.CommonVmBaseToUnitBuilder; import org.ovirt.engine.ui.uicommonweb.builders.vm.NameAndDescriptionVmBaseToUnitBuilder; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; import org.ovirt.engine.ui.uicommonweb.models.SystemTreeItemModel; public class TemplateVmModelBehavior extends VmModelBehaviorBase<UnitVmModel> { private VmTemplate template; public TemplateVmModelBehavior(VmTemplate template) { this.template = template; } @Override public void initialize(SystemTreeItemModel systemTreeSelectedItem) { super.initialize(systemTreeSelectedItem); getModel().getTemplateWithVersion().setIsChangeable(false); getModel().getBaseTemplate().setIsChangeable(false); getModel().getTemplateWithVersion().setIsChangeable(false); getModel().getProvisioning().setIsChangeable(false); getModel().getStorageDomain().setIsChangeable(false); getModel().getIsSoundcardEnabled().setIsChangeable(true); getModel().getVmType().setIsChangeable(true); getModel().getTemplateVersionName().setIsChangeable(!template.isBaseTemplate()); getModel().getName().setIsChangeable(template.isBaseTemplate()); if (template.getStoragePoolId() != null && !template.getStoragePoolId().equals(Guid.Empty)) { AsyncDataProvider.getInstance().getDataCenterById(new AsyncQuery<>( dataCenter -> AsyncDataProvider.getInstance().getClusterListByService( new AsyncQuery<>(clusters -> { ArrayList<Cluster> clustersSupportingVirt = new ArrayList<>(); // filter clusters supporting virt service only for (Cluster cluster : clusters) { if (cluster.supportsVirtService()) { clustersSupportingVirt.add(cluster); } } List<Cluster> filteredClusters = AsyncDataProvider.getInstance().filterByArchitecture(clustersSupportingVirt, template.getClusterArch()); getModel().setDataCentersAndClusters(getModel(), new ArrayList<>(Arrays.asList(new StoragePool[]{dataCenter})), filteredClusters, template.getClusterId()); updateRngDevice(template.getId()); AsyncDataProvider.getInstance().isSoundcardEnabled(new AsyncQuery<>( returnValue -> { getModel().getIsSoundcardEnabled().setEntity(returnValue); initTemplate(); initCdImage(); }), template.getId()); Frontend.getInstance().runQuery(VdcQueryType.IsBalloonEnabled, new IdQueryParameters(template.getId()), new AsyncQuery<>( (VdcQueryReturnValue returnValue) -> getModel().getMemoryBalloonDeviceEnabled().setEntity((Boolean) returnValue.getReturnValue()) )); AsyncDataProvider.getInstance().isVirtioScsiEnabledForVm(new AsyncQuery<>( returnValue -> getModel().getIsVirtioScsiEnabled().setEntity(returnValue)), template.getId()); }), true, false)), template.getStoragePoolId()); } AsyncDataProvider.getInstance().getWatchdogByVmId(new AsyncQuery<>((AsyncCallback<VdcQueryReturnValue>) returnValue -> { UnitVmModel model = getModel(); @SuppressWarnings("unchecked") Collection<VmWatchdog> watchdogs = returnValue.getReturnValue(); for (VmWatchdog watchdog : watchdogs) { model.getWatchdogAction().setSelectedItem(watchdog.getAction()); model.getWatchdogModel().setSelectedItem(watchdog.getModel()); } }), template.getId()); getModel().getMigrationMode().setSelectedItem(template.getMigrationSupport()); setupBaseTemplate(template.getBaseTemplateId()); } protected void setupBaseTemplate(Guid baseTemplateId) { AsyncDataProvider.getInstance().getTemplateById(new AsyncQuery<>( template -> { UnitVmModel model = getModel(); model.getBaseTemplate().setItems(Collections.singletonList(template)); model.getBaseTemplate().setSelectedItem(template); model.getBaseTemplate().setIsChangeable(false); }), baseTemplateId); } @Override public void postDataCenterWithClusterSelectedItemChanged() { updateGraphics(template.getId()); updateDefaultHost(); updateNumOfSockets(); updateQuotaByCluster(template.getQuotaId(), template.getQuotaName()); updateMemoryBalloon(); updateCpuSharesAvailability(); getModel().getCpuSharesAmount().setEntity(template.getCpuShares()); updateCpuSharesSelection(); updateVirtioScsiAvailability(); updateMigrationForLocalSD(); updateOSValues(); if (getModel().getSelectedCluster() != null) { updateCpuProfile(getModel().getSelectedCluster().getId(), template.getCpuProfileId()); } updateCustomPropertySheet(); getModel().getCustomPropertySheet().deserialize(template.getCustomProperties()); updateLeaseStorageDomains(template.getLeaseStorageDomainId()); } @Override public void defaultHost_SelectedItemChanged() { updateCdImage(); } @Override public void provisioning_SelectedItemChanged() { } @Override protected void changeDefaultHost() { super.changeDefaultHost(); doChangeDefaultHost(template.getDedicatedVmForVdsList()); } public void buildModel(VmBase vmBase, BuilderExecutor.BuilderExecutionFinished<VmBase, UnitVmModel> callback) { new BuilderExecutor<>(callback, new NameAndDescriptionVmBaseToUnitBuilder(), new CommentVmBaseToUnitBuilder(), new CommonVmBaseToUnitBuilder()) .build(vmBase, getModel()); } private void initTemplate() { // Update model state according to VM properties. buildModel(template, (source, destination) -> { updateTimeZone(template.getTimeZone()); // Storage domain and provisioning are not available for an existing VM. getModel().getStorageDomain().setIsChangeable(false); getModel().getProvisioning().setIsAvailable(false); // Select display protocol. DisplayType displayType = template.getDefaultDisplayType(); if (getModel().getDisplayType().getItems().contains(displayType)) { getModel().getDisplayType().setSelectedItem(displayType); } updateConsoleDevice(template.getId()); toggleAutoSetVmHostname(); getModel().getVmInitEnabled().setEntity(template.getVmInit() != null); getModel().getVmInitModel().init(template); getModel().getTemplateVersionName().setEntity(template.getTemplateVersionName()); getModel().getBootMenuEnabled().setEntity(template.isBootMenuEnabled()); getModel().getSpiceFileTransferEnabled().setEntity(template.isSpiceFileTransferEnabled()); getModel().getSpiceCopyPasteEnabled().setEntity(template.isSpiceCopyPasteEnabled()); initPriority(template.getPriority()); }); } private void initCdImage() { updateSelectedCdImage(template); updateCdImage(); } public VmTemplate getVmTemplate() { return template; } @Override public void enableSinglePCI(boolean enabled) { super.enableSinglePCI(enabled); if (enabled) { getModel().getIsSingleQxlEnabled().setEntity(template.getSingleQxlPci() && getModel().getIsQxlSupported()); } else { getModel().getIsSingleQxlEnabled().setEntity(false); } } @Override public int getMaxNameLength() { return UnitVmModel.VM_TEMPLATE_AND_INSTANCE_TYPE_NAME_MAX_LIMIT; } private void toggleAutoSetVmHostname() { // always switch off auto setting of hostname for a template getModel().getVmInitModel().disableAutoSetHostname(); } }