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

Reply via email to