Address comments in gerrit 20327

Change-Id: Icadd58a401d32362a826b5ac33bdffec15ca8169
diff --git a/apps/l2lb/src/main/java/org/onosproject/l2lb/api/L2LbAdminService.java b/apps/l2lb/src/main/java/org/onosproject/l2lb/api/L2LbAdminService.java
index b429fe1..d5042d0 100644
--- a/apps/l2lb/src/main/java/org/onosproject/l2lb/api/L2LbAdminService.java
+++ b/apps/l2lb/src/main/java/org/onosproject/l2lb/api/L2LbAdminService.java
@@ -15,33 +15,30 @@
  */
 package org.onosproject.l2lb.api;
 
-import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
 
 import java.util.Set;
 
 /**
- * LACP admin service.
+ * L2 load balancer admin service.
  */
 public interface L2LbAdminService {
     /**
      * Creates or updates a L2 load balancer.
      *
-     * @param deviceId Device ID
-     * @param key L2 load balancer key
+     * @param l2LbId L2 load balancer id
      * @param ports physical ports in the L2 load balancer
      * @param mode L2 load balancer mode
      * @return L2 load balancer that is created or updated
      */
-    L2Lb createOrUpdate(DeviceId deviceId, int key, Set<PortNumber> ports, L2LbMode mode);
+    L2Lb createOrUpdate(L2LbId l2LbId, Set<PortNumber> ports, L2LbMode mode);
 
     /**
      * Removes a L2 load balancer.
      *
-     * @param deviceId Device ID
-     * @param key L2 load balancer key
+     * @param l2LbId L2 load balancer id
      * @return L2 load balancer that is removed or null if it was not possible
      */
-    L2Lb remove(DeviceId deviceId, int key);
+    L2Lb remove(L2LbId l2LbId);
 
 }
diff --git a/apps/l2lb/src/main/java/org/onosproject/l2lb/api/L2LbEvent.java b/apps/l2lb/src/main/java/org/onosproject/l2lb/api/L2LbEvent.java
index a0ce9ce..96cb3b8 100644
--- a/apps/l2lb/src/main/java/org/onosproject/l2lb/api/L2LbEvent.java
+++ b/apps/l2lb/src/main/java/org/onosproject/l2lb/api/L2LbEvent.java
@@ -22,6 +22,9 @@
 
 import static com.google.common.base.MoreObjects.toStringHelper;
 
+/**
+ * L2 load balancer event.
+ */
 public class L2LbEvent extends AbstractEvent<L2LbEvent.Type, L2LbData> {
 
     private L2LbData prevSubject;
diff --git a/apps/l2lb/src/main/java/org/onosproject/l2lb/api/L2LbId.java b/apps/l2lb/src/main/java/org/onosproject/l2lb/api/L2LbId.java
index 65aecef..68bcc47 100644
--- a/apps/l2lb/src/main/java/org/onosproject/l2lb/api/L2LbId.java
+++ b/apps/l2lb/src/main/java/org/onosproject/l2lb/api/L2LbId.java
@@ -19,8 +19,17 @@
 
 import java.util.Objects;
 
+/**
+ * L2 load balancer identifier.
+ * It is used to identify a load balancer across the entire system and therefore has to be unique system-wide.
+ */
 public class L2LbId {
     private final DeviceId deviceId;
+
+    /**
+     * L2 load balancer key.
+     * It is used to identify a load balancer on a specific device and therefore has to be unique device-wide.
+     */
     private final int key;
 
     /**
@@ -73,6 +82,6 @@
 
     @Override
     public String toString() {
-        return deviceId.toString() + " (" + key + ")";
+        return deviceId.toString() + ":" + key;
     }
 }
diff --git a/apps/l2lb/src/main/java/org/onosproject/l2lb/api/L2LbMode.java b/apps/l2lb/src/main/java/org/onosproject/l2lb/api/L2LbMode.java
index 9c38bd6..cec6168 100644
--- a/apps/l2lb/src/main/java/org/onosproject/l2lb/api/L2LbMode.java
+++ b/apps/l2lb/src/main/java/org/onosproject/l2lb/api/L2LbMode.java
@@ -21,11 +21,16 @@
 public enum L2LbMode {
     /**
      * Static L2 load balancer.
+     *
+     * In STATIC mode, all member ports of this load balancer will be used to transmit data as long as it is enabled.
      */
     STATIC,
 
     /**
      * L2 load balancer based on LACP.
+     *
+     * In LACP mode, we decide whether to use a member port to transmit data or not according to
+     * the LACP negotiation result.
      */
     LACP
 }
diff --git a/apps/l2lb/src/main/java/org/onosproject/l2lb/api/L2LbService.java b/apps/l2lb/src/main/java/org/onosproject/l2lb/api/L2LbService.java
index ce396ac..50a6c79 100644
--- a/apps/l2lb/src/main/java/org/onosproject/l2lb/api/L2LbService.java
+++ b/apps/l2lb/src/main/java/org/onosproject/l2lb/api/L2LbService.java
@@ -18,7 +18,6 @@
 
 import org.onosproject.core.ApplicationId;
 import org.onosproject.event.ListenerService;
-import org.onosproject.net.DeviceId;
 
 import java.util.Map;
 
@@ -36,14 +35,14 @@
     /**
      * Gets L2 load balancer that matches given device ID and key, or null if not found.
      *
-     * @param deviceId Device ID
-     * @param key L2 load balancer key
+     * @param l2LbId L2 load balancer id
      * @return L2 load balancer information
      */
-    L2Lb getL2Lb(DeviceId deviceId, int key);
+    L2Lb getL2Lb(L2LbId l2LbId);
 
     /**
-     * Gets L2 load balancer next ids from the store.
+     * Gets the mapping between L2 load balancer id and
+     * the next objective id that represents the L2 load balancer.
      *
      * @return L2 load balancer id and next id mapping
      */
@@ -52,11 +51,10 @@
     /**
      * Gets L2 load balancer next id that matches given device Id and key, or null if not found.
      *
-     * @param deviceId Device ID
-     * @param key L2 load balancer key
+     * @param l2LbId L2 load balancer id
      * @return next ID
      */
-    int getL2LbNext(DeviceId deviceId, int key);
+    int getL2LbNext(L2LbId l2LbId);
 
     /**
      * Reserves a l2 load balancer. Only one application
diff --git a/apps/l2lb/src/main/java/org/onosproject/l2lb/app/L2LbManager.java b/apps/l2lb/src/main/java/org/onosproject/l2lb/app/L2LbManager.java
index 6039099..9ce540d 100644
--- a/apps/l2lb/src/main/java/org/onosproject/l2lb/app/L2LbManager.java
+++ b/apps/l2lb/src/main/java/org/onosproject/l2lb/app/L2LbManager.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.l2lb.app;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Sets;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
@@ -50,13 +51,12 @@
 import org.onosproject.net.flow.instructions.Instruction;
 import org.onosproject.net.flow.instructions.Instructions;
 import org.onosproject.net.flowobjective.DefaultNextObjective;
+import org.onosproject.net.flowobjective.DefaultNextTreatment;
 import org.onosproject.net.flowobjective.FlowObjectiveService;
 import org.onosproject.net.flowobjective.NextObjective;
 import org.onosproject.net.flowobjective.Objective;
 import org.onosproject.net.flowobjective.ObjectiveContext;
 import org.onosproject.net.flowobjective.ObjectiveError;
-import org.onosproject.net.intf.InterfaceService;
-import org.onosproject.net.packet.PacketService;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.ConsistentMap;
 import org.onosproject.store.service.MapEvent;
@@ -84,12 +84,6 @@
     private CoreService coreService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    private PacketService packetService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    private InterfaceService interfaceService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     private StorageService storageService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
@@ -194,15 +188,13 @@
     }
 
     @Override
-    public L2Lb createOrUpdate(DeviceId deviceId, int key, Set<PortNumber> ports, L2LbMode mode) {
-        L2LbId l2LbId = new L2LbId(deviceId, key);
+    public L2Lb createOrUpdate(L2LbId l2LbId, Set<PortNumber> ports, L2LbMode mode) {
         log.debug("Putting {} -> {} {} into L2 load balancer store", l2LbId, mode, ports);
         return Versioned.valueOrNull(l2LbStore.put(l2LbId, new L2Lb(l2LbId, ports, mode)));
     }
 
     @Override
-    public L2Lb remove(DeviceId deviceId, int key) {
-        L2LbId l2LbId = new L2LbId(deviceId, key);
+    public L2Lb remove(L2LbId l2LbId) {
         ApplicationId reservation = Versioned.valueOrNull(l2LbResStore.get(l2LbId));
         // Remove only if it is not used - otherwise it is necessary to release first
         if (reservation == null) {
@@ -216,22 +208,22 @@
 
     @Override
     public Map<L2LbId, L2Lb> getL2Lbs() {
-        return l2LbStore.asJavaMap();
+        return ImmutableMap.copyOf(l2LbStore.asJavaMap());
     }
 
     @Override
-    public L2Lb getL2Lb(DeviceId deviceId, int key) {
-        return Versioned.valueOrNull(l2LbStore.get(new L2LbId(deviceId, key)));
+    public L2Lb getL2Lb(L2LbId l2LbId) {
+        return Versioned.valueOrNull(l2LbStore.get(l2LbId));
     }
 
     @Override
     public Map<L2LbId, Integer> getL2LbNexts() {
-        return l2LbNextStore.asJavaMap();
+        return ImmutableMap.copyOf(l2LbNextStore.asJavaMap());
     }
 
     @Override
-    public int getL2LbNext(DeviceId deviceId, int key) {
-        return Versioned.valueOrNull(l2LbNextStore.get(new L2LbId(deviceId, key)));
+    public int getL2LbNext(L2LbId l2LbId) {
+        return Versioned.valueOrNull(l2LbNextStore.get(l2LbId));
     }
 
     @Override
@@ -469,7 +461,10 @@
         if (nextId == null) {
             nextId = flowObjService.allocateNextId();
         }
-        // TODO replace logical l2lb port
+        // This metadata is used to pass the key to the driver.
+        // Some driver, e.g. OF-DPA, will use that information while creating load balancing group.
+        // TODO This is not an actual LAG port. In the future, we should extend metadata structure to carry
+        //      generic information. We should avoid using in_port in the metadata once generic metadata is available.
         TrafficSelector meta = DefaultTrafficSelector.builder()
                 .matchInPort(PortNumber.portNumber(l2LbId.key())).build();
         NextObjective.Builder nextObjBuilder = DefaultNextObjective.builder()
@@ -479,7 +474,7 @@
                 .fromApp(appId);
         ports.forEach(port -> {
             TrafficTreatment treatment = DefaultTrafficTreatment.builder().setOutput(port).build();
-            nextObjBuilder.addTreatment(treatment);
+            nextObjBuilder.addTreatment(DefaultNextTreatment.of(treatment));
         });
         return nextObjBuilder;
     }
@@ -510,15 +505,16 @@
         @Override
         public void onSuccess(Objective objective) {
             NextObjective nextObj = (NextObjective) objective;
-            log.debug("Success {} nextobj {} for L2 load balancer {}", nextObj.op(), nextObj, l2LbId);
+            log.debug("Successfully {} nextobj {} for L2 load balancer {}. NextObj={}",
+                    nextObj.op(), nextObj.id(), l2LbId, nextObj);
             l2LbProvExecutor.execute(() -> onSuccessHandler(nextObj, l2LbId));
         }
 
         @Override
         public void onError(Objective objective, ObjectiveError error) {
             NextObjective nextObj = (NextObjective) objective;
-            log.debug("Failed {} nextobj {} for L2 load balancer {} due to {}", nextObj.op(), nextObj,
-                      l2LbId, error);
+            log.warn("Failed to {} nextobj {} for L2 load balancer {} due to {}. NextObj={}",
+                    nextObj.op(), nextObj.id(), l2LbId, error, nextObj);
             l2LbProvExecutor.execute(() -> onErrorHandler(nextObj, l2LbId));
         }
     }
diff --git a/apps/l2lb/src/main/java/org/onosproject/l2lb/cli/L2LbAddCommand.java b/apps/l2lb/src/main/java/org/onosproject/l2lb/cli/L2LbAddCommand.java
index 20dfccf..92dc677 100644
--- a/apps/l2lb/src/main/java/org/onosproject/l2lb/cli/L2LbAddCommand.java
+++ b/apps/l2lb/src/main/java/org/onosproject/l2lb/cli/L2LbAddCommand.java
@@ -61,15 +61,16 @@
     @Override
     protected void execute() {
         DeviceId deviceId = DeviceId.deviceId(deviceIdStr);
-        int l2LbPort = Integer.parseInt(keyStr);
+        int l2LbKey = Integer.parseInt(keyStr);
 
         L2LbMode mode = L2LbMode.valueOf(modeStr.toUpperCase());
         Set<PortNumber> ports = Sets.newHashSet(portsStr).stream()
                 .map(PortNumber::fromString).collect(Collectors.toSet());
 
         L2LbAdminService l2LbAdminService = get(L2LbAdminService.class);
-        L2Lb l2Lb = l2LbAdminService.createOrUpdate(deviceId, l2LbPort, ports, mode);
-        print("%s of %s executed", l2Lb == null ? CREATE : UPDATE, new L2LbId(deviceId, l2LbPort));
+        L2LbId l2LbId = new L2LbId(deviceId, l2LbKey);
+        L2Lb l2Lb = l2LbAdminService.createOrUpdate(l2LbId, ports, mode);
+        print("%s of %s executed", l2Lb == null ? CREATE : UPDATE, l2LbId);
 
     }
 }
diff --git a/apps/l2lb/src/main/java/org/onosproject/l2lb/cli/L2LbRemoveCommand.java b/apps/l2lb/src/main/java/org/onosproject/l2lb/cli/L2LbRemoveCommand.java
index 9357be0..6a2a65e 100644
--- a/apps/l2lb/src/main/java/org/onosproject/l2lb/cli/L2LbRemoveCommand.java
+++ b/apps/l2lb/src/main/java/org/onosproject/l2lb/cli/L2LbRemoveCommand.java
@@ -45,10 +45,11 @@
     @Override
     protected void execute() {
         DeviceId deviceId = DeviceId.deviceId(deviceIdStr);
-        int l2LbPort = Integer.parseInt(keyStr);
+        int l2LbKey = Integer.parseInt(keyStr);
 
         L2LbAdminService l2LbAdminService = get(L2LbAdminService.class);
-        L2Lb l2Lb = l2LbAdminService.remove(deviceId, l2LbPort);
-        print("Removal of %s %s", new L2LbId(deviceId, l2LbPort), l2Lb != null ? EXECUTED : FAILED);
+        L2LbId l2LbId = new L2LbId(deviceId, l2LbKey);
+        L2Lb l2Lb = l2LbAdminService.remove(l2LbId);
+        print("Removal of %s %s", l2LbId, l2Lb != null ? EXECUTED : FAILED);
     }
 }
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/impl/XconnectManager.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/impl/XconnectManager.java
index 9ba6f81..626ead3 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/impl/XconnectManager.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/impl/XconnectManager.java
@@ -1234,8 +1234,9 @@
         }
 
         String l2LbKey = port.substring("L2LB(".length(), port.length() - 1);
+        L2LbId l2LbId = new L2LbId(deviceId, Integer.parseInt(l2LbKey));
         try {
-            return Sets.newHashSet(l2LbService.getL2Lb(deviceId, Integer.parseInt(l2LbKey)).ports());
+            return Sets.newHashSet(l2LbService.getL2Lb(l2LbId).ports());
         } catch (NumberFormatException e) {
             log.debug("Port {} is not load balancer key either. Ignore", port);
         } catch (NullPointerException e) {
@@ -1257,11 +1258,11 @@
 
         String l2LbKey = port.substring("L2LB(".length(), port.length() - 1);
         try {
+            L2LbId l2LbId = new L2LbId(deviceId, Integer.parseInt(l2LbKey));
             NextTreatment idNextTreatment =  IdNextTreatment.of(
-                    l2LbService.getL2LbNext(deviceId, Integer.parseInt(l2LbKey)));
+                    l2LbService.getL2LbNext(l2LbId));
             // Reserve only one time during next objective creation
             if (reserve) {
-                L2LbId l2LbId = new L2LbId(deviceId, Integer.parseInt(l2LbKey));
                 if (!l2LbService.reserve(new L2LbId(deviceId, Integer.parseInt(l2LbKey)), appId)) {
                     log.warn("Reservation failed for {}", l2LbId);
                     idNextTreatment = null;
diff --git a/modules.defs b/modules.defs
index 04aa942..5c16ff3 100644
--- a/modules.defs
+++ b/modules.defs
@@ -128,7 +128,6 @@
     '//providers/bgpcep:onos-providers-bgpcep-oar',
     '//providers/host:onos-providers-host-oar',
     '//providers/hostprobing:onos-providers-hostprobing-oar',
-    '//providers/lacp:onos-providers-lacp-oar',
     '//providers/lldp:onos-providers-lldp-oar',
     '//providers/netcfghost:onos-providers-netcfghost-oar',
     '//providers/netcfglinks:onos-providers-netcfglinks-oar',