Tomas Jelinek has uploaded a new change for review.

Change subject: userportal,webadmin: Added instance images to VM dialog
......................................................................

userportal,webadmin: Added instance images to VM dialog

WIP

Change-Id: I32cec1002b2c2af81e05788ae823141c97cb27d4
Signed-off-by: Tomas Jelinek <[email protected]>
---
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/view/popup/AbstractVmPopupView.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/profile/ProfilesInstanceTypeEditor.ui.xml
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/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/vm/VmSpecificUnitToVmBuilder.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/UnitVmModel.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmModelBehaviorBase.java
9 files changed, 285 insertions(+), 106 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/89/28589/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 d556f35..bc1ee9c 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
@@ -670,7 +670,7 @@
     @DefaultStringValue("Watchdog Model")
     String watchdogModel();
 
-    @DefaultStringValue("Template Provisioning")
+    @DefaultStringValue("Template/Image Provisioning")
     String templateProvisVmPopup();
 
     @DefaultStringValue("Thin")
@@ -721,7 +721,7 @@
     @DefaultStringValue("Storage Allocation:")
     String storageAllocVmPopup();
 
-    @DefaultStringValue("(Available only when a template is selected)")
+    @DefaultStringValue("(Available only when a template or image is 
selected)")
     String availOnlyTemplSelectedVmPopup();
 
     @DefaultStringValue("Boot Sequence:")
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/view/popup/AbstractVmPopupView.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/view/popup/AbstractVmPopupView.java
index 144c77f..2f4e06d 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/view/popup/AbstractVmPopupView.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/view/popup/AbstractVmPopupView.java
@@ -16,7 +16,7 @@
     @Inject
     public AbstractVmPopupView(EventBus eventBus, CommonApplicationResources 
resources,
             AbstractVmPopupWidget popupWidget) {
-        this(eventBus, resources, popupWidget, "690px", "580px"); 
//$NON-NLS-1$ //$NON-NLS-2$
+        this(eventBus, resources, popupWidget, "700px", "580px"); 
//$NON-NLS-1$ //$NON-NLS-2$
     }
 
     public AbstractVmPopupView(EventBus eventBus, CommonApplicationResources 
resources,
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/profile/ProfilesInstanceTypeEditor.ui.xml
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/profile/ProfilesInstanceTypeEditor.ui.xml
index 99c240c..6f0585c 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/profile/ProfilesInstanceTypeEditor.ui.xml
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/profile/ProfilesInstanceTypeEditor.ui.xml
@@ -10,7 +10,7 @@
                        float: left;
                        padding-left: 5px;
                        margin-left: 5px;
-                       width: 400px;
+                       width: 95%;
                }
 
                .headerLabel {
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 330fbf4..e18a057 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
@@ -201,6 +201,16 @@
     public ListModelTypeAheadListBoxEditor<VmTemplate> templateEditor;
 
     @UiField(provided = true)
+    @Path(value = "baseInstanceImage.selectedItem")
+    @WithElementId("baseInstanceImage")
+    public ListModelTypeAheadListBoxEditor<VmTemplate> baseInstanceImageEditor;
+
+    @UiField(provided = true)
+    @Path(value = "instanceImage.selectedItem")
+    @WithElementId("instanceImage")
+    public ListModelTypeAheadListBoxEditor<VmTemplate> instanceImageEditor;
+
+    @UiField(provided = true)
     @Path(value = "OSType.selectedItem")
     @WithElementId("osType")
     public ListModelListBoxEditor<Integer> oSTypeEditor;
@@ -1066,52 +1076,19 @@
                 new ModeSwitchingVisibilityRenderer());
 
         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()
-                        );
-                    }
-                },
+                new BaseTemplateSuggestBoxRenderer(),
                 new ModeSwitchingVisibilityRenderer());
 
         templateEditor = new ListModelTypeAheadListBoxEditor<VmTemplate>(
-                new 
ListModelTypeAheadListBoxEditor.NullSafeSuggestBoxRenderer<VmTemplate>() {
+                new TemplateVersionSuggestBoxRenderer(),
+                new ModeSwitchingVisibilityRenderer());
 
-                    @Override
-                    public String getReplacementStringNullSafe(VmTemplate 
data) {
-                        return getDisplayableTemplateVersionName(data);
-                    }
+        baseInstanceImageEditor = new 
ListModelTypeAheadListBoxEditor<VmTemplate>(
+                new BaseTemplateSuggestBoxRenderer(),
+                new ModeSwitchingVisibilityRenderer());
 
-                    @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$
-                    }
-                },
+        instanceImageEditor = new ListModelTypeAheadListBoxEditor<VmTemplate>(
+                new TemplateVersionSuggestBoxRenderer(),
                 new ModeSwitchingVisibilityRenderer());
 
         oSTypeEditor = new ListModelListBoxEditor<Integer>(new 
AbstractRenderer<Integer>() {
@@ -1353,6 +1330,8 @@
     }
 
     protected void applyStyles() {
+        baseInstanceImageEditor.hideLabel();
+        instanceImageEditor.hideLabel();
         hostCpuEditor.addContentWidgetStyleName(style.longCheckboxContent());
         
allowConsoleReconnectEditor.addContentWidgetStyleName(style.longCheckboxContent());
         
provisioningEditor.addContentWidgetStyleName(style.provisioningEditorContent());
@@ -2025,6 +2004,8 @@
         dataCenterWithClusterEditor.setEnabled(false);
         templateEditor.setEnabled(false);
         baseTemplateEditor.setEnabled(false);
+        instanceImageEditor.setEnabled(false);
+        baseInstanceImageEditor.setEnabled(false);
         vmTypeEditor.setEnabled(false);
         instanceTypesEditor.setEnabled(false);
     }
@@ -2085,4 +2066,47 @@
             adminOnlyField.setVisible(false);
         }
     }
+
+    class BaseTemplateSuggestBoxRenderer extends 
ListModelTypeAheadListBoxEditor.NullSafeSuggestBoxRenderer<VmTemplate> {
+        @Override
+        public String getReplacementStringNullSafe(VmTemplate data) {
+            return data.getName();
+        }
+
+        @Override
+        public String getDisplayStringNullSafe(VmTemplate data) {
+            return typeAheadNameDescriptionTemplateNullSafe(
+                    data.getName(),
+                    data.getDescription()
+            );
+        }
+    }
+
+    class TemplateVersionSuggestBoxRenderer extends 
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$
+        }
+    }
 }
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 a4e6976..090feeb 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
@@ -323,23 +323,27 @@
             float: left;
         }
 
-        .labelToCoupleCouple {
+        .labelToCoupleCouple, .instanceImageCouple {
             float: right;
             line-height: 30px;
             padding: 0 5px;
+        }
+
+        .labelToCoupleCouple {
             width: 230px;
         }
 
-        .labelToCoupleCoupleLeft {
-            float: left;
-        }
-
-        .labelToCoupleCoupleRight {
+        .labelToCoupleCoupleLeft, .labelToCoupleCoupleRight {
             float: left;
         }
 
         .cpuSahresValueListBox, .cpuSahresValueTextBox {
             width: 110px;
+        }
+
+        .instanceImageListBox {
+            width: 192px;
+            padding-left: 5px;
         }
 
         .cpuPinningTextBox {
@@ -451,6 +455,13 @@
                             <ge:EntityModelCheckBoxEditor 
ui:field="isDeleteProtectedEditor" 
contentWidgetStyleName="{style.horizontallyAlignedCheckBoxContent}" 
addStyleNames="{style.horizontallyAlignedCheckBox}" />
                             <ge:EntityModelCheckBoxEditor 
ui:field="copyTemplatePermissionsEditor" 
contentWidgetStyleName="{style.horizontallyAlignedCheckBoxContent}" 
addStyleNames="{style.horizontallyAlignedCheckBox}" />
                         </g:FlowPanel>
+                        <g:FlowPanel addStyleNames="{style.labelToCouple}">
+                            <g:Label text="{constants.templateTypeImage}" 
addStyleNames="{style.labelToCoupleLabel}"/>
+                            <g:FlowPanel 
addStyleNames="{style.instanceImageCouple}">
+                                <e:ListModelTypeAheadListBoxEditor 
ui:field="baseInstanceImageEditor" 
addStyleNames="{style.labelToCoupleCoupleLeft}" 
contentWidgetStyleName="{style.instanceImageListBox}" />
+                                <e:ListModelTypeAheadListBoxEditor 
ui:field="instanceImageEditor" addStyleNames="{style.labelToCoupleCoupleRight}" 
contentWidgetStyleName="{style.instanceImageListBox}" />
+                            </g:FlowPanel>
+                        </g:FlowPanel>
                         <g:FlowPanel ui:field="logicalNetworksEditorPanel" 
addStyleNames="{style.sectionPanel}">
                             <p:ProfilesInstanceTypeEditor 
ui:field="profilesInstanceTypeEditor" />
                          </g:FlowPanel>
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/vm/VmSpecificUnitToVmBuilder.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/vm/VmSpecificUnitToVmBuilder.java
index ee7fe31..555db93 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/vm/VmSpecificUnitToVmBuilder.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/vm/VmSpecificUnitToVmBuilder.java
@@ -1,6 +1,7 @@
 package org.ovirt.engine.ui.uicommonweb.builders.vm;
 
 import org.ovirt.engine.core.common.businessentities.VM;
+import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.ui.uicommonweb.builders.BaseSyncBuilder;
 import org.ovirt.engine.ui.uicommonweb.models.vms.UnitVmModel;
 
@@ -12,6 +13,7 @@
     @Override
     protected void build(UnitVmModel model, VM vm) {
         vm.setVmtGuid(model.getTemplate().getSelectedItem().getId());
+        
vm.setImageTypeId(model.getTemplate().getSelectedItem().getId().equals(Guid.Empty)
 ? null : model.getTemplate().getSelectedItem().getId());
         vm.setCustomProperties(model.getCustomPropertySheet().serialize());
         
vm.setInstanceTypeId(model.getInstanceTypes().getSelectedItem().getId());
     }
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 61e3207..13c3725 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
@@ -114,28 +114,20 @@
             
getModel().getKernel_parameters().setEntity(template.getKernelParams());
             getModel().getInitrd_path().setEntity(template.getInitrdUrl());
 
-            if (!template.getId().equals(Guid.Empty))
-            {
-                getModel().getStorageDomain().setIsChangable(true);
-                getModel().getProvisioning().setIsChangable(true);
+            updateStorageRelatedFieldsAvailability();
 
+            if (!template.getId().equals(Guid.Empty)) {
                 getModel().getVmType().setSelectedItem(template.getVmType());
                 getModel().setIsBlankTemplate(false);
                 getModel().getCopyPermissions().setIsAvailable(true);
                 
getModel().getAllowConsoleReconnect().setEntity(template.isAllowConsoleReconnect());
-                initDisks();
                 updateRngDevice(template.getId());
-            }
-            else
-            {
-                getModel().getStorageDomain().setIsChangable(false);
-                getModel().getProvisioning().setIsChangable(false);
-
+            } else {
                 getModel().setIsBlankTemplate(true);
-                getModel().setIsDisksAvailable(false);
                 getModel().getCopyPermissions().setIsAvailable(false);
-                getModel().setDisks(null);
             }
+
+            initDisks();
 
             initStorageDomains();
 
@@ -160,6 +152,28 @@
 
             
getModel().getBootMenuEnabled().setEntity(template.isBootMenuEnabled());
         }
+    }
+
+    @Override
+    public void instanceImageSelectedItemChanged() {
+        super.instanceImageSelectedItemChanged();
+        updateStorageRelatedFieldsAvailability();
+    }
+
+    private void updateStorageRelatedFieldsAvailability() {
+        VmTemplate template = getModel().getTemplate().getSelectedItem();
+        VmTemplate instanceImage = 
getModel().getInstanceImage().getSelectedItem();
+
+        if (template == null || instanceImage == null) {
+            return;
+        }
+
+        boolean blankTemplateSelected = template.getId().equals(Guid.Empty);
+        boolean blankInstanceImageSelected = 
instanceImage.getId().equals(Guid.Empty);
+
+        
getModel().getStorageDomain().setIsChangable(!(blankInstanceImageSelected && 
blankTemplateSelected));
+        
getModel().getProvisioning().setIsChangable(!(blankInstanceImageSelected && 
blankTemplateSelected));
+        getModel().setIsDisksAvailable(!(blankInstanceImageSelected && 
blankTemplateSelected));
     }
 
     @Override
@@ -306,9 +320,36 @@
 
                         }
                     }, getModel().getHash()), dataCenter.getId(), 
VmEntityType.TEMPLATE);
+
+            AsyncDataProvider.getTemplateListByDataCenter(new AsyncQuery(this,
+                    new INewAsyncCallback() {
+                        @Override
+                        public void onSuccess(Object target, Object 
returnValue) {
+                            List<VmTemplate> templates = (List<VmTemplate>) 
returnValue;
+
+                            
postInitImageTypes(AsyncDataProvider.filterTemplatesByArchitecture(templates,
+                                    
dataCenterWithCluster.getCluster().getArchitecture()));
+
+                        }
+                    }, getModel().getHash()), dataCenter.getId(), 
VmEntityType.IMAGE_TYPE);
+
         }
     }
 
+    private void postInitImageTypes(ArrayList<VmTemplate> images) {
+
+        List<VmTemplate> baseTemplates = filterNotBaseImage(images);
+
+        // If there was some template selected before, try select it again.
+        VmTemplate prevBaseTemplate = 
getModel().getBaseInstanceImage().getSelectedItem();
+
+        getModel().getBaseInstanceImage().setItems(baseTemplates);
+
+        
getModel().getBaseInstanceImage().setSelectedItem(Linq.firstOrDefault(baseTemplates,
+                new Linq.TemplatePredicate(prevBaseTemplate != null ? 
prevBaseTemplate.getId() : Guid.Empty)));
+
+    }
+
     private void postInitTemplate(List<VmTemplate> templates)
     {
         List<VmTemplate> baseTemplates = filterNotBaseTemplates(templates);
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 6a191c5..135b67a 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
@@ -515,6 +515,26 @@
         baseTemplate = value;
     }
 
+    private NotChangableForVmInPoolListModel<VmTemplate> instanceImage;
+
+    public ListModel<VmTemplate> getInstanceImage() {
+        return instanceImage;
+    }
+
+    public void setInstanceImage(NotChangableForVmInPoolListModel<VmTemplate> 
instanceImage) {
+        this.instanceImage = instanceImage;
+    }
+
+    private NotChangableForVmInPoolListModel<VmTemplate> baseInstanceImage;
+
+    public ListModel<VmTemplate> getBaseInstanceImage() {
+        return baseInstanceImage;
+    }
+
+    public void 
setBaseInstanceImage(NotChangableForVmInPoolListModel<VmTemplate> 
baseInstanceImage) {
+        this.baseInstanceImage = baseInstanceImage;
+    }
+
     private NotChangableForVmInPoolListModel<InstanceType> instanceTypes;
 
     public void 
setInstanceTypes(NotChangableForVmInPoolListModel<InstanceType> instanceTypes) {
@@ -1448,6 +1468,12 @@
         setBaseTemplate(new NotChangableForVmInPoolListModel<VmTemplate>());
         getBaseTemplate().getSelectedItemChangedEvent().addListener(this);
 
+        setBaseInstanceImage(new 
NotChangableForVmInPoolListModel<VmTemplate>());
+        getBaseInstanceImage().getSelectedItemChangedEvent().addListener(this);
+
+        setInstanceImage(new NotChangableForVmInPoolListModel<VmTemplate>());
+        getInstanceImage().getSelectedItemChangedEvent().addListener(this);
+
         setCdAttached(new NotChangableForVmInPoolEntityModel<Boolean>());
         getCdAttached().getEntityChangedEvent().addListener(new 
IEventListener() {
             @Override
@@ -1751,6 +1777,10 @@
             }
             else if (sender == getBaseTemplate()) {
                 behavior.baseTemplateSelectedItemChanged();
+            } else if (sender == getBaseInstanceImage()) {
+                behavior.baseInstanceImageSelectedItemChanged();
+            } else if (sender == getInstanceImage()) {
+                behavior.instanceImageSelectedItemChanged();
             }
         }
         else if 
(ev.matchesDefinition(EntityModel.entityChangedEventDefinition))
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 6f5b3979..d204715 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
@@ -1,5 +1,6 @@
 package org.ovirt.engine.ui.uicommonweb.models.vms;
 
+import java.util.LinkedList;
 import java.util.Set;
 import org.ovirt.engine.core.common.TimeZoneType;
 import org.ovirt.engine.core.common.businessentities.ActionGroup;
@@ -56,7 +57,10 @@
     private final UIMessages messages = 
ConstantsManager.getInstance().getMessages();
 
     private TModel privateModel;
+
     private final HashMap<Guid, List<VmTemplate>> baseTemplateToSubTemplates = 
new HashMap<Guid, List<VmTemplate>>();
+
+    private final HashMap<Guid, List<VmTemplate>> baseImageToSubImage = new 
HashMap<Guid, List<VmTemplate>>();
 
     public TModel getModel() {
         return privateModel;
@@ -81,6 +85,10 @@
     private PriorityUtil priorityUtil;
 
     private VirtioScsiUtil virtioScsiUtil;
+
+    private List<DiskImage> templateDisks;
+
+    private List<DiskImage> instanceImageDisks;
 
     public void initialize(SystemTreeItemModel systemTreeSelectedItem)
     {
@@ -205,24 +213,32 @@
 
     }
 
+    protected List<VmTemplate> filterNotBaseImage(List<VmTemplate> images) {
+        return filterNotBaseTemplateBasedEntity(images, baseImageToSubImage);
+    }
+
     protected List<VmTemplate> filterNotBaseTemplates(List<VmTemplate> 
templates) {
+        return filterNotBaseTemplateBasedEntity(templates, 
baseTemplateToSubTemplates);
+    }
+
+    protected List<VmTemplate> 
filterNotBaseTemplateBasedEntity(List<VmTemplate> templateBasedEntities, 
HashMap<Guid, List<VmTemplate>> baseTemplateBasedEntityToVersions) {
         List<VmTemplate> baseTemplates = new ArrayList<VmTemplate>();
-        for (VmTemplate template : templates) {
+        for (VmTemplate template : templateBasedEntities) {
             if (template.getId().equals(template.getBaseTemplateId())) {
                 baseTemplates.add(template);
-                baseTemplateToSubTemplates.put(template.getId(),
+                baseTemplateBasedEntityToVersions.put(template.getId(),
                         new ArrayList<VmTemplate>());
             }
         }
 
-        for (VmTemplate template : templates) {
+        for (VmTemplate template : templateBasedEntities) {
             Guid baseTemplateId = template.getBaseTemplateId();
-            if (baseTemplateToSubTemplates.containsKey(baseTemplateId)) {
-                baseTemplateToSubTemplates.get(baseTemplateId).add(template);
+            if (baseTemplateBasedEntityToVersions.containsKey(baseTemplateId)) 
{
+                
baseTemplateBasedEntityToVersions.get(baseTemplateId).add(template);
             }
         }
 
-        for (List<VmTemplate> subversions : 
baseTemplateToSubTemplates.values()) {
+        for (List<VmTemplate> subversions : 
baseTemplateBasedEntityToVersions.values()) {
             Collections.sort(subversions, new Comparator<VmTemplate>() {
                 @Override
                 public int compare(VmTemplate o1, VmTemplate o2) {
@@ -231,7 +247,7 @@
             });
         }
 
-        for (List<VmTemplate> subversions : 
baseTemplateToSubTemplates.values()) {
+        for (List<VmTemplate> subversions : 
baseTemplateBasedEntityToVersions.values()) {
             subversions.add(0, createLatestTemplate(subversions.get(0)));
         }
 
@@ -260,6 +276,18 @@
             // 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 void baseInstanceImageSelectedItemChanged() {
+        VmTemplate baseTemplate = 
getModel().getBaseInstanceImage().getSelectedItem();
+        if (baseTemplate != null) {
+            List<VmTemplate> subVersions = 
baseImageToSubImage.get(baseTemplate.getId());
+            getModel().getInstanceImage().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().getInstanceImage().setSelectedItem(subVersions.get(1));
         }
     }
 
@@ -525,49 +553,89 @@
                 }, getModel().getHash()), version);
     }
 
-    public void initDisks()
-    {
-        VmTemplate template = getModel().getTemplate().getSelectedItem();
+    public void initDisks() {
+        initTemplateDisks();
+        initInstanceImageDisks();
+    }
+
+    private void initInstanceImageDisks() {
+        final VmTemplate instanceImage = 
getModel().getInstanceImage().getSelectedItem();
+        if (instanceImage == null) {
+            return;
+        }
 
         AsyncDataProvider.getTemplateDiskList(new AsyncQuery(getModel(),
                 new INewAsyncCallback() {
                     @Override
                     public void onSuccess(Object target, Object returnValue) {
-
-                        UnitVmModel model = (UnitVmModel) target;
-                        ArrayList<DiskImage> disks = (ArrayList<DiskImage>) 
returnValue;
-                        Collections.sort(disks, new 
Linq.DiskByAliasComparer());
-                        ArrayList<DiskModel> list = new ArrayList<DiskModel>();
-
-                        for (Disk disk : disks) {
-                            DiskModel diskModel = new DiskModel();
-                            
diskModel.getAlias().setEntity(disk.getDiskAlias());
-
-                            if (disk.getDiskStorageType() == 
DiskStorageType.IMAGE) {
-                                DiskImage diskImage = (DiskImage) disk;
-
-                                EntityModel tempVar = new EntityModel();
-                                
tempVar.setEntity(diskImage.getSizeInGigabytes());
-                                diskModel.setSize(tempVar);
-                                ListModel tempVar2 = new ListModel();
-                                tempVar2.setItems((diskImage.getVolumeType() 
== VolumeType.Preallocated ? new ArrayList<VolumeType>(Arrays.asList(new 
VolumeType[]{VolumeType.Preallocated}))
-                                        : 
AsyncDataProvider.getVolumeTypeList()));
-                                
tempVar2.setSelectedItem(diskImage.getVolumeType());
-                                diskModel.setVolumeType(tempVar2);
-                                
diskModel.getVolumeType().setIsAvailable(false);
-                            }
-
-                            diskModel.setDisk(disk);
-                            list.add(diskModel);
-                        }
-
-                        model.setDisks(list);
-                        updateIsDisksAvailable();
-                        initStorageDomains();
+                        instanceImageDisks = (List<DiskImage>) returnValue;
+                        initLoadedDisks();
                     }
                 },
                 getModel().getHash()),
-                template.getId());
+                instanceImage.getId());
+    }
+
+    private void initTemplateDisks() {
+        final VmTemplate template = getModel().getTemplate().getSelectedItem();
+        if (template == null) {
+            return;
+        }
+
+        AsyncDataProvider.getTemplateDiskList(new AsyncQuery(getModel(),
+            new INewAsyncCallback() {
+                @Override
+                public void onSuccess(Object target, Object returnValue) {
+                    templateDisks = (List<DiskImage>) returnValue;
+                    initLoadedDisks();
+                }
+            },
+            getModel().getHash()),
+            template.getId());
+    }
+
+    private void initLoadedDisks() {
+        if (templateDisks == null || instanceImageDisks == null) {
+            return;
+        }
+
+        List<DiskImage> disks = new LinkedList<DiskImage>();
+
+        disks.addAll(templateDisks);
+        disks.addAll(instanceImageDisks);
+
+        Collections.sort(disks, new Linq.DiskByAliasComparer());
+        ArrayList<DiskModel> list = new ArrayList<DiskModel>();
+
+        for (Disk disk : disks) {
+            DiskModel diskModel = new DiskModel();
+            diskModel.getAlias().setEntity(disk.getDiskAlias());
+
+            if (disk.getDiskStorageType() == DiskStorageType.IMAGE) {
+                DiskImage diskImage = (DiskImage) disk;
+
+                EntityModel tempVar = new EntityModel();
+                tempVar.setEntity(diskImage.getSizeInGigabytes());
+                diskModel.setSize(tempVar);
+                ListModel tempVar2 = new ListModel();
+                tempVar2.setItems((diskImage.getVolumeType() == 
VolumeType.Preallocated ? new ArrayList<VolumeType>(Arrays.asList(new 
VolumeType[]{VolumeType.Preallocated}))
+                        : AsyncDataProvider.getVolumeTypeList()));
+                tempVar2.setSelectedItem(diskImage.getVolumeType());
+                diskModel.setVolumeType(tempVar2);
+                diskModel.getVolumeType().setIsAvailable(false);
+            }
+
+            diskModel.setDisk(disk);
+            list.add(diskModel);
+        }
+
+        getModel().setDisks(list);
+
+        templateDisks = null;
+        instanceImageDisks = null;
+
+        updateIsDisksAvailable();
+        initStorageDomains();
     }
 
     public void updateIsDisksAvailable() {
@@ -1177,4 +1245,7 @@
         return selectedInstanceType == null || selectedInstanceType instanceof 
CustomInstanceType;
     }
 
+    public void instanceImageSelectedItemChanged() {
+        initDisks();
+    }
 }


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I32cec1002b2c2af81e05788ae823141c97cb27d4
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Tomas Jelinek <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to