Frank Kobzik has uploaded a new change for review. Change subject: frontend: [WIP] Control virtio rng device ......................................................................
frontend: [WIP] Control virtio rng device This patch adds the possibility of attaching/detaching virtio paravirualized device for VMs. For this a new subtab is added to new/edit vm dialog. Change-Id: Iffbc48062f25d90795bc360362f42cd1042fb888 Signed-off-by: Frantisek Kobzik <fkob...@redhat.com> Bug-Url: https://bugzilla.redhat.com/977079 --- M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/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/resources/org/ovirt/engine/core/Common.gwt.xml 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/vms/ExistingVmModelBehavior.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/TemplateVmModelBehavior.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UnitVmModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmListModel.java M frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java 11 files changed, 406 insertions(+), 29 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/97/18497/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 fada693..50243a5 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 @@ -1566,4 +1566,31 @@ @DefaultStringValue("Network") String networkProfilePopup(); + + @DefaultStringValue("Random Generator enabled") + String rngDevEnabled(); + + @DefaultStringValue("Period duration (ms)") + String rngPeriod(); + + @DefaultStringValue("Bytes per period") + String rngBytes(); + + @DefaultStringValue("Device backend") + String deviceBackend(); + + @DefaultStringValue("/dev/random backend") + String rngSourceRandom(); + + @DefaultStringValue("/dev/hwrng backend") + String rngSourceHwrng(); + + @DefaultStringValue("EGD backend") + String rngEgd(); + + @DefaultStringValue("EGD path") + String egdPath(); + + @DefaultStringValue("Random Generator") + String rngDeviceTab(); } 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 d71ec10..67336ea 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 @@ -1,11 +1,30 @@ package org.ovirt.engine.ui.common.widget.uicommon.popup; -import static org.ovirt.engine.ui.common.widget.uicommon.popup.vm.PopupWidgetConfig.simpleField; - +import com.google.gwt.core.client.GWT; +import com.google.gwt.editor.client.SimpleBeanEditorDriver; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.logical.shared.ValueChangeEvent; +import com.google.gwt.event.logical.shared.ValueChangeHandler; +import com.google.gwt.resources.client.CssResource; +import com.google.gwt.safehtml.shared.SafeHtmlUtils; +import com.google.gwt.text.shared.AbstractRenderer; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.cellview.client.CellTable; +import com.google.gwt.user.cellview.client.CellTable.Resources; +import com.google.gwt.user.client.ui.ButtonBase; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.Panel; +import com.google.gwt.user.client.ui.RadioButton; +import com.google.gwt.user.client.ui.ValueLabel; +import com.google.gwt.user.client.ui.Widget; import java.util.ArrayList; import java.util.Arrays; import java.util.List; - import org.ovirt.engine.core.common.businessentities.Disk; import org.ovirt.engine.core.common.businessentities.Disk.DiskStorageType; import org.ovirt.engine.core.common.businessentities.DiskImage; @@ -14,6 +33,7 @@ import org.ovirt.engine.core.common.businessentities.UsbPolicy; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSGroup; +import org.ovirt.engine.core.common.businessentities.VmRngDevice; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.queries.ConfigurationValues; import org.ovirt.engine.core.compat.StringHelper; @@ -50,6 +70,7 @@ import org.ovirt.engine.ui.uicommonweb.models.vms.DiskModel; import org.ovirt.engine.ui.uicommonweb.models.vms.TimeZoneModel; import org.ovirt.engine.ui.uicommonweb.models.vms.UnitVmModel; +import org.ovirt.engine.ui.uicompat.ConstantsManager; import org.ovirt.engine.ui.uicompat.EnumTranslator; import org.ovirt.engine.ui.uicompat.Event; import org.ovirt.engine.ui.uicompat.EventArgs; @@ -57,28 +78,8 @@ import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs; import org.ovirt.engine.ui.uicompat.external.StringUtils; -import com.google.gwt.core.client.GWT; -import com.google.gwt.editor.client.SimpleBeanEditorDriver; -import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.event.dom.client.ClickHandler; -import com.google.gwt.event.logical.shared.ValueChangeEvent; -import com.google.gwt.event.logical.shared.ValueChangeHandler; -import com.google.gwt.resources.client.CssResource; -import com.google.gwt.safehtml.shared.SafeHtmlUtils; -import com.google.gwt.text.shared.AbstractRenderer; -import com.google.gwt.uibinder.client.UiBinder; -import com.google.gwt.uibinder.client.UiField; -import com.google.gwt.uibinder.client.UiHandler; -import com.google.gwt.user.cellview.client.CellTable; -import com.google.gwt.user.cellview.client.CellTable.Resources; -import com.google.gwt.user.client.ui.ButtonBase; -import com.google.gwt.user.client.ui.FlowPanel; -import com.google.gwt.user.client.ui.HorizontalPanel; -import com.google.gwt.user.client.ui.Label; -import com.google.gwt.user.client.ui.Panel; -import com.google.gwt.user.client.ui.RadioButton; -import com.google.gwt.user.client.ui.ValueLabel; -import com.google.gwt.user.client.ui.Widget; + +import static org.ovirt.engine.ui.common.widget.uicommon.popup.vm.PopupWidgetConfig.simpleField; public abstract class AbstractVmPopupWidget extends AbstractModeSwitchingPopupWidget<UnitVmModel> { @@ -383,6 +384,49 @@ @WithElementId("isConsoleDeviceEnabled") public EntityModelCheckBoxEditor isConsoleDeviceEnabledEditor; + // == Rng Tab == + @UiField + protected DialogTab rngDeviceTab; + + @UiField(provided = true) + @Path(value = "isRngEnabled.entity") + @WithElementId("isRngEnabled") + public EntityModelCheckBoxEditor isRngEnabledEditor; + + @UiField + @Ignore + protected FlowPanel rngPanel; + + @UiField(provided = true) + @Ignore + @WithElementId("rngPeriodEditor") + public EntityModelTextBoxEditor rngPeriodEditor; + + @UiField(provided = true) + @Ignore + @WithElementId("rngBytesEditor") + public EntityModelTextBoxEditor rngBytesEditor; + + @UiField(provided = true) + @Ignore + @WithElementId("rngRandomRandom") + public RadioButton rngRandomRandom; + + @UiField(provided = true) + @Ignore + @WithElementId("rngRandomHwrng") + public RadioButton rngRandomHwrng; + + @UiField(provided = true) + @Ignore + @WithElementId("rngEgd") + public RadioButton rngEgd; + + @UiField(provided = true) + @Ignore + @WithElementId("rngSourceEgd") + public EntityModelTextBoxEditor rngSourceEgdEditor; + // ==Host Tab== @UiField protected DialogTab hostTab; @@ -605,6 +649,15 @@ isDeleteProtectedEditor = new EntityModelCheckBoxEditor(Align.RIGHT, new ModeSwitchingVisibilityRenderer()); isSmartcardEnabledEditor = new EntityModelCheckBoxEditor(Align.RIGHT, new ModeSwitchingVisibilityRenderer()); isConsoleDeviceEnabledEditor = new EntityModelCheckBoxEditor(Align.RIGHT, new ModeSwitchingVisibilityRenderer()); + + isRngEnabledEditor = new EntityModelCheckBoxEditor(Align.RIGHT, new ModeSwitchingVisibilityRenderer()); + rngPeriodEditor = new EntityModelTextBoxEditor(new ModeSwitchingVisibilityRenderer()); + rngBytesEditor = new EntityModelTextBoxEditor(new ModeSwitchingVisibilityRenderer()); + rngRandomRandom = new RadioButton("rndBackendModel"); //$NON-NLS-1$ + rngRandomHwrng = new RadioButton("rndBackendModel"); //$NON-NLS-1$ + rngEgd = new RadioButton("rndBackendModel"); //$NON-NLS-1$ + rngSourceEgdEditor = new EntityModelTextBoxEditor(new ModeSwitchingVisibilityRenderer()); + cdAttachedEditor = new EntityModelCheckBoxEditor(Align.LEFT, new ModeSwitchingVisibilityRenderer()); allowConsoleReconnectEditor = new EntityModelCheckBoxEditor(Align.RIGHT, new ModeSwitchingVisibilityRenderer()); isSoundcardEnabledEditor = new EntityModelCheckBoxEditor(Align.RIGHT, new ModeSwitchingVisibilityRenderer()); @@ -928,6 +981,13 @@ isSmartcardEnabledEditor.setLabel(constants.smartcardVmPopup()); isMemoryBalloonDeviceEnabled.setLabel(constants.memoryBalloonDeviceEnabled()); + // Rng device tab + rngDeviceTab.setLabel(constants.rngDeviceTab()); + isRngEnabledEditor.setLabel(constants.rngDevEnabled()); + rngPeriodEditor.setLabel(constants.rngPeriod()); + rngBytesEditor.setLabel(constants.rngBytes()); + rngSourceEgdEditor.setLabel(constants.egdPath()); + // Pools Tab poolTab.setLabel(constants.poolVmPopup()); poolTypeEditor.setLabel(constants.poolTypeVmPopup()); @@ -1056,6 +1116,18 @@ setupCustomPropertiesAvailability(object); } else if ("IsDisksAvailable".equals(propName)) { //$NON-NLS-1$ addDiskAllocation(object); + } else if ("RngRateValid".equals(propName)) { //$NON-NLS-1$ + if (object.isRngRateValid()) { + rngPeriodEditor.markAsValid(); + } else { + rngBytesEditor.markAsInvalid(Arrays.asList(ConstantsManager.getInstance().getConstants().rngRateInvalid())); + } + } else if ("RngEgdPathValid".equals(propName)) { //$NON-NLS-1$ + if (object.isRngEgdPathValid()) { + rngSourceEgdEditor.markAsValid(); + } else { + rngSourceEgdEditor.markAsInvalid(Arrays.asList(ConstantsManager.getInstance().getConstants().rngRateInvalid())); + } } } }); @@ -1070,6 +1142,20 @@ specificHost.setValue(!isAutoAssign); } }); + + object.getRngDevice().getPropertyChangedEvent().addListener(new IEventListener() { + @Override + public void eventRaised(Event ev, Object sender, EventArgs args) { + VmRngDevice dev = (VmRngDevice) object.getRngDevice().getEntity(); + VmRngDevice.Backend.Model model = dev.getBackend().getModel(); + + rngPeriodEditor.asValueBox().setValue(dev.getRate().getPeriod()); + rngBytesEditor.asValueBox().setValue(dev.getRate().getBytes()); + rngRandomRandom.setValue(model == VmRngDevice.Backend.Model.DEV_RANDOM); + rngRandomHwrng.setValue(model == VmRngDevice.Backend.Model.DEV_HWNNG); + rngEgd.setValue(model == VmRngDevice.Backend.Model.EGD); + rngSourceEgdEditor.asValueBox().setValue(dev.getBackend().getEgdPath()); //$NON-NLS-1$ + } }); // only for non local storage available setupHostTabAvailability(object); @@ -1104,6 +1190,13 @@ }); updateUsbNativeMessageVisibility(object); + + object.getIsRngEnabled().getPropertyChangedEvent().addListener(new IEventListener() { + @Override + public void eventRaised(Event ev, Object sender, EventArgs args) { + rngPanel.setVisible((Boolean) object.getIsRngEnabled().getEntity()); + } + }); } /** @@ -1169,6 +1262,12 @@ } else { customPropertiesTab.markAsInvalid(null); } + } else if ("IsRngTabValid".equals(propName)) { //$NON-NLS-1$ + if (vm.isRngTabValid()) { + rngDeviceTab.markAsValid(); + } else { + rngDeviceTab.markAsInvalid(null); + } } else if ("IsDisksAvailable".equals(propName)) { //$NON-NLS-1$ boolean isDisksAvailable = vm.getIsDisksAvailable(); @@ -1188,6 +1287,7 @@ generalWarningMessage.setText(""); //$NON-NLS-1$ } } + } }); @@ -1211,6 +1311,30 @@ } }); + rngRandomRandom.addValueChangeHandler(new ValueChangeHandler<Boolean>() { + @Override + public void onValueChange(ValueChangeEvent<Boolean> booleanValueChangeEvent) { + VmRngDevice dev = (VmRngDevice) vm.getRngDevice().getEntity(); + dev.getBackend().setModel(VmRngDevice.Backend.Model.DEV_RANDOM); + } + }); + + rngRandomHwrng.addValueChangeHandler(new ValueChangeHandler<Boolean>() { + @Override + public void onValueChange(ValueChangeEvent<Boolean> booleanValueChangeEvent) { + VmRngDevice dev = (VmRngDevice) vm.getRngDevice().getEntity(); + dev.getBackend().setModel(VmRngDevice.Backend.Model.DEV_HWNNG); + } + }); + + rngEgd.addValueChangeHandler(new ValueChangeHandler<Boolean>() { + @Override + public void onValueChange(ValueChangeEvent<Boolean> booleanValueChangeEvent) { + VmRngDevice dev = (VmRngDevice) vm.getRngDevice().getEntity(); + dev.getBackend().setModel(VmRngDevice.Backend.Model.EGD); + } + }); + // TODO: This is a hack and should be handled cleanly via model property availability isAutoAssignEditor.addDomHandler(new ClickHandler() { @Override @@ -1227,6 +1351,40 @@ specificHost.setValue(true, true); } }); + + rngPeriodEditor.asValueBox().addValueChangeHandler( + new ValueChangeHandler<Object>() { + @Override + public void onValueChange(ValueChangeEvent<Object> objectValueChangeEvent) { + VmRngDevice dev = (VmRngDevice) vm.getRngDevice().getEntity(); + String strValue = (String) objectValueChangeEvent.getValue(); + dev.getRate().setPeriod(strValue == null ? null : Integer.parseInt(strValue)); + } + } + ); + + rngBytesEditor.asValueBox().addValueChangeHandler( + new ValueChangeHandler<Object>() { + @Override + public void onValueChange(ValueChangeEvent<Object> objectValueChangeEvent) { + VmRngDevice dev = (VmRngDevice) vm.getRngDevice().getEntity(); + String strValue = (String) objectValueChangeEvent.getValue(); + dev.getRate().setBytes(strValue == null ? null : Integer.parseInt(strValue)); + } + } + ); + + rngSourceEgdEditor.asValueBox().addValueChangeHandler( + new ValueChangeHandler<Object>() { + @Override + public void onValueChange(ValueChangeEvent<Object> objectValueChangeEvent) { + VmRngDevice dev = (VmRngDevice) vm.getRngDevice().getEntity(); + if (dev.getBackend().getModel() == VmRngDevice.Backend.Model.EGD) { + dev.getBackend().setEgdPath((String) objectValueChangeEvent.getValue()); + } + } + } + ); } private void updateDisksWarningByImageStatus(List<DiskModel> disks, ImageStatus imageStatus) { @@ -1334,6 +1492,14 @@ isSoundcardEnabledEditor.setTabIndex(nextTabIndex++); isConsoleDeviceEnabledEditor.setTabIndex(nextTabIndex++); + // ==Rng Tab== + isRngEnabledEditor.setTabIndex(nextTabIndex++); + rngPeriodEditor.setTabIndex(nextTabIndex++); + rngBytesEditor.setTabIndex(nextTabIndex++); + rngRandomRandom.setTabIndex(nextTabIndex++); + rngRandomHwrng.setTabIndex(nextTabIndex++); + rngSourceEgdEditor.setTabIndex(nextTabIndex++); + // ==Host Tab== nextTabIndex = hostTab.setTabIndexes(nextTabIndex); isAutoAssignEditor.setTabIndex(nextTabIndex++); @@ -1384,6 +1550,7 @@ putAll(consoleTabWidgets(), simpleField().visibleInAdvancedModeOnly()). update(consoleTab, simpleField()). update(numOfMonitorsEditor, simpleField()). + update(rngPeriodEditor, simpleField()). update(isSingleQxlEnabledEditor, simpleField()). putOne(isSoundcardEnabledEditor, simpleField().visibleInAdvancedModeOnly()). putOne(isConsoleDeviceEnabledEditor, simpleField().visibleInAdvancedModeOnly()); @@ -1420,6 +1587,7 @@ resourceAllocationTab, bootOptionsTab, customPropertiesTab, + rngDeviceTab, highAvailabilityTab, poolTab, systemTab); 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 9d2bfeb..760a903 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 @@ -535,6 +535,35 @@ </t:content> </t:DialogTab> </t:tab> + <t:tab> + <t:DialogTab ui:field="rngDeviceTab"> + <t:content> + <g:FlowPanel> + <e:EntityModelCheckBoxEditor ui:field="isRngEnabledEditor" addStyleNames="{style.checkbox}" /> + <g:FlowPanel ui:field="rngPanel"> + <e:EntityModelTextBoxEditor ui:field="rngPeriodEditor"/> + <e:EntityModelTextBoxEditor ui:field="rngBytesEditor" /> + + <g:Label ui:field="rngBackendLabel" text="{constants.deviceBackend}" addStyleNames="{style.sectionLabel}" /> + <g:HorizontalPanel verticalAlignment='ALIGN_MIDDLE'> + <g:RadioButton ui:field="rngRandomRandom" addStyleNames="{style.radioButton}"/> + <g:Label text="{constants.rngSourceRandom}" /> + </g:HorizontalPanel> + <g:HorizontalPanel verticalAlignment='ALIGN_MIDDLE'> + <g:RadioButton ui:field="rngRandomHwrng" addStyleNames="{style.radioButton}"/> + <g:Label text="{constants.rngSourceHwrng}" /> + </g:HorizontalPanel> + <g:HorizontalPanel verticalAlignment='ALIGN_MIDDLE'> + <g:RadioButton ui:field="rngEgd" addStyleNames="{style.radioButton}"/> + <g:Label text="{constants.rngEgd}" /> + </g:HorizontalPanel> + <e:EntityModelTextBoxEditor ui:field="rngSourceEgdEditor" /> + </g:FlowPanel> + </g:FlowPanel> + </t:content> + </t:DialogTab> + </t:tab> + <t:tab> <t:DialogTab ui:field="customPropertiesTab"> <t:content> diff --git a/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml b/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml index ade328e..f217f1e 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml +++ b/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml @@ -158,6 +158,7 @@ <include name="common/businessentities/VmWatchdog.java" /> <include name="common/businessentities/VmWatchdogAction.java" /> <include name="common/businessentities/VmWatchdogType.java" /> + <include name="common/businessentities/VmRngDevice.java" /> <include name="common/job/*.java" /> <!-- Quota --> 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 4ea27327..50df72e 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 @@ -17,6 +17,7 @@ import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.UsbPolicy; import org.ovirt.engine.core.common.businessentities.VDS; +import org.ovirt.engine.core.common.businessentities.VmRngDevice; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.businessentities.VmTemplateStatus; import org.ovirt.engine.core.common.businessentities.VmType; @@ -496,6 +497,7 @@ UpdateVmTemplateParameters parameters = new UpdateVmTemplateParameters(template); parameters.setConsoleEnabled((Boolean) model.getIsConsoleDeviceEnabled().getEntity()); setVmWatchdogToParams(model, parameters); + setVmRngDeviceToParams(model, parameters); parameters.setSoundDeviceEnabled((Boolean) model.getIsSoundcardEnabled().getEntity()); Frontend.RunAction(VdcActionType.UpdateVmTemplate, parameters, @@ -523,6 +525,10 @@ } } + private void setVmRngDeviceToParams(UnitVmModel model, UpdateVmTemplateParameters parameters) { + parameters.setUpdateRngDevice(true); + parameters.setRngDevice((VmRngDevice) model.getRngDevice().getEntity()); + } public void postUpdateVmTemplate(VdcReturnValueBase returnValue) { diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/ExistingVmModelBehavior.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/ExistingVmModelBehavior.java index 2429b68..e5ad485 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/ExistingVmModelBehavior.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/ExistingVmModelBehavior.java @@ -9,6 +9,7 @@ import org.ovirt.engine.core.common.businessentities.StoragePool; import org.ovirt.engine.core.common.businessentities.VDSGroup; import org.ovirt.engine.core.common.businessentities.VM; +import org.ovirt.engine.core.common.businessentities.VmRngDevice; import org.ovirt.engine.core.common.businessentities.VmWatchdog; import org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface; import org.ovirt.engine.core.common.queries.IdQueryParameters; @@ -160,7 +161,6 @@ getModel().getIsSmartcardEnabled().setEntity(vm.isSmartcardEnabled()); getModel().getIsDeleteProtected().setEntity(vm.isDeleteProtected()); - getModel().getNumOfSockets().setSelectedItem(vm.getNumOfSockets()); getModel().getNumOfSockets().setIsChangable(!vm.isRunning()); @@ -195,6 +195,21 @@ } } })); + Frontend.RunQuery(VdcQueryType.GetRngDevice, new IdQueryParameters(getVm().getId()), new AsyncQuery(this, + new INewAsyncCallback() { + @Override + public void onSuccess(Object model, Object returnValue) { + @SuppressWarnings("unchecked") + List<VmRngDevice> devs = + (List<VmRngDevice>) ((VdcQueryReturnValue) returnValue).getReturnValue(); + if (devs.isEmpty()) { + getModel().getIsRngEnabled().setEntity(false); + } else { + VmRngDevice dev = devs.get(0); + getModel().getRngDevice().setEntity(dev); + } + } + })); updateConsoleDevice(getVm().getId()); 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 2edf060..4006bcc 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 @@ -7,6 +7,7 @@ import org.ovirt.engine.core.common.businessentities.StoragePool; import org.ovirt.engine.core.common.businessentities.StoragePoolStatus; import org.ovirt.engine.core.common.businessentities.VDSGroup; +import org.ovirt.engine.core.common.businessentities.VmRngDevice; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.businessentities.VmType; import org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface; @@ -145,6 +146,7 @@ getModel().getCopyPermissions().setIsAvailable(true); initDisks(); initSoundCard(template.getId()); + setRngDevice(template.getId()); } else { @@ -172,6 +174,24 @@ } } + private void setRngDevice(Guid templateId) { + Frontend.RunQuery(VdcQueryType.GetRngDevice, new IdQueryParameters(templateId), new AsyncQuery(this, + new INewAsyncCallback() { + @Override + public void onSuccess(Object model, Object returnValue) { + @SuppressWarnings("unchecked") + List<VmRngDevice> devs = + (List<VmRngDevice>) ((VdcQueryReturnValue) returnValue).getReturnValue(); + if (devs.isEmpty()) { + getModel().getIsRngEnabled().setEntity(false); + } else { + VmRngDevice dev = devs.get(0); + getModel().getRngDevice().setEntity(dev); + } + } + })); + } + @Override public void postDataCenterWithClusterSelectedItemChanged() { diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/TemplateVmModelBehavior.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/TemplateVmModelBehavior.java index 2c49da7..685664d 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/TemplateVmModelBehavior.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/TemplateVmModelBehavior.java @@ -4,14 +4,19 @@ import java.util.Arrays; import java.util.Collection; +import java.util.List; import org.ovirt.engine.core.common.businessentities.DisplayType; import org.ovirt.engine.core.common.businessentities.StoragePool; import org.ovirt.engine.core.common.businessentities.VDSGroup; +import org.ovirt.engine.core.common.businessentities.VmRngDevice; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.businessentities.VmWatchdog; +import org.ovirt.engine.core.common.queries.IdQueryParameters; 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.dataprovider.AsyncDataProvider; import org.ovirt.engine.ui.uicommonweb.models.EntityModel; @@ -96,6 +101,23 @@ } } }), template.getId()); + + Frontend.RunQuery(VdcQueryType.GetRngDevice, new IdQueryParameters(template.getId()), new AsyncQuery(this, + new INewAsyncCallback() { + @Override + public void onSuccess(Object model, Object returnValue) { + @SuppressWarnings("unchecked") + List<VmRngDevice> devs = + (List<VmRngDevice>) ((VdcQueryReturnValue) returnValue).getReturnValue(); + if (devs.isEmpty()) { + getModel().getIsRngEnabled().setEntity(false); + } else { + VmRngDevice dev = devs.get(0); + getModel().getRngDevice().setEntity(dev); + } + } + })); + getModel().getMigrationMode().setSelectedItem(template.getMigrationSupport()); } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UnitVmModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UnitVmModel.java index 16d18b6..eff6d67 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UnitVmModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UnitVmModel.java @@ -6,7 +6,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; - import org.ovirt.engine.core.common.businessentities.BootSequence; import org.ovirt.engine.core.common.businessentities.DisplayType; import org.ovirt.engine.core.common.businessentities.MigrationSupport; @@ -16,6 +15,7 @@ import org.ovirt.engine.core.common.businessentities.UsbPolicy; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSGroup; +import org.ovirt.engine.core.common.businessentities.VmRngDevice; import org.ovirt.engine.core.common.businessentities.VmType; import org.ovirt.engine.core.common.businessentities.VmWatchdogAction; import org.ovirt.engine.core.common.businessentities.VmWatchdogType; @@ -395,6 +395,39 @@ } } + private boolean isRngTabValid; + + public boolean isRngTabValid() { + return isRngTabValid; + } + + public void setRngTabValid(boolean rngTabValid) { + isRngTabValid = rngTabValid; + onPropertyChanged(new PropertyChangedEventArgs("IsRngTabValid")); //$NON-NLS-1$ + } + + private boolean rngRateValid; + + public boolean isRngRateValid() { + return rngRateValid; + } + + public void setRngRateValid(boolean rngRateValid) { + this.rngRateValid = rngRateValid; + onPropertyChanged(new PropertyChangedEventArgs("RngRateValid")); //$NON-NLS-1$ + } + + private boolean rngEgdPathValid; + + public boolean isRngEgdPathValid() { + return rngEgdPathValid; + } + + public void setRngEgdPathValid(boolean rngEgdPathValid) { + this.rngEgdPathValid = rngEgdPathValid; + onPropertyChanged(new PropertyChangedEventArgs("RngEgdPathValid")); //$NON-NLS-1$ + } + private NotChangableForVmInPoolListModel privateStorageDomain; public ListModel getStorageDomain() @@ -647,6 +680,26 @@ } private NotChangableForVmInPoolEntityModel isConsoleDeviceEnabled; + + private NotChangableForVmInPoolEntityModel rngDevice; + + public EntityModel getRngDevice() { + return rngDevice; + } + + public void setRngDevice(NotChangableForVmInPoolEntityModel rngDevice) { + this.rngDevice = rngDevice; + } + + private NotChangableForVmInPoolEntityModel isRngEnabled; + + public EntityModel getIsRngEnabled() { + return isRngEnabled; + } + + public void setIsRngEnabled(NotChangableForVmInPoolEntityModel rngEnabled) { + isRngEnabled = rngEnabled; + } public EntityModel getIsConsoleDeviceEnabled() { return isConsoleDeviceEnabled; @@ -1151,6 +1204,12 @@ setIsSmartcardEnabled(new NotChangableForVmInPoolEntityModel()); setIsDeleteProtected(new NotChangableForVmInPoolEntityModel()); setConsoleDeviceEnabled(new NotChangableForVmInPoolEntityModel()); + + //rng + setIsRngEnabled(new NotChangableForVmInPoolEntityModel()); + getIsRngEnabled().getEntityChangedEvent().addListener(this); + setRngDevice(new NotChangableForVmInPoolEntityModel()); + setCopyPermissions(new NotChangableForVmInPoolEntityModel()); // by default not available - only for new VM getCopyPermissions().setIsAvailable(false); @@ -1259,6 +1318,9 @@ setIsHostTabValid(true); setIsCustomPropertiesTabAvailable(true); + setRngTabValid(true); + setRngEgdPathValid(true); + setRngRateValid(true); setIsCustomPropertiesTabValid(getIsHostTabValid()); setIsBootSequenceTabValid(getIsCustomPropertiesTabValid()); setIsAllocationTabValid(getIsBootSequenceTabValid()); @@ -1334,6 +1396,9 @@ getIsAutoAssign().setEntity(true); getIsTemplatePublic().setEntity(true); getIsSingleQxlEnabled().setEntity(false); + + isRngEnabled.setEntity(true); + rngDevice.setEntity(VmRngDevice.getInitVmDevice()); getHostCpu().setEntity(false); getMigrationMode().setIsChangable(true); @@ -2177,6 +2242,8 @@ && getCpuSharesAmount().getIsValid()); setIsBootSequenceTabValid(getCdImage().getIsValid() && getKernel_path().getIsValid()); setIsCustomPropertiesTabValid(customPropertySheetValid); + validateRngDevice(); + setRngTabValid(isRngRateValid() && isRngEgdPathValid()); return getName().getIsValid() && getDescription().getIsValid() && getDataCenterWithClustersList().getIsValid() && getDisksAllocationModel().getIsValid() && getTemplate().getIsValid() && getComment().getIsValid() @@ -2188,8 +2255,15 @@ && getKernel_parameters().getIsValid() && getCpuSharesAmount().getIsValid() && behavior.validate() - && customPropertySheetValid && getQuota().getIsValid(); + && customPropertySheetValid && getQuota().getIsValid() && isRngEgdPathValid() && isRngRateValid(); + } + private void validateRngDevice() { + VmRngDevice dev = (VmRngDevice) getRngDevice().getEntity(); + boolean rngRateInvalid = dev.getRate().getBytes() == null && dev.getRate().getPeriod() != null; + setRngRateValid(!rngRateInvalid); + boolean rngEgdPathInvalid = dev.getBackend().getModel() == VmRngDevice.Backend.Model.EGD && StringHelper.isNullOrEmpty(dev.getBackend().getEgdPath()); + setRngEgdPathValid(!rngEgdPathInvalid); } class TotalCpuCoresComposableValidation implements IValidation { 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 c9f19b8..b4dd190 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 @@ -6,7 +6,6 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; - import org.ovirt.engine.core.common.VdcActionUtils; import org.ovirt.engine.core.common.action.AddVmFromScratchParameters; import org.ovirt.engine.core.common.action.AddVmFromTemplateParameters; @@ -38,6 +37,7 @@ import org.ovirt.engine.core.common.businessentities.UsbPolicy; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VM; +import org.ovirt.engine.core.common.businessentities.VmRngDevice; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.businessentities.VmType; import org.ovirt.engine.core.common.businessentities.VmWatchdog; @@ -2040,6 +2040,7 @@ parameters.setBalloonEnabled(balloonEnabled(model)); setVmWatchdogToParams(model, parameters); + setRngDeviceToParams(model, parameters); Frontend.RunAction(VdcActionType.AddVmFromScratch, parameters, new NetworkCreateFrontendAsyncCallback(model, addVmFromScratchNetworkManager), this); } @@ -2096,6 +2097,7 @@ parameters.add(params); params.setSoundDeviceEnabled((Boolean) model.getIsSoundcardEnabled().getEntity()); setVmWatchdogToParams(model, params); + setRngDeviceToParams(model, params); Frontend.RunAction(VdcActionType.AddVm, params, new NetworkCreateOrUpdateFrontendActionAsyncCallback(model, defaultNetworkCreatingManager), this); } @@ -2133,6 +2135,7 @@ VmManagementParametersBase updateVmParams = new VmManagementParametersBase(vmListModel.getcurrentVm()); setVmWatchdogToParams(model, updateVmParams); + setRngDeviceToParams(model, updateVmParams); updateVmParams.setSoundDeviceEnabled((Boolean) model.getIsSoundcardEnabled() .getEntity()); updateVmParams.setBalloonEnabled(balloonEnabled(model)); @@ -2160,6 +2163,7 @@ VmManagementParametersBase updateVmParams = new VmManagementParametersBase(getcurrentVm()); setVmWatchdogToParams(model, updateVmParams); + setRngDeviceToParams(model, updateVmParams); updateVmParams.setSoundDeviceEnabled((Boolean) model.getIsSoundcardEnabled().getEntity()); updateVmParams.setConsoleEnabled((Boolean) model.getIsConsoleDeviceEnabled().getEntity()); updateVmParams.setBalloonEnabled(balloonEnabled(model)); @@ -2186,6 +2190,11 @@ } } + private void setRngDeviceToParams(UnitVmModel model, VmManagementParametersBase parameters) { + parameters.setUpdateRngDevice(true); + parameters.setRngDevice((VmRngDevice) model.getRngDevice().getEntity()); + } + private void retrieveIsoImages() { Object tempVar = getSelectedItem(); diff --git a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java index 1612ebd..33054e9 100644 --- a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java +++ b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java @@ -2070,5 +2070,11 @@ @DefaultStringValue("[Unlimited]") String unlimitedQoSTitle(); + + @DefaultStringValue("If period is specified, bytes must be specified as well.") + String rngRateInvalid(); + + @DefaultStringValue("EGD path must be provided if EGD backend is selected.") + String rngEgdInvalid(); } -- To view, visit http://gerrit.ovirt.org/18497 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Iffbc48062f25d90795bc360362f42cd1042fb888 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Frank Kobzik <fkob...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches