blob: 5198bc96b87e754cb25f4110119c19a8a86372cd [file] [log] [blame]
Luca Pretee9511512016-05-13 10:30:19 -07001/*
Brian O'Connor0a4e6742016-09-15 23:03:10 -07002 * Copyright 2016-present Open Networking Laboratory
Luca Pretee9511512016-05-13 10:30:19 -07003 *
4 * 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
7 *
8 * 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.
15 */
16
17package org.onosproject.sdnip;
18
19import com.google.common.collect.Lists;
20import com.google.common.collect.Sets;
21import org.junit.Before;
22import org.junit.Test;
23import org.onlab.packet.Ethernet;
24import org.onlab.packet.Ip4Address;
25import org.onlab.packet.Ip4Prefix;
26import org.onlab.packet.IpPrefix;
27import org.onlab.packet.MacAddress;
28import org.onlab.packet.VlanId;
29import org.onosproject.TestApplicationId;
30import org.onosproject.core.ApplicationId;
31import org.onosproject.core.CoreServiceAdapter;
32import org.onosproject.incubator.net.intf.Interface;
33import org.onosproject.incubator.net.intf.InterfaceListener;
34import org.onosproject.incubator.net.intf.InterfaceService;
35import org.onosproject.incubator.net.intf.InterfaceServiceAdapter;
36import org.onosproject.incubator.net.routing.ResolvedRoute;
37import org.onosproject.incubator.net.routing.RouteEvent;
38import org.onosproject.incubator.net.routing.RouteListener;
39import org.onosproject.incubator.net.routing.RouteServiceAdapter;
40import org.onosproject.net.ConnectPoint;
41import org.onosproject.net.DeviceId;
42import org.onosproject.net.PortNumber;
43import org.onosproject.net.flow.DefaultTrafficSelector;
44import org.onosproject.net.flow.DefaultTrafficTreatment;
45import org.onosproject.net.flow.TrafficSelector;
46import org.onosproject.net.flow.TrafficTreatment;
47import org.onosproject.net.host.InterfaceIpAddress;
48import org.onosproject.net.intent.AbstractIntentTest;
49import org.onosproject.net.intent.Key;
50import org.onosproject.net.intent.MultiPointToSinglePointIntent;
51import org.onosproject.routing.IntentSynchronizationService;
52
53import java.util.Collections;
54import java.util.HashSet;
55import java.util.List;
56import java.util.Set;
57
58import static org.easymock.EasyMock.*;
59import static org.onosproject.routing.TestIntentServiceHelper.eqExceptId;
60
61/**
62 * Unit tests for SdnIpFib.
63 */
64public class SdnIpFibVlanstoNoVlanTest extends AbstractIntentTest {
65
66 private InterfaceService interfaceService;
67
68 private static final ConnectPoint SW1_ETH1 = new ConnectPoint(
69 DeviceId.deviceId("of:0000000000000001"),
70 PortNumber.portNumber(1));
71
72 private static final ConnectPoint SW2_ETH1 = new ConnectPoint(
73 DeviceId.deviceId("of:0000000000000002"),
74 PortNumber.portNumber(1));
75
76 private static final ConnectPoint SW3_ETH1 = new ConnectPoint(
77 DeviceId.deviceId("of:0000000000000003"),
78 PortNumber.portNumber(1));
79
80 private static final IpPrefix PREFIX1 = Ip4Prefix.valueOf("1.1.1.0/24");
81
82 private SdnIpFib sdnipFib;
83 private IntentSynchronizationService intentSynchronizer;
84 private final Set<Interface> interfaces = Sets.newHashSet();
85
86 private static final ApplicationId APPID = TestApplicationId.create("SDNIP");
87
88 private RouteListener routeListener;
89 private InterfaceListener interfaceListener;
90
91 @Before
92 public void setUp() throws Exception {
93 super.setUp();
94
95 interfaceService = createMock(InterfaceService.class);
96
97 interfaceService.addListener(anyObject(InterfaceListener.class));
98 expectLastCall().andDelegateTo(new InterfaceServiceDelegate());
99
100 // These will set expectations on routingConfig and interfaceService
101 setUpInterfaceService();
102
103 replay(interfaceService);
104
105 intentSynchronizer = createMock(IntentSynchronizationService.class);
106
107 sdnipFib = new SdnIpFib();
108 sdnipFib.routeService = new TestRouteService();
109 sdnipFib.coreService = new TestCoreService();
110 sdnipFib.interfaceService = interfaceService;
111 sdnipFib.intentSynchronizer = intentSynchronizer;
112
113 sdnipFib.activate();
114 }
115
116 /**
117 * Sets up the interface service.
118 */
119 private void setUpInterfaceService() {
120 List<InterfaceIpAddress> interfaceIpAddresses1 = Lists.newArrayList();
121 interfaceIpAddresses1.add(InterfaceIpAddress.valueOf("192.168.10.101/24"));
122 Interface sw1Eth1 = new Interface("sw1-eth1", SW1_ETH1,
123 interfaceIpAddresses1, MacAddress.valueOf("00:00:00:00:00:01"),
124 VlanId.vlanId((short) 1));
125 interfaces.add(sw1Eth1);
126
127 List<InterfaceIpAddress> interfaceIpAddresses2 = Lists.newArrayList();
128 interfaceIpAddresses2.add(InterfaceIpAddress.valueOf("192.168.20.101/24"));
129 Interface sw2Eth1 = new Interface("sw2-eth1", SW2_ETH1,
130 interfaceIpAddresses2, MacAddress.valueOf("00:00:00:00:00:02"),
131 VlanId.vlanId((short) 1));
132 interfaces.add(sw2Eth1);
133
134 InterfaceIpAddress interfaceIpAddress3 = InterfaceIpAddress.valueOf("192.168.30.101/24");
135 Interface sw3Eth1 = new Interface("sw3-eth1", SW3_ETH1,
136 Lists.newArrayList(interfaceIpAddress3),
137 MacAddress.valueOf("00:00:00:00:00:03"),
138 VlanId.NONE);
139 interfaces.add(sw3Eth1);
140
141 expect(interfaceService.getInterfacesByPort(SW1_ETH1)).andReturn(
142 Collections.singleton(sw1Eth1)).anyTimes();
143 expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.10.1")))
144 .andReturn(sw1Eth1).anyTimes();
145 expect(interfaceService.getInterfacesByPort(SW2_ETH1)).andReturn(
146 Collections.singleton(sw2Eth1)).anyTimes();
147 expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.20.1")))
148 .andReturn(sw2Eth1).anyTimes();
149 expect(interfaceService.getInterfacesByPort(SW3_ETH1)).andReturn(
150 Collections.singleton(sw3Eth1)).anyTimes();
151 expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.30.1")))
152 .andReturn(sw3Eth1).anyTimes();
153 expect(interfaceService.getInterfaces()).andReturn(interfaces).anyTimes();
154 }
155
156 /**
157 * Tests adding a route. Ingresses with VLAN and next hop with no VLAN.
158 *
159 * We verify that the synchronizer records the correct state and that the
160 * correct intent is submitted to the IntentService.
161 */
162 @Test
163 public void testRouteAdd() {
164 ResolvedRoute route = new ResolvedRoute(PREFIX1,
165 Ip4Address.valueOf("192.168.30.1"),
166 MacAddress.valueOf("00:00:00:00:00:03"));
167
168 // Construct a MultiPointToSinglePointIntent intent
169 TrafficSelector.Builder selectorBuilder =
170 DefaultTrafficSelector.builder();
171 selectorBuilder.matchEthType(Ethernet.TYPE_IPV4).matchIPDst(PREFIX1)
172 .matchVlanId(VlanId.ANY);
173
174 TrafficTreatment.Builder treatmentBuilder =
175 DefaultTrafficTreatment.builder();
176 treatmentBuilder.setEthDst(MacAddress.valueOf("00:00:00:00:00:03"))
177 .popVlan();
178
179 Set<ConnectPoint> ingressPoints = new HashSet<>();
180 ingressPoints.add(SW1_ETH1);
181 ingressPoints.add(SW2_ETH1);
182
183 MultiPointToSinglePointIntent intent =
184 MultiPointToSinglePointIntent.builder()
185 .appId(APPID)
186 .key(Key.of(PREFIX1.toString(), APPID))
187 .selector(selectorBuilder.build())
188 .treatment(treatmentBuilder.build())
189 .ingressPoints(ingressPoints)
190 .egressPoint(SW3_ETH1)
191 .constraints(SdnIpFib.CONSTRAINTS)
192 .build();
193
194 // Setup the expected intents
195 intentSynchronizer.submit(eqExceptId(intent));
196 replay(intentSynchronizer);
197
198 // Send in the added event
199 routeListener.event(new RouteEvent(RouteEvent.Type.ROUTE_ADDED, route));
200
201 verify(intentSynchronizer);
202 }
203
204 private class TestCoreService extends CoreServiceAdapter {
205 @Override
206 public ApplicationId getAppId(String name) {
207 return APPID;
208 }
209 }
210
211 private class TestRouteService extends RouteServiceAdapter {
212 @Override
213 public void addListener(RouteListener routeListener) {
214 SdnIpFibVlanstoNoVlanTest.this.routeListener = routeListener;
215 }
216 }
217
218 private class InterfaceServiceDelegate extends InterfaceServiceAdapter {
219 @Override
220 public void addListener(InterfaceListener listener) {
221 SdnIpFibVlanstoNoVlanTest.this.interfaceListener = listener;
222 }
223 }
224}