blob: a08bc20fb7566897f70eb661a3602b62660467ee [file] [log] [blame]
Thomas Vachuska781d18b2014-10-27 10:31:25 -07001/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070019package org.onlab.onos.provider.of.host.impl;
20
alshabib7b2748f2014-09-16 20:21:11 -070021import static org.junit.Assert.assertEquals;
22import static org.junit.Assert.assertNotNull;
23import static org.junit.Assert.assertNull;
24
25import java.util.Set;
26
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070027import org.junit.After;
28import org.junit.Before;
29import org.junit.Test;
30import org.onlab.onos.net.ConnectPoint;
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070031import org.onlab.onos.net.HostId;
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070032import org.onlab.onos.net.host.HostDescription;
33import org.onlab.onos.net.host.HostProvider;
34import org.onlab.onos.net.host.HostProviderRegistry;
35import org.onlab.onos.net.host.HostProviderService;
36import org.onlab.onos.net.provider.AbstractProviderService;
37import org.onlab.onos.net.provider.ProviderId;
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070038import org.onlab.onos.net.topology.Topology;
tom61359e92014-09-16 15:50:27 -070039import org.onlab.onos.net.topology.TopologyServiceAdapter;
tom9c94c5b2014-09-17 13:14:42 -070040import org.onlab.onos.openflow.controller.Dpid;
41import org.onlab.onos.openflow.controller.OpenFlowPacketContext;
42import org.onlab.onos.openflow.controller.OpenflowControllerAdapter;
43import org.onlab.onos.openflow.controller.PacketListener;
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070044import org.onlab.packet.ARP;
45import org.onlab.packet.Ethernet;
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070046import org.onlab.packet.MacAddress;
47import org.onlab.packet.VlanId;
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070048import org.projectfloodlight.openflow.protocol.OFMessage;
49import org.projectfloodlight.openflow.types.OFPort;
50
51public class OpenFlowHostProviderTest {
52
53 private static final Integer INPORT = 10;
54 private static final Dpid DPID1 = new Dpid(100);
55 private static final Dpid DPID2 = new Dpid(200);
56 private static final Dpid DPID3 = new Dpid(300);
57
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070058 private static final VlanId VLAN = VlanId.vlanId();
59 private static final MacAddress MAC = MacAddress.valueOf("00:00:11:00:00:01");
60 private static final MacAddress BCMAC = MacAddress.valueOf("ff:ff:ff:ff:ff:ff");
tom43526fc2014-09-16 15:12:22 -070061 private static final byte[] IP = new byte[]{10, 0, 0, 1};
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070062
alshabib7b2748f2014-09-16 20:21:11 -070063 private final OpenFlowHostProvider provider = new OpenFlowHostProvider();
64 private final TestHostRegistry hostService = new TestHostRegistry();
65 private final TestController controller = new TestController();
66 private final TestTopologyService topoService = new TestTopologyService();
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070067 private TestHostProviderService providerService;
68
69 @Before
70 public void setUp() {
71 provider.providerRegistry = hostService;
72 provider.controller = controller;
73 provider.topologyService = topoService;
74 provider.activate();
75 }
76
77 @Test
78 public void basics() {
79 assertNotNull("registration expected", providerService);
80 assertEquals("incorrect provider", provider, providerService.provider());
81 }
82
83 @Test
84 public void events() {
85 // new host
86 controller.processPacket(DPID1, null);
87 assertNotNull("new host expected", providerService.added);
88 assertNull("host motion unexpected", providerService.moved);
89
90 // the host moved to new switch
91 controller.processPacket(DPID2, null);
92 assertNotNull("host motion expected", providerService.moved);
93
94 // the host was misheard on a spine
95 controller.processPacket(DPID3, null);
96 assertNull("host misheard on spine switch", providerService.spine);
97 }
98
99 @After
100 public void tearDown() {
101 provider.deactivate();
102 provider.providerRegistry = null;
103 provider.controller = null;
104 }
105
106 private class TestHostRegistry implements HostProviderRegistry {
107
108 @Override
109 public HostProviderService register(HostProvider provider) {
110 providerService = new TestHostProviderService(provider);
111 return providerService;
112 }
113
114 @Override
115 public void unregister(HostProvider provider) {
116 }
117
118 @Override
119 public Set<ProviderId> getProviders() {
120 return null;
121 }
122
123 }
124
125 private class TestHostProviderService
alshabib7b2748f2014-09-16 20:21:11 -0700126 extends AbstractProviderService<HostProvider>
127 implements HostProviderService {
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700128
129 Dpid added = null;
130 Dpid moved = null;
131 Dpid spine = null;
132
133 protected TestHostProviderService(HostProvider provider) {
134 super(provider);
135 }
136
137 @Override
138 public void hostDetected(HostId hostId, HostDescription hostDescription) {
139 Dpid descr = Dpid.dpid(hostDescription.location().deviceId().uri());
140 if (added == null) {
141 added = descr;
142 } else if ((moved == null) && !descr.equals(added)) {
143 moved = descr;
144 } else {
145 spine = descr;
146 }
147 }
148
149 @Override
150 public void hostVanished(HostId hostId) {
151 }
152
153 }
154
tom61359e92014-09-16 15:50:27 -0700155 private class TestController extends OpenflowControllerAdapter {
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700156 PacketListener pktListener;
157
158 @Override
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700159 public void addPacketListener(int priority, PacketListener listener) {
160 pktListener = listener;
161 }
162
163 @Override
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700164 public void processPacket(Dpid dpid, OFMessage msg) {
tom61359e92014-09-16 15:50:27 -0700165 OpenFlowPacketContext ctx = new TestPacketContext(dpid);
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700166 pktListener.handlePacket(ctx);
167 }
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700168 }
169
tom61359e92014-09-16 15:50:27 -0700170 private class TestTopologyService extends TopologyServiceAdapter {
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700171 @Override
172 public boolean isInfrastructure(Topology topology,
alshabib7b2748f2014-09-16 20:21:11 -0700173 ConnectPoint connectPoint) {
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700174 //simulate DPID3 as an infrastructure switch
175 if (Dpid.dpid(connectPoint.deviceId().uri()).equals(DPID3)) {
176 return true;
177 }
178 return false;
179 }
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700180 }
181
182 private class TestPacketContext implements OpenFlowPacketContext {
183
184 protected Dpid swid;
185
186 public TestPacketContext(Dpid dpid) {
187 swid = dpid;
188 }
189
190 @Override
alshabib7b2748f2014-09-16 20:21:11 -0700191 public boolean block() {
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700192 return false;
193 }
194
195 @Override
196 public void send() {
197 }
198
199 @Override
200 public void build(OFPort outPort) {
201 }
202
203 @Override
204 public void build(Ethernet ethFrame, OFPort outPort) {
205 }
206
207 @Override
208 public Ethernet parsed() {
209 // just things we (and serializers) need
210 ARP arp = new ARP();
211 arp.setSenderProtocolAddress(IP)
alshabib7b2748f2014-09-16 20:21:11 -0700212 .setSenderHardwareAddress(MAC.toBytes())
213 .setTargetHardwareAddress(BCMAC.toBytes())
214 .setTargetProtocolAddress(IP);
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700215
216 Ethernet eth = new Ethernet();
217 eth.setEtherType(Ethernet.TYPE_ARP)
alshabib7b2748f2014-09-16 20:21:11 -0700218 .setVlanID(VLAN.toShort())
219 .setSourceMACAddress(MAC.toBytes())
220 .setDestinationMACAddress(BCMAC.getAddress())
221 .setPayload(arp);
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700222
223 return eth;
224 }
225
226 @Override
227 public byte[] unparsed() {
228 return null;
229 }
230
231 @Override
232 public Dpid dpid() {
233 return swid;
234 }
235
236 @Override
237 public Integer inPort() {
238 return INPORT;
239 }
240
alshabib7b2748f2014-09-16 20:21:11 -0700241 @Override
242 public boolean isHandled() {
243 return false;
244 }
245
alshabibe9d3a322014-09-23 15:18:33 -0700246 @Override
247 public boolean isBuffered() {
248 return false;
249 }
250
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700251 }
252}