Frank Kobzik has uploaded a new change for review. Change subject: frontend: Allow console settings per user and pool. ......................................................................
frontend: Allow console settings per user and pool. This patch introduces the possibility of setting console options for user per vm pool and storing them in the browser local storage. These pool settings are then used as a default settings for all vms in the pool. If user explicitly changes settings for a single vm, this specific settings will override pool defaults. Moreover this patch adds some cleanup code in ConnectAutomaticallyManager. Change-Id: I0102ad0f44e4fb826c561ac593a428b51622a377 Signed-off-by: Frantisek Kobzik <fkob...@redhat.com> --- M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationMessages.java M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/presenter/popup/ConsolePopupPresenterWidget.java M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/utils/ConsoleOptionsFrontendPersisterImpl.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/ConsoleModelsCache.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/ConsoleProtocol.java A frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/ConsolesBase.java A frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/PoolConsolesImpl.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/VmConsolesImpl.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/AbstractUserPortalListModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalBasicListModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalListModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmListModel.java M frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java M frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/presenter/tab/basic/MainTabBasicDetailsPresenterWidget.java M frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/utils/ConnectAutomaticallyManager.java M frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/widget/extended/vm/ConsoleEditButtonCell.java 16 files changed, 360 insertions(+), 235 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/07/23007/1 diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationMessages.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationMessages.java index ebecdbe..abde869 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationMessages.java +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationMessages.java @@ -126,9 +126,6 @@ @DefaultMessage("Role: {0} on User {1}") SafeHtml roleOnUser(String roleName, String userName); - @DefaultMessage("Connecting to VM pool is not supported") - String connectingToPoolIsNotSupported(); - @DefaultMessage("Map control-alt-del shortcut to {0}") String remapCtrlAltDelete(String hotkey); diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/presenter/popup/ConsolePopupPresenterWidget.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/presenter/popup/ConsolePopupPresenterWidget.java index 219c72c..c4d38b7 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/presenter/popup/ConsolePopupPresenterWidget.java +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/presenter/popup/ConsolePopupPresenterWidget.java @@ -13,6 +13,7 @@ import org.ovirt.engine.ui.uicommonweb.models.ConsolePopupModel; import org.ovirt.engine.ui.uicommonweb.models.ConsoleProtocol; import org.ovirt.engine.ui.uicommonweb.models.VmConsoles; +import org.ovirt.engine.ui.uicommonweb.models.VmConsolesImpl; import org.ovirt.engine.ui.uicommonweb.models.vms.ISpice; import org.ovirt.engine.ui.uicommonweb.models.vms.RdpConsoleModel; import org.ovirt.engine.ui.uicommonweb.models.vms.SpiceConsoleModel; @@ -130,16 +131,15 @@ @Override public void init(final ConsolePopupModel model) { - if (model.getVmConsoles().getVm() == null) { - throw new IllegalArgumentException("The console popup can not be used with pool, only with VM"); //$NON-NLS-1$ - } - this.model = model; initModel(model); initView(model); initListeners(model); - String vmName = model.getVmConsoles().getVm().getName(); + String vmName = (model.getVmConsoles() instanceof VmConsolesImpl) + ? model.getVmConsoles().getVm().getName() + : model.getVmConsoles().getVm().getVmPoolName(); // for pool dialogs display pool name + getView().setVmName(vmName); getView().setCtrlAltDeleteRemapHotkey(consoleUtils.getRemapCtrlAltDelHotkey()); diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/utils/ConsoleOptionsFrontendPersisterImpl.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/utils/ConsoleOptionsFrontendPersisterImpl.java index 39d3d7e..cf1883a 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/utils/ConsoleOptionsFrontendPersisterImpl.java +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/utils/ConsoleOptionsFrontendPersisterImpl.java @@ -1,10 +1,13 @@ package org.ovirt.engine.ui.common.utils; +import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.ui.common.system.ClientStorage; import org.ovirt.engine.ui.uicommonweb.ConsoleOptionsFrontendPersister; import org.ovirt.engine.ui.uicommonweb.ConsoleUtils; import org.ovirt.engine.ui.uicommonweb.models.ConsoleProtocol; +import org.ovirt.engine.ui.uicommonweb.models.PoolConsolesImpl; import org.ovirt.engine.ui.uicommonweb.models.VmConsoles; +import org.ovirt.engine.ui.uicommonweb.models.VmConsolesImpl; import org.ovirt.engine.ui.uicommonweb.models.vms.IRdp; import org.ovirt.engine.ui.uicommonweb.models.vms.ISpice; import org.ovirt.engine.ui.uicommonweb.models.vms.IVnc; @@ -51,33 +54,51 @@ this.consoleUtils = consoleUtils; } - @Override - public void storeToLocalStorage(VmConsoles vmConsoles) { - ConsoleProtocol selectedProtocol = vmConsoles.getSelectedProcotol(); - ConsoleContext context = vmConsoles.getConsoleContext(); + public void storeToLocalStorage(VmConsoles consoles) { + storeConsolesInternal(consoles, consoles instanceof PoolConsolesImpl); + } - String id = vmConsoles.getVm().getId().toString(); - KeyMaker keyMaker = new KeyMaker(id, context); + private void storeConsolesInternal(VmConsoles consoles, boolean isPool) { + ConsoleProtocol selectedProtocol = consoles.getSelectedProcotol(); + ConsoleContext context = consoles.getConsoleContext(); + + String id = isPool + ? consoles.getVm().getVmPoolId().toString() + : consoles.getVm().getId().toString(); + KeyMaker keyMaker = new KeyMaker(id, isPool, context); clientStorage.setLocalItem(keyMaker.make(SELECTED_PROTOCOL), selectedProtocol.toString()); if (selectedProtocol == ConsoleProtocol.SPICE) { - storeSpiceData(vmConsoles, keyMaker); + storeSpiceData(consoles, keyMaker); } else if (selectedProtocol == ConsoleProtocol.VNC) { - storeVncData(vmConsoles, keyMaker); + storeVncData(consoles, keyMaker); } else if (selectedProtocol == ConsoleProtocol.RDP) { - storeRdpData(vmConsoles, keyMaker); + storeRdpData(consoles, keyMaker); } } @Override - public void loadFromLocalStorage(VmConsoles vmConsoles) { + public void loadFromLocalStorage(VmConsoles consoles) { + String vmId = guidToStringNullSafe(consoles.getVm().getId()); + String poolId = guidToStringNullSafe(consoles.getVm().getVmPoolId()); + ConsoleContext context = consoles.getConsoleContext(); - String vmId = vmConsoles.getVm().getId().toString(); - ConsoleContext context = vmConsoles.getConsoleContext(); + KeyMaker poolKeyMaker = new KeyMaker(poolId, true, context); + loadConsolesWithKeymaker(consoles, poolKeyMaker); // load pool defaults + if (consoles instanceof VmConsolesImpl) { + KeyMaker vmKeyMaker = new KeyMaker(vmId, false, context); + loadConsolesWithKeymaker(consoles, vmKeyMaker); // load vm + } + } - KeyMaker keyMaker = new KeyMaker(vmId, context); + private String guidToStringNullSafe(Guid id) { + return (id == null) + ? null + : id.toString(); + } + private void loadConsolesWithKeymaker(VmConsoles consoles, KeyMaker keyMaker) { String selectedProtocolString = clientStorage.getLocalItem(keyMaker.make(SELECTED_PROTOCOL)); if (selectedProtocolString == null || "".equals(selectedProtocolString)) { // if the protocol is not set, nothing is set - ignore @@ -86,16 +107,16 @@ ConsoleProtocol selectedProtocol = ConsoleProtocol.valueOf(selectedProtocolString); - if (!vmConsoles.canSelectProtocol(selectedProtocol)) { + if (!consoles.canSelectProtocol(selectedProtocol)) { return; } if (selectedProtocol == ConsoleProtocol.SPICE) { - loadSpiceData(vmConsoles, keyMaker); + loadSpiceData(consoles, keyMaker); } else if (selectedProtocol == ConsoleProtocol.VNC) { - loadVncData(vmConsoles, keyMaker); + loadVncData(consoles, keyMaker); } else if (selectedProtocol == ConsoleProtocol.RDP) { - loadRdpData(vmConsoles, keyMaker); + loadRdpData(consoles, keyMaker); } } @@ -202,18 +223,20 @@ } class KeyMaker { + private final String vmOrPoolId; - private final String vmId; + private final boolean isPool; private final ConsoleContext context; - public KeyMaker(String vmId, ConsoleContext context) { - this.vmId = vmId; + public KeyMaker(String vmOrPoolId, boolean isPool, ConsoleContext context) { + this.vmOrPoolId = vmOrPoolId; + this.isPool = isPool; this.context = context; } public String make(String key) { - return vmId + context + key; + return vmOrPoolId + isPool + context + key; } } } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/ConsoleModelsCache.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/ConsoleModelsCache.java index 22b8fa3b4..52169ee 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/ConsoleModelsCache.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/ConsoleModelsCache.java @@ -12,7 +12,7 @@ * Class that holds (caches) consoles for set of VM (typically contained in some ListModel). * * It provides a way to get consoles for given vm. - * The cache must be periodically updated (when the set of VM is updated, the updateCache + * The cache must be periodically updated (when the set of VM is updated, the updateVmCache * method must be called to ensure the underlying models have fresh and correct instance * of their VM). * @@ -20,29 +20,36 @@ public class ConsoleModelsCache { private final Map<Guid, VmConsoles> vmConsoles; + private final Map<Guid, VmConsoles> poolConsoles; private final Model parentModel; private final ConsoleContext consoleContext; public ConsoleModelsCache(ConsoleContext consoleContext, Model parentModel) { - vmConsoles = new HashMap<Guid, VmConsoles>(); this.consoleContext = consoleContext; this.parentModel = parentModel; + vmConsoles = new HashMap<Guid, VmConsoles>(); + poolConsoles = new HashMap<Guid, VmConsoles>(); } /** * Gets consoles for given VM - * @param vm - * @return vm's consoles + * @param vmId + * @return consoles of vm with given id */ - public VmConsoles getVmConsolesForVm(VM vm) { - return vmConsoles.get(vm.getId()); + public VmConsoles getVmConsolesForVmId(Guid vmId) { + return vmConsoles.get(vmId); + } + + public VmConsoles getVmConsolesForPoolId(Guid poolId) { + return poolConsoles.get(poolId); } /** * This must be called every update cycle. * @param newItems */ - public void updateCache(Iterable<VM> newItems) { + public void updateVmCache(Iterable<VM> newItems) { + updateCache(true, newItems); Set<Guid> vmIds = new HashSet<Guid>(); if (newItems != null) { @@ -58,4 +65,37 @@ vmConsoles.keySet().retainAll(vmIds); } + + public void updatePoolCache(Iterable<VM> poolRepresentants) { + updateCache(false, poolRepresentants); + } + + /** + * Updates cache for vms or pool representants (depending on isVmCache param) + * @param isVmCache - if true, update vm cache based on given entities + * - if false, update pool representants cache. + * @param entities + */ + private void updateCache(boolean isVmCache, Iterable<VM> entities) { + Map<Guid, VmConsoles> cacheToUpdate = isVmCache ? vmConsoles : poolConsoles; + Set<Guid> entityIdsToKeep = new HashSet<Guid>(); + + if (entities != null) { + for (VM vm : entities) { + Guid entityKey = isVmCache ? vm.getId() : vm.getVmPoolId(); + + if (cacheToUpdate.containsKey(entityKey)) { + cacheToUpdate.get(entityKey).setVm(vm); // only update vm + } else { + VmConsoles consoles = isVmCache + ? new VmConsolesImpl(vm, parentModel, consoleContext) + : new PoolConsolesImpl(vm, parentModel, consoleContext); + cacheToUpdate.put(entityKey, consoles); + } + entityIdsToKeep.add(entityKey); + } + } + + cacheToUpdate.keySet().retainAll(entityIdsToKeep); + } } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/ConsoleProtocol.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/ConsoleProtocol.java index b4f89cc..41ee971 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/ConsoleProtocol.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/ConsoleProtocol.java @@ -30,4 +30,8 @@ return null; } + + public Class getBackingClass() { + return model; + } } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/ConsolesBase.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/ConsolesBase.java new file mode 100644 index 0000000..e450839 --- /dev/null +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/ConsolesBase.java @@ -0,0 +1,134 @@ +package org.ovirt.engine.ui.uicommonweb.models; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.ovirt.engine.core.common.businessentities.DisplayType; +import org.ovirt.engine.core.common.businessentities.VM; +import org.ovirt.engine.ui.uicommonweb.ConsoleOptionsFrontendPersister; +import org.ovirt.engine.ui.uicommonweb.models.vms.ConsoleModel; +import org.ovirt.engine.ui.uicommonweb.models.vms.ConsoleModelErrorEventListener; +import org.ovirt.engine.ui.uicommonweb.models.vms.RdpConsoleModel; +import org.ovirt.engine.ui.uicommonweb.models.vms.SpiceConsoleModel; +import org.ovirt.engine.ui.uicommonweb.models.vms.VncConsoleModel; +import org.ovirt.engine.ui.uicompat.ConstantsManager; +import org.ovirt.engine.ui.uicompat.UIConstants; +import org.ovirt.engine.ui.uicompat.UIMessages; + +public class ConsolesBase { + + private ConsoleProtocol selectedProtocol; + protected final Map<ConsoleProtocol, ConsoleModel> consoleModels; + protected static final Map<Class, ConsoleProtocol> modelTypeMapping; + + private final ConsoleOptionsFrontendPersister.ConsoleContext myContext; + + private final Model parentModel; + private VM vm; + + protected static final UIMessages messages = ConstantsManager.getInstance().getMessages(); + protected static final UIConstants constants = ConstantsManager.getInstance().getConstants(); + + static { + modelTypeMapping = new HashMap<Class, ConsoleProtocol>(); + modelTypeMapping.put(SpiceConsoleModel.class, ConsoleProtocol.SPICE); + modelTypeMapping.put(VncConsoleModel.class, ConsoleProtocol.VNC); + modelTypeMapping.put(RdpConsoleModel.class, ConsoleProtocol.RDP); + } + + public ConsolesBase(VM vm, Model parentModel, ConsoleOptionsFrontendPersister.ConsoleContext consoleContext) { + this.vm = vm; + this.parentModel = parentModel; + this.myContext = consoleContext; + this.consoleModels = new HashMap<ConsoleProtocol, ConsoleModel>(); + + fillModels(); + setDefaultSelectedProtocol(); + } + + + private void fillModels() { + SpiceConsoleModel spiceConsoleModel = new SpiceConsoleModel(vm, parentModel); + spiceConsoleModel.getErrorEvent().addListener(new ConsoleModelErrorEventListener(parentModel)); + spiceConsoleModel.setForceVmStatusUp(myContext == ConsoleOptionsFrontendPersister.ConsoleContext.UP_BASIC); + consoleModels.put(ConsoleProtocol.SPICE, spiceConsoleModel); + + VncConsoleModel vncConsoleModel = new VncConsoleModel(vm, parentModel); + vncConsoleModel.setForceVmStatusUp(myContext == ConsoleOptionsFrontendPersister.ConsoleContext.UP_BASIC); + consoleModels.put(ConsoleProtocol.VNC, vncConsoleModel); + + RdpConsoleModel rdpConsoleModel = new RdpConsoleModel(vm, parentModel); + rdpConsoleModel.getErrorEvent().addListener(new ConsoleModelErrorEventListener(parentModel)); + rdpConsoleModel.setForceVmStatusUp(myContext == ConsoleOptionsFrontendPersister.ConsoleContext.UP_BASIC); + consoleModels.put(ConsoleProtocol.RDP, rdpConsoleModel); + } + + + protected void setDefaultSelectedProtocol() { + List<ConsoleProtocol> allProtocols = new ArrayList<ConsoleProtocol>(Arrays.asList(ConsoleProtocol.values())); + + if (selectedProtocol != null) { // if it's selected, it's prefered -> set it to the 1st position + allProtocols.remove(selectedProtocol); + allProtocols.add(0, selectedProtocol); + } + + for (ConsoleProtocol protocol : allProtocols) { + if (canSelectProtocol(protocol)) { + selectProtocol(protocol); + break; + } + } + } + + public boolean canSelectProtocol(ConsoleProtocol protocol) { + return consoleModels.get(protocol).canBeSelected(); + } + + public void selectProtocol(ConsoleProtocol protocol) throws IllegalArgumentException { + if (!canSelectProtocol(protocol)) { + throw new IllegalArgumentException("Cannot select " +protocol.toString() + " protocol for vm " + getVm().getName()); // $NON-NLS-1$ $NON-NLS-2$ + } + this.selectedProtocol = protocol; + } + + public ConsoleProtocol getSelectedProcotol() { + return selectedProtocol; + } + + public <T extends ConsoleModel> T getConsoleModel(Class <T> type) { + return (T) consoleModels.get(modelTypeMapping.get(type)); + } + + public boolean canConnectToConsole() { + return consoleModels.get(selectedProtocol).canConnect(); + } + + public ConsoleOptionsFrontendPersister.ConsoleContext getConsoleContext() { + return myContext; + } + + public VM getVm() { + return vm; + } + + public void setVm(VM newVm) { + DisplayType oldDisplayType = getVm().getDisplayType(); + DisplayType oldDefaultDisplayType = getVm().getDefaultDisplayType(); + int oldOs = getVm().getOs(); + + this.vm = newVm; + + for (ConsoleModel cModel : consoleModels.values()) { // update my console models too + cModel.setEntity(newVm); + } + + // if display types changed, we'd like to update the default selected protocol as the old one may be invalid + if (newVm.getDisplayType() != oldDisplayType + || newVm.getDefaultDisplayType() != oldDefaultDisplayType + || newVm.getOs() != oldOs) { + setDefaultSelectedProtocol(); + } + } +} diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/PoolConsolesImpl.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/PoolConsolesImpl.java new file mode 100644 index 0000000..e883561 --- /dev/null +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/PoolConsolesImpl.java @@ -0,0 +1,21 @@ +package org.ovirt.engine.ui.uicommonweb.models; + +import org.ovirt.engine.core.common.businessentities.VM; +import org.ovirt.engine.ui.uicommonweb.ConsoleOptionsFrontendPersister; + +public class PoolConsolesImpl extends ConsolesBase implements VmConsoles { + + public PoolConsolesImpl(VM vm, Model parentModel, ConsoleOptionsFrontendPersister.ConsoleContext consoleContext) { + super(vm, parentModel, consoleContext); + } + + @Override + public void connect() throws ConsoleConnectException { + throw new ConsoleConnectException(constants.connectToPoolNotSupported()); + } + + @Override + public String cannotConnectReason() { + return constants.connectToPoolNotSupported(); + } +} diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/VmConsolesImpl.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/VmConsolesImpl.java index b03a9ff..80e543e 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/VmConsolesImpl.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/VmConsolesImpl.java @@ -1,115 +1,20 @@ package org.ovirt.engine.ui.uicommonweb.models; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import org.ovirt.engine.core.common.businessentities.DisplayType; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.ui.uicommonweb.ConsoleOptionsFrontendPersister; -import org.ovirt.engine.ui.uicommonweb.models.vms.ConsoleModel; -import org.ovirt.engine.ui.uicommonweb.models.vms.ConsoleModelErrorEventListener; -import org.ovirt.engine.ui.uicommonweb.models.vms.RdpConsoleModel; -import org.ovirt.engine.ui.uicommonweb.models.vms.SpiceConsoleModel; -import org.ovirt.engine.ui.uicommonweb.models.vms.VncConsoleModel; -import org.ovirt.engine.ui.uicompat.ConstantsManager; -import org.ovirt.engine.ui.uicompat.UIMessages; -public class VmConsolesImpl implements VmConsoles { - - private ConsoleProtocol selectedProtocol; - private final Map<ConsoleProtocol, ConsoleModel> consoleModels; - private static final Map<Class, ConsoleProtocol> modelTypeMapping; - - private final ConsoleOptionsFrontendPersister.ConsoleContext myContext; - - private final Model parentModel; - private VM vm; - - private static final UIMessages messages = ConstantsManager.getInstance().getMessages(); +public class VmConsolesImpl extends ConsolesBase implements VmConsoles { public VmConsolesImpl(VM vm, Model parentModel, ConsoleOptionsFrontendPersister.ConsoleContext consoleContext) { - this.vm = vm; - this.parentModel = parentModel; - this.myContext = consoleContext; - this.consoleModels = new HashMap<ConsoleProtocol, ConsoleModel>(); - - fillModels(); - setDefaultSelectedProtocol(); + super(vm, parentModel, consoleContext); } - static { - modelTypeMapping = new HashMap<Class, ConsoleProtocol>(); - modelTypeMapping.put(SpiceConsoleModel.class, ConsoleProtocol.SPICE); - modelTypeMapping.put(VncConsoleModel.class, ConsoleProtocol.VNC); - modelTypeMapping.put(RdpConsoleModel.class, ConsoleProtocol.RDP); - } - - private void fillModels() { - SpiceConsoleModel spiceConsoleModel = new SpiceConsoleModel(vm, parentModel); - spiceConsoleModel.getErrorEvent().addListener(new ConsoleModelErrorEventListener(parentModel)); - spiceConsoleModel.setForceVmStatusUp(getConsoleContext() == ConsoleOptionsFrontendPersister.ConsoleContext.UP_BASIC); - consoleModels.put(ConsoleProtocol.SPICE, spiceConsoleModel); - - VncConsoleModel vncConsoleModel = new VncConsoleModel(vm, parentModel); - vncConsoleModel.setForceVmStatusUp(getConsoleContext() == ConsoleOptionsFrontendPersister.ConsoleContext.UP_BASIC); - consoleModels.put(ConsoleProtocol.VNC, vncConsoleModel); - - RdpConsoleModel rdpConsoleModel = new RdpConsoleModel(vm, parentModel); - rdpConsoleModel.getErrorEvent().addListener(new ConsoleModelErrorEventListener(parentModel)); - rdpConsoleModel.setForceVmStatusUp(getConsoleContext() == ConsoleOptionsFrontendPersister.ConsoleContext.UP_BASIC); - consoleModels.put(ConsoleProtocol.RDP, rdpConsoleModel); - } - - @Override - public boolean canSelectProtocol(ConsoleProtocol protocol) { - return consoleModels.get(protocol).canBeSelected(); - } - - @Override - public void selectProtocol(ConsoleProtocol protocol) throws IllegalArgumentException { - if (!canSelectProtocol(protocol)) { - throw new IllegalArgumentException("Cannot select " +protocol.toString() + " protocol for vm " + getVm().getName()); // $NON-NLS-1$ $NON-NLS-2$ - } - this.selectedProtocol = protocol; - } - - @Override - public ConsoleProtocol getSelectedProcotol() { - return selectedProtocol; - } - - public <T extends ConsoleModel> T getConsoleModel(Class <T> type) { - return (T) consoleModels.get(modelTypeMapping.get(type)); - } - - public boolean canConnectToConsole() { - return consoleModels.get(selectedProtocol).canConnect(); - } - - @Override public void connect() throws ConsoleConnectException { if (!canConnectToConsole()) { throw new ConsoleConnectException(connectErrorMessage()); } - consoleModels.get(selectedProtocol).getConnectCommand().execute(); - } - private void setDefaultSelectedProtocol() { - List<ConsoleProtocol> allProtocols = new ArrayList<ConsoleProtocol>(Arrays.asList(ConsoleProtocol.values())); - - if (selectedProtocol != null) { // if it's selected, it's prefered -> set it to the 1st position - allProtocols.remove(selectedProtocol); - allProtocols.add(0, selectedProtocol); - } - - for (ConsoleProtocol protocol : allProtocols) { - if (canSelectProtocol(protocol)) { - selectProtocol(protocol); - break; - } - } + getConsoleModel(getSelectedProcotol().getBackingClass()).getConnectCommand().execute(); } @Override @@ -126,31 +31,5 @@ : messages.errorConnectingToConsole(getVm().getName(), getSelectedProcotol().toString()); } - @Override - public ConsoleOptionsFrontendPersister.ConsoleContext getConsoleContext() { - return myContext; - } - @Override - public VM getVm() { - return vm; - } - - public void setVm(VM newVm) { - DisplayType oldDisplayType = getVm().getDisplayType(); - DisplayType oldDefaultDisplayType = getVm().getDefaultDisplayType(); - int oldOs = getVm().getOs(); - - this.vm = newVm; - for (ConsoleModel cModel : consoleModels.values()) { // update my console models too - cModel.setEntity(newVm); - } - - // if display types changed, we'd like to update the default selected protocol as the old one may be invalid - if (newVm.getDisplayType() != oldDisplayType - || newVm.getDefaultDisplayType() != oldDefaultDisplayType - || newVm.getOs() != oldOs) { - setDefaultSelectedProtocol(); - } - } } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/AbstractUserPortalListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/AbstractUserPortalListModel.java index db0f8b1..b96e3b0 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/AbstractUserPortalListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/AbstractUserPortalListModel.java @@ -53,18 +53,8 @@ return autoConnectableConsoles; } - public boolean getCanConnectAutomatically() - { - return canConnectAutomatically; - } - - public void setCanConnectAutomatically(boolean value) - { - if (canConnectAutomatically != value) - { - canConnectAutomatically = value; - onPropertyChanged(new PropertyChangedEventArgs("CanConnectAutomatically")); //$NON-NLS-1$ - } + public boolean getCanConnectAutomatically() { + return getAutoConnectableConsoles().size() == 1; } public UICommand getEditConsoleCommand() { @@ -76,13 +66,6 @@ } public abstract void onVmAndPoolLoad(); - - protected HashMap<Guid, VmPool> poolMap; - - public VmPool resolveVmPoolById(Guid id) - { - return poolMap.get(id); - } @Override public void executeCommand(UICommand command) { diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalBasicListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalBasicListModel.java index 3acd1e8..4b7941d 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalBasicListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalBasicListModel.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import org.ovirt.engine.core.common.businessentities.VM; @@ -28,6 +29,8 @@ import org.ovirt.engine.ui.uicompat.Event; import org.ovirt.engine.ui.uicompat.EventArgs; import org.ovirt.engine.ui.uicompat.EventDefinition; +import org.ovirt.engine.ui.uicompat.FrontendMultipleQueryAsyncResult; +import org.ovirt.engine.ui.uicompat.IFrontendMultipleQueryAsyncCallback; import org.ovirt.engine.ui.uicompat.ObservableCollection; import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs; @@ -279,18 +282,12 @@ @Override public void onVmAndPoolLoad() { - if (getvms() != null && getpools() != null) - { + if (getvms() != null && getpools() != null) { // Complete search. - // Remove pools that has provided VMs. ArrayList<VmPool> filteredPools = new ArrayList<VmPool>(); - poolMap = new HashMap<Guid, VmPool>(); for (VmPool pool : getpools()) { - // Add pool to map. - poolMap.put(pool.getVmPoolId(), pool); - int attachedVmsCount = 0; for (VM vm : getvms()) { if (vm.getVmPoolId() != null && vm.getVmPoolId().equals(pool.getVmPoolId())) { @@ -304,30 +301,51 @@ } // Merge VMs and Pools, and create item models. - List all = Linq.concat(getvms(), filteredPools); - consoleModelsCache.updateCache(filterVms(all)); - Collections.sort(all, new NameableComparator()); + final List all = Linq.concat(getvms(), filteredPools); - ArrayList<Model> items = new ArrayList<Model>(); - for (Object item : all) { - VmConsoles consoles = null; - if (item instanceof VM) { - consoles = consoleModelsCache.getVmConsolesForVm((VM) item); - } + List<VdcQueryType> poolQueryList = new ArrayList<VdcQueryType>(); + List<VdcQueryParametersBase> poolParamList = new ArrayList<VdcQueryParametersBase>(); - UserPortalItemModel model = new UserPortalItemModel(item, consoles); - model.setEntity(item); - items.add(model); + for (VmPool p : filteredPools) { + poolQueryList.add(VdcQueryType.GetVmDataByPoolId); + poolParamList.add(new IdQueryParameters(p.getVmPoolId())); } - setItems(items); + Frontend.getInstance().runMultipleQueries( + poolQueryList, poolParamList, + new IFrontendMultipleQueryAsyncCallback() { + @Override + public void executed(FrontendMultipleQueryAsyncResult result) { + List<VM> vmsOfPools = new LinkedList<VM>(); - setCanConnectAutomatically(getAutoConnectableConsoles().size() == 1); + List<VdcQueryReturnValue> poolRepresentants = result.getReturnValues(); + for (VdcQueryReturnValue poolRepresentant : poolRepresentants) { + vmsOfPools.add((VM) poolRepresentant.getReturnValue()); + } - setvms(null); - setpools(null); + consoleModelsCache.updateVmCache(getvms()); + consoleModelsCache.updatePoolCache(vmsOfPools); - getSearchCompletedEvent().raise(this, EventArgs.EMPTY); + Collections.sort(all, new NameableComparator()); + + ArrayList<Model> items = new ArrayList<Model>(); + for (Object item : all) { + VmConsoles consoles = (item instanceof VM) + ? consoleModelsCache.getVmConsolesForVmId(((VM) item).getId()) + : consoleModelsCache.getVmConsolesForPoolId(((VmPool) item).getVmPoolId()); + + UserPortalItemModel model = new UserPortalItemModel(item, consoles); + model.setEntity(item); + items.add(model); + } + + setItems(items); + + setvms(null); + setpools(null); + + getSearchCompletedEvent().raise(this, EventArgs.EMPTY); + }}); } } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalListModel.java index 61b8f79..a1bc60d 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalListModel.java @@ -4,6 +4,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import org.ovirt.engine.core.common.VdcActionUtils; import org.ovirt.engine.core.common.action.AddVmFromScratchParameters; @@ -27,6 +28,7 @@ import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.businessentities.VmType; import org.ovirt.engine.core.common.businessentities.comparators.NameableComparator; +import org.ovirt.engine.core.common.queries.IdQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryParametersBase; import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; import org.ovirt.engine.core.common.queries.VdcQueryType; @@ -75,7 +77,9 @@ import org.ovirt.engine.ui.uicompat.EventArgs; import org.ovirt.engine.ui.uicompat.EventDefinition; import org.ovirt.engine.ui.uicompat.FrontendActionAsyncResult; +import org.ovirt.engine.ui.uicompat.FrontendMultipleQueryAsyncResult; import org.ovirt.engine.ui.uicompat.IFrontendActionAsyncCallback; +import org.ovirt.engine.ui.uicompat.IFrontendMultipleQueryAsyncCallback; import org.ovirt.engine.ui.uicompat.ObservableCollection; import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs; @@ -1347,6 +1351,7 @@ } } + //todo this code duplication should be moved to base class, as well as other parts of this class @Override public void onVmAndPoolLoad() { if (getvms() != null && getpools() != null) { @@ -1354,11 +1359,8 @@ // Remove pools that has provided VMs. ArrayList<VmPool> filteredPools = new ArrayList<VmPool>(); - poolMap = new HashMap<Guid, VmPool>(); - for (VmPool pool : getpools()) { // Add pool to map. - poolMap.put(pool.getVmPoolId(), pool); int attachedVmsCount = 0; for (VM vm : getvms()) { @@ -1373,30 +1375,51 @@ } // Merge VMs and Pools, and create item models. - List all = Linq.concat(getvms(), filteredPools); - Collections.sort(all, new NameableComparator()); - consoleModelsCache.updateCache(filterVms(all)); + final List all = Linq.concat(getvms(), filteredPools); - ArrayList<Model> items = new ArrayList<Model>(); - for (Object item : all) - { - VmConsoles consoles = null; - if (item instanceof VM) { - consoles = consoleModelsCache.getVmConsolesForVm((VM) item); - } - UserPortalItemModel model = new UserPortalItemModel(item, consoles); - model.setEntity(item); - items.add(model); + List<VdcQueryType> poolQueryList = new ArrayList<VdcQueryType>(); + List<VdcQueryParametersBase> poolParamList = new ArrayList<VdcQueryParametersBase>(); + + for (VmPool p : filteredPools) { + poolQueryList.add(VdcQueryType.GetVmDataByPoolId); + poolParamList.add(new IdQueryParameters(p.getVmPoolId())); } - setItems(items); + Frontend.getInstance().runMultipleQueries( + poolQueryList, poolParamList, + new IFrontendMultipleQueryAsyncCallback() { + @Override + public void executed(FrontendMultipleQueryAsyncResult result) { + List<VM> vmsOfPools = new LinkedList<VM>(); - setCanConnectAutomatically(getAutoConnectableConsoles().size() == 1); + List<VdcQueryReturnValue> poolRepresentants = result.getReturnValues(); + for (VdcQueryReturnValue poolRepresentant : poolRepresentants) { + vmsOfPools.add((VM) poolRepresentant.getReturnValue()); + } - setvms(null); - setpools(null); + consoleModelsCache.updateVmCache(getvms()); + consoleModelsCache.updatePoolCache(vmsOfPools); - getSearchCompletedEvent().raise(this, EventArgs.EMPTY); + Collections.sort(all, new NameableComparator()); + + ArrayList<Model> items = new ArrayList<Model>(); + for (Object item : all) { + VmConsoles consoles = (item instanceof VM) + ? consoleModelsCache.getVmConsolesForVmId(((VM) item).getId()) + : consoleModelsCache.getVmConsolesForPoolId(((VmPool) item).getVmPoolId()); + + UserPortalItemModel model = new UserPortalItemModel(item, consoles); + model.setEntity(item); + items.add(model); + } + + setItems(items); + + setvms(null); + setpools(null); + + getSearchCompletedEvent().raise(this, EventArgs.EMPTY); + }}); } } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmListModel.java index c07d706..3b53457 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmListModel.java @@ -634,7 +634,7 @@ @Override public void setItems(Iterable value) { - consoleModelsCache.updateCache(value); + consoleModelsCache.updateVmCache(value); super.setItems(value); } @@ -676,7 +676,7 @@ return; } - final VmConsoles activeVmConsoles = consoleModelsCache.getVmConsolesForVm(((VM) getSelectedItem())); + final VmConsoles activeVmConsoles = consoleModelsCache.getVmConsolesForVmId((((VM) getSelectedItem()).getId())); final ConsolePopupModel model = new ConsolePopupModel(); model.setVmConsoles(activeVmConsoles); @@ -2283,7 +2283,7 @@ // return true, if at least one console is available for (VM vm : list) { - if (consoleModelsCache.getVmConsolesForVm(vm).canConnectToConsole()) { + if (consoleModelsCache.getVmConsolesForVmId(vm.getId()).canConnectToConsole()) { return true; } } @@ -2465,7 +2465,7 @@ for (VM vm : list) { try { - consoleModelsCache.getVmConsolesForVm(vm).connect(); + consoleModelsCache.getVmConsolesForVmId(vm.getId()).connect(); } catch (VmConsoles.ConsoleConnectException e) { final String errorMessage = e.getLocalizedErrorMessage(); if (errorMessage != null) { diff --git a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java index c94624f..152a12d 100644 --- a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java +++ b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java @@ -2105,5 +2105,8 @@ @DefaultStringValue("Not available when Templates are not configured.") String notAvailableWithNoTemplates(); + + @DefaultStringValue("Connecting to pool not supported.") + String connectToPoolNotSupported(); } diff --git a/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/presenter/tab/basic/MainTabBasicDetailsPresenterWidget.java b/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/presenter/tab/basic/MainTabBasicDetailsPresenterWidget.java index b82f3e9..c3b5fd0 100644 --- a/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/presenter/tab/basic/MainTabBasicDetailsPresenterWidget.java +++ b/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/presenter/tab/basic/MainTabBasicDetailsPresenterWidget.java @@ -171,10 +171,6 @@ private void setupConsole(final UserPortalBasicListProvider modelProvider) { UserPortalItemModel item = modelProvider.getModel().getSelectedItem(); - if (item.isPool()) { - getView().setConsoleWarningMessage(messages.connectingToPoolIsNotSupported()); - return; - } getView().setEditConsoleEnabled(isEditConsoleEnabled(item)); @@ -197,7 +193,12 @@ } private boolean isEditConsoleEnabled(UserPortalItemModel item) { - return item != null && item.getVM() != null && item.getVM().isRunningOrPaused(); + if (item == null) { + return false; + } + + return item.isPool() || + (item.getVM() != null && item.getVM().isRunningOrPaused()); } } diff --git a/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/utils/ConnectAutomaticallyManager.java b/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/utils/ConnectAutomaticallyManager.java index 1cabe5d..203c815 100644 --- a/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/utils/ConnectAutomaticallyManager.java +++ b/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/utils/ConnectAutomaticallyManager.java @@ -56,7 +56,6 @@ } public void registerModel(final AbstractUserPortalListModel model) { - if (alreadyOpened || !connectAutomatically.readConnectAutomatically()) { return; } diff --git a/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/widget/extended/vm/ConsoleEditButtonCell.java b/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/widget/extended/vm/ConsoleEditButtonCell.java index d685d66..355994f 100644 --- a/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/widget/extended/vm/ConsoleEditButtonCell.java +++ b/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/widget/extended/vm/ConsoleEditButtonCell.java @@ -10,6 +10,6 @@ @Override protected boolean shouldRenderCell(UserPortalItemModel model) { - return model.getVM() != null && model.getVM().isRunningOrPaused(); + return model.isPool() || model.getVM().isRunningOrPaused(); } } -- To view, visit http://gerrit.ovirt.org/23007 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I0102ad0f44e4fb826c561ac593a428b51622a377 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Frank Kobzik <fkob...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches