Lior Vernia has uploaded a new change for review.

Change subject: webadmin: Allow editing labels on a host interface
......................................................................

webadmin: Allow editing labels on a host interface

Added an edit interface dialog, that allows assigning multiple labels
to it. If its labels have changed, the changes that should be applied
to the networks on the interface are considered; if the configuration
is valid then the dialog is redrawn with those changes, else the
status panel explains the error.

Change-Id: I030cbb7bcef1b05f329f67fc8a30ec5dee4b67f9
Signed-off-by: Lior Vernia <lver...@redhat.com>
---
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostBondInterfaceModel.java
A 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostNicModel.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostSetupNetworksModel.java
A 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/NicLabelModel.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/SetupNetworksAddBondModel.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/SetupNetworksBondModel.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/SetupNetworksEditBondModel.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/SetupNetworksJoinBondsModel.java
M 
frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIMessages.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/HostModule.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/NetworkModule.java
A 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/host/HostNicPopupPresenterWidget.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostBondPopupView.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostBondPopupView.ui.xml
A 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostNicPopupView.java
A 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostNicPopupView.ui.xml
A 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/NicLabelWidget.java
A 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/NicLabelWidget.ui.xml
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/SetupNetworksBondPopupView.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/panels/NetworkItemPanel.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/panels/NetworkPanel.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/panels/NicPanel.java
23 files changed, 546 insertions(+), 22 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/73/22973/1

diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostBondInterfaceModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostBondInterfaceModel.java
index 2316cdb..3f5da97 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostBondInterfaceModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostBondInterfaceModel.java
@@ -177,6 +177,16 @@
         return getBootProtocol() == NetworkBootProtocol.STATIC_IP;
     }
 
+    private NicLabelModel labelsModel;
+
+    public NicLabelModel getLabelsModel() {
+        return labelsModel;
+    }
+
+    protected void setLabelsModel(NicLabelModel labelsModel) {
+        this.labelsModel = labelsModel;
+    }
+
     public HostBondInterfaceModel() {
         setAddress(new EntityModel());
         setSubnet(new EntityModel());
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostNicModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostNicModel.java
new file mode 100644
index 0000000..c5e08ba
--- /dev/null
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostNicModel.java
@@ -0,0 +1,26 @@
+package org.ovirt.engine.ui.uicommonweb.models.hosts;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+
+import 
org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface;
+import org.ovirt.engine.ui.uicommonweb.models.Model;
+
+public class HostNicModel extends Model {
+
+    private final NicLabelModel labelsModel;
+
+    public NicLabelModel getLabelsModel() {
+        return labelsModel;
+    }
+
+    public HostNicModel(VdsNetworkInterface iface, Collection<String> 
suggestedLabels, Map<String, String> labelToIface) {
+        labelsModel = new NicLabelModel(Collections.singletonList(iface), 
suggestedLabels, labelToIface);
+    }
+
+    public boolean validate() {
+        return labelsModel.validate();
+    }
+
+}
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostSetupNetworksModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostSetupNetworksModel.java
index 1280044..d6aef5f 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostSetupNetworksModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/HostSetupNetworksModel.java
@@ -1,12 +1,14 @@
 package org.ovirt.engine.ui.uicommonweb.models.hosts;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.TreeSet;
+import java.util.Set;
 
 import org.ovirt.engine.core.common.action.SetupNetworksParameters;
 import org.ovirt.engine.core.common.action.VdcActionType;
@@ -121,6 +123,8 @@
 
     private Map<String, NetworkLabelModel> labelMap;
 
+    private Map<String, String> labelToIface;
+
     private final List<String> networksToSync = new ArrayList<String>();
 
     // The purpose of this map is to keep the network parameters while moving 
the network from one nic to another
@@ -197,6 +201,10 @@
         NetworkItemModel<?> op1 = nic1 == null ? network1 : nic1;
         NetworkItemModel<?> op2 = nic2 == null ? network2 : nic2;
 
+        return candidateOperation(op1, op2, drop);
+    }
+
+    private boolean candidateOperation(NetworkItemModel<?> op1, 
NetworkItemModel<?> op2, boolean drop) {
         if (op1 == null) {
             throw new IllegalArgumentException("null Operands"); //$NON-NLS-1$
         }
@@ -245,6 +253,41 @@
         return privateOperationCandidateEvent;
     }
 
+    private boolean validateLabelChanges(NicLabelModel labelsModel, 
Collection<LogicalNetworkModel> originalNetworks) {
+        Collection<String> removedLabels = labelsModel.getRemovedLabels();
+        Collection<String> addedLabels = labelsModel.getAddedLabels();
+        Set<LogicalNetworkModel> removedNetworks = new 
HashSet<LogicalNetworkModel>();
+        Set<LogicalNetworkModel> addedNetworks = new 
HashSet<LogicalNetworkModel>();
+        for (String label : removedLabels) {
+            Collection<LogicalNetworkModel> labelNetworks = 
labelMap.get(label).getNetworks();
+            if (labelNetworks != null) {
+                removedNetworks.addAll(labelNetworks);
+            }
+        }
+        for (String label : addedLabels) {
+            Collection<LogicalNetworkModel> labelNetworks = 
labelMap.get(label).getNetworks();
+            if (labelNetworks != null) {
+                addedNetworks.addAll(labelNetworks);
+            }
+        }
+
+        // operations that don't involve adding new networks can't create 
invalid situations
+        if (addedNetworks.isEmpty()) {
+            return true;
+        }
+
+        // generate a mock "bonding" operation to check if the networks can be 
configured together
+        NetworkInterfaceModel mockSrc = new NetworkInterfaceModel(this);
+        NetworkInterfaceModel mockDst = new NetworkInterfaceModel(this);
+        Set<LogicalNetworkModel> potentialIfaceNetworks =
+                new HashSet<LogicalNetworkModel>(originalNetworks);
+        potentialIfaceNetworks.removeAll(removedNetworks);
+        potentialIfaceNetworks.addAll(addedNetworks);
+        mockSrc.setItems(new HashSet<LogicalNetworkModel>());
+        mockDst.setItems(potentialIfaceNetworks);
+        return candidateOperation(mockSrc, mockDst, true);
+    }
+
     public void onEdit(NetworkItemModel<?> item) {
         Model editPopup = null;
         BaseCommandTarget okTarget = null;
@@ -253,15 +296,45 @@
              * Bond Dialog
              *****************/
             final VdsNetworkInterface entity = ((NetworkInterfaceModel) 
item).getEntity();
-            editPopup = new SetupNetworksEditBondModel(entity);
+            editPopup = new SetupNetworksEditBondModel(entity, 
getFreeLabels(), labelToIface);
             final SetupNetworksBondModel bondDialogModel = 
(SetupNetworksBondModel) editPopup;
 
             // OK Target
             okTarget = new BaseCommandTarget() {
                 @Override
                 public void executeCommand(UICommand command) {
-                    setBondOptions(entity, bondDialogModel);
+                    if (!bondDialogModel.validate()) {
+                        return;
+                    }
                     sourceListModel.setConfirmWindow(null);
+                    if (validateLabelChanges(bondDialogModel.getLabelsModel(), 
nicMap.get(entity.getName()).getItems())) {
+                        setBondOptions(entity, bondDialogModel);
+                        bondDialogModel.getLabelsModel().commit(entity);
+                        redraw();
+                    }
+                }
+            };
+        } else if (item instanceof NetworkInterfaceModel) {
+            /*******************
+             * Interface Dialog
+             *******************/
+            final VdsNetworkInterface entity = ((NetworkInterfaceModel) 
item).getEntity();
+            final HostNicModel interfacePopupModel = new HostNicModel(entity, 
getFreeLabels(), labelToIface);
+            editPopup = interfacePopupModel;
+
+            // OK Target
+            okTarget = new BaseCommandTarget() {
+                @Override
+                public void executeCommand(UICommand uiCommand) {
+                    if (!interfacePopupModel.validate()) {
+                        return;
+                    }
+                    sourceListModel.setConfirmWindow(null);
+                    if 
(validateLabelChanges(interfacePopupModel.getLabelsModel(), 
nicMap.get(entity.getName())
+                            .getItems())) {
+                        interfacePopupModel.getLabelsModel().commit(entity);
+                        redraw();
+                    }
                 }
             };
         } else if (item instanceof LogicalNetworkModel) {
@@ -410,13 +483,22 @@
             return;
         } else if (operation == NetworkOperation.BOND_WITH || operation == 
NetworkOperation.JOIN_BONDS) {
             final SetupNetworksBondModel bondPopup;
+            VdsNetworkInterface iface1 = ((NetworkInterfaceModel) 
networkCommand.getOp1()).getEntity();
+            VdsNetworkInterface iface2 = ((NetworkInterfaceModel) 
networkCommand.getOp2()).getEntity();
             if (operation == NetworkOperation.BOND_WITH) {
-                bondPopup = new SetupNetworksAddBondModel(getFreeBonds(), 
nextBondName);
+                bondPopup =
+                        new SetupNetworksAddBondModel(getFreeBonds(),
+                                nextBondName,
+                                Arrays.asList(iface1, iface2),
+                                getFreeLabels(),
+                                labelToIface);
             } else {
                 bondPopup =
                         new SetupNetworksJoinBondsModel(getFreeBonds(),
                                 (BondNetworkInterfaceModel) 
networkCommand.getOp1(),
-                                (BondNetworkInterfaceModel) 
networkCommand.getOp2());
+                                (BondNetworkInterfaceModel) 
networkCommand.getOp2(),
+                                getFreeLabels(),
+                                labelToIface);
             }
             bondPopup.getCommands().add(new UICommand("OK", new 
BaseCommandTarget() { //$NON-NLS-1$
 
@@ -426,13 +508,19 @@
                                 return;
                             }
                             sourceListModel.setConfirmWindow(null);
-                            VdsNetworkInterface bond = new Bond((String) 
bondPopup.getBond().getSelectedItem());
-                            setBondOptions(bond, bondPopup);
+
                             NetworkInterfaceModel nic1 = 
(NetworkInterfaceModel) networkCommand.getOp1();
                             NetworkInterfaceModel nic2 = 
(NetworkInterfaceModel) networkCommand.getOp2();
                             List<LogicalNetworkModel> networks = new 
ArrayList<LogicalNetworkModel>();
                             networks.addAll(nic1.getItems());
                             networks.addAll(nic2.getItems());
+                            if 
(!validateLabelChanges(bondPopup.getLabelsModel(), networks)) {
+                                return;
+                            }
+                            VdsNetworkInterface bond = new Bond((String) 
bondPopup.getBond().getSelectedItem());
+                            setBondOptions(bond, bondPopup);
+                            bondPopup.getLabelsModel().commit(bond);
+
                             networkCommand.execute(bond);
                             redraw();
 
@@ -498,6 +586,12 @@
 
     }
 
+    private Collection<String> getFreeLabels() {
+        Set<String> freeLabels = new HashSet<String>(dcLabels);
+        freeLabels.removeAll(labelToIface.keySet());
+        return freeLabels;
+    }
+
     private List<String> getFreeBonds() {
         List<String> freeBonds = new ArrayList<String>();
         for (VdsNetworkInterface bond : allBonds) {
@@ -542,6 +636,7 @@
         List<VdsNetworkInterface> physicalNics = new 
ArrayList<VdsNetworkInterface>();
         Map<String, List<VdsNetworkInterface>> bondToNic = new HashMap<String, 
List<VdsNetworkInterface>>();
         Map<String, List<LogicalNetworkModel>> nicToNetwork = new 
HashMap<String, List<LogicalNetworkModel>>();
+        labelToIface = new HashMap<String, String>();
 
         // map all nics
         for (VdsNetworkInterface nic : allNics) {
@@ -576,6 +671,8 @@
                             networkModel.attachViaLabel();
                         }
                     }
+
+                    labelToIface.put(label, nicName);
                 }
             }
 
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/NicLabelModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/NicLabelModel.java
new file mode 100644
index 0000000..09f50fb
--- /dev/null
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/NicLabelModel.java
@@ -0,0 +1,106 @@
+package org.ovirt.engine.ui.uicommonweb.models.hosts;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Set;
+
+import 
org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface;
+import org.ovirt.engine.ui.uicommonweb.models.ListModel;
+import org.ovirt.engine.ui.uicompat.ConstantsManager;
+
+public class NicLabelModel extends ListModel<ListModel<String>> {
+
+    private final Collection<VdsNetworkInterface> srcIfaces;
+    private final Collection<String> suggestedLabels;
+    private final Map<String, String> labelToIface;
+    private final Collection<String> originalLabels;
+    private final Set<String> containedIfaces;
+    private final ListModel<ListModel<String>> labelModels;
+    private final Set<String> flushedLabels;
+
+    public Collection<String> getSuggestedLabels() {
+        return suggestedLabels;
+    }
+
+    public ListModel<ListModel<String>> getLabelModels() {
+        return labelModels;
+    }
+
+    public NicLabelModel(Collection<VdsNetworkInterface> srcIfaces,
+            Collection<String> suggestedLabels,
+            Map<String, String> labelToIface) {
+
+        this.srcIfaces = srcIfaces;
+        this.suggestedLabels = suggestedLabels;
+        this.labelToIface = labelToIface;
+
+        originalLabels = new ArrayList<String>();
+        containedIfaces = new HashSet<String>();
+        for (VdsNetworkInterface iface : srcIfaces) {
+            originalLabels.addAll(iface.getLabels());
+            containedIfaces.add(iface.getName());
+        }
+
+        LinkedList<ListModel<String>> items = new 
LinkedList<ListModel<String>>();
+        for (String label : originalLabels) {
+            ListModel<String> labelModel = new ListModel<String>();
+            labelModel.setItems(suggestedLabels);
+            labelModel.setSelectedItem(label);
+            items.add(labelModel);
+        }
+
+        labelModels = new ListModel<ListModel<String>>();
+        labelModels.setItems(items);
+
+        flushedLabels = new HashSet<String>();
+    }
+
+    public boolean validate() {
+        boolean res = true;
+        for (ListModel<String> labelModel : labelModels.getItems()) {
+            String label = labelModel.getSelectedItem();
+            String usingIface = labelToIface.get(label);
+            if (usingIface != null && !containedIfaces.contains(usingIface)) {
+                labelModel.setIsValid(false);
+                
labelModel.getInvalidityReasons().add(ConstantsManager.getInstance()
+                        .getMessages()
+                        .labelInUse(label, usingIface));
+                res = false;
+            }
+        }
+        return res;
+    }
+
+    private void flush() {
+        flushedLabels.clear();
+        for (ListModel<String> labelModel : labelModels.getItems()) {
+            flushedLabels.add(labelModel.getSelectedItem());
+        }
+    }
+
+    public Collection<String> getRemovedLabels() {
+        flush();
+        Set<String> removedLabels = new HashSet<String>(originalLabels);
+        removedLabels.removeAll(flushedLabels);
+        return removedLabels;
+    }
+
+    public Collection<String> getAddedLabels() {
+        flush();
+        Set<String> addedLabels = new HashSet<String>(flushedLabels);
+        addedLabels.removeAll(originalLabels);
+        return addedLabels;
+    }
+
+    public void commit(VdsNetworkInterface dstIface) {
+        for (VdsNetworkInterface iface : srcIfaces) {
+            iface.getLabels().clear();
+        }
+        flush();
+        dstIface.setLabels(flushedLabels);
+    }
+
+}
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/SetupNetworksAddBondModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/SetupNetworksAddBondModel.java
index 5754a91..9be5fde 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/SetupNetworksAddBondModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/SetupNetworksAddBondModel.java
@@ -1,15 +1,25 @@
 package org.ovirt.engine.ui.uicommonweb.models.hosts;
 
+import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
+import 
org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface;
 import org.ovirt.engine.ui.uicompat.ConstantsManager;
 
 public class SetupNetworksAddBondModel extends SetupNetworksBondModel {
 
-    public SetupNetworksAddBondModel(List<String> freeBonds, String 
defaultBondName) {
+    public SetupNetworksAddBondModel(List<String> freeBonds,
+            String defaultBondName,
+            Collection<VdsNetworkInterface> ifaces,
+            Collection<String> suggestedLabels,
+            Map<String, String> labelToIface) {
+
         
setTitle(ConstantsManager.getInstance().getConstants().createNewBondTitle());
         getBond().setItems(freeBonds);
         getBond().setSelectedItem(defaultBondName);
+
+        setLabelsModel(new NicLabelModel(ifaces, suggestedLabels, 
labelToIface));
     }
 
 }
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/SetupNetworksBondModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/SetupNetworksBondModel.java
index 4391ca1..6bdca8f 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/SetupNetworksBondModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/SetupNetworksBondModel.java
@@ -17,4 +17,9 @@
         setBond(new SortedListModel(new LexoNumericComparator()));
     }
 
+    @Override
+    public boolean validate() {
+        return getLabelsModel().validate();
+    }
+
 }
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/SetupNetworksEditBondModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/SetupNetworksEditBondModel.java
index f2ef2a3..39360c2 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/SetupNetworksEditBondModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/SetupNetworksEditBondModel.java
@@ -1,7 +1,10 @@
 package org.ovirt.engine.ui.uicommonweb.models.hosts;
 
 import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 
 import 
org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface;
 import org.ovirt.engine.core.compat.KeyValuePairCompat;
@@ -10,7 +13,10 @@
 
 public class SetupNetworksEditBondModel extends SetupNetworksBondModel {
 
-    public SetupNetworksEditBondModel(final VdsNetworkInterface bond) {
+    public SetupNetworksEditBondModel(final VdsNetworkInterface bond,
+            Collection<String> suggestedLabels,
+            Map<String, String> labelToIface) {
+
         setTitle(ConstantsManager.getInstance()
                 .getMessages()
                 .editBondInterfaceTitle(bond.getName()));
@@ -43,6 +49,8 @@
             customItem.setValue(value);
             getBondingOptions().setSelectedItem(customItem);
         }
+
+        setLabelsModel(new NicLabelModel(Collections.singletonList(bond), 
suggestedLabels, labelToIface));
     }
 
 }
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/SetupNetworksJoinBondsModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/SetupNetworksJoinBondsModel.java
index 7dd3fe9..269a343 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/SetupNetworksJoinBondsModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/hosts/SetupNetworksJoinBondsModel.java
@@ -1,6 +1,8 @@
 package org.ovirt.engine.ui.uicommonweb.models.hosts;
 
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -21,7 +23,9 @@
     @SuppressWarnings("unchecked")
     public SetupNetworksJoinBondsModel(List<String> freeBonds,
             BondNetworkInterfaceModel source,
-            BondNetworkInterfaceModel target) {
+            BondNetworkInterfaceModel target,
+            Collection<String> suggestedLabels,
+            Map<String, String> labelToIface) {
 
         
setTitle(ConstantsManager.getInstance().getConstants().joinBondsTitle());
 
@@ -40,6 +44,8 @@
         addBondOptionIfMissing(target.getBondOptions());
         getBondingOptions().setItems(bondOptions);
         
getBondingOptions().setSelectedItem(pairForBondOption.get(target.getBondOptions()));
+
+        setLabelsModel(new NicLabelModel(Arrays.asList(source.getEntity(), 
target.getEntity()), suggestedLabels, labelToIface));
     }
 
     private void addBondOptionIfMissing(String candidateOption) {
diff --git 
a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIMessages.java
 
b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIMessages.java
index 204edb5..f6e7c18 100644
--- 
a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIMessages.java
+++ 
b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIMessages.java
@@ -201,6 +201,9 @@
     @DefaultMessage("You could detach {0} first.")
     String suggestDetachNetwork(String networkName);
 
+    @DefaultMessage("Label {0} cannot be attached, it is already in use by 
interface {1}.")
+    String labelInUse(String label, String ifaceName);
+
     @DefaultMessage("Incorrect number of Total Virtual CPUs. It is not 
possible to compose this number from the available Virtual Sockets and Cores 
per Virtual Sockets")
     String incorrectVCPUNumber();
 
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java
index d5c2c85..f26120a 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java
@@ -53,6 +53,7 @@
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.host.HostInterfacePopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.host.HostManagementConfirmationPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.host.HostManagementPopupPresenterWidget;
+import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.host.HostNicPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.host.HostPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.host.HostSetupNetworksPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.host.ManualFencePopupPresenterWidget;
@@ -262,6 +263,7 @@
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.host.HostInterfacePopupView;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.host.HostManagementConfirmationPopupView;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.host.HostManagementPopupView;
+import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.host.HostNicPopupView;
 import org.ovirt.engine.ui.webadmin.section.main.view.popup.host.HostPopupView;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.host.HostSetupNetworksPopupView;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.host.ManualFenceConfirmationPopupView;
@@ -1076,6 +1078,9 @@
         bindPresenterWidget(SetupNetworksBondPopupPresenterWidget.class,
                 SetupNetworksBondPopupPresenterWidget.ViewDef.class,
                 SetupNetworksBondPopupView.class);
+        bindPresenterWidget(HostNicPopupPresenterWidget.class,
+                HostNicPopupPresenterWidget.ViewDef.class,
+                HostNicPopupView.class);
         bindPresenterWidget(HostSetupNetworksPopupPresenterWidget.class,
                 HostSetupNetworksPopupPresenterWidget.ViewDef.class,
                 HostSetupNetworksPopupView.class);
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/HostModule.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/HostModule.java
index 4c2269e..b462b3d 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/HostModule.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/HostModule.java
@@ -38,6 +38,7 @@
 import org.ovirt.engine.ui.uicommonweb.models.hosts.HostInterfaceModel;
 import org.ovirt.engine.ui.uicommonweb.models.hosts.HostListModel;
 import org.ovirt.engine.ui.uicommonweb.models.hosts.HostManagementNetworkModel;
+import org.ovirt.engine.ui.uicommonweb.models.hosts.HostNicModel;
 import org.ovirt.engine.ui.uicommonweb.models.hosts.HostSetupNetworksModel;
 import org.ovirt.engine.ui.uicommonweb.models.hosts.HostVmListModel;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.ReportPresenterWidget;
@@ -51,6 +52,7 @@
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.host.HostInterfacePopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.host.HostManagementConfirmationPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.host.HostManagementPopupPresenterWidget;
+import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.host.HostNicPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.host.HostPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.host.HostSetupNetworksPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.host.ManualFencePopupPresenterWidget;
@@ -185,6 +187,7 @@
             final Provider<SetupNetworksManagementPopupPresenterWidget> 
setupNetworksManagementPopupProvider,
             final Provider<HostBondPopupPresenterWidget> hostBondPopupProvider,
             final Provider<SetupNetworksBondPopupPresenterWidget> 
setupNetworksBondPopupProvider,
+            final Provider<HostNicPopupPresenterWidget> hostNicPopupProvider,
             final Provider<HostSetupNetworksPopupPresenterWidget> 
hostSetupNetworksPopupProvider) {
         return new SearchableDetailTabModelProvider<HostInterfaceLineModel, 
HostListModel, HostInterfaceListModel>(
                 eventBus, defaultConfirmPopupProvider,
@@ -210,7 +213,7 @@
 
                         if (hostInterfaceModel.isSetupNetworkMode()){
                             return setupNetworksInterfacePopupProvider.get();
-                        }else{
+                        } else {
                             return hostInterfacePopupProvider.get();
                         }
                     } else if (windowModel instanceof 
HostManagementNetworkModel) {
@@ -218,9 +221,11 @@
 
                         if (hostManagementNetworkModel.isSetupNetworkMode()){
                             return setupNetworksManagementPopupProvider.get();
-                        }else{
+                        } else {
                             return hostManagementPopupProvider.get();
                         }
+                    } else if (windowModel instanceof HostNicModel) {
+                        return hostNicPopupProvider.get();
                     }
                 }
 
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/NetworkModule.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/NetworkModule.java
index 91d55b2..607e088 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/NetworkModule.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/NetworkModule.java
@@ -28,6 +28,7 @@
 import org.ovirt.engine.ui.uicommonweb.models.hosts.HostBondInterfaceModel;
 import org.ovirt.engine.ui.uicommonweb.models.hosts.HostInterfaceModel;
 import org.ovirt.engine.ui.uicommonweb.models.hosts.HostManagementNetworkModel;
+import org.ovirt.engine.ui.uicommonweb.models.hosts.HostNicModel;
 import org.ovirt.engine.ui.uicommonweb.models.networks.NetworkClusterListModel;
 import org.ovirt.engine.ui.uicommonweb.models.networks.NetworkGeneralModel;
 import org.ovirt.engine.ui.uicommonweb.models.networks.NetworkHostListModel;
@@ -39,6 +40,7 @@
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.cluster.ClusterManageNetworkPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.datacenter.EditNetworkPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.datacenter.NewNetworkPopupPresenterWidget;
+import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.host.HostNicPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.host.HostSetupNetworksPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.host.SetupNetworksBondPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.host.SetupNetworksInterfacePopupPresenterWidget;
@@ -174,6 +176,7 @@
             final Provider<SetupNetworksBondPopupPresenterWidget> 
setupNetworksBondPopupProvider,
             final Provider<SetupNetworksInterfacePopupPresenterWidget> 
setupNetworksInterfacePopupProvider,
             final Provider<SetupNetworksManagementPopupPresenterWidget> 
setupNetworksManagementPopupProvider,
+            final Provider<HostNicPopupPresenterWidget> hostNicPopupProvider,
             final Provider<HostSetupNetworksPopupPresenterWidget> 
hostSetupNetworksPopupProvider) {
         return new 
SearchableDetailTabModelProvider<PairQueryable<VdsNetworkInterface, VDS>, 
NetworkListModel, NetworkHostListModel>(
                 eventBus, defaultConfirmPopupProvider,
@@ -191,6 +194,8 @@
                     return setupNetworksInterfacePopupProvider.get();
                 } else if (windowModel instanceof HostManagementNetworkModel) {
                     return setupNetworksManagementPopupProvider.get();
+                } else if (windowModel instanceof HostNicModel) {
+                    return hostNicPopupProvider.get();
                 }
 
                 // Resolve by last executed command
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/host/HostNicPopupPresenterWidget.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/host/HostNicPopupPresenterWidget.java
new file mode 100644
index 0000000..07e4549
--- /dev/null
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/host/HostNicPopupPresenterWidget.java
@@ -0,0 +1,19 @@
+package org.ovirt.engine.ui.webadmin.section.main.presenter.popup.host;
+
+import 
org.ovirt.engine.ui.common.presenter.AbstractModelBoundPopupPresenterWidget;
+import org.ovirt.engine.ui.uicommonweb.models.hosts.HostNicModel;
+
+import com.google.gwt.event.shared.EventBus;
+import com.google.inject.Inject;
+
+public class HostNicPopupPresenterWidget extends 
AbstractModelBoundPopupPresenterWidget<HostNicModel, 
HostNicPopupPresenterWidget.ViewDef> {
+
+    public interface ViewDef extends 
AbstractModelBoundPopupPresenterWidget.ViewDef<HostNicModel> {
+    }
+
+    @Inject
+    public HostNicPopupPresenterWidget(EventBus eventBus, ViewDef view) {
+        super(eventBus, view);
+    }
+
+}
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostBondPopupView.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostBondPopupView.java
index 72b43cb..2a852d8 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostBondPopupView.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostBondPopupView.java
@@ -67,6 +67,10 @@
     @Ignore
     EntityModelTextBoxEditor customEditor;
 
+    @UiField
+    @Ignore
+    NicLabelWidget labelsWidget;
+
     @UiField(provided = true)
     EnumRadioEditor<NetworkBootProtocol> bootProtocol;
 
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostBondPopupView.ui.xml
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostBondPopupView.ui.xml
index 884be68..2092ebb 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostBondPopupView.ui.xml
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostBondPopupView.ui.xml
@@ -3,9 +3,9 @@
 <ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
        xmlns:g="urn:import:com.google.gwt.user.client.ui" 
xmlns:d="urn:import:org.ovirt.engine.ui.common.widget.dialog"
        xmlns:t="urn:import:org.ovirt.engine.ui.common.widget.dialog.tab"
-       xmlns:e="urn:import:org.ovirt.engine.ui.common.widget.editor"
-       xmlns:we="urn:import:org.ovirt.engine.ui.webadmin.widget.editor"
-       xmlns:w="urn:import:org.ovirt.engine.ui.webadmin.widget">
+       xmlns:e="urn:import:org.ovirt.engine.ui.common.widget.editor" 
xmlns:we="urn:import:org.ovirt.engine.ui.webadmin.widget.editor"
+       xmlns:w="urn:import:org.ovirt.engine.ui.webadmin.widget"
+       
xmlns:h="urn:import:org.ovirt.engine.ui.webadmin.section.main.view.popup.host">
 
        <ui:style 
type="org.ovirt.engine.ui.webadmin.section.main.view.popup.host.HostBondPopupView.Style">
                .checkCon{
@@ -24,6 +24,7 @@
                                                <e:ListModelListBoxEditor 
ui:field="networkEditor" />
                                                <e:ListModelListBoxEditor 
ui:field="bondingModeEditor" />
                                                <e:EntityModelTextBoxEditor 
ui:field="customEditor" visible="false" />
+                                               <h:NicLabelWidget 
ui:field="labelsWidget" visible="false" />
                                                <e:EntityModelLabelEditor 
ui:field="bootProtocolLabel" />
                                                <we:EnumRadioEditor 
ui:field="bootProtocol" />
                                                <e:EntityModelTextBoxEditor 
ui:field="address" />
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostNicPopupView.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostNicPopupView.java
new file mode 100644
index 0000000..849f475
--- /dev/null
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostNicPopupView.java
@@ -0,0 +1,50 @@
+package org.ovirt.engine.ui.webadmin.section.main.view.popup.host;
+
+import org.ovirt.engine.ui.common.CommonApplicationResources;
+import org.ovirt.engine.ui.common.view.popup.AbstractModelBoundPopupView;
+import org.ovirt.engine.ui.common.widget.dialog.SimpleDialogPanel;
+import org.ovirt.engine.ui.uicommonweb.models.hosts.HostNicModel;
+import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.host.HostNicPopupPresenterWidget;
+
+import com.google.gwt.core.shared.GWT;
+import com.google.gwt.editor.client.SimpleBeanEditorDriver;
+import com.google.gwt.event.shared.EventBus;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.inject.Inject;
+
+public class HostNicPopupView extends 
AbstractModelBoundPopupView<HostNicModel> implements 
HostNicPopupPresenterWidget.ViewDef {
+
+    interface Driver extends SimpleBeanEditorDriver<HostNicModel, 
HostNicPopupView> {
+    }
+
+    private Driver driver = GWT.create(Driver.class);
+
+    interface ViewUiBinder extends UiBinder<SimpleDialogPanel, 
HostNicPopupView> {
+        ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class);
+    }
+
+    @UiField
+    @Ignore
+    NicLabelWidget labelsWidget;
+
+    @Inject
+    public HostNicPopupView(EventBus eventBus, CommonApplicationResources 
resources) {
+        super(eventBus, resources);
+        driver.initialize(this);
+        ViewUiBinder.uiBinder.createAndBindUi(this);
+    }
+
+    @Override
+    public void edit(HostNicModel model) {
+        driver.edit(model);
+        labelsWidget.edit(model.getLabelsModel());
+    }
+
+    @Override
+    public HostNicModel flush() {
+        labelsWidget.flush();
+        return driver.flush();
+    }
+
+}
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostNicPopupView.ui.xml
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostNicPopupView.ui.xml
new file mode 100644
index 0000000..4a32237
--- /dev/null
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/HostNicPopupView.ui.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent";>
+<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
+       xmlns:d="urn:import:org.ovirt.engine.ui.common.widget.dialog"
+       
xmlns:h="urn:import:org.ovirt.engine.ui.webadmin.section.main.view.popup.host">
+
+       <ui:style 
type="org.ovirt.engine.ui.common.widget.AddRemoveRowWidget.WidgetStyle">
+               .mainPanel {
+                       height: 100%;
+                       width: 100%;
+               }
+
+               .buttonStyle {
+                       margin-right: 7px;
+                       width: 9px;
+                       height: 10px;
+                       padding-left: 2px;
+                       padding-top: 2px;
+                       margin-top: 7px;
+                       margin-left: 8px;
+               }
+       </ui:style>
+
+       <d:SimpleDialogPanel width="400px" height="600px" >
+               <h:NicLabelWidget ui:field="labelsWidget" />
+       </d:SimpleDialogPanel>
+
+</ui:UiBinder>
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/NicLabelWidget.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/NicLabelWidget.java
new file mode 100644
index 0000000..f0b9ec2
--- /dev/null
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/NicLabelWidget.java
@@ -0,0 +1,98 @@
+package org.ovirt.engine.ui.webadmin.section.main.view.popup.host;
+
+import java.util.Collection;
+
+import org.ovirt.engine.ui.common.widget.AddRemoveRowWidget;
+import org.ovirt.engine.ui.common.widget.editor.generic.ListModelSuggestBox;
+import 
org.ovirt.engine.ui.common.widget.uicommon.popup.AbstractModelBoundPopupWidget;
+import org.ovirt.engine.ui.uicommonweb.models.ListModel;
+import org.ovirt.engine.ui.uicommonweb.models.hosts.NicLabelModel;
+
+import com.google.gwt.core.shared.GWT;
+import com.google.gwt.event.logical.shared.HasValueChangeHandlers;
+import com.google.gwt.event.logical.shared.ValueChangeEvent;
+import com.google.gwt.event.logical.shared.ValueChangeHandler;
+import com.google.gwt.event.shared.HandlerRegistration;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.user.client.ui.Widget;
+
+public class NicLabelWidget extends AddRemoveRowWidget<NicLabelModel, 
ListModel<String>, NicLabelWidget.NicLabelEditor> {
+
+    public interface ViewUiBinder extends UiBinder<Widget, NicLabelWidget> {
+        ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class);
+    }
+
+    private Collection<String> suggestions;
+
+    public NicLabelWidget() {
+        ViewUiBinder.uiBinder.createAndBindUi(this);
+    }
+
+    @Override
+    protected NicLabelEditor createWidget(ListModel<String> value) {
+        NicLabelEditor widget = new NicLabelEditor();
+        widget.edit(value);
+        return widget;
+    }
+
+    @Override
+    protected ListModel<String> createGhostValue() {
+        ListModel<String> value = new ListModel<String>();
+        value.setItems(suggestions);
+        value.setSelectedItem(""); //$NON-NLS-1$
+        return value;
+    }
+
+    @Override
+    protected boolean isGhost(ListModel<String> value) {
+        String text = value.getSelectedItem();
+        return text == null || text.isEmpty();
+    }
+
+    @Override
+    protected void toggleGhost(ListModel<String> value, NicLabelEditor widget, 
boolean becomingGhost) {
+        // do nothing, widgets look the same as ghost widgets (only one UI 
field)
+    }
+
+    @Override
+    public void edit(NicLabelModel model) {
+        super.edit(model);
+        suggestions = model.getSuggestedLabels();
+    }
+
+    protected class NicLabelEditor extends 
AbstractModelBoundPopupWidget<ListModel<String>> implements 
HasValueChangeHandlers<ListModel<String>> {
+
+        private final ListModelSuggestBox suggestBox;
+        private ListModel<String> model;
+
+        public NicLabelEditor() {
+            suggestBox = new ListModelSuggestBox();
+        }
+
+        @Override
+        public void edit(ListModel<String> model) {
+            this.model = model;
+            suggestBox.setAcceptableValues((Collection<String>) 
model.getItems());
+            suggestBox.setValue(model.getSelectedItem());
+        }
+
+        @Override
+        public ListModel<String> flush() {
+            model.setSelectedItem(suggestBox.getValue());
+            return model;
+        }
+
+        @Override
+        public HandlerRegistration 
addValueChangeHandler(ValueChangeHandler<ListModel<String>> handler) {
+            return suggestBox.addValueChangeHandler(new 
ValueChangeHandler<String>() {
+
+                @Override
+                public void onValueChange(ValueChangeEvent<String> event) {
+                    model.setSelectedItem(event.getValue());
+                    ValueChangeEvent.fire(NicLabelEditor.this, model);
+                }
+            });
+        }
+    }
+
+}
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/NicLabelWidget.ui.xml
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/NicLabelWidget.ui.xml
new file mode 100644
index 0000000..66016d5
--- /dev/null
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/NicLabelWidget.ui.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent";>
+<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" 
xmlns:g="urn:import:com.google.gwt.user.client.ui">
+
+       <ui:style 
type="org.ovirt.engine.ui.common.widget.AddRemoveRowWidget.WidgetStyle">
+               .mainPanel {
+                       height: 100%;
+                       width: 100%;
+               }
+
+               .buttonStyle {
+                       margin-right: 7px;
+                       width: 9px;
+                       height: 10px;
+                       padding-left: 2px;
+                       padding-top: 2px;
+                       margin-top: 7px;
+                       margin-left: 8px;
+               }
+       </ui:style>
+
+       <g:ScrollPanel addStyleNames="{style.mainPanel}" >
+               <g:FlowPanel ui:field="contentPanel" />
+       </g:ScrollPanel>
+
+</ui:UiBinder>
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/SetupNetworksBondPopupView.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/SetupNetworksBondPopupView.java
index 66c686f..0292756 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/SetupNetworksBondPopupView.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/SetupNetworksBondPopupView.java
@@ -18,9 +18,11 @@
     @Override
     public void edit(final HostBondInterfaceModel object) {
         super.edit(object);
+        labelsWidget.edit(object.getLabelsModel());
 
         bondSuggestEditor.setVisible(true);
         bondEditor.setVisible(false);
+        labelsWidget.setVisible(true);
 
         // hide widgets
         info.setVisible(false);
@@ -31,4 +33,10 @@
         asPopupPanel().setPixelSize(400, 400);
     }
 
+    @Override
+    public HostBondInterfaceModel flush() {
+        labelsWidget.flush();
+        return super.flush();
+    }
+
 }
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/panels/NetworkItemPanel.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/panels/NetworkItemPanel.java
index 26cd638..f4ad861 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/panels/NetworkItemPanel.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/panels/NetworkItemPanel.java
@@ -106,6 +106,7 @@
         if (parentPanel != null) {
             parentPanel.onMouseOver();
         }
+        actionButton.setVisible(false);
     }
 
     protected void onMouseOver() {
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/panels/NetworkPanel.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/panels/NetworkPanel.java
index 7a50716..36992aa 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/panels/NetworkPanel.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/panels/NetworkPanel.java
@@ -124,12 +124,6 @@
     }
 
     @Override
-    protected void onMouseOut() {
-        super.onMouseOut();
-        actionButton.setVisible(false);
-    }
-
-    @Override
     protected void onMouseOver() {
         super.onMouseOver();
         LogicalNetworkModel network = (LogicalNetworkModel) item;
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/panels/NicPanel.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/panels/NicPanel.java
index 55408d6..0be4cba 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/panels/NicPanel.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/host/panels/NicPanel.java
@@ -45,6 +45,7 @@
         }
         rowPanel.setWidget(0, 2, nicImage);
         rowPanel.setWidget(0, 3, titleLabel);
+        rowPanel.setWidget(0, 4, actionButton);
         return rowPanel;
     }
 
@@ -63,6 +64,14 @@
 
     @Override
     protected void onAction() {
-       // Do nothing
+       item.edit();
+    }
+
+    @Override
+    protected void onMouseOver() {
+        super.onMouseOver();
+        if (parentPanel == null) {
+            actionButton.setVisible(true);
+        }
     }
 }


-- 
To view, visit http://gerrit.ovirt.org/22973
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I030cbb7bcef1b05f329f67fc8a30ec5dee4b67f9
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Lior Vernia <lver...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to