Hello Fred Rolland,
I'd like you to do a code review. Please visit
https://gerrit.ovirt.org/38286
to review the following change.
Change subject: webadmin: Create VM from Templates list view
......................................................................
webadmin: Create VM from Templates list view
Adding a new UI action "New VM" in the Templates list view.
It is enable only when a single template is selected.
When the user clicks on this action, the "New VM" dialog appears.
In the template drop down only the selected template from the list and
all it versions will be available. The selected item in the drop down
will be the template highlighted in the list view.
Change-Id: I0e5fd7e84bbea9405bf7d9e087b4281866daa954
Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1117484
Signed-off-by: Fred Rolland <[email protected]>
---
M
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/templates/TemplateListModel.java
M
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/templates/VmBaseListModel.java
A
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewVmFromTemplateModelBehavior.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/VmListModel.java
M
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java
M
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/TemplateModule.java
M
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabTemplateView.java
8 files changed, 337 insertions(+), 134 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/86/38286/1
diff --git
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/templates/TemplateListModel.java
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/templates/TemplateListModel.java
index 4143779..662a4bc 100644
---
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/templates/TemplateListModel.java
+++
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/templates/TemplateListModel.java
@@ -15,6 +15,7 @@
import org.ovirt.engine.core.common.action.VmTemplateParametersBase;
import org.ovirt.engine.core.common.businessentities.DiskImage;
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.VmWatchdog;
@@ -44,9 +45,12 @@
import org.ovirt.engine.ui.uicommonweb.models.TabName;
import org.ovirt.engine.ui.uicommonweb.models.configure.PermissionListModel;
import org.ovirt.engine.ui.uicommonweb.models.vms.ExportVmModel;
+import
org.ovirt.engine.ui.uicommonweb.models.vms.NewVmFromTemplateModelBehavior;
import org.ovirt.engine.ui.uicommonweb.models.vms.TemplateVmModelBehavior;
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.VmBasedWidgetSwitchModeCommand;
+import org.ovirt.engine.ui.uicommonweb.models.vms.VmInterfaceCreatingManager;
import org.ovirt.engine.ui.uicommonweb.place.WebAdminApplicationPlaces;
import org.ovirt.engine.ui.uicompat.ConstantsManager;
import org.ovirt.engine.ui.uicompat.FrontendActionAsyncResult;
@@ -97,6 +101,18 @@
privateExportCommand = value;
}
+ private UICommand privateCreateVmfromTemplateCommand;
+
+ public UICommand getCreateVmFromTemplateCommand()
+ {
+ return privateCreateVmfromTemplateCommand;
+ }
+
+ private void setCreateVmFromTemplateCommand(UICommand value)
+ {
+ privateCreateVmfromTemplateCommand = value;
+ }
+
private SystemTreeItemModel systemTreeSelectedItem;
@Override
@@ -113,6 +129,35 @@
systemTreeSelectedItem = value;
}
}
+
+ VmInterfaceCreatingManager addVmFromBlankTemplateNetworkManager =
+ new VmInterfaceCreatingManager(new
VmInterfaceCreatingManager.PostVnicCreatedCallback() {
+ @Override
+ public void vnicCreated(Guid vmId) {
+ // do nothing
+ }
+
+ @Override
+ public void queryFailed() {
+ // do nothing
+ }
+ });
+
+ VmInterfaceCreatingManager defaultNetworkCreatingManager =
+ new VmInterfaceCreatingManager(new
VmInterfaceCreatingManager.PostVnicCreatedCallback() {
+ @Override
+ public void vnicCreated(Guid vmId) {
+ getWindow().stopProgress();
+ cancel();
+ updateActionAvailability();
+ }
+
+ @Override
+ public void queryFailed() {
+ getWindow().stopProgress();
+ cancel();
+ }
+ });
@Inject
public TemplateListModel(final TemplateGeneralModel templateGeneralModel,
@@ -145,6 +190,7 @@
setEditCommand(new UICommand("Edit", this)); //$NON-NLS-1$
setRemoveCommand(new UICommand("Remove", this)); //$NON-NLS-1$
setExportCommand(new UICommand("Export", this)); //$NON-NLS-1$
+ setCreateVmFromTemplateCommand(new UICommand("CreateVM", this));
//$NON-NLS-1$
updateActionAvailability();
@@ -588,6 +634,64 @@
}
}
+ private void createVMFromTemplate()
+ {
+ VmTemplate template = getSelectedItem();
+ UnitVmModel model = new UnitVmModel(new
NewVmFromTemplateModelBehavior(template));
+
model.setIsAdvancedModeLocalStorageKey(getEditTemplateAdvancedModelKey());
+ setWindow(model);
+
model.setTitle(ConstantsManager.getInstance().getConstants().newVmTitle());
+
model.setTitle(ConstantsManager.getInstance().getConstants().newVmTitle());
+ model.setHelpTag(HelpTag.new_vm);
+ model.setHashName("new_vm"); //$NON-NLS-1$
+ model.setIsNew(true);
+ model.getVmType().setSelectedItem(template.getVmType());
+
model.setCustomPropertiesKeysList(AsyncDataProvider.getInstance().getCustomPropertiesList());
+ model.setIsAdvancedModeLocalStorageKey("wa_vm_dialog"); //$NON-NLS-1$
+
+ model.initialize(this.getSystemTreeSelectedItem());
+
+ VmBasedWidgetSwitchModeCommand switchModeCommand = new
VmBasedWidgetSwitchModeCommand();
+ switchModeCommand.init(model);
+ model.getCommands().add(switchModeCommand);
+
+ model.getProvisioning().setEntity(true);
+
+ UICommand onSaveVmCommand =
UICommand.createDefaultOkUiCommand("OnSaveVm", this); //$NON-NLS-1$
+ model.getCommands().add(onSaveVmCommand);
+ UICommand cancelCommand = UICommand.createCancelUiCommand("Cancel",
this); //$NON-NLS-1$
+ model.getCommands().add(cancelCommand);
+ }
+
+ private void onSaveVm() {
+ UnitVmModel model = (UnitVmModel) getWindow();
+ String name = model.getName().getEntity();
+ setcurrentVm(new VM());
+ validateVM(model, name);
+ }
+
+ protected UnitVmModelNetworkAsyncCallback
createUnitVmModelNetworkAsyncCallback(VM vm, UnitVmModel model) {
+ if (vm.getVmtGuid().equals(Guid.Empty)) {
+ return new UnitVmModelNetworkAsyncCallback(model,
addVmFromBlankTemplateNetworkManager) {
+ @Override
+ public void executed(FrontendActionAsyncResult result) {
+ getWindow().stopProgress();
+ VdcReturnValueBase returnValue = result.getReturnValue();
+ if (returnValue != null && returnValue.getSucceeded()) {
+ setWindow(null);
+ updateActionAvailability();
+ } else {
+ cancel();
+ }
+ super.executed(result);
+ }
+ };
+ }
+
+ return new UnitVmModelNetworkAsyncCallback(model,
defaultNetworkCreatingManager);
+ }
+
+
public void postNameUniqueCheck(boolean isNameUnique)
{
final UnitVmModel model = (UnitVmModel) getWindow();
@@ -767,6 +871,9 @@
.blankTemplateCannotBeExported());
getExportCommand().setIsExecutionAllowed(false);
}
+
+ getCreateVmFromTemplateCommand().setIsExecutionAllowed(items.size() ==
1 && item != null
+ && item.getStatus() != VmTemplateStatus.Locked);
}
/**
@@ -813,6 +920,10 @@
{
export();
}
+ else if (command == getCreateVmFromTemplateCommand())
+ {
+ createVMFromTemplate();
+ }
else if ("Cancel".equals(command.getName())) //$NON-NLS-1$
{
cancel();
@@ -825,6 +936,10 @@
{
onSave();
}
+ else if ("OnSaveVm".equals(command.getName())) //$NON-NLS-1$
+ {
+ onSaveVm();
+ }
else if ("OnRemove".equals(command.getName())) //$NON-NLS-1$
{
onRemove();
diff --git
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/templates/VmBaseListModel.java
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/templates/VmBaseListModel.java
index a75185e..e9acd23 100644
---
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/templates/VmBaseListModel.java
+++
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/templates/VmBaseListModel.java
@@ -3,26 +3,56 @@
import java.util.ArrayList;
import java.util.List;
+import org.ovirt.engine.core.common.action.AddVmParameters;
+import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.action.VmManagementParametersBase;
import org.ovirt.engine.core.common.businessentities.StorageDomain;
import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
import org.ovirt.engine.core.common.businessentities.StorageDomainType;
import org.ovirt.engine.core.common.businessentities.StoragePool;
+import org.ovirt.engine.core.common.businessentities.VM;
+import org.ovirt.engine.core.common.businessentities.VmWatchdog;
+import org.ovirt.engine.core.common.businessentities.VmWatchdogType;
import
org.ovirt.engine.core.common.queries.GetAllFromExportDomainQueryParameters;
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.core.compat.StringHelper;
+import org.ovirt.engine.core.compat.Version;
import org.ovirt.engine.ui.frontend.AsyncQuery;
import org.ovirt.engine.ui.frontend.Frontend;
import org.ovirt.engine.ui.frontend.INewAsyncCallback;
import org.ovirt.engine.ui.uicommonweb.Linq;
import org.ovirt.engine.ui.uicommonweb.UICommand;
+import org.ovirt.engine.ui.uicommonweb.builders.BuilderExecutor;
+import org.ovirt.engine.ui.uicommonweb.builders.vm.FullUnitToVmBaseBuilder;
+import
org.ovirt.engine.ui.uicommonweb.builders.vm.UnitToGraphicsDeviceParamsBuilder;
+import org.ovirt.engine.ui.uicommonweb.builders.vm.VmSpecificUnitToVmBuilder;
import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider;
import org.ovirt.engine.ui.uicommonweb.models.ListWithDetailsAndReportsModel;
+import org.ovirt.engine.ui.uicommonweb.models.TabName;
import org.ovirt.engine.ui.uicommonweb.models.vms.ExportVmModel;
+import org.ovirt.engine.ui.uicommonweb.models.vms.UnitVmModel;
+import
org.ovirt.engine.ui.uicommonweb.models.vms.UnitVmModelNetworkAsyncCallback;
import org.ovirt.engine.ui.uicompat.ConstantsManager;
import org.ovirt.engine.ui.uicompat.external.StringUtils;
public abstract class VmBaseListModel<E, T> extends
ListWithDetailsAndReportsModel<E, T> {
+
+
+ public static final Version BALLOON_DEVICE_MIN_VERSION = Version.v3_2;
+
+ private VM privatecurrentVm;
+
+ public VM getcurrentVm()
+
+ {
+ return privatecurrentVm;
+ }
+
+ public void setcurrentVm(VM value) {
+ privatecurrentVm = value;
+ }
protected void export()
{
@@ -206,6 +236,131 @@
// no-op by default. Override if needed.
}
+ protected void validateVM(final UnitVmModel model, final String vmName) {
+
+ if (!model.validate())
+
+ {
+ return;
+ }
+
+ AsyncDataProvider.getInstance().
+ isVmNameUnique(new AsyncQuery(this, new INewAsyncCallback() {
+
+ @Override
+ public void onSuccess(Object target, Object
returnValue) {
+ if (!(Boolean) returnValue &&
vmName.compareToIgnoreCase(getcurrentVm().getName()) != 0) {
+ model.getName()
+ .getInvalidityReasons()
+
.add(ConstantsManager.getInstance().getConstants().nameMustBeUniqueInvalidReason());
+ model.getName().setIsValid(false);
+ model.setValidTab(TabName.GENERAL_TAB,
false);
+ } else {
+ model.getName()
+ .getInvalidityReasons().clear();
+ model.getName().setIsValid(true);
+ model.setValidTab(TabName.GENERAL_TAB,
true);
+ onSaveVM(model);
+ }
+ }
+ }
+
+ ),
+ vmName);
+ }
+
+ protected void onSaveVM(UnitVmModel model) {
+ // Save changes.
+ buildVmOnSave(model, getcurrentVm());
+
+ getcurrentVm().setBalloonEnabled(balloonEnabled(model));
+
+ getcurrentVm().setCpuPinning(model.getCpuPinning().getEntity());
+
+ if (model.getCpuSharesAmount().getIsAvailable() &&
model.getCpuSharesAmount().getEntity() != null) { // $NON-NLS-1$
+
getcurrentVm().setCpuShares(model.getCpuSharesAmount().getEntity());
+ }
+
+ getcurrentVm().setUseHostCpuFlags(model.getHostCpu().getEntity());
+
+
getcurrentVm().setVmInit(model.getVmInitModel().buildCloudInitParameters(model));
+ if (model.getIsNew()) {
+ saveNewVm(model);
+ } else {
+ updateVM(model);
+ }
+
+ }
+
+ private void saveNewVm(final UnitVmModel model) {
+ if (model.getProgress() != null) {
+ return;
+ }
+
+ model.startProgress(null);
+
+ VM vm = getcurrentVm();
+ if (!StringHelper.isNullOrEmpty(model.getVmId().getEntity())) {
+ vm.setId(new Guid(model.getVmId().getEntity()));
+ }
+
vm.setUseLatestVersion(model.getTemplateWithVersion().getSelectedItem().isLatest());
+ AddVmParameters parameters = new AddVmParameters(vm);
+
parameters.setDiskInfoDestinationMap(model.getDisksAllocationModel().getImageToDestinationDomainMap());
+
parameters.setConsoleEnabled(model.getIsConsoleDeviceEnabled().getEntity());
+ parameters.setBalloonEnabled(balloonEnabled(model));
+
parameters.setCopyTemplatePermissions(model.getCopyPermissions().getEntity());
+
parameters.setSoundDeviceEnabled(model.getIsSoundcardEnabled().getEntity());
+
parameters.setVirtioScsiEnabled(model.getIsVirtioScsiEnabled().getEntity());
+ setVmWatchdogToParams(model, parameters);
+ setRngDeviceToParams(model, parameters);
+ BuilderExecutor.build(model, parameters, new
UnitToGraphicsDeviceParamsBuilder());
+ if (!StringHelper.isNullOrEmpty(model.getVmId().getEntity())) {
+ parameters.setVmId(new Guid(model.getVmId().getEntity()));
+ }
+
+ Frontend.getInstance().runAction(
+ model.getProvisioning().getEntity() ?
VdcActionType.AddVmFromTemplate : VdcActionType.AddVm,
+ parameters,
+ createUnitVmModelNetworkAsyncCallback(vm, model),
+ this);
+ }
+
+ protected void updateVM(UnitVmModel model){
+ // no-op by default. Override if needed.
+ }
+
+ protected UnitVmModelNetworkAsyncCallback
createUnitVmModelNetworkAsyncCallback(VM vm, UnitVmModel model) {
+ // null by default. Override if needed.
+ return null;
+ }
+
+ public static void buildVmOnSave(UnitVmModel model, VM vm) {
+ BuilderExecutor.build(model, vm.getStaticData(), new
FullUnitToVmBaseBuilder());
+ BuilderExecutor.build(model, vm, new VmSpecificUnitToVmBuilder());
+ }
+
+
+ protected boolean balloonEnabled(UnitVmModel model) {
+ return model.getMemoryBalloonDeviceEnabled().getEntity()
+ &&
model.getSelectedCluster().getCompatibilityVersion().compareTo(BALLOON_DEVICE_MIN_VERSION)
>= 0;
+ }
+
+ protected void setVmWatchdogToParams(final UnitVmModel model,
VmManagementParametersBase updateVmParams) {
+ VmWatchdogType wdModel = model.getWatchdogModel().getSelectedItem();
+ updateVmParams.setUpdateWatchdog(true);
+ if (wdModel != null) {
+ VmWatchdog vmWatchdog = new VmWatchdog();
+ vmWatchdog.setAction(model.getWatchdogAction().getSelectedItem());
+ vmWatchdog.setModel(wdModel);
+ updateVmParams.setWatchdog(vmWatchdog);
+ }
+ }
+
+ protected void setRngDeviceToParams(UnitVmModel model,
VmManagementParametersBase parameters) {
+ parameters.setUpdateRngDevice(true);
+ parameters.setRngDevice(model.getIsRngEnabled().getEntity() ?
model.generateRngDevice() : null);
+ }
+
protected abstract String composeEntityOnStorage(String entities);
protected abstract Iterable<T> asIterableReturnValue(Object returnValue);
diff --git
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewVmFromTemplateModelBehavior.java
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewVmFromTemplateModelBehavior.java
new file mode 100644
index 0000000..57968de
--- /dev/null
+++
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewVmFromTemplateModelBehavior.java
@@ -0,0 +1,46 @@
+package org.ovirt.engine.ui.uicommonweb.models.vms;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.ovirt.engine.core.common.businessentities.VmTemplate;
+import org.ovirt.engine.ui.uicommonweb.models.templates.TemplateWithVersion;
+
+public class NewVmFromTemplateModelBehavior extends NewVmModelBehavior {
+
+ private VmTemplate selectedTemplate;
+
+ public NewVmFromTemplateModelBehavior(VmTemplate template) {
+ this.selectedTemplate = template;
+ }
+
+ @Override
+ protected void postInitTemplate(List<VmTemplate> templates) {
+ boolean isSelectedTemplateBase = selectedTemplate.isBaseTemplate();
+ VmTemplate baseTemplate = null;
+ List<VmTemplate> relatedTemplates = new ArrayList<>();
+ for (VmTemplate template : templates) {
+ if (template.getName().equals(selectedTemplate.getName())) {
+ relatedTemplates.add(template);
+
+ if (!isSelectedTemplateBase) {
+ if
(selectedTemplate.getBaseTemplateId().equals(template.getId())) {
+ baseTemplate = template;
+ }
+ }
+ }
+ }
+
+ initTemplateWithVersion(relatedTemplates);
+
+ TemplateWithVersion templateCouple;
+ if (selectedTemplate.isBaseTemplate()) {
+ templateCouple = new TemplateWithVersion(selectedTemplate,
selectedTemplate);
+ } else {
+ templateCouple = new TemplateWithVersion(baseTemplate,
selectedTemplate);
+ }
+ getModel().getTemplateWithVersion().setSelectedItem(templateCouple);
+
+ updateIsDisksAvailable();
+ }
+}
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 3071dae..f4930a0 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
@@ -305,7 +305,7 @@
}
}
- private void postInitTemplate(List<VmTemplate> templates) {
+ protected void postInitTemplate(List<VmTemplate> templates) {
initTemplateWithVersion(templates);
updateIsDisksAvailable();
}
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 6ffd0dd..bb28167 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
@@ -11,7 +11,6 @@
import java.util.Set;
import org.ovirt.engine.core.common.VdcActionUtils;
-import org.ovirt.engine.core.common.action.AddVmParameters;
import org.ovirt.engine.core.common.action.AddVmTemplateParameters;
import org.ovirt.engine.core.common.action.AttachEntityToTagParameters;
import org.ovirt.engine.core.common.action.ChangeDiskCommandParameters;
@@ -43,8 +42,6 @@
import org.ovirt.engine.core.common.businessentities.VMStatus;
import org.ovirt.engine.core.common.businessentities.VmTemplate;
import org.ovirt.engine.core.common.businessentities.VmType;
-import org.ovirt.engine.core.common.businessentities.VmWatchdog;
-import org.ovirt.engine.core.common.businessentities.VmWatchdogType;
import org.ovirt.engine.core.common.interfaces.SearchType;
import org.ovirt.engine.core.common.mode.ApplicationMode;
import org.ovirt.engine.core.common.queries.IdQueryParameters;
@@ -71,12 +68,10 @@
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;
import org.ovirt.engine.ui.uicommonweb.models.ConfirmationModel;
@@ -86,7 +81,6 @@
import org.ovirt.engine.ui.uicommonweb.models.HasEntity;
import org.ovirt.engine.ui.uicommonweb.models.ISupportSystemTreeContext;
import org.ovirt.engine.ui.uicommonweb.models.SystemTreeItemModel;
-import org.ovirt.engine.ui.uicommonweb.models.TabName;
import org.ovirt.engine.ui.uicommonweb.models.VmConsoles;
import org.ovirt.engine.ui.uicommonweb.models.configure.ChangeCDModel;
import org.ovirt.engine.ui.uicommonweb.models.configure.PermissionListModel;
@@ -127,7 +121,6 @@
private static final String CMD_IMPORT_CLONED_VM = "ImportVmAsClone";
//$NON-NLS-1$
private final UIConstants constants =
ConstantsManager.getInstance().getConstants();
- public static final Version BALLOON_DEVICE_MIN_VERSION = Version.v3_2;
final Provider<ImportVmsModel> importVmsModelProvider;
@@ -436,19 +429,6 @@
public void setGuideContext(Object value)
{
privateGuideContext = value;
- }
-
- private VM privatecurrentVm;
-
- public VM getcurrentVm()
-
- {
- return privatecurrentVm;
- }
-
- public void setcurrentVm(VM value)
- {
- privatecurrentVm = value;
}
private final ConsoleModelsCache consoleModelsCache;
@@ -1922,61 +1902,14 @@
setcurrentVm(model.getIsNew() ? new VM() : (VM)
Cloner.clone(selectedItem));
- if (!model.validate())
- {
- return;
- }
-
- AsyncDataProvider.getInstance().isVmNameUnique(new AsyncQuery(this,
new INewAsyncCallback() {
-
- @Override
- public void onSuccess(Object target, Object returnValue) {
- if (!(Boolean) returnValue &&
name.compareToIgnoreCase(getcurrentVm().getName()) != 0) {
- model.getName()
- .getInvalidityReasons()
-
.add(ConstantsManager.getInstance().getConstants().nameMustBeUniqueInvalidReason());
- model.getName().setIsValid(false);
- model.setValidTab(TabName.GENERAL_TAB, false);
- } else {
- model.getName()
- .getInvalidityReasons().clear();
- model.getName().setIsValid(true);
- model.setValidTab(TabName.GENERAL_TAB, true);
- onSave();
- }
- }
- }), name);
-
+ validateVM(model, name);
}
- private void onSave() {
- final UnitVmModel model = (UnitVmModel) getWindow();
-
- // Save changes.
- buildVmOnSave(model, getcurrentVm());
-
- getcurrentVm().setBalloonEnabled(balloonEnabled(model));
-
- getcurrentVm().setCpuPinning(model.getCpuPinning().getEntity());
-
- if (model.getCpuSharesAmount().getIsAvailable() &&
model.getCpuSharesAmount().getEntity() != null) { // $NON-NLS-1$
-
getcurrentVm().setCpuShares(model.getCpuSharesAmount().getEntity());
- }
-
- getcurrentVm().setUseHostCpuFlags(model.getHostCpu().getEntity());
-
-
getcurrentVm().setVmInit(model.getVmInitModel().buildCloudInitParameters(model));
-
- if (model.getIsNew())
- {
- saveNewVm(model);
- }
- else // Update existing VM -> consists of editing VM cluster, and if
succeeds - editing VM:
- {
- final VM selectedItem = getSelectedItem();
- // explicitly pass non-editable field from the original VM
-
getcurrentVm().setCreatedByUserId(selectedItem.getCreatedByUserId());
-
getcurrentVm().setUseLatestVersion(model.getTemplateWithVersion().getSelectedItem().isLatest());
+ protected void updateVM (final UnitVmModel model){
+ final VM selectedItem = getSelectedItem();
+ // explicitly pass non-editable field from the original VM
+ getcurrentVm().setCreatedByUserId(selectedItem.getCreatedByUserId());
+
getcurrentVm().setUseLatestVersion(model.getTemplateWithVersion().getSelectedItem().isLatest());
if (selectedItem.isRunningOrPaused()) {
AsyncDataProvider.getInstance().getVmChangedFieldsForNextRun(editedVm,
getcurrentVm(), getUpdateVmParameters(false), new AsyncQuery(this,
@@ -2010,7 +1943,6 @@
else {
updateExistingVm(false);
}
- }
}
private void updateExistingVm(final boolean applyCpuChangesLater) {
@@ -2081,40 +2013,7 @@
return updateVmParams;
}
- private void saveNewVm(final UnitVmModel model) {
- if (model.getProgress() != null) {
- return;
- }
-
- model.startProgress(null);
-
- VM vm = getcurrentVm();
- if (!StringHelper.isNullOrEmpty(model.getVmId().getEntity())) {
- vm.setId(new Guid(model.getVmId().getEntity()));
- }
-
vm.setUseLatestVersion(model.getTemplateWithVersion().getSelectedItem().isLatest());
- AddVmParameters parameters = new AddVmParameters(vm);
-
parameters.setDiskInfoDestinationMap(model.getDisksAllocationModel().getImageToDestinationDomainMap());
-
parameters.setConsoleEnabled(model.getIsConsoleDeviceEnabled().getEntity());
- parameters.setBalloonEnabled(balloonEnabled(model));
-
parameters.setCopyTemplatePermissions(model.getCopyPermissions().getEntity());
-
parameters.setSoundDeviceEnabled(model.getIsSoundcardEnabled().getEntity());
-
parameters.setVirtioScsiEnabled(model.getIsVirtioScsiEnabled().getEntity());
- setVmWatchdogToParams(model, parameters);
- setRngDeviceToParams(model, parameters);
- BuilderExecutor.build(model, parameters, new
UnitToGraphicsDeviceParamsBuilder());
- if (!StringHelper.isNullOrEmpty(model.getVmId().getEntity())) {
- parameters.setVmId(new Guid(model.getVmId().getEntity()));
- }
-
- Frontend.getInstance().runAction(
- model.getProvisioning().getEntity() ?
VdcActionType.AddVmFromTemplate : VdcActionType.AddVm,
- parameters,
- createUnitVmModelNetworkAsyncCallback(vm, model),
- this);
- }
-
- private UnitVmModelNetworkAsyncCallback
createUnitVmModelNetworkAsyncCallback(VM vm, UnitVmModel model) {
+ protected UnitVmModelNetworkAsyncCallback
createUnitVmModelNetworkAsyncCallback(VM vm, UnitVmModel model) {
if (vm.getVmtGuid().equals(Guid.Empty)) {
return new UnitVmModelNetworkAsyncCallback(model,
addVmFromBlankTemplateNetworkManager) {
@Override
@@ -2137,31 +2036,6 @@
return new UnitVmModelNetworkAsyncCallback(model,
defaultNetworkCreatingManager);
}
- protected static void buildVmOnSave(UnitVmModel model, VM vm) {
- BuilderExecutor.build(model, vm.getStaticData(), new
FullUnitToVmBaseBuilder());
- BuilderExecutor.build(model, vm, new VmSpecificUnitToVmBuilder());
- }
-
- private boolean balloonEnabled(UnitVmModel model) {
- return model.getMemoryBalloonDeviceEnabled().getEntity()
- &&
model.getSelectedCluster().getCompatibilityVersion().compareTo(BALLOON_DEVICE_MIN_VERSION)
>= 0;
- }
-
- private void setVmWatchdogToParams(final UnitVmModel model,
VmManagementParametersBase updateVmParams) {
- VmWatchdogType wdModel = model.getWatchdogModel().getSelectedItem();
- updateVmParams.setUpdateWatchdog(true);
- if (wdModel != null) {
- VmWatchdog vmWatchdog = new VmWatchdog();
- vmWatchdog.setAction(model.getWatchdogAction().getSelectedItem());
- vmWatchdog.setModel(wdModel);
- updateVmParams.setWatchdog(vmWatchdog);
- }
- }
-
- private void setRngDeviceToParams(UnitVmModel model,
VmManagementParametersBase parameters) {
- parameters.setUpdateRngDevice(true);
- parameters.setRngDevice(model.getIsRngEnabled().getEntity() ?
model.generateRngDevice() : null);
- }
private void retrieveIsoImages()
{
diff --git
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java
index b59d8ff..3741565 100644
---
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java
+++
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java
@@ -1920,6 +1920,9 @@
@DefaultStringValue("Copy")
String copyTemplate();
+ @DefaultStringValue("New VM")
+ String createVmFromTemplate();
+
@DefaultStringValue("Disks")
String disksTemplate();
diff --git
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/TemplateModule.java
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/TemplateModule.java
index 1b85ed3..254920b 100644
---
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/TemplateModule.java
+++
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/TemplateModule.java
@@ -34,6 +34,7 @@
import
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.template.TemplateInterfacePopupPresenterWidget;
import
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.template.TemplateEditPresenterWidget;
import
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.vm.VmExportPopupPresenterWidget;
+import
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.vm.VmPopupPresenterWidget;
import org.ovirt.engine.ui.webadmin.uicommon.model.PermissionModelProvider;
import com.google.gwt.event.shared.EventBus;
@@ -53,6 +54,7 @@
Provider<DefaultConfirmationPopupPresenterWidget>
defaultConfirmPopupProvider,
final Provider<TemplateEditPresenterWidget> popupProvider,
final Provider<VmExportPopupPresenterWidget> exportPopupProvider,
+ final Provider<VmPopupPresenterWidget> createVmPopupProvider,
final Provider<RemoveConfirmationPopupPresenterWidget>
removeConfirmPopupProvider,
final Provider<TemplateListModel> modelProvider,
final Provider<CommonModel> commonModelProvider) {
@@ -69,6 +71,8 @@
return popupProvider.get();
} else if (lastExecutedCommand ==
getModel().getExportCommand()) {
return exportPopupProvider.get();
+ } else if (lastExecutedCommand ==
getModel().getCreateVmFromTemplateCommand()) {
+ return createVmPopupProvider.get();
} else {
return super.getModelPopup(source,
lastExecutedCommand, windowModel);
}
diff --git
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabTemplateView.java
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabTemplateView.java
index 2c66c43..ddf3ff7 100644
---
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabTemplateView.java
+++
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabTemplateView.java
@@ -130,6 +130,12 @@
return getMainModel().getExportCommand();
}
});
+ getTable().addActionButton(new
WebAdminButtonDefinition<VmTemplate>(constants.createVmFromTemplate()) {
+ @Override
+ protected UICommand resolveCommand() {
+ return getMainModel().getCreateVmFromTemplateCommand();
+ }
+ });
}
}
--
To view, visit https://gerrit.ovirt.org/38286
To unsubscribe, visit https://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I0e5fd7e84bbea9405bf7d9e087b4281866daa954
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Freddy Rolland <[email protected]>
Gerrit-Reviewer: Fred Rolland <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches