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

Reply via email to