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

Reply via email to