[ONOS-4722] cherry-picked GoldenEye:Fix exception on learning unknown PCE-initiated LSP from PCC

Change-Id: I8abc003aeb187f18e51de533f0c51e265dfd8661
diff --git a/providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/LspType.java b/providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/LspType.java
deleted file mode 100644
index 8efa5f2..0000000
--- a/providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/LspType.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.provider.pcep.tunnel.impl;
-
-/**
- * Representation of LSP type.
- */
-public enum LspType {
-    /**
-     * Signifies that path is created via signaling mode.
-     */
-    WITH_SIGNALLING(0),
-
-    /**
-     * Signifies that path is created via SR mode.
-     */
-    SR_WITHOUT_SIGNALLING(1),
-
-    /**
-     * Signifies that path is created via without signaling and without SR mode.
-     */
-    WITHOUT_SIGNALLING_AND_WITHOUT_SR(2);
-
-    int value;
-
-    /**
-     * Assign val with the value as the LSP type.
-     *
-     * @param val LSP type
-     */
-    LspType(int val) {
-        value = val;
-    }
-
-    /**
-     * Returns value of LSP type.
-     *
-     * @return LSP type
-     */
-    public byte type() {
-        return (byte) value;
-    }
-}
diff --git a/providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/PcepTunnelProvider.java b/providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/PcepTunnelProvider.java
index d9eedb4..83fd55c 100644
--- a/providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/PcepTunnelProvider.java
+++ b/providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/PcepTunnelProvider.java
@@ -78,6 +78,7 @@
 import org.onosproject.pcep.api.PcepTunnelListener;
 import org.onosproject.pcep.api.PcepTunnelStatistics;
 import org.onosproject.pcep.controller.LspKey;
+import org.onosproject.pcep.controller.LspType;
 import org.onosproject.pcep.controller.PccId;
 import org.onosproject.pcep.controller.PcepClient;
 import org.onosproject.pcep.controller.PcepClientController;
@@ -140,8 +141,9 @@
 import static org.onosproject.net.DeviceId.deviceId;
 import static org.onosproject.net.PortNumber.portNumber;
 import static org.onosproject.pcep.api.PcepDpid.uri;
-import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITH_SIGNALLING;
-import static org.onosproject.provider.pcep.tunnel.impl.LspType.SR_WITHOUT_SIGNALLING;
+import static org.onosproject.pcep.controller.LspType.WITH_SIGNALLING;
+import static org.onosproject.pcep.controller.LspType.SR_WITHOUT_SIGNALLING;
+import static org.onosproject.pcep.controller.LspType.WITHOUT_SIGNALLING_AND_WITHOUT_SR;
 import static org.onosproject.pcep.controller.PcepAnnotationKeys.BANDWIDTH;
 import static org.onosproject.pcep.controller.PcepAnnotationKeys.LOCAL_LSP_ID;
 import static org.onosproject.pcep.controller.PcepAnnotationKeys.LSP_SIG_TYPE;
@@ -157,7 +159,6 @@
 import static org.onosproject.incubator.net.tunnel.Tunnel.State.UNSTABLE;
 import static org.onosproject.pcep.controller.PcepLspSyncAction.REMOVE;
 import static org.onosproject.pcep.controller.PcepLspSyncAction.SEND_UPDATE;
-import static org.onosproject.pcep.controller.PcepLspSyncAction.SEND_DELETE;
 import static org.onosproject.pcepio.protocol.ver1.PcepMetricObjectVer1.IGP_METRIC;
 import static org.onosproject.pcepio.protocol.ver1.PcepMetricObjectVer1.TE_METRIC;
 import static org.slf4j.LoggerFactory.getLogger;
@@ -311,7 +312,10 @@
 
         //TODO: tunnel which is passed doesn't have tunnelID
         if (tunnel.annotations().value(PLSP_ID) != null) {
-            updateTunnel(tunnel, path);
+            if (LspType.valueOf(tunnel.annotations().value(LSP_SIG_TYPE)) != WITHOUT_SIGNALLING_AND_WITHOUT_SR) {
+                // For CR LSPs, BGP flow provider will send update message after pushing labels.
+                updateTunnel(tunnel, path);
+            }
             return;
         }
 
@@ -1219,8 +1223,9 @@
 
                 tlv = new StatefulIPv4LspIdentifiersTlv((((IpTunnelEndPoint) tunnel.src())
                         .ip().getIp4Address().toInt()),
-                        localLspId, pccTunnelId, 0, (((IpTunnelEndPoint) tunnel.dst()).ip()
-                        .getIp4Address().toInt()));
+                        localLspId, pccTunnelId,
+                        ((IpTunnelEndPoint) tunnel.src()).ip().getIp4Address().toInt(),
+                        (((IpTunnelEndPoint) tunnel.dst()).ip().getIp4Address().toInt()));
                 llOptionalTlv.add(tlv);
             }
 
@@ -1229,9 +1234,18 @@
                 llOptionalTlv.add(tlv);
             }
 
+            boolean delegated = (tunnel.annotations().value(DELEGATE) == null) ? false
+                                                                               : Boolean.valueOf(tunnel.annotations()
+                                                                                       .value(DELEGATE));
+            boolean initiated = (tunnel.annotations().value(PCE_INIT) == null) ? false
+                                                                               : Boolean.valueOf(tunnel.annotations()
+                                                                                       .value(PCE_INIT));
+
             // build lsp object
             PcepLspObject lspobj = pc.factory().buildLspObject().setAFlag(true)
                     .setPlspId(Integer.valueOf(tunnel.annotations().value(PLSP_ID)))
+                    .setDFlag(delegated)
+                    .setCFlag(initiated)
                     .setOptionalTlv(llOptionalTlv).build();
             // build ero object
             PcepEroObject eroobj = pc.factory().buildEroObject().setSubObjects(llSubObjects).build();
@@ -1818,36 +1832,6 @@
                 tunnelRemoved(td);
             }
         }
-
-        @Override
-        public void handleEndOfSyncAction(PccId pccId, PcepMessage msg, PcepLspSyncAction endOfSyncAction) {
-            try {
-                if ((msg instanceof PcepInitiateMsg) && (endOfSyncAction == SEND_DELETE)) {
-                    PcepClient pc = pcepClientController.getClient(pccId);
-                    LinkedList<PcInitiatedLspRequest> llPcInitiatedLspRequestList = ((PcepInitiateMsg) msg)
-                            .getPcInitiatedLspRequestList();
-                    PcInitiatedLspRequest pcInitMsg = llPcInitiatedLspRequestList.iterator().next();
-
-                    if (pcInitMsg != null) {
-                        PcepSrpObject srpobj = pc.factory().buildSrpObject().setSrpID(SrpIdGenerators.create())
-                                .setRFlag(true).build();
-
-                        PcInitiatedLspRequest releaseLspRequest = pc.factory().buildPcInitiatedLspRequest()
-                                .setLspObject(pcInitMsg.getLspObject()).setSrpObject(srpobj).build();
-
-                        llPcInitiatedLspRequestList.remove(pcInitMsg);
-                        llPcInitiatedLspRequestList.add(releaseLspRequest);
-
-                        PcepInitiateMsg pcInitiateMsg = pc.factory().buildPcepInitiateMsg()
-                                .setPcInitiatedLspRequestList(llPcInitiatedLspRequestList).build();
-
-                        pc.sendMessage(Collections.singletonList(pcInitiateMsg));
-                    }
-                }
-            } catch (PcepParseException e) {
-                log.error("Exception occured while sending initiate delete message {}", e.getMessage());
-            }
-        }
     }
     @Override
     public Tunnel tunnelQueryById(TunnelId tunnelId) {