Hello Arik Hadas, I'd like you to do a code review. Please visit
http://gerrit.ovirt.org/23613 to review the following change. Change subject: frontend: template versions in popup dialogs ...................................................................... frontend: template versions in popup dialogs This patch adds template versions (base template + version instead of just template) to all VM, pool and template dialogs Change-Id: I26f3ddba7833dd257bc8a069a772ad192352d1a2 Signed-off-by: Arik Hadas <aha...@redhat.com> --- M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.java M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.ui.xml M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmMakeTemplatePopupWidget.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/pools/PoolListModel.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/CloneVmFromSnapshotModelBehavior.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/ExistingPoolModelBehavior.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/ExistingVmModelBehavior.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewPoolModelBehavior.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewTemplateVmModelBehavior.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewVmModelBehavior.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/PoolModelBehaviorBase.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/TemplateVmModelBehavior.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UnitVmModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UserPortalNewVmModelBehavior.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmListModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmModelBehaviorBase.java M frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java 19 files changed, 292 insertions(+), 166 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/13/23613/1 diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java index 5598ea8..57d7ebb 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java @@ -60,11 +60,20 @@ String createAsSubTemplate(); @DefaultStringValue("Root Template") - String baseTemplate(); + String rootTemplate(); @DefaultStringValue("Sub Version Name") String templateVersionName(); + @DefaultStringValue("Template Sub Version") + String templateSubVersion(); + + @DefaultStringValue("latest") + String latest(); + + @DefaultStringValue("base template") + String baseTemplate(); + @DefaultStringValue("Disk ") String diskNamePrefix(); diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.java index 91765fa..015d7c9 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.java +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.java @@ -22,6 +22,7 @@ import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.businessentities.VmType; import org.ovirt.engine.core.common.queries.ConfigurationValues; +import org.ovirt.engine.core.compat.StringFormat; import org.ovirt.engine.core.compat.StringHelper; import org.ovirt.engine.ui.common.CommonApplicationConstants; import org.ovirt.engine.ui.common.CommonApplicationMessages; @@ -66,6 +67,7 @@ import org.ovirt.engine.ui.uicommonweb.models.vms.TimeZoneModel; import org.ovirt.engine.ui.uicommonweb.models.vms.UnitVmModel; import org.ovirt.engine.ui.uicommonweb.models.vms.key_value.KeyValueModel; +import org.ovirt.engine.ui.uicompat.ConstantsManager; import org.ovirt.engine.ui.uicompat.EnumTranslator; import org.ovirt.engine.ui.uicompat.Event; import org.ovirt.engine.ui.uicompat.EventArgs; @@ -168,6 +170,11 @@ @Path(value = "comment.entity") @WithElementId("comment") public StringEntityModelTextBoxEditor commentEditor; + + @UiField(provided = true) + @Path(value = "baseTemplate.selectedItem") + @WithElementId("baseTemplate") + public ListModelTypeAheadListBoxEditor<VmTemplate> baseTemplateEditor; @UiField(provided = true) @Path(value = "template.selectedItem") @@ -840,7 +847,7 @@ }, new ModeSwitchingVisibilityRenderer()); - templateEditor = new ListModelTypeAheadListBoxEditor<VmTemplate>( + baseTemplateEditor = new ListModelTypeAheadListBoxEditor<VmTemplate>( new ListModelTypeAheadListBoxEditor.NullSafeSuggestBoxRenderer<VmTemplate>() { @Override @@ -858,6 +865,36 @@ }, new ModeSwitchingVisibilityRenderer()); + templateEditor = new ListModelTypeAheadListBoxEditor<VmTemplate>( + new ListModelTypeAheadListBoxEditor.NullSafeSuggestBoxRenderer<VmTemplate>() { + + @Override + public String getReplacementStringNullSafe(VmTemplate data) { + return getDisplayableTemplateVersionName(data); + } + + @Override + public String getDisplayStringNullSafe(VmTemplate data) { + return typeAheadNameDescriptionTemplateNullSafe( + getDisplayableTemplateVersionName(data), + data.getDescription() + ); + } + + private String getDisplayableTemplateVersionName(VmTemplate template) { + String versionName = template.getTemplateVersionName(); + if (ConstantsManager.getInstance().getConstants().latestTemplateVersionName().equals(versionName)) { + return constants.latest(); + } + + versionName = template.getId().equals(template.getBaseTemplateId()) ? + constants.baseTemplate() : template.getTemplateVersionName(); + + return (versionName == null ? "" : versionName) //$NON-NLS-1$ + + StringFormat.format(" (%d)", template.getTemplateVersionNumber()); //$NON-NLS-1$ + } + }, + new ModeSwitchingVisibilityRenderer()); oSTypeEditor = new ListModelListBoxEditor<Integer>(new AbstractRenderer<Integer>() { @Override @@ -985,7 +1022,8 @@ nameLabel.setText(constants.nameVmPopup()); descriptionEditor.setLabel(constants.descriptionVmPopup()); commentEditor.setLabel(constants.commentLabel()); - templateEditor.setLabel(constants.basedOnTemplateVmPopup()); + baseTemplateEditor.setLabel(constants.basedOnTemplateVmPopup()); + templateEditor.setLabel(constants.templateSubVersion()); oSTypeEditor.setLabel(constants.osVmPopup()); vmTypeEditor.setLabel(constants.optimizedFor()); @@ -1392,6 +1430,7 @@ nextTabIndex = generalTab.setTabIndexes(nextTabIndex); quotaEditor.setTabIndex(nextTabIndex++); oSTypeEditor.setTabIndex(nextTabIndex++); + baseTemplateEditor.setTabIndex(nextTabIndex++); templateEditor.setTabIndex(nextTabIndex++); nameEditor.setTabIndex(nextTabIndex++); @@ -1565,6 +1604,7 @@ quotaEditor.setEnabled(false); dataCenterWithClusterEditor.setEnabled(false); templateEditor.setEnabled(false); + baseTemplateEditor.setEnabled(false); vmTypeEditor.setEnabled(false); } diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.ui.xml b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.ui.xml index c636bc9..81ef20f 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.ui.xml +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.ui.xml @@ -318,7 +318,8 @@ <g:FlowPanel addStyleNames="{style.headerPanel}"> <e:ListModelTypeAheadListBoxEditor ui:field="dataCenterWithClusterEditor" /> <e:ListModelTypeAheadListBoxEditor ui:field="quotaEditor" /> - <e:ListModelTypeAheadListBoxEditor ui:field="templateEditor"/> + <e:ListModelTypeAheadListBoxEditor ui:field="baseTemplateEditor"/> + <e:ListModelTypeAheadListBoxEditor ui:field="templateEditor" /> <e:ListModelListBoxEditor ui:field="oSTypeEditor" /> <e:ListModelListBoxEditor ui:field="vmTypeEditor" /> </g:FlowPanel> diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmMakeTemplatePopupWidget.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmMakeTemplatePopupWidget.java index 214fe0a..48501a6 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmMakeTemplatePopupWidget.java +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmMakeTemplatePopupWidget.java @@ -214,7 +214,7 @@ copyVmPermissions.setLabel(constants.copyVmPermissions()); disksAllocationLabel.setText(constants.disksAllocation()); isSubTemplateEditor.setLabel(constants.createAsSubTemplate()); - baseTemplateEditor.setLabel(constants.baseTemplate()); + baseTemplateEditor.setLabel(constants.rootTemplate()); templateVersionNameEditor.setLabel(constants.templateVersionName()); } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/pools/PoolListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/pools/PoolListModel.java index c91c92a..f4c96e4 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/pools/PoolListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/pools/PoolListModel.java @@ -51,9 +51,11 @@ import org.ovirt.engine.ui.uicompat.IFrontendMultipleActionAsyncCallback; import org.ovirt.engine.ui.uicompat.ObservableCollection; import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs; +import org.ovirt.engine.ui.uicompat.UIConstants; public class PoolListModel extends ListWithDetailsModel implements ISupportSystemTreeContext { + private final UIConstants constants = ConstantsManager.getInstance().getConstants(); private UICommand privateNewCommand; @@ -505,6 +507,8 @@ vm.setVmType(model.getVmType().getSelectedItem()); vm.setAllowConsoleReconnect(model.getAllowConsoleReconnect().getEntity()); + vm.setUseLatestVersion(constants.latestTemplateVersionName().equals(model.getTemplate().getSelectedItem().getTemplateVersionName())); + AddVmPoolWithVmsParameters param = new AddVmPoolWithVmsParameters(pool, vm, model.getNumOfDesktops().getEntity(), 0); 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 19e7e44..956bcb1 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 @@ -6,6 +6,7 @@ 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; import org.ovirt.engine.core.common.action.AddVmFromTemplateParameters; @@ -82,9 +83,11 @@ import org.ovirt.engine.ui.uicompat.IFrontendMultipleQueryAsyncCallback; import org.ovirt.engine.ui.uicompat.ObservableCollection; import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs; +import org.ovirt.engine.ui.uicompat.UIConstants; public class UserPortalListModel extends AbstractUserPortalListModel { + private final UIConstants constants = ConstantsManager.getInstance().getConstants(); public static final EventDefinition searchCompletedEventDefinition; private Event privateSearchCompletedEvent; @@ -1114,7 +1117,10 @@ UserPortalListModel userPortalListModel1 = (UserPortalListModel) model; final UnitVmModel unitVmModel = (UnitVmModel) userPortalListModel1.getWindow(); - AddVmFromTemplateParameters param = new AddVmFromTemplateParameters(gettempVm(), + VM vm = gettempVm(); + vm.setUseLatestVersion(constants.latestTemplateVersionName().equals(unitVmModel.getTemplate().getSelectedItem().getTemplateVersionName())); + + AddVmFromTemplateParameters param = new AddVmFromTemplateParameters(vm, unitVmModel.getDisksAllocationModel().getImageToDestinationDomainMap(), Guid.Empty); param.setMakeCreatorExplicitOwner(true); @@ -1129,7 +1135,10 @@ } else { - VmManagementParametersBase param = new VmManagementParametersBase(gettempVm()); + VM vm = gettempVm(); + vm.setUseLatestVersion(constants.latestTemplateVersionName().equals(model.getTemplate().getSelectedItem().getTemplateVersionName())); + + VmManagementParametersBase param = new VmManagementParametersBase(vm); param.setDiskInfoDestinationMap(model.getDisksAllocationModel().getImageToDestinationDomainMap()); param.setMakeCreatorExplicitOwner(true); param.setCopyTemplatePermissions(model.getCopyPermissions().getEntity()); @@ -1150,20 +1159,27 @@ new IFrontendActionAsyncCallback() { @Override public void executed(FrontendActionAsyncResult result) { - VmManagementParametersBase param = new VmManagementParametersBase(gettempVm()); + VM vm = gettempVm(); + vm.setUseLatestVersion(constants.latestTemplateVersionName().equals(model.getTemplate().getSelectedItem().getTemplateVersionName())); + + VmManagementParametersBase param = new VmManagementParametersBase(vm); param.setSoundDeviceEnabled(model.getIsSoundcardEnabled().getEntity()); param.setConsoleEnabled(model.getIsConsoleDeviceEnabled().getEntity()); - Frontend.getInstance().runAction(VdcActionType.UpdateVm, param, new UnitVmModelNetworkAsyncCallback(model, defaultNetworkCreatingManager, gettempVm().getId()), this); + Frontend.getInstance().runAction(VdcActionType.UpdateVm, param, new UnitVmModelNetworkAsyncCallback(model, defaultNetworkCreatingManager, vm.getId()), this); } }, this); } else { - VmManagementParametersBase param = new VmManagementParametersBase(gettempVm()); + VM vm = gettempVm(); + vm.setUseLatestVersion(constants.latestTemplateVersionName().equals(model.getTemplate().getSelectedItem().getTemplateVersionName())); + + VmManagementParametersBase param = new VmManagementParametersBase(vm); param.setSoundDeviceEnabled(model.getIsSoundcardEnabled().getEntity()); param.setConsoleEnabled(model.getIsConsoleDeviceEnabled().getEntity()); - Frontend.getInstance().runAction(VdcActionType.UpdateVm, param, new UnitVmModelNetworkAsyncCallback(model, defaultNetworkCreatingManager, gettempVm().getId()), this); + + Frontend.getInstance().runAction(VdcActionType.UpdateVm, param, new UnitVmModelNetworkAsyncCallback(model, defaultNetworkCreatingManager, vm.getId()), this); } } } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/CloneVmFromSnapshotModelBehavior.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/CloneVmFromSnapshotModelBehavior.java index c072f11..4c3a336 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/CloneVmFromSnapshotModelBehavior.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/CloneVmFromSnapshotModelBehavior.java @@ -1,46 +1,15 @@ package org.ovirt.engine.ui.uicommonweb.models.vms; import java.util.ArrayList; -import java.util.Arrays; import org.ovirt.engine.core.common.businessentities.DiskImage; -import org.ovirt.engine.core.common.businessentities.VmTemplate; -import org.ovirt.engine.ui.frontend.AsyncQuery; -import org.ovirt.engine.ui.frontend.INewAsyncCallback; import org.ovirt.engine.ui.uicommonweb.Linq; -import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; -import org.ovirt.engine.ui.uicommonweb.models.SystemTreeItemModel; @SuppressWarnings("unused") public class CloneVmFromSnapshotModelBehavior extends ExistingVmModelBehavior { public CloneVmFromSnapshotModelBehavior() { super(null); - } - - @Override - public void initialize(SystemTreeItemModel systemTreeSelectedItem) - { - super.initialize(systemTreeSelectedItem); - } - - public void initTemplate() - { - AsyncDataProvider.getTemplateById(new AsyncQuery(getModel(), - new INewAsyncCallback() { - @Override - public void onSuccess(Object target, Object returnValue) { - - UnitVmModel model = (UnitVmModel) target; - VmTemplate template = (VmTemplate) returnValue; - model.getTemplate() - .setItems(new ArrayList<VmTemplate>(Arrays.asList(new VmTemplate[] { template }))); - model.getTemplate().setSelectedItem(template); - model.getTemplate().setIsChangable(false); - } - }, - getModel().getHash()), - vm.getVmtGuid()); } @Override diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/ExistingPoolModelBehavior.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/ExistingPoolModelBehavior.java index 1feaffa..52dc405 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/ExistingPoolModelBehavior.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/ExistingPoolModelBehavior.java @@ -12,14 +12,12 @@ import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VmBase; import org.ovirt.engine.core.common.businessentities.VmStatic; -import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.StringHelper; import org.ovirt.engine.ui.frontend.AsyncQuery; import org.ovirt.engine.ui.frontend.INewAsyncCallback; import org.ovirt.engine.ui.uicommonweb.Linq; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; -import org.ovirt.engine.ui.uicommonweb.models.ListModel; import org.ovirt.engine.ui.uicommonweb.models.SystemTreeItemModel; import org.ovirt.engine.ui.uicommonweb.models.storage.DisksAllocationModel; import org.ovirt.engine.ui.uicommonweb.validation.ExistingPoolNameLengthValidation; @@ -35,6 +33,7 @@ @Override public void initialize(SystemTreeItemModel systemTreeSelectedItem) { + initTemplate(); super.initialize(systemTreeSelectedItem); if (!StringHelper.isNullOrEmpty(pool.getVmPoolSpiceProxy())) { @@ -52,18 +51,9 @@ } @Override - protected void setupSelectedTemplate(ListModel model, List<VmTemplate> templates) { - setupTemplate(pool, model); - } + public void postDataCenterWithClusterSelectedItemChanged() { + super.postDataCenterWithClusterSelectedItemChanged(); - @Override - public void template_SelectedItemChanged() { - getModel().setIsDisksAvailable(true); - updateHostPinning(pool.getMigrationSupport()); - } - - @Override - protected void postInitTemplate() { setupWindowModelFrom(pool.getStaticData()); getModel().setIsDisksAvailable(true); @@ -75,6 +65,21 @@ getModel().getDataCenterWithClustersList() .setSelectedItem((selectDataCenterWithCluster != null) ? selectDataCenterWithCluster : Linq.firstOrDefault(dataCenterWithClusters)); + + } + + public void initTemplate() { + setupTemplate(pool.getVmtGuid(), pool.isUseLatestVersion()); + } + + @Override + public void template_SelectedItemChanged() { + getModel().setIsDisksAvailable(true); + updateHostPinning(pool.getMigrationSupport()); + } + + @Override + protected void baseTemplateSelectedItemChanged() { } @Override diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/ExistingVmModelBehavior.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/ExistingVmModelBehavior.java index ea081fe..4b8fb20 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/ExistingVmModelBehavior.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/ExistingVmModelBehavior.java @@ -145,6 +145,10 @@ } @Override + protected void baseTemplateSelectedItemChanged() { + } + + @Override public void template_SelectedItemChanged() { // This method will be called even if a VM created from Blank template. @@ -324,9 +328,9 @@ } } - public void initTemplate() + protected void initTemplate() { - setupTemplate(vm, getModel().getTemplate()); + setupTemplate(vm.getVmtGuid(), vm.isUseLatestVersion()); } public void initCdImage() diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewPoolModelBehavior.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewPoolModelBehavior.java index fc1d930..89daaf5 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewPoolModelBehavior.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewPoolModelBehavior.java @@ -9,9 +9,7 @@ import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.ui.frontend.AsyncQuery; import org.ovirt.engine.ui.frontend.INewAsyncCallback; -import org.ovirt.engine.ui.uicommonweb.Linq; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; -import org.ovirt.engine.ui.uicommonweb.models.ListModel; import org.ovirt.engine.ui.uicommonweb.models.SystemTreeItemModel; import org.ovirt.engine.ui.uicommonweb.validation.IValidation; import org.ovirt.engine.ui.uicommonweb.validation.NewPoolNameLengthValidation; @@ -38,8 +36,30 @@ } @Override - protected void setupSelectedTemplate(ListModel model, List<VmTemplate> templates) { - getModel().getTemplate().setSelectedItem(Linq.<VmTemplate> firstOrDefault(templates)); + public void postDataCenterWithClusterSelectedItemChanged() { + super.postDataCenterWithClusterSelectedItemChanged(); + + final DataCenterWithCluster dataCenterWithCluster = + (DataCenterWithCluster) getModel().getDataCenterWithClustersList().getSelectedItem(); + StoragePool dataCenter = getModel().getSelectedDataCenter(); + if (dataCenter == null) { + return; + } + + AsyncDataProvider.getTemplateListByDataCenter(new AsyncQuery(this, new INewAsyncCallback() { + @Override + public void onSuccess(Object target1, Object returnValue1) { + + List<VmTemplate> baseTemplates = + filterNotBaseTemplates((List<VmTemplate>) returnValue1); + + List<VmTemplate> filteredTemplates = + AsyncDataProvider.filterTemplatesByArchitecture(baseTemplates, + dataCenterWithCluster.getCluster().getArchitecture()); + + getModel().getBaseTemplate().setItems(filteredTemplates); + } + }), dataCenter.getId()); } @Override diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewTemplateVmModelBehavior.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewTemplateVmModelBehavior.java index 8cdd6b1..ea76481 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewTemplateVmModelBehavior.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewTemplateVmModelBehavior.java @@ -441,4 +441,8 @@ getModel().getOSType().setSelectedItem(vm.getOs()); } } + + @Override + protected void baseTemplateSelectedItemChanged() { + } } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewVmModelBehavior.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewVmModelBehavior.java index 1d5f39c..ddd5fe0 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewVmModelBehavior.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewVmModelBehavior.java @@ -353,14 +353,16 @@ } } - private void postInitTemplate(ArrayList<VmTemplate> templates) + private void postInitTemplate(List<VmTemplate> templates) { + List<VmTemplate> rootTemplates = filterNotBaseTemplates(templates); + // If there was some template selected before, try select it again. - VmTemplate oldTemplate = getModel().getTemplate().getSelectedItem(); + VmTemplate oldTemplate = getModel().getBaseTemplate().getSelectedItem(); - getModel().getTemplate().setItems(templates); + getModel().getBaseTemplate().setItems(rootTemplates); - getModel().getTemplate().setSelectedItem(Linq.firstOrDefault(templates, + getModel().getBaseTemplate().setSelectedItem(Linq.firstOrDefault(rootTemplates, oldTemplate != null ? new Linq.TemplatePredicate(oldTemplate.getId()) : new Linq.TemplatePredicate(Guid.Empty))); diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/PoolModelBehaviorBase.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/PoolModelBehaviorBase.java index bd6ed5b..320211f 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/PoolModelBehaviorBase.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/PoolModelBehaviorBase.java @@ -13,10 +13,8 @@ import org.ovirt.engine.core.compat.StringHelper; import org.ovirt.engine.ui.frontend.AsyncQuery; import org.ovirt.engine.ui.frontend.INewAsyncCallback; -import org.ovirt.engine.ui.uicommonweb.Linq; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; import org.ovirt.engine.ui.uicommonweb.models.EntityModel; -import org.ovirt.engine.ui.uicommonweb.models.ListModel; import org.ovirt.engine.ui.uicommonweb.models.SystemTreeItemModel; import org.ovirt.engine.ui.uicommonweb.models.pools.PoolModel; import org.ovirt.engine.ui.uicommonweb.validation.HostWithProtocolAndPortAddressValidation; @@ -221,7 +219,6 @@ updateMemoryBalloon(); updateCpuSharesAvailability(); updateVirtioScsiAvailability(); - updateTemplate(); } @Override @@ -247,52 +244,6 @@ double overCommitFactor = 100.0 / cluster.getmax_vds_memory_over_commit(); getModel().getMinAllocatedMemory() .setEntity((int) (getModel().getMemSize().getEntity() * overCommitFactor)); - } - - private void updateTemplate() - { - final DataCenterWithCluster dataCenterWithCluster = - (DataCenterWithCluster) getModel().getDataCenterWithClustersList().getSelectedItem(); - StoragePool dataCenter = getModel().getSelectedDataCenter(); - if (dataCenter == null) { - return; - } - - AsyncDataProvider.getTemplateListByDataCenter(new AsyncQuery(this, new INewAsyncCallback() { - @Override - public void onSuccess(Object target1, Object returnValue1) { - - ArrayList<VmTemplate> loadedTemplates = (ArrayList<VmTemplate>) returnValue1; - - ArrayList<VmTemplate> templates = new ArrayList<VmTemplate>(); - for (VmTemplate template : loadedTemplates) { - if (!template.getId().equals(Guid.Empty)) { - templates.add(template); - } - } - - ArrayList<VmTemplate> filteredTemplates = AsyncDataProvider.filterTemplatesByArchitecture(templates, - dataCenterWithCluster.getCluster().getArchitecture()); - - getModel().getTemplate().setItems(filteredTemplates); - setupSelectedTemplate(getModel().getTemplate(), filteredTemplates); - } - }), dataCenter.getId()); - - } - - protected abstract void setupSelectedTemplate(ListModel model, List<VmTemplate> templates); - - private void postInitTemplate(ArrayList<VmTemplate> templates) - { - // If there was some template selected before, try select it again. - VmTemplate oldTemplate = getModel().getTemplate().getSelectedItem(); - - getModel().getTemplate().setItems(templates); - - getModel().getTemplate().setSelectedItem(Linq.firstOrDefault(templates, - oldTemplate != null ? new Linq.TemplatePredicate(oldTemplate.getId()) - : new Linq.TemplatePredicate(Guid.Empty))); } public void initCdImage() diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/TemplateVmModelBehavior.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/TemplateVmModelBehavior.java index 03491e8..7dce70f 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/TemplateVmModelBehavior.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/TemplateVmModelBehavior.java @@ -32,6 +32,7 @@ { super.initialize(systemTreeSelectedItem); getModel().getTemplate().setIsChangable(false); + getModel().getBaseTemplate().setIsChangable(false); getModel().getProvisioning().setIsChangable(false); getModel().getStorageDomain().setIsChangable(false); getModel().getIsSoundcardEnabled().setIsChangable(true); @@ -102,7 +103,14 @@ } } }), template.getId()); + getModel().getMigrationMode().setSelectedItem(template.getMigrationSupport()); + + setupBaseTemplate(template.getBaseTemplateId()); + } + + @Override + protected void baseTemplateSelectedItemChanged() { } @Override @@ -150,33 +158,32 @@ private void initTemplate() { // Update model state according to VM properties. - getModel().getName().setEntity(this.template.getName()); - getModel().getDescription().setEntity(this.template.getDescription()); - getModel().getComment().setEntity(this.template.getComment()); - getModel().getMinAllocatedMemory().setEntity(this.template.getMinAllocatedMem()); + getModel().getName().setEntity(template.getName()); + getModel().getDescription().setEntity(template.getDescription()); + getModel().getComment().setEntity(template.getComment()); + getModel().getMinAllocatedMemory().setEntity(template.getMinAllocatedMem()); getModel().getMinAllocatedMemory().setIsChangable(false); - getModel().getMemSize().setEntity(this.template.getMemSizeMb()); - getModel().getOSType().setSelectedItem(this.template.getOsId()); - getModel().getDomain().setSelectedItem(this.template.getDomain()); - getModel().getUsbPolicy().setSelectedItem(this.template.getUsbPolicy()); - getModel().getNumOfMonitors().setSelectedItem(this.template.getNumOfMonitors()); - getModel().getAllowConsoleReconnect().setEntity(this.template.isAllowConsoleReconnect()); - getModel().setBootSequence(this.template.getDefaultBootSequence()); - getModel().getIsHighlyAvailable().setEntity(this.template.isAutoStartup()); - getModel().getTotalCPUCores().setEntity(Integer.toString(this.template.getNumOfCpus())); - getModel().getNumOfSockets().setSelectedItem(this.template.getNumOfSockets()); - getModel().getIsStateless().setEntity(this.template.isStateless()); - getModel().getIsRunAndPause().setEntity(this.template.isRunAndPause()); - getModel().getIsDeleteProtected().setEntity(this.template.isDeleteProtected()); - getModel().selectSsoMethod(this.template.getSsoMethod()); - getModel().getIsSmartcardEnabled().setEntity(this.template.isSmartcardEnabled()); - getModel().getVncKeyboardLayout().setSelectedItem(this.template.getVncKeyboardLayout()); + getModel().getMemSize().setEntity(template.getMemSizeMb()); + getModel().getOSType().setSelectedItem(template.getOsId()); + getModel().getUsbPolicy().setSelectedItem(template.getUsbPolicy()); + getModel().getNumOfMonitors().setSelectedItem(template.getNumOfMonitors()); + getModel().getAllowConsoleReconnect().setEntity(template.isAllowConsoleReconnect()); + getModel().setBootSequence(template.getDefaultBootSequence()); + getModel().getIsHighlyAvailable().setEntity(template.isAutoStartup()); + getModel().getTotalCPUCores().setEntity(Integer.toString(template.getNumOfCpus())); + getModel().getNumOfSockets().setSelectedItem(template.getNumOfSockets()); + getModel().getIsStateless().setEntity(template.isStateless()); + getModel().getIsRunAndPause().setEntity(template.isRunAndPause()); + getModel().getIsDeleteProtected().setEntity(template.isDeleteProtected()); + getModel().selectSsoMethod(template.getSsoMethod()); + getModel().getIsSmartcardEnabled().setEntity(template.isSmartcardEnabled()); + getModel().getVncKeyboardLayout().setSelectedItem(template.getVncKeyboardLayout()); - getModel().getKernel_parameters().setEntity(this.template.getKernelParams()); - getModel().getKernel_path().setEntity(this.template.getKernelUrl()); - getModel().getInitrd_path().setEntity(this.template.getInitrdUrl()); + getModel().getKernel_parameters().setEntity(template.getKernelParams()); + getModel().getKernel_path().setEntity(template.getKernelUrl()); + getModel().getInitrd_path().setEntity(template.getInitrdUrl()); - getModel().getIsSingleQxlEnabled().setEntity(this.template.getSingleQxlPci()); + getModel().getIsSingleQxlEnabled().setEntity(template.getSingleQxlPci()); updateTimeZone(template.getTimeZone()); @@ -192,7 +199,7 @@ { DisplayType displayType = model.getEntity(); - if (displayType == this.template.getDefaultDisplayType()) + if (displayType == template.getDefaultDisplayType()) { getModel().getDisplayProtocol().setSelectedItem(model); break; @@ -201,7 +208,7 @@ updateConsoleDevice(template.getId()); - initPriority(this.template.getPriority()); + initPriority(template.getPriority()); } private void initCdImage() diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UnitVmModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UnitVmModel.java index 3758656..1d77018 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UnitVmModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UnitVmModel.java @@ -161,6 +161,7 @@ getPrestartedVms().setIsChangable(false); getMaxAssignedVmsPerUser().setIsChangable(false); + getBaseTemplate().setIsChangable(false); getTemplate().setIsChangable(false); getMemSize().setIsChangable(false); getTotalCPUCores().setIsChangable(false); @@ -1252,6 +1253,7 @@ setIsSubTemplate(new NotChangableForVmInPoolEntityModel<Boolean>(false)); setTemplateVersionName(new NotChangableForVmInPoolEntityModel<String>()); setBaseTemplate(new NotChangableForVmInPoolListModel<VmTemplate>()); + getBaseTemplate().getSelectedItemChangedEvent().addListener(this); setCdAttached(new NotChangableForVmInPoolEntityModel<Boolean>()); getCdAttached().getEntityChangedEvent().addListener(new IEventListener() { @@ -1508,6 +1510,9 @@ { behavior.updateCpuSharesAmountChangeability(); } + else if (sender == getBaseTemplate()) { + behavior.baseTemplateSelectedItemChanged(); + } } else if (ev.matchesDefinition(EntityModel.entityChangedEventDefinition)) { diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UserPortalNewVmModelBehavior.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UserPortalNewVmModelBehavior.java index ea61691..21b89f9 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UserPortalNewVmModelBehavior.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UserPortalNewVmModelBehavior.java @@ -112,8 +112,10 @@ initCdImage(); } - private void initTemplates(ArrayList<VmTemplate> templates) + private void initTemplates(List<VmTemplate> templates) { + List<VmTemplate> rootTemplates = filterNotBaseTemplates(templates); + // Filter templates list (include only templates that belong to the selected datacenter) ArrayList<VmTemplate> templatesList = new ArrayList<VmTemplate>(); VmTemplate blankTemplate = null; @@ -124,7 +126,7 @@ return; } - for (VmTemplate template : templates) + for (VmTemplate template : rootTemplates) { Guid datacenterId = template.getStoragePoolId() == null ? Guid.Empty : template.getStoragePoolId(); @@ -145,22 +147,21 @@ // Sort list and position "Blank" template as first Collections.sort(templatesList, new NameableComparator()); - if (blankTemplate != null && templates.contains(blankTemplate)) + if (blankTemplate != null && rootTemplates.contains(blankTemplate)) { templatesList.add(0, blankTemplate); } - ArrayList<VmTemplate> filteredTemplates = AsyncDataProvider.filterTemplatesByArchitecture(templatesList, + List<VmTemplate> filteredTemplates = AsyncDataProvider.filterTemplatesByArchitecture(templatesList, dataCenterWithCluster.getCluster().getArchitecture()); // If there was some template selected before, try select it again. - VmTemplate oldTemplate = getModel().getTemplate().getSelectedItem(); + VmTemplate prevBaseTemplate = getModel().getBaseTemplate().getSelectedItem(); - getModel().getTemplate().setItems(filteredTemplates); + getModel().getBaseTemplate().setItems(filteredTemplates); - getModel().getTemplate().setSelectedItem(Linq.firstOrDefault(filteredTemplates, - oldTemplate != null ? new Linq.TemplatePredicate(oldTemplate.getId()) - : new Linq.TemplatePredicate(Guid.Empty))); + getModel().getBaseTemplate().setSelectedItem(Linq.firstOrDefault(filteredTemplates, + new Linq.TemplatePredicate(prevBaseTemplate != null ? prevBaseTemplate.getId() : Guid.Empty))); updateIsDisksAvailable(); } 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 cae17b1..e3fab96 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 @@ -91,6 +91,7 @@ public class VmListModel extends VmBaseListModel<VM> implements ISupportSystemTreeContext { + private final UIConstants constants = ConstantsManager.getInstance().getConstants(); public static final Version BALLOON_DEVICE_MIN_VERSION = Version.v3_2; private UICommand newVMCommand; @@ -2008,8 +2009,10 @@ VmListModel vmListModel = (VmListModel) model1; UnitVmModel unitVmModel = (UnitVmModel) vmListModel.getWindow(); - AddVmFromTemplateParameters param = new AddVmFromTemplateParameters( - vmListModel.getcurrentVm(), + VM vm = vmListModel.getcurrentVm(); + vm.setUseLatestVersion(constants.latestTemplateVersionName().equals(unitVmModel.getTemplate().getSelectedItem().getTemplateVersionName())); + + AddVmFromTemplateParameters param = new AddVmFromTemplateParameters(vm, unitVmModel.getDisksAllocationModel().getImageToDestinationDomainMap(), Guid.Empty); param.setSoundDeviceEnabled(model.getIsSoundcardEnabled().getEntity()); @@ -2032,7 +2035,10 @@ model.startProgress(null); - VmManagementParametersBase params = new VmManagementParametersBase(getcurrentVm()); + VM vm = getcurrentVm(); + vm.setUseLatestVersion(constants.latestTemplateVersionName().equals(model.getTemplate().getSelectedItem().getTemplateVersionName())); + + VmManagementParametersBase params = new VmManagementParametersBase(vm); params.setDiskInfoDestinationMap(model.getDisksAllocationModel().getImageToDestinationDomainMap()); params.setConsoleEnabled(model.getIsConsoleDeviceEnabled().getEntity()); params.setBalloonEnabled(balloonEnabled(model)); @@ -2077,8 +2083,10 @@ VdcReturnValueBase returnValueBase = result.getReturnValue(); if (returnValueBase != null && returnValueBase.getSucceeded()) { - VmManagementParametersBase updateVmParams = - new VmManagementParametersBase(vmListModel.getcurrentVm()); + VM vm = vmListModel.getcurrentVm(); + vm.setUseLatestVersion(constants.latestTemplateVersionName().equals(model.getTemplate().getSelectedItem().getTemplateVersionName())); + + VmManagementParametersBase updateVmParams = new VmManagementParametersBase(vm); setVmWatchdogToParams(model, updateVmParams); updateVmParams.setSoundDeviceEnabled(model.getIsSoundcardEnabled() .getEntity()); @@ -2086,7 +2094,7 @@ updateVmParams.setVirtioScsiEnabled(model.getIsVirtioScsiEnabled().getEntity()); Frontend.getInstance().runAction(VdcActionType.UpdateVm, - updateVmParams, new UnitVmModelNetworkAsyncCallback(model, defaultNetworkCreatingManager, vmListModel.getcurrentVm().getId()), vmListModel); + updateVmParams, new UnitVmModelNetworkAsyncCallback(model, defaultNetworkCreatingManager, vm.getId()), vmListModel); } else { @@ -2105,13 +2113,18 @@ } model.startProgress(null); - VmManagementParametersBase updateVmParams = new VmManagementParametersBase(getcurrentVm()); + + VM vm = getcurrentVm(); + vm.setUseLatestVersion(constants.latestTemplateVersionName().equals(model.getTemplate().getSelectedItem().getTemplateVersionName())); + + VmManagementParametersBase updateVmParams = new VmManagementParametersBase(vm); setVmWatchdogToParams(model, updateVmParams); updateVmParams.setSoundDeviceEnabled(model.getIsSoundcardEnabled().getEntity()); updateVmParams.setConsoleEnabled(model.getIsConsoleDeviceEnabled().getEntity()); updateVmParams.setBalloonEnabled(balloonEnabled(model)); updateVmParams.setVirtioScsiEnabled(model.getIsVirtioScsiEnabled().getEntity()); + Frontend.getInstance().runAction(VdcActionType.UpdateVm, updateVmParams, new UnitVmModelNetworkAsyncCallback(model, defaultNetworkCreatingManager, getcurrentVm().getId()), this); } } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmModelBehaviorBase.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmModelBehaviorBase.java index 5e1c98b..356e83d 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmModelBehaviorBase.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmModelBehaviorBase.java @@ -2,7 +2,10 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; import java.util.List; import org.ovirt.engine.core.common.TimeZoneType; @@ -18,7 +21,6 @@ import org.ovirt.engine.core.common.businessentities.StoragePool; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSGroup; -import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VmBase; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.businessentities.VmType; @@ -50,6 +52,7 @@ private final UIConstants constants = ConstantsManager.getInstance().getConstants(); private TModel privateModel; + private HashMap<Guid, List<VmTemplate>> templateToSubVersions = new HashMap<Guid, List<VmTemplate>>(); public TModel getModel() { return privateModel; @@ -123,19 +126,62 @@ } - protected void postInitTemplate() { - - } - protected List<VmTemplate> filterNotBaseTemplates(List<VmTemplate> templates) { List<VmTemplate> baseTemplates = new ArrayList<VmTemplate>(); for (VmTemplate template : templates) { if (template.getId().equals(template.getBaseTemplateId())) { baseTemplates.add(template); + templateToSubVersions.put(template.getId(), + new ArrayList<VmTemplate>()); } } + for (VmTemplate template : templates) { + Guid baseTemplateId = template.getBaseTemplateId(); + if (templateToSubVersions.containsKey(baseTemplateId)) { + templateToSubVersions.get(baseTemplateId).add(template); + } + } + + for (List<VmTemplate> subversions : (Collection<List<VmTemplate>>) templateToSubVersions.values()) { + Collections.sort(subversions, new Comparator<VmTemplate>() { + @Override + public int compare(VmTemplate o1, VmTemplate o2) { + return o2.getTemplateVersionNumber() - o1.getTemplateVersionNumber(); + } + }); + } + + for (List<VmTemplate> subversions : templateToSubVersions.values()) { + subversions.add(0, createLatestTemplate(subversions.get(0))); + } + return baseTemplates; + } + + /** + * + * @param template - the template that the latest template should be based on + * @return template representing the latest template + */ + private VmTemplate createLatestTemplate(VmTemplate template) { + VmTemplate latestTemplate = new VmTemplate(template); + latestTemplate.setTemplateVersionName(constants.latestTemplateVersionName()); + latestTemplate.setDescription(constants.latestTemplateVersionDescription()); + + return latestTemplate; + } + + protected void baseTemplateSelectedItemChanged() { + VmTemplate baseTemplate = getModel().getBaseTemplate().getSelectedItem(); + if (baseTemplate != null) { + List<VmTemplate> subVersions = templateToSubVersions.get(baseTemplate.getId()); + getModel().getTemplate().setItems(new ArrayList<VmTemplate>(subVersions)); + + // it's safe because in index 0 there's the latest version and + // in index 1 the base version or the last custom version + getModel().getTemplate().setSelectedItem(subVersions.get(1)); + } } public boolean validate() @@ -739,7 +785,7 @@ getModel().getIsVirtioScsiEnabled().setIsAvailable(isVirtioScsiEnabled); } - protected void setupTemplate(VM vm, ListModel model) { + protected void setupTemplate(Guid templateId, final boolean useLatest) { AsyncDataProvider.getTemplateById(new AsyncQuery(getModel(), new INewAsyncCallback() { @Override @@ -747,15 +793,38 @@ UnitVmModel model = (UnitVmModel) target; VmTemplate template = (VmTemplate) returnValue; - model.getTemplate() - .setItems(new ArrayList<VmTemplate>(Arrays.asList(new VmTemplate[] { template }))); + + if (useLatest) { + template = createLatestTemplate(template); + } + + setupBaseTemplate(template.getBaseTemplateId()); + + model.getTemplate().setItems(Collections.singletonList(template)); model.getTemplate().setSelectedItem(template); model.getTemplate().setIsChangable(false); - postInitTemplate(); } }, getModel().getHash()), - vm.getVmtGuid()); + templateId); + } + + protected void setupBaseTemplate(Guid baseTemplateId) { + AsyncDataProvider.getTemplateById(new AsyncQuery(getModel(), + new INewAsyncCallback() { + @Override + public void onSuccess(Object target, Object returnValue) { + + UnitVmModel model = (UnitVmModel) target; + VmTemplate template = (VmTemplate) returnValue; + + model.getBaseTemplate().setItems(Collections.singletonList(template)); + model.getBaseTemplate().setSelectedItem(template); + model.getBaseTemplate().setIsChangable(false); + } + }, + getModel().getHash()), + baseTemplateId); } protected void updateCpuPinningVisibility() { 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 2d101c5..66e6e58 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 @@ -2161,5 +2161,11 @@ @DefaultStringValue("No networks selected") String noNetworksSelected(); + + @DefaultStringValue("<latest>") + String latestTemplateVersionName(); + + @DefaultStringValue("In case the vm is stateless, vm will be re-created with the LATEST template version") + String latestTemplateVersionDescription(); } -- To view, visit http://gerrit.ovirt.org/23613 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I26f3ddba7833dd257bc8a069a772ad192352d1a2 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.4 Gerrit-Owner: Omer Frenkel <ofren...@redhat.com> Gerrit-Reviewer: Arik Hadas <aha...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches