[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/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: