blob: ea8db19657f86e37ad6afea77d76dc9b27052e4d [file] [log] [blame]
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -07001package org.onlab.onos.provider.of.host.impl;
2
alshabib7b2748f2014-09-16 20:21:11 -07003import static org.junit.Assert.assertEquals;
4import static org.junit.Assert.assertNotNull;
5import static org.junit.Assert.assertNull;
6
7import java.util.Set;
8
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -07009import org.junit.After;
10import org.junit.Before;
11import org.junit.Test;
12import org.onlab.onos.net.ConnectPoint;
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070013import org.onlab.onos.net.HostId;
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070014import org.onlab.onos.net.host.HostDescription;
15import org.onlab.onos.net.host.HostProvider;
16import org.onlab.onos.net.host.HostProviderRegistry;
17import org.onlab.onos.net.host.HostProviderService;
18import org.onlab.onos.net.provider.AbstractProviderService;
19import org.onlab.onos.net.provider.ProviderId;
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070020import org.onlab.onos.net.topology.Topology;
tom61359e92014-09-16 15:50:27 -070021import org.onlab.onos.net.topology.TopologyServiceAdapter;
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070022import org.onlab.onos.of.controller.Dpid;
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070023import org.onlab.onos.of.controller.OpenFlowPacketContext;
tom61359e92014-09-16 15:50:27 -070024import org.onlab.onos.of.controller.OpenflowControllerAdapter;
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070025import org.onlab.onos.of.controller.PacketListener;
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070026import org.onlab.packet.ARP;
27import org.onlab.packet.Ethernet;
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070028import org.onlab.packet.MacAddress;
29import org.onlab.packet.VlanId;
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070030import org.projectfloodlight.openflow.protocol.OFMessage;
31import org.projectfloodlight.openflow.types.OFPort;
32
33public class OpenFlowHostProviderTest {
34
35 private static final Integer INPORT = 10;
36 private static final Dpid DPID1 = new Dpid(100);
37 private static final Dpid DPID2 = new Dpid(200);
38 private static final Dpid DPID3 = new Dpid(300);
39
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070040 private static final VlanId VLAN = VlanId.vlanId();
41 private static final MacAddress MAC = MacAddress.valueOf("00:00:11:00:00:01");
42 private static final MacAddress BCMAC = MacAddress.valueOf("ff:ff:ff:ff:ff:ff");
tom43526fc2014-09-16 15:12:22 -070043 private static final byte[] IP = new byte[]{10, 0, 0, 1};
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070044
alshabib7b2748f2014-09-16 20:21:11 -070045 private final OpenFlowHostProvider provider = new OpenFlowHostProvider();
46 private final TestHostRegistry hostService = new TestHostRegistry();
47 private final TestController controller = new TestController();
48 private final TestTopologyService topoService = new TestTopologyService();
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070049 private TestHostProviderService providerService;
50
51 @Before
52 public void setUp() {
53 provider.providerRegistry = hostService;
54 provider.controller = controller;
55 provider.topologyService = topoService;
56 provider.activate();
57 }
58
59 @Test
60 public void basics() {
61 assertNotNull("registration expected", providerService);
62 assertEquals("incorrect provider", provider, providerService.provider());
63 }
64
65 @Test
66 public void events() {
67 // new host
68 controller.processPacket(DPID1, null);
69 assertNotNull("new host expected", providerService.added);
70 assertNull("host motion unexpected", providerService.moved);
71
72 // the host moved to new switch
73 controller.processPacket(DPID2, null);
74 assertNotNull("host motion expected", providerService.moved);
75
76 // the host was misheard on a spine
77 controller.processPacket(DPID3, null);
78 assertNull("host misheard on spine switch", providerService.spine);
79 }
80
81 @After
82 public void tearDown() {
83 provider.deactivate();
84 provider.providerRegistry = null;
85 provider.controller = null;
86 }
87
88 private class TestHostRegistry implements HostProviderRegistry {
89
90 @Override
91 public HostProviderService register(HostProvider provider) {
92 providerService = new TestHostProviderService(provider);
93 return providerService;
94 }
95
96 @Override
97 public void unregister(HostProvider provider) {
98 }
99
100 @Override
101 public Set<ProviderId> getProviders() {
102 return null;
103 }
104
105 }
106
107 private class TestHostProviderService
alshabib7b2748f2014-09-16 20:21:11 -0700108 extends AbstractProviderService<HostProvider>
109 implements HostProviderService {
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700110
111 Dpid added = null;
112 Dpid moved = null;
113 Dpid spine = null;
114
115 protected TestHostProviderService(HostProvider provider) {
116 super(provider);
117 }
118
119 @Override
120 public void hostDetected(HostId hostId, HostDescription hostDescription) {
121 Dpid descr = Dpid.dpid(hostDescription.location().deviceId().uri());
122 if (added == null) {
123 added = descr;
124 } else if ((moved == null) && !descr.equals(added)) {
125 moved = descr;
126 } else {
127 spine = descr;
128 }
129 }
130
131 @Override
132 public void hostVanished(HostId hostId) {
133 }
134
135 }
136
tom61359e92014-09-16 15:50:27 -0700137 private class TestController extends OpenflowControllerAdapter {
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700138 PacketListener pktListener;
139
140 @Override
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700141 public void addPacketListener(int priority, PacketListener listener) {
142 pktListener = listener;
143 }
144
145 @Override
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700146 public void processPacket(Dpid dpid, OFMessage msg) {
tom61359e92014-09-16 15:50:27 -0700147 OpenFlowPacketContext ctx = new TestPacketContext(dpid);
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700148 pktListener.handlePacket(ctx);
149 }
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700150 }
151
tom61359e92014-09-16 15:50:27 -0700152 private class TestTopologyService extends TopologyServiceAdapter {
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700153 @Override
154 public boolean isInfrastructure(Topology topology,
alshabib7b2748f2014-09-16 20:21:11 -0700155 ConnectPoint connectPoint) {
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700156 //simulate DPID3 as an infrastructure switch
157 if (Dpid.dpid(connectPoint.deviceId().uri()).equals(DPID3)) {
158 return true;
159 }
160 return false;
161 }
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700162 }
163
164 private class TestPacketContext implements OpenFlowPacketContext {
165
166 protected Dpid swid;
167
168 public TestPacketContext(Dpid dpid) {
169 swid = dpid;
170 }
171
172 @Override
alshabib7b2748f2014-09-16 20:21:11 -0700173 public boolean block() {
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700174 return false;
175 }
176
177 @Override
178 public void send() {
179 }
180
181 @Override
182 public void build(OFPort outPort) {
183 }
184
185 @Override
186 public void build(Ethernet ethFrame, OFPort outPort) {
187 }
188
189 @Override
190 public Ethernet parsed() {
191 // just things we (and serializers) need
192 ARP arp = new ARP();
193 arp.setSenderProtocolAddress(IP)
alshabib7b2748f2014-09-16 20:21:11 -0700194 .setSenderHardwareAddress(MAC.toBytes())
195 .setTargetHardwareAddress(BCMAC.toBytes())
196 .setTargetProtocolAddress(IP);
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700197
198 Ethernet eth = new Ethernet();
199 eth.setEtherType(Ethernet.TYPE_ARP)
alshabib7b2748f2014-09-16 20:21:11 -0700200 .setVlanID(VLAN.toShort())
201 .setSourceMACAddress(MAC.toBytes())
202 .setDestinationMACAddress(BCMAC.getAddress())
203 .setPayload(arp);
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700204
205 return eth;
206 }
207
208 @Override
209 public byte[] unparsed() {
210 return null;
211 }
212
213 @Override
214 public Dpid dpid() {
215 return swid;
216 }
217
218 @Override
219 public Integer inPort() {
220 return INPORT;
221 }
222
alshabib7b2748f2014-09-16 20:21:11 -0700223 @Override
224 public boolean isHandled() {
225 return false;
226 }
227
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700228 }
229}