Tomas Jelinek has uploaded a new change for review. Change subject: new image popup ......................................................................
new image popup Change-Id: Id1932f8dfe9f52fcbdcdf83fc4b879f570d95108 Signed-off-by: Tomas Jelinek <[email protected]> --- M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.java M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.ui.xml M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/ImagePopupWidget.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/Builder.java A frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/template/BootOptionsVmToUnitBuilder.java A frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/template/ClusterVmToUnitBuilder.java A frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/template/CustomPropertiesUnitToVmBuilder.java A frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/template/DiskListVmToUnitBuilder.java A frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/template/GeneralVmToUnitBuilder.java A frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/template/QuotaVmToUnitBuilder.java A frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/template/StorageDomainVmToUnitBuilder.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/unit/DataCenterToUnitBuilder.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewImageModelBehavior.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/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmModelBehaviorBase.java 16 files changed, 619 insertions(+), 66 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/43/12443/1 diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.java index 14d03cd..32f79ba 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.java +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.java @@ -360,10 +360,16 @@ protected FlowPanel storageAllocationPanel; @UiField + protected Panel diskAllocationLabelPanel; + + @UiField protected HorizontalPanel provisionSelectionPanel; @UiField protected FlowPanel disksAllocationPanel; + + @UiField + protected FlowPanel memoryAllocationPanel; @UiField @Ignore @@ -919,11 +925,12 @@ */ protected void updateUsbNativeMessageVisibility(final UnitVmModel object) { VDSGroup vdsGroup = (VDSGroup) object.getCluster().getSelectedItem(); - changeApplicationLevelVisibility(nativeUsbWarningMessage, object.getUsbPolicy().getSelectedItem() == UsbPolicy.ENABLED_NATIVE - && vdsGroup != null - && vdsGroup.getcompatibility_version() != null - && !(Boolean) AsyncDataProvider.GetConfigValuePreConverted(ConfigurationValues.MigrationSupportForNativeUsb, - vdsGroup.getcompatibility_version().getValue())); + changeApplicationLevelVisibility(nativeUsbWarningMessage, + object.getUsbPolicy().getSelectedItem() == UsbPolicy.ENABLED_NATIVE + && vdsGroup != null + && vdsGroup.getcompatibility_version() != null + && !(Boolean) AsyncDataProvider.GetConfigValuePreConverted(ConfigurationValues.MigrationSupportForNativeUsb, + vdsGroup.getcompatibility_version().getValue())); } private void addDiskAllocation(UnitVmModel model) { @@ -961,7 +968,8 @@ resourceAllocationTab.markAsInvalid(null); } } else if ("IsHighlyAvailable".equals(propName)) { //$NON-NLS-1$ - changeApplicationLevelVisibility(highAvailabilityTab, (Boolean) vm.getIsHighlyAvailable().getEntity()); + changeApplicationLevelVisibility(highAvailabilityTab, (Boolean) vm.getIsHighlyAvailable() + .getEntity()); } else if ("IsBootSequenceTabValid".equals(propName)) { //$NON-NLS-1$ if ((Boolean) vm.getIsHighlyAvailable().getEntity()) { bootOptionsTab.markAsValid(); @@ -980,7 +988,8 @@ changeApplicationLevelVisibility(disksAllocationPanel, isDisksAvailable); boolean isProvisioningAvailable = vm.getProvisioning().getIsAvailable(); - changeApplicationLevelVisibility(storageAllocationPanel, isProvisioningAvailable || isDisksAvailable); + changeApplicationLevelVisibility(storageAllocationPanel, isProvisioningAvailable + || isDisksAvailable); if (isDisksAvailable) { // Update warning message by disks status diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.ui.xml b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.ui.xml index 6050b08..85bd793 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.ui.xml +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.ui.xml @@ -365,12 +365,12 @@ <t:DialogTab ui:field="resourceAllocationTab"> <t:content> <g:FlowPanel> - <g:FlowPanel addStyleNames="{style.sectionPanel}"> + <g:FlowPanel ui:field="memoryAllocationPanel" addStyleNames="{style.sectionPanel}"> <g:Label addStyleNames="{style.sectionLabel}" text="{constants.memAllocVmPopup}" /> <e:EntityModelTextBoxEditor ui:field="minAllocatedMemoryEditor" /> </g:FlowPanel> <g:FlowPanel ui:field="storageAllocationPanel" addStyleNames="{style.sectionPanel}"> - <g:HorizontalPanel> + <g:HorizontalPanel ui:field="diskAllocationLabelPanel"> <g:Label addStyleNames="{style.sectionLabel}" text="{constants.storageAllocVmPopup}" /> <g:Label addStyleNames="{style.sectionComment}" text="{constants.availOnlyTemplSelectedVmPopup}" /> </g:HorizontalPanel> diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/ImagePopupWidget.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/ImagePopupWidget.java index dd281b1..e09c47f 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/ImagePopupWidget.java +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/ImagePopupWidget.java @@ -1,6 +1,7 @@ package org.ovirt.engine.ui.common.widget.uicommon.popup.vm; import static org.ovirt.engine.ui.common.widget.uicommon.popup.vm.VmPopupWidgetConfig.hiddenField; +import static org.ovirt.engine.ui.common.widget.uicommon.popup.vm.VmPopupWidgetConfig.simpleField; import org.ovirt.engine.ui.common.CommonApplicationConstants; import org.ovirt.engine.ui.common.CommonApplicationMessages; @@ -24,7 +25,6 @@ config.put(poolTab, hiddenField()); config.put(initialRunTab, hiddenField()); config.put(templateEditor, hiddenField()); - config.put(resourceAllocationTab, hiddenField()); config.put(consoleTab, hiddenField()); config.put(isStatelessEditor, hiddenField()); config.put(isDeleteProtectedEditor, hiddenField()); @@ -32,6 +32,11 @@ config.put(totalvCPUsEditor, hiddenField()); config.put(memSizeEditor, hiddenField()); config.put(templateEditor, hiddenField()); + config.put(provisionSelectionPanel, hiddenField()); + config.put(diskAllocationLabelPanel, hiddenField()); + config.put(storageAllocationPanel, simpleField()); + config.put(disksAllocationPanel, simpleField()); + config.put(memoryAllocationPanel, hiddenField()); return config; } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/Builder.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/Builder.java index ece462d..8389f7b 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/Builder.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/Builder.java @@ -21,4 +21,16 @@ public static class VoidSource { } + + /** + * If the builder faces some problem (e.g. null somewhere and is not sure how to handle it), calls this interface + * + * @param <T> + * data the builder wants to pass (e.g. warning message) + * @return true to continue, false to terminate the builder - e.g. do not continue AND do not call the rest of the + * builder chain + */ + public static interface ProblemOccurredCallback<T> { + boolean onProblemOccurred(T data); + } } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/template/BootOptionsVmToUnitBuilder.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/template/BootOptionsVmToUnitBuilder.java new file mode 100644 index 0000000..1d293eb --- /dev/null +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/template/BootOptionsVmToUnitBuilder.java @@ -0,0 +1,55 @@ +package org.ovirt.engine.ui.uicommonweb.builders.template; + +import java.util.List; + +import org.ovirt.engine.core.common.businessentities.VM; +import org.ovirt.engine.core.common.businessentities.storage_pool; +import org.ovirt.engine.core.compat.StringHelper; +import org.ovirt.engine.ui.frontend.AsyncQuery; +import org.ovirt.engine.ui.frontend.INewAsyncCallback; +import org.ovirt.engine.ui.uicommonweb.Linq; +import org.ovirt.engine.ui.uicommonweb.builders.Builder; +import org.ovirt.engine.ui.uicommonweb.builders.BuilderList; +import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; +import org.ovirt.engine.ui.uicommonweb.models.vms.UnitVmModel; + +// TODO replace this code in the behavior classes by calling this builder +@SuppressWarnings("deprecation") +public class BootOptionsVmToUnitBuilder implements Builder<VM, UnitVmModel> { + + @Override + public void build(final VM source, final UnitVmModel destination, final BuilderList<VM, UnitVmModel> rest) { + destination.setBootSequence(source.getDefaultBootSequence()); + + boolean hasCd = !StringHelper.isNullOrEmpty(source.getIsoPath()); + destination.getCdImage().setIsChangable(hasCd); + destination.getCdAttached().setEntity(hasCd); + + storage_pool dataCenter = (storage_pool) destination.getDataCenter().getSelectedItem(); + if (dataCenter == null) { + return; + } + + AsyncDataProvider.GetIrsImageList(new AsyncQuery(destination, + new INewAsyncCallback() { + @SuppressWarnings("unchecked") + @Override + public void OnSuccess(Object target, Object returnValue) { + UnitVmModel model = (UnitVmModel) target; + List<String> images = (List<String>) returnValue; + setImagesToModel(model, images); + + rest.head().build(source, destination, rest.tail()); + } + }, destination.getHash()), + dataCenter.getId()); + } + + protected void setImagesToModel(UnitVmModel model, List<String> images) { + String oldCdImage = (String) model.getCdImage().getSelectedItem(); + model.getCdImage().setItems(images); + model.getCdImage().setSelectedItem((oldCdImage != null) ? oldCdImage + : Linq.FirstOrDefault(images)); + } + +} diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/template/ClusterVmToUnitBuilder.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/template/ClusterVmToUnitBuilder.java new file mode 100644 index 0000000..ef77221 --- /dev/null +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/template/ClusterVmToUnitBuilder.java @@ -0,0 +1,40 @@ +package org.ovirt.engine.ui.uicommonweb.builders.template; + +import java.util.ArrayList; + +import org.ovirt.engine.core.common.businessentities.StorageType; +import org.ovirt.engine.core.common.businessentities.VDSGroup; +import org.ovirt.engine.core.common.businessentities.VM; +import org.ovirt.engine.core.common.businessentities.storage_pool; +import org.ovirt.engine.ui.frontend.AsyncQuery; +import org.ovirt.engine.ui.frontend.INewAsyncCallback; +import org.ovirt.engine.ui.uicommonweb.builders.Builder; +import org.ovirt.engine.ui.uicommonweb.builders.BuilderList; +import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; +import org.ovirt.engine.ui.uicommonweb.models.vms.UnitVmModel; + +public class ClusterVmToUnitBuilder implements Builder<VM, UnitVmModel> { + + @Override + public void build(final VM source, final UnitVmModel destination, final BuilderList<VM, UnitVmModel> rest) { + + storage_pool dataCenter = (storage_pool) destination.getDataCenter().getSelectedItem(); + destination.setIsHostAvailable(dataCenter.getstorage_pool_type() != StorageType.LOCALFS); + + AsyncDataProvider.GetClusterList(new AsyncQuery(new Object[] { this, destination }, + new INewAsyncCallback() { + @Override + public void OnSuccess(Object target, Object returnValue) { + + Object[] array = (Object[]) target; + UnitVmModel model = (UnitVmModel) array[1]; + ArrayList<VDSGroup> clusters = (ArrayList<VDSGroup>) returnValue; + model.SetClusters(model, clusters, source.getVdsGroupId().getValue()); + + rest.head().build(source, destination, rest.tail()); + + } + }, destination.getHash()), dataCenter.getId()); + } + +} diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/template/CustomPropertiesUnitToVmBuilder.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/template/CustomPropertiesUnitToVmBuilder.java new file mode 100644 index 0000000..73bd6ef --- /dev/null +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/template/CustomPropertiesUnitToVmBuilder.java @@ -0,0 +1,13 @@ +package org.ovirt.engine.ui.uicommonweb.builders.template; + +import org.ovirt.engine.core.common.businessentities.VM; +import org.ovirt.engine.ui.uicommonweb.builders.BaseSyncBuilder; +import org.ovirt.engine.ui.uicommonweb.models.vms.UnitVmModel; + +public class CustomPropertiesUnitToVmBuilder extends BaseSyncBuilder<VM, UnitVmModel> { + + @Override + protected void build(VM source, UnitVmModel destination) { + destination.getCustomProperties().setEntity(source.getCustomProperties()); + } +} diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/template/DiskListVmToUnitBuilder.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/template/DiskListVmToUnitBuilder.java new file mode 100644 index 0000000..8e57bf5 --- /dev/null +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/template/DiskListVmToUnitBuilder.java @@ -0,0 +1,107 @@ +package org.ovirt.engine.ui.uicommonweb.builders.template; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +import org.ovirt.engine.core.common.businessentities.Disk; +import org.ovirt.engine.core.common.businessentities.DiskImage; +import org.ovirt.engine.core.common.businessentities.VM; +import org.ovirt.engine.core.common.businessentities.VolumeType; +import org.ovirt.engine.core.common.businessentities.Disk.DiskStorageType; +import org.ovirt.engine.ui.frontend.AsyncQuery; +import org.ovirt.engine.ui.frontend.INewAsyncCallback; +import org.ovirt.engine.ui.uicommonweb.Linq; +import org.ovirt.engine.ui.uicommonweb.builders.Builder; +import org.ovirt.engine.ui.uicommonweb.builders.BuilderList; +import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; +import org.ovirt.engine.ui.uicommonweb.models.EntityModel; +import org.ovirt.engine.ui.uicommonweb.models.ListModel; +import org.ovirt.engine.ui.uicommonweb.models.vms.DiskModel; +import org.ovirt.engine.ui.uicommonweb.models.vms.UnitVmModel; +import org.ovirt.engine.ui.uicompat.ConstantsManager; +import org.ovirt.engine.ui.uicompat.external.StringUtils; + +public class DiskListVmToUnitBuilder implements Builder<VM, UnitVmModel> { + + @Override + public void build(final VM source, final UnitVmModel destination, final BuilderList<VM, UnitVmModel> rest) { + AsyncDataProvider.GetVmDiskList(new AsyncQuery(this, + new INewAsyncCallback() { + @Override + public void OnSuccess(Object target, Object returnValue) { + + ArrayList<Disk> disks = new ArrayList<Disk>(); + List<Disk> nonExportableDisks = new ArrayList<Disk>(); + Iterable<Disk> disksEnumerable = (Iterable<Disk>) returnValue; + Iterator<Disk> disksIterator = disksEnumerable.iterator(); + + while (disksIterator.hasNext()) + { + Disk disk = (Disk) disksIterator.next(); + + if (disk.getDiskStorageType() == DiskStorageType.IMAGE && !disk.isShareable()) { + disks.add(disk); + } else if (!disk.isAllowSnapshot()) { + nonExportableDisks.add(disk); + } + } + + InitDisks(disks, destination); + sendWarningForNonExportableDisks(nonExportableDisks, destination); + + rest.head().build(source, destination, rest.tail()); + } + }, destination.getHash()), + source.getId(), + true); + } + + private void sendWarningForNonExportableDisks(List<Disk> nonExportableDisks, UnitVmModel destination) { + if (!nonExportableDisks.isEmpty()) { + final List<String> list = new ArrayList<String>(); + for (Disk disk : nonExportableDisks) { + list.add(disk.getDiskAlias()); + } + + final String s = StringUtils.join(list, ", "); //$NON-NLS-1$ + + // append warning message + destination.setMessage(ConstantsManager.getInstance() + .getMessages() + .disksWillNotBePartOfTheExportedVMTemplate(s)); + } + } + + private void InitDisks(ArrayList<Disk> disks, UnitVmModel destination) + { + Collections.sort(disks, new Linq.DiskByAliasComparer()); + ArrayList<DiskModel> list = new ArrayList<DiskModel>(); + + for (Disk disk : disks) + { + DiskModel diskModel = new DiskModel(); + diskModel.setIsNew(true); + + if (disk.getDiskStorageType() == DiskStorageType.IMAGE) { + DiskImage diskImage = (DiskImage) disk; + EntityModel size = new EntityModel(); + size.setEntity(diskImage.getSizeInGigabytes()); + diskModel.setSize(size); + ListModel volumes = new ListModel(); + volumes.setItems((diskImage.getVolumeType() == VolumeType.Preallocated ? new ArrayList<VolumeType>(Arrays.asList(new VolumeType[] { VolumeType.Preallocated })) + : AsyncDataProvider.GetVolumeTypeList())); + volumes.setSelectedItem(diskImage.getVolumeType()); + diskModel.setVolumeType(volumes); + diskModel.getAlias().setEntity(diskImage.getDiskAlias()); + } + + diskModel.setDisk(disk); + list.add(diskModel); + } + destination.setDisks(list); + } + +} diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/template/GeneralVmToUnitBuilder.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/template/GeneralVmToUnitBuilder.java new file mode 100644 index 0000000..ec49a68 --- /dev/null +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/template/GeneralVmToUnitBuilder.java @@ -0,0 +1,14 @@ +package org.ovirt.engine.ui.uicommonweb.builders.template; + +import org.ovirt.engine.core.common.businessentities.VM; +import org.ovirt.engine.ui.uicommonweb.builders.BaseSyncBuilder; +import org.ovirt.engine.ui.uicommonweb.models.vms.UnitVmModel; + +public class GeneralVmToUnitBuilder extends BaseSyncBuilder<VM, UnitVmModel> { + + @Override + protected void build(VM source, UnitVmModel destination) { + destination.getOSType().setSelectedItem(source.getVmOs()); + } + +} diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/template/QuotaVmToUnitBuilder.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/template/QuotaVmToUnitBuilder.java new file mode 100644 index 0000000..22864747 --- /dev/null +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/template/QuotaVmToUnitBuilder.java @@ -0,0 +1,72 @@ +package org.ovirt.engine.ui.uicommonweb.builders.template; + +import java.util.ArrayList; + +import org.ovirt.engine.core.common.businessentities.Quota; +import org.ovirt.engine.core.common.businessentities.VDSGroup; +import org.ovirt.engine.core.common.queries.GetAllRelevantQuotasForVdsGroupParameters; +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.AsyncQuery; +import org.ovirt.engine.ui.frontend.Frontend; +import org.ovirt.engine.ui.frontend.INewAsyncCallback; +import org.ovirt.engine.ui.uicommonweb.builders.Builder; +import org.ovirt.engine.ui.uicommonweb.builders.BuilderList; +import org.ovirt.engine.ui.uicommonweb.models.vms.UnitVmModel; + +public class QuotaVmToUnitBuilder<T> implements Builder<T, UnitVmModel> { + + private final Guid defaultQuota; + private final String quotaName; + + public QuotaVmToUnitBuilder(Guid defaultQuota, String quotaName) { + this.defaultQuota = defaultQuota; + this.quotaName = quotaName; + } + + @Override + public void build(final T source, + final UnitVmModel destination, + final BuilderList<T, UnitVmModel> rest) { + if (destination.getQuota().getIsAvailable()) { + VDSGroup cluster = (VDSGroup) destination.getCluster().getSelectedItem(); + if (cluster == null) { + return; + } + Frontend.RunQuery(VdcQueryType.GetAllRelevantQuotasForVdsGroup, + new GetAllRelevantQuotasForVdsGroupParameters(cluster.getId()), new AsyncQuery(destination, + new INewAsyncCallback() { + + @Override + public void OnSuccess(Object model, Object returnValue) { + UnitVmModel vmModel = (UnitVmModel) model; + ArrayList<Quota> quotaList = + (ArrayList<Quota>) ((VdcQueryReturnValue) returnValue).getReturnValue(); + if (quotaList != null && !quotaList.isEmpty()) { + vmModel.getQuota().setItems(quotaList); + } + if (defaultQuota != null) { + boolean hasQuotaInList = false; + for (Quota quota : quotaList) { + if (quota.getId().equals(defaultQuota)) { + vmModel.getQuota().setSelectedItem(quota); + hasQuotaInList = true; + break; + } + } + if (!hasQuotaInList) { + Quota quota = new Quota(); + quota.setId(defaultQuota); + quota.setQuotaName(quotaName); + quotaList.add(quota); + vmModel.getQuota().setItems(quotaList); + vmModel.getQuota().setSelectedItem(quota); + } + } + } + })); + } + } + +} diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/template/StorageDomainVmToUnitBuilder.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/template/StorageDomainVmToUnitBuilder.java new file mode 100644 index 0000000..1d5d946 --- /dev/null +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/template/StorageDomainVmToUnitBuilder.java @@ -0,0 +1,114 @@ +package org.ovirt.engine.ui.uicommonweb.builders.template; + +import java.util.ArrayList; +import java.util.Arrays; + +import org.ovirt.engine.core.common.businessentities.ActionGroup; +import org.ovirt.engine.core.common.businessentities.Disk.DiskStorageType; +import org.ovirt.engine.core.common.businessentities.DiskImage; +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.VM; +import org.ovirt.engine.ui.frontend.AsyncQuery; +import org.ovirt.engine.ui.frontend.INewAsyncCallback; +import org.ovirt.engine.ui.uicommonweb.Linq; +import org.ovirt.engine.ui.uicommonweb.builders.Builder; +import org.ovirt.engine.ui.uicommonweb.builders.BuilderList; +import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; +import org.ovirt.engine.ui.uicommonweb.models.SystemTreeItemModel; +import org.ovirt.engine.ui.uicommonweb.models.SystemTreeItemType; +import org.ovirt.engine.ui.uicommonweb.models.vms.DiskModel; +import org.ovirt.engine.ui.uicommonweb.models.vms.UnitVmModel; +import org.ovirt.engine.ui.uicompat.ConstantsManager; + +public class StorageDomainVmToUnitBuilder implements Builder<VM, UnitVmModel> { + + private final SystemTreeItemModel systemTree; + private final org.ovirt.engine.ui.uicommonweb.builders.Builder.ProblemOccurredCallback<String> problemCallback; + + public StorageDomainVmToUnitBuilder(SystemTreeItemModel systemTree, ProblemOccurredCallback<String> problemCallback) { + this.systemTree = systemTree; + this.problemCallback = problemCallback; + } + + @Override + public void build(final VM source, final UnitVmModel destination, final BuilderList<VM, UnitVmModel> rest) { + AsyncDataProvider.GetPermittedStorageDomainsByStoragePoolId(new AsyncQuery(this, + new INewAsyncCallback() { + @Override + public void OnSuccess(Object target, Object returnValue) { + ArrayList<StorageDomain> activeStorageDomainList = + new ArrayList<StorageDomain>(); + + for (StorageDomain storageDomain : (ArrayList<StorageDomain>) returnValue) { + if (storageDomain.getStatus() == StorageDomainStatus.Active + && (storageDomain.getStorageDomainType() == StorageDomainType.Data || storageDomain.getStorageDomainType() == StorageDomainType.Master)) { + activeStorageDomainList.add(storageDomain); + } + } + + for (DiskModel diskModel : destination.getDisks()) { + if (diskModel.getDisk().getDiskStorageType() == DiskStorageType.IMAGE) { + DiskImage diskImage = (DiskImage) diskModel.getDisk(); + ArrayList<StorageDomain> activeDiskStorages = + Linq.getStorageDomainsByIds(diskImage.getStorageIds(), activeStorageDomainList); + + if (activeDiskStorages.isEmpty()) { + String msg = ConstantsManager.getInstance() + .getMessages() + .vmStorageDomainIsNotAccessible(); + if (!problemCallback.onProblemOccurred(msg)) { + return; + } + } + } + } + + if (activeStorageDomainList.size() > 0) { + destination.setIsDisksAvailable(true); + if (systemTree != null + && systemTree.getType() == SystemTreeItemType.Storage) { + StorageDomain selectStorage = + (StorageDomain) systemTree.getEntity(); + StorageDomain s = + Linq.FirstOrDefault(activeStorageDomainList, + new Linq.StoragePredicate(selectStorage.getId())); + activeStorageDomainList = + new ArrayList<StorageDomain>(Arrays.asList(new StorageDomain[] { s })); + + destination.getStorageDomain().setItems(activeStorageDomainList); + destination.getStorageDomain().setIsChangable(false); + destination.getStorageDomain().setSelectedItem(s); + } else { + destination.getStorageDomain().setItems(activeStorageDomainList); + destination.getStorageDomain().setIsChangable(true); + } + } else { + String msg = ConstantsManager.getInstance() + .getMessages() + .noActiveStorageDomain(); + problemCallback.onProblemOccurred(msg); + } + + ArrayList<DiskModel> disks = + (ArrayList<DiskModel>) destination.getDisksAllocationModel().getDisks(); + + Linq.Sort(activeStorageDomainList, new Linq.StorageDomainByNameComparer()); + if (disks != null) { + for (DiskModel diskModel : disks) { + diskModel.getStorageDomain().setItems(activeStorageDomainList); + diskModel.getQuota().setItems(destination.getQuota().getItems()); + } + } + + rest.head().build(source, destination, rest.tail()); + } + + }, + destination.getHash()), + source.getStoragePoolId(), + ActionGroup.CREATE_TEMPLATE); + } + +} diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/unit/DataCenterToUnitBuilder.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/unit/DataCenterToUnitBuilder.java index a838181..121de73 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/unit/DataCenterToUnitBuilder.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/unit/DataCenterToUnitBuilder.java @@ -10,12 +10,11 @@ import org.ovirt.engine.ui.uicommonweb.builders.BuilderList; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; import org.ovirt.engine.ui.uicommonweb.models.vms.UnitVmModel; -import static org.ovirt.engine.ui.uicommonweb.builders.Builder.VoidSource; -public class DataCenterToUnitBuilder implements Builder<VoidSource, UnitVmModel> { +public class DataCenterToUnitBuilder<S> implements Builder<S, UnitVmModel> { @Override - public void build(final VoidSource source, final UnitVmModel destination, final BuilderList<VoidSource, UnitVmModel> rest) { + public void build(final S source, final UnitVmModel destination, final BuilderList<S, UnitVmModel> rest) { AsyncDataProvider.GetDataCenterList(new AsyncQuery(destination, new INewAsyncCallback() { @SuppressWarnings("unchecked") diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewImageModelBehavior.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewImageModelBehavior.java index c8f234c..b1bd68b 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewImageModelBehavior.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewImageModelBehavior.java @@ -1,11 +1,98 @@ package org.ovirt.engine.ui.uicommonweb.models.vms; import org.ovirt.engine.core.common.businessentities.VM; +import org.ovirt.engine.ui.uicommonweb.builders.Builder; +import org.ovirt.engine.ui.uicommonweb.builders.BuilderExecutor; +import org.ovirt.engine.ui.uicommonweb.builders.template.BootOptionsVmToUnitBuilder; +import org.ovirt.engine.ui.uicommonweb.builders.template.ClusterVmToUnitBuilder; +import org.ovirt.engine.ui.uicommonweb.builders.template.CustomPropertiesUnitToVmBuilder; +import org.ovirt.engine.ui.uicommonweb.builders.template.DiskListVmToUnitBuilder; +import org.ovirt.engine.ui.uicommonweb.builders.template.GeneralVmToUnitBuilder; +import org.ovirt.engine.ui.uicommonweb.builders.template.QuotaVmToUnitBuilder; +import org.ovirt.engine.ui.uicommonweb.builders.template.StorageDomainVmToUnitBuilder; +import org.ovirt.engine.ui.uicommonweb.builders.unit.DataCenterToUnitBuilder; +import org.ovirt.engine.ui.uicommonweb.models.SystemTreeItemModel; +import org.ovirt.engine.ui.uicommonweb.models.storage.DisksAllocationModel; -public class NewImageModelBehavior extends NewTemplateVmModelBehavior { +public class NewImageModelBehavior extends VmModelBehaviorBase<UnitVmModel> { + + private final VM vm; public NewImageModelBehavior(VM vm) { - super(vm); + this.vm = vm; } + @SuppressWarnings("unchecked") + @Override + public void Initialize(SystemTreeItemModel systemTreeSelectedItem) { + super.Initialize(systemTreeSelectedItem); + + DisksAllocationModel disksAllocationModel = getModel().getDisksAllocationModel(); + disksAllocationModel.setIsAliasChangable(true); + + new BuilderExecutor<VM, UnitVmModel>( + new GeneralVmToUnitBuilder(), + // this will cause the DataCenter_SelectedItemChanged - no need to do the cluster here + new DataCenterToUnitBuilder<VM>(), + new BootOptionsVmToUnitBuilder(), + new CustomPropertiesUnitToVmBuilder()).build(vm, getModel()); + } + + @SuppressWarnings("unchecked") + @Override + public void InitStorageDomains() { + + new BuilderExecutor<VM, UnitVmModel>().build(vm, getModel()); + } + + @SuppressWarnings("unchecked") + @Override + public void DataCenter_SelectedItemChanged() { + + new BuilderExecutor<VM, UnitVmModel>( + new ClusterVmToUnitBuilder(), + // If a VM has at least one disk, present its storage domain. + new DiskListVmToUnitBuilder(), + new StorageDomainVmToUnitBuilder( + getSystemTreeSelectedItem(), + new StorageDomainVmToUnitBuilderProblemCallback())).build(vm, getModel()); + } + + @Override + public void Template_SelectedItemChanged() { + // no - op + } + + @SuppressWarnings("unchecked") + @Override + public void Cluster_SelectedItemChanged() { + new BuilderExecutor<VM, UnitVmModel>( + new QuotaVmToUnitBuilder<VM>(null, null) + ).build(vm, getModel()); + } + + @Override + public void DefaultHost_SelectedItemChanged() { + // no - op + } + + @Override + public void Provisioning_SelectedItemChanged() { + // no - op + } + + @Override + public void UpdateMinAllocatedMemory() { + // no - op + } + + class StorageDomainVmToUnitBuilderProblemCallback implements Builder.ProblemOccurredCallback<String> { + + @Override + public boolean onProblemOccurred(String data) { + // do nothing for now... + return false; + } + + } } 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 a230122..58d532f 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 @@ -31,7 +31,7 @@ { super.Initialize(systemTreeSelectedItem); new BuilderExecutor<VoidSource, UnitVmModel>( - new DataCenterToUnitBuilder() + new DataCenterToUnitBuilder<VoidSource>() ).build(new VoidSource(), getModel()); InitPriority(0); } 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 25082b1..51b4b61 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 @@ -35,6 +35,7 @@ import org.ovirt.engine.core.common.businessentities.DiskImage; import org.ovirt.engine.core.common.businessentities.DisplayType; import org.ovirt.engine.core.common.businessentities.StorageDomain; +import org.ovirt.engine.core.common.businessentities.TemplateType; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSGroup; import org.ovirt.engine.core.common.businessentities.VDSStatus; @@ -88,9 +89,9 @@ import org.ovirt.engine.ui.uicommonweb.models.configure.PermissionListModel; import org.ovirt.engine.ui.uicommonweb.models.tags.TagListModel; import org.ovirt.engine.ui.uicommonweb.models.tags.TagModel; +import org.ovirt.engine.ui.uicommonweb.models.templates.InstanceTypeListModel; import org.ovirt.engine.ui.uicommonweb.models.templates.VmBaseListModel; import org.ovirt.engine.ui.uicommonweb.models.userportal.AttachCdModel; -import org.ovirt.engine.ui.uicompat.Constants; import org.ovirt.engine.ui.uicompat.ConstantsManager; import org.ovirt.engine.ui.uicompat.Event; import org.ovirt.engine.ui.uicompat.EventArgs; @@ -1801,11 +1802,7 @@ UnitVmModel model = new UnitVmModel(new NewTemplateVmModelBehavior(vm)); setWindow(model); - Constants constants = ConstantsManager.getInstance().getConstants(); - String title = - getLastExecutedCommand() == getNewImageCommand() ? constants.newImageTitle() - : constants.newTemplateTitle(); - model.setTitle(title); + model.setTitle(ConstantsManager.getInstance().getConstants().newTemplateTitle()); model.setHashName("new_template"); //$NON-NLS-1$ model.setIsNew(true); model.setVmType(vm.getVmType()); @@ -1879,7 +1876,68 @@ } private void newImage() { - NewTemplate(); + VM vm = (VM) getSelectedItem(); + if (vm == null) + { + return; + } + + if (getWindow() != null) + { + return; + } + + UnitVmModel model = new UnitVmModel(new NewImageModelBehavior(vm)) { + @Override + public boolean Validate() { + return true; + } + }; + setWindow(model); + model.setTitle(ConstantsManager.getInstance().getConstants().newImageTitle()); + model.setHashName("new_image"); //$NON-NLS-1$ + + model.Initialize(getSystemTreeSelectedItem()); + + UICommand tempVar = new UICommand("OnNewImage", this); //$NON-NLS-1$ + tempVar.setTitle(ConstantsManager.getInstance().getConstants().ok()); + tempVar.setIsDefault(true); + model.getCommands().add(tempVar); + UICommand tempVar2 = new UICommand("Cancel", this); //$NON-NLS-1$ + tempVar2.setTitle(ConstantsManager.getInstance().getConstants().cancel()); + tempVar2.setIsCancel(true); + model.getCommands().add(tempVar2); + } + + private void onNewImage() { + UnitVmModel model = (UnitVmModel) getWindow(); + + if (!model.Validate()) { + model.setIsValid(false); + return; + } + + VM newVm = (VM) Cloner.clone(getSelectedItem()); + newVm.setName("otherName"); + + AddVmTemplateParameters addVmTemplateParameters = + new AddVmTemplateParameters(newVm, + (String) model.getName().getEntity(), + (String) model.getDescription().getEntity()); + addVmTemplateParameters.setTemplateType(TemplateType.IMAGE_TYPE); + + Frontend.RunAction(VdcActionType.AddVmTemplate, addVmTemplateParameters, + new IFrontendActionAsyncCallback() { + @Override + public void Executed(FrontendActionAsyncResult result) { + VmListModel imageListModel = (VmListModel) result.getState(); + imageListModel.getWindow().StopProgress(); + VdcReturnValueBase returnValueBase = result.getReturnValue(); + if (returnValueBase != null && returnValueBase.getSucceeded()) { + Cancel(); + } + } + }, this); } @SuppressWarnings("unchecked") @@ -3112,6 +3170,8 @@ setWindow(null); } else if (StringHelper.stringsEqual(command.getName(), "OnAdvanced")) { //$NON-NLS-1$ onAdvanced(); + } else if (command.getName().equals("OnNewImage")) { //$NON-NLS-1$ + onNewImage(); } } 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 a1f044f..3090138 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 @@ -13,24 +13,24 @@ import org.ovirt.engine.core.common.businessentities.Disk.DiskStorageType; import org.ovirt.engine.core.common.businessentities.DiskImage; import org.ovirt.engine.core.common.businessentities.MigrationSupport; -import org.ovirt.engine.core.common.businessentities.Quota; +import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.VDS; 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.StorageDomain; import org.ovirt.engine.core.common.businessentities.storage_pool; import org.ovirt.engine.core.common.queries.ConfigurationValues; -import org.ovirt.engine.core.common.queries.GetAllRelevantQuotasForVdsGroupParameters; 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.NGuid; 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.builders.Builder; +import org.ovirt.engine.ui.uicommonweb.builders.Builder.VoidSource; +import org.ovirt.engine.ui.uicommonweb.builders.BuilderExecutor; +import org.ovirt.engine.ui.uicommonweb.builders.template.QuotaVmToUnitBuilder; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; import org.ovirt.engine.ui.uicommonweb.models.EntityModel; import org.ovirt.engine.ui.uicommonweb.models.ListModel; @@ -669,45 +669,11 @@ return list; } + @SuppressWarnings("unchecked") protected void updateQuotaByCluster(final Guid defaultQuota, final String quotaName) { - if (getModel().getQuota().getIsAvailable()) { - VDSGroup cluster = (VDSGroup) getModel().getCluster().getSelectedItem(); - if (cluster == null) { - return; - } - Frontend.RunQuery(VdcQueryType.GetAllRelevantQuotasForVdsGroup, - new GetAllRelevantQuotasForVdsGroupParameters(cluster.getId()), new AsyncQuery(getModel(), - new INewAsyncCallback() { - - @Override - public void OnSuccess(Object model, Object returnValue) { - UnitVmModel vmModel = (UnitVmModel) model; - ArrayList<Quota> quotaList = - (ArrayList<Quota>) ((VdcQueryReturnValue) returnValue).getReturnValue(); - if (quotaList != null && !quotaList.isEmpty()) { - vmModel.getQuota().setItems(quotaList); - } - if (defaultQuota != null) { - boolean hasQuotaInList = false; - for (Quota quota : quotaList) { - if (quota.getId().equals(defaultQuota)) { - vmModel.getQuota().setSelectedItem(quota); - hasQuotaInList = true; - break; - } - } - if (!hasQuotaInList) { - Quota quota = new Quota(); - quota.setId(defaultQuota); - quota.setQuotaName(quotaName); - quotaList.add(quota); - vmModel.getQuota().setItems(quotaList); - vmModel.getQuota().setSelectedItem(quota); - } - } - } - })); - } + new BuilderExecutor<VoidSource, UnitVmModel>( + new QuotaVmToUnitBuilder(defaultQuota, quotaName) + ).build(new Builder.VoidSource(), getModel()); } protected void setupTemplate(VM vm, ListModel model) { -- To view, visit http://gerrit.ovirt.org/12443 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Id1932f8dfe9f52fcbdcdf83fc4b879f570d95108 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Tomas Jelinek <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
