blob: 8ad125abef0afaa9e2774f33ea3ae73a5c5cacec [file] [log] [blame]
chengfan8ea6a562016-11-26 16:37:02 +08001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016-present Open Networking Foundation
chengfan8ea6a562016-11-26 16:37:02 +08003 *
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.tenbi.tunnel;
18
19import com.google.common.collect.ImmutableList;
20import com.google.common.collect.Lists;
21import org.junit.Before;
22import org.junit.Test;
23import org.onosproject.incubator.net.tunnel.TunnelId;
24import org.onosproject.tetopology.management.api.TeTopologyKey;
25import org.onosproject.tetopology.management.api.node.TeNodeKey;
26import org.onosproject.tetopology.management.api.node.TtpKey;
27import org.onosproject.tetunnel.api.TeTunnelAdminService;
28import org.onosproject.tetunnel.api.TeTunnelService;
29import org.onosproject.tetunnel.api.lsp.TeLsp;
30import org.onosproject.tetunnel.api.lsp.TeLspKey;
31import org.onosproject.tetunnel.api.tunnel.DefaultTeTunnel;
32import org.onosproject.tetunnel.api.tunnel.TeTunnel;
33import org.onosproject.tetunnel.api.tunnel.TeTunnelKey;
34import org.onosproject.tetunnel.api.tunnel.path.DefaultTePath;
35import org.onosproject.tetunnel.api.tunnel.path.DefaultTeRouteUnnumberedLink;
36import org.onosproject.tetunnel.api.tunnel.path.TePath;
37import org.onosproject.tetunnel.api.tunnel.path.TeRouteSubobject;
38import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev20130715.ietfinettypes.IpAddress;
39import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.IetfTe;
40import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.IetfTeOpParam;
41import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.DefaultTe;
42import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.Te;
43import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.pathparamsconfig.Type;
44import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.pathparamsconfig.type.DefaultExplicit;
45import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.pathparamsconfig.type.explicit.DefaultExplicitRouteObjects;
46import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.pathparamsconfig.type.explicit.ExplicitRouteObjects;
47import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelproperties.Config;
48import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelproperties.DefaultConfig;
49import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelproperties.DefaultPrimaryPaths;
50import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelproperties.PrimaryPaths;
51import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelproperties.State;
52import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelsgrouping.DefaultTunnels;
53import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelsgrouping.Tunnels;
54import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelsgrouping.tunnels.DefaultTunnel;
55import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelsgrouping.tunnels.Tunnel;
56import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.LspProtUnprotected;
57import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.RouteIncludeEro;
58import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.StateUp;
59import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TunnelP2p;
60import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.type.DefaultUnnumberedLink;
61
62import java.util.ArrayList;
63import java.util.Collection;
64import java.util.List;
65
66import static com.google.common.base.Preconditions.checkNotNull;
67import static org.easymock.EasyMock.createMock;
68import static org.easymock.EasyMock.expect;
69import static org.easymock.EasyMock.replay;
70import static org.junit.Assert.assertEquals;
71import static org.junit.Assert.assertNotNull;
72import static org.junit.Assert.assertTrue;
73import static org.onosproject.tetunnel.api.tunnel.TeTunnel.LspProtectionType.LSP_PROT_REROUTE;
74import static org.onosproject.tetunnel.api.tunnel.TeTunnel.Type.P2P;
75import static org.onosproject.tetunnel.api.tunnel.path.TeRouteSubobject.Type.UNNUMBERED_LINK;
76
77/**
78 * Unit tests for TeTunnelNbiManager.
79 */
80public class TeTunnelNbiManagerTest {
81 private static final String TE_REQ_FAILED = "IETF TE reqeust failed: ";
82 private static final String NAME = "testTunnel";
83 private IpAddress srcIp = IpAddress.fromString("1.1.1.1");
84 private IpAddress dstIp = IpAddress.fromString("2.2.2.2");
85 private byte[] bytes1 = new byte[]{1, 1, 1, 1, 0, 0, 0, 0};
86 private byte[] bytes2 = new byte[]{2, 2, 2, 2, 0, 0, 0, 0};
87 private long id1 = 16843009;
88 private long id2 = 33686018;
89
90
91 private TeTunnelNbiManager manager;
92 private TeTunnel testTeTunnel;
93
94
95 @Before
96 public void setUp() throws Exception {
97 manager = new TeTunnelNbiManager();
98 }
99
100 @Test
101 public void getIetfTe() throws Exception {
102 TeTunnelService tunnelService = createMock(TeTunnelService.class);
103 expect(tunnelService.getTeTunnels())
104 .andReturn(ImmutableList.of(buildTunnel()))
105 .once();
106 replay(tunnelService);
107
108 manager.tunnelService = tunnelService;
109
110 IetfTe ietfTe = manager.getIetfTe((IetfTeOpParam) buildGetIetfTeParams());
111
112 assertNotNull(TE_REQ_FAILED + "te null", ietfTe.te());
113 assertNotNull(TE_REQ_FAILED + "tunnel null", ietfTe.te().tunnels());
114
115 List<Tunnel> tunnelList = ietfTe.te().tunnels().tunnel();
116 assertEquals(TE_REQ_FAILED + "wrong tunnel size", 1, tunnelList.size());
117
118 Tunnel tunnel = tunnelList.get(0);
119 List<PrimaryPaths> pathsList = tunnel.primaryPaths();
120 assertNotNull(TE_REQ_FAILED + "path null", pathsList);
121 assertEquals(TE_REQ_FAILED + "wrong path size", 1, pathsList.size());
122
123 Type type = pathsList.get(0).state().type();
124 assertTrue(TE_REQ_FAILED + "wrong path type",
125 type instanceof DefaultExplicit);
126 DefaultExplicit explicitPath = (DefaultExplicit) type;
127 List<ExplicitRouteObjects> routeObjectses =
128 explicitPath.explicitRouteObjects();
129 assertEquals(TE_REQ_FAILED + "wrong route size", 2, routeObjectses.size());
130
131 ExplicitRouteObjects routeObjects = routeObjectses.get(1);
132 assertTrue(TE_REQ_FAILED + "wrong route object type",
133 routeObjects.type() instanceof DefaultUnnumberedLink);
134
135 DefaultUnnumberedLink link = (DefaultUnnumberedLink) routeObjects.type();
136 assertEquals(TE_REQ_FAILED + "wrong route id",
137 IpAddress.fromString("0.0.0.2"), link.routerId());
138 assertEquals(TE_REQ_FAILED + "wrong interface id", 2, link.interfaceId());
139
140 State state = tunnel.state();
141 assertEquals(TE_REQ_FAILED + "wrong state",
142 StateUp.class, state.adminStatus());
143 assertEquals(TE_REQ_FAILED + "wrong source",
144 IpAddress.fromString("0.0.0.1"), state.source());
145 }
146
147 @Test
148 public void setIetfTe() throws Exception {
149 manager.tunnelAdminService = new TestTunnelAdmin();
150 manager.setIetfTe((IetfTeOpParam) buildPostIetfTeParams());
151 assertEquals(NAME, testTeTunnel.name());
152 List<TePath> tePaths = testTeTunnel.primaryPaths();
153 assertEquals(1, tePaths.size());
154 TePath tePath = tePaths.get(0);
155 List<TeRouteSubobject> teRouteSubobjects = tePath.explicitRoute();
156 assertEquals(2, teRouteSubobjects.size());
157 TeRouteSubobject routeSubobject = teRouteSubobjects.get(1);
158 assertEquals(UNNUMBERED_LINK, routeSubobject.type());
159 DefaultTeRouteUnnumberedLink link =
160 (DefaultTeRouteUnnumberedLink) routeSubobject;
161 assertEquals(id2, link.node().teNodeId());
162 assertEquals(id2, link.ttp().ttpId());
163
164 }
165
166 private IetfTe buildGetIetfTeParams() {
167 Te te = new DefaultTe
168 .TeBuilder()
169 .yangTeOpType(IetfTe.OnosYangOpType.NONE)
170 .build();
171 return new IetfTeOpParam
172 .IetfTeBuilder()
173 .te(te)
174 .yangIetfTeOpType(IetfTe.OnosYangOpType.NONE)
175 .build();
176 }
177
178 private IetfTe buildPostIetfTeParams() {
179 Tunnel tunnel = buildYangTunnel();
180 Tunnels teTunnels = new DefaultTunnels
181 .TunnelsBuilder()
182 .tunnel(Lists.newArrayList(tunnel))
183 .build();
184 Te te = new DefaultTe
185 .TeBuilder()
186 .tunnels(teTunnels)
187 .yangTeOpType(IetfTe.OnosYangOpType.NONE)
188 .build();
189 return new IetfTeOpParam
190 .IetfTeBuilder()
191 .te(te)
192 .yangIetfTeOpType(IetfTe.OnosYangOpType.NONE)
193 .build();
194 }
195
196 private Tunnel buildYangTunnel() {
197 TeTunnel teTunnel = buildTunnel();
198 checkNotNull(teTunnel);
199 Config config = new DefaultConfig.ConfigBuilder()
200 .name(NAME)
201 .adminStatus(StateUp.class)
202 .source(srcIp)
203 .destination(dstIp)
204 .srcTpId(bytes1)
205 .dstTpId(bytes2)
206 .type(TunnelP2p.class)
207 .lspProtectionType(LspProtUnprotected.class)
208 .build();
209
210 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.
211 rev20160705.ietftetypes.explicitroutesubobject.type.
212 UnnumberedLink yangLink1 = DefaultUnnumberedLink.builder()
213 .routerId(srcIp)
214 .interfaceId(id1)
215 .build();
216
217 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.
218 rev20160705.ietftetypes.explicitroutesubobject.type.
219 UnnumberedLink yangLink2 = DefaultUnnumberedLink.builder()
220 .routerId(dstIp)
221 .interfaceId(id2)
222 .build();
223
224 ExplicitRouteObjects routeObject1 = DefaultExplicitRouteObjects.builder()
225 .type(yangLink1)
226 .explicitRouteUsage(RouteIncludeEro.class)
227 .build();
228
229 ExplicitRouteObjects routeObject2 = DefaultExplicitRouteObjects.builder()
230 .type(yangLink2)
231 .explicitRouteUsage(RouteIncludeEro.class)
232 .build();
233
234
235 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.
236 rev20160705.ietfte.pathparamsconfig.type.Explicit explicit
237 = DefaultExplicit.builder()
238 .explicitRouteObjects(ImmutableList.of(routeObject1, routeObject2))
239 .build();
240 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.
241 rev20160705.ietfte.p2pprimarypathparams.Config pathConfig
242 = org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.
243 te.rev20160705.ietfte.p2pprimarypathparams.DefaultConfig.builder()
244 .pathNamedConstraint("onlyPath")
245 .lockdown(true)
246 .noCspf(true)
247 .type(explicit)
248 .build();
249
250 PrimaryPaths primaryPaths = DefaultPrimaryPaths.builder()
251 .config(pathConfig).build();
252
253 return DefaultTunnel.builder()
254 .name(config.name())
255 .type(config.type())
256 .config(config)
257 .primaryPaths(Lists.newArrayList(primaryPaths))
258 .build();
259 }
260
261 private TeTunnel buildTunnel() {
262 TeTopologyKey topologyKey = new TeTopologyKey(1, 2, 3);
263 TeTunnelKey teTunnelKey = new TeTunnelKey(topologyKey, 1);
264
265 TeNodeKey srcNodeKey = new TeNodeKey(topologyKey, 1);
266 TeNodeKey dstNodeKey = new TeNodeKey(topologyKey, 2);
267
268 TtpKey srcTtpKey = new TtpKey(srcNodeKey, 1);
269 TtpKey dstTtpKey = new TtpKey(srcNodeKey, 2);
270
271 TeLspKey lspKey = new TeLspKey(teTunnelKey, 1);
272
273 DefaultTeRouteUnnumberedLink unnumberedLink1 =
274 new DefaultTeRouteUnnumberedLink(srcNodeKey, srcTtpKey);
275 DefaultTeRouteUnnumberedLink unnumberedLink2 =
276 new DefaultTeRouteUnnumberedLink(dstNodeKey, dstTtpKey);
277 List<TeRouteSubobject> explicitRouteList = new ArrayList<>();
278
279 explicitRouteList.add(unnumberedLink1);
280 explicitRouteList.add(unnumberedLink2);
281 TePath tePath = new DefaultTePath(TePath.Type.EXPLICIT,
282 Lists.newArrayList(lspKey),
283 explicitRouteList,
284 Lists.newArrayList());
285
286 return DefaultTeTunnel.builder()
287 .teTunnelKey(teTunnelKey)
288 .name(NAME)
289 .type(P2P)
290 .adminState(TeTunnel.State.UP)
291 .srcNode(srcNodeKey)
292 .dstNode(dstNodeKey)
293 .srcTp(srcTtpKey)
294 .dstTp(dstTtpKey)
295 .lspProtectionType(LSP_PROT_REROUTE)
296 .primaryPaths(Lists.newArrayList(tePath))
297 .build();
298 }
299
300 private class TestTunnelAdmin implements TeTunnelAdminService {
301
302 @Override
303 public TunnelId createTeTunnel(TeTunnel teTunnel) {
304 TunnelId tunnelId = TunnelId.valueOf(teTunnel.teTunnelKey().toString());
305 testTeTunnel = teTunnel;
306 return tunnelId;
307 }
308
309 @Override
310 public void setTunnelId(TeTunnelKey teTunnelKey, TunnelId tunnelId) {
311
312 }
313
314 @Override
315 public void updateTeTunnel(TeTunnel teTunnel) {
316
317 }
318
319 @Override
320 public void updateTunnelState(TeTunnelKey key, org.onosproject.incubator.net.tunnel.Tunnel.State state) {
321
322 }
323
324 @Override
325 public void removeTeTunnel(TeTunnelKey teTunnelKey) {
326
327 }
328
329 @Override
330 public void removeTeTunnels() {
331
332 }
333
334 @Override
335 public void setSegmentTunnel(TeTunnelKey e2eTunnelKey, List<TeTunnelKey> segmentTunnels) {
336
337 }
338
339 @Override
340 public TeTunnel getTeTunnel(TeTunnelKey teTunnelKey) {
341 return null;
342 }
343
344 @Override
345 public TeTunnel getTeTunnel(TunnelId tunnelId) {
346 return null;
347 }
348
349 @Override
350 public TunnelId getTunnelId(TeTunnelKey teTunnelKey) {
351 return null;
352 }
353
354 @Override
355 public Collection<TeTunnel> getTeTunnels() {
356 return null;
357 }
358
359 @Override
360 public Collection<TeTunnel> getTeTunnels(TeTunnel.Type type) {
361 return null;
362 }
363
364 @Override
365 public Collection<TeTunnel> getTeTunnels(TeTopologyKey teTopologyKey) {
366 return null;
367 }
368
369 @Override
370 public TeLsp getTeLsp(TeLspKey key) {
371 return null;
372 }
373
374 @Override
375 public Collection<TeLsp> getTeLsps() {
376 return null;
377 }
378 }
379
380}