Committed by
Priyankab-Huawei
[ONOS] PCEP provider changes, added node listeners to topology provider
Change-Id: I98bc6445ee78a8f0bf53f897f0a25f678ec7fc99
Showing
19 changed files
with
1074 additions
and
12 deletions
1 | COMPILE_DEPS = [ | 1 | COMPILE_DEPS = [ |
2 | '//lib:CORE_DEPS', | 2 | '//lib:CORE_DEPS', |
3 | '//protocols/pcep/pcepio:onos-protocols-pcep-pcepio', | 3 | '//protocols/pcep/pcepio:onos-protocols-pcep-pcepio', |
4 | + '//apps/pcep-api:onos-apps-pcep-api', | ||
4 | ] | 5 | ] |
5 | 6 | ||
6 | osgi_jar_with_tests ( | 7 | osgi_jar_with_tests ( | ... | ... |
... | @@ -26,6 +26,8 @@ public class ClientCapability { | ... | @@ -26,6 +26,8 @@ public class ClientCapability { |
26 | private boolean pceccCapability; | 26 | private boolean pceccCapability; |
27 | private boolean statefulPceCapability; | 27 | private boolean statefulPceCapability; |
28 | private boolean pcInstantiationCapability; | 28 | private boolean pcInstantiationCapability; |
29 | + private boolean labelStackCapability; | ||
30 | + private boolean srCapability; | ||
29 | 31 | ||
30 | /** | 32 | /** |
31 | * Creates new instance of client capability. | 33 | * Creates new instance of client capability. |
... | @@ -33,11 +35,34 @@ public class ClientCapability { | ... | @@ -33,11 +35,34 @@ public class ClientCapability { |
33 | * @param pceccCapability represents PCECC capability | 35 | * @param pceccCapability represents PCECC capability |
34 | * @param statefulPceCapability represents stateful PCE capability | 36 | * @param statefulPceCapability represents stateful PCE capability |
35 | * @param pcInstantiationCapability represents PC initiation capability | 37 | * @param pcInstantiationCapability represents PC initiation capability |
38 | + * @param labelStackCapability represents S bit is set in PCECC capability | ||
39 | + * @param srCapability represents SR capability | ||
36 | */ | 40 | */ |
37 | - public ClientCapability(boolean pceccCapability, boolean statefulPceCapability, boolean pcInstantiationCapability) { | 41 | + public ClientCapability(boolean pceccCapability, boolean statefulPceCapability, boolean pcInstantiationCapability, |
42 | + boolean labelStackCapability, boolean srCapability) { | ||
38 | this.pceccCapability = pceccCapability; | 43 | this.pceccCapability = pceccCapability; |
39 | this.statefulPceCapability = statefulPceCapability; | 44 | this.statefulPceCapability = statefulPceCapability; |
40 | this.pcInstantiationCapability = pcInstantiationCapability; | 45 | this.pcInstantiationCapability = pcInstantiationCapability; |
46 | + this.labelStackCapability = labelStackCapability; | ||
47 | + this.srCapability = srCapability; | ||
48 | + } | ||
49 | + | ||
50 | + /** | ||
51 | + * Obtains label stack capability. | ||
52 | + * | ||
53 | + * @return true if client supports PCECC capability with S bit set otherwise false | ||
54 | + */ | ||
55 | + public boolean labelStackCapability() { | ||
56 | + return labelStackCapability; | ||
57 | + } | ||
58 | + | ||
59 | + /** | ||
60 | + * Obtains segment routing capability. | ||
61 | + * | ||
62 | + * @return true if client supports SR capability otherwise false | ||
63 | + */ | ||
64 | + public boolean srCapability() { | ||
65 | + return srCapability; | ||
41 | } | 66 | } |
42 | 67 | ||
43 | /** | 68 | /** |
... | @@ -69,7 +94,8 @@ public class ClientCapability { | ... | @@ -69,7 +94,8 @@ public class ClientCapability { |
69 | 94 | ||
70 | @Override | 95 | @Override |
71 | public int hashCode() { | 96 | public int hashCode() { |
72 | - return Objects.hash(pceccCapability, statefulPceCapability, pcInstantiationCapability); | 97 | + return Objects.hash(pceccCapability, statefulPceCapability, pcInstantiationCapability, labelStackCapability, |
98 | + srCapability); | ||
73 | } | 99 | } |
74 | 100 | ||
75 | @Override | 101 | @Override |
... | @@ -81,7 +107,9 @@ public class ClientCapability { | ... | @@ -81,7 +107,9 @@ public class ClientCapability { |
81 | ClientCapability other = (ClientCapability) obj; | 107 | ClientCapability other = (ClientCapability) obj; |
82 | return Objects.equals(pceccCapability, other.pceccCapability) | 108 | return Objects.equals(pceccCapability, other.pceccCapability) |
83 | && Objects.equals(statefulPceCapability, other.statefulPceCapability) | 109 | && Objects.equals(statefulPceCapability, other.statefulPceCapability) |
84 | - && Objects.equals(pcInstantiationCapability, other.pcInstantiationCapability); | 110 | + && Objects.equals(pcInstantiationCapability, other.pcInstantiationCapability) |
111 | + && Objects.equals(labelStackCapability, other.labelStackCapability) | ||
112 | + && Objects.equals(srCapability, other.srCapability); | ||
85 | } | 113 | } |
86 | return false; | 114 | return false; |
87 | } | 115 | } |
... | @@ -92,6 +120,8 @@ public class ClientCapability { | ... | @@ -92,6 +120,8 @@ public class ClientCapability { |
92 | .add("pceccCapability", pceccCapability) | 120 | .add("pceccCapability", pceccCapability) |
93 | .add("statefulPceCapability", statefulPceCapability) | 121 | .add("statefulPceCapability", statefulPceCapability) |
94 | .add("pcInstantiationCapability", pcInstantiationCapability) | 122 | .add("pcInstantiationCapability", pcInstantiationCapability) |
123 | + .add("labelStackCapability", labelStackCapability) | ||
124 | + .add("srCapability", srCapability) | ||
95 | .toString(); | 125 | .toString(); |
96 | } | 126 | } |
97 | } | 127 | } |
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
... | @@ -135,4 +135,18 @@ public interface PcepClient { | ... | @@ -135,4 +135,18 @@ public interface PcepClient { |
135 | * @return capability supported by client | 135 | * @return capability supported by client |
136 | */ | 136 | */ |
137 | ClientCapability capability(); | 137 | ClientCapability capability(); |
138 | + | ||
139 | + /** | ||
140 | + * Adds PCEP device when session is successfully established. | ||
141 | + * | ||
142 | + * @param pc PCEP client details | ||
143 | + */ | ||
144 | + void addNode(PcepClient pc); | ||
145 | + | ||
146 | + /** | ||
147 | + * Removes PCEP device when session is disconnected. | ||
148 | + * | ||
149 | + * @param pccId PCEP client ID | ||
150 | + */ | ||
151 | + void deleteNode(PccId pccId); | ||
138 | } | 152 | } | ... | ... |
... | @@ -57,7 +57,7 @@ public interface PcepClientController { | ... | @@ -57,7 +57,7 @@ public interface PcepClientController { |
57 | void removeListener(PcepClientListener listener); | 57 | void removeListener(PcepClientListener listener); |
58 | 58 | ||
59 | /** | 59 | /** |
60 | - * Register a listener for OF msg events. | 60 | + * Register a listener for PCEP msg events. |
61 | * | 61 | * |
62 | * @param listener the listener to notify | 62 | * @param listener the listener to notify |
63 | */ | 63 | */ |
... | @@ -71,6 +71,20 @@ public interface PcepClientController { | ... | @@ -71,6 +71,20 @@ public interface PcepClientController { |
71 | void removeEventListener(PcepEventListener listener); | 71 | void removeEventListener(PcepEventListener listener); |
72 | 72 | ||
73 | /** | 73 | /** |
74 | + * Register a listener for PCEP msg events[carrying node descriptor details]. | ||
75 | + * | ||
76 | + * @param listener the listener to notify | ||
77 | + */ | ||
78 | + void addNodeListener(PcepNodeListener listener); | ||
79 | + | ||
80 | + /** | ||
81 | + * Unregister a listener. | ||
82 | + * | ||
83 | + * @param listener the listener to be unregistered | ||
84 | + */ | ||
85 | + void removeNodeListener(PcepNodeListener listener); | ||
86 | + | ||
87 | + /** | ||
74 | * Send a message to a particular pcc client. | 88 | * Send a message to a particular pcc client. |
75 | * | 89 | * |
76 | * @param pccId the id of the client to send message. | 90 | * @param pccId the id of the client to send message. | ... | ... |
1 | +/* | ||
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 | +package org.onosproject.pcep.controller; | ||
17 | + | ||
18 | +/** | ||
19 | + * Notifies providers about PCEP node events. | ||
20 | + */ | ||
21 | +public interface PcepNodeListener { | ||
22 | + | ||
23 | + /** | ||
24 | + * Notifies that the node was added. | ||
25 | + * | ||
26 | + * @param pc PCEP client details | ||
27 | + */ | ||
28 | + void addNode(PcepClient pc); | ||
29 | + | ||
30 | + /** | ||
31 | + * Notifies that the node was removed. | ||
32 | + * | ||
33 | + * @param pccId PCEP client ID | ||
34 | + */ | ||
35 | + void deleteNode(PccId pccId); | ||
36 | +} |
... | @@ -60,4 +60,17 @@ public interface PcepAgent { | ... | @@ -60,4 +60,17 @@ public interface PcepAgent { |
60 | */ | 60 | */ |
61 | void processPcepMessage(PccId pccId, PcepMessage m); | 61 | void processPcepMessage(PccId pccId, PcepMessage m); |
62 | 62 | ||
63 | + /** | ||
64 | + * Adds PCEP device when session is successfully established. | ||
65 | + * | ||
66 | + * @param pc PCEP client details | ||
67 | + */ | ||
68 | + void addNode(PcepClient pc); | ||
69 | + | ||
70 | + /** | ||
71 | + * Removes PCEP device when session is disconnected. | ||
72 | + * | ||
73 | + * @param pccId PCEP client ID | ||
74 | + */ | ||
75 | + void deleteNode(PccId pccId); | ||
63 | } | 76 | } | ... | ... |
... | @@ -55,6 +55,7 @@ import org.onosproject.pcepio.protocol.PcepVersion; | ... | @@ -55,6 +55,7 @@ import org.onosproject.pcepio.protocol.PcepVersion; |
55 | import org.onosproject.pcepio.types.IPv4RouterIdOfLocalNodeSubTlv; | 55 | import org.onosproject.pcepio.types.IPv4RouterIdOfLocalNodeSubTlv; |
56 | import org.onosproject.pcepio.types.NodeAttributesTlv; | 56 | import org.onosproject.pcepio.types.NodeAttributesTlv; |
57 | import org.onosproject.pcepio.types.PceccCapabilityTlv; | 57 | import org.onosproject.pcepio.types.PceccCapabilityTlv; |
58 | +import org.onosproject.pcepio.types.SrPceCapabilityTlv; | ||
58 | import org.onosproject.pcepio.types.StatefulPceCapabilityTlv; | 59 | import org.onosproject.pcepio.types.StatefulPceCapabilityTlv; |
59 | import org.onosproject.pcepio.types.PcepErrorDetailInfo; | 60 | import org.onosproject.pcepio.types.PcepErrorDetailInfo; |
60 | import org.onosproject.pcepio.types.PcepValueType; | 61 | import org.onosproject.pcepio.types.PcepValueType; |
... | @@ -260,6 +261,8 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { | ... | @@ -260,6 +261,8 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { |
260 | disconnectDuplicate(h); | 261 | disconnectDuplicate(h); |
261 | } else { | 262 | } else { |
262 | h.setState(ESTABLISHED); | 263 | h.setState(ESTABLISHED); |
264 | + //Session is established, add a PCEP device | ||
265 | + h.addNode(); | ||
263 | } | 266 | } |
264 | } | 267 | } |
265 | } | 268 | } |
... | @@ -469,6 +472,20 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { | ... | @@ -469,6 +472,20 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { |
469 | } | 472 | } |
470 | 473 | ||
471 | /** | 474 | /** |
475 | + * Adds PCEP device once session is established. | ||
476 | + */ | ||
477 | + private void addNode() { | ||
478 | + pc.addNode(pc); | ||
479 | + } | ||
480 | + | ||
481 | + /** | ||
482 | + * Deletes PCEP device when session is disconnected. | ||
483 | + */ | ||
484 | + private void deleteNode() { | ||
485 | + pc.deleteNode(pc.getPccId()); | ||
486 | + } | ||
487 | + | ||
488 | + /** | ||
472 | * Return a string describing this client based on the already available | 489 | * Return a string describing this client based on the already available |
473 | * information (ip address and/or remote socket). | 490 | * information (ip address and/or remote socket). |
474 | * | 491 | * |
... | @@ -523,6 +540,8 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { | ... | @@ -523,6 +540,8 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { |
523 | boolean pceccCapability = false; | 540 | boolean pceccCapability = false; |
524 | boolean statefulPceCapability = false; | 541 | boolean statefulPceCapability = false; |
525 | boolean pcInstantiationCapability = false; | 542 | boolean pcInstantiationCapability = false; |
543 | + boolean labelStackCapability = false; | ||
544 | + boolean srCapability = false; | ||
526 | 545 | ||
527 | ListIterator<PcepValueType> listIterator = tlvList.listIterator(); | 546 | ListIterator<PcepValueType> listIterator = tlvList.listIterator(); |
528 | while (listIterator.hasNext()) { | 547 | while (listIterator.hasNext()) { |
... | @@ -531,6 +550,9 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { | ... | @@ -531,6 +550,9 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { |
531 | switch (tlv.getType()) { | 550 | switch (tlv.getType()) { |
532 | case PceccCapabilityTlv.TYPE: | 551 | case PceccCapabilityTlv.TYPE: |
533 | pceccCapability = true; | 552 | pceccCapability = true; |
553 | + if (((PceccCapabilityTlv) tlv).sBit()) { | ||
554 | + labelStackCapability = true; | ||
555 | + } | ||
534 | break; | 556 | break; |
535 | case StatefulPceCapabilityTlv.TYPE: | 557 | case StatefulPceCapabilityTlv.TYPE: |
536 | statefulPceCapability = true; | 558 | statefulPceCapability = true; |
... | @@ -539,11 +561,15 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { | ... | @@ -539,11 +561,15 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { |
539 | pcInstantiationCapability = true; | 561 | pcInstantiationCapability = true; |
540 | } | 562 | } |
541 | break; | 563 | break; |
564 | + case SrPceCapabilityTlv.TYPE: | ||
565 | + srCapability = true; | ||
566 | + break; | ||
542 | default: | 567 | default: |
543 | continue; | 568 | continue; |
544 | } | 569 | } |
545 | } | 570 | } |
546 | - this.capability = new ClientCapability(pceccCapability, statefulPceCapability, pcInstantiationCapability); | 571 | + this.capability = new ClientCapability(pceccCapability, statefulPceCapability, pcInstantiationCapability, |
572 | + labelStackCapability, srCapability); | ||
547 | } | 573 | } |
548 | 574 | ||
549 | /** | 575 | /** |
... | @@ -563,6 +589,8 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { | ... | @@ -563,6 +589,8 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { |
563 | */ | 589 | */ |
564 | private void sendErrMsgAndCloseChannel() { | 590 | private void sendErrMsgAndCloseChannel() { |
565 | // TODO send error message | 591 | // TODO send error message |
592 | + //Remove PCEP device from topology | ||
593 | + deleteNode(); | ||
566 | channel.close(); | 594 | channel.close(); |
567 | } | 595 | } |
568 | 596 | ... | ... |
... | @@ -25,12 +25,16 @@ import java.util.concurrent.ConcurrentHashMap; | ... | @@ -25,12 +25,16 @@ import java.util.concurrent.ConcurrentHashMap; |
25 | import org.apache.felix.scr.annotations.Activate; | 25 | import org.apache.felix.scr.annotations.Activate; |
26 | import org.apache.felix.scr.annotations.Component; | 26 | import org.apache.felix.scr.annotations.Component; |
27 | import org.apache.felix.scr.annotations.Deactivate; | 27 | import org.apache.felix.scr.annotations.Deactivate; |
28 | +import org.apache.felix.scr.annotations.Reference; | ||
29 | +import org.apache.felix.scr.annotations.ReferenceCardinality; | ||
28 | import org.apache.felix.scr.annotations.Service; | 30 | import org.apache.felix.scr.annotations.Service; |
31 | +import org.onosproject.net.device.DeviceService; | ||
29 | import org.onosproject.pcep.controller.PccId; | 32 | import org.onosproject.pcep.controller.PccId; |
30 | import org.onosproject.pcep.controller.PcepClient; | 33 | import org.onosproject.pcep.controller.PcepClient; |
31 | import org.onosproject.pcep.controller.PcepClientController; | 34 | import org.onosproject.pcep.controller.PcepClientController; |
32 | import org.onosproject.pcep.controller.PcepClientListener; | 35 | import org.onosproject.pcep.controller.PcepClientListener; |
33 | import org.onosproject.pcep.controller.PcepEventListener; | 36 | import org.onosproject.pcep.controller.PcepEventListener; |
37 | +import org.onosproject.pcep.controller.PcepNodeListener; | ||
34 | import org.onosproject.pcep.controller.driver.PcepAgent; | 38 | import org.onosproject.pcep.controller.driver.PcepAgent; |
35 | import org.onosproject.pcepio.protocol.PcepError; | 39 | import org.onosproject.pcepio.protocol.PcepError; |
36 | import org.onosproject.pcepio.protocol.PcepErrorInfo; | 40 | import org.onosproject.pcepio.protocol.PcepErrorInfo; |
... | @@ -55,6 +59,9 @@ public class PcepClientControllerImpl implements PcepClientController { | ... | @@ -55,6 +59,9 @@ public class PcepClientControllerImpl implements PcepClientController { |
55 | 59 | ||
56 | private static final Logger log = LoggerFactory.getLogger(PcepClientControllerImpl.class); | 60 | private static final Logger log = LoggerFactory.getLogger(PcepClientControllerImpl.class); |
57 | 61 | ||
62 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
63 | + protected DeviceService deviceService; | ||
64 | + | ||
58 | protected ConcurrentHashMap<PccId, PcepClient> connectedClients = | 65 | protected ConcurrentHashMap<PccId, PcepClient> connectedClients = |
59 | new ConcurrentHashMap<>(); | 66 | new ConcurrentHashMap<>(); |
60 | 67 | ||
... | @@ -62,6 +69,7 @@ public class PcepClientControllerImpl implements PcepClientController { | ... | @@ -62,6 +69,7 @@ public class PcepClientControllerImpl implements PcepClientController { |
62 | protected Set<PcepClientListener> pcepClientListener = new HashSet<>(); | 69 | protected Set<PcepClientListener> pcepClientListener = new HashSet<>(); |
63 | 70 | ||
64 | protected Set<PcepEventListener> pcepEventListener = Sets.newHashSet(); | 71 | protected Set<PcepEventListener> pcepEventListener = Sets.newHashSet(); |
72 | + protected Set<PcepNodeListener> pcepNodeListener = Sets.newHashSet(); | ||
65 | 73 | ||
66 | private final Controller ctrl = new Controller(); | 74 | private final Controller ctrl = new Controller(); |
67 | 75 | ||
... | @@ -117,6 +125,16 @@ public class PcepClientControllerImpl implements PcepClientController { | ... | @@ -117,6 +125,16 @@ public class PcepClientControllerImpl implements PcepClientController { |
117 | } | 125 | } |
118 | 126 | ||
119 | @Override | 127 | @Override |
128 | + public void addNodeListener(PcepNodeListener listener) { | ||
129 | + pcepNodeListener.add(listener); | ||
130 | + } | ||
131 | + | ||
132 | + @Override | ||
133 | + public void removeNodeListener(PcepNodeListener listener) { | ||
134 | + pcepNodeListener.remove(listener); | ||
135 | + } | ||
136 | + | ||
137 | + @Override | ||
120 | public void processClientMessage(PccId pccId, PcepMessage msg) { | 138 | public void processClientMessage(PccId pccId, PcepMessage msg) { |
121 | PcepClient pc = getClient(pccId); | 139 | PcepClient pc = getClient(pccId); |
122 | 140 | ||
... | @@ -173,6 +191,8 @@ public class PcepClientControllerImpl implements PcepClientController { | ... | @@ -173,6 +191,8 @@ public class PcepClientControllerImpl implements PcepClientController { |
173 | break; | 191 | break; |
174 | case LABEL_RANGE_RESERV: | 192 | case LABEL_RANGE_RESERV: |
175 | break; | 193 | break; |
194 | + case LS_REPORT: //TODO: need to handle LS report to add or remove node | ||
195 | + break; | ||
176 | case MAX: | 196 | case MAX: |
177 | break; | 197 | break; |
178 | case END: | 198 | case END: |
... | @@ -270,5 +290,19 @@ public class PcepClientControllerImpl implements PcepClientController { | ... | @@ -270,5 +290,19 @@ public class PcepClientControllerImpl implements PcepClientController { |
270 | public void processPcepMessage(PccId pccId, PcepMessage m) { | 290 | public void processPcepMessage(PccId pccId, PcepMessage m) { |
271 | processClientMessage(pccId, m); | 291 | processClientMessage(pccId, m); |
272 | } | 292 | } |
293 | + | ||
294 | + @Override | ||
295 | + public void addNode(PcepClient pc) { | ||
296 | + for (PcepNodeListener l : pcepNodeListener) { | ||
297 | + l.addNode(pc); | ||
298 | + } | ||
299 | + } | ||
300 | + | ||
301 | + @Override | ||
302 | + public void deleteNode(PccId pccId) { | ||
303 | + for (PcepNodeListener l : pcepNodeListener) { | ||
304 | + l.deleteNode(pccId); | ||
305 | + } | ||
306 | + } | ||
273 | } | 307 | } |
274 | } | 308 | } | ... | ... |
... | @@ -26,6 +26,7 @@ import org.jboss.netty.channel.Channel; | ... | @@ -26,6 +26,7 @@ import org.jboss.netty.channel.Channel; |
26 | import org.onlab.packet.IpAddress; | 26 | import org.onlab.packet.IpAddress; |
27 | import org.onosproject.pcep.controller.ClientCapability; | 27 | import org.onosproject.pcep.controller.ClientCapability; |
28 | import org.onosproject.pcep.controller.PccId; | 28 | import org.onosproject.pcep.controller.PccId; |
29 | +import org.onosproject.pcep.controller.PcepClient; | ||
29 | import org.onosproject.pcep.controller.PcepPacketStats; | 30 | import org.onosproject.pcep.controller.PcepPacketStats; |
30 | import org.onosproject.pcep.controller.PcepSyncStatus; | 31 | import org.onosproject.pcep.controller.PcepSyncStatus; |
31 | import org.onosproject.pcep.controller.driver.PcepAgent; | 32 | import org.onosproject.pcep.controller.driver.PcepAgent; |
... | @@ -203,6 +204,16 @@ public class PcepClientImpl implements PcepClientDriver { | ... | @@ -203,6 +204,16 @@ public class PcepClientImpl implements PcepClientDriver { |
203 | } | 204 | } |
204 | 205 | ||
205 | @Override | 206 | @Override |
207 | + public void addNode(PcepClient pc) { | ||
208 | + this.agent.addNode(pc); | ||
209 | + } | ||
210 | + | ||
211 | + @Override | ||
212 | + public void deleteNode(PccId pccId) { | ||
213 | + this.agent.deleteNode(pccId); | ||
214 | + } | ||
215 | + | ||
216 | + @Override | ||
206 | public final boolean connectClient() { | 217 | public final boolean connectClient() { |
207 | return this.agent.addConnectedClient(pccId, this); | 218 | return this.agent.addConnectedClient(pccId, this); |
208 | } | 219 | } | ... | ... |
... | @@ -3,6 +3,9 @@ COMPILE_DEPS = [ | ... | @@ -3,6 +3,9 @@ COMPILE_DEPS = [ |
3 | '//protocols/ovsdb/api:onos-protocols-ovsdb-api', | 3 | '//protocols/ovsdb/api:onos-protocols-ovsdb-api', |
4 | '//protocols/ovsdb/rfc:onos-protocols-ovsdb-rfc', | 4 | '//protocols/ovsdb/rfc:onos-protocols-ovsdb-rfc', |
5 | '//apps/pcep-api:onos-apps-pcep-api', | 5 | '//apps/pcep-api:onos-apps-pcep-api', |
6 | + '//protocols/pcep/api:onos-protocols-pcep-api', | ||
7 | + '//protocols/pcep/pcepio:onos-protocols-pcep-pcepio', | ||
8 | + '//core/api:onos-api-tests', | ||
6 | ] | 9 | ] |
7 | 10 | ||
8 | osgi_jar_with_tests ( | 11 | osgi_jar_with_tests ( | ... | ... |
... | @@ -29,5 +29,15 @@ | ... | @@ -29,5 +29,15 @@ |
29 | <groupId>org.onosproject</groupId> | 29 | <groupId>org.onosproject</groupId> |
30 | <artifactId>onos-app-pcep-api</artifactId> | 30 | <artifactId>onos-app-pcep-api</artifactId> |
31 | </dependency> | 31 | </dependency> |
32 | + <dependency> | ||
33 | + <groupId>org.onosproject</groupId> | ||
34 | + <artifactId>onos-pcep-controller-api</artifactId> | ||
35 | + </dependency> | ||
36 | + <dependency> | ||
37 | + <groupId>org.onosproject</groupId> | ||
38 | + <artifactId>onos-api</artifactId> | ||
39 | + <classifier>tests</classifier> | ||
40 | + <scope>test</scope> | ||
41 | + </dependency> | ||
32 | </dependencies> | 42 | </dependencies> |
33 | </project> | 43 | </project> | ... | ... |
... | @@ -62,6 +62,10 @@ import org.onosproject.pcep.api.PcepLinkListener; | ... | @@ -62,6 +62,10 @@ import org.onosproject.pcep.api.PcepLinkListener; |
62 | import org.onosproject.pcep.api.PcepOperator.OperationType; | 62 | import org.onosproject.pcep.api.PcepOperator.OperationType; |
63 | import org.onosproject.pcep.api.PcepSwitch; | 63 | import org.onosproject.pcep.api.PcepSwitch; |
64 | import org.onosproject.pcep.api.PcepSwitchListener; | 64 | import org.onosproject.pcep.api.PcepSwitchListener; |
65 | +import org.onosproject.pcep.controller.PccId; | ||
66 | +import org.onosproject.pcep.controller.PcepClient; | ||
67 | +import org.onosproject.pcep.controller.PcepClientController; | ||
68 | +import org.onosproject.pcep.controller.PcepNodeListener; | ||
65 | import org.slf4j.Logger; | 69 | import org.slf4j.Logger; |
66 | import org.slf4j.LoggerFactory; | 70 | import org.slf4j.LoggerFactory; |
67 | 71 | ||
... | @@ -115,18 +119,40 @@ public class PcepTopologyProvider extends AbstractProvider | ... | @@ -115,18 +119,40 @@ public class PcepTopologyProvider extends AbstractProvider |
115 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 119 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
116 | protected ClusterService clusterService; | 120 | protected ClusterService clusterService; |
117 | 121 | ||
122 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
123 | + protected PcepClientController pcepClientController; | ||
124 | + | ||
118 | private DeviceProviderService deviceProviderService; | 125 | private DeviceProviderService deviceProviderService; |
119 | private LinkProviderService linkProviderService; | 126 | private LinkProviderService linkProviderService; |
120 | 127 | ||
121 | private HashMap<Long, List<PortDescription>> portMap = new HashMap<>(); | 128 | private HashMap<Long, List<PortDescription>> portMap = new HashMap<>(); |
122 | private InternalLinkProvider listener = new InternalLinkProvider(); | 129 | private InternalLinkProvider listener = new InternalLinkProvider(); |
123 | 130 | ||
131 | + /* | ||
132 | + * For the client supporting SR capability. | ||
133 | + */ | ||
134 | + public static final String SR_CAPABILITY = "srCapability"; | ||
135 | + | ||
136 | + /* | ||
137 | + * For the client supporting PCECC capability. | ||
138 | + */ | ||
139 | + public static final String PCECC_CAPABILITY = "pceccCapability"; | ||
140 | + | ||
141 | + /* | ||
142 | + * For the client supporting label stack capability. | ||
143 | + */ | ||
144 | + public static final String LABEL_STACK_CAPABILITY = "labelStackCapability"; | ||
145 | + | ||
146 | + public static final String LSRID = "lsrId"; | ||
147 | + private static final String UNKNOWN = "unknown"; | ||
148 | + | ||
124 | @Activate | 149 | @Activate |
125 | public void activate() { | 150 | public void activate() { |
126 | linkProviderService = linkProviderRegistry.register(this); | 151 | linkProviderService = linkProviderRegistry.register(this); |
127 | deviceProviderService = deviceProviderRegistry.register(this); | 152 | deviceProviderService = deviceProviderRegistry.register(this); |
128 | controller.addListener(listener); | 153 | controller.addListener(listener); |
129 | controller.addLinkListener(listener); | 154 | controller.addLinkListener(listener); |
155 | + pcepClientController.addNodeListener(listener); | ||
130 | } | 156 | } |
131 | 157 | ||
132 | @Deactivate | 158 | @Deactivate |
... | @@ -135,6 +161,7 @@ public class PcepTopologyProvider extends AbstractProvider | ... | @@ -135,6 +161,7 @@ public class PcepTopologyProvider extends AbstractProvider |
135 | linkProviderService = null; | 161 | linkProviderService = null; |
136 | controller.removeListener(listener); | 162 | controller.removeListener(listener); |
137 | controller.removeLinkListener(listener); | 163 | controller.removeLinkListener(listener); |
164 | + pcepClientController.removeNodeListener(listener); | ||
138 | } | 165 | } |
139 | 166 | ||
140 | private List<PortDescription> buildPortDescriptions(PcepDpid dpid, | 167 | private List<PortDescription> buildPortDescriptions(PcepDpid dpid, |
... | @@ -225,7 +252,7 @@ public class PcepTopologyProvider extends AbstractProvider | ... | @@ -225,7 +252,7 @@ public class PcepTopologyProvider extends AbstractProvider |
225 | } | 252 | } |
226 | 253 | ||
227 | private class InternalLinkProvider | 254 | private class InternalLinkProvider |
228 | - implements PcepSwitchListener, PcepLinkListener { | 255 | + implements PcepSwitchListener, PcepLinkListener, PcepNodeListener { |
229 | 256 | ||
230 | @Override | 257 | @Override |
231 | public void switchAdded(PcepDpid dpid) { | 258 | public void switchAdded(PcepDpid dpid) { |
... | @@ -306,6 +333,51 @@ public class PcepTopologyProvider extends AbstractProvider | ... | @@ -306,6 +333,51 @@ public class PcepTopologyProvider extends AbstractProvider |
306 | } | 333 | } |
307 | } | 334 | } |
308 | 335 | ||
336 | + @Override | ||
337 | + public void addNode(PcepClient pc) { | ||
338 | + if (deviceProviderService == null) { | ||
339 | + return; | ||
340 | + } | ||
341 | + | ||
342 | + //Right now device URI for PCEP devices is their LSRID | ||
343 | + DeviceId deviceId = deviceId(uri(new PcepDpid(pc.getPccId().id().getIp4Address().toInt()))); | ||
344 | + ChassisId cId = new ChassisId(); | ||
345 | + | ||
346 | + Device.Type deviceType = Device.Type.ROUTER; | ||
347 | + | ||
348 | + DefaultAnnotations.Builder annotationBuilder = DefaultAnnotations.builder(); | ||
349 | + //PCC capabilities (SR, PCECC and PCECC-SR) | ||
350 | + annotationBuilder.set(SR_CAPABILITY, String.valueOf(pc.capability().srCapability())); | ||
351 | + annotationBuilder.set(PCECC_CAPABILITY, String.valueOf(pc.capability().pceccCapability())); | ||
352 | + annotationBuilder.set(LABEL_STACK_CAPABILITY, String.valueOf(pc.capability().labelStackCapability())); | ||
353 | + //PccId is the lsrId contained in openMsg, if not present it will be the socket address | ||
354 | + annotationBuilder.set(LSRID, String.valueOf(pc.getPccId().id())); | ||
355 | + | ||
356 | + DeviceDescription description = new DefaultDeviceDescription( | ||
357 | + deviceId.uri(), | ||
358 | + deviceType, | ||
359 | + UNKNOWN, | ||
360 | + UNKNOWN, | ||
361 | + UNKNOWN, | ||
362 | + UNKNOWN, | ||
363 | + cId, | ||
364 | + annotationBuilder.build()); | ||
365 | + | ||
366 | + deviceProviderService.deviceConnected(deviceId, description); | ||
367 | + } | ||
368 | + | ||
369 | + @Override | ||
370 | + public void deleteNode(PccId pccId) { | ||
371 | + if (deviceProviderService == null || deviceService == null) { | ||
372 | + return; | ||
373 | + } | ||
374 | + //TODO: In device manager, in deviceDisconnected() method, get the device but null check is not validated | ||
375 | + if (deviceService.getDevice(DeviceId.deviceId(uri(new PcepDpid(pccId.id() | ||
376 | + .getIp4Address().toInt())))) == null) { | ||
377 | + return; | ||
378 | + } | ||
379 | + deviceProviderService.deviceDisconnected(deviceId(uri(new PcepDpid(pccId.id().getIp4Address().toInt())))); | ||
380 | + } | ||
309 | } | 381 | } |
310 | 382 | ||
311 | @Override | 383 | @Override | ... | ... |
1 | +/* | ||
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 | +package org.onosproject.provider.pcep.topology.impl; | ||
17 | + | ||
18 | +import static org.junit.Assert.assertNotNull; | ||
19 | + | ||
20 | +import java.util.List; | ||
21 | +import java.util.concurrent.RejectedExecutionException; | ||
22 | + | ||
23 | +import org.jboss.netty.channel.Channel; | ||
24 | +import org.onosproject.pcep.controller.ClientCapability; | ||
25 | +import org.onosproject.pcep.controller.PccId; | ||
26 | +import org.onosproject.pcep.controller.PcepClient; | ||
27 | +import org.onosproject.pcep.controller.PcepSyncStatus; | ||
28 | +import org.onosproject.pcepio.protocol.PcepFactories; | ||
29 | +import org.onosproject.pcepio.protocol.PcepFactory; | ||
30 | +import org.onosproject.pcepio.protocol.PcepMessage; | ||
31 | +import org.onosproject.pcepio.protocol.PcepVersion; | ||
32 | + | ||
33 | +/** | ||
34 | + * Representation of PCEP client adapter. | ||
35 | + */ | ||
36 | +public class PcepClientAdapter implements PcepClient { | ||
37 | + | ||
38 | + private Channel channel; | ||
39 | + protected String channelId; | ||
40 | + | ||
41 | + private boolean connected; | ||
42 | + private PccId pccId; | ||
43 | + private ClientCapability capability; | ||
44 | + | ||
45 | + private PcepVersion pcepVersion; | ||
46 | + private PcepSyncStatus lspDbSyncStatus; | ||
47 | + private PcepSyncStatus labelDbSyncStatus; | ||
48 | + | ||
49 | + /** | ||
50 | + * Initialize instance with specified parameters. | ||
51 | + * | ||
52 | + * @param pccId PCC id | ||
53 | + * @param pcepVersion PCEP message version | ||
54 | + */ | ||
55 | + public void init(PccId pccId, PcepVersion pcepVersion) { | ||
56 | + this.pccId = pccId; | ||
57 | + this.pcepVersion = pcepVersion; | ||
58 | + } | ||
59 | + | ||
60 | + @Override | ||
61 | + public final void disconnectClient() { | ||
62 | + this.channel.close(); | ||
63 | + } | ||
64 | + | ||
65 | + @Override | ||
66 | + public final void sendMessage(PcepMessage m) { | ||
67 | + } | ||
68 | + | ||
69 | + @Override | ||
70 | + public final void sendMessage(List<PcepMessage> msgs) { | ||
71 | + try { | ||
72 | + PcepMessage pcepMsg = msgs.get(0); | ||
73 | + assertNotNull("PCEP MSG should be created.", pcepMsg); | ||
74 | + } catch (RejectedExecutionException e) { | ||
75 | + throw e; | ||
76 | + } | ||
77 | + } | ||
78 | + | ||
79 | + @Override | ||
80 | + public final boolean isConnected() { | ||
81 | + return this.connected; | ||
82 | + } | ||
83 | + | ||
84 | + @Override | ||
85 | + public String channelId() { | ||
86 | + return channelId; | ||
87 | + } | ||
88 | + | ||
89 | + @Override | ||
90 | + public final PccId getPccId() { | ||
91 | + return this.pccId; | ||
92 | + }; | ||
93 | + | ||
94 | + @Override | ||
95 | + public final String getStringId() { | ||
96 | + return this.pccId.toString(); | ||
97 | + } | ||
98 | + | ||
99 | + @Override | ||
100 | + public final void handleMessage(PcepMessage m) { | ||
101 | + } | ||
102 | + | ||
103 | + @Override | ||
104 | + public boolean isOptical() { | ||
105 | + return false; | ||
106 | + } | ||
107 | + | ||
108 | + @Override | ||
109 | + public PcepFactory factory() { | ||
110 | + return PcepFactories.getFactory(pcepVersion); | ||
111 | + } | ||
112 | + | ||
113 | + @Override | ||
114 | + public void setLspDbSyncStatus(PcepSyncStatus syncStatus) { | ||
115 | + this.lspDbSyncStatus = syncStatus; | ||
116 | + } | ||
117 | + | ||
118 | + @Override | ||
119 | + public PcepSyncStatus lspDbSyncStatus() { | ||
120 | + return lspDbSyncStatus; | ||
121 | + } | ||
122 | + | ||
123 | + @Override | ||
124 | + public void setLabelDbSyncStatus(PcepSyncStatus syncStatus) { | ||
125 | + this.labelDbSyncStatus = syncStatus; | ||
126 | + } | ||
127 | + | ||
128 | + @Override | ||
129 | + public PcepSyncStatus labelDbSyncStatus() { | ||
130 | + return labelDbSyncStatus; | ||
131 | + } | ||
132 | + | ||
133 | + @Override | ||
134 | + public void setCapability(ClientCapability capability) { | ||
135 | + this.capability = capability; | ||
136 | + } | ||
137 | + | ||
138 | + @Override | ||
139 | + public ClientCapability capability() { | ||
140 | + return capability; | ||
141 | + } | ||
142 | + | ||
143 | + @Override | ||
144 | + public void addNode(PcepClient pc) { | ||
145 | + } | ||
146 | + | ||
147 | + @Override | ||
148 | + public void deleteNode(PccId pccId) { | ||
149 | + } | ||
150 | +} |
1 | +/* | ||
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 | +package org.onosproject.provider.pcep.topology.impl; | ||
17 | + | ||
18 | +import java.util.Collection; | ||
19 | +import java.util.Collections; | ||
20 | +import java.util.HashSet; | ||
21 | +import java.util.LinkedList; | ||
22 | +import java.util.Set; | ||
23 | +import java.util.concurrent.ConcurrentHashMap; | ||
24 | + | ||
25 | +import org.apache.felix.scr.annotations.Activate; | ||
26 | +import org.apache.felix.scr.annotations.Deactivate; | ||
27 | +import org.onlab.packet.IpAddress; | ||
28 | +import org.onosproject.pcep.controller.ClientCapability; | ||
29 | +import org.onosproject.pcep.controller.PccId; | ||
30 | +import org.onosproject.pcep.controller.PcepClient; | ||
31 | +import org.onosproject.pcep.controller.PcepClientController; | ||
32 | +import org.onosproject.pcep.controller.PcepClientListener; | ||
33 | +import org.onosproject.pcep.controller.PcepEventListener; | ||
34 | +import org.onosproject.pcep.controller.PcepNodeListener; | ||
35 | +import org.onosproject.pcep.controller.driver.PcepAgent; | ||
36 | +import org.onosproject.pcepio.protocol.PcepError; | ||
37 | +import org.onosproject.pcepio.protocol.PcepErrorInfo; | ||
38 | +import org.onosproject.pcepio.protocol.PcepErrorMsg; | ||
39 | +import org.onosproject.pcepio.protocol.PcepErrorObject; | ||
40 | +import org.onosproject.pcepio.protocol.PcepFactory; | ||
41 | +import org.onosproject.pcepio.protocol.PcepMessage; | ||
42 | +import org.onosproject.pcepio.protocol.PcepVersion; | ||
43 | + | ||
44 | +import com.google.common.collect.Sets; | ||
45 | + | ||
46 | +import static org.onosproject.pcepio.types.PcepErrorDetailInfo.ERROR_TYPE_19; | ||
47 | +import static org.onosproject.pcepio.types.PcepErrorDetailInfo.ERROR_VALUE_5; | ||
48 | + | ||
49 | +/** | ||
50 | + * Representation of PCEP client controller adapter. | ||
51 | + */ | ||
52 | +public class PcepClientControllerAdapter implements PcepClientController { | ||
53 | + | ||
54 | + protected ConcurrentHashMap<PccId, PcepClient> connectedClients = | ||
55 | + new ConcurrentHashMap<PccId, PcepClient>(); | ||
56 | + | ||
57 | + protected PcepClientAgent agent = new PcepClientAgent(); | ||
58 | + protected Set<PcepClientListener> pcepClientListener = new HashSet<>(); | ||
59 | + | ||
60 | + protected Set<PcepEventListener> pcepEventListener = Sets.newHashSet(); | ||
61 | + public Set<PcepNodeListener> pcepNodeListener = Sets.newHashSet(); | ||
62 | + | ||
63 | + @Activate | ||
64 | + public void activate() { | ||
65 | + } | ||
66 | + | ||
67 | + @Deactivate | ||
68 | + public void deactivate() { | ||
69 | + } | ||
70 | + | ||
71 | + @Override | ||
72 | + public Collection<PcepClient> getClients() { | ||
73 | + return connectedClients.values(); | ||
74 | + } | ||
75 | + | ||
76 | + @Override | ||
77 | + public PcepClient getClient(PccId pccId) { | ||
78 | + if (null != connectedClients.get(pccId)) { | ||
79 | + return connectedClients.get(pccId); | ||
80 | + } | ||
81 | + PcepClientAdapter pc = new PcepClientAdapter(); | ||
82 | + if (pccId.ipAddress().equals(IpAddress.valueOf(0xC010103)) | ||
83 | + || pccId.ipAddress().equals(IpAddress.valueOf(0xB6024E22))) { | ||
84 | + pc.setCapability(new ClientCapability(true, false, false, false, false)); | ||
85 | + } else { | ||
86 | + pc.setCapability(new ClientCapability(true, true, true, false, false)); | ||
87 | + } | ||
88 | + pc.init(PccId.pccId(pccId.ipAddress()), PcepVersion.PCEP_1); | ||
89 | + connectedClients.put(pccId, pc); | ||
90 | + return pc; | ||
91 | + } | ||
92 | + | ||
93 | + @Override | ||
94 | + public void addListener(PcepClientListener listener) { | ||
95 | + if (!pcepClientListener.contains(listener)) { | ||
96 | + this.pcepClientListener.add(listener); | ||
97 | + } | ||
98 | + } | ||
99 | + | ||
100 | + @Override | ||
101 | + public void addNodeListener(PcepNodeListener listener) { | ||
102 | + pcepNodeListener.add(listener); | ||
103 | + } | ||
104 | + | ||
105 | + @Override | ||
106 | + public void removeNodeListener(PcepNodeListener listener) { | ||
107 | + pcepNodeListener.remove(listener); | ||
108 | + } | ||
109 | + | ||
110 | + @Override | ||
111 | + public void removeListener(PcepClientListener listener) { | ||
112 | + this.pcepClientListener.remove(listener); | ||
113 | + } | ||
114 | + | ||
115 | + @Override | ||
116 | + public void addEventListener(PcepEventListener listener) { | ||
117 | + pcepEventListener.add(listener); | ||
118 | + } | ||
119 | + | ||
120 | + @Override | ||
121 | + public void removeEventListener(PcepEventListener listener) { | ||
122 | + pcepEventListener.remove(listener); | ||
123 | + } | ||
124 | + | ||
125 | + @Override | ||
126 | + public void writeMessage(PccId pccId, PcepMessage msg) { | ||
127 | + this.getClient(pccId).sendMessage(msg); | ||
128 | + } | ||
129 | + | ||
130 | + @Override | ||
131 | + public void processClientMessage(PccId pccId, PcepMessage msg) { | ||
132 | + | ||
133 | + PcepClient pc = getClient(pccId); | ||
134 | + | ||
135 | + switch (msg.getType()) { | ||
136 | + case NONE: | ||
137 | + break; | ||
138 | + case OPEN: | ||
139 | + break; | ||
140 | + case KEEP_ALIVE: | ||
141 | + //log.debug("Sending Keep Alive Message to {" + pccIpAddress.toString() + "}"); | ||
142 | + pc.sendMessage(Collections.singletonList(pc.factory().buildKeepaliveMsg().build())); | ||
143 | + break; | ||
144 | + case PATH_COMPUTATION_REQUEST: | ||
145 | + break; | ||
146 | + case PATH_COMPUTATION_REPLY: | ||
147 | + break; | ||
148 | + case NOTIFICATION: | ||
149 | + break; | ||
150 | + case ERROR: | ||
151 | + break; | ||
152 | + case CLOSE: | ||
153 | + //log.debug("Sending Close Message to { }", pccIpAddress.toString()); | ||
154 | + pc.sendMessage(Collections.singletonList(pc.factory().buildCloseMsg().build())); | ||
155 | + break; | ||
156 | + case INITIATE: | ||
157 | + if (!pc.capability().pcInstantiationCapability()) { | ||
158 | + pc.sendMessage(Collections.singletonList(getErrMsg(pc.factory(), | ||
159 | + ERROR_TYPE_19, ERROR_VALUE_5))); | ||
160 | + } | ||
161 | + break; | ||
162 | + case REPORT: | ||
163 | + //Only update the listener if respective capability is supported else send PCEP-ERR msg | ||
164 | + if (pc.capability().statefulPceCapability()) { | ||
165 | + for (PcepEventListener l : pcepEventListener) { | ||
166 | + l.handleMessage(pccId, msg); | ||
167 | + } | ||
168 | + } else { | ||
169 | + // Send PCEP-ERROR message. | ||
170 | + pc.sendMessage(Collections.singletonList(getErrMsg(pc.factory(), | ||
171 | + ERROR_TYPE_19, ERROR_VALUE_5))); | ||
172 | + } | ||
173 | + break; | ||
174 | + case UPDATE: | ||
175 | + if (!pc.capability().statefulPceCapability()) { | ||
176 | + pc.sendMessage(Collections.singletonList(getErrMsg(pc.factory(), | ||
177 | + ERROR_TYPE_19, ERROR_VALUE_5))); | ||
178 | + } | ||
179 | + break; | ||
180 | + case LABEL_UPDATE: | ||
181 | + if (!pc.capability().pceccCapability()) { | ||
182 | + pc.sendMessage(Collections.singletonList(getErrMsg(pc.factory(), | ||
183 | + ERROR_TYPE_19, ERROR_VALUE_5))); | ||
184 | + } | ||
185 | + break; | ||
186 | + case MAX: | ||
187 | + break; | ||
188 | + case END: | ||
189 | + break; | ||
190 | + default: | ||
191 | + break; | ||
192 | + } | ||
193 | + } | ||
194 | + | ||
195 | + @Override | ||
196 | + public void closeConnectedClients() { | ||
197 | + PcepClient pc; | ||
198 | + for (PccId id : connectedClients.keySet()) { | ||
199 | + pc = getClient(id); | ||
200 | + pc.disconnectClient(); | ||
201 | + } | ||
202 | + } | ||
203 | + | ||
204 | + private PcepErrorMsg getErrMsg(PcepFactory factory, byte errorType, byte errorValue) { | ||
205 | + LinkedList<PcepError> llPcepErr = new LinkedList<>(); | ||
206 | + | ||
207 | + LinkedList<PcepErrorObject> llerrObj = new LinkedList<>(); | ||
208 | + PcepErrorMsg errMsg; | ||
209 | + | ||
210 | + PcepErrorObject errObj = factory.buildPcepErrorObject().setErrorValue(errorValue).setErrorType(errorType) | ||
211 | + .build(); | ||
212 | + | ||
213 | + llerrObj.add(errObj); | ||
214 | + PcepError pcepErr = factory.buildPcepError().setErrorObjList(llerrObj).build(); | ||
215 | + | ||
216 | + llPcepErr.add(pcepErr); | ||
217 | + | ||
218 | + PcepErrorInfo errInfo = factory.buildPcepErrorInfo().setPcepErrorList(llPcepErr).build(); | ||
219 | + | ||
220 | + errMsg = factory.buildPcepErrorMsg().setPcepErrorInfo(errInfo).build(); | ||
221 | + return errMsg; | ||
222 | + } | ||
223 | + | ||
224 | + /** | ||
225 | + * Implementation of an Pcep Agent which is responsible for | ||
226 | + * keeping track of connected clients and the state in which | ||
227 | + * they are. | ||
228 | + */ | ||
229 | + public class PcepClientAgent implements PcepAgent { | ||
230 | + | ||
231 | + @Override | ||
232 | + public boolean addConnectedClient(PccId pccId, PcepClient pc) { | ||
233 | + | ||
234 | + if (connectedClients.get(pccId) != null) { | ||
235 | + return false; | ||
236 | + } else { | ||
237 | + connectedClients.put(pccId, pc); | ||
238 | + for (PcepClientListener l : pcepClientListener) { | ||
239 | + l.clientConnected(pccId); | ||
240 | + } | ||
241 | + return true; | ||
242 | + } | ||
243 | + } | ||
244 | + | ||
245 | + @Override | ||
246 | + public boolean validActivation(PccId pccId) { | ||
247 | + if (connectedClients.get(pccId) == null) { | ||
248 | + //log.error("Trying to activate client but is not in " | ||
249 | + // + "connected switches: pccIp {}. Aborting ..", pccIpAddress.toString()); | ||
250 | + return false; | ||
251 | + } | ||
252 | + | ||
253 | + return true; | ||
254 | + } | ||
255 | + | ||
256 | + @Override | ||
257 | + public void removeConnectedClient(PccId pccId) { | ||
258 | + connectedClients.remove(pccId); | ||
259 | + for (PcepClientListener l : pcepClientListener) { | ||
260 | + //log.warn("removal for {}", pccIpAddress.toString()); | ||
261 | + l.clientDisconnected(pccId); | ||
262 | + } | ||
263 | + } | ||
264 | + | ||
265 | + @Override | ||
266 | + public void processPcepMessage(PccId pccId, PcepMessage m) { | ||
267 | + processClientMessage(pccId, m); | ||
268 | + } | ||
269 | + | ||
270 | + @Override | ||
271 | + public void addNode(PcepClient pc) { | ||
272 | + for (PcepNodeListener l : pcepNodeListener) { | ||
273 | + l.addNode(pc); | ||
274 | + } | ||
275 | + } | ||
276 | + | ||
277 | + @Override | ||
278 | + public void deleteNode(PccId pccId) { | ||
279 | + for (PcepNodeListener l : pcepNodeListener) { | ||
280 | + l.deleteNode(pccId); | ||
281 | + } | ||
282 | + } | ||
283 | + } | ||
284 | +} |
1 | +/* | ||
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 | + | ||
17 | +package org.onosproject.provider.pcep.topology.impl; | ||
18 | + | ||
19 | +import org.onosproject.net.DeviceId; | ||
20 | +import org.onosproject.pcep.api.PcepController; | ||
21 | +import org.onosproject.pcep.api.PcepDpid; | ||
22 | +import org.onosproject.pcep.api.PcepLinkListener; | ||
23 | +import org.onosproject.pcep.api.PcepSwitch; | ||
24 | +import org.onosproject.pcep.api.PcepSwitchListener; | ||
25 | +import org.onosproject.pcep.api.PcepTunnel; | ||
26 | +import org.onosproject.pcep.api.PcepTunnelListener; | ||
27 | + | ||
28 | +/** | ||
29 | + * Implementation of PCEP controller. | ||
30 | + */ | ||
31 | +public class PcepControllerAdapter implements PcepController { | ||
32 | + | ||
33 | + @Override | ||
34 | + public Iterable<PcepSwitch> getSwitches() { | ||
35 | + return null; | ||
36 | + } | ||
37 | + | ||
38 | + @Override | ||
39 | + public PcepSwitch getSwitch(PcepDpid did) { | ||
40 | + return null; | ||
41 | + } | ||
42 | + | ||
43 | + @Override | ||
44 | + public void addListener(PcepSwitchListener listener) { | ||
45 | + | ||
46 | + } | ||
47 | + | ||
48 | + @Override | ||
49 | + public void removeListener(PcepSwitchListener listener) { | ||
50 | + } | ||
51 | + | ||
52 | + @Override | ||
53 | + public void addLinkListener(PcepLinkListener listener) { | ||
54 | + } | ||
55 | + | ||
56 | + @Override | ||
57 | + public void removeLinkListener(PcepLinkListener listener) { | ||
58 | + } | ||
59 | + | ||
60 | + @Override | ||
61 | + public void addTunnelListener(PcepTunnelListener listener) { | ||
62 | + } | ||
63 | + | ||
64 | + @Override | ||
65 | + public void removeTunnelListener(PcepTunnelListener listener) { | ||
66 | + } | ||
67 | + | ||
68 | + @Override | ||
69 | + public PcepTunnel applyTunnel(DeviceId srcDid, DeviceId dstDid, long srcPort, long dstPort, long bandwidth, | ||
70 | + String name) { | ||
71 | + return null; | ||
72 | + } | ||
73 | + | ||
74 | + @Override | ||
75 | + public Boolean deleteTunnel(String id) { | ||
76 | + return null; | ||
77 | + } | ||
78 | + | ||
79 | + @Override | ||
80 | + public Boolean updateTunnelBandwidth(String id, long bandwidth) { | ||
81 | + return null; | ||
82 | + } | ||
83 | + | ||
84 | + @Override | ||
85 | + public void getTunnelStatistics(String pcepTunnelId) { | ||
86 | + | ||
87 | + } | ||
88 | +} |
1 | +/* | ||
2 | + * Copyright 2016-present Open Networking Laboratory | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with | ||
5 | + * the License. You may obtain a copy of the License at | ||
6 | + * | ||
7 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
8 | + * | ||
9 | + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | ||
10 | + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | ||
11 | + * specific language governing permissions and limitations under the License. | ||
12 | + */ | ||
13 | +package org.onosproject.provider.pcep.topology.impl; | ||
14 | + | ||
15 | +import static org.hamcrest.MatcherAssert.assertThat; | ||
16 | +import static org.hamcrest.core.Is.is; | ||
17 | +import static org.onosproject.net.Link.State.ACTIVE; | ||
18 | +import static org.onosproject.provider.pcep.topology.impl.PcepTopologyProvider.LABEL_STACK_CAPABILITY; | ||
19 | +import static org.onosproject.provider.pcep.topology.impl.PcepTopologyProvider.LSRID; | ||
20 | +import static org.onosproject.provider.pcep.topology.impl.PcepTopologyProvider.PCECC_CAPABILITY; | ||
21 | +import static org.onosproject.provider.pcep.topology.impl.PcepTopologyProvider.SR_CAPABILITY; | ||
22 | + | ||
23 | +import java.util.Collection; | ||
24 | +import java.util.HashMap; | ||
25 | +import java.util.HashSet; | ||
26 | +import java.util.List; | ||
27 | +import java.util.Map; | ||
28 | +import java.util.Set; | ||
29 | + | ||
30 | +import org.junit.After; | ||
31 | +import org.junit.Before; | ||
32 | +import org.junit.Test; | ||
33 | +import org.onlab.packet.ChassisId; | ||
34 | +import org.onlab.packet.IpAddress; | ||
35 | +import org.onosproject.net.ConnectPoint; | ||
36 | +import org.onosproject.net.DefaultDevice; | ||
37 | +import org.onosproject.net.DefaultLink; | ||
38 | +import org.onosproject.net.Device; | ||
39 | +import org.onosproject.net.DeviceId; | ||
40 | +import org.onosproject.net.Link; | ||
41 | +import org.onosproject.net.MastershipRole; | ||
42 | +import org.onosproject.net.device.DeviceDescription; | ||
43 | +import org.onosproject.net.device.DeviceProvider; | ||
44 | +import org.onosproject.net.device.DeviceProviderRegistry; | ||
45 | +import org.onosproject.net.device.DeviceProviderService; | ||
46 | +import org.onosproject.net.device.DeviceServiceAdapter; | ||
47 | +import org.onosproject.net.device.PortDescription; | ||
48 | +import org.onosproject.net.device.PortStatistics; | ||
49 | +import org.onosproject.net.link.LinkDescription; | ||
50 | +import org.onosproject.net.link.LinkProvider; | ||
51 | +import org.onosproject.net.link.LinkProviderRegistry; | ||
52 | +import org.onosproject.net.link.LinkProviderService; | ||
53 | +import org.onosproject.net.provider.ProviderId; | ||
54 | +import org.onosproject.pcep.controller.ClientCapability; | ||
55 | +import org.onosproject.pcep.controller.PccId; | ||
56 | +import org.onosproject.pcep.controller.PcepClient; | ||
57 | +import org.onosproject.pcep.controller.PcepNodeListener; | ||
58 | + | ||
59 | +/** | ||
60 | + * Test for PCEP topology provider. | ||
61 | + */ | ||
62 | +public class PcepTopologyProviderTest { | ||
63 | + private static final String UNKNOWN = new String("unknown"); | ||
64 | + public static ProviderId providerId = new ProviderId("l3", "foo"); | ||
65 | + private final PcepClientControllerAdapter clientController = new PcepClientControllerAdapter(); | ||
66 | + private final PcepTopologyProvider provider = new PcepTopologyProvider(); | ||
67 | + private final MockDeviceRegistry nodeRegistry = new MockDeviceRegistry(); | ||
68 | + private final PcepControllerAdapter controller = new PcepControllerAdapter(); | ||
69 | + private final MockLinkRegistry linkRegistry = new MockLinkRegistry(); | ||
70 | + private final MockDeviceService deviceService = new MockDeviceService(); | ||
71 | + private Map<DeviceId, Device> deviceMap = new HashMap<>(); | ||
72 | + | ||
73 | + @Before | ||
74 | + public void startUp() { | ||
75 | + provider.pcepClientController = clientController; | ||
76 | + provider.deviceProviderRegistry = nodeRegistry; | ||
77 | + provider.linkProviderRegistry = linkRegistry; | ||
78 | + provider.controller = controller; | ||
79 | + provider.deviceService = deviceService; | ||
80 | + provider.activate(); | ||
81 | + } | ||
82 | + | ||
83 | + @After | ||
84 | + public void tearDown() { | ||
85 | + provider.deactivate(); | ||
86 | + provider.deviceProviderRegistry = null; | ||
87 | + provider.pcepClientController = null; | ||
88 | + provider.linkProviderRegistry = null; | ||
89 | + provider.controller = null; | ||
90 | + provider.deviceService = null; | ||
91 | + } | ||
92 | + | ||
93 | + /* Class implement device test registry */ | ||
94 | + private class MockLinkRegistry implements LinkProviderRegistry { | ||
95 | + LinkProvider linkProvider; | ||
96 | + Set<Link> links = new HashSet<>(); | ||
97 | + | ||
98 | + @Override | ||
99 | + public LinkProviderService register(LinkProvider provider) { | ||
100 | + this.linkProvider = provider; | ||
101 | + return new MockProviderService(); | ||
102 | + } | ||
103 | + | ||
104 | + @Override | ||
105 | + public void unregister(LinkProvider provider) { | ||
106 | + // TODO Auto-generated method stub | ||
107 | + } | ||
108 | + | ||
109 | + @Override | ||
110 | + public Set<ProviderId> getProviders() { | ||
111 | + return null; | ||
112 | + } | ||
113 | + | ||
114 | + private class MockProviderService implements LinkProviderService { | ||
115 | + | ||
116 | + @Override | ||
117 | + public void linkDetected(LinkDescription linkDescription) { | ||
118 | + links.add(DefaultLink.builder().src(linkDescription.src()) | ||
119 | + .dst(linkDescription.dst()).state(ACTIVE).type(linkDescription.type()) | ||
120 | + .providerId(ProviderId.NONE).build()); | ||
121 | + } | ||
122 | + | ||
123 | + @Override | ||
124 | + public void linkVanished(LinkDescription linkDescription) { | ||
125 | + links.remove(DefaultLink.builder().src(linkDescription.src()) | ||
126 | + .dst(linkDescription.dst()).state(ACTIVE).type(linkDescription.type()) | ||
127 | + .providerId(ProviderId.NONE).build()); | ||
128 | + } | ||
129 | + | ||
130 | + @Override | ||
131 | + public void linksVanished(ConnectPoint connectPoint) { | ||
132 | + // TODO Auto-generated method stub | ||
133 | + } | ||
134 | + | ||
135 | + @Override | ||
136 | + public void linksVanished(DeviceId deviceId) { | ||
137 | + // TODO Auto-generated method stub | ||
138 | + } | ||
139 | + | ||
140 | + @Override | ||
141 | + public LinkProvider provider() { | ||
142 | + // TODO Auto-generated method stub | ||
143 | + return null; | ||
144 | + } | ||
145 | + } | ||
146 | + } | ||
147 | + | ||
148 | + /* Class implement device test registry */ | ||
149 | + private class MockDeviceRegistry implements DeviceProviderRegistry { | ||
150 | + DeviceProvider provider; | ||
151 | + | ||
152 | + Set<DeviceId> connected = new HashSet<>(); | ||
153 | + | ||
154 | + @Override | ||
155 | + public DeviceProviderService register(DeviceProvider provider) { | ||
156 | + this.provider = provider; | ||
157 | + return new MockProviderService(); | ||
158 | + } | ||
159 | + | ||
160 | + @Override | ||
161 | + public void unregister(DeviceProvider provider) { | ||
162 | + } | ||
163 | + | ||
164 | + @Override | ||
165 | + public Set<ProviderId> getProviders() { | ||
166 | + return null; | ||
167 | + } | ||
168 | + | ||
169 | + private class MockProviderService implements DeviceProviderService { | ||
170 | + | ||
171 | + @Override | ||
172 | + public DeviceProvider provider() { | ||
173 | + return null; | ||
174 | + } | ||
175 | + | ||
176 | + @Override | ||
177 | + public void deviceConnected(DeviceId deviceId, DeviceDescription deviceDescription) { | ||
178 | + connected.add(deviceId); | ||
179 | + Device device = new DefaultDevice(ProviderId.NONE, deviceId, Device.Type.ROUTER, UNKNOWN, UNKNOWN, | ||
180 | + UNKNOWN, UNKNOWN, new ChassisId(), deviceDescription.annotations()); | ||
181 | + deviceMap.put(deviceId, device); | ||
182 | + } | ||
183 | + | ||
184 | + @Override | ||
185 | + public void deviceDisconnected(DeviceId deviceId) { | ||
186 | + connected.remove(deviceId); | ||
187 | + deviceMap.remove(deviceId); | ||
188 | + } | ||
189 | + | ||
190 | + @Override | ||
191 | + public void updatePorts(DeviceId deviceId, List<PortDescription> portDescriptions) { | ||
192 | + // TODO Auto-generated method stub | ||
193 | + } | ||
194 | + | ||
195 | + @Override | ||
196 | + public void portStatusChanged(DeviceId deviceId, PortDescription portDescription) { | ||
197 | + // TODO Auto-generated method stub | ||
198 | + } | ||
199 | + | ||
200 | + @Override | ||
201 | + public void receivedRoleReply(DeviceId deviceId, MastershipRole requested, MastershipRole response) { | ||
202 | + // TODO Auto-generated method stub | ||
203 | + } | ||
204 | + | ||
205 | + @Override | ||
206 | + public void updatePortStatistics(DeviceId deviceId, Collection<PortStatistics> portStatistics) { | ||
207 | + // TODO Auto-generated method stub | ||
208 | + } | ||
209 | + } | ||
210 | + } | ||
211 | + | ||
212 | + /* Mock test for device service */ | ||
213 | + private class MockDeviceService extends DeviceServiceAdapter { | ||
214 | + @Override | ||
215 | + public Device getDevice(DeviceId deviceId) { | ||
216 | + return deviceMap.get(deviceId); | ||
217 | + } | ||
218 | + } | ||
219 | + | ||
220 | + /** | ||
221 | + * Adds the PCEP device and removes it. | ||
222 | + */ | ||
223 | + @Test | ||
224 | + public void testPcepTopologyProviderTestAddDevice1() { | ||
225 | + PcepClient pc = clientController.getClient(PccId.pccId(IpAddress.valueOf("1.1.1.1"))); | ||
226 | + for (PcepNodeListener l : clientController.pcepNodeListener) { | ||
227 | + pc.setCapability(new ClientCapability(true, true, false, true, true)); | ||
228 | + l.addNode(pc); | ||
229 | + assertThat(nodeRegistry.connected.size(), is(1)); | ||
230 | + assertThat(deviceMap.keySet().iterator().next(), is(DeviceId.deviceId("l3:1.1.1.1"))); | ||
231 | + assertThat(deviceMap.values().iterator().next().annotations().value(LABEL_STACK_CAPABILITY), is("true")); | ||
232 | + assertThat(deviceMap.values().iterator().next().annotations().value(LSRID), is("1.1.1.1")); | ||
233 | + assertThat(deviceMap.values().iterator().next().annotations().value(PCECC_CAPABILITY), is("true")); | ||
234 | + assertThat(deviceMap.values().iterator().next().annotations().value(SR_CAPABILITY), is("true")); | ||
235 | + | ||
236 | + l.deleteNode(pc.getPccId()); | ||
237 | + assertThat(nodeRegistry.connected.size(), is(0)); | ||
238 | + } | ||
239 | + } | ||
240 | +} |
providers/pcep/tunnel/src/test/java/org/onosproject/provider/pcep/tunnel/impl/PcepClientAdapter.java
... | @@ -139,4 +139,12 @@ public class PcepClientAdapter implements PcepClient { | ... | @@ -139,4 +139,12 @@ public class PcepClientAdapter implements PcepClient { |
139 | public ClientCapability capability() { | 139 | public ClientCapability capability() { |
140 | return capability; | 140 | return capability; |
141 | } | 141 | } |
142 | + | ||
143 | + @Override | ||
144 | + public void addNode(PcepClient pc) { | ||
145 | + } | ||
146 | + | ||
147 | + @Override | ||
148 | + public void deleteNode(PccId pccId) { | ||
149 | + } | ||
142 | } | 150 | } | ... | ... |
... | @@ -31,6 +31,7 @@ import org.onosproject.pcep.controller.PcepClient; | ... | @@ -31,6 +31,7 @@ import org.onosproject.pcep.controller.PcepClient; |
31 | import org.onosproject.pcep.controller.PcepClientController; | 31 | import org.onosproject.pcep.controller.PcepClientController; |
32 | import org.onosproject.pcep.controller.PcepClientListener; | 32 | import org.onosproject.pcep.controller.PcepClientListener; |
33 | import org.onosproject.pcep.controller.PcepEventListener; | 33 | import org.onosproject.pcep.controller.PcepEventListener; |
34 | +import org.onosproject.pcep.controller.PcepNodeListener; | ||
34 | import org.onosproject.pcep.controller.driver.PcepAgent; | 35 | import org.onosproject.pcep.controller.driver.PcepAgent; |
35 | import org.onosproject.pcepio.protocol.PcepError; | 36 | import org.onosproject.pcepio.protocol.PcepError; |
36 | import org.onosproject.pcepio.protocol.PcepErrorInfo; | 37 | import org.onosproject.pcepio.protocol.PcepErrorInfo; |
... | @@ -57,6 +58,7 @@ public class PcepClientControllerAdapter implements PcepClientController { | ... | @@ -57,6 +58,7 @@ public class PcepClientControllerAdapter implements PcepClientController { |
57 | protected Set<PcepClientListener> pcepClientListener = new HashSet<>(); | 58 | protected Set<PcepClientListener> pcepClientListener = new HashSet<>(); |
58 | 59 | ||
59 | protected Set<PcepEventListener> pcepEventListener = Sets.newHashSet(); | 60 | protected Set<PcepEventListener> pcepEventListener = Sets.newHashSet(); |
61 | + public Set<PcepNodeListener> pcepNodeListener = Sets.newHashSet(); | ||
60 | 62 | ||
61 | @Activate | 63 | @Activate |
62 | public void activate() { | 64 | public void activate() { |
... | @@ -79,9 +81,9 @@ public class PcepClientControllerAdapter implements PcepClientController { | ... | @@ -79,9 +81,9 @@ public class PcepClientControllerAdapter implements PcepClientController { |
79 | PcepClientAdapter pc = new PcepClientAdapter(); | 81 | PcepClientAdapter pc = new PcepClientAdapter(); |
80 | if (pccId.ipAddress().equals(IpAddress.valueOf(0xC010103)) | 82 | if (pccId.ipAddress().equals(IpAddress.valueOf(0xC010103)) |
81 | || pccId.ipAddress().equals(IpAddress.valueOf(0xB6024E22))) { | 83 | || pccId.ipAddress().equals(IpAddress.valueOf(0xB6024E22))) { |
82 | - pc.setCapability(new ClientCapability(true, false, false)); | 84 | + pc.setCapability(new ClientCapability(true, false, false, false, false)); |
83 | } else { | 85 | } else { |
84 | - pc.setCapability(new ClientCapability(true, true, true)); | 86 | + pc.setCapability(new ClientCapability(true, true, true, false, false)); |
85 | } | 87 | } |
86 | pc.init(PccId.pccId(pccId.ipAddress()), PcepVersion.PCEP_1); | 88 | pc.init(PccId.pccId(pccId.ipAddress()), PcepVersion.PCEP_1); |
87 | connectedClients.put(pccId, pc); | 89 | connectedClients.put(pccId, pc); |
... | @@ -96,6 +98,16 @@ public class PcepClientControllerAdapter implements PcepClientController { | ... | @@ -96,6 +98,16 @@ public class PcepClientControllerAdapter implements PcepClientController { |
96 | } | 98 | } |
97 | 99 | ||
98 | @Override | 100 | @Override |
101 | + public void addNodeListener(PcepNodeListener listener) { | ||
102 | + pcepNodeListener.add(listener); | ||
103 | + } | ||
104 | + | ||
105 | + @Override | ||
106 | + public void removeNodeListener(PcepNodeListener listener) { | ||
107 | + pcepNodeListener.remove(listener); | ||
108 | + } | ||
109 | + | ||
110 | + @Override | ||
99 | public void removeListener(PcepClientListener listener) { | 111 | public void removeListener(PcepClientListener listener) { |
100 | this.pcepClientListener.remove(listener); | 112 | this.pcepClientListener.remove(listener); |
101 | } | 113 | } |
... | @@ -254,5 +266,19 @@ public class PcepClientControllerAdapter implements PcepClientController { | ... | @@ -254,5 +266,19 @@ public class PcepClientControllerAdapter implements PcepClientController { |
254 | public void processPcepMessage(PccId pccId, PcepMessage m) { | 266 | public void processPcepMessage(PccId pccId, PcepMessage m) { |
255 | processClientMessage(pccId, m); | 267 | processClientMessage(pccId, m); |
256 | } | 268 | } |
269 | + | ||
270 | + @Override | ||
271 | + public void addNode(PcepClient pc) { | ||
272 | + for (PcepNodeListener l : pcepNodeListener) { | ||
273 | + l.addNode(pc); | ||
274 | + } | ||
275 | + } | ||
276 | + | ||
277 | + @Override | ||
278 | + public void deleteNode(PccId pccId) { | ||
279 | + for (PcepNodeListener l : pcepNodeListener) { | ||
280 | + l.deleteNode(pccId); | ||
281 | + } | ||
282 | + } | ||
257 | } | 283 | } |
258 | } | 284 | } | ... | ... |
... | @@ -261,7 +261,7 @@ public class PcepTunnelAddedTest { | ... | @@ -261,7 +261,7 @@ public class PcepTunnelAddedTest { |
261 | tunnelService.setupTunnel(null, null, tunnel, null); | 261 | tunnelService.setupTunnel(null, null, tunnel, null); |
262 | 262 | ||
263 | PccId pccId = PccId.pccId(IpAddress.valueOf(0x4e1f0400)); | 263 | PccId pccId = PccId.pccId(IpAddress.valueOf(0x4e1f0400)); |
264 | - controller.getClient(pccId).setCapability(new ClientCapability(true, true, true)); | 264 | + controller.getClient(pccId).setCapability(new ClientCapability(true, true, true, false, false)); |
265 | controller.getClient(pccId).setLspDbSyncStatus(SYNCED); | 265 | controller.getClient(pccId).setLspDbSyncStatus(SYNCED); |
266 | 266 | ||
267 | // Process update message. | 267 | // Process update message. |
... | @@ -310,7 +310,7 @@ public class PcepTunnelAddedTest { | ... | @@ -310,7 +310,7 @@ public class PcepTunnelAddedTest { |
310 | 310 | ||
311 | PccId pccId = PccId.pccId(IpAddress.valueOf("1.1.1.1")); | 311 | PccId pccId = PccId.pccId(IpAddress.valueOf("1.1.1.1")); |
312 | controller.getClient(pccId).setLspDbSyncStatus(SYNCED); | 312 | controller.getClient(pccId).setLspDbSyncStatus(SYNCED); |
313 | - controller.getClient(pccId).setCapability(new ClientCapability(true, true, true)); | 313 | + controller.getClient(pccId).setCapability(new ClientCapability(true, true, true, false, false)); |
314 | controller.processClientMessage(pccId, message); | 314 | controller.processClientMessage(pccId, message); |
315 | 315 | ||
316 | assertThat(registry.tunnelIdCounter, is((long) 1)); | 316 | assertThat(registry.tunnelIdCounter, is((long) 1)); |
... | @@ -356,7 +356,7 @@ public class PcepTunnelAddedTest { | ... | @@ -356,7 +356,7 @@ public class PcepTunnelAddedTest { |
356 | PcepMessage message1 = reader1.readFrom(buffer1); | 356 | PcepMessage message1 = reader1.readFrom(buffer1); |
357 | 357 | ||
358 | PccId pccId = PccId.pccId(IpAddress.valueOf("1.1.1.1")); | 358 | PccId pccId = PccId.pccId(IpAddress.valueOf("1.1.1.1")); |
359 | - controller.getClient(pccId).setCapability(new ClientCapability(true, true, true)); | 359 | + controller.getClient(pccId).setCapability(new ClientCapability(true, true, true, false, false)); |
360 | controller.processClientMessage(pccId, message1); | 360 | controller.processClientMessage(pccId, message1); |
361 | 361 | ||
362 | /* create 2nd LSP */ | 362 | /* create 2nd LSP */ |
... | @@ -495,7 +495,7 @@ public class PcepTunnelAddedTest { | ... | @@ -495,7 +495,7 @@ public class PcepTunnelAddedTest { |
495 | PcepMessage message1 = reader1.readFrom(buffer1); | 495 | PcepMessage message1 = reader1.readFrom(buffer1); |
496 | 496 | ||
497 | PccId pccId = PccId.pccId(IpAddress.valueOf("1.1.1.1")); | 497 | PccId pccId = PccId.pccId(IpAddress.valueOf("1.1.1.1")); |
498 | - controller.getClient(pccId).setCapability(new ClientCapability(true, true, true)); | 498 | + controller.getClient(pccId).setCapability(new ClientCapability(true, true, true, false, false)); |
499 | controller.processClientMessage(pccId, message1); | 499 | controller.processClientMessage(pccId, message1); |
500 | 500 | ||
501 | /* create 2nd LSP */ | 501 | /* create 2nd LSP */ | ... | ... |
-
Please register or login to post a comment