package org.ovirt.engine.ui.uicommonweb.models.configure.instancetypes; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Objects; import org.ovirt.engine.core.common.action.AddVmTemplateParameters; import org.ovirt.engine.core.common.action.UpdateVmTemplateParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VmTemplateManagementParameters; import org.ovirt.engine.core.common.businessentities.DisplayType; import org.ovirt.engine.core.common.businessentities.InstanceType; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VmBase; import org.ovirt.engine.core.common.businessentities.VmEntityType; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.businessentities.VmWatchdog; import org.ovirt.engine.core.common.businessentities.VmWatchdogType; import org.ovirt.engine.core.common.interfaces.SearchType; import org.ovirt.engine.core.common.queries.IdQueryParameters; import org.ovirt.engine.core.common.queries.SearchParameters; 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.Cloner; import org.ovirt.engine.ui.uicommonweb.UICommand; import org.ovirt.engine.ui.uicommonweb.builders.BuilderExecutor; import org.ovirt.engine.ui.uicommonweb.builders.vm.HwOnlyCoreUnitToVmBaseBuilder; import org.ovirt.engine.ui.uicommonweb.builders.vm.MigrationOptionsUnitToVmBaseBuilder; import org.ovirt.engine.ui.uicommonweb.builders.vm.NameUnitToVmBaseBuilder; import org.ovirt.engine.ui.uicommonweb.builders.vm.UnitToGraphicsDeviceParamsBuilder; import org.ovirt.engine.ui.uicommonweb.builders.vm.UsbPolicyUnitToVmBaseBuilder; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; import org.ovirt.engine.ui.uicommonweb.help.HelpTag; import org.ovirt.engine.ui.uicommonweb.models.ConfirmationModel; import org.ovirt.engine.ui.uicommonweb.models.HasEntity; import org.ovirt.engine.ui.uicommonweb.models.ListWithSimpleDetailsModel; import org.ovirt.engine.ui.uicommonweb.models.vms.BaseInterfaceCreatingManager; import org.ovirt.engine.ui.uicommonweb.models.vms.UnitVmModel; import org.ovirt.engine.ui.uicommonweb.models.vms.UnitVmModelNetworkAsyncCallback; import org.ovirt.engine.ui.uicommonweb.models.vms.VmBasedWidgetSwitchModeCommand; import org.ovirt.engine.ui.uicommonweb.models.vms.VmModelBehaviorBase; import org.ovirt.engine.ui.uicommonweb.models.vms.instancetypes.ExistingNonClusterModelBehavior; import org.ovirt.engine.ui.uicommonweb.models.vms.instancetypes.InstanceTypeInterfaceCreatingManager; import org.ovirt.engine.ui.uicommonweb.models.vms.instancetypes.NewInstanceTypeModelBehavior; import org.ovirt.engine.ui.uicompat.ConstantsManager; import com.google.inject.Inject; public class InstanceTypeListModel extends ListWithSimpleDetailsModel<Void, InstanceType> { private final UICommand newInstanceTypeCommand; private final UICommand editInstanceTypeCommand; private final UICommand deleteInstanceTypeCommand; private final InstanceTypeInterfaceCreatingManager addInstanceTypeNetworkManager = new InstanceTypeInterfaceCreatingManager(new BaseInterfaceCreatingManager.PostVnicCreatedCallback() { @Override public void vnicCreated(Guid vmId, UnitVmModel model) { getWindow().stopProgress(); cancel(); updateActionAvailability(); } @Override public void queryFailed() { getWindow().stopProgress(); cancel(); } }); @Inject public InstanceTypeListModel(final InstanceTypeGeneralModel instanceTypeGeneralModel) { setDetailList(instanceTypeGeneralModel); setDefaultSearchString("Instancetypes:"); //$NON-NLS-1$ setSearchString(getDefaultSearchString()); this.newInstanceTypeCommand = new UICommand("NewInstanceType", this); //$NON-NLS-1$ this.editInstanceTypeCommand = new UICommand("EditInstanceType", this); //$NON-NLS-1$ this.deleteInstanceTypeCommand = new UICommand("DeleteInstanceType", this); //$NON-NLS-1$ setSearchPageSize(1000); updateActionAvailability(); } private void setDetailList(final InstanceTypeGeneralModel instanceTypeGeneralModel) { List<HasEntity<InstanceType>> list = new ArrayList<>(); list.add(instanceTypeGeneralModel); setDetailModels(list); } @Override protected void syncSearch() { SearchParameters params = new SearchParameters(getSearchString(), SearchType.InstanceType, isCaseSensitiveSearch()); params.setMaxCount(getSearchPageSize()); super.syncSearch(VdcQueryType.Search, params); } private void newInstanceType() { createWindow( new NewInstanceTypeModelBehavior(), "new_instance_type", //$NON-NLS-1$ "OnNewInstanceType", //$NON-NLS-1$ true, ConstantsManager.getInstance().getConstants().newInstanceTypeTitle(), HelpTag.new_instance_type ); } private void editInstanceType() { createWindow( new ExistingNonClusterModelBehavior((VmTemplate) getSelectedItem()), "edit_instance_type", //$NON-NLS-1$ "OnEditInstanceType", //$NON-NLS-1$ false, ConstantsManager.getInstance().getConstants().editInstanceTypeTitle(), HelpTag.edit_instance_type ); } private void deleteInstanceType() { if (getWindow() != null) { return; } final ConfirmationModel window = new ConfirmationModel(); setConfirmWindow(window); window.startProgress(); window.setHelpTag(HelpTag.remove_instance_type); window.setHashName("remove_instance_type"); //$NON-NLS-1$ final Guid instanceTypeId = getSelectedItem().getId(); Frontend.getInstance().runQuery(VdcQueryType.GetVmsByInstanceTypeId, new IdQueryParameters(instanceTypeId), new AsyncQuery<VdcQueryReturnValue>(returnValue -> { List<VM> vmsAttachedToInstanceType = returnValue.getReturnValue(); if (vmsAttachedToInstanceType == null || vmsAttachedToInstanceType.size() == 0) { window.setTitle(ConstantsManager.getInstance().getConstants().removeInstanceTypeTitle()); window.setItems(Arrays.asList(getSelectedItem().getName())); } else { List<String> attachedVmsNames = new ArrayList<>(); for (VM vm : vmsAttachedToInstanceType) { attachedVmsNames.add(vm.getName()); } Collections.sort(attachedVmsNames); window.setItems(attachedVmsNames); window.getLatch().setIsAvailable(true); window.getLatch().setIsChangeable(true); window.setNote(ConstantsManager.getInstance().getConstants().vmsAttachedToInstanceTypeNote()); window.setMessage(ConstantsManager.getInstance().getConstants().vmsAttachedToInstanceTypeWarningMessage()); } window.stopProgress(); })); UICommand tempVar = UICommand.createDefaultOkUiCommand("OnDeleteInstanceType", this); //$NON-NLS-1$ window.getCommands().add(tempVar); UICommand tempVar2 = UICommand.createCancelUiCommand("Cancel", this); //$NON-NLS-1$ window.getCommands().add(tempVar2); } private void onNewInstanceType() { if (!((UnitVmModel) getWindow()).validateInstanceTypePart()) { return; } AsyncDataProvider.getInstance().isTemplateNameUnique(new AsyncQuery<>( isNameUnique -> { if (isNameUnique) { postInstanceTypeNameUniqueCheck(); } else { UnitVmModel VmModel = (UnitVmModel) getWindow(); VmModel.getInvalidityReasons().clear(); VmModel.getName() .getInvalidityReasons() .add(ConstantsManager.getInstance() .getConstants() .nameMustBeUniqueInvalidReason()); VmModel.getName().setIsValid(false); VmModel.setIsValid(false); } }), ((UnitVmModel) getWindow()).getName().getEntity(), null); } private void buildVmStatic(VmBase vmBase) { UnitVmModel model = (UnitVmModel) getWindow(); BuilderExecutor.build(model, vmBase, new HwOnlyCoreUnitToVmBaseBuilder(), new NameUnitToVmBaseBuilder(), new UsbPolicyUnitToVmBaseBuilder(), new MigrationOptionsUnitToVmBaseBuilder() ); // from CommonUnitToVmBaseBuilder vmBase.setAutoStartup(model.getIsHighlyAvailable().getEntity()); vmBase.setPriority(model.getPriority().getSelectedItem().getEntity()); } private void postInstanceTypeNameUniqueCheck() { UnitVmModel model = (UnitVmModel) getWindow(); VM vm = new VM(); buildVmStatic(vm.getStaticData()); vm.setVmDescription(model.getDescription().getEntity()); AddVmTemplateParameters addInstanceTypeParameters = new AddVmTemplateParameters(vm, model.getName().getEntity(), model.getDescription().getEntity()); addInstanceTypeParameters.setTemplateType(VmEntityType.INSTANCE_TYPE); addInstanceTypeParameters.setVmTemplateId(null); addInstanceTypeParameters.setPublicUse(true); addInstanceTypeParameters.setSoundDeviceEnabled(model.getIsSoundcardEnabled().getEntity()); addInstanceTypeParameters.setConsoleEnabled(model.getIsConsoleDeviceEnabled().getEntity()); addInstanceTypeParameters.setBalloonEnabled(model.getMemoryBalloonDeviceEnabled().getEntity()); addInstanceTypeParameters.setVirtioScsiEnabled(model.getIsVirtioScsiEnabled().getEntity()); if(model.getIsHeadlessModeEnabled().getEntity()) { addInstanceTypeParameters.getVm().setDefaultDisplayType(DisplayType.none); } setVmWatchdogToParams(model, addInstanceTypeParameters); setRngDeviceToParams(model, addInstanceTypeParameters); BuilderExecutor.build(model, addInstanceTypeParameters, new UnitToGraphicsDeviceParamsBuilder()); getWindow().startProgress(); Frontend.getInstance().runAction( VdcActionType.AddVmTemplate, addInstanceTypeParameters, new UnitVmModelNetworkAsyncCallback(model, addInstanceTypeNetworkManager), this ); } private void onEditInstanceType() { UnitVmModel model = (UnitVmModel) getWindow(); if (!model.validateInstanceTypePart()) { return; } VmTemplate instanceType = (VmTemplate) Cloner.clone(selectedItem); instanceType.setTemplateType(VmEntityType.INSTANCE_TYPE); buildVmStatic(instanceType); instanceType.setDescription(model.getDescription().getEntity()); UpdateVmTemplateParameters updateInstanceTypeParameters = new UpdateVmTemplateParameters(instanceType); updateInstanceTypeParameters.setSoundDeviceEnabled(model.getIsSoundcardEnabled().getEntity()); updateInstanceTypeParameters.setConsoleEnabled(model.getIsConsoleDeviceEnabled().getEntity()); updateInstanceTypeParameters.setBalloonEnabled(model.getMemoryBalloonDeviceEnabled().getEntity()); updateInstanceTypeParameters.setVirtioScsiEnabled(model.getIsVirtioScsiEnabled().getEntity()); if(model.getIsHeadlessModeEnabled().getEntity()) { updateInstanceTypeParameters.getVmTemplateData().setDefaultDisplayType(DisplayType.none); } setVmWatchdogToParams(model, updateInstanceTypeParameters); setRngDeviceToParams(model, updateInstanceTypeParameters); BuilderExecutor.build(model, updateInstanceTypeParameters, new UnitToGraphicsDeviceParamsBuilder()); getWindow().startProgress(); Frontend.getInstance().runAction( VdcActionType.UpdateVmTemplate, updateInstanceTypeParameters, new UnitVmModelNetworkAsyncCallback(model, addInstanceTypeNetworkManager, instanceType.getId()), this ); } private void onDeleteInstanceType() { final ConfirmationModel model = (ConfirmationModel) getConfirmWindow(); boolean latchChecked = !model.validate(); if (model.getProgress() != null || latchChecked) { return; } model.startProgress(); Guid instanceTypeId = getSelectedItem().getId(); Frontend.getInstance().runAction(VdcActionType.RemoveVmTemplate, new VmTemplateManagementParameters(instanceTypeId), result -> { model.stopProgress(); cancel(); }, this); } private void createWindow(VmModelBehaviorBase<UnitVmModel> behavior, String hashName, String onOkAction, boolean isNew, String title, HelpTag helpTag) { if (getWindow() != null) { return; } UnitVmModel model = new UnitVmModel(behavior, this); model.setIsAdvancedModeLocalStorageKey("instance_type_dialog"); //$NON-NLS-1$ setWindow(model); model.setTitle(title); model.setHelpTag(helpTag); model.setHashName(hashName); //$NON-NLS-1$ model.setIsNew(isNew); model.initialize(null); VmBasedWidgetSwitchModeCommand switchModeCommand = new VmBasedWidgetSwitchModeCommand(); switchModeCommand.init(model); model.getCommands().add(switchModeCommand); UICommand newTemplate = UICommand.createDefaultOkUiCommand(onOkAction, this); model.getCommands().add(newTemplate); UICommand cancel = UICommand.createCancelUiCommand("Cancel", this); //$NON-NLS-1$ model.getCommands().add(cancel); } private void cancel() { setWindow(null); setConfirmWindow(null); } protected void updateActionAvailability() { int numOfSelectedItems = getSelectedItems() != null ? getSelectedItems().size() : 0; getEditInstanceTypeCommand().setIsExecutionAllowed(numOfSelectedItems == 1); getDeleteInstanceTypeCommand().setIsExecutionAllowed(numOfSelectedItems == 1); } @Override protected void selectedItemsChanged() { super.selectedItemsChanged(); updateActionAvailability(); } @Override protected String getListName() { return "InstanceTypeListModel"; //$NON-NLS-1$ } @Override public void executeCommand(UICommand command) { super.executeCommand(command); if (command == getNewInstanceTypeCommand()) { newInstanceType(); } else if (Objects.equals(command.getName(), "OnNewInstanceType")) { //$NON-NLS-1$ onNewInstanceType(); } else if (command == getEditInstanceTypeCommand()) { editInstanceType(); } else if (Objects.equals(command.getName(), "OnEditInstanceType")) { //$NON-NLS-1$ onEditInstanceType(); } else if (command == getDeleteInstanceTypeCommand()) { deleteInstanceType(); } else if (Objects.equals(command.getName(), "OnDeleteInstanceType")) { //$NON-NLS-1$ onDeleteInstanceType(); } else if (Objects.equals(command.getName(), "Cancel")) { //$NON-NLS-1$ cancel(); } } private void setVmWatchdogToParams(final UnitVmModel model, VmTemplateManagementParameters updateVmParams) { VmWatchdogType wdModel = model.getWatchdogModel().getSelectedItem(); updateVmParams.setUpdateWatchdog(true); if (wdModel != null) { VmWatchdog vmWatchdog = new VmWatchdog(); vmWatchdog.setAction(model.getWatchdogAction().getSelectedItem()); vmWatchdog.setModel(wdModel); updateVmParams.setWatchdog(vmWatchdog); } } private void setRngDeviceToParams(UnitVmModel model, VmTemplateManagementParameters parameters) { parameters.setUpdateRngDevice(true); parameters.setRngDevice(model.getIsRngEnabled().getEntity() ? model.generateRngDevice() : null); } @Override public UICommand getEditCommand() { return getEditInstanceTypeCommand(); } public UICommand getNewInstanceTypeCommand() { return newInstanceTypeCommand; } public UICommand getEditInstanceTypeCommand() { return editInstanceTypeCommand; } public UICommand getDeleteInstanceTypeCommand() { return deleteInstanceTypeCommand; } }