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',