Arik Hadas has uploaded a new change for review. Change subject: webadmin: add template from snapshot ......................................................................
webadmin: add template from snapshot Add the make-template dialog to the snapshots sub-tab to allow to create a template from a snapshot. Change-Id: Idcf50dce6c749008b03cb94cf666ba295b0b9da6 Bug-Url: https://bugzilla.redhat.com/1003492 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/vm/VmSnapshotListModelTable.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/VmSnapshotListModel.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/VirtualMachineModule.java 5 files changed, 204 insertions(+), 4 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/59/41259/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 7f4f3e1..bd32e45 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 @@ -956,6 +956,9 @@ @DefaultStringValue("Clone") String cloneSnapshot(); + @DefaultStringValue("Make Template") + String makeTemplateFromSnapshot(); + @DefaultStringValue("Installed Applications") String installedAppsSnapshot(); diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/vm/VmSnapshotListModelTable.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/vm/VmSnapshotListModelTable.java index 0c43a46..115896c 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/vm/VmSnapshotListModelTable.java +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/vm/VmSnapshotListModelTable.java @@ -215,5 +215,11 @@ return SafeHtmlUtils.fromString(tooltip); } }); + getTable().addActionButton(new UiCommandButtonDefinition<Snapshot>(getEventBus(), constants.makeTemplateFromSnapshot()) { + @Override + protected UICommand resolveCommand() { + return getModel().getCloneTemplateCommand(); + } + }); } } 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 7e74972..e2101ca 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 @@ -41,10 +41,16 @@ { private final UIConstants constants = ConstantsManager.getInstance().getConstants(); - private final VM vm; + private VM vm; - public NewTemplateVmModelBehavior(VM vm) - { + public NewTemplateVmModelBehavior() { + } + + public NewTemplateVmModelBehavior(VM vm) { + this.vm = vm; + } + + public void setVm(VM vm) { this.vm = vm; } @@ -506,6 +512,8 @@ @Override public void enableSinglePCI(boolean enabled) { super.enableSinglePCI(enabled); - getModel().getIsSingleQxlEnabled().setEntity(vm.getSingleQxlPci()); + if (vm != null) { + getModel().getIsSingleQxlEnabled().setEntity(vm.getSingleQxlPci()); + } } } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmSnapshotListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmSnapshotListModel.java index 51b984f..f443ddb 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmSnapshotListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmSnapshotListModel.java @@ -8,6 +8,7 @@ import org.ovirt.engine.core.common.VdcActionUtils; import org.ovirt.engine.core.common.action.AddVmFromSnapshotParameters; +import org.ovirt.engine.core.common.action.AddVmTemplateFromSnapshotParameters; import org.ovirt.engine.core.common.action.RemoveSnapshotParameters; import org.ovirt.engine.core.common.action.RestoreAllSnapshotsParameters; import org.ovirt.engine.core.common.action.TryBackToAllSnapshotsOfVmParameters; @@ -36,8 +37,13 @@ import org.ovirt.engine.ui.uicommonweb.Linq.SnapshotByCreationDateCommparer; import org.ovirt.engine.ui.uicommonweb.UICommand; import org.ovirt.engine.ui.uicommonweb.builders.BuilderExecutor; +import org.ovirt.engine.ui.uicommonweb.builders.vm.CommonUnitToVmBaseBuilder; +import org.ovirt.engine.ui.uicommonweb.builders.vm.DedicatedVmForVdsVmBaseToVmBaseBuilder; import org.ovirt.engine.ui.uicommonweb.builders.vm.FullUnitToVmBaseBuilder; +import org.ovirt.engine.ui.uicommonweb.builders.vm.KernelParamsVmBaseToVmBaseBuilder; +import org.ovirt.engine.ui.uicommonweb.builders.vm.MigrationOptionsVmBaseToVmBaseBuilder; import org.ovirt.engine.ui.uicommonweb.builders.vm.UnitToGraphicsDeviceParamsBuilder; +import org.ovirt.engine.ui.uicommonweb.builders.vm.UsbPolicyVmBaseToVmBaseBuilder; import org.ovirt.engine.ui.uicommonweb.builders.vm.VmSpecificUnitToVmBuilder; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; import org.ovirt.engine.ui.uicommonweb.help.HelpTag; @@ -46,6 +52,7 @@ import org.ovirt.engine.ui.uicommonweb.models.Model; import org.ovirt.engine.ui.uicommonweb.models.SearchableListModel; import org.ovirt.engine.ui.uicommonweb.models.SystemTreeItemModel; +import org.ovirt.engine.ui.uicommonweb.models.templates.VmBaseListModel; import org.ovirt.engine.ui.uicompat.ConstantsManager; import org.ovirt.engine.ui.uicompat.FrontendActionAsyncResult; import org.ovirt.engine.ui.uicompat.IFrontendActionAsyncCallback; @@ -140,6 +147,16 @@ private void setCloneVmCommand(UICommand value) { privateCloneVmCommand = value; + } + + private UICommand cloneTemplateCommand; + + public UICommand getCloneTemplateCommand() { + return cloneTemplateCommand; + } + + public void setCloneTemplateCommand(UICommand cloneTemplateCommand) { + this.cloneTemplateCommand = cloneTemplateCommand; } private EntityModel privateCanSelectSnapshot; @@ -251,6 +268,7 @@ setUndoCommand(new UICommand("Undo", this)); //$NON-NLS-1$ setRemoveCommand(new UICommand("Remove", this)); //$NON-NLS-1$ setCloneVmCommand(new UICommand("CloneVM", this)); //$NON-NLS-1$ + setCloneTemplateCommand(new UICommand("CloneTemplate", this)); //$NON-NLS-1$ setCanSelectSnapshot(new EntityModel()); getCanSelectSnapshot().setEntity(true); @@ -624,6 +642,160 @@ setWindow(null); } + private void cloneTemplate() { + Snapshot snapshot = getSelectedItem(); + if (snapshot == null) + { + return; + } + + if (getWindow() != null) + { + return; + } + + VM selectedVm = getEntity(); + final UnitVmModel model = new UnitVmModel(new NewTemplateVmModelBehavior(), this); + setWindow(model); + model.startProgress(null); + model.getVmType().setSelectedItem(selectedVm.getVmType()); + model.getIsHighlyAvailable().setEntity(selectedVm.getStaticData().isAutoStartup()); + + AsyncDataProvider.getInstance().getVmConfigurationBySnapshot(new AsyncQuery(this, new INewAsyncCallback() { + @Override + public void onSuccess(Object target, Object returnValue) { + NewTemplateVmModelBehavior behavior = (NewTemplateVmModelBehavior) model.getBehavior(); + VM vm = (VM) returnValue; + behavior.setVm(vm); + + model.setTitle(ConstantsManager.getInstance().getConstants().newTemplateTitle()); + model.setHelpTag(HelpTag.new_template); + model.setHashName("new_template"); //$NON-NLS-1$ + model.setIsNew(true); + model.setCustomPropertiesKeysList(AsyncDataProvider.getInstance().getCustomPropertiesList()); + model.initialize(VmSnapshotListModel.this.getSystemTreeSelectedItem()); + model.getCommands().add( + new UICommand("OnNewTemplate", VmSnapshotListModel.this) //$NON-NLS-1$ + .setTitle(ConstantsManager.getInstance().getConstants().ok()) + .setIsDefault(true)); + + model.getCommands().add(UICommand.createCancelUiCommand("Cancel", VmSnapshotListModel.this)); //$NON-NLS-1$ + model.stopProgress(); + } + }), snapshot.getId()); + } + + private void onCloneTemplate() { + final UnitVmModel model = (UnitVmModel) getWindow(); + NewTemplateVmModelBehavior behavior = (NewTemplateVmModelBehavior) model.getBehavior(); + Snapshot snapshot = getSelectedItem(); + if (snapshot == null) + { + cancel(); + return; + } + + final VM vm = behavior.getVm(); + + if (!model.validate(false)) + { + model.setIsValid(false); + } + else if (model.getIsSubTemplate().getEntity()) { + postNameUniqueCheck(vm); + } + else + { + String name = model.getName().getEntity(); + + // Check name unicitate. + AsyncDataProvider.getInstance().isTemplateNameUnique(new AsyncQuery(this, + new INewAsyncCallback() { + @Override + public void onSuccess(Object target, Object returnValue) { + + boolean isNameUnique = (Boolean) returnValue; + if (!isNameUnique) + { + model.getInvalidityReasons().clear(); + model.getName() + .getInvalidityReasons() + .add(ConstantsManager.getInstance() + .getConstants() + .nameMustBeUniqueInvalidReason()); + model.getName().setIsValid(false); + model.setIsValid(false); + } + else + { + postNameUniqueCheck(vm); + } + + } + }), + name); + } + } + + private void postNameUniqueCheck(VM vm) + { + UnitVmModel model = (UnitVmModel) getWindow(); + + VM newVm = buildVmOnNewTemplate(model, vm); + + AddVmTemplateFromSnapshotParameters parameters = + new AddVmTemplateFromSnapshotParameters(newVm.getStaticData(), + model.getName().getEntity(), + model.getDescription().getEntity(), + getSelectedItem().getId()); + parameters.setPublicUse(model.getIsTemplatePublic().getEntity()); + + parameters.setDiskInfoDestinationMap( + model.getDisksAllocationModel().getImageToDestinationDomainMap()); + parameters.setSoundDeviceEnabled(model.getIsSoundcardEnabled().getEntity()); + parameters.setBalloonEnabled(balloonEnabled(model)); + parameters.setCopyVmPermissions(model.getCopyPermissions().getEntity()); + model.startProgress(null); + parameters.setConsoleEnabled(model.getIsConsoleDeviceEnabled().getEntity()); + if (model.getIsSubTemplate().getEntity()) { + parameters.setBaseTemplateId(model.getBaseTemplate().getSelectedItem().getId()); + parameters.setTemplateVersionName(model.getTemplateVersionName().getEntity()); + } + + Frontend.getInstance().runAction(VdcActionType.AddVmTemplateFromSnapshot, + parameters, + new IFrontendActionAsyncCallback() { + @Override + public void executed(FrontendActionAsyncResult result) { + + VmSnapshotListModel model = (VmSnapshotListModel) result.getState(); + model.getWindow().stopProgress(); + VdcReturnValueBase returnValueBase = result.getReturnValue(); + if (returnValueBase != null && returnValueBase.getSucceeded()) { + model.cancel(); + } + + } + }, this); + } + + protected static VM buildVmOnNewTemplate(UnitVmModel model, VM vm) { + VM resultVm = new VM(); + resultVm.setId(vm.getId()); + BuilderExecutor.build(model, resultVm.getStaticData(), new CommonUnitToVmBaseBuilder()); + BuilderExecutor.build(vm.getStaticData(), resultVm.getStaticData(), + new KernelParamsVmBaseToVmBaseBuilder(), + new DedicatedVmForVdsVmBaseToVmBaseBuilder(), + new MigrationOptionsVmBaseToVmBaseBuilder(), + new UsbPolicyVmBaseToVmBaseBuilder()); + return resultVm; + } + + protected boolean balloonEnabled(UnitVmModel model) { + return model.getMemoryBalloonDeviceEnabled().getEntity() + && model.getSelectedCluster().getCompatibilityVersion().compareTo(VmBaseListModel.BALLOON_DEVICE_MIN_VERSION) >= 0; + } + private void cloneVM() { Snapshot snapshot = getSelectedItem(); @@ -928,6 +1100,14 @@ { cloneVM(); } + else if (command == getCloneTemplateCommand()) + { + cloneTemplate(); + } + else if ("OnNewTemplate".equals(command.getName())) //$NON-NLS-1$ + { + onCloneTemplate(); + } else if ("OnRemove".equals(command.getName())) //$NON-NLS-1$ { onRemove(); diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/VirtualMachineModule.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/VirtualMachineModule.java index 625100b..227408a 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/VirtualMachineModule.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/VirtualMachineModule.java @@ -311,6 +311,7 @@ Provider<DefaultConfirmationPopupPresenterWidget> defaultConfirmPopupProvider, final Provider<VmSnapshotCreatePopupPresenterWidget> createPopupProvider, final Provider<VmClonePopupPresenterWidget> cloneVmPopupProvider, + final Provider<VmMakeTemplatePopupPresenterWidget> cloneTemplatePopupProvider, final Provider<VmSnapshotPreviewPopupPresenterWidget> previewPopupProvider, final Provider<VmSnapshotCustomPreviewPopupPresenterWidget> customPreviewPopupProvider, final Provider<VmListModel<Void>> mainModelProvider, @@ -330,6 +331,8 @@ return previewPopupProvider.get(); } else if (lastExecutedCommand == getModel().getCustomPreviewCommand()) { return customPreviewPopupProvider.get(); + } else if (lastExecutedCommand == getModel().getCloneTemplateCommand()) { + return cloneTemplatePopupProvider.get(); } else { return super.getModelPopup(source, lastExecutedCommand, windowModel); } -- To view, visit https://gerrit.ovirt.org/41259 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Idcf50dce6c749008b03cb94cf666ba295b0b9da6 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Arik Hadas <aha...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches