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

Reply via email to