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