Eli Mesika has uploaded a new change for review. Change subject: webadmin: Support Multi-Tier fencing in GUI ......................................................................
webadmin: Support Multi-Tier fencing in GUI Change-Id: Iaf35465afa353637737f90d6c825d8c1ce2ad1c9 Signed-off-by: Eli Mesika <emes...@redhat.com> --- M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/clusters/ClusterGuideModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/datacenters/DataCenterGuideModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostListModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostModel.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostPopupView.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostPopupView.ui.xml 7 files changed, 569 insertions(+), 218 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/35/10335/1 diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/clusters/ClusterGuideModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/clusters/ClusterGuideModel.java index 4de443f..56d0045 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/clusters/ClusterGuideModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/clusters/ClusterGuideModel.java @@ -438,16 +438,29 @@ VDS host = new VDS(); host.setvds_name((String) model.getName().getEntity()); host.sethost_name((String) model.getHost().getEntity()); - host.setManagmentIp((String) model.getManagementIp().getEntity()); host.setport((Integer) model.getPort().getEntity()); host.setvds_group_id(((VDSGroup) model.getCluster().getSelectedItem()).getId()); - host.setpm_enabled((Boolean) model.getIsPm().getEntity()); - host.setpm_user((Boolean) model.getIsPm().getEntity() ? (String) model.getPmUserName().getEntity() : null); - host.setpm_password((Boolean) model.getIsPm().getEntity() ? (String) model.getPmPassword().getEntity() : null); - host.setpm_type((Boolean) model.getIsPm().getEntity() ? (String) model.getPmType().getSelectedItem() : null); - host.setPmOptionsMap(new ValueObjectMap(model.getPmOptionsMap(), false)); host.setVdsSpmPriority(model.getSpmPriorityValue()); + // Save primary PM parameters. + host.setManagmentIp((String) model.getManagementIp().getEntity()); + host.setpm_user((String) model.getPmUserName().getEntity()); + host.setpm_password((String) model.getPmPassword().getEntity()); + host.setpm_type((String) model.getPmType().getSelectedItem()); + host.setPmOptionsMap(new ValueObjectMap(model.getPmOptionsMap(), false)); + + // Save secondary PM parameters. + host.setPmSecondaryIp((String) model.getPmSecondaryIp().getEntity()); + host.setPmSecondaryUser((String) model.getPmSecondaryUserName().getEntity()); + host.setPmSecondaryPassword((String) model.getPmSecondaryPassword().getEntity()); + host.setPmSecondaryType((String) model.getPmSecondaryType().getSelectedItem()); + host.setPmSecondaryOptionsMap(new ValueObjectMap(model.getPmSecondaryOptionsMap(), false)); + + // Save other PM parameters. + host.setpm_enabled((Boolean) model.getIsPm().getEntity()); + host.setPmSecondaryConcurrent((Boolean) model.getPmSecondaryConcurrent().getEntity()); + + AddVdsActionParameters vdsActionParams = new AddVdsActionParameters(); vdsActionParams.setvds(host); vdsActionParams.setVdsId(host.getId()); diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/datacenters/DataCenterGuideModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/datacenters/DataCenterGuideModel.java index de0063d..9622d9e 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/datacenters/DataCenterGuideModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/datacenters/DataCenterGuideModel.java @@ -1614,16 +1614,29 @@ VDS host = new VDS(); host.setvds_name((String) model.getName().getEntity()); host.sethost_name((String) model.getHost().getEntity()); - host.setManagmentIp((String) model.getManagementIp().getEntity()); host.setport(Integer.parseInt(model.getPort().getEntity().toString())); host.setvds_group_id(((VDSGroup) model.getCluster().getSelectedItem()).getId()); - host.setpm_enabled((Boolean) model.getIsPm().getEntity()); - host.setpm_user((Boolean) model.getIsPm().getEntity() ? (String) model.getPmUserName().getEntity() : null); - host.setpm_password((Boolean) model.getIsPm().getEntity() ? (String) model.getPmPassword().getEntity() : null); - host.setpm_type((Boolean) model.getIsPm().getEntity() ? (String) model.getPmType().getSelectedItem() : null); - host.setPmOptionsMap(new ValueObjectMap(model.getPmOptionsMap(), false)); host.setVdsSpmPriority(model.getSpmPriorityValue()); + // Save primary PM parameters. + host.setManagmentIp((String) model.getManagementIp().getEntity()); + host.setpm_user((String) model.getPmUserName().getEntity()); + host.setpm_password((String) model.getPmPassword().getEntity()); + host.setpm_type((String) model.getPmType().getSelectedItem()); + host.setPmOptionsMap(new ValueObjectMap(model.getPmOptionsMap(), false)); + + // Save secondary PM parameters. + host.setPmSecondaryIp((String) model.getPmSecondaryIp().getEntity()); + host.setPmSecondaryUser((String) model.getPmSecondaryUserName().getEntity()); + host.setPmSecondaryPassword((String) model.getPmSecondaryPassword().getEntity()); + host.setPmSecondaryType((String) model.getPmSecondaryType().getSelectedItem()); + host.setPmSecondaryOptionsMap(new ValueObjectMap(model.getPmSecondaryOptionsMap(), false)); + + // Save other PM parameters. + host.setpm_enabled((Boolean) model.getIsPm().getEntity()); + host.setPmSecondaryConcurrent((Boolean) model.getPmSecondaryConcurrent().getEntity()); + + AddVdsActionParameters addVdsParams = new AddVdsActionParameters(); addVdsParams.setVdsId(host.getId()); addVdsParams.setvds(host); diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostListModel.java index a238d0f..8ac68dc 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostListModel.java @@ -527,7 +527,6 @@ hostModel.setTitle(ConstantsManager.getInstance().getConstants().newHostTitle()); hostModel.setHashName("new_host"); //$NON-NLS-1$ hostModel.getPort().setEntity(54321); - hostModel.getPmType().setSelectedItem(null); hostModel.getOverrideIpTables().setIsAvailable(false); hostModel.setSpmPriorityValue(null); @@ -769,18 +768,31 @@ // Save changes. host.setvds_name((String) model.getName().getEntity()); host.sethost_name((String) model.getHost().getEntity()); - host.setManagmentIp((String) model.getManagementIp().getEntity()); host.setport(Integer.parseInt(model.getPort().getEntity().toString())); + host.setVdsSpmPriority(model.getSpmPriorityValue()); Guid oldClusterId = host.getvds_group_id(); Guid newClusterId = ((VDSGroup) model.getCluster().getSelectedItem()).getId(); host.setvds_group_id(newClusterId); - host.setpm_enabled((Boolean) model.getIsPm().getEntity()); + + // Save primary PM parameters. + host.setManagmentIp((String) model.getManagementIp().getEntity()); host.setpm_user((String) model.getPmUserName().getEntity()); host.setpm_password((String) model.getPmPassword().getEntity()); host.setpm_type((String) model.getPmType().getSelectedItem()); host.setPmOptionsMap(new ValueObjectMap(model.getPmOptionsMap(), false)); - host.setVdsSpmPriority(model.getSpmPriorityValue()); + + // Save secondary PM parameters. + host.setPmSecondaryIp((String) model.getPmSecondaryIp().getEntity()); + host.setPmSecondaryUser((String) model.getPmSecondaryUserName().getEntity()); + host.setPmSecondaryPassword((String) model.getPmSecondaryPassword().getEntity()); + host.setPmSecondaryType((String) model.getPmSecondaryType().getSelectedItem()); + host.setPmSecondaryOptionsMap(new ValueObjectMap(model.getPmSecondaryOptionsMap(), false)); + + // Save other PM parameters. + host.setpm_enabled((Boolean) model.getIsPm().getEntity()); + host.setPmSecondaryConcurrent((Boolean) model.getPmSecondaryConcurrent().getEntity()); + CancelConfirm(); model.StartProgress(null); @@ -1105,13 +1117,27 @@ model.getName().setEntity(vds.getvds_name()); model.getHost().setEntity(vds.gethost_name()); model.getPort().setEntity(vds.getport()); - model.setPmOptionsMap((HashMap)VdsStatic.PmOptionsStringToMap(vds.getpm_options()).asMap()); if (vds.getstatus() != VDSStatus.InstallFailed) { model.getHost().setIsChangable(false); } + // Set primary PM parameters. + model.getManagementIp().setEntity(vds.getManagmentIp()); + model.getPmUserName().setEntity(vds.getpm_user()); + model.getPmPassword().setEntity(vds.getpm_password()); + model.getPmType().setSelectedItem(vds.getpm_type()); + model.setPmOptionsMap(VdsStatic.PmOptionsStringToMap(vds.getpm_options()).asMap()); + + // Set secondary PM parameters. + model.getPmSecondaryIp().setEntity(vds.getPmSecondaryIp()); + model.getPmSecondaryUserName().setEntity(vds.getPmSecondaryuser()); + model.getPmSecondaryPassword().setEntity(vds.getPmSecondaryPassword()); + model.getPmSecondaryType().setSelectedItem(vds.getPmSecondaryType()); + model.setPmSecondaryOptionsMap(vds.getPmSecondaryOptionsMap().asMap()); + + // Set other PM parameters. if (isEditWithPMemphasis) { model.setIsPowerManagementTabSelected(true); model.getIsPm().setEntity(true); @@ -1119,10 +1145,9 @@ } else { model.getIsPm().setEntity(vds.getpm_enabled()); } - model.getManagementIp().setEntity(vds.getManagmentIp()); - model.getPmType().setSelectedItem(vds.getpm_type()); - model.getPmUserName().setEntity(vds.getpm_user()); - model.getPmPassword().setEntity(vds.getpm_password()); + + model.getPmSecondaryConcurrent().setEntity(vds.isPmSecondaryConcurrent()); + if (dataCenters != null) { diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostModel.java index 78b42c7..986841c 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostModel.java @@ -14,6 +14,7 @@ import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Event; import org.ovirt.engine.core.compat.EventArgs; +import org.ovirt.engine.core.compat.IEventListener; import org.ovirt.engine.core.compat.NGuid; import org.ovirt.engine.core.compat.PropertyChangedEventArgs; import org.ovirt.engine.core.compat.StringFormat; @@ -285,6 +286,116 @@ privatePmOptions = value; } + private EntityModel pmSecondaryIp; + + public EntityModel getPmSecondaryIp() { + return pmSecondaryIp; + } + + private void setPmSecondaryIp(EntityModel value) { + pmSecondaryIp = value; + } + + private EntityModel pmSecondaryPort; + + public EntityModel getPmSecondaryPort() { + return pmSecondaryPort; + } + + public void setPmSecondaryPort(EntityModel value) { + pmSecondaryPort = value; + } + + private EntityModel pmSecondaryUserName; + + public EntityModel getPmSecondaryUserName() { + return pmSecondaryUserName; + } + + private void setPmSecondaryUserName(EntityModel value) { + pmSecondaryUserName = value; + } + + private EntityModel pmSecondaryPassword; + + public EntityModel getPmSecondaryPassword() { + return pmSecondaryPassword; + } + + private void setPmSecondaryPassword(EntityModel value) { + pmSecondaryPassword = value; + } + + private ListModel pmSecondaryType; + + public ListModel getPmSecondaryType() { + return pmSecondaryType; + } + + private void setPmSecondaryType(ListModel value) { + pmSecondaryType = value; + } + + private EntityModel pmSecondaryOptions; + + public EntityModel getPmSecondaryOptions() { + return pmSecondaryOptions; + } + + private void setPmSecondaryOptions(EntityModel value) { + pmSecondaryOptions = value; + } + + private EntityModel pmSecondarySecure; + + public EntityModel getPmSecondarySecure() { + return pmSecondarySecure; + } + + private void setPmSecondarySecure(EntityModel value) { + pmSecondarySecure = value; + } + + public Map<String, String> getPmSecondaryOptionsMap() { + return getPmOptionsMapInternal(getPmSecondaryPort(), getPmSecondarySlot(), getPmSecondarySecure(), getPmSecondaryOptions()); + } + + public void setPmSecondaryOptionsMap(Map<String, String> value) { + setPmOptionsMapInternal(value, getPmSecondaryPort(), getPmSecondarySlot(), getPmSecondarySecure(), getPmSecondaryOptions()); + } + + private EntityModel pmSecondarySlot; + + public EntityModel getPmSecondarySlot() { + return pmSecondarySlot; + } + + private void setPmSecondarySlot(EntityModel value) { + pmSecondarySlot = value; + } + + + private EntityModel pmSecondaryConcurrent; + + public EntityModel getPmSecondaryConcurrent() { + return pmSecondaryConcurrent; + } + + private void setPmSecondaryConcurrent(EntityModel value) { + pmSecondaryConcurrent = value; + } + + private ListModel pmVariants; + + public ListModel getPmVariants() { + return pmVariants; + } + + private void setPmVariants(ListModel value) { + pmVariants = value; + } + + private boolean isGeneralTabValid; public boolean getIsGeneralTabValid() @@ -333,88 +444,12 @@ } } - public HashMap<String, String> getPmOptionsMap() - { - HashMap<String, String> dict = new HashMap<String, String>(); - - // Add well known pm options. - if (getPmPort().getIsAvailable()) - { - dict.put(PmPortKey, getPmPort().getEntity() == null ? "" : (String) getPmPort().getEntity()); //$NON-NLS-1$ - } - if (getPmSlot().getIsAvailable()) - { - dict.put(PmSlotKey, getPmSlot().getEntity() == null ? "" : (String) getPmSlot().getEntity()); //$NON-NLS-1$ - } - if (getPmSecure().getIsAvailable()) - { - dict.put(PmSecureKey, getPmSecure().getEntity().toString()); - } - - // Add unknown pm options. - // Assume Validate method was called before this getter. - String pmOptions = (String) getPmOptions().getEntity(); - if (!StringHelper.isNullOrEmpty(pmOptions)) - { - for (String pair : pmOptions.split("[,]", -1)) //$NON-NLS-1$ - { - String[] array = pair.split("[=]", -1); //$NON-NLS-1$ - if (array.length == 2) - { - dict.put(array[0], array[1]); - } - else if (array.length == 1) - { - dict.put(array[0], ""); //$NON-NLS-1$ - } - } - } - - return dict; + public Map<String, String> getPmOptionsMap() { + return getPmOptionsMapInternal(getPmPort(), getPmSlot(), getPmSecure(), getPmOptions()); } - public void setPmOptionsMap(HashMap<String, String> value) - { - String pmOptions = ""; //$NON-NLS-1$ - - for (Map.Entry<String, String> pair : value.entrySet()) - { - String k = pair.getKey(); - String v = pair.getValue(); - - if (StringHelper.stringsEqual(k, PmPortKey)) - { - getPmPort().setEntity(StringHelper.isNullOrEmpty(value.get(k)) ? "" : value.get(k)); //$NON-NLS-1$ - - } - else if (StringHelper.stringsEqual(k, PmSlotKey)) - { - getPmSlot().setEntity(StringHelper.isNullOrEmpty(value.get(k)) ? "" : value.get(k)); //$NON-NLS-1$ - - } - else if (StringHelper.stringsEqual(k, PmSecureKey)) - { - getPmSecure().setEntity(Boolean.parseBoolean(value.get(k))); - - } - else - { - // Compose custom string from unknown pm options. - if (StringHelper.isNullOrEmpty(v)) - { - pmOptions += StringFormat.format("%1$s,", k); //$NON-NLS-1$ - } - else - { - pmOptions += StringFormat.format("%1$s=%2$s,", k, v); //$NON-NLS-1$ - } - } - } - - if (!StringHelper.isNullOrEmpty(pmOptions)) - { - getPmOptions().setEntity(pmOptions.substring(0, pmOptions.length() - 1)); - } + public void setPmOptionsMap(Map<String, String> value) { + setPmOptionsMapInternal(value, getPmPort(), getPmSlot(), getPmSecure(), getPmOptions()); } private Integer postponedSpmPriority; @@ -453,7 +488,6 @@ setName(new EntityModel()); setHost(new EntityModel()); - setManagementIp(new EntityModel()); setDataCenter(new ListModel()); getDataCenter().getSelectedItemChangedEvent().addListener(this); getDataCenter().setIsAvailable(ApplicationModeHelper.getUiMode() != ApplicationMode.GlusterOnly); @@ -461,25 +495,62 @@ getCluster().getSelectedItemChangedEvent().addListener(this); setPort(new EntityModel()); setRootPassword(new EntityModel()); - EntityModel tempVar = new EntityModel(); - tempVar.setEntity(false); - setOverrideIpTables(tempVar); + setOverrideIpTables(new EntityModel()); + getOverrideIpTables().setEntity(false); + + + IEventListener pmListener = new IEventListener() { + @Override + public void eventRaised(Event ev, Object sender, EventArgs args) { + UpdatePmModels(); + } + }; + + // Initialize primary PM fields. + setManagementIp(new EntityModel()); setPmUserName(new EntityModel()); setPmPassword(new EntityModel()); setPmType(new ListModel()); - getPmType().getSelectedItemChangedEvent().addListener(this); - setPmSecure(new EntityModel()); - getPmSecure().setIsAvailable(false); - getPmSecure().setEntity(false); + getPmType().getSelectedItemChangedEvent().addListener(pmListener); setPmPort(new EntityModel()); getPmPort().setIsAvailable(false); setPmSlot(new EntityModel()); getPmSlot().setIsAvailable(false); setPmOptions(new EntityModel()); + setPmSecure(new EntityModel()); + getPmSecure().setIsAvailable(false); + getPmSecure().setEntity(false); + + // Initialize secondary PM fields. + setPmSecondaryIp(new EntityModel()); + setPmSecondaryUserName(new EntityModel()); + setPmSecondaryPassword(new EntityModel()); + setPmSecondaryType(new ListModel()); + getPmSecondaryType().getSelectedItemChangedEvent().addListener(pmListener); + setPmSecondaryPort(new EntityModel()); + getPmSecondaryPort().setIsAvailable(false); + setPmSecondarySlot(new EntityModel()); + getPmSecondarySlot().setIsAvailable(false); + setPmSecondaryOptions(new EntityModel()); + setPmSecondarySecure(new EntityModel()); + getPmSecondarySecure().setIsAvailable(false); + getPmSecondarySecure().setEntity(false); + + // Initialize other PM fields. + setPmSecondaryConcurrent(new EntityModel()); + getPmSecondaryConcurrent().setEntity(false); + + setPmVariants(new ListModel()); + List<String> pmVariants = new ArrayList<String>(); + pmVariants.add("Primary"); //$NON-NLS-1$ + pmVariants.add("Secondary"); //$NON-NLS-1$ + getPmVariants().setItems(pmVariants); + getPmVariants().setSelectedItem(pmVariants.get(0)); setIsPm(new EntityModel()); - getIsPm().getEntityChangedEvent().addListener(this); + getIsPm().getEntityChangedEvent().addListener(pmListener); getIsPm().setEntity(false); + setIsPowerManagementTabValid(true); setIsGeneralTabValid(getIsPowerManagementTabValid()); @@ -589,19 +660,6 @@ { Cluster_SelectedItemChanged(); } - else if (ev.equals(ListModel.SelectedItemChangedEventDefinition) && sender == getPmType()) - { - PmType_SelectedItemChanged(); - } - else if (ev.equals(EntityModel.EntityChangedEventDefinition) && sender == getIsPm()) - { - IsPm_EntityChanged(); - } - } - - private void IsPm_EntityChanged() - { - UpdatePmModels(); } private void DataCenter_SelectedItemChanged() @@ -658,98 +716,206 @@ VDSGroup cluster = (VDSGroup) getCluster().getSelectedItem(); if (cluster != null) { - AsyncQuery _asyncQuery = new AsyncQuery(); - _asyncQuery.setModel(this); - _asyncQuery.asyncCallback = new INewAsyncCallback() { + AsyncDataProvider.GetPmTypeList(new AsyncQuery(this, new INewAsyncCallback() { @Override - public void OnSuccess(Object model, Object result) - { - HostModel hostModel = (HostModel) model; - ArrayList<String> pmTypeList = (ArrayList<String>) result; - String pmType = (String) hostModel.getPmType().getSelectedItem(); + public void OnSuccess(Object model, Object returnValue) { - hostModel.getPmType().setItems(pmTypeList); - if (pmTypeList.contains(pmType)) - { - hostModel.getPmType().setSelectedItem(pmType); - } - else - { - hostModel.getPmType().setSelectedItem(null); - } + ArrayList<String> pmTypes = (ArrayList<String>) returnValue; + updatePmTypeList(pmTypes, getPmType()); + updatePmTypeList(pmTypes, getPmSecondaryType()); } - }; - AsyncDataProvider.GetPmTypeList(_asyncQuery, cluster.getcompatibility_version()); + }), cluster.getcompatibility_version()); } } - private void PmType_SelectedItemChanged() - { - UpdatePmModels(); + private void updatePmTypeList(List<String> pmTypes, ListModel model) { + + String pmType = (String) model.getSelectedItem(); + + model.setItems(pmTypes); + + if (pmTypes.contains(pmType)) { + model.setSelectedItem(pmType); + } + } + + private void setPmOptionsMapInternal(Map<String,String> value, EntityModel port, EntityModel slot, EntityModel secure, EntityModel options) { + + String pmOptions = ""; //$NON-NLS-1$ + + for (Map.Entry<String, String> pair : value.entrySet()) { + String k = pair.getKey(); + String v = pair.getValue(); + + if (StringHelper.stringsEqual(k, PmPortKey)) { + port.setEntity(StringHelper.isNullOrEmpty(value.get(k)) ? "" : value.get(k)); //$NON-NLS-1$ + + } else if (StringHelper.stringsEqual(k, PmSlotKey)) { + slot.setEntity(StringHelper.isNullOrEmpty(value.get(k)) ? "" : value.get(k)); //$NON-NLS-1$ + + } else if (StringHelper.stringsEqual(k, PmSecureKey)) { + secure.setEntity(Boolean.parseBoolean(value.get(k))); + + } else { + // Compose custom string from unknown pm options. + if (StringHelper.isNullOrEmpty(v)) { + pmOptions += StringFormat.format("%1$s,", k); //$NON-NLS-1$ + } else { + pmOptions += StringFormat.format("%1$s=%2$s,", k, v); //$NON-NLS-1$ + } + } + } + + if (!StringHelper.isNullOrEmpty(pmOptions)) { + options.setEntity(pmOptions.substring(0, pmOptions.length() - 1)); + } + } + + private Map<String,String> getPmOptionsMapInternal(EntityModel port, EntityModel slot, EntityModel secure, EntityModel options) { + + Map<String, String> dict = new HashMap<String, String>(); + + // Add well known pm options. + if (port.getIsAvailable()) { + dict.put(PmPortKey, port.getEntity() == null ? "" : (String) port.getEntity()); //$NON-NLS-1$ + } + if (slot.getIsAvailable()) { + dict.put(PmSlotKey, slot.getEntity() == null ? "" : (String) slot.getEntity()); //$NON-NLS-1$ + } + if (secure.getIsAvailable()) { + dict.put(PmSecureKey, secure.getEntity().toString()); + } + + // Add unknown pm options. + // Assume Validate method was called before this getter. + String pmOptions = (String) options.getEntity(); + if (!StringHelper.isNullOrEmpty(pmOptions)) { + for (String pair : pmOptions.split("[,]", -1)) //$NON-NLS-1$ + { + String[] array = pair.split("[=]", -1); //$NON-NLS-1$ + if (array.length == 2) { + dict.put(array[0], array[1]); + } else if (array.length == 1) { + dict.put(array[0], ""); //$NON-NLS-1$ + } + } + } + + return dict; } private void UpdatePmModels() { - String pmType = (String) getPmType().getSelectedItem(); - AsyncQuery _asyncQuery = new AsyncQuery(); - _asyncQuery.setModel(this); - _asyncQuery.asyncCallback = new INewAsyncCallback() { - @Override - public void OnSuccess(Object model, Object result) - { - HostModel hostModel = (HostModel) model; - hostModel.postGetPmOptions((ArrayList<String>) result); - - } - }; - if (!StringHelper.isNullOrEmpty(pmType)) - { - AsyncDataProvider.GetPmOptions(_asyncQuery, pmType); - } - else - { - postGetPmOptions(new ArrayList<String>()); - } - } - - public void postGetPmOptions(ArrayList<String> pmOptions) - { - getPmPort().setIsAvailable(pmOptions.contains(PmPortKey)); - getPmSlot().setIsAvailable(pmOptions.contains(PmSlotKey)); - getPmSecure().setIsAvailable(pmOptions.contains(PmSecureKey)); - boolean isPm = (Boolean) getIsPm().getEntity(); - getTestCommand().setIsExecutionAllowed(isPm); - - getManagementIp().setIsChangable((Boolean) getIsPm().getEntity()); + // Update primary PM fields. + getManagementIp().setIsChangable(isPm); getManagementIp().setIsValid(true); - getPmUserName().setIsChangable((Boolean) getIsPm().getEntity()); + getPmUserName().setIsChangable(isPm); getPmUserName().setIsValid(true); - getPmPassword().setIsChangable((Boolean) getIsPm().getEntity()); + getPmPassword().setIsChangable(isPm); getPmPassword().setIsValid(true); - getPmType().setIsChangable((Boolean) getIsPm().getEntity()); + getPmType().setIsChangable(isPm); getPmType().setIsValid(true); - getPmOptions().setIsChangable((Boolean) getIsPm().getEntity()); - getPmSecure().setIsChangable((Boolean) getIsPm().getEntity()); - getPmPort().setIsChangable((Boolean) getIsPm().getEntity()); + getPmPort().setIsChangable(isPm); getPmPort().setIsValid(true); - getPmSlot().setIsChangable((Boolean) getIsPm().getEntity()); + getPmSlot().setIsChangable(isPm); + getPmOptions().setIsChangable(isPm); + getPmOptions().setIsValid(true); + getPmSecure().setIsChangable(isPm); + + String pmType = (String) getPmType().getSelectedItem(); + if (!StringHelper.isNullOrEmpty(pmType)) { + AsyncDataProvider.GetPmOptions(new AsyncQuery(this, new INewAsyncCallback() { + @Override + public void OnSuccess(Object model, Object returnValue) { + + List<String> pmOptions = (ArrayList<String>) returnValue; + + getPmPort().setIsAvailable(pmOptions.contains(PmPortKey)); + getPmSlot().setIsAvailable(pmOptions.contains(PmSlotKey)); + getPmSecure().setIsAvailable(pmOptions.contains(PmSecureKey)); + } + }), pmType); + } else { + getPmPort().setIsAvailable(false); + getPmSlot().setIsAvailable(false); + getPmSecure().setIsAvailable(false); + } + + + // Update secondary PM fields. + getPmSecondaryIp().setIsChangable(isPm); + getPmSecondaryIp().setIsValid(true); + getPmSecondaryUserName().setIsChangable(isPm); + getPmSecondaryUserName().setIsValid(true); + getPmSecondaryPassword().setIsChangable(isPm); + getPmSecondaryPassword().setIsValid(true); + getPmSecondaryType().setIsChangable(isPm); + getPmSecondaryType().setIsValid(true); + getPmSecondaryPort().setIsChangable(isPm); + getPmSecondaryPort().setIsValid(true); + getPmSecondarySlot().setIsChangable(isPm); + getPmSecondaryOptions().setIsChangable(isPm); + getPmSecondaryOptions().setIsValid(true); + getPmSecondarySecure().setIsChangable(isPm); + + String pmSecondaryType = (String) getPmSecondaryType().getSelectedItem(); + if (!StringHelper.isNullOrEmpty(pmSecondaryType)) { + AsyncDataProvider.GetPmOptions(new AsyncQuery(this, new INewAsyncCallback() { + @Override + public void OnSuccess(Object model, Object returnValue) { + + List<String> pmOptions = (ArrayList<String>) returnValue; + + getPmSecondaryPort().setIsAvailable(pmOptions.contains(PmPortKey)); + getPmSecondarySlot().setIsAvailable(pmOptions.contains(PmSlotKey)); + getPmSecondarySecure().setIsAvailable(pmOptions.contains(PmSecureKey)); + } + }), pmSecondaryType); + } else { + getPmSecondaryPort().setIsAvailable(false); + getPmSecondarySlot().setIsAvailable(false); + getPmSecondarySecure().setIsAvailable(false); + } + + + // Update other PM fields. + getPmVariants().setIsChangable(isPm); + getPmSecondaryConcurrent().setIsChangable(isPm); + getTestCommand().setIsExecutionAllowed(isPm); } public void Test() { + List items = (List) getPmVariants().getItems(); + Object selectedItem = getPmVariants().getSelectedItem(); + + boolean isPrimary = items.indexOf(selectedItem) == 0; + Boolean isPmEnabled = (Boolean) getIsPm().getEntity(); + // Validate user input. - if ((Boolean) getIsPm().getEntity()) + if (isPmEnabled) { - getCluster().setIsValid(true); getCluster().ValidateSelectedItem(new IValidation[] { new NotEmptyValidation() }); - ValidatePmModels(); + ValidatePmModels(isPrimary); } - if (!getManagementIp().getIsValid() || !getPmUserName().getIsValid() || !getPmPassword().getIsValid() - || !getPmType().getIsValid() || !getPmPort().getIsValid() || !getPmOptions().getIsValid()) - { + if (isPrimary && (!getManagementIp().getIsValid() + || !getPmUserName().getIsValid() + || !getPmPassword().getIsValid() + || !getPmType().getIsValid() + || !getPmPort().getIsValid() + || !getPmOptions().getIsValid())) { + return; + } + + if (!isPrimary && (!getPmSecondaryIp().getIsValid() + || !getPmSecondaryUserName().getIsValid() + || !getPmSecondaryPassword().getIsValid() + || !getPmSecondaryType().getIsValid() + || !getPmSecondaryPort().getIsValid() + || !getPmSecondaryOptions().getIsValid())) { return; } @@ -763,14 +929,14 @@ { param.setVdsId(getHostId().getValue()); } - param.setManagementIp((String) getManagementIp().getEntity()); - param.setPmType((String) getPmType().getSelectedItem()); - param.setUser((String) getPmUserName().getEntity()); - param.setPassword((String) getPmPassword().getEntity()); + param.setManagementIp(isPrimary ? (String) getManagementIp().getEntity() : (String) getPmSecondaryIp().getEntity()); + param.setPmType(isPrimary ? (String) getPmType().getSelectedItem() : (String) getPmSecondaryType().getSelectedItem()); + param.setUser(isPrimary ? (String) getPmUserName().getEntity() : (String) getPmSecondaryUserName().getEntity()); + param.setPassword(isPrimary ? (String) getPmPassword().getEntity() : (String) getPmSecondaryPassword().getEntity()); param.setStoragePoolId(cluster.getStoragePoolId().getValue() != null ? cluster.getStoragePoolId() - .getValue() - .getValue() : NGuid.Empty); - param.setFencingOptions(new ValueObjectMap(getPmOptionsMap(), false)); + .getValue() + .getValue() : NGuid.Empty); + param.setFencingOptions(new ValueObjectMap(isPrimary ? getPmOptionsMap() : getPmSecondaryOptionsMap(), false)); Frontend.RunQuery(VdcQueryType.GetNewVdsFenceStatus, param, new IFrontendQueryAsyncCallback() { @@ -804,17 +970,21 @@ }); } - private void ValidatePmModels() + private void ValidatePmModels(boolean primary) { - getManagementIp().ValidateEntity(new IValidation[] { new NotEmptyValidation(), new HostAddressValidation() }); - getPmUserName().ValidateEntity(new IValidation[] { new NotEmptyValidation() }); - getPmPassword().ValidateEntity(new IValidation[] { new NotEmptyValidation() }); - getPmType().ValidateSelectedItem(new IValidation[] { new NotEmptyValidation() }); - IntegerValidation tempVar = new IntegerValidation(); - tempVar.setMinimum(1); - tempVar.setMaximum(65535); - getPmPort().ValidateEntity(new IValidation[] { tempVar }); - getPmOptions().ValidateEntity(new IValidation[] { new KeyValuePairValidation(true) }); + EntityModel ip = primary ? getManagementIp() : getPmSecondaryIp(); + EntityModel userName = primary ? getPmUserName() : getPmSecondaryUserName(); + EntityModel password = primary ? getPmPassword() : getPmSecondaryPassword(); + ListModel type = primary ? getPmType() : getPmSecondaryType(); + EntityModel port = primary ? getPmPort() : getPmSecondaryPort(); + EntityModel options = primary ? getPmOptions() : getPmSecondaryOptions(); + + ip.ValidateEntity(new IValidation[] {new NotEmptyValidation(), new HostAddressValidation()}); + userName.ValidateEntity(new IValidation[] {new NotEmptyValidation()}); + password.ValidateEntity(new IValidation[] {new NotEmptyValidation()}); + type.ValidateSelectedItem(new IValidation[] {new NotEmptyValidation()}); + port.ValidateEntity(new IValidation[] {new IntegerValidation(1, 65535)}); + options.ValidateEntity(new IValidation[] {new KeyValuePairValidation(true)}); } public boolean Validate() @@ -857,7 +1027,7 @@ if ((Boolean) getIsPm().getEntity()) { - ValidatePmModels(); + ValidatePmModels(true); } setIsGeneralTabValid(getName().getIsValid() diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java index 42b82cb..1034339 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java @@ -382,6 +382,9 @@ @DefaultStringValue("Enable Power Management") String hostPopupPmEnabledLabel(); + @DefaultStringValue("Concurrent") + String hostPopupPmConcurrent(); + @DefaultStringValue("Address") String hostPopupPmAddressLabel(); diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostPopupView.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostPopupView.java index e7727e4..c3854e5 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostPopupView.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostPopupView.java @@ -1,5 +1,6 @@ package org.ovirt.engine.ui.webadmin.section.main.view.popup.host; +import com.google.gwt.user.client.ui.FlowPanel; import org.ovirt.engine.core.common.businessentities.VDSGroup; import org.ovirt.engine.core.common.businessentities.storage_pool; import org.ovirt.engine.core.common.mode.ApplicationMode; @@ -20,9 +21,11 @@ import org.ovirt.engine.ui.common.widget.editor.EntityModelPasswordBoxEditor; import org.ovirt.engine.ui.common.widget.editor.EntityModelTextBoxEditor; import org.ovirt.engine.ui.common.widget.editor.ListModelListBoxEditor; +import org.ovirt.engine.ui.common.widget.editor.ListModelListBoxOnlyEditor; import org.ovirt.engine.ui.common.widget.renderer.NullSafeRenderer; import org.ovirt.engine.ui.uicommonweb.models.ApplicationModeHelper; import org.ovirt.engine.ui.uicommonweb.models.EntityModel; +import org.ovirt.engine.ui.uicommonweb.models.ListModel; import org.ovirt.engine.ui.uicommonweb.models.hosts.HostModel; import org.ovirt.engine.ui.webadmin.ApplicationConstants; import org.ovirt.engine.ui.webadmin.ApplicationResources; @@ -40,6 +43,8 @@ import com.google.gwt.user.client.ui.RadioButton; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.inject.Inject; + +import java.util.List; public class HostPopupView extends AbstractModelBoundPopupView<HostModel> implements HostPopupPresenterWidget.ViewDef { @@ -107,6 +112,19 @@ @WithElementId("isPm") EntityModelCheckBoxEditor pmEnabledEditor; + @UiField(provided = true) + @Path(value = "pmVariants.selectedItem") + @WithElementId("pmVariants") + ListModelListBoxOnlyEditor<Object> pmVariantsEditor; + + @UiField + @Path(value = "pmSecondaryConcurrent.entity") + @WithElementId("pmSecondaryConcurrent") + EntityModelCheckBoxEditor pmSecondaryConcurrentEditor; + + @UiField + FlowPanel pmPrimaryPanel; + @UiField @Path(value = "managementIp.entity") @WithElementId("managementIp") @@ -150,6 +168,53 @@ @Path(value = "pmSecure.entity") @WithElementId("pmSecure") EntityModelCheckBoxEditor pmSecureEditor; + + @UiField + FlowPanel pmSecondaryPanel; + + @UiField + @Path(value = "pmSecondaryIp.entity") + @WithElementId("pmSecondaryIp") + EntityModelTextBoxEditor pmSecondaryAddressEditor; + + @UiField + @Path(value = "pmSecondaryUserName.entity") + @WithElementId("pmSecondaryUserName") + EntityModelTextBoxEditor pmSecondaryUserNameEditor; + + @UiField + @Path(value = "pmSecondaryPassword.entity") + @WithElementId("pmSecondaryPassword") + EntityModelPasswordBoxEditor pmSecondaryPasswordEditor; + + @UiField(provided = true) + @Path(value = "pmSecondaryType.selectedItem") + @WithElementId("pmSecondaryType") + ListModelListBoxEditor<Object> pmSecondaryTypeEditor; + + @UiField + @Path(value = "pmSecondaryPort.entity") + @WithElementId("pmSecondaryPort") + EntityModelTextBoxEditor pmSecondaryPortEditor; + + @UiField + @Path(value = "pmSecondarySlot.entity") + @WithElementId("pmSecondarySlot") + EntityModelTextBoxEditor pmSecondarySlotEditor; + + @UiField + @Path(value = "pmSecondaryOptions.entity") + @WithElementId("pmSecondaryOptions") + EntityModelTextBoxEditor pmSecondaryOptionsEditor; + + @UiField + @Ignore + Label pmSecondaryOptionsExplanationLabel; + + @UiField + @Path(value = "pmSecondarySecure.entity") + @WithElementId("pmSecondarySecure") + EntityModelCheckBoxEditor pmSecondarySecureEditor; @UiField UiCommandButton testButton; @@ -199,7 +264,21 @@ } }); + pmVariantsEditor = new ListModelListBoxOnlyEditor<Object>(new NullSafeRenderer<Object>() { + @Override + protected String renderNullSafe(Object object) { + return (String) object; + } + }); + pmTypeEditor = new ListModelListBoxEditor<Object>(new NullSafeRenderer<Object>() { + @Override + protected String renderNullSafe(Object object) { + return (String) object; + } + }); + + pmSecondaryTypeEditor = new ListModelListBoxEditor<Object>(new NullSafeRenderer<Object>() { @Override protected String renderNullSafe(Object object) { return (String) object; @@ -208,7 +287,6 @@ // Check boxes pmEnabledEditor = new EntityModelCheckBoxEditor(Align.RIGHT); - } void localize(ApplicationConstants constants) { @@ -224,6 +302,9 @@ // Power Management tab powerManagementTab.setLabel(constants.hostPopupPowerManagementTabLabel()); pmEnabledEditor.setLabel(constants.hostPopupPmEnabledLabel()); + pmSecondaryConcurrentEditor.setLabel(constants.hostPopupPmConcurrent()); + testButton.setLabel(constants.hostPopupTestButtonLabel()); + // Primary pmAddressEditor.setLabel(constants.hostPopupPmAddressLabel()); pmUserNameEditor.setLabel(constants.hostPopupPmUserNameLabel()); pmPasswordEditor.setLabel(constants.hostPopupPmPasswordLabel()); @@ -233,7 +314,16 @@ pmOptionsEditor.setLabel(constants.hostPopupPmOptionsLabel()); pmOptionsExplanationLabel.setText(constants.hostPopupPmOptionsExplanationLabel()); pmSecureEditor.setLabel(constants.hostPopupPmSecureLabel()); - testButton.setLabel(constants.hostPopupTestButtonLabel()); + // Secondary + pmSecondaryAddressEditor.setLabel(constants.hostPopupPmAddressLabel()); + pmSecondaryUserNameEditor.setLabel(constants.hostPopupPmUserNameLabel()); + pmSecondaryPasswordEditor.setLabel(constants.hostPopupPmPasswordLabel()); + pmSecondaryTypeEditor.setLabel(constants.hostPopupPmTypeLabel()); + pmSecondaryPortEditor.setLabel(constants.hostPopupPmPortLabel()); + pmSecondarySlotEditor.setLabel(constants.hostPopupPmSlotLabel()); + pmSecondaryOptionsEditor.setLabel(constants.hostPopupPmOptionsLabel()); + pmSecondaryOptionsExplanationLabel.setText(constants.hostPopupPmOptionsExplanationLabel()); + pmSecondarySecureEditor.setLabel(constants.hostPopupPmSecureLabel()); // SPM tab spmTab.setLabel(constants.spmTestButtonLabel()); @@ -293,6 +383,28 @@ object.getSpmPriority().getSelectedItemChangedEvent().addListener(spmListener); createSpmControls(object); + + + // Wire events on power management related controls. + object.getPmVariants().getSelectedItemChangedEvent().addListener(new IEventListener() { + @Override + public void eventRaised(Event ev, Object sender, EventArgs args) { + + ListModel model = (ListModel) sender; + List items = (List) model.getItems(); + Object selectedItem = model.getSelectedItem(); + + updatePmPanelsVisibility(items.indexOf(selectedItem) == 0); + } + }); + + updatePmPanelsVisibility(true); + } + + private void updatePmPanelsVisibility(boolean primary) { + + pmPrimaryPanel.setVisible(primary); + pmSecondaryPanel.setVisible(!primary); } private void createSpmControls(final HostModel object) { diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostPopupView.ui.xml b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostPopupView.ui.xml index efa9c49..d82ce59 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostPopupView.ui.xml +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostPopupView.ui.xml @@ -75,16 +75,31 @@ <t:content> <g:FlowPanel> <e:EntityModelCheckBoxEditor ui:field="pmEnabledEditor"/> + <e:ListModelListBoxOnlyEditor ui:field="pmVariantsEditor"/> + <e:EntityModelCheckBoxEditor ui:field="pmSecondaryConcurrentEditor"/> <g:FlowPanel addStyleNames="{style.powerManagementTabInputDecorator}"> - <e:EntityModelTextBoxEditor ui:field="pmAddressEditor"/> - <e:EntityModelTextBoxEditor ui:field="pmUserNameEditor"/> - <e:EntityModelPasswordBoxEditor ui:field="pmPasswordEditor"/> - <e:ListModelListBoxEditor ui:field="pmTypeEditor"/> - <e:EntityModelTextBoxEditor ui:field="pmPortEditor"/> - <e:EntityModelTextBoxEditor ui:field="pmSlotEditor"/> - <e:EntityModelTextBoxEditor ui:field="pmOptionsEditor"/> - <g:Label ui:field="pmOptionsExplanationLabel" addStyleNames="{style.explanationLabel}"/> - <e:EntityModelCheckBoxEditor ui:field="pmSecureEditor"/> + <g:FlowPanel ui:field="pmPrimaryPanel"> + <e:EntityModelTextBoxEditor ui:field="pmAddressEditor"/> + <e:EntityModelTextBoxEditor ui:field="pmUserNameEditor"/> + <e:EntityModelPasswordBoxEditor ui:field="pmPasswordEditor"/> + <e:ListModelListBoxEditor ui:field="pmTypeEditor"/> + <e:EntityModelTextBoxEditor ui:field="pmPortEditor"/> + <e:EntityModelTextBoxEditor ui:field="pmSlotEditor"/> + <e:EntityModelTextBoxEditor ui:field="pmOptionsEditor"/> + <g:Label ui:field="pmOptionsExplanationLabel" addStyleNames="{style.explanationLabel}"/> + <e:EntityModelCheckBoxEditor ui:field="pmSecureEditor"/> + </g:FlowPanel> + <g:FlowPanel ui:field="pmSecondaryPanel"> + <e:EntityModelTextBoxEditor ui:field="pmSecondaryAddressEditor"/> + <e:EntityModelTextBoxEditor ui:field="pmSecondaryUserNameEditor"/> + <e:EntityModelPasswordBoxEditor ui:field="pmSecondaryPasswordEditor"/> + <e:ListModelListBoxEditor ui:field="pmSecondaryTypeEditor"/> + <e:EntityModelTextBoxEditor ui:field="pmSecondaryPortEditor"/> + <e:EntityModelTextBoxEditor ui:field="pmSecondarySlotEditor"/> + <e:EntityModelTextBoxEditor ui:field="pmSecondaryOptionsEditor"/> + <g:Label ui:field="pmSecondaryOptionsExplanationLabel" addStyleNames="{style.explanationLabel}"/> + <e:EntityModelCheckBoxEditor ui:field="pmSecondarySecureEditor"/> + </g:FlowPanel> <g:HTMLPanel addStyleNames="{style.testPanel}"> <w:UiCommandButton ui:field="testButton"/> <g:ScrollPanel addStyleNames="{style.testMessagePanel}"> -- To view, visit http://gerrit.ovirt.org/10335 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Iaf35465afa353637737f90d6c825d8c1ce2ad1c9 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Eli Mesika <emes...@redhat.com> Gerrit-Reviewer: Alexey Chub <ac...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches