package org.ovirt.engine.ui.uicommonweb.models.pools; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.ovirt.engine.core.common.action.RemoveVmFromPoolParameters; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VMStatus; import org.ovirt.engine.core.common.businessentities.VmPool; import org.ovirt.engine.ui.frontend.Frontend; import org.ovirt.engine.ui.uicommonweb.UICommand; import org.ovirt.engine.ui.uicommonweb.help.HelpTag; import org.ovirt.engine.ui.uicommonweb.models.ConfirmationModel; import org.ovirt.engine.ui.uicommonweb.models.configure.PermissionListModel; import org.ovirt.engine.ui.uicommonweb.models.configure.scheduling.affinity_groups.list.VmAffinityGroupListModel; import org.ovirt.engine.ui.uicommonweb.models.vms.ImportVmsModel; import org.ovirt.engine.ui.uicommonweb.models.vms.VmAppListModel; import org.ovirt.engine.ui.uicommonweb.models.vms.VmDevicesListModel; import org.ovirt.engine.ui.uicommonweb.models.vms.VmDiskListModel; import org.ovirt.engine.ui.uicommonweb.models.vms.VmEventListModel; import org.ovirt.engine.ui.uicommonweb.models.vms.VmGeneralModel; import org.ovirt.engine.ui.uicommonweb.models.vms.VmGuestInfoModel; import org.ovirt.engine.ui.uicommonweb.models.vms.VmInterfaceListModel; import org.ovirt.engine.ui.uicommonweb.models.vms.VmListModel; import org.ovirt.engine.ui.uicommonweb.models.vms.VmSnapshotListModel; import org.ovirt.engine.ui.uicommonweb.models.vms.hostdev.VmHostDeviceListModel; import org.ovirt.engine.ui.uicompat.ConstantsManager; import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs; import com.google.inject.Inject; import com.google.inject.Provider; public class PoolVmListModel extends VmListModel<VmPool> { private UICommand privateDetachCommand; public UICommand getDetachCommand() { return privateDetachCommand; } private void setDetachCommand(UICommand value) { privateDetachCommand = value; } @Inject public PoolVmListModel(final VmGeneralModel vmGeneralModel, final VmInterfaceListModel vmInterfaceListModel, final VmDiskListModel vmDiskListModel, final VmSnapshotListModel vmSnapshotListModel, final VmEventListModel vmEventListModel, final VmAppListModel<VM> vmAppListModel, final PermissionListModel<VM> permissionListModel, final VmAffinityGroupListModel vmAffinityGroupListModel, final VmGuestInfoModel vmGuestInfoModel, final Provider<ImportVmsModel> importVmsModelProvider, VmHostDeviceListModel vmHostDeviceListModel, final VmDevicesListModel vmDevicesListModel) { super(vmGeneralModel, vmInterfaceListModel, vmDiskListModel, vmSnapshotListModel, vmEventListModel, vmAppListModel, permissionListModel, vmAffinityGroupListModel, vmGuestInfoModel, importVmsModelProvider, vmHostDeviceListModel, vmDevicesListModel); setTitle(ConstantsManager.getInstance().getConstants().virtualMachinesTitle()); setHelpTag(HelpTag.virtual_machines); setHashName("virtual_machines"); //$NON-NLS-1$ setDetachCommand(new UICommand("Detach", this)); //$NON-NLS-1$ updateActionAvailability(); } @Override protected void onEntityChanged() { super.onEntityChanged(); getSearchCommand().execute(); } @Override public void search() { if (getEntity() != null) { setSearchString("Vms: pool=" + getEntity().getName()); //$NON-NLS-1$ super.search(); } } @Override protected void entityPropertyChanged(Object sender, PropertyChangedEventArgs e) { super.entityPropertyChanged(sender, e); if (e.propertyName.equals("vm_pool_name")) { //$NON-NLS-1$ getSearchCommand().execute(); } } public void detach() { if (getConfirmWindow() != null) { return; } ConfirmationModel model = new ConfirmationModel(); setConfirmWindow(model); model.setTitle(ConstantsManager.getInstance().getConstants().detachVirtualMachinesTitle()); model.setHelpTag(HelpTag.detach_virtual_machine); model.setHashName("detach_virtual_machine"); //$NON-NLS-1$ ArrayList<String> list = new ArrayList<>(); for (VM item : getSelectedItems()) { list.add(item.getName()); } Collections.sort(list); model.setItems(list); if (list.size() == getEntity().getAssignedVmsCount()) { model.getLatch().setIsAvailable(true); model.getLatch().setIsChangeable(true); model.setNote(ConstantsManager.getInstance().getConstants().detachAllVmsWarning()); } model.setMessage(ConstantsManager.getInstance() .getConstants() .areYouSurYouWantToDetachSelectedVirtualMachinesMsg()); UICommand tempVar = UICommand.createDefaultOkUiCommand("OnDetach", this); //$NON-NLS-1$ model.getCommands().add(tempVar); UICommand tempVar2 = UICommand.createCancelUiCommand("Cancel", this); //$NON-NLS-1$ model.getCommands().add(tempVar2); } public void onDetach() { ConfirmationModel model = (ConfirmationModel) getConfirmWindow(); boolean latchChecked = !model.validate(); if (model.getProgress() != null || latchChecked) { return; } ArrayList<VdcActionParametersBase> list = new ArrayList<>(); for (Object item : getSelectedItems()) { VM vm = (VM) item; list.add(new RemoveVmFromPoolParameters(vm.getId(), true, true)); } model.startProgress(); Frontend.getInstance().runMultipleAction(VdcActionType.RemoveVmFromPool, list, result -> { ConfirmationModel localModel = (ConfirmationModel) result.getState(); localModel.stopProgress(); cancel(); }, model); } @Override protected void onSelectedItemChanged() { super.onSelectedItemChanged(); updateActionAvailability(); } @Override protected void selectedItemsChanged() { super.selectedItemsChanged(); updateActionAvailability(); } @Override protected void selectedItemPropertyChanged(Object sender, PropertyChangedEventArgs e) { super.selectedItemPropertyChanged(sender, e); if (e.propertyName.equals("status")) {//$NON-NLS-1$ updateActionAvailability(); } } private void updateActionAvailability() { List<VM> items = getSelectedItems() != null ? getSelectedItems() : new ArrayList<VM>(); boolean value = true; for (VM a : items) { if (a.getStatus() != VMStatus.Down) { value = false; break; } } getDetachCommand().setIsExecutionAllowed(items.size() > 0 && value); } @Override public void executeCommand(UICommand command) { super.executeCommand(command); if (command == getDetachCommand()) { detach(); } if ("OnDetach".equals(command.getName())) { //$NON-NLS-1$ onDetach(); } if ("Cancel".equals(command.getName())) { //$NON-NLS-1$ cancel(); } } }