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 <[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/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 <[email protected]>
Gerrit-Reviewer: Arik Hadas <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches