blob: d227116fdb08f50192c94ad3fa30b2ee17b040cc [file] [log] [blame]
Thomas Vachuska781d18b2014-10-27 10:31:25 -07001/*
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07002 * Copyright 2014 Open Networking Laboratory
Thomas Vachuska781d18b2014-10-27 10:31:25 -07003 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07004 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
Thomas Vachuska781d18b2014-10-27 10:31:25 -07007 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07008 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
Thomas Vachuska781d18b2014-10-27 10:31:25 -070015 */
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070016package org.onlab.onos.provider.of.host.impl;
17
alshabib7b2748f2014-09-16 20:21:11 -070018import static org.junit.Assert.assertEquals;
19import static org.junit.Assert.assertNotNull;
20import static org.junit.Assert.assertNull;
21
22import java.util.Set;
23
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070024import org.junit.After;
25import org.junit.Before;
26import org.junit.Test;
27import org.onlab.onos.net.ConnectPoint;
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070028import org.onlab.onos.net.HostId;
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070029import org.onlab.onos.net.host.HostDescription;
30import org.onlab.onos.net.host.HostProvider;
31import org.onlab.onos.net.host.HostProviderRegistry;
32import org.onlab.onos.net.host.HostProviderService;
33import org.onlab.onos.net.provider.AbstractProviderService;
34import org.onlab.onos.net.provider.ProviderId;
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070035import org.onlab.onos.net.topology.Topology;
tom61359e92014-09-16 15:50:27 -070036import org.onlab.onos.net.topology.TopologyServiceAdapter;
tom9c94c5b2014-09-17 13:14:42 -070037import org.onlab.onos.openflow.controller.Dpid;
38import org.onlab.onos.openflow.controller.OpenFlowPacketContext;
39import org.onlab.onos.openflow.controller.OpenflowControllerAdapter;
40import org.onlab.onos.openflow.controller.PacketListener;
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070041import org.onlab.packet.ARP;
42import org.onlab.packet.Ethernet;
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070043import org.onlab.packet.MacAddress;
44import org.onlab.packet.VlanId;
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070045import org.projectfloodlight.openflow.protocol.OFMessage;
46import org.projectfloodlight.openflow.types.OFPort;
47
48public class OpenFlowHostProviderTest {
49
50 private static final Integer INPORT = 10;
51 private static final Dpid DPID1 = new Dpid(100);
52 private static final Dpid DPID2 = new Dpid(200);
53 private static final Dpid DPID3 = new Dpid(300);
54
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070055 private static final VlanId VLAN = VlanId.vlanId();
56 private static final MacAddress MAC = MacAddress.valueOf("00:00:11:00:00:01");
57 private static final MacAddress BCMAC = MacAddress.valueOf("ff:ff:ff:ff:ff:ff");
tom43526fc2014-09-16 15:12:22 -070058 private static final byte[] IP = new byte[]{10, 0, 0, 1};
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070059
alshabib7b2748f2014-09-16 20:21:11 -070060 private final OpenFlowHostProvider provider = new OpenFlowHostProvider();
61 private final TestHostRegistry hostService = new TestHostRegistry();
62 private final TestController controller = new TestController();
63 private final TestTopologyService topoService = new TestTopologyService();
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -070064 private TestHostProviderService providerService;
65
66 @Before
67 public void setUp() {
68 provider.providerRegistry = hostService;
69 provider.controller = controller;
70 provider.topologyService = topoService;
71 provider.activate();
72 }
73
74 @Test
75 public void basics() {
76 assertNotNull("registration expected", providerService);
77 assertEquals("incorrect provider", provider, providerService.provider());
78 }
79
80 @Test
81 public void events() {
82 // new host
83 controller.processPacket(DPID1, null);
84 assertNotNull("new host expected", providerService.added);
85 assertNull("host motion unexpected", providerService.moved);
86
87 // the host moved to new switch
88 controller.processPacket(DPID2, null);
89 assertNotNull("host motion expected", providerService.moved);
90
91 // the host was misheard on a spine
92 controller.processPacket(DPID3, null);
93 assertNull("host misheard on spine switch", providerService.spine);
94 }
95
96 @After
97 public void tearDown() {
98 provider.deactivate();
99 provider.providerRegistry = null;
100 provider.controller = null;
101 }
102
103 private class TestHostRegistry implements HostProviderRegistry {
104
105 @Override
106 public HostProviderService register(HostProvider provider) {
107 providerService = new TestHostProviderService(provider);
108 return providerService;
109 }
110
111 @Override
112 public void unregister(HostProvider provider) {
113 }
114
115 @Override
116 public Set<ProviderId> getProviders() {
117 return null;
118 }
119
120 }
121
122 private class TestHostProviderService
alshabib7b2748f2014-09-16 20:21:11 -0700123 extends AbstractProviderService<HostProvider>
124 implements HostProviderService {
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700125
126 Dpid added = null;
127 Dpid moved = null;
128 Dpid spine = null;
129
130 protected TestHostProviderService(HostProvider provider) {
131 super(provider);
132 }
133
134 @Override
135 public void hostDetected(HostId hostId, HostDescription hostDescription) {
136 Dpid descr = Dpid.dpid(hostDescription.location().deviceId().uri());
137 if (added == null) {
138 added = descr;
139 } else if ((moved == null) && !descr.equals(added)) {
140 moved = descr;
141 } else {
142 spine = descr;
143 }
144 }
145
146 @Override
147 public void hostVanished(HostId hostId) {
148 }
149
150 }
151
tom61359e92014-09-16 15:50:27 -0700152 private class TestController extends OpenflowControllerAdapter {
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700153 PacketListener pktListener;
154
155 @Override
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700156 public void addPacketListener(int priority, PacketListener listener) {
157 pktListener = listener;
158 }
159
160 @Override
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700161 public void processPacket(Dpid dpid, OFMessage msg) {
tom61359e92014-09-16 15:50:27 -0700162 OpenFlowPacketContext ctx = new TestPacketContext(dpid);
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700163 pktListener.handlePacket(ctx);
164 }
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700165 }
166
tom61359e92014-09-16 15:50:27 -0700167 private class TestTopologyService extends TopologyServiceAdapter {
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700168 @Override
169 public boolean isInfrastructure(Topology topology,
alshabib7b2748f2014-09-16 20:21:11 -0700170 ConnectPoint connectPoint) {
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700171 //simulate DPID3 as an infrastructure switch
172 if (Dpid.dpid(connectPoint.deviceId().uri()).equals(DPID3)) {
173 return true;
174 }
175 return false;
176 }
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700177 }
178
179 private class TestPacketContext implements OpenFlowPacketContext {
180
181 protected Dpid swid;
182
183 public TestPacketContext(Dpid dpid) {
184 swid = dpid;
185 }
186
187 @Override
alshabib7b2748f2014-09-16 20:21:11 -0700188 public boolean block() {
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700189 return false;
190 }
191
192 @Override
193 public void send() {
194 }
195
196 @Override
197 public void build(OFPort outPort) {
198 }
199
200 @Override
201 public void build(Ethernet ethFrame, OFPort outPort) {
202 }
203
204 @Override
205 public Ethernet parsed() {
206 // just things we (and serializers) need
207 ARP arp = new ARP();
208 arp.setSenderProtocolAddress(IP)
alshabib7b2748f2014-09-16 20:21:11 -0700209 .setSenderHardwareAddress(MAC.toBytes())
210 .setTargetHardwareAddress(BCMAC.toBytes())
211 .setTargetProtocolAddress(IP);
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700212
213 Ethernet eth = new Ethernet();
214 eth.setEtherType(Ethernet.TYPE_ARP)
alshabib7b2748f2014-09-16 20:21:11 -0700215 .setVlanID(VLAN.toShort())
Yuta HIGUCHI3e848a82014-11-02 20:19:42 -0800216 .setSourceMACAddress(MAC)
217 .setDestinationMACAddress(BCMAC)
alshabib7b2748f2014-09-16 20:21:11 -0700218 .setPayload(arp);
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700219
220 return eth;
221 }
222
223 @Override
224 public byte[] unparsed() {
225 return null;
226 }
227
228 @Override
229 public Dpid dpid() {
230 return swid;
231 }
232
233 @Override
234 public Integer inPort() {
235 return INPORT;
236 }
237
alshabib7b2748f2014-09-16 20:21:11 -0700238 @Override
239 public boolean isHandled() {
240 return false;
241 }
242
alshabibe9d3a322014-09-23 15:18:33 -0700243 @Override
244 public boolean isBuffered() {
245 return false;
246 }
247
Ayaka Koshibecc4c4c82014-09-16 11:23:37 -0700248 }
249}