Changes:
- sdx-l2 first commit
- Add entity SdxL2ConnectionPoint
- Add serialization for SdxL2ConnectionPoint
- Add test for SdxL2ConnectionPoint
- Add readme
- Add high level design representation
Change-Id: Ieebfcda273b48918348aa7628bdb7fde6b1cd830
diff --git a/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2ConnectionPoint.java b/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2ConnectionPoint.java
new file mode 100644
index 0000000..6370ddc
--- /dev/null
+++ b/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2ConnectionPoint.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.sdxl2;
+
+import com.google.common.base.MoreObjects;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
+import org.onosproject.net.ConnectPoint;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.*;
+
+/**
+ * Sdx-l2 connection point expressed as composition of a:
+ * ConnectPoint; Set of Vlanid; Customer edge MAC address (optional).
+ */
+public class SdxL2ConnectionPoint {
+
+ private String name;
+ private final ConnectPoint cPoint;
+ private final List<VlanId> vlanIds;
+ private final MacAddress ceMac;
+
+ /**
+ * Creates a new SDXL2 connection point.
+ *
+ * @param name connection point name
+ * @param cPoint connection point
+ * @param vlans the customer edge vlans
+ * @param ceMac the customer edge router mac address
+ */
+ public SdxL2ConnectionPoint(String name, ConnectPoint cPoint, List<VlanId> vlans, MacAddress ceMac) {
+ this.name = name;
+ this.cPoint = cPoint;
+ this.vlanIds = vlans;
+ this.ceMac = ceMac;
+ }
+
+ /**
+ * Return the name of SDXL2 connection point.
+ *
+ * @return a string representing the name of connection point
+ */
+ public String name() {
+ return name;
+ }
+
+ /**
+ * Returns the connection point.
+ *
+ * @return connection point object
+ */
+ public ConnectPoint connectPoint() {
+ return cPoint;
+ }
+
+ /**
+ * Returns the set of vlans that are used by the customer edge.
+ *
+ * @return a set of vlan ids
+ */
+ public List<VlanId> vlanIds() {
+ return vlanIds;
+ }
+
+ /**
+ * Returns the customer edge mac address.
+ *
+ * @return a mac address object
+ */
+ public MacAddress macAddress() {
+ return ceMac;
+ }
+
+ /**
+ * Parse a device connect point from a string, set of vlans from a string
+ * and mac from a string.
+ * The connect point should be in the format "deviceUri/portNumber".
+ * The vlans should be in the format "vlan1,vlan2,vlan3"
+ * The mac address should be in hex
+ *
+ * @param name name of the SDXL2 cp
+ * @param connectPoint connection point to parse
+ * @param vlans vlanIds to parse
+ * @param mac mac address to parse
+ * @return a ConnectPoint based on the information in the string.
+ *
+ */
+ public static SdxL2ConnectionPoint
+ sdxl2ConnectionPoint(String name, String connectPoint, String vlans, String mac) {
+ checkNotNull(connectPoint);
+ checkNotNull(vlans);
+ checkState(!(name.contains(",") ||
+ name.contains("-") ||
+ name.contains("vlanid=") ||
+ name.contains("ConnectPoint{") ||
+ name.contains("elementId=") ||
+ name.contains("portNumber=") ||
+ name.contains("{") ||
+ name.contains("}") ||
+ name.contains("|")), "Names cannot contain some special characters");
+ checkNotNull(mac);
+ ConnectPoint connectionPoint = ConnectPoint.deviceConnectPoint(connectPoint);
+ String[] splitted = vlans.split(",");
+ checkArgument(splitted.length != 0, "At least '-1' or '1' as value");
+ List<VlanId> vlanslist = new ArrayList<>();
+ for (String vlan : splitted) {
+ if (!vlanslist.contains(VlanId.vlanId(Short.parseShort(vlan))) &&
+ Short.parseShort(vlan) != -1 &&
+ Short.parseShort(vlan) != 1) {
+ vlanslist.add(VlanId.vlanId(Short.parseShort(vlan)));
+ }
+ }
+ MacAddress macAddress = MacAddress.valueOf(mac);
+ return new SdxL2ConnectionPoint(name, connectionPoint, vlanslist, macAddress);
+ }
+
+ /**
+ * Parse a device connect point from a string and set of vlans from a string.
+ * The connect point should be in the format "deviceUri/portNumber".
+ * The vlans should be in the format "vlan1,vlan2,vlan3"
+ *
+ * @param name name of the SDXL2 cp
+ * @param connectPoint connection point to parse
+ * @param vlans vlanIds to parse
+ * @return a ConnectPoint based on the information in the string.
+ *
+ */
+ public static SdxL2ConnectionPoint sdxl2ConnectionPoint(String name, String connectPoint, String vlans) {
+ checkNotNull(connectPoint);
+ checkNotNull(vlans);
+ checkState(!(name.contains(",") ||
+ name.contains("-") ||
+ name.contains("vlanid=") ||
+ name.contains("ConnectPoint{") ||
+ name.contains("elementId=") ||
+ name.contains("portNumber=") ||
+ name.contains("{") ||
+ name.contains("}") ||
+ name.contains("|")), "Names cannot contain some special characters");
+ ConnectPoint connectionPoint = ConnectPoint.deviceConnectPoint(connectPoint);
+ String[] splitted = vlans.split(",");
+ checkArgument(splitted.length != 0, "At least '-1' or '1' as value");
+ List<VlanId> vlanslist = new ArrayList<>();
+ for (String vlan : splitted) {
+ if (!vlanslist.contains(VlanId.vlanId(Short.parseShort(vlan))) &&
+ Short.parseShort(vlan) != -1 &&
+ Short.parseShort(vlan) != 1) {
+ vlanslist.add(VlanId.vlanId(Short.parseShort(vlan)));
+ }
+ }
+ MacAddress macAddress = MacAddress.ZERO;
+ return new SdxL2ConnectionPoint(name, connectionPoint, vlanslist, macAddress);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(name, cPoint, vlanIds, ceMac);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof SdxL2ConnectionPoint) {
+ final SdxL2ConnectionPoint other = (SdxL2ConnectionPoint) obj;
+ return Objects.equals(this.name, other.name) &&
+ Objects.equals(this.cPoint, other.cPoint) &&
+ Objects.equals(this.vlanIds, other.vlanIds) &&
+ Objects.equals(this.ceMac, other.ceMac);
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(this)
+ .add("name", name)
+ .add("connectionPoint", cPoint)
+ .add("vlanIds", vlanIds)
+ .add("ceMac", ceMac)
+ .toString();
+ }
+}
diff --git a/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2ConnectionPointSerializer.java b/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2ConnectionPointSerializer.java
new file mode 100644
index 0000000..adbc246
--- /dev/null
+++ b/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2ConnectionPointSerializer.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.sdxl2;
+
+import com.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.Serializer;
+import com.esotericsoftware.kryo.io.Input;
+import com.esotericsoftware.kryo.io.Output;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
+import org.onosproject.net.ConnectPoint;
+
+import java.util.List;
+
+/**
+ * Kryo serializer for SdxL2ConnectionPoint.
+ */
+public class SdxL2ConnectionPointSerializer extends Serializer<SdxL2ConnectionPoint> {
+
+ /**
+ * Serialize the object using kryo.
+ *
+ * @param kryo the serializer
+ * @param output the output
+ * @param object the object to serialize
+ */
+ public void write(Kryo kryo, Output output, SdxL2ConnectionPoint object) {
+ kryo.writeClassAndObject(output, object.name());
+ kryo.writeClassAndObject(output, object.connectPoint());
+ kryo.writeClassAndObject(output, object.macAddress());
+ kryo.writeClassAndObject(output, object.vlanIds());
+ }
+
+ /**
+ * Create an object from one serialized using kryo.
+ *
+ * @param kryo the serializer
+ * @param input the inpunt
+ * @param type the object to create
+ * @return the object
+ */
+ public SdxL2ConnectionPoint read(Kryo kryo, Input input, Class<SdxL2ConnectionPoint> type) {
+ String name = (String) kryo.readClassAndObject(input);
+ ConnectPoint cp = (ConnectPoint) kryo.readClassAndObject(input);
+ MacAddress mac = (MacAddress) kryo.readClassAndObject(input);
+ List<VlanId> vlans = (List<VlanId>) kryo.readClassAndObject(input);
+ return new SdxL2ConnectionPoint(name, cp, vlans, mac);
+ }
+}
diff --git a/sdx-l2/src/main/java/org/onosproject/sdxl2/package-info.java b/sdx-l2/src/main/java/org/onosproject/sdxl2/package-info.java
new file mode 100644
index 0000000..0e134d7
--- /dev/null
+++ b/sdx-l2/src/main/java/org/onosproject/sdxl2/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Application providing the basic functionality of a L2-SDX.
+ */
+package org.onosproject.sdxl2;