blob: 8cecbee0403def316d6adbdd2c1c8043409c8641 [file] [log] [blame]
Ray Milkey2d572dd2017-04-14 10:01:24 -07001/*
2 * Copyright 2016-present Open Networking Laboratory
3 *
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
Avantika-Huawei3c2d3eb2016-06-22 09:34:00 +053017package org.onosproject.pcep.controller.impl;
18
19import static org.onosproject.pcep.controller.PcepLspSyncAction.SEND_UPDATE;
20import static org.onosproject.pcep.controller.PcepLspSyncAction.UNSTABLE;
21
22import java.net.SocketAddress;
23import java.util.ArrayList;
24import java.util.Collection;
25import java.util.Collections;
26import java.util.HashMap;
27import java.util.HashSet;
28import java.util.List;
29
30import org.jboss.netty.buffer.ChannelBuffer;
31import org.jboss.netty.buffer.ChannelBuffers;
32import org.jboss.netty.channel.Channel;
33import org.jboss.netty.channel.ChannelConfig;
34import org.jboss.netty.channel.ChannelFactory;
35import org.jboss.netty.channel.ChannelFuture;
36import org.jboss.netty.channel.ChannelPipeline;
37import org.junit.After;
38import org.junit.Before;
39import org.junit.Test;
40import org.onlab.packet.IpAddress;
41import org.onosproject.core.ApplicationId;
42import org.onosproject.incubator.net.tunnel.DefaultTunnel;
43import org.onosproject.incubator.net.tunnel.Tunnel;
44import org.onosproject.incubator.net.tunnel.TunnelEndPoint;
45import org.onosproject.incubator.net.tunnel.TunnelId;
46import org.onosproject.incubator.net.tunnel.TunnelListener;
47import org.onosproject.incubator.net.tunnel.TunnelName;
48import org.onosproject.incubator.net.tunnel.TunnelService;
49import org.onosproject.incubator.net.tunnel.TunnelSubscription;
50import org.onosproject.incubator.net.tunnel.Tunnel.Type;
51import org.onosproject.net.Annotations;
52import org.onosproject.net.DeviceId;
53import org.onosproject.net.ElementId;
54import org.onosproject.net.Path;
55import org.onosproject.pcep.controller.ClientCapability;
56import org.onosproject.pcep.controller.PccId;
57import org.onosproject.pcep.controller.PcepEventListener;
58import org.onosproject.pcep.controller.PcepLspSyncAction;
59import org.onosproject.pcep.controller.PcepPacketStats;
60import org.onosproject.pcep.controller.PcepSyncStatus;
61import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
62import org.onosproject.pcepio.exceptions.PcepParseException;
63import org.onosproject.pcepio.protocol.PcepFactories;
64import org.onosproject.pcepio.protocol.PcepInitiateMsg;
65import org.onosproject.pcepio.protocol.PcepMessage;
66import org.onosproject.pcepio.protocol.PcepMessageReader;
67import org.onosproject.pcepio.protocol.PcepVersion;
68import com.google.common.collect.ImmutableSet;
69
70import static org.hamcrest.MatcherAssert.assertThat;
71import static org.hamcrest.core.Is.is;
72
73public class PcepClientControllerImplTest {
74 PcepClientControllerImpl controllerImpl = new PcepClientControllerImpl();
75 TunnelService tunnelService = new MockTunnelService();
76 private PcepEventListener listener;
77 private Channel channel;
78
79 @Before
80 public void startUp() {
81 controllerImpl.tunnelService = tunnelService;
82 listener = new PcepEventListenerAdapter();
83 controllerImpl.addEventListener(listener);
84 channel = new MockChannel();
85 }
86
87 @After
88 public void tearDown() {
89 controllerImpl.removeEventListener(listener);
90 listener = null;
91 controllerImpl.tunnelService = null;
92 }
93
94 @Test
95 public void tunnelProviderAddedTest1() throws PcepParseException, PcepOutOfBoundMessageException {
96 PccId pccId = PccId.pccId(IpAddress.valueOf("1.1.1.1"));
97
98 byte[] reportMsg = new byte[] {0x20, 0x0a, 0x00, (byte) 0x50, 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00,
99 0x00, 0x00, 0x00, 0x01, // SRP object
100 0x00, 0x1c, 0x00, 0x04, // PATH-SETUP-TYPE TLV
101 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x24, // LSP object
102 0x00, 0x00, 0x10, (byte) 0xAB,
103 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, // symbolic path tlv
104 0x00, 0x12, 0x00, 0x10, // IPv4-LSP-IDENTIFIER-TLV
105 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x05,
106 0x05, 0x05, 0x05,
107
108 0x07, 0x10, 0x00, 0x14, // ERO object
109 0x01, 0x08, (byte) 0x01, 0x01, // ERO IPv4 sub objects
110 0x01, 0x01, 0x04, 0x00,
111 0x01, 0x08, (byte) 0x05, 0x05, 0x05, 0x05, 0x04, 0x00, };
112
113 ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
114 buffer.writeBytes(reportMsg);
115
116 PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
117 PcepMessage message = reader.readFrom(buffer);
118
119 PcepClientImpl pc = new PcepClientImpl();
120 PcepPacketStats pktStats = new PcepPacketStatsImpl();
121
122 pc.init(pccId, PcepVersion.PCEP_1, pktStats);
123 pc.setChannel(channel);
124 pc.setAgent(controllerImpl.agent);
125 pc.setConnected(true);
126 pc.setCapability(new ClientCapability(true, true, true, true, true));
127
128 controllerImpl.agent.addConnectedClient(pccId, pc);
129 controllerImpl.processClientMessage(pccId, message);
130
131 pc.setLspDbSyncStatus(PcepSyncStatus.SYNCED);
132 pc.setLabelDbSyncStatus(PcepSyncStatus.IN_SYNC);
133 pc.setLabelDbSyncStatus(PcepSyncStatus.SYNCED);
134
135 List<PcepMessage> deleteMsgs = ((MockChannel) channel).msgsWritten();
136 assertThat(deleteMsgs.size(), is(1));
137
138 for (PcepMessage msg : deleteMsgs) {
139 assertThat(((PcepInitiateMsg) msg).getPcInitiatedLspRequestList().getFirst().getSrpObject().getRFlag(),
140 is(true));
141 }
142 }
143
144 @Test
145 public void tunnelProviderAddedTest2() throws PcepParseException, PcepOutOfBoundMessageException {
146 PccId pccId = PccId.pccId(IpAddress.valueOf("1.1.1.1"));
147
148 byte[] reportMsg = new byte[] {0x20, 0x0a, 0x00, (byte) 0x50, 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00,
149 0x00, 0x00, 0x00, 0x01, // SRP object
150 0x00, 0x1c, 0x00, 0x04, // PATH-SETUP-TYPE TLV
151 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x24, 0x00, // LSP object
152 0x00, 0x10, (byte) 0xAB,
153 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, // symbolic path tlv
154 0x00, 0x12, 0x00, 0x10, // IPv4-LSP-IDENTIFIER-TLV
155 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x05,
156 0x05, 0x05, 0x05,
157
158 0x07, 0x10, 0x00, 0x14, // ERO object
159 0x01, 0x08, (byte) 0x01, 0x01, 0x01, 0x01, 0x04, 0x00, // ERO IPv4 sub objects
160 0x01, 0x08, (byte) 0x05, 0x05, 0x05, 0x05, 0x04, 0x00, };
161
162 ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
163 buffer.writeBytes(reportMsg);
164
165 PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
166 PcepMessage message = reader.readFrom(buffer);
167
168 PcepClientImpl pc = new PcepClientImpl();
169 PcepPacketStats pktStats = new PcepPacketStatsImpl();
170
171 pc.init(pccId, PcepVersion.PCEP_1, pktStats);
172 pc.setChannel(channel);
173 pc.setAgent(controllerImpl.agent);
174 pc.setConnected(true);
175 pc.setCapability(new ClientCapability(true, true, true, true, true));
176
177 controllerImpl.agent.addConnectedClient(pccId, pc);
178 controllerImpl.processClientMessage(pccId, message);
179
180 pc.setLspDbSyncStatus(PcepSyncStatus.SYNCED);
181 pc.setLabelDbSyncStatus(PcepSyncStatus.IN_SYNC);
182 pc.setLabelDbSyncStatus(PcepSyncStatus.SYNCED);
183 }
184
185 class PcepEventListenerAdapter implements PcepEventListener {
186
187 public List<PcepMessage> handledMsg = new ArrayList<>();
188 public List<Tunnel> tunnelsToBeUpdatedToNw = new ArrayList<>();
189 public List<Tunnel> deletedFromNwTunnels = new ArrayList<>();
190
191 @Override
192 public void handleMessage(PccId pccId, PcepMessage msg) {
193 handledMsg.add(msg);
194 }
195
196 @Override
197 public void handleEndOfSyncAction(Tunnel tunnel, PcepLspSyncAction endOfSyncAction) {
198 if (endOfSyncAction == SEND_UPDATE) {
199 tunnelsToBeUpdatedToNw.add(tunnel);
200 return;
201 } else if (endOfSyncAction == UNSTABLE) {
202 deletedFromNwTunnels.add(tunnel);
203 }
204 }
205 }
206
207 class MockChannel implements Channel {
208 private List<PcepMessage> msgOnWire = new ArrayList<>();
209
210 @Override
211 public ChannelFuture write(Object o) {
212 if (o instanceof List<?>) {
213 @SuppressWarnings("unchecked")
214 List<PcepMessage> msgs = (List<PcepMessage>) o;
215 for (PcepMessage msg : msgs) {
216 if (msg instanceof PcepInitiateMsg) {
217 msgOnWire.add(msg);
218 }
219 }
220 }
221 return null;
222 }
223
224 public List<PcepMessage> msgsWritten() {
225 return msgOnWire;
226 }
227
228 @Override
229 public int compareTo(Channel o) {
230 // TODO Auto-generated method stub
231 return 0;
232 }
233
234 @Override
235 public Integer getId() {
236 // TODO Auto-generated method stub
237 return null;
238 }
239
240 @Override
241 public ChannelFactory getFactory() {
242 // TODO Auto-generated method stub
243 return null;
244 }
245
246 @Override
247 public Channel getParent() {
248 // TODO Auto-generated method stub
249 return null;
250 }
251
252 @Override
253 public ChannelConfig getConfig() {
254 // TODO Auto-generated method stub
255 return null;
256 }
257
258 @Override
259 public ChannelPipeline getPipeline() {
260 // TODO Auto-generated method stub
261 return null;
262 }
263
264 @Override
265 public boolean isOpen() {
266 // TODO Auto-generated method stub
267 return false;
268 }
269
270 @Override
271 public boolean isBound() {
272 // TODO Auto-generated method stub
273 return false;
274 }
275
276 @Override
277 public boolean isConnected() {
278 // TODO Auto-generated method stub
279 return false;
280 }
281
282 @Override
283 public SocketAddress getLocalAddress() {
284 // TODO Auto-generated method stub
285 return null;
286 }
287
288 @Override
289 public SocketAddress getRemoteAddress() {
290 // TODO Auto-generated method stub
291 return null;
292 }
293
294 @Override
295 public ChannelFuture write(Object message, SocketAddress remoteAddress) {
296 // TODO Auto-generated method stub
297 return null;
298 }
299
300 @Override
301 public ChannelFuture bind(SocketAddress localAddress) {
302 // TODO Auto-generated method stub
303 return null;
304 }
305
306 @Override
307 public ChannelFuture connect(SocketAddress remoteAddress) {
308 // TODO Auto-generated method stub
309 return null;
310 }
311
312 @Override
313 public ChannelFuture disconnect() {
314 // TODO Auto-generated method stub
315 return null;
316 }
317
318 @Override
319 public ChannelFuture unbind() {
320 // TODO Auto-generated method stub
321 return null;
322 }
323
324 @Override
325 public ChannelFuture close() {
326 // TODO Auto-generated method stub
327 return null;
328 }
329
330 @Override
331 public ChannelFuture getCloseFuture() {
332 // TODO Auto-generated method stub
333 return null;
334 }
335
336 @Override
337 public int getInterestOps() {
338 // TODO Auto-generated method stub
339 return 0;
340 }
341
342 @Override
343 public boolean isReadable() {
344 // TODO Auto-generated method stub
345 return false;
346 }
347
348 @Override
349 public boolean isWritable() {
350 // TODO Auto-generated method stub
351 return false;
352 }
353
354 @Override
355 public ChannelFuture setInterestOps(int interestOps) {
356 // TODO Auto-generated method stub
357 return null;
358 }
359
360 @Override
361 public ChannelFuture setReadable(boolean readable) {
362 // TODO Auto-generated method stub
363 return null;
364 }
365
366 @Override
367 public boolean getUserDefinedWritability(int index) {
368 // TODO Auto-generated method stub
369 return false;
370 }
371
372 @Override
373 public void setUserDefinedWritability(int index, boolean isWritable) {
374 // TODO Auto-generated method stub
375
376 }
377
378 @Override
379 public Object getAttachment() {
380 // TODO Auto-generated method stub
381 return null;
382 }
383
384 @Override
385 public void setAttachment(Object attachment) {
386 // TODO Auto-generated method stub
387
388 }
389 }
390
391 class MockTunnelService implements TunnelService {
392 private HashMap<TunnelId, Tunnel> tunnelIdAsKeyStore = new HashMap<TunnelId, Tunnel>();
393 private int tunnelIdCounter = 0;
394
395 @Override
396 public TunnelId setupTunnel(ApplicationId producerId, ElementId srcElementId, Tunnel tunnel, Path path) {
397 TunnelId tunnelId = TunnelId.valueOf(String.valueOf(++tunnelIdCounter));
398 Tunnel tunnelToInsert = new DefaultTunnel(tunnel.providerId(), tunnel.src(), tunnel.dst(), tunnel.type(),
399 tunnel.state(), tunnel.groupId(), tunnelId, tunnel.tunnelName(),
400 path, tunnel.annotations());
401 tunnelIdAsKeyStore.put(tunnelId, tunnelToInsert);
402 return tunnelId;
403 }
404
405 @Override
406 public Tunnel queryTunnel(TunnelId tunnelId) {
407 for (TunnelId tunnelIdKey : tunnelIdAsKeyStore.keySet()) {
408 if (tunnelIdKey.equals(tunnelId)) {
409 return tunnelIdAsKeyStore.get(tunnelId);
410 }
411 }
412 return null;
413 }
414
415 @Override
416 public Collection<Tunnel> queryTunnel(TunnelEndPoint src, TunnelEndPoint dst) {
417 Collection<Tunnel> result = new HashSet<Tunnel>();
418 Tunnel tunnel = null;
419 for (TunnelId tunnelId : tunnelIdAsKeyStore.keySet()) {
420 tunnel = tunnelIdAsKeyStore.get(tunnelId);
421
422 if ((null != tunnel) && (src.equals(tunnel.src())) && (dst.equals(tunnel.dst()))) {
423 result.add(tunnel);
424 }
425 }
426
427 return result.size() == 0 ? Collections.emptySet() : ImmutableSet.copyOf(result);
428 }
429
430 @Override
431 public Collection<Tunnel> queryTunnel(Tunnel.Type type) {
432 Collection<Tunnel> result = new HashSet<Tunnel>();
433
434 for (TunnelId tunnelId : tunnelIdAsKeyStore.keySet()) {
435 result.add(tunnelIdAsKeyStore.get(tunnelId));
436 }
437
438 return result.size() == 0 ? Collections.emptySet() : ImmutableSet.copyOf(result);
439 }
440
441 @Override
442 public Collection<Tunnel> queryAllTunnels() {
443 Collection<Tunnel> result = new HashSet<Tunnel>();
444
445 for (TunnelId tunnelId : tunnelIdAsKeyStore.keySet()) {
446 result.add(tunnelIdAsKeyStore.get(tunnelId));
447 }
448
449 return result.size() == 0 ? Collections.emptySet() : ImmutableSet.copyOf(result);
450 }
451
452 @Override
453 public void addListener(TunnelListener listener) {
454 // TODO Auto-generated method stub
455
456 }
457
458 @Override
459 public void removeListener(TunnelListener listener) {
460 // TODO Auto-generated method stub
461
462 }
463
464 @Override
465 public Tunnel borrowTunnel(ApplicationId consumerId, TunnelId tunnelId, Annotations... annotations) {
466 // TODO Auto-generated method stub
467 return null;
468 }
469
470 @Override
471 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId, TunnelName tunnelName,
472 Annotations... annotations) {
473 // TODO Auto-generated method stub
474 return null;
475 }
476
477 @Override
478 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId, TunnelEndPoint src, TunnelEndPoint dst,
479 Annotations... annotations) {
480 // TODO Auto-generated method stub
481 return null;
482 }
483
484 @Override
485 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId, TunnelEndPoint src, TunnelEndPoint dst,
486 Type type, Annotations... annotations) {
487 // TODO Auto-generated method stub
488 return null;
489 }
490
491 @Override
492 public boolean downTunnel(ApplicationId producerId, TunnelId tunnelId) {
493 // TODO Auto-generated method stub
494 return false;
495 }
496
497 @Override
498 public boolean returnTunnel(ApplicationId consumerId, TunnelId tunnelId, Annotations... annotations) {
499 // TODO Auto-generated method stub
500 return false;
501 }
502
503 @Override
504 public boolean returnTunnel(ApplicationId consumerId, TunnelName tunnelName, Annotations... annotations) {
505 // TODO Auto-generated method stub
506 return false;
507 }
508
509 @Override
510 public boolean returnTunnel(ApplicationId consumerId, TunnelEndPoint src, TunnelEndPoint dst, Type type,
511 Annotations... annotations) {
512 // TODO Auto-generated method stub
513 return false;
514 }
515
516 @Override
517 public boolean returnTunnel(ApplicationId consumerId, TunnelEndPoint src, TunnelEndPoint dst,
518 Annotations... annotations) {
519 // TODO Auto-generated method stub
520 return false;
521 }
522
523 @Override
524 public Collection<TunnelSubscription> queryTunnelSubscription(ApplicationId consumerId) {
525 // TODO Auto-generated method stub
526 return null;
527 }
528
529 @Override
530 public int tunnelCount() {
531 // TODO Auto-generated method stub
532 return 0;
533 }
534
535 @Override
536 public Iterable<Tunnel> getTunnels(DeviceId deviceId) {
537 // TODO Auto-generated method stub
538 return null;
539 }
540 }
Ray Milkey2d572dd2017-04-14 10:01:24 -0700541}