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