Gilad Chaplik has posted comments on this change. Change subject: webadmin: adding Affinity Groups views ......................................................................
Patch Set 8: Verified+1 (48 comments) THANKS Lior! I really appreciate your comprehensive review :-) this patch is now depending on a patch that allows to extend KeyValueModel. .................................................... File frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/configure/scheduling/affinity_groups/VmSelectionModel.java Line 5: import org.ovirt.engine.ui.uicommonweb.models.ListModel; Line 6: import org.ovirt.engine.ui.uicommonweb.models.Model; Line 7: Line 8: public class VmSelectionModel extends Model { Line 9: ListModel<Pair<String, VM>> vms; Sure.. but I'd like to do the entire re-factoring of the keyValueModel in a later patch, as part of this patchset, including this one (although not that related). Line 10: Line 11: public VmSelectionModel() { Line 12: setVms(new ListModel<Pair<String, VM>>()); Line 13: } Line 15: public ListModel<Pair<String, VM>> getVms() { Line 16: return vms; Line 17: } Line 18: Line 19: public void setVms(ListModel<Pair<String, VM>> vms) { Done Line 20: this.vms = vms; Line 21: } .................................................... File frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/configure/scheduling/affinity_groups/VmsSelectionModel.java Line 13: import org.ovirt.engine.ui.uicompat.Event; Line 14: import org.ovirt.engine.ui.uicompat.EventArgs; Line 15: import org.ovirt.engine.ui.uicompat.IEventListener; Line 16: Line 17: public class VmsSelectionModel extends ListModel<VmSelectionModel> { agree, as mentioned already, if that is okay by you I will do it in the next patch, and maybe squash it later on. Line 18: Line 19: public final static Pair<String, VM> SELECT_KEY = new Pair<String, VM>("select a VM", null); //$NON-NLS-1$ Line 20: public final static Pair<String, VM> NO_KEYS = new Pair<String, VM>("no available vms", null); //$NON-NLS-1$ //ConstantsManager.getInstance().getConstants().noKeyAvailable(); Line 21: Line 15: import org.ovirt.engine.ui.uicompat.IEventListener; Line 16: Line 17: public class VmsSelectionModel extends ListModel<VmSelectionModel> { Line 18: Line 19: public final static Pair<String, VM> SELECT_KEY = new Pair<String, VM>("select a VM", null); //$NON-NLS-1$ good thing you're here. Done. Line 20: public final static Pair<String, VM> NO_KEYS = new Pair<String, VM>("no available vms", null); //$NON-NLS-1$ //ConstantsManager.getInstance().getConstants().noKeyAvailable(); Line 21: Line 22: Map<Guid, VM> allVmMap; Line 23: private final Map<Guid, VM> usedVmMap = new HashMap<Guid, VM>(); Line 16: Line 17: public class VmsSelectionModel extends ListModel<VmSelectionModel> { Line 18: Line 19: public final static Pair<String, VM> SELECT_KEY = new Pair<String, VM>("select a VM", null); //$NON-NLS-1$ Line 20: public final static Pair<String, VM> NO_KEYS = new Pair<String, VM>("no available vms", null); //$NON-NLS-1$ //ConstantsManager.getInstance().getConstants().noKeyAvailable(); Done Line 21: Line 22: Map<Guid, VM> allVmMap; Line 23: private final Map<Guid, VM> usedVmMap = new HashMap<Guid, VM>(); Line 24: boolean disableEvent = false; Line 98: Line 99: public List<Pair<String, VM>> getAvailableKeys() { Line 100: Map<Guid, Pair<String, VM>> map = new HashMap<Guid, Pair<String, VM>>(); Line 101: Line 102: if (allVmMap != null) { I guess that I'll use the keyValueModel impl which is good :) you re-factored it so it has to :P (next patch) Done. Line 103: for (VM vm : allVmMap.values()) { Line 104: if (!usedVmMap.containsKey(vm.getId())) { Line 105: map.put(vm.getId(), new Pair<String, VM>(vm.getName(), vm)); Line 106: } Line 116: Line 117: return list; Line 118: } Line 119: Line 120: public void updateKeys() { same. Line 121: if (getItems() != null && usedVmMap != null) { Line 122: disableEvent = true; Line 123: usedVmMap.clear(); Line 124: for (VmSelectionModel vmSelectionModel : getItems()) { Line 146: } Line 147: return list; Line 148: } Line 149: Line 150: public boolean validate() { oops. Done Line 151: boolean isValid = true; Line 152: Line 153: return isValid; Line 154: } .................................................... File frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/configure/scheduling/affinity_groups/list/AffinityGroupListModel.java Line 25: import org.ovirt.engine.ui.uicompat.ConstantsManager; Line 26: import org.ovirt.engine.ui.uicompat.FrontendMultipleActionAsyncResult; Line 27: import org.ovirt.engine.ui.uicompat.IFrontendMultipleActionAsyncCallback; Line 28: Line 29: public abstract class AffinityGroupListModel<T extends BusinessEntity<Guid>> extends SearchableListModel<AffinityGroup> { :-) Line 30: private UICommand newCommand; Line 31: private UICommand editCommand; Line 32: private UICommand removeCommand; Line 33: Line 33: Line 34: private T parentEntity; Line 35: Line 36: public AffinityGroupListModel() { Line 37: setTitle(ConstantsManager.getInstance().getConstants().affinityGroupsTitle()); for the sake of consistency (exists anywhere), I'd rather leave it. Line 38: setHashName("affinity_groups"); // $//$NON-NLS-1$ Line 39: setAvailableInModes(ApplicationMode.VirtOnly); Line 40: Line 41: setNewCommand(new UICommand("New", this)); //$NON-NLS-1$ Line 35: Line 36: public AffinityGroupListModel() { Line 37: setTitle(ConstantsManager.getInstance().getConstants().affinityGroupsTitle()); Line 38: setHashName("affinity_groups"); // $//$NON-NLS-1$ Line 39: setAvailableInModes(ApplicationMode.VirtOnly); you're right, can be removed > Also, if it is needed, this should probably be either Virt or Both, shouldn't > it? virt_only include both (performing OR bit arithmetic), so no. Done. Line 40: Line 41: setNewCommand(new UICommand("New", this)); //$NON-NLS-1$ Line 42: setEditCommand(new UICommand("Edit", this)); //$NON-NLS-1$ Line 43: setRemoveCommand(new UICommand("Remove", this)); //$NON-NLS-1$ Line 66: getRemoveCommand().setIsExecutionAllowed(hasSelectedItems); Line 67: } Line 68: Line 69: @Override Line 70: protected void syncSearch() { Done Line 71: if (getParentEntity() != null) { Line 72: super.syncSearch(); Line 73: AsyncQuery asyncQuery = new AsyncQuery(this, new INewAsyncCallback() { Line 74: Line 76: public void onSuccess(Object model, Object returnValue) { Line 77: AffinityGroupListModel<?> affinityGroupListModel = (AffinityGroupListModel<?>) model; Line 78: ArrayList<AffinityGroup> list = Line 79: (ArrayList<AffinityGroup>) ((VdcQueryReturnValue) returnValue).getReturnValue(); Line 80: affinityGroupListModel.setItems(list); it's not Line 81: } Line 82: }); Line 83: VdcQueryParametersBase parameters = new IdQueryParameters(getParentEntity().getId()); Line 84: parameters.setRefresh(getIsQueryFirstTime()); Line 86: setIsQueryFirstTime(false); Line 87: } Line 88: } Line 89: Line 90: protected abstract VdcQueryType getQueryType(); I agree. Done. Line 91: Line 92: protected abstract ClusterResolver getClusterResolver(); Line 93: Line 94: public UICommand getNewCommand() { Line 88: } Line 89: Line 90: protected abstract VdcQueryType getQueryType(); Line 91: Line 92: protected abstract ClusterResolver getClusterResolver(); this one isn't that static, cluster is changing according to selection. will get back to it... Line 93: Line 94: public UICommand getNewCommand() { Line 95: return newCommand; Line 96: } Line 94: public UICommand getNewCommand() { Line 95: return newCommand; Line 96: } Line 97: Line 98: public void setNewCommand(UICommand newCommand) { Done. Line 99: this.newCommand = newCommand; Line 100: } Line 101: Line 102: @Override Line 129: return; Line 130: } Line 131: Line 132: AffinityGroupModel model = getNewAffinityGroupModel(); Line 133: model.init(); I need a init method :/ there is later comment about dangerous stuff I do in ctor. Line 134: setWindow(model); Line 135: } Line 136: Line 137: protected AffinityGroupModel getNewAffinityGroupModel() { Line 137: protected AffinityGroupModel getNewAffinityGroupModel() { Line 138: return new NewAffinityGroupModel(this, getClusterResolver()) { Line 139: Line 140: @Override Line 141: protected AffinityGroup getAffinityGroup() { I need it to auto add selected vm (parent) to affinity group. changed it a bit to look nicer Line 142: return new AffinityGroup(); Line 143: } Line 144: }; Line 145: } Line 151: AffinityGroup affinityGroup = getSelectedItem(); Line 152: if (affinityGroup == null) { Line 153: return; Line 154: } Line 155: sortVms(affinityGroup); removed it entirely. lets wait for the bug. Done. Line 156: AffinityGroupModel model = new EditAffinityGroupModel(affinityGroup, this, getClusterResolver()); Line 157: model.init(); Line 158: setWindow(model); Line 159: } Line 161: protected void sortVms(AffinityGroup affinityGroup) { Line 162: Line 163: } Line 164: Line 165: private void remove() { I will try to get to it. Line 166: if (getWindow() != null) { Line 167: return; Line 168: } Line 169: Line 187: command.setIsCancel(true); Line 188: model.getCommands().add(command); Line 189: } Line 190: Line 191: private void onRemove() { same. Line 192: ConfirmationModel model = (ConfirmationModel) getConfirmWindow(); Line 193: Line 194: if (model.getProgress() != null) { Line 195: return; .................................................... File frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/configure/scheduling/affinity_groups/list/ClusterResolver.java Line 4: Line 5: /** Line 6: * used to fetch cluster info for affinity groups models VM and cluster Line 7: */ Line 8: public interface ClusterResolver { we need somekind of a solution, for getting cluster params while changing parent entity. will get back to it. Line 9: Guid getClusterId(); Line 10: Line 11: String getClusterName(); .................................................... File frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/configure/scheduling/affinity_groups/list/VmAffinityGroupListModel.java Line 49: } Line 50: Line 51: @Override Line 52: protected void sortVms(AffinityGroup affinityGroup) { Line 53: Collections.sort(affinityGroup.getEntityIds(), new Comparator<Guid>() { Done. removed altogether, will get back to it later. Line 54: Line 55: @Override Line 56: public int compare(Guid o1, Guid o2) { Line 57: if (o1.equals(getParentEntity().getId())) { .................................................... File frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/configure/scheduling/affinity_groups/model/AffinityGroupModel.java Line 35: private final ClusterResolver clusterResolver; Line 36: Line 37: private EntityModel<String> name; Line 38: private EntityModel<String> description; Line 39: private ListModel<AffinityPolarity> polarity; Done Line 40: private ListModel<AffinityEnforcementType> enforcementType; Line 41: private VmsSelectionModel vmsSelectionModel; Line 42: Line 43: Line 36: Line 37: private EntityModel<String> name; Line 38: private EntityModel<String> description; Line 39: private ListModel<AffinityPolarity> polarity; Line 40: private ListModel<AffinityEnforcementType> enforcementType; Done. Line 41: private VmsSelectionModel vmsSelectionModel; Line 42: Line 43: Line 44: public AffinityGroupModel(ListModel<?> sourceListModel, ClusterResolver clusterResolver) { Line 55: setVmsSelectionModel(new VmsSelectionModel()); Line 56: startProgress(null); Line 57: Line 58: //TODO: should be by cluster id and remove clusterName method from resolver. Line 59: AsyncDataProvider.getVmListByClusterName(new AsyncQuery(this, new INewAsyncCallback() { it seems that I need a public init method. Line 60: Line 61: @Override Line 62: public void onSuccess(Object model, Object returnValue) { Line 63: ArrayList<VM> vmList = (ArrayList<VM>) returnValue; Line 70: } Line 71: Line 72: public abstract void init(); Line 73: Line 74: protected abstract AffinityGroup getAffinityGroup(); Done Line 75: Line 76: protected abstract VdcActionType getSaveActionType(); Line 77: Line 78: protected void addCommands() { Line 72: public abstract void init(); Line 73: Line 74: protected abstract AffinityGroup getAffinityGroup(); Line 75: Line 76: protected abstract VdcActionType getSaveActionType(); Done Line 77: Line 78: protected void addCommands() { Line 79: UICommand command = new UICommand("OnSave", this); //$NON-NLS-1$ Line 80: command.setTitle(ConstantsManager.getInstance().getConstants().ok()); Line 89: public EntityModel<String> getName() { Line 90: return name; Line 91: } Line 92: Line 93: public void setName(EntityModel<String> name) { Done Line 94: this.name = name; Line 95: } Line 96: Line 97: public EntityModel<String> getDescription() { Line 135: if (!validate()) { Line 136: return; Line 137: } Line 138: Line 139: if (getProgress() != null) { Done Line 140: return; Line 141: } Line 142: AffinityGroup group = getAffinityGroup(); Line 143: group.setName(getName().getEntity()); .................................................... File frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UnitVmModel.java Line 1817: updateWatchdogModels(osType); Line 1818: } Line 1819: Line 1820: private void updateWatchdogModels() { Line 1821: updateWatchdogModels(getOSType().getSelectedItem()); Done Line 1822: } Line 1823: Line 1824: private void updateWatchdogModels(Integer osType) { Line 1825: VDSGroup cluster = getSelectedCluster(); .................................................... File frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmListModel.java Line 368: } Line 369: Line 370: private ErrorPopupManager errorPopupManager; Line 371: Line 372: private VmAffinityGroupListModel affinityGroupListModel; Done Line 373: Line 374: public VmAffinityGroupListModel getAffinityGroupListModel() { Line 375: return affinityGroupListModel; Line 376: } .................................................... File frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/LocalizedEnums.java Line 883: String AffinityEnforcementType___SOFT(); Line 884: Line 885: String AffinityPolarity___POSITIVE(); Line 886: Line 887: String AffinityPolarity___NEGATIVE(); removed. .................................................... File frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java Line 2096: @DefaultStringValue("Not available when Templates are not configured.") Line 2097: String notAvailableWithNoTemplates(); Line 2098: Line 2099: @DefaultStringValue("Affinity Groups") Line 2100: String affinityGroupsTitle(); leaving for consistency reasons. Line 2101: Line 2102: @DefaultStringValue("New Affinity Group") Line 2103: String newAffinityGroupsTitle(); Line 2104: .................................................... File frontend/webadmin/modules/uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/LocalizedEnums.properties Line 439: PolicyUnitType___LoadBalancing=Load Balancing Line 440: AffinityEnforcementType___HARD=Hard Line 441: AffinityEnforcementType___SOFT=Soft Line 442: AffinityPolarity___POSITIVE=Positive Line 443: AffinityPolarity___NEGATIVE=Negative removed. .................................................... File frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java Line 3455: @DefaultStringValue("Name") Line 3456: String affinityGroupNameLabel(); Line 3457: Line 3458: @DefaultStringValue("Polarity") Line 3459: String affinityGroupPolarityLabel(); the value was changed to 'positive' Line 3460: Line 3461: @DefaultStringValue("Enforcing") Line 3462: String affinityGroupEnforceTypeLabel(); Line 3463: Line 3458: @DefaultStringValue("Polarity") Line 3459: String affinityGroupPolarityLabel(); Line 3460: Line 3461: @DefaultStringValue("Enforcing") Line 3462: String affinityGroupEnforceTypeLabel(); in general I'd rather have strings for each label. maybe in Klingon it pronounces differently :) and a good example to it, is in the previous comment: the table header is polarity and the form label is positive. Line 3463: Line 3464: @DefaultStringValue("Description") Line 3465: String affinityDescriptionLabel(); .................................................... File frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/AffinityGroupPopupView.ui.xml Line 1: <?xml version="1.0" encoding="UTF-8"?> Line 2: <!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> Line 3: <ui:UiBinder Done Line 4: xmlns:ui="urn:ui:com.google.gwt.uibinder" Line 5: xmlns:g="urn:import:com.google.gwt.user.client.ui" Line 6: xmlns:d="urn:import:org.ovirt.engine.ui.common.widget.dialog" Line 7: xmlns:e="urn:import:org.ovirt.engine.ui.common.widget.editor" Line 1: <?xml version="1.0" encoding="UTF-8"?> Line 2: <!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> Line 3: <ui:UiBinder Line 4: xmlns:ui="urn:ui:com.google.gwt.uibinder" Line 5: xmlns:g="urn:import:com.google.gwt.user.client.ui" Done Line 6: xmlns:d="urn:import:org.ovirt.engine.ui.common.widget.dialog" Line 7: xmlns:e="urn:import:org.ovirt.engine.ui.common.widget.editor" Line 8: xmlns:ge="urn:import:org.ovirt.engine.ui.common.widget.editor.generic" Line 9: xmlns:ag="urn:import:org.ovirt.engine.ui.webadmin.section.main.view.popup.scheduling.widgets"> .................................................... File frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/widgets/AddRemoveVmWidget.java Line 16: WidgetUiBinder uiBinder = GWT.create(WidgetUiBinder.class); Line 17: } Line 18: Line 19: private VmsSelectionModel model; Line 20: private final LinkedList<VmRowWidget> widgets = new LinkedList<VmRowWidget>(); going to re-factor it anyway in next patch. Line 21: private boolean enabled = true; Line 22: Line 23: AddRemoveVmWidget() { Line 24: initWidget(WidgetUiBinder.uiBinder.createAndBindUi(this)); Line 17: } Line 18: Line 19: private VmsSelectionModel model; Line 20: private final LinkedList<VmRowWidget> widgets = new LinkedList<VmRowWidget>(); Line 21: private boolean enabled = true; same Line 22: Line 23: AddRemoveVmWidget() { Line 24: initWidget(WidgetUiBinder.uiBinder.createAndBindUi(this)); Line 25: } .................................................... File frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/widgets/AddRemoveVmWidget.ui.xml Line 1: <?xml version="1.0" encoding="UTF-8"?> Line 2: <!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> Line 3: <ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" Done Line 4: xmlns:g="urn:import:com.google.gwt.user.client.ui" Line 5: xmlns:e="urn:import:org.ovirt.engine.ui.common.widget.editor"> Line 6: Line 7: <ui:style type="org.ovirt.engine.ui.common.widget.AddRemoveRowWidget.WidgetStyle"> Line 1: <?xml version="1.0" encoding="UTF-8"?> Line 2: <!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> Line 3: <ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" Line 4: xmlns:g="urn:import:com.google.gwt.user.client.ui" Line 5: xmlns:e="urn:import:org.ovirt.engine.ui.common.widget.editor"> Done Line 6: Line 7: <ui:style type="org.ovirt.engine.ui.common.widget.AddRemoveRowWidget.WidgetStyle"> Line 8: .margin { Line 9: margin-left: 20px; .................................................... File frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/widgets/VmRowWidget.java Line 22: import com.google.gwt.user.client.ui.Composite; Line 23: import com.google.gwt.user.client.ui.HasEnabled; Line 24: import com.google.gwt.user.client.ui.Widget; Line 25: Line 26: public class VmRowWidget extends Composite implements HasValueChangeHandlers<VmSelectionModel>, HasEditorDriver<VmSelectionModel>, HasEnabled { same as previous replies, going to be re-factored. Line 27: Line 28: interface WidgetUiBinder extends UiBinder<Widget, VmRowWidget> { Line 29: WidgetUiBinder uiBinder = GWT.create(WidgetUiBinder.class); Line 30: } .................................................... File frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/widgets/VmRowWidget.ui.xml Line 1: <?xml version="1.0" encoding="UTF-8"?> Line 2: <!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> Line 3: <ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" Done Line 4: xmlns:g="urn:import:com.google.gwt.user.client.ui" Line 5: xmlns:e="urn:import:org.ovirt.engine.ui.common.widget.editor"> Line 6: Line 7: <ui:with field='resources' type='org.ovirt.engine.ui.common.CommonApplicationResources' /> Line 3: <ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" Line 4: xmlns:g="urn:import:com.google.gwt.user.client.ui" Line 5: xmlns:e="urn:import:org.ovirt.engine.ui.common.widget.editor"> Line 6: Line 7: <ui:with field='resources' type='org.ovirt.engine.ui.common.CommonApplicationResources' /> Done Line 8: Line 9: <ui:style type="org.ovirt.engine.ui.webadmin.section.main.view.popup.scheduling.widgets.VmRowWidget.WidgetStyle"> Line 10: .fieldWidth { Line 11: width: 180px; .................................................... File frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/AbstractSubTabAffinityGroupsView.java Line 85: } Line 86: }); Line 87: } Line 88: Line 89: protected abstract void addMembersColumn(ApplicationConstants constants); Done Line 90: Line 91: protected String joinMembers(List<String> strings, String separator, String skipString, ApplicationConstants constants) { Line 92: if (strings == null || strings.isEmpty()) { Line 93: return constants.noMembersAffinityGroup(); Line 87: } Line 88: Line 89: protected abstract void addMembersColumn(ApplicationConstants constants); Line 90: Line 91: protected String joinMembers(List<String> strings, String separator, String skipString, ApplicationConstants constants) { backend code uses StringUtils, and it's not emulated in GWT. Line 92: if (strings == null || strings.isEmpty()) { Line 93: return constants.noMembersAffinityGroup(); Line 94: } Line 95: StringBuffer result = new StringBuffer(); -- To view, visit http://gerrit.ovirt.org/22716 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: comment Gerrit-Change-Id: Ibe5d6f6efe2b13297b653e1622a26c7b2b44cba8 Gerrit-PatchSet: 8 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Gilad Chaplik <gchap...@redhat.com> Gerrit-Reviewer: Gilad Chaplik <gchap...@redhat.com> Gerrit-Reviewer: Lior Vernia <lver...@redhat.com> Gerrit-Reviewer: oVirt Jenkins CI Server Gerrit-HasComments: Yes _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches