Thomas Vachuska

Added Port.Type and plumbed it throughout.

...@@ -40,7 +40,7 @@ import static org.onlab.onos.net.DeviceId.deviceId; ...@@ -40,7 +40,7 @@ import static org.onlab.onos.net.DeviceId.deviceId;
40 description = "Lists all ports or all ports of a device") 40 description = "Lists all ports or all ports of a device")
41 public class DevicePortsListCommand extends DevicesListCommand { 41 public class DevicePortsListCommand extends DevicesListCommand {
42 42
43 - private static final String FMT = " port=%s, state=%s%s"; 43 + private static final String FMT = " port=%s, state=%s, type=%s, speed=%s%s";
44 44
45 @Option(name = "-e", aliases = "--enabled", description = "Show only enabled ports", 45 @Option(name = "-e", aliases = "--enabled", description = "Show only enabled ports",
46 required = false, multiValued = false) 46 required = false, multiValued = false)
...@@ -110,10 +110,14 @@ public class DevicePortsListCommand extends DevicesListCommand { ...@@ -110,10 +110,14 @@ public class DevicePortsListCommand extends DevicesListCommand {
110 ports.add(mapper.createObjectNode() 110 ports.add(mapper.createObjectNode()
111 .put("port", port.number().toString()) 111 .put("port", port.number().toString())
112 .put("isEnabled", port.isEnabled()) 112 .put("isEnabled", port.isEnabled())
113 + .put("type", port.type().toString().toLowerCase())
114 + .put("portSpeed", port.portSpeed())
113 .set("annotations", annotations(mapper, port.annotations()))); 115 .set("annotations", annotations(mapper, port.annotations())));
114 } 116 }
115 } 117 }
116 - return result.put("device", device.id().toString()).set("ports", ports); 118 + result.set("device", json(service, mapper, device));
119 + result.set("ports", ports);
120 + return result;
117 } 121 }
118 122
119 // Determines if a port should be included in output. 123 // Determines if a port should be included in output.
...@@ -130,6 +134,7 @@ public class DevicePortsListCommand extends DevicesListCommand { ...@@ -130,6 +134,7 @@ public class DevicePortsListCommand extends DevicesListCommand {
130 for (Port port : ports) { 134 for (Port port : ports) {
131 if (isIncluded(port)) { 135 if (isIncluded(port)) {
132 print(FMT, port.number(), port.isEnabled() ? "enabled" : "disabled", 136 print(FMT, port.number(), port.isEnabled() ? "enabled" : "disabled",
137 + port.type().toString().toLowerCase(), port.portSpeed(),
133 annotations(port.annotations())); 138 annotations(port.annotations()));
134 } 139 }
135 } 140 }
......
...@@ -24,9 +24,27 @@ import static com.google.common.base.MoreObjects.toStringHelper; ...@@ -24,9 +24,27 @@ import static com.google.common.base.MoreObjects.toStringHelper;
24 */ 24 */
25 public class DefaultPort extends AbstractAnnotated implements Port { 25 public class DefaultPort extends AbstractAnnotated implements Port {
26 26
27 + /** Default port speed in Mbps. */
28 + public static final long DEFAULT_SPEED = 1_000;
29 +
27 private final Element element; 30 private final Element element;
28 private final PortNumber number; 31 private final PortNumber number;
29 private final boolean isEnabled; 32 private final boolean isEnabled;
33 + private final Type type;
34 + private final long portSpeed;
35 +
36 + /**
37 + * Creates a network element attributed to the specified provider.
38 + *
39 + * @param element parent network element
40 + * @param number port number
41 + * @param isEnabled indicator whether the port is up and active
42 + * @param annotations optional key/value annotations
43 + */
44 + public DefaultPort(Element element, PortNumber number, boolean isEnabled,
45 + Annotations... annotations) {
46 + this(element, number, isEnabled, Type.COPPER, DEFAULT_SPEED, annotations);
47 + }
30 48
31 /** 49 /**
32 * Creates a network element attributed to the specified provider. 50 * Creates a network element attributed to the specified provider.
...@@ -34,19 +52,49 @@ public class DefaultPort extends AbstractAnnotated implements Port { ...@@ -34,19 +52,49 @@ public class DefaultPort extends AbstractAnnotated implements Port {
34 * @param element parent network element 52 * @param element parent network element
35 * @param number port number 53 * @param number port number
36 * @param isEnabled indicator whether the port is up and active 54 * @param isEnabled indicator whether the port is up and active
55 + * @param type port type
56 + * @param portSpeed port speed in Mbs
37 * @param annotations optional key/value annotations 57 * @param annotations optional key/value annotations
38 */ 58 */
39 - public DefaultPort(Element element, PortNumber number, 59 + public DefaultPort(Element element, PortNumber number, boolean isEnabled,
40 - boolean isEnabled, Annotations... annotations) { 60 + Type type, long portSpeed, Annotations... annotations) {
41 super(annotations); 61 super(annotations);
42 this.element = element; 62 this.element = element;
43 this.number = number; 63 this.number = number;
44 this.isEnabled = isEnabled; 64 this.isEnabled = isEnabled;
65 + this.type = type;
66 + this.portSpeed = portSpeed;
67 +
68 + }
69 +
70 + @Override
71 + public Element element() {
72 + return element;
73 + }
74 +
75 + @Override
76 + public PortNumber number() {
77 + return number;
78 + }
79 +
80 + @Override
81 + public boolean isEnabled() {
82 + return isEnabled;
83 + }
84 +
85 + @Override
86 + public Type type() {
87 + return type;
88 + }
89 +
90 + @Override
91 + public long portSpeed() {
92 + return portSpeed;
45 } 93 }
46 94
47 @Override 95 @Override
48 public int hashCode() { 96 public int hashCode() {
49 - return Objects.hash(number, isEnabled); 97 + return Objects.hash(number, isEnabled, type, portSpeed);
50 } 98 }
51 99
52 @Override 100 @Override
...@@ -58,7 +106,9 @@ public class DefaultPort extends AbstractAnnotated implements Port { ...@@ -58,7 +106,9 @@ public class DefaultPort extends AbstractAnnotated implements Port {
58 final DefaultPort other = (DefaultPort) obj; 106 final DefaultPort other = (DefaultPort) obj;
59 return Objects.equals(this.element.id(), other.element.id()) && 107 return Objects.equals(this.element.id(), other.element.id()) &&
60 Objects.equals(this.number, other.number) && 108 Objects.equals(this.number, other.number) &&
61 - Objects.equals(this.isEnabled, other.isEnabled); 109 + Objects.equals(this.isEnabled, other.isEnabled) &&
110 + Objects.equals(this.type, other.type) &&
111 + Objects.equals(this.portSpeed, other.portSpeed);
62 } 112 }
63 return false; 113 return false;
64 } 114 }
...@@ -69,22 +119,9 @@ public class DefaultPort extends AbstractAnnotated implements Port { ...@@ -69,22 +119,9 @@ public class DefaultPort extends AbstractAnnotated implements Port {
69 .add("element", element.id()) 119 .add("element", element.id())
70 .add("number", number) 120 .add("number", number)
71 .add("isEnabled", isEnabled) 121 .add("isEnabled", isEnabled)
122 + .add("type", type)
123 + .add("portSpeed", portSpeed)
72 .toString(); 124 .toString();
73 } 125 }
74 126
75 - @Override
76 - public PortNumber number() {
77 - return number;
78 - }
79 -
80 - @Override
81 - public boolean isEnabled() {
82 - return isEnabled;
83 - }
84 -
85 - @Override
86 - public Element element() {
87 - return element;
88 - }
89 -
90 } 127 }
......
...@@ -21,6 +21,26 @@ package org.onlab.onos.net; ...@@ -21,6 +21,26 @@ package org.onlab.onos.net;
21 */ 21 */
22 public interface Port extends Annotated { 22 public interface Port extends Annotated {
23 23
24 + /** Represents coarse port type classification. */
25 + public enum Type {
26 + /**
27 + * Signifies copper-based connectivity.
28 + */
29 + COPPER,
30 +
31 + /**
32 + * Signifies optical fiber-based connectivity.
33 + */
34 + FIBER
35 + }
36 +
37 + /**
38 + * Returns the parent network element to which this port belongs.
39 + *
40 + * @return parent network element
41 + */
42 + Element element();
43 +
24 /** 44 /**
25 * Returns the port number. 45 * Returns the port number.
26 * 46 *
...@@ -36,12 +56,18 @@ public interface Port extends Annotated { ...@@ -36,12 +56,18 @@ public interface Port extends Annotated {
36 boolean isEnabled(); 56 boolean isEnabled();
37 57
38 /** 58 /**
39 - * Returns the parent network element to which this port belongs. 59 + * Returns the port type.
40 * 60 *
41 - * @return parent network element 61 + * @return port type
42 */ 62 */
43 - Element element(); 63 + Type type();
44 64
45 - // set of port attributes 65 + /**
66 + * Returns the current port speed in Mbps.
67 + *
68 + * @return current port speed
69 + */
70 + long portSpeed();
46 71
72 + // TODO: more attributes?
47 } 73 }
......
...@@ -15,11 +15,12 @@ ...@@ -15,11 +15,12 @@
15 */ 15 */
16 package org.onlab.onos.net.device; 16 package org.onlab.onos.net.device;
17 17
18 +import com.google.common.base.MoreObjects;
18 import org.onlab.onos.net.AbstractDescription; 19 import org.onlab.onos.net.AbstractDescription;
19 import org.onlab.onos.net.PortNumber; 20 import org.onlab.onos.net.PortNumber;
20 import org.onlab.onos.net.SparseAnnotations; 21 import org.onlab.onos.net.SparseAnnotations;
21 22
22 -import com.google.common.base.MoreObjects; 23 +import static org.onlab.onos.net.Port.Type;
23 24
24 /** 25 /**
25 * Default implementation of immutable port description. 26 * Default implementation of immutable port description.
...@@ -27,32 +28,62 @@ import com.google.common.base.MoreObjects; ...@@ -27,32 +28,62 @@ import com.google.common.base.MoreObjects;
27 public class DefaultPortDescription extends AbstractDescription 28 public class DefaultPortDescription extends AbstractDescription
28 implements PortDescription { 29 implements PortDescription {
29 30
31 + private static final long DEFAULT_SPEED = 1_000;
32 +
30 private final PortNumber number; 33 private final PortNumber number;
31 private final boolean isEnabled; 34 private final boolean isEnabled;
35 + private final Type type;
36 + private final long portSpeed;
32 37
33 /** 38 /**
34 * Creates a port description using the supplied information. 39 * Creates a port description using the supplied information.
35 * 40 *
36 - * @param number port number 41 + * @param number port number
37 - * @param isEnabled port enabled state 42 + * @param isEnabled port enabled state
38 - * @param annotations optional key/value annotations map 43 + * @param annotations optional key/value annotations map
39 */ 44 */
40 public DefaultPortDescription(PortNumber number, boolean isEnabled, 45 public DefaultPortDescription(PortNumber number, boolean isEnabled,
41 - SparseAnnotations... annotations) { 46 + SparseAnnotations... annotations) {
47 + this(number, isEnabled, Type.COPPER, DEFAULT_SPEED, annotations);
48 + }
49 +
50 + /**
51 + * Creates a port description using the supplied information.
52 + *
53 + * @param number port number
54 + * @param isEnabled port enabled state
55 + * @param type port type
56 + * @param portSpeed port speed in Mbps
57 + * @param annotations optional key/value annotations map
58 + */
59 + public DefaultPortDescription(PortNumber number, boolean isEnabled,
60 + Type type, long portSpeed,
61 + SparseAnnotations...annotations) {
42 super(annotations); 62 super(annotations);
43 this.number = number; 63 this.number = number;
44 this.isEnabled = isEnabled; 64 this.isEnabled = isEnabled;
65 + this.type = type;
66 + this.portSpeed = portSpeed;
67 + }
68 +
69 + // Default constructor for serialization
70 + private DefaultPortDescription() {
71 + this.number = null;
72 + this.isEnabled = false;
73 + this.portSpeed = DEFAULT_SPEED;
74 + this.type = Type.COPPER;
45 } 75 }
46 76
47 /** 77 /**
48 * Creates a port description using the supplied information. 78 * Creates a port description using the supplied information.
49 * 79 *
50 - * @param base PortDescription to get basic information from 80 + * @param base PortDescription to get basic information from
51 - * @param annotations optional key/value annotations map 81 + * @param annotations optional key/value annotations map
52 */ 82 */
53 public DefaultPortDescription(PortDescription base, 83 public DefaultPortDescription(PortDescription base,
54 - SparseAnnotations annotations) { 84 + SparseAnnotations annotations) {
55 - this(base.portNumber(), base.isEnabled(), annotations); 85 + this(base.portNumber(), base.isEnabled(), base.type(), base.portSpeed(),
86 + annotations);
56 } 87 }
57 88
58 @Override 89 @Override
...@@ -66,17 +97,24 @@ public class DefaultPortDescription extends AbstractDescription ...@@ -66,17 +97,24 @@ public class DefaultPortDescription extends AbstractDescription
66 } 97 }
67 98
68 @Override 99 @Override
100 + public Type type() {
101 + return type;
102 + }
103 +
104 + @Override
105 + public long portSpeed() {
106 + return portSpeed;
107 + }
108 +
109 + @Override
69 public String toString() { 110 public String toString() {
70 return MoreObjects.toStringHelper(getClass()) 111 return MoreObjects.toStringHelper(getClass())
71 .add("number", number) 112 .add("number", number)
72 .add("isEnabled", isEnabled) 113 .add("isEnabled", isEnabled)
114 + .add("type", type)
115 + .add("portSpeed", portSpeed)
73 .add("annotations", annotations()) 116 .add("annotations", annotations())
74 .toString(); 117 .toString();
75 } 118 }
76 119
77 - // default constructor for serialization
78 - private DefaultPortDescription() {
79 - this.number = null;
80 - this.isEnabled = false;
81 - }
82 } 120 }
......
...@@ -18,13 +18,13 @@ package org.onlab.onos.net.device; ...@@ -18,13 +18,13 @@ package org.onlab.onos.net.device;
18 import org.onlab.onos.net.Description; 18 import org.onlab.onos.net.Description;
19 import org.onlab.onos.net.PortNumber; 19 import org.onlab.onos.net.PortNumber;
20 20
21 +import static org.onlab.onos.net.Port.Type;
22 +
21 /** 23 /**
22 * Information about a port. 24 * Information about a port.
23 */ 25 */
24 public interface PortDescription extends Description { 26 public interface PortDescription extends Description {
25 27
26 - // TODO: possibly relocate this to a common ground so that this can also used by host tracking if required
27 -
28 /** 28 /**
29 * Returns the port number. 29 * Returns the port number.
30 * 30 *
...@@ -39,4 +39,18 @@ public interface PortDescription extends Description { ...@@ -39,4 +39,18 @@ public interface PortDescription extends Description {
39 */ 39 */
40 boolean isEnabled(); 40 boolean isEnabled();
41 41
42 + /**
43 + * Returns the port type.
44 + *
45 + * @return port type
46 + */
47 + Type type();
48 +
49 + /**
50 + * Returns the current port speed in Mbps.
51 + *
52 + * @return current port speed
53 + */
54 + long portSpeed();
55 +
42 } 56 }
......
...@@ -23,6 +23,8 @@ import org.onlab.packet.ChassisId; ...@@ -23,6 +23,8 @@ import org.onlab.packet.ChassisId;
23 import static org.junit.Assert.assertEquals; 23 import static org.junit.Assert.assertEquals;
24 import static org.onlab.onos.net.Device.Type.SWITCH; 24 import static org.onlab.onos.net.Device.Type.SWITCH;
25 import static org.onlab.onos.net.DeviceId.deviceId; 25 import static org.onlab.onos.net.DeviceId.deviceId;
26 +import static org.onlab.onos.net.Port.Type.COPPER;
27 +import static org.onlab.onos.net.Port.Type.FIBER;
26 import static org.onlab.onos.net.PortNumber.portNumber; 28 import static org.onlab.onos.net.PortNumber.portNumber;
27 29
28 /** 30 /**
...@@ -35,15 +37,16 @@ public class DefaultPortTest { ...@@ -35,15 +37,16 @@ public class DefaultPortTest {
35 private static final DeviceId DID2 = deviceId("of:bar"); 37 private static final DeviceId DID2 = deviceId("of:bar");
36 private static final PortNumber P1 = portNumber(1); 38 private static final PortNumber P1 = portNumber(1);
37 private static final PortNumber P2 = portNumber(2); 39 private static final PortNumber P2 = portNumber(2);
40 + private static final long SP1 = 1_000_000;
38 41
39 @Test 42 @Test
40 public void testEquality() { 43 public void testEquality() {
41 Device device = new DefaultDevice(PID, DID1, SWITCH, "m", "h", "s", "n", 44 Device device = new DefaultDevice(PID, DID1, SWITCH, "m", "h", "s", "n",
42 new ChassisId()); 45 new ChassisId());
43 - Port p1 = new DefaultPort(device, portNumber(1), true); 46 + Port p1 = new DefaultPort(device, portNumber(1), true, COPPER, SP1);
44 - Port p2 = new DefaultPort(device, portNumber(1), true); 47 + Port p2 = new DefaultPort(device, portNumber(1), true, COPPER, SP1);
45 - Port p3 = new DefaultPort(device, portNumber(2), true); 48 + Port p3 = new DefaultPort(device, portNumber(2), true, FIBER, SP1);
46 - Port p4 = new DefaultPort(device, portNumber(2), true); 49 + Port p4 = new DefaultPort(device, portNumber(2), true, FIBER, SP1);
47 Port p5 = new DefaultPort(device, portNumber(1), false); 50 Port p5 = new DefaultPort(device, portNumber(1), false);
48 51
49 new EqualsTester().addEqualityGroup(p1, p2) 52 new EqualsTester().addEqualityGroup(p1, p2)
...@@ -56,10 +59,12 @@ public class DefaultPortTest { ...@@ -56,10 +59,12 @@ public class DefaultPortTest {
56 public void basics() { 59 public void basics() {
57 Device device = new DefaultDevice(PID, DID1, SWITCH, "m", "h", "s", "n", 60 Device device = new DefaultDevice(PID, DID1, SWITCH, "m", "h", "s", "n",
58 new ChassisId()); 61 new ChassisId());
59 - Port port = new DefaultPort(device, portNumber(1), true); 62 + Port port = new DefaultPort(device, portNumber(1), true, FIBER, SP1);
60 assertEquals("incorrect element", device, port.element()); 63 assertEquals("incorrect element", device, port.element());
61 assertEquals("incorrect number", portNumber(1), port.number()); 64 assertEquals("incorrect number", portNumber(1), port.number());
62 assertEquals("incorrect state", true, port.isEnabled()); 65 assertEquals("incorrect state", true, port.isEnabled());
66 + assertEquals("incorrect speed", SP1, port.portSpeed());
67 + assertEquals("incorrect type", FIBER, port.type());
63 } 68 }
64 69
65 } 70 }
......
...@@ -67,8 +67,8 @@ import com.google.common.collect.HashMultimap; ...@@ -67,8 +67,8 @@ import com.google.common.collect.HashMultimap;
67 @Component(immediate = true) 67 @Component(immediate = true)
68 @Service 68 @Service
69 public class DeviceManager 69 public class DeviceManager
70 - extends AbstractProviderRegistry<DeviceProvider, DeviceProviderService> 70 + extends AbstractProviderRegistry<DeviceProvider, DeviceProviderService>
71 - implements DeviceService, DeviceAdminService, DeviceProviderRegistry { 71 + implements DeviceService, DeviceAdminService, DeviceProviderRegistry {
72 72
73 private static final String DEVICE_ID_NULL = "Device ID cannot be null"; 73 private static final String DEVICE_ID_NULL = "Device ID cannot be null";
74 private static final String PORT_NUMBER_NULL = "Port number cannot be null"; 74 private static final String PORT_NUMBER_NULL = "Port number cannot be null";
...@@ -227,8 +227,8 @@ public class DeviceManager ...@@ -227,8 +227,8 @@ public class DeviceManager
227 227
228 // Personalized device provider service issued to the supplied provider. 228 // Personalized device provider service issued to the supplied provider.
229 private class InternalDeviceProviderService 229 private class InternalDeviceProviderService
230 - extends AbstractProviderService<DeviceProvider> 230 + extends AbstractProviderService<DeviceProvider>
231 - implements DeviceProviderService { 231 + implements DeviceProviderService {
232 232
233 InternalDeviceProviderService(DeviceProvider provider) { 233 InternalDeviceProviderService(DeviceProvider provider) {
234 super(provider); 234 super(provider);
...@@ -236,7 +236,7 @@ public class DeviceManager ...@@ -236,7 +236,7 @@ public class DeviceManager
236 236
237 @Override 237 @Override
238 public void deviceConnected(DeviceId deviceId, 238 public void deviceConnected(DeviceId deviceId,
239 - DeviceDescription deviceDescription) { 239 + DeviceDescription deviceDescription) {
240 checkNotNull(deviceId, DEVICE_ID_NULL); 240 checkNotNull(deviceId, DEVICE_ID_NULL);
241 checkNotNull(deviceDescription, DEVICE_DESCRIPTION_NULL); 241 checkNotNull(deviceDescription, DEVICE_DESCRIPTION_NULL);
242 checkValidity(); 242 checkValidity();
...@@ -267,7 +267,7 @@ public class DeviceManager ...@@ -267,7 +267,7 @@ public class DeviceManager
267 deviceClockProviderService.setMastershipTerm(deviceId, term); 267 deviceClockProviderService.setMastershipTerm(deviceId, term);
268 268
269 DeviceEvent event = store.createOrUpdateDevice(provider().id(), 269 DeviceEvent event = store.createOrUpdateDevice(provider().id(),
270 - deviceId, deviceDescription); 270 + deviceId, deviceDescription);
271 271
272 // If there was a change of any kind, tell the provider 272 // If there was a change of any kind, tell the provider
273 // that this instance is the master. 273 // that this instance is the master.
...@@ -337,14 +337,14 @@ public class DeviceManager ...@@ -337,14 +337,14 @@ public class DeviceManager
337 337
338 @Override 338 @Override
339 public void updatePorts(DeviceId deviceId, 339 public void updatePorts(DeviceId deviceId,
340 - List<PortDescription> portDescriptions) { 340 + List<PortDescription> portDescriptions) {
341 checkNotNull(deviceId, DEVICE_ID_NULL); 341 checkNotNull(deviceId, DEVICE_ID_NULL);
342 checkNotNull(portDescriptions, 342 checkNotNull(portDescriptions,
343 - "Port descriptions list cannot be null"); 343 + "Port descriptions list cannot be null");
344 checkValidity(); 344 checkValidity();
345 345
346 List<DeviceEvent> events = store.updatePorts(this.provider().id(), 346 List<DeviceEvent> events = store.updatePorts(this.provider().id(),
347 - deviceId, portDescriptions); 347 + deviceId, portDescriptions);
348 for (DeviceEvent event : events) { 348 for (DeviceEvent event : events) {
349 post(event); 349 post(event);
350 } 350 }
...@@ -352,13 +352,13 @@ public class DeviceManager ...@@ -352,13 +352,13 @@ public class DeviceManager
352 352
353 @Override 353 @Override
354 public void portStatusChanged(DeviceId deviceId, 354 public void portStatusChanged(DeviceId deviceId,
355 - PortDescription portDescription) { 355 + PortDescription portDescription) {
356 checkNotNull(deviceId, DEVICE_ID_NULL); 356 checkNotNull(deviceId, DEVICE_ID_NULL);
357 checkNotNull(portDescription, PORT_DESCRIPTION_NULL); 357 checkNotNull(portDescription, PORT_DESCRIPTION_NULL);
358 checkValidity(); 358 checkValidity();
359 359
360 final DeviceEvent event = store.updatePortStatus(this.provider().id(), 360 final DeviceEvent event = store.updatePortStatus(this.provider().id(),
361 - deviceId, portDescription); 361 + deviceId, portDescription);
362 if (event != null) { 362 if (event != null) {
363 log.info("Device {} port {} status changed", deviceId, event 363 log.info("Device {} port {} status changed", deviceId, event
364 .port().number()); 364 .port().number());
...@@ -370,7 +370,7 @@ public class DeviceManager ...@@ -370,7 +370,7 @@ public class DeviceManager
370 public void unableToAssertRole(DeviceId deviceId, MastershipRole role) { 370 public void unableToAssertRole(DeviceId deviceId, MastershipRole role) {
371 // FIXME: implement response to this notification 371 // FIXME: implement response to this notification
372 log.warn("Failed to assert role [{}] onto Device {}", role, 372 log.warn("Failed to assert role [{}] onto Device {}", role,
373 - deviceId); 373 + deviceId);
374 if (role == MastershipRole.MASTER) { 374 if (role == MastershipRole.MASTER) {
375 mastershipService.relinquishMastership(deviceId); 375 mastershipService.relinquishMastership(deviceId);
376 // TODO: Shouldn't we be triggering event? 376 // TODO: Shouldn't we be triggering event?
...@@ -393,7 +393,7 @@ public class DeviceManager ...@@ -393,7 +393,7 @@ public class DeviceManager
393 // random cache size 393 // random cache size
394 private final int cacheSize = 5; 394 private final int cacheSize = 5;
395 // temporarily stores term number + events to check for duplicates. A hack. 395 // temporarily stores term number + events to check for duplicates. A hack.
396 - private HashMultimap<Integer, RoleInfo> eventCache = 396 + private HashMultimap<Integer, RoleInfo> eventCache =
397 HashMultimap.create(); 397 HashMultimap.create();
398 398
399 @Override 399 @Override
...@@ -414,7 +414,7 @@ public class DeviceManager ...@@ -414,7 +414,7 @@ public class DeviceManager
414 if (!myNodeId.equals(term.master())) { 414 if (!myNodeId.equals(term.master())) {
415 // something went wrong in consistency, let go 415 // something went wrong in consistency, let go
416 log.warn("Mastership has changed after this event." 416 log.warn("Mastership has changed after this event."
417 - + "Term Service suggests {} for {}", term, did); 417 + + "Term Service suggests {} for {}", term, did);
418 // FIXME: Is it possible to let go of MASTER role 418 // FIXME: Is it possible to let go of MASTER role
419 // but remain on STANDBY list? 419 // but remain on STANDBY list?
420 mastershipService.relinquishMastership(did); 420 mastershipService.relinquishMastership(did);
...@@ -435,11 +435,12 @@ public class DeviceManager ...@@ -435,11 +435,12 @@ public class DeviceManager
435 return; 435 return;
436 } 436 }
437 //flag the device as online. Is there a better way to do this? 437 //flag the device as online. Is there a better way to do this?
438 - DeviceEvent devEvent = store.createOrUpdateDevice(device.providerId(), did, 438 + DeviceEvent devEvent =
439 - new DefaultDeviceDescription( 439 + store.createOrUpdateDevice(device.providerId(), did,
440 - did.uri(), device.type(), device.manufacturer(), 440 + new DefaultDeviceDescription(
441 - device.hwVersion(), device.swVersion(), 441 + did.uri(), device.type(), device.manufacturer(),
442 - device.serialNumber(), device.chassisId())); 442 + device.hwVersion(), device.swVersion(),
443 + device.serialNumber(), device.chassisId()));
443 post(devEvent); 444 post(devEvent);
444 } 445 }
445 applyRole(did, MastershipRole.MASTER); 446 applyRole(did, MastershipRole.MASTER);
...@@ -476,7 +477,7 @@ public class DeviceManager ...@@ -476,7 +477,7 @@ public class DeviceManager
476 477
477 // Store delegate to re-post events emitted from the store. 478 // Store delegate to re-post events emitted from the store.
478 private class InternalStoreDelegate 479 private class InternalStoreDelegate
479 - implements DeviceStoreDelegate { 480 + implements DeviceStoreDelegate {
480 @Override 481 @Override
481 public void notify(DeviceEvent event) { 482 public void notify(DeviceEvent event) {
482 post(event); 483 post(event);
......
...@@ -543,8 +543,9 @@ public class GossipDeviceStore ...@@ -543,8 +543,9 @@ public class GossipDeviceStore
543 Port newPort, 543 Port newPort,
544 Map<PortNumber, Port> ports) { 544 Map<PortNumber, Port> ports) {
545 if (oldPort.isEnabled() != newPort.isEnabled() || 545 if (oldPort.isEnabled() != newPort.isEnabled() ||
546 - !AnnotationsUtil.isEqual(oldPort.annotations(), newPort.annotations())) { 546 + oldPort.type() != newPort.type() ||
547 - 547 + oldPort.portSpeed() != newPort.portSpeed() ||
548 + !AnnotationsUtil.isEqual(oldPort.annotations(), newPort.annotations())) {
548 ports.put(oldPort.number(), newPort); 549 ports.put(oldPort.number(), newPort);
549 return new DeviceEvent(PORT_UPDATED, device, newPort); 550 return new DeviceEvent(PORT_UPDATED, device, newPort);
550 } 551 }
...@@ -867,7 +868,10 @@ public class GossipDeviceStore ...@@ -867,7 +868,10 @@ public class GossipDeviceStore
867 } 868 }
868 } 869 }
869 870
870 - return new DefaultPort(device, number, isEnabled, annotations); 871 + return portDesc == null ?
872 + new DefaultPort(device, number, false, annotations) :
873 + new DefaultPort(device, number, isEnabled, portDesc.value().type(),
874 + portDesc.value().portSpeed(), annotations);
871 } 875 }
872 876
873 /** 877 /**
......
...@@ -115,6 +115,7 @@ public final class KryoNamespaces { ...@@ -115,6 +115,7 @@ public final class KryoNamespaces {
115 // 115 //
116 ControllerNode.State.class, 116 ControllerNode.State.class,
117 Device.Type.class, 117 Device.Type.class,
118 + Port.Type.class,
118 ChassisId.class, 119 ChassisId.class,
119 DefaultAnnotations.class, 120 DefaultAnnotations.class,
120 DefaultControllerNode.class, 121 DefaultControllerNode.class,
......
...@@ -15,13 +15,10 @@ ...@@ -15,13 +15,10 @@
15 */ 15 */
16 package org.onlab.onos.store.serializers; 16 package org.onlab.onos.store.serializers;
17 17
18 -import static org.junit.Assert.assertEquals; 18 +import com.google.common.collect.ImmutableList;
19 -import static org.onlab.onos.net.DeviceId.deviceId; 19 +import com.google.common.collect.ImmutableMap;
20 -import static org.onlab.onos.net.PortNumber.portNumber; 20 +import com.google.common.collect.ImmutableSet;
21 -import static java.util.Arrays.asList; 21 +import com.google.common.testing.EqualsTester;
22 -
23 -import java.nio.ByteBuffer;
24 -
25 import org.junit.After; 22 import org.junit.After;
26 import org.junit.Before; 23 import org.junit.Before;
27 import org.junit.BeforeClass; 24 import org.junit.BeforeClass;
...@@ -50,10 +47,12 @@ import org.onlab.packet.IpPrefix; ...@@ -50,10 +47,12 @@ import org.onlab.packet.IpPrefix;
50 import org.onlab.packet.MacAddress; 47 import org.onlab.packet.MacAddress;
51 import org.onlab.util.KryoNamespace; 48 import org.onlab.util.KryoNamespace;
52 49
53 -import com.google.common.collect.ImmutableList; 50 +import java.nio.ByteBuffer;
54 -import com.google.common.collect.ImmutableMap; 51 +
55 -import com.google.common.collect.ImmutableSet; 52 +import static java.util.Arrays.asList;
56 -import com.google.common.testing.EqualsTester; 53 +import static org.junit.Assert.assertEquals;
54 +import static org.onlab.onos.net.DeviceId.deviceId;
55 +import static org.onlab.onos.net.PortNumber.portNumber;
57 56
58 public class KryoSerializerTest { 57 public class KryoSerializerTest {
59 58
......
...@@ -291,8 +291,9 @@ public class SimpleDeviceStore ...@@ -291,8 +291,9 @@ public class SimpleDeviceStore
291 Port newPort, 291 Port newPort,
292 Map<PortNumber, Port> ports) { 292 Map<PortNumber, Port> ports) {
293 if (oldPort.isEnabled() != newPort.isEnabled() || 293 if (oldPort.isEnabled() != newPort.isEnabled() ||
294 + oldPort.type() != newPort.type() ||
295 + oldPort.portSpeed() != newPort.portSpeed() ||
294 !AnnotationsUtil.isEqual(oldPort.annotations(), newPort.annotations())) { 296 !AnnotationsUtil.isEqual(oldPort.annotations(), newPort.annotations())) {
295 -
296 ports.put(oldPort.number(), newPort); 297 ports.put(oldPort.number(), newPort);
297 return new DeviceEvent(PORT_UPDATED, device, newPort); 298 return new DeviceEvent(PORT_UPDATED, device, newPort);
298 } 299 }
...@@ -510,7 +511,10 @@ public class SimpleDeviceStore ...@@ -510,7 +511,10 @@ public class SimpleDeviceStore
510 } 511 }
511 } 512 }
512 513
513 - return new DefaultPort(device, number, isEnabled, annotations); 514 + return portDesc == null ?
515 + new DefaultPort(device, number, false, annotations) :
516 + new DefaultPort(device, number, isEnabled, portDesc.type(),
517 + portDesc.portSpeed(), annotations);
514 } 518 }
515 519
516 /** 520 /**
......
...@@ -23,6 +23,7 @@ import org.apache.felix.scr.annotations.ReferenceCardinality; ...@@ -23,6 +23,7 @@ import org.apache.felix.scr.annotations.ReferenceCardinality;
23 import org.onlab.onos.net.Device; 23 import org.onlab.onos.net.Device;
24 import org.onlab.onos.net.DeviceId; 24 import org.onlab.onos.net.DeviceId;
25 import org.onlab.onos.net.MastershipRole; 25 import org.onlab.onos.net.MastershipRole;
26 +import org.onlab.onos.net.Port;
26 import org.onlab.onos.net.PortNumber; 27 import org.onlab.onos.net.PortNumber;
27 import org.onlab.onos.net.device.DefaultDeviceDescription; 28 import org.onlab.onos.net.device.DefaultDeviceDescription;
28 import org.onlab.onos.net.device.DefaultPortDescription; 29 import org.onlab.onos.net.device.DefaultPortDescription;
...@@ -43,14 +44,19 @@ import org.onlab.packet.ChassisId; ...@@ -43,14 +44,19 @@ import org.onlab.packet.ChassisId;
43 import org.projectfloodlight.openflow.protocol.OFFactory; 44 import org.projectfloodlight.openflow.protocol.OFFactory;
44 import org.projectfloodlight.openflow.protocol.OFPortConfig; 45 import org.projectfloodlight.openflow.protocol.OFPortConfig;
45 import org.projectfloodlight.openflow.protocol.OFPortDesc; 46 import org.projectfloodlight.openflow.protocol.OFPortDesc;
47 +import org.projectfloodlight.openflow.protocol.OFPortFeatures;
46 import org.projectfloodlight.openflow.protocol.OFPortState; 48 import org.projectfloodlight.openflow.protocol.OFPortState;
47 import org.projectfloodlight.openflow.protocol.OFPortStatus; 49 import org.projectfloodlight.openflow.protocol.OFPortStatus;
50 +import org.projectfloodlight.openflow.protocol.OFVersion;
51 +import org.projectfloodlight.openflow.types.PortSpeed;
48 import org.slf4j.Logger; 52 import org.slf4j.Logger;
49 53
50 import java.util.ArrayList; 54 import java.util.ArrayList;
51 import java.util.List; 55 import java.util.List;
52 56
53 import static org.onlab.onos.net.DeviceId.deviceId; 57 import static org.onlab.onos.net.DeviceId.deviceId;
58 +import static org.onlab.onos.net.Port.Type.COPPER;
59 +import static org.onlab.onos.net.Port.Type.FIBER;
54 import static org.onlab.onos.openflow.controller.Dpid.dpid; 60 import static org.onlab.onos.openflow.controller.Dpid.dpid;
55 import static org.onlab.onos.openflow.controller.Dpid.uri; 61 import static org.onlab.onos.openflow.controller.Dpid.uri;
56 import static org.slf4j.LoggerFactory.getLogger; 62 import static org.slf4j.LoggerFactory.getLogger;
...@@ -63,6 +69,7 @@ import static org.slf4j.LoggerFactory.getLogger; ...@@ -63,6 +69,7 @@ import static org.slf4j.LoggerFactory.getLogger;
63 public class OpenFlowDeviceProvider extends AbstractProvider implements DeviceProvider { 69 public class OpenFlowDeviceProvider extends AbstractProvider implements DeviceProvider {
64 70
65 private static final Logger LOG = getLogger(OpenFlowDeviceProvider.class); 71 private static final Logger LOG = getLogger(OpenFlowDeviceProvider.class);
72 + private static final long MBPS = 1_000 * 1_000;
66 73
67 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 74 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
68 protected DeviceProviderRegistry providerRegistry; 75 protected DeviceProviderRegistry providerRegistry;
...@@ -122,9 +129,9 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr ...@@ -122,9 +129,9 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr
122 129
123 OpenFlowSwitch sw = controller.getSwitch(dpid(device.id().uri())); 130 OpenFlowSwitch sw = controller.getSwitch(dpid(device.id().uri()));
124 //if (!checkChannel(device, sw)) { 131 //if (!checkChannel(device, sw)) {
125 - // LOG.error("Failed to probe device {} on sw={}", device, sw); 132 + // LOG.error("Failed to probe device {} on sw={}", device, sw);
126 // providerService.deviceDisconnected(device.id()); 133 // providerService.deviceDisconnected(device.id());
127 - //return; 134 + //return;
128 //} 135 //}
129 136
130 // Prompt an update of port information. We can use any XID for this. 137 // Prompt an update of port information. We can use any XID for this.
...@@ -143,13 +150,13 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr ...@@ -143,13 +150,13 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr
143 150
144 // Checks if the OF channel is connected. 151 // Checks if the OF channel is connected.
145 //private boolean checkChannel(Device device, OpenFlowSwitch sw) { 152 //private boolean checkChannel(Device device, OpenFlowSwitch sw) {
146 - // FIXME if possible, we might want this to be part of 153 + // FIXME if possible, we might want this to be part of
147 - // OpenFlowSwitch interface so the driver interface isn't misused. 154 + // OpenFlowSwitch interface so the driver interface isn't misused.
148 // if (sw == null || !((OpenFlowSwitchDriver) sw).isConnected()) { 155 // if (sw == null || !((OpenFlowSwitchDriver) sw).isConnected()) {
149 - // return false; 156 + // return false;
150 - // } 157 + // }
151 // return true; 158 // return true;
152 - // } 159 + // }
153 160
154 @Override 161 @Override
155 public void roleChanged(Device device, MastershipRole newRole) { 162 public void roleChanged(Device device, MastershipRole newRole) {
...@@ -188,7 +195,7 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr ...@@ -188,7 +195,7 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr
188 sw.hardwareDescription(), 195 sw.hardwareDescription(),
189 sw.softwareDescription(), 196 sw.softwareDescription(),
190 sw.serialNumber(), 197 sw.serialNumber(),
191 - cId); 198 + cId);
192 providerService.deviceConnected(did, description); 199 providerService.deviceConnected(did, description);
193 providerService.updatePorts(did, buildPortDescriptions(sw.getPorts())); 200 providerService.updatePorts(did, buildPortDescriptions(sw.getPorts()));
194 } 201 }
...@@ -244,8 +251,7 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr ...@@ -244,8 +251,7 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr
244 * @param ports the list of ports 251 * @param ports the list of ports
245 * @return list of portdescriptions 252 * @return list of portdescriptions
246 */ 253 */
247 - private List<PortDescription> buildPortDescriptions( 254 + private List<PortDescription> buildPortDescriptions(List<OFPortDesc> ports) {
248 - List<OFPortDesc> ports) {
249 final List<PortDescription> portDescs = new ArrayList<>(ports.size()); 255 final List<PortDescription> portDescs = new ArrayList<>(ports.size());
250 for (OFPortDesc port : ports) { 256 for (OFPortDesc port : ports) {
251 portDescs.add(buildPortDescription(port)); 257 portDescs.add(buildPortDescription(port));
...@@ -260,12 +266,25 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr ...@@ -260,12 +266,25 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr
260 * @return portDescription for the port. 266 * @return portDescription for the port.
261 */ 267 */
262 private PortDescription buildPortDescription(OFPortDesc port) { 268 private PortDescription buildPortDescription(OFPortDesc port) {
263 - final PortNumber portNo = PortNumber.portNumber(port.getPortNo().getPortNumber()); 269 + PortNumber portNo = PortNumber.portNumber(port.getPortNo().getPortNumber());
264 - final boolean enabled = !port.getState().contains(OFPortState.LINK_DOWN) && 270 + boolean enabled =
265 - !port.getConfig().contains(OFPortConfig.PORT_DOWN); 271 + !port.getState().contains(OFPortState.LINK_DOWN) &&
266 - return new DefaultPortDescription(portNo, enabled); 272 + !port.getConfig().contains(OFPortConfig.PORT_DOWN);
273 + Port.Type type = port.getCurr().contains(OFPortFeatures.PF_FIBER) ? FIBER : COPPER;
274 + return new DefaultPortDescription(portNo, enabled, type, portSpeed(port));
267 } 275 }
268 276
277 + private long portSpeed(OFPortDesc port) {
278 + if (port.getVersion() == OFVersion.OF_13) {
279 + return port.getCurrSpeed() / MBPS;
280 + }
281 +
282 + PortSpeed portSpeed = PortSpeed.SPEED_NONE;
283 + for (OFPortFeatures feat : port.getCurr()) {
284 + portSpeed = PortSpeed.max(portSpeed, feat.getPortSpeed());
285 + }
286 + return portSpeed.getSpeedBps() / MBPS;
287 + }
269 } 288 }
270 289
271 } 290 }
......
...@@ -6,4 +6,4 @@ ...@@ -6,4 +6,4 @@
6 [ ! -d "$ONOS_ROOT" ] && echo "ONOS_ROOT is not defined" >&2 && exit 1 6 [ ! -d "$ONOS_ROOT" ] && echo "ONOS_ROOT is not defined" >&2 && exit 1
7 . $ONOS_ROOT/tools/build/envDefaults 7 . $ONOS_ROOT/tools/build/envDefaults
8 8
9 -cd $ONOS_ROOT && mvn clean install && cd docs && mvn javadoc:aggregate 9 +cd $ONOS_ROOT && mvn clean install "$@" && cd docs && mvn javadoc:aggregate
......
...@@ -34,6 +34,7 @@ alias mci='mvn clean install' ...@@ -34,6 +34,7 @@ alias mci='mvn clean install'
34 34
35 # Short-hand for ONOS build, package and test. 35 # Short-hand for ONOS build, package and test.
36 alias ob='onos-build' 36 alias ob='onos-build'
37 +alias obi='onos-build -Dmaven.test.failure.ignore=true'
37 alias obs='onos-build-selective' 38 alias obs='onos-build-selective'
38 alias op='onos-package' 39 alias op='onos-package'
39 alias ot='onos-test' 40 alias ot='onos-test'
......
...@@ -3,28 +3,33 @@ ...@@ -3,28 +3,33 @@
3 { 3 {
4 "uri": "of:0000ffffffffff01", "mac": "ffffffffffff01", "type": "ROADM", 4 "uri": "of:0000ffffffffff01", "mac": "ffffffffffff01", "type": "ROADM",
5 "mfr": "Linc", "hw": "OE", "sw": "?", "serial": "?", "name": "ROADM1", 5 "mfr": "Linc", "hw": "OE", "sw": "?", "serial": "?", "name": "ROADM1",
6 - "annotations": { "latitude": 37.6, "longitude": 122.3, "optical.regens": 0 } 6 + "annotations": { "latitude": 37.6, "longitude": 122.3, "optical.regens": 0 },
7 + "ports": [ { "port": 10, "speed": 100000, "type": "FIBER" }, { "port": 20, "speed": 0, "type": "FIBER" } ]
7 }, 8 },
8 { 9 {
9 "uri": "of:0000ffffffffff02", "mac": "ffffffffffff02", "type": "ROADM", 10 "uri": "of:0000ffffffffff02", "mac": "ffffffffffff02", "type": "ROADM",
10 "mfr": "Linc", "hw": "OE", "sw": "?", "serial": "?", "name": "ROADM2", 11 "mfr": "Linc", "hw": "OE", "sw": "?", "serial": "?", "name": "ROADM2",
11 - "annotations": { "latitude": 37.3, "longitude": 121.9, "optical.regens": 0 } 12 + "annotations": { "latitude": 37.3, "longitude": 121.9, "optical.regens": 0 },
13 + "ports": [ { "port": 11, "speed": 100000, "type": "FIBER" }, { "port": 21, "speed": 0, "type": "FIBER" } ]
12 }, 14 },
13 { 15 {
14 "uri": "of:0000ffffffffff03", "mac": "ffffffffffff03", "type": "ROADM", 16 "uri": "of:0000ffffffffff03", "mac": "ffffffffffff03", "type": "ROADM",
15 "mfr": "Linc", "hw": "OE", "sw": "?", "serial": "?", "name": "ROADM3", 17 "mfr": "Linc", "hw": "OE", "sw": "?", "serial": "?", "name": "ROADM3",
16 - "annotations": { "latitude": 33.9, "longitude": 118.4, "optical.regens": 2 } 18 + "annotations": { "latitude": 33.9, "longitude": 118.4, "optical.regens": 2 },
19 + "ports": [ { "port": 30, "speed": 0, "type": "FIBER" }, { "port": 31, "speed": 0, "type": "FIBER" } ]
17 }, 20 },
18 21
19 { 22 {
20 "uri": "of:0000ffffffff0001", "mac": "ffffffffff0003", "type": "SWITCH", 23 "uri": "of:0000ffffffff0001", "mac": "ffffffffff0003", "type": "SWITCH",
21 "mfr": "Linc", "hw": "PK", "sw": "?", "serial": "?", "name": "ROUTER1", 24 "mfr": "Linc", "hw": "PK", "sw": "?", "serial": "?", "name": "ROUTER1",
22 - "annotations": { "latitude": 37.6, "longitude": 122.3 } 25 + "annotations": { "latitude": 37.6, "longitude": 122.3 },
26 + "ports": [ { "port": 1, "speed": 10000, "type": "COPPER" }, { "port": 2, "speed": 100000, "type": "FIBER" } ]
23 }, 27 },
24 { 28 {
25 "uri": "of:0000ffffffff0002", "mac": "ffffffffff0002", "type": "SWITCH", 29 "uri": "of:0000ffffffff0002", "mac": "ffffffffff0002", "type": "SWITCH",
26 "mfr": "Linc", "hw": "PK", "sw": "?", "serial": "?", "name": "ROUTER2", 30 "mfr": "Linc", "hw": "PK", "sw": "?", "serial": "?", "name": "ROUTER2",
27 - "annotations": { "latitude": 37.3, "longitude": 121.9 } 31 + "annotations": { "latitude": 37.3, "longitude": 121.9 },
32 + "ports": [ { "port": 1, "speed": 10000, "type": "COPPER" }, { "port": 2, "speed": 100000, "type": "FIBER" } ]
28 } 33 }
29 ], 34 ],
30 35
......
...@@ -202,7 +202,7 @@ public final class IpAddress implements Comparable<IpAddress> { ...@@ -202,7 +202,7 @@ public final class IpAddress implements Comparable<IpAddress> {
202 202
203 @Override 203 @Override
204 public int hashCode() { 204 public int hashCode() {
205 - return Objects.hash(version, octets); 205 + return Objects.hash(version, Arrays.hashCode(octets));
206 } 206 }
207 207
208 @Override 208 @Override
......
...@@ -19,17 +19,21 @@ import com.fasterxml.jackson.databind.JsonNode; ...@@ -19,17 +19,21 @@ import com.fasterxml.jackson.databind.JsonNode;
19 import org.onlab.onos.net.ConnectPoint; 19 import org.onlab.onos.net.ConnectPoint;
20 import org.onlab.onos.net.DefaultAnnotations; 20 import org.onlab.onos.net.DefaultAnnotations;
21 import org.onlab.onos.net.Device; 21 import org.onlab.onos.net.Device;
22 +import org.onlab.onos.net.DeviceId;
22 import org.onlab.onos.net.Host; 23 import org.onlab.onos.net.Host;
23 import org.onlab.onos.net.HostId; 24 import org.onlab.onos.net.HostId;
24 import org.onlab.onos.net.HostLocation; 25 import org.onlab.onos.net.HostLocation;
25 import org.onlab.onos.net.Link; 26 import org.onlab.onos.net.Link;
26 import org.onlab.onos.net.MastershipRole; 27 import org.onlab.onos.net.MastershipRole;
28 +import org.onlab.onos.net.Port;
27 import org.onlab.onos.net.SparseAnnotations; 29 import org.onlab.onos.net.SparseAnnotations;
28 import org.onlab.onos.net.device.DefaultDeviceDescription; 30 import org.onlab.onos.net.device.DefaultDeviceDescription;
31 +import org.onlab.onos.net.device.DefaultPortDescription;
29 import org.onlab.onos.net.device.DeviceDescription; 32 import org.onlab.onos.net.device.DeviceDescription;
30 import org.onlab.onos.net.device.DeviceProvider; 33 import org.onlab.onos.net.device.DeviceProvider;
31 import org.onlab.onos.net.device.DeviceProviderRegistry; 34 import org.onlab.onos.net.device.DeviceProviderRegistry;
32 import org.onlab.onos.net.device.DeviceProviderService; 35 import org.onlab.onos.net.device.DeviceProviderService;
36 +import org.onlab.onos.net.device.PortDescription;
33 import org.onlab.onos.net.host.DefaultHostDescription; 37 import org.onlab.onos.net.host.DefaultHostDescription;
34 import org.onlab.onos.net.host.HostProvider; 38 import org.onlab.onos.net.host.HostProvider;
35 import org.onlab.onos.net.host.HostProviderRegistry; 39 import org.onlab.onos.net.host.HostProviderRegistry;
...@@ -45,7 +49,9 @@ import org.onlab.packet.MacAddress; ...@@ -45,7 +49,9 @@ import org.onlab.packet.MacAddress;
45 import org.onlab.packet.VlanId; 49 import org.onlab.packet.VlanId;
46 50
47 import java.net.URI; 51 import java.net.URI;
52 +import java.util.ArrayList;
48 import java.util.Iterator; 53 import java.util.Iterator;
54 +import java.util.List;
49 55
50 import static com.google.common.base.Preconditions.checkNotNull; 56 import static com.google.common.base.Preconditions.checkNotNull;
51 import static org.onlab.onos.net.DeviceId.deviceId; 57 import static org.onlab.onos.net.DeviceId.deviceId;
...@@ -120,7 +126,30 @@ class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider { ...@@ -120,7 +126,30 @@ class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider {
120 DeviceDescription desc = 126 DeviceDescription desc =
121 new DefaultDeviceDescription(uri, type, mfr, hw, sw, serial, 127 new DefaultDeviceDescription(uri, type, mfr, hw, sw, serial,
122 cid, annotations); 128 cid, annotations);
123 - dps.deviceConnected(deviceId(uri), desc); 129 + DeviceId deviceId = deviceId(uri);
130 + dps.deviceConnected(deviceId, desc);
131 +
132 + JsonNode ports = node.get("ports");
133 + if (ports != null) {
134 + parsePorts(dps, deviceId, ports);
135 + }
136 + }
137 +
138 + // Parses the given node with list of device ports.
139 + private void parsePorts(DeviceProviderService dps, DeviceId deviceId, JsonNode nodes) {
140 + List<PortDescription> ports = new ArrayList<>();
141 + for (JsonNode node : nodes) {
142 + ports.add(parsePort(node));
143 + }
144 + dps.updatePorts(deviceId, ports);
145 + }
146 +
147 + // Parses the given node with port information.
148 + private PortDescription parsePort(JsonNode node) {
149 + Port.Type type = Port.Type.valueOf(node.path("type").asText("COPPER"));
150 + return new DefaultPortDescription(portNumber(node.path("port").asLong(0)),
151 + node.path("enabled").asBoolean(true),
152 + type, node.path("speed").asLong(1_000));
124 } 153 }
125 154
126 // Parses the given JSON and provides links as configured. 155 // Parses the given JSON and provides links as configured.
......