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