Merge branch 'master' of ssh://gerrit.onlab.us:29418/onos-next
Showing
8 changed files
with
139 additions
and
52 deletions
... | @@ -16,7 +16,7 @@ import java.util.List; | ... | @@ -16,7 +16,7 @@ import java.util.List; |
16 | public class ClustersListCommand extends TopologyCommand { | 16 | public class ClustersListCommand extends TopologyCommand { |
17 | 17 | ||
18 | private static final String FMT = | 18 | private static final String FMT = |
19 | - "id=%s, devices=%d, links=%d"; | 19 | + "id=%d, devices=%d, links=%d"; |
20 | 20 | ||
21 | protected static final Comparator<TopologyCluster> ID_COMPARATOR = | 21 | protected static final Comparator<TopologyCluster> ID_COMPARATOR = |
22 | new Comparator<TopologyCluster>() { | 22 | new Comparator<TopologyCluster>() { |
... | @@ -33,7 +33,7 @@ public class ClustersListCommand extends TopologyCommand { | ... | @@ -33,7 +33,7 @@ public class ClustersListCommand extends TopologyCommand { |
33 | Collections.sort(clusters, ID_COMPARATOR); | 33 | Collections.sort(clusters, ID_COMPARATOR); |
34 | 34 | ||
35 | for (TopologyCluster cluster : clusters) { | 35 | for (TopologyCluster cluster : clusters) { |
36 | - print(FMT, cluster.id(), cluster.deviceCount(), cluster.linkCount()); | 36 | + print(FMT, cluster.id().index(), cluster.deviceCount(), cluster.linkCount()); |
37 | } | 37 | } |
38 | return null; | 38 | return null; |
39 | } | 39 | } | ... | ... |
... | @@ -189,8 +189,7 @@ public class SimpleTopologyManager | ... | @@ -189,8 +189,7 @@ public class SimpleTopologyManager |
189 | TopologyEvent event = store.updateTopology(provider().id(), | 189 | TopologyEvent event = store.updateTopology(provider().id(), |
190 | topoDescription, reasons); | 190 | topoDescription, reasons); |
191 | if (event != null) { | 191 | if (event != null) { |
192 | - log.info("Topology {} changed due to: {}", event.subject(), | 192 | + log.info("Topology {} changed", event.subject()); |
193 | - reasons == null ? "initial compute" : reasons); | ||
194 | eventDispatcher.post(event); | 193 | eventDispatcher.post(event); |
195 | } | 194 | } |
196 | } | 195 | } | ... | ... |
... | @@ -2,11 +2,20 @@ package org.onlab.onos.of.controller; | ... | @@ -2,11 +2,20 @@ package org.onlab.onos.of.controller; |
2 | 2 | ||
3 | import org.projectfloodlight.openflow.util.HexString; | 3 | import org.projectfloodlight.openflow.util.HexString; |
4 | 4 | ||
5 | +import java.net.URI; | ||
6 | +import java.net.URISyntaxException; | ||
7 | + | ||
8 | +import static com.google.common.base.Preconditions.checkArgument; | ||
9 | +import static org.onlab.util.Tools.fromHex; | ||
10 | +import static org.onlab.util.Tools.toHex; | ||
11 | + | ||
5 | /** | 12 | /** |
6 | * The class representing a network switch DPID. | 13 | * The class representing a network switch DPID. |
7 | * This class is immutable. | 14 | * This class is immutable. |
8 | */ | 15 | */ |
9 | public final class Dpid { | 16 | public final class Dpid { |
17 | + | ||
18 | + private static final String SCHEME = "of"; | ||
10 | private static final long UNKNOWN = 0; | 19 | private static final long UNKNOWN = 0; |
11 | private final long value; | 20 | private final long value; |
12 | 21 | ||
... | @@ -71,4 +80,40 @@ public final class Dpid { | ... | @@ -71,4 +80,40 @@ public final class Dpid { |
71 | hash += 31 * hash + (int) (value ^ value >>> 32); | 80 | hash += 31 * hash + (int) (value ^ value >>> 32); |
72 | return hash; | 81 | return hash; |
73 | } | 82 | } |
83 | + | ||
84 | + /** | ||
85 | + * Returns DPID created from the given device URI. | ||
86 | + * | ||
87 | + * @param uri device URI | ||
88 | + * @return dpid | ||
89 | + */ | ||
90 | + public static Dpid dpid(URI uri) { | ||
91 | + checkArgument(uri.getScheme().equals(SCHEME), "Unsupported URI scheme"); | ||
92 | + return new Dpid(fromHex(uri.getSchemeSpecificPart())); | ||
93 | + } | ||
94 | + | ||
95 | + /** | ||
96 | + * Produces device URI from the given DPID. | ||
97 | + * | ||
98 | + * @param dpid device dpid | ||
99 | + * @return device URI | ||
100 | + */ | ||
101 | + public static URI uri(Dpid dpid) { | ||
102 | + return uri(dpid.value); | ||
103 | + } | ||
104 | + | ||
105 | + /** | ||
106 | + * Produces device URI from the given DPID long. | ||
107 | + * | ||
108 | + * @param value device dpid as long | ||
109 | + * @return device URI | ||
110 | + */ | ||
111 | + public static URI uri(long value) { | ||
112 | + try { | ||
113 | + return new URI(SCHEME, toHex(value), null); | ||
114 | + } catch (URISyntaxException e) { | ||
115 | + return null; | ||
116 | + } | ||
117 | + } | ||
118 | + | ||
74 | } | 119 | } | ... | ... |
providers/of/device/src/main/java/org/onlab/onos/provider/of/device/impl/OpenFlowDeviceProvider.java
1 | package org.onlab.onos.provider.of.device.impl; | 1 | package org.onlab.onos.provider.of.device.impl; |
2 | 2 | ||
3 | -import static org.onlab.onos.net.DeviceId.deviceId; | ||
4 | -import static org.slf4j.LoggerFactory.getLogger; | ||
5 | - | ||
6 | -import java.net.URI; | ||
7 | -import java.net.URISyntaxException; | ||
8 | -import java.util.ArrayList; | ||
9 | -import java.util.List; | ||
10 | - | ||
11 | import org.apache.felix.scr.annotations.Activate; | 3 | import org.apache.felix.scr.annotations.Activate; |
12 | import org.apache.felix.scr.annotations.Component; | 4 | import org.apache.felix.scr.annotations.Component; |
13 | import org.apache.felix.scr.annotations.Deactivate; | 5 | import org.apache.felix.scr.annotations.Deactivate; |
... | @@ -37,6 +29,14 @@ import org.projectfloodlight.openflow.protocol.OFPortState; | ... | @@ -37,6 +29,14 @@ import org.projectfloodlight.openflow.protocol.OFPortState; |
37 | import org.projectfloodlight.openflow.protocol.OFPortStatus; | 29 | import org.projectfloodlight.openflow.protocol.OFPortStatus; |
38 | import org.slf4j.Logger; | 30 | import org.slf4j.Logger; |
39 | 31 | ||
32 | +import java.util.ArrayList; | ||
33 | +import java.util.List; | ||
34 | + | ||
35 | +import static org.onlab.onos.net.DeviceId.deviceId; | ||
36 | +import static org.onlab.onos.of.controller.Dpid.dpid; | ||
37 | +import static org.onlab.onos.of.controller.Dpid.uri; | ||
38 | +import static org.slf4j.LoggerFactory.getLogger; | ||
39 | + | ||
40 | /** | 40 | /** |
41 | * Provider which uses an OpenFlow controller to detect network | 41 | * Provider which uses an OpenFlow controller to detect network |
42 | * infrastructure devices. | 42 | * infrastructure devices. |
... | @@ -76,8 +76,7 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr | ... | @@ -76,8 +76,7 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr |
76 | @Deactivate | 76 | @Deactivate |
77 | public void deactivate() { | 77 | public void deactivate() { |
78 | for (OpenFlowSwitch sw : controller.getSwitches()) { | 78 | for (OpenFlowSwitch sw : controller.getSwitches()) { |
79 | - providerService.deviceDisconnected(DeviceId.deviceId("of:" | 79 | + providerService.deviceDisconnected(DeviceId.deviceId(uri(sw.getId()))); |
80 | - + Long.toHexString(sw.getId()))); | ||
81 | } | 80 | } |
82 | providerRegistry.unregister(this); | 81 | providerRegistry.unregister(this); |
83 | controller.removeListener(listener); | 82 | controller.removeListener(listener); |
... | @@ -95,16 +94,13 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr | ... | @@ -95,16 +94,13 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr |
95 | public void roleChanged(Device device, MastershipRole newRole) { | 94 | public void roleChanged(Device device, MastershipRole newRole) { |
96 | switch (newRole) { | 95 | switch (newRole) { |
97 | case MASTER: | 96 | case MASTER: |
98 | - controller.setRole(new Dpid(device.id().uri().getSchemeSpecificPart()), | 97 | + controller.setRole(dpid(device.id().uri()), RoleState.MASTER); |
99 | - RoleState.MASTER); | ||
100 | break; | 98 | break; |
101 | case STANDBY: | 99 | case STANDBY: |
102 | - controller.setRole(new Dpid(device.id().uri().getSchemeSpecificPart()), | 100 | + controller.setRole(dpid(device.id().uri()), RoleState.EQUAL); |
103 | - RoleState.EQUAL); | ||
104 | break; | 101 | break; |
105 | case NONE: | 102 | case NONE: |
106 | - controller.setRole(new Dpid(device.id().uri().getSchemeSpecificPart()), | 103 | + controller.setRole(dpid(device.id().uri()), RoleState.SLAVE); |
107 | - RoleState.SLAVE); | ||
108 | break; | 104 | break; |
109 | default: | 105 | default: |
110 | LOG.error("Unknown Mastership state : {}", newRole); | 106 | LOG.error("Unknown Mastership state : {}", newRole); |
... | @@ -119,17 +115,17 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr | ... | @@ -119,17 +115,17 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr |
119 | if (providerService == null) { | 115 | if (providerService == null) { |
120 | return; | 116 | return; |
121 | } | 117 | } |
122 | - URI uri = buildURI(dpid); | 118 | + DeviceId did = deviceId(uri(dpid)); |
123 | OpenFlowSwitch sw = controller.getSwitch(dpid); | 119 | OpenFlowSwitch sw = controller.getSwitch(dpid); |
124 | 120 | ||
125 | DeviceDescription description = | 121 | DeviceDescription description = |
126 | - new DefaultDeviceDescription(buildURI(dpid), Device.Type.SWITCH, | 122 | + new DefaultDeviceDescription(did.uri(), Device.Type.SWITCH, |
127 | sw.manfacturerDescription(), | 123 | sw.manfacturerDescription(), |
128 | sw.hardwareDescription(), | 124 | sw.hardwareDescription(), |
129 | sw.softwareDescription(), | 125 | sw.softwareDescription(), |
130 | sw.serialNumber()); | 126 | sw.serialNumber()); |
131 | - providerService.deviceConnected(deviceId(uri), description); | 127 | + providerService.deviceConnected(did, description); |
132 | - providerService.updatePorts(deviceId(uri), buildPortDescriptions(sw.getPorts())); | 128 | + providerService.updatePorts(did, buildPortDescriptions(sw.getPorts())); |
133 | } | 129 | } |
134 | 130 | ||
135 | @Override | 131 | @Override |
... | @@ -137,31 +133,13 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr | ... | @@ -137,31 +133,13 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr |
137 | if (providerService == null) { | 133 | if (providerService == null) { |
138 | return; | 134 | return; |
139 | } | 135 | } |
140 | - URI uri = buildURI(dpid); | 136 | + providerService.deviceDisconnected(deviceId(uri(dpid))); |
141 | - providerService.deviceDisconnected(deviceId(uri)); | ||
142 | } | 137 | } |
143 | 138 | ||
144 | @Override | 139 | @Override |
145 | public void portChanged(Dpid dpid, OFPortStatus status) { | 140 | public void portChanged(Dpid dpid, OFPortStatus status) { |
146 | - final PortDescription portDescription = buildPortDescription(status.getDesc()); | 141 | + PortDescription portDescription = buildPortDescription(status.getDesc()); |
147 | - final URI uri = buildURI(dpid); | 142 | + providerService.portStatusChanged(deviceId(uri(dpid)), portDescription); |
148 | - providerService.portStatusChanged(deviceId(uri), portDescription); | ||
149 | - } | ||
150 | - | ||
151 | - /** | ||
152 | - * Given a dpid builds a URI for the device. | ||
153 | - * | ||
154 | - * @param dpid the dpid to build the uri from | ||
155 | - * @return returns a uri of the form of:<dpidHexForm> | ||
156 | - */ | ||
157 | - private URI buildURI(Dpid dpid) { | ||
158 | - URI uri = null; | ||
159 | - try { | ||
160 | - uri = new URI("of", Long.toHexString(dpid.value()), null); | ||
161 | - } catch (URISyntaxException e) { | ||
162 | - LOG.warn("URI construction for device {} failed.", dpid); | ||
163 | - } | ||
164 | - return uri; | ||
165 | } | 143 | } |
166 | 144 | ||
167 | /** | 145 | /** |
... | @@ -172,7 +150,7 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr | ... | @@ -172,7 +150,7 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr |
172 | */ | 150 | */ |
173 | private List<PortDescription> buildPortDescriptions( | 151 | private List<PortDescription> buildPortDescriptions( |
174 | List<OFPortDesc> ports) { | 152 | List<OFPortDesc> ports) { |
175 | - final List<PortDescription> portDescs = new ArrayList<PortDescription>(); | 153 | + final List<PortDescription> portDescs = new ArrayList<>(); |
176 | for (OFPortDesc port : ports) { | 154 | for (OFPortDesc port : ports) { |
177 | portDescs.add(buildPortDescription(port)); | 155 | portDescs.add(buildPortDescription(port)); |
178 | } | 156 | } | ... | ... |
... | @@ -15,6 +15,7 @@ | ... | @@ -15,6 +15,7 @@ |
15 | ******************************************************************************/ | 15 | ******************************************************************************/ |
16 | package org.onlab.onos.provider.of.link.impl; | 16 | package org.onlab.onos.provider.of.link.impl; |
17 | 17 | ||
18 | +import static org.onlab.onos.of.controller.Dpid.uri; | ||
18 | import static org.slf4j.LoggerFactory.getLogger; | 19 | import static org.slf4j.LoggerFactory.getLogger; |
19 | 20 | ||
20 | import java.util.Collections; | 21 | import java.util.Collections; |
... | @@ -188,7 +189,7 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -188,7 +189,7 @@ public class LinkDiscovery implements TimerTask { |
188 | } | 189 | } |
189 | } | 190 | } |
190 | ConnectPoint cp = new ConnectPoint( | 191 | ConnectPoint cp = new ConnectPoint( |
191 | - DeviceId.deviceId("of:" + Long.toHexString(sw.getId())), | 192 | + DeviceId.deviceId(uri(sw.getId())), |
192 | PortNumber.portNumber(port.getPortNo().getPortNumber())); | 193 | PortNumber.portNumber(port.getPortNo().getPortNumber())); |
193 | linkProvider.linksVanished(cp); | 194 | linkProvider.linksVanished(cp); |
194 | 195 | ||
... | @@ -228,7 +229,6 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -228,7 +229,6 @@ public class LinkDiscovery implements TimerTask { |
228 | * | 229 | * |
229 | * @param port the port | 230 | * @param port the port |
230 | * @return Packet_out message with LLDP data | 231 | * @return Packet_out message with LLDP data |
231 | - * @throws PortMappingException | ||
232 | */ | 232 | */ |
233 | private OFPacketOut createLLDPPacketOut(final OFPortDesc port) { | 233 | private OFPacketOut createLLDPPacketOut(final OFPortDesc port) { |
234 | OFPacketOut.Builder packetOut = this.ofFactory.buildPacketOut(); | 234 | OFPacketOut.Builder packetOut = this.ofFactory.buildPacketOut(); |
... | @@ -249,7 +249,6 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -249,7 +249,6 @@ public class LinkDiscovery implements TimerTask { |
249 | * | 249 | * |
250 | * @param port the port | 250 | * @param port the port |
251 | * @return Packet_out message with LLDP data | 251 | * @return Packet_out message with LLDP data |
252 | - * @throws PortMappingException | ||
253 | */ | 252 | */ |
254 | private OFPacketOut createBDDPPacketOut(final OFPortDesc port) { | 253 | private OFPacketOut createBDDPPacketOut(final OFPortDesc port) { |
255 | OFPacketOut.Builder packetOut = sw.factory().buildPacketOut(); | 254 | OFPacketOut.Builder packetOut = sw.factory().buildPacketOut(); |
... | @@ -295,11 +294,11 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -295,11 +294,11 @@ public class LinkDiscovery implements TimerTask { |
295 | } | 294 | } |
296 | this.ackProbe(srcPort); | 295 | this.ackProbe(srcPort); |
297 | ConnectPoint src = new ConnectPoint( | 296 | ConnectPoint src = new ConnectPoint( |
298 | - DeviceId.deviceId("of:" + Long.toHexString(srcSwitch.getId())), | 297 | + DeviceId.deviceId(uri(srcSwitch.getId())), |
299 | PortNumber.portNumber(srcPort)); | 298 | PortNumber.portNumber(srcPort)); |
300 | 299 | ||
301 | ConnectPoint dst = new ConnectPoint( | 300 | ConnectPoint dst = new ConnectPoint( |
302 | - DeviceId.deviceId("of:" + Long.toHexString(sw.getId())), | 301 | + DeviceId.deviceId(uri(sw.getId())), |
303 | PortNumber.portNumber(dstPort)); | 302 | PortNumber.portNumber(dstPort)); |
304 | LinkDescription ld; | 303 | LinkDescription ld; |
305 | if (ethType == Ethernet.TYPE_BSN) { | 304 | if (ethType == Ethernet.TYPE_BSN) { |
... | @@ -357,7 +356,7 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -357,7 +356,7 @@ public class LinkDiscovery implements TimerTask { |
357 | final OFPortDesc srcPort = port; | 356 | final OFPortDesc srcPort = port; |
358 | 357 | ||
359 | ConnectPoint cp = new ConnectPoint( | 358 | ConnectPoint cp = new ConnectPoint( |
360 | - DeviceId.deviceId("of:" + Long.toHexString(sw.getId())), | 359 | + DeviceId.deviceId(uri(sw.getId())), |
361 | PortNumber.portNumber(srcPort.getPortNo().getPortNumber())); | 360 | PortNumber.portNumber(srcPort.getPortNo().getPortNumber())); |
362 | linkProvider.linksVanished(cp); | 361 | linkProvider.linksVanished(cp); |
363 | } | 362 | } | ... | ... |
1 | package org.onlab.util; | 1 | package org.onlab.util; |
2 | 2 | ||
3 | +import com.google.common.base.Strings; | ||
4 | +import com.google.common.primitives.UnsignedLongs; | ||
3 | import com.google.common.util.concurrent.ThreadFactoryBuilder; | 5 | import com.google.common.util.concurrent.ThreadFactoryBuilder; |
4 | 6 | ||
5 | import java.util.concurrent.ThreadFactory; | 7 | import java.util.concurrent.ThreadFactory; |
... | @@ -20,4 +22,34 @@ public abstract class Tools { | ... | @@ -20,4 +22,34 @@ public abstract class Tools { |
20 | return new ThreadFactoryBuilder().setNameFormat(pattern).build(); | 22 | return new ThreadFactoryBuilder().setNameFormat(pattern).build(); |
21 | } | 23 | } |
22 | 24 | ||
25 | + /** | ||
26 | + * Converts a string from hex to long. | ||
27 | + * | ||
28 | + * @param string hex number in string form; sans 0x | ||
29 | + * @return long value | ||
30 | + */ | ||
31 | + public static long fromHex(String string) { | ||
32 | + return UnsignedLongs.parseUnsignedLong(string, 16); | ||
33 | + } | ||
34 | + | ||
35 | + /** | ||
36 | + * Converts a long value to hex string; 16 wide and sans 0x. | ||
37 | + * | ||
38 | + * @param value long value | ||
39 | + * @return hex string | ||
40 | + */ | ||
41 | + public static String toHex(long value) { | ||
42 | + return Strings.padStart(UnsignedLongs.toString(value, 16), 16, '0'); | ||
43 | + } | ||
44 | + | ||
45 | + /** | ||
46 | + * Converts a long value to hex string; 16 wide and sans 0x. | ||
47 | + * | ||
48 | + * @param value long value | ||
49 | + * @param width string width; zero padded | ||
50 | + * @return hex string | ||
51 | + */ | ||
52 | + public static String toHex(long value, int width) { | ||
53 | + return Strings.padStart(UnsignedLongs.toString(value, 16), width, '0'); | ||
54 | + } | ||
23 | } | 55 | } | ... | ... |
1 | +package org.onlab.util; | ||
2 | + | ||
3 | +import org.junit.Test; | ||
4 | + | ||
5 | +import static org.junit.Assert.*; | ||
6 | + | ||
7 | +/** | ||
8 | + * Test of the miscellaneous tools. | ||
9 | + */ | ||
10 | +public class ToolsTest { | ||
11 | + | ||
12 | + @Test | ||
13 | + public void fromHex() throws Exception { | ||
14 | + assertEquals(15, Tools.fromHex("0f")); | ||
15 | + assertEquals(16, Tools.fromHex("10")); | ||
16 | + assertEquals(65535, Tools.fromHex("ffff")); | ||
17 | + assertEquals(4096, Tools.fromHex("1000")); | ||
18 | + assertEquals(0xffffffffffffffffL, Tools.fromHex("ffffffffffffffff")); | ||
19 | + } | ||
20 | + | ||
21 | + @Test | ||
22 | + public void toHex() throws Exception { | ||
23 | + assertEquals("0f", Tools.toHex(15, 2)); | ||
24 | + assertEquals("ffff", Tools.toHex(65535, 4)); | ||
25 | + assertEquals("1000", Tools.toHex(4096, 4)); | ||
26 | + assertEquals("000000000000000f", Tools.toHex(15)); | ||
27 | + assertEquals("ffffffffffffffff", Tools.toHex(0xffffffffffffffffL)); | ||
28 | + | ||
29 | + } | ||
30 | +} |
-
Please register or login to post a comment