Hello Arik Hadas,

I'd like you to do a code review.  Please visit

    http://gerrit.ovirt.org/23611

to review the following change.

Change subject: frontend: support for making sub-templates
......................................................................

frontend: support for making sub-templates

Allows the user to create template as sub-template of other template in
the data center from both webadmin and user-portal

Change-Id: Ic35174ac6736b96e8854885a711830c93a4b79ad
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/vm/VmMakeTemplatePopupWidget.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmMakeTemplatePopupWidget.ui.xml
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/NewTemplateVmModelBehavior.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UnitVmModel.java
A 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UserPortalNewTemplateVmModelBehavior.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/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/view/popup/vm/VmMakeTemplatePopupView.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/vm/VmMakeTemplatePopupView.java
11 files changed, 344 insertions(+), 13 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/11/23611/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 0320591..5598ea8 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
@@ -56,6 +56,15 @@
     @DefaultStringValue("Disks Allocation:")
     String disksAllocation();
 
+    @DefaultStringValue("Create as a Sub Template version")
+    String createAsSubTemplate();
+
+    @DefaultStringValue("Root Template")
+    String baseTemplate();
+
+    @DefaultStringValue("Sub Version Name")
+    String templateVersionName();
+
     @DefaultStringValue("Disk ")
     String diskNamePrefix();
 
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 7afda23..214fe0a 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
@@ -1,15 +1,16 @@
 package org.ovirt.engine.ui.common.widget.uicommon.popup.vm;
 
 import org.ovirt.engine.core.common.businessentities.Quota;
+import org.ovirt.engine.core.common.businessentities.VmTemplate;
 import org.ovirt.engine.core.compat.StringHelper;
 import org.ovirt.engine.ui.common.CommonApplicationConstants;
 import org.ovirt.engine.ui.common.CommonApplicationTemplates;
 import org.ovirt.engine.ui.common.idhandler.ElementIdHandler;
 import org.ovirt.engine.ui.common.idhandler.WithElementId;
 import org.ovirt.engine.ui.common.widget.Align;
-import 
org.ovirt.engine.ui.common.widget.editor.generic.EntityModelCheckBoxEditor;
 import org.ovirt.engine.ui.common.widget.editor.ListModelListBoxEditor;
 import 
org.ovirt.engine.ui.common.widget.editor.ListModelTypeAheadListBoxEditor;
+import 
org.ovirt.engine.ui.common.widget.editor.generic.EntityModelCheckBoxEditor;
 import 
org.ovirt.engine.ui.common.widget.editor.generic.StringEntityModelTextBoxEditor;
 import org.ovirt.engine.ui.common.widget.renderer.NullSafeRenderer;
 import 
org.ovirt.engine.ui.common.widget.uicommon.popup.AbstractModelBoundPopupWidget;
@@ -28,6 +29,7 @@
 import com.google.gwt.uibinder.client.UiField;
 import com.google.gwt.user.client.ui.FlowPanel;
 import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.Panel;
 
 public class VmMakeTemplatePopupWidget extends 
AbstractModelBoundPopupWidget<UnitVmModel> {
 
@@ -61,6 +63,25 @@
     @Path(value = "dataCenterWithClustersList.selectedItem")
     @WithElementId("dataCenterWithCluster")
     public ListModelTypeAheadListBoxEditor<DataCenterWithCluster> 
clusterEditor;
+
+    @UiField(provided = true)
+    @Path(value = "isSubTemplate.entity")
+    @WithElementId("isSubTemplate")
+    EntityModelCheckBoxEditor isSubTemplateEditor;
+
+    @UiField
+    @Ignore
+    Panel subTemplateExpanderContent;
+
+    @UiField(provided = true)
+    @Path(value = "baseTemplate.selectedItem")
+    @WithElementId("baseTemplate")
+    public ListModelTypeAheadListBoxEditor<VmTemplate> baseTemplateEditor;
+
+    @UiField
+    @Path(value = "templateVersionName.entity")
+    @WithElementId("templateVersionName")
+    StringEntityModelTextBoxEditor templateVersionNameEditor;
 
     @UiField(provided = true)
     @Ignore
@@ -117,6 +138,7 @@
     void addStyle() {
         isTemplatePublicEditor.setContentWidgetStyleName(style.editorLabel());
         copyVmPermissions.setContentWidgetStyleName(style.editorLabel());
+        isSubTemplateEditor.setContentWidgetStyleName(style.editorLabel());
     }
 
     void initListBoxEditors() {
@@ -150,11 +172,36 @@
                 return object.getQuotaName();
             }
         });
+
+        baseTemplateEditor = new ListModelTypeAheadListBoxEditor<VmTemplate>(
+                new 
ListModelTypeAheadListBoxEditor.NullSafeSuggestBoxRenderer<VmTemplate>() {
+
+                    @Override
+                    public String getReplacementStringNullSafe(VmTemplate 
data) {
+                        return data.getName();
+                    }
+
+                    @Override
+                    public String getDisplayStringNullSafe(VmTemplate data) {
+                        return typeAheadNameDescriptionTemplateNullSafe(
+                                data.getName(),
+                                data.getDescription()
+                        );
+                    }
+                });
+    }
+
+    private String typeAheadNameDescriptionTemplateNullSafe(String name, 
String description) {
+        return applicationTemplates.typeAheadNameDescription(
+                name != null ? name : "",
+                description != null ? description : "")
+                .asString();
     }
 
     void initCheckBoxEditors() {
         isTemplatePublicEditor = new EntityModelCheckBoxEditor(Align.RIGHT);
         copyVmPermissions = new EntityModelCheckBoxEditor(Align.RIGHT);
+        isSubTemplateEditor = new EntityModelCheckBoxEditor(Align.RIGHT);
     }
 
     void localize(CommonApplicationConstants constants) {
@@ -166,6 +213,9 @@
         
isTemplatePublicEditor.setLabel(constants.makeTemplateIsTemplatePublicEditorLabel());
         copyVmPermissions.setLabel(constants.copyVmPermissions());
         disksAllocationLabel.setText(constants.disksAllocation());
+        isSubTemplateEditor.setLabel(constants.createAsSubTemplate());
+        baseTemplateEditor.setLabel(constants.baseTemplate());
+        templateVersionNameEditor.setLabel(constants.templateVersionName());
     }
 
     @Override
@@ -186,6 +236,14 @@
                 if ("Message".equals(propName)) { //$NON-NLS-1$
                     appendMessage(model.getMessage());
                 }
+            }
+        });
+
+        subTemplateExpanderContent.setVisible(false);
+        model.getIsSubTemplate().getEntityChangedEvent().addListener(new 
IEventListener() {
+            @Override
+            public void eventRaised(Event ev, Object sender, EventArgs args) {
+                
subTemplateExpanderContent.setVisible(model.getIsSubTemplate().getEntity());
             }
         });
     }
@@ -212,6 +270,9 @@
         commentEditor.setTabIndex(nextTabIndex++);
         clusterEditor.setTabIndex(nextTabIndex++);
         quotaEditor.setTabIndex(nextTabIndex++);
+        isSubTemplateEditor.setTabIndex(nextTabIndex++);
+        baseTemplateEditor.setTabIndex(nextTabIndex++);
+        templateVersionNameEditor.setTabIndex(nextTabIndex++);
         nextTabIndex = disksAllocationView.setTabIndexes(nextTabIndex);
         isTemplatePublicEditor.setTabIndex(nextTabIndex++);
         copyVmPermissions.setTabIndex(nextTabIndex++);
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmMakeTemplatePopupWidget.ui.xml
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmMakeTemplatePopupWidget.ui.xml
index 9bd95ea..467501e 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmMakeTemplatePopupWidget.ui.xml
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmMakeTemplatePopupWidget.ui.xml
@@ -28,6 +28,10 @@
                        padding-bottom: 5px;
                        padding-top: 10px;
                }
+
+               .generalExpanderContent {
+                       padding-left: 15px;
+               }
        </ui:style>
 
        <g:FlowPanel>
@@ -36,6 +40,11 @@
                <ge:StringEntityModelTextBoxEditor ui:field="commentEditor" />
                <e:ListModelTypeAheadListBoxEditor ui:field="clusterEditor" />
                <e:ListModelListBoxEditor ui:field="quotaEditor" />
+               <ge:EntityModelCheckBoxEditor ui:field="isSubTemplateEditor"/>
+               <g:FlowPanel ui:field="subTemplateExpanderContent" 
addStyleNames="{style.generalExpanderContent}">
+                       <e:ListModelTypeAheadListBoxEditor 
ui:field="baseTemplateEditor" />
+                       <ge:StringEntityModelTextBoxEditor 
ui:field="templateVersionNameEditor" />
+               </g:FlowPanel>
                <g:Label ui:field="disksAllocationLabel" 
addStyleNames="{style.disksAllocationLabel}" />
                <w:DisksAllocationView ui:field="disksAllocationView" 
listHeight="145px" listWidth="445px" 
addStyleNames="{style.disksAllocationPanel}" />
                <g:FlowPanel>
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 d378755..19e7e44 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
@@ -55,11 +55,11 @@
 import org.ovirt.engine.ui.uicommonweb.models.pools.PoolInterfaceListModel;
 import org.ovirt.engine.ui.uicommonweb.models.vms.ConsoleModel;
 import org.ovirt.engine.ui.uicommonweb.models.vms.DataCenterWithCluster;
-import org.ovirt.engine.ui.uicommonweb.models.vms.NewTemplateVmModelBehavior;
 import org.ovirt.engine.ui.uicommonweb.models.vms.RunOnceModel;
 import org.ovirt.engine.ui.uicommonweb.models.vms.UnitVmModel;
 import 
org.ovirt.engine.ui.uicommonweb.models.vms.UnitVmModelNetworkAsyncCallback;
 import 
org.ovirt.engine.ui.uicommonweb.models.vms.UserPortalExistingVmModelBehavior;
+import 
org.ovirt.engine.ui.uicommonweb.models.vms.UserPortalNewTemplateVmModelBehavior;
 import org.ovirt.engine.ui.uicommonweb.models.vms.UserPortalNewVmModelBehavior;
 import org.ovirt.engine.ui.uicommonweb.models.vms.UserPortalRunOnceModel;
 import org.ovirt.engine.ui.uicommonweb.models.vms.UserPortalVmEventListModel;
@@ -514,7 +514,7 @@
         }
 
         VM vm = (VM) selectedItem.getEntity();
-        UnitVmModel windowModel = new UnitVmModel(new 
NewTemplateVmModelBehavior(vm));
+        UnitVmModel windowModel = new UnitVmModel(new 
UserPortalNewTemplateVmModelBehavior(vm));
         setWindow(windowModel);
         
windowModel.setTitle(ConstantsManager.getInstance().getConstants().newTemplateTitle());
         windowModel.setHashName("new_template"); //$NON-NLS-1$
@@ -587,7 +587,7 @@
         }
     }
 
-    public void postNameUniqueCheck(UserPortalListModel userPortalListModel)
+    private void postNameUniqueCheck(UserPortalListModel userPortalListModel)
     {
         UnitVmModel model = (UnitVmModel) userPortalListModel.getWindow();
         UserPortalItemModel selectedItem = (UserPortalItemModel) 
userPortalListModel.getSelectedItem();
@@ -648,6 +648,10 @@
         
addVmTemplateParameters.setSoundDeviceEnabled(model.getIsSoundcardEnabled().getEntity());
         
addVmTemplateParameters.setConsoleEnabled(model.getIsConsoleDeviceEnabled().getEntity());
         
addVmTemplateParameters.setCopyVmPermissions(model.getCopyPermissions().getEntity());
+        if (model.getIsSubTemplate().getEntity()) {
+            
addVmTemplateParameters.setBaseTemplateId(model.getBaseTemplate().getSelectedItem().getId());
+            
addVmTemplateParameters.setTemplateVersionName(model.getTemplateVersionName().getEntity());
+        }
 
         Frontend.getInstance().runAction(VdcActionType.AddVmTemplate, 
addVmTemplateParameters,
                 new IFrontendActionAsyncCallback() {
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 6a34ae9..8cdd6b1 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
@@ -16,8 +16,10 @@
 import org.ovirt.engine.core.common.businessentities.StoragePool;
 import org.ovirt.engine.core.common.businessentities.VDSGroup;
 import org.ovirt.engine.core.common.businessentities.VM;
+import org.ovirt.engine.core.common.businessentities.VmTemplate;
 import org.ovirt.engine.core.common.businessentities.VolumeType;
 import 
org.ovirt.engine.core.common.businessentities.comparators.NameableComparator;
+import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.ui.frontend.AsyncQuery;
 import org.ovirt.engine.ui.frontend.INewAsyncCallback;
 import org.ovirt.engine.ui.uicommonweb.Linq;
@@ -36,6 +38,10 @@
     public NewTemplateVmModelBehavior(VM vm)
     {
         this.vm = vm;
+    }
+
+    protected VM getVm() {
+        return vm;
     }
 
     @Override
@@ -104,6 +110,93 @@
                 },
                 getModel().getHash()),
                 vm.getStoragePoolId());
+    }
+
+    protected void updateTemplate()
+    {
+        final DataCenterWithCluster dataCenterWithCluster =
+                (DataCenterWithCluster) 
getModel().getDataCenterWithClustersList().getSelectedItem();
+        StoragePool dataCenter = dataCenterWithCluster == null ? null : 
dataCenterWithCluster.getDataCenter();
+        if (dataCenter == null) {
+            return;
+        }
+
+        // Filter according to system tree selection.
+        if (getSystemTreeSelectedItem() != null && 
getSystemTreeSelectedItem().getType() == SystemTreeItemType.Storage)
+        {
+            StorageDomain storage = (StorageDomain) 
getSystemTreeSelectedItem().getEntity();
+
+            AsyncDataProvider.getTemplateListByDataCenter(new AsyncQuery(new 
Object[] { this, storage },
+                    new INewAsyncCallback() {
+                        @Override
+                        public void onSuccess(Object target1, Object 
returnValue1) {
+
+                            Object[] array1 = (Object[]) target1;
+                            NewTemplateVmModelBehavior behavior1 = 
(NewTemplateVmModelBehavior) array1[0];
+                            StorageDomain storage1 = (StorageDomain) array1[1];
+                            AsyncDataProvider.getTemplateListByStorage(new 
AsyncQuery(new Object[] { behavior1,
+                                    returnValue1 },
+                                    new INewAsyncCallback() {
+                                        @Override
+                                        public void onSuccess(Object target2, 
Object returnValue2) {
+
+                                            Object[] array2 = (Object[]) 
target2;
+                                            NewTemplateVmModelBehavior 
behavior2 = (NewTemplateVmModelBehavior) array2[0];
+                                            ArrayList<VmTemplate> 
templatesByDataCenter =
+                                                    (ArrayList<VmTemplate>) 
array2[1];
+                                            ArrayList<VmTemplate> 
templatesByStorage =
+                                                    (ArrayList<VmTemplate>) 
returnValue2;
+                                            VmTemplate blankTemplate =
+                                                    
Linq.firstOrDefault(templatesByDataCenter,
+                                                            new 
Linq.TemplatePredicate(Guid.Empty));
+                                            if (blankTemplate != null)
+                                            {
+                                                templatesByStorage.add(0, 
blankTemplate);
+                                            }
+
+                                            ArrayList<VmTemplate> templateList 
= AsyncDataProvider.filterTemplatesByArchitecture(templatesByStorage,
+                                                            
dataCenterWithCluster.getCluster().getArchitecture());
+
+                                            
behavior2.postInitTemplate(templateList);
+
+                                        }
+                                    }),
+                                    storage1.getId());
+
+                        }
+                    }, getModel().getHash()),
+                    dataCenter.getId());
+        }
+        else
+        {
+            AsyncDataProvider.getTemplateListByDataCenter(new AsyncQuery(this,
+                    new INewAsyncCallback() {
+                        @Override
+                        public void onSuccess(Object target, Object 
returnValue) {
+
+                            NewTemplateVmModelBehavior behavior = 
(NewTemplateVmModelBehavior) target;
+
+                            ArrayList<VmTemplate> templates = 
(ArrayList<VmTemplate>) returnValue;
+
+                            
behavior.postInitTemplate(AsyncDataProvider.filterTemplatesByArchitecture(templates,
+                                    
dataCenterWithCluster.getCluster().getArchitecture()));
+
+                        }
+                    }, getModel().getHash()), dataCenter.getId());
+        }
+    }
+
+    private void postInitTemplate(List<VmTemplate> templates)
+    {
+        List<VmTemplate> baseTemplates = filterNotBaseTemplates(templates);
+
+        VmTemplate currentTemplate = Linq.firstOrDefault(templates,
+                new Linq.TemplatePredicate(vm.getVmtGuid()));
+
+        getModel().getBaseTemplate().setItems(baseTemplates);
+
+        
getModel().getBaseTemplate().setSelectedItem(Linq.firstOrDefault(baseTemplates,
+                new 
Linq.TemplatePredicate(currentTemplate.getBaseTemplateId())));
     }
 
     @Override
@@ -181,6 +274,7 @@
         updateCpuSharesAvailability();
         updateVirtioScsiAvailability();
         updateOSValues();
+        updateTemplate();
     }
 
     @Override
@@ -339,12 +433,6 @@
         getModel().getStorageDomain().setIsChangable(false);
         getModel().getIsTemplatePublic().setIsChangable(false);
         getModel().getDefaultCommand().setIsAvailable(false);
-    }
-
-    @Override
-    public boolean validate()
-    {
-        return super.validate();
     }
 
     @Override
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 eb516fa..3758656 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
@@ -446,6 +446,18 @@
         privateTemplate = value;
     }
 
+    private NotChangableForVmInPoolListModel<VmTemplate> baseTemplate;
+
+    public ListModel<VmTemplate> getBaseTemplate()
+    {
+        return baseTemplate;
+    }
+
+    private void setBaseTemplate(NotChangableForVmInPoolListModel<VmTemplate> 
value)
+    {
+        baseTemplate = value;
+    }
+
     private NotChangableForVmInPoolListModel<VmType> vmType;
 
     public void setVmType(NotChangableForVmInPoolListModel<VmType> vmType) {
@@ -539,6 +551,18 @@
     private void setComment(NotChangableForVmInPoolEntityModel<String> value)
     {
         privateComment = value;
+    }
+
+    private NotChangableForVmInPoolEntityModel<String> templateVersionName;
+
+    public EntityModel<String> getTemplateVersionName()
+    {
+        return templateVersionName;
+    }
+
+    private void 
setTemplateVersionName(NotChangableForVmInPoolEntityModel<String> value)
+    {
+        templateVersionName = value;
     }
 
     private NotChangableForVmInPoolListModel<String> privateDomain;
@@ -873,6 +897,16 @@
     private void setCdImage(NotChangableForVmInPoolListModel<String> value)
     {
         privateCdImage = value;
+    }
+
+    private NotChangableForVmInPoolEntityModel<Boolean> isSubTemplate;
+
+    public EntityModel<Boolean> getIsSubTemplate() {
+        return isSubTemplate;
+    }
+
+    public void setIsSubTemplate(NotChangableForVmInPoolEntityModel<Boolean> 
value) {
+        isSubTemplate = value;
     }
 
     private NotChangableForVmInPoolEntityModel<Boolean> cdAttached;
@@ -1214,6 +1248,10 @@
 
         setSpiceProxyEnabled(new EntityModel<Boolean>());
         setSpiceProxy(new EntityModel<String>());
+
+        setIsSubTemplate(new 
NotChangableForVmInPoolEntityModel<Boolean>(false));
+        setTemplateVersionName(new 
NotChangableForVmInPoolEntityModel<String>());
+        setBaseTemplate(new NotChangableForVmInPoolListModel<VmTemplate>());
 
         setCdAttached(new NotChangableForVmInPoolEntityModel<Boolean>());
         getCdAttached().getEntityChangedEvent().addListener(new 
IEventListener() {
@@ -2473,6 +2511,13 @@
     }
 
     private class NotChangableForVmInPoolEntityModel<T> extends EntityModel<T> 
{
+        public NotChangableForVmInPoolEntityModel() {
+        }
+
+        public NotChangableForVmInPoolEntityModel(T entity) {
+            super(entity);
+        }
+
         @Override
         public EntityModel<T> setIsChangable(boolean value) {
             if (!isVmAttachedToPool()) {
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UserPortalNewTemplateVmModelBehavior.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UserPortalNewTemplateVmModelBehavior.java
new file mode 100644
index 0000000..b2a752d
--- /dev/null
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UserPortalNewTemplateVmModelBehavior.java
@@ -0,0 +1,100 @@
+package org.ovirt.engine.ui.uicommonweb.models.vms;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.ovirt.engine.core.common.businessentities.ActionGroup;
+import org.ovirt.engine.core.common.businessentities.StoragePool;
+import org.ovirt.engine.core.common.businessentities.VM;
+import org.ovirt.engine.core.common.businessentities.VmTemplate;
+import org.ovirt.engine.core.common.businessentities.VmTemplateStatus;
+import 
org.ovirt.engine.core.common.businessentities.comparators.NameableComparator;
+import 
org.ovirt.engine.core.common.queries.GetEntitiesWithPermittedActionParameters;
+import org.ovirt.engine.core.common.queries.VdcQueryParametersBase;
+import org.ovirt.engine.core.common.queries.VdcQueryReturnValue;
+import org.ovirt.engine.core.common.queries.VdcQueryType;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.ui.frontend.Frontend;
+import org.ovirt.engine.ui.uicommonweb.Linq;
+import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider;
+import org.ovirt.engine.ui.uicompat.FrontendMultipleQueryAsyncResult;
+import org.ovirt.engine.ui.uicompat.IFrontendMultipleQueryAsyncCallback;
+
+public class UserPortalNewTemplateVmModelBehavior extends 
NewTemplateVmModelBehavior implements IFrontendMultipleQueryAsyncCallback {
+
+    private static final ActionGroup CREATE_VM = ActionGroup.CREATE_VM;
+
+    public UserPortalNewTemplateVmModelBehavior(VM vm) {
+        super(vm);
+    }
+
+    @Override
+    protected void updateTemplate() {
+        ArrayList<VdcQueryType> queryTypeList = new ArrayList<VdcQueryType>();
+        queryTypeList.add(VdcQueryType.GetVmTemplatesWithPermittedAction);
+
+        GetEntitiesWithPermittedActionParameters 
getEntitiesWithPermittedActionParameters =
+                new GetEntitiesWithPermittedActionParameters();
+        getEntitiesWithPermittedActionParameters.setActionGroup(CREATE_VM);
+
+        ArrayList<VdcQueryParametersBase> parametersList =
+                new ArrayList<VdcQueryParametersBase>(Arrays.asList(new 
VdcQueryParametersBase[] {
+                        getEntitiesWithPermittedActionParameters }));
+
+        Frontend.getInstance().runMultipleQueries(queryTypeList, 
parametersList, this, getModel().getHash());
+    }
+
+    @Override
+    public void executed(FrontendMultipleQueryAsyncResult result) {
+        List<VdcQueryReturnValue> returnValueList = result.getReturnValues();
+        ArrayList<VmTemplate> templates =
+                (ArrayList<VmTemplate>) 
returnValueList.get(0).getReturnValue();
+        initTemplates(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;
+        DataCenterWithCluster dataCenterWithCluster = 
getModel().getDataCenterWithClustersList().getSelectedItem();
+        StoragePool selectedDataCenter = dataCenterWithCluster.getDataCenter();
+        Guid selectedDataCenterId = selectedDataCenter.getId();
+        if (selectedDataCenterId == null) {
+            return;
+        }
+
+        for (VmTemplate template : rootTemplates) {
+            Guid datacenterId =
+                    template.getStoragePoolId() == null ? Guid.Empty : 
template.getStoragePoolId();
+
+            if (template.getId().equals(Guid.Empty)) {
+                blankTemplate = template;
+            } else if (!selectedDataCenterId.equals(datacenterId)) {
+                continue;
+            } else if (template.getStatus() == VmTemplateStatus.OK) {
+                templatesList.add(template);
+            }
+        }
+
+        // Sort list and position "Blank" template as first
+        Collections.sort(templatesList, new NameableComparator());
+        if (blankTemplate != null && rootTemplates.contains(blankTemplate)) {
+            templatesList.add(0, blankTemplate);
+        }
+
+        List<VmTemplate> filteredTemplates = 
AsyncDataProvider.filterTemplatesByArchitecture(templatesList,
+                dataCenterWithCluster.getCluster().getArchitecture());
+
+        VmTemplate currentTemplate = Linq.firstOrDefault(templates,
+                new Linq.TemplatePredicate(getVm().getVmtGuid()));
+
+        getModel().getBaseTemplate().setItems(filteredTemplates);
+
+        
getModel().getBaseTemplate().setSelectedItem(Linq.firstOrDefault(filteredTemplates,
+                new 
Linq.TemplatePredicate(currentTemplate.getBaseTemplateId())));
+    }
+}
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 4ac6063..cae17b1 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
@@ -1298,7 +1298,7 @@
         }
     }
 
-    public void postNameUniqueCheck()
+    private void postNameUniqueCheck()
     {
         UnitVmModel model = (UnitVmModel) getWindow();
         VM vm = (VM) getSelectedItem();
@@ -1359,6 +1359,10 @@
         
addVmTemplateParameters.setCopyVmPermissions(model.getCopyPermissions().getEntity());
         model.startProgress(null);
         
addVmTemplateParameters.setConsoleEnabled(model.getIsConsoleDeviceEnabled().getEntity());
+        if (model.getIsSubTemplate().getEntity()) {
+            
addVmTemplateParameters.setBaseTemplateId(model.getBaseTemplate().getSelectedItem().getId());
+            
addVmTemplateParameters.setTemplateVersionName(model.getTemplateVersionName().getEntity());
+        }
 
         Frontend.getInstance().runAction(VdcActionType.AddVmTemplate, 
addVmTemplateParameters,
                 new IFrontendActionAsyncCallback() {
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 85097c5..5e1c98b 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
@@ -127,6 +127,17 @@
 
     }
 
+    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);
+            }
+        }
+
+        return baseTemplates;
+    }
+
     public boolean validate()
     {
         return true;
diff --git 
a/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/view/popup/vm/VmMakeTemplatePopupView.java
 
b/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/view/popup/vm/VmMakeTemplatePopupView.java
index 2dff146..c06d1cd 100644
--- 
a/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/view/popup/vm/VmMakeTemplatePopupView.java
+++ 
b/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/view/popup/vm/VmMakeTemplatePopupView.java
@@ -21,7 +21,7 @@
 
     @Inject
     public VmMakeTemplatePopupView(EventBus eventBus, ApplicationResources 
resources, ApplicationConstants constants, CommonApplicationTemplates 
applicationTemplates) {
-        super(eventBus, resources, new VmMakeTemplatePopupWidget(constants, 
applicationTemplates), "460px", "510px"); //$NON-NLS-1$ //$NON-NLS-2$
+        super(eventBus, resources, new VmMakeTemplatePopupWidget(constants, 
applicationTemplates), "470px", "560px"); //$NON-NLS-1$ //$NON-NLS-2$
         ViewIdHandler.idHandler.generateAndSetIds(this);
     }
 
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/vm/VmMakeTemplatePopupView.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/vm/VmMakeTemplatePopupView.java
index 4855df5..f36408a 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/vm/VmMakeTemplatePopupView.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/vm/VmMakeTemplatePopupView.java
@@ -21,7 +21,7 @@
 
     @Inject
     public VmMakeTemplatePopupView(EventBus eventBus, ApplicationResources 
resources, ApplicationConstants constants, CommonApplicationTemplates 
applicationTemplates) {
-        super(eventBus, resources, new VmMakeTemplatePopupWidget(constants, 
applicationTemplates), "460px", "510px"); //$NON-NLS-1$ //$NON-NLS-2$
+        super(eventBus, resources, new VmMakeTemplatePopupWidget(constants, 
applicationTemplates), "470px", "560px"); //$NON-NLS-1$ //$NON-NLS-2$
         ViewIdHandler.idHandler.generateAndSetIds(this);
     }
 


-- 
To view, visit http://gerrit.ovirt.org/23611
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic35174ac6736b96e8854885a711830c93a4b79ad
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