[ONOS-4722] cherry-picked GoldenEye:Fix exception on learning unknown PCE-initiated LSP from PCC
Change-Id: I8abc003aeb187f18e51de533f0c51e265dfd8661
diff --git a/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/BasicPceccHandler.java b/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/BasicPceccHandler.java
index 732a0b3..3d981e4 100644
--- a/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/BasicPceccHandler.java
+++ b/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/BasicPceccHandler.java
@@ -150,7 +150,7 @@
// Push into destination device
// Destination device IN port is link.dst().port()
- installLocalLabelRule(dstDeviceId, labelId, dstPort, tunnel.tunnelId(), isLastLabelToPush,
+ installLocalLabelRule(dstDeviceId, labelId, dstPort, tunnel.tunnelId(), false,
Long.valueOf(LabelType.IN_LABEL.value), Objective.Operation.ADD);
// Push into source device
diff --git a/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/PceManager.java b/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/PceManager.java
index c0326b6..a28a26e 100644
--- a/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/PceManager.java
+++ b/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/PceManager.java
@@ -116,6 +116,7 @@
import static org.onosproject.incubator.net.tunnel.Tunnel.State.INIT;
import static org.onosproject.incubator.net.tunnel.Tunnel.State.ESTABLISHED;
import static org.onosproject.incubator.net.tunnel.Tunnel.State.UNSTABLE;
+import static org.onosproject.incubator.net.tunnel.Tunnel.State.FAILED;
import static org.onosproject.pce.pceservice.LspType.WITH_SIGNALLING;
import static org.onosproject.pce.pceservice.LspType.SR_WITHOUT_SIGNALLING;
import static org.onosproject.pce.pceservice.LspType.WITHOUT_SIGNALLING_AND_WITHOUT_SR;
@@ -603,6 +604,18 @@
PceccTunnelInfo pceccTunnelInfo = new PceccTunnelInfo(null, consumerId);
pceStore.addTunnelInfo(updatedTunnelId, pceccTunnelInfo);
}
+
+ // For CR cases, download labels and send update message.
+ if (lspType == WITHOUT_SIGNALLING_AND_WITHOUT_SR) {
+ Tunnel tunnelForlabelDownload = new DefaultTunnel(null, tunnel.src(), tunnel.dst(), MPLS, INIT, null,
+ updatedTunnelId, tunnel.tunnelName(), computedPath,
+ labelStack, annotationBuilder.build());
+
+ if (!crHandler.allocateLabel(tunnelForlabelDownload)) {
+ log.error("Unable to allocate labels for the tunnel {}.", tunnel.toString());
+ }
+ }
+
return true;
}
@@ -1154,6 +1167,11 @@
links.get(links.size() - 1).dst().deviceId(),
tunnel.tunnelName().value(), constraints, lspType));
}
+
+ if (tunnel.state() == FAILED) {
+ // Check whether this ONOS instance is master, if yes, recompute and send update.
+ checkForMasterAndUpdateTunnel(tunnel.path().src().deviceId(), tunnel);
+ }
break;
case TUNNEL_REMOVED: