[ONOS] cherry picked from 1.6, bandwidth, CR and resilency fix

Change-Id: Ifd7bf886d2725db1f5e2f7a1eac739d9a446f868
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 77a94d8..31c7d37 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
@@ -114,7 +114,6 @@
 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;
@@ -1178,10 +1177,6 @@
                                                                   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:
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrMaxLinkBandwidth.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrMaxLinkBandwidth.java
index 3cc4bc6..baa0aae 100644
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrMaxLinkBandwidth.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrMaxLinkBandwidth.java
@@ -107,8 +107,6 @@
      * @return normal float
      */
     static float ieeeToFloatRead(int iVal) {
-        iVal = (((iVal & 0xFF) << 24) | ((iVal & 0xFF00) << 8)
-                | ((iVal & 0xFF0000) >> 8) | ((iVal >> 24) & 0xFF));
 
         return Float.intBitsToFloat(iVal);
     }
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrUnRsrvdLinkBandwidth.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrUnRsrvdLinkBandwidth.java
index cb3f3ac..42a5e40 100644
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrUnRsrvdLinkBandwidth.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrUnRsrvdLinkBandwidth.java
@@ -115,8 +115,6 @@
      * @return normal float
      */
     static float ieeeToFloatRead(int  iVal) {
-        iVal = (((iVal & 0xFF) << 24) | ((iVal & 0xFF00) << 8)
-                | ((iVal & 0xFF0000) >> 8) | ((iVal >> 24) & 0xFF));
 
         return Float.intBitsToFloat(iVal);
     }
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepBandwidthObjectVer1.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepBandwidthObjectVer1.java
index 6abe495..0cf11b0 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepBandwidthObjectVer1.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepBandwidthObjectVer1.java
@@ -135,8 +135,6 @@
      * @return normal float
      */
     public static float ieeeToFloatRead(int iVal) {
-        iVal = (((iVal & 0xFF) << 24) | ((iVal & 0xFF00) << 8)
-                | ((iVal & 0xFF0000) >> 8) | ((iVal >> 24) & 0xFF));
 
         return Float.intBitsToFloat(iVal);
     }
@@ -152,7 +150,16 @@
             throw new PcepParseException("Failed to write bandwidth object header. Index " + objLenIndex);
         }
 
-        cb.writeInt(Float.floatToIntBits(iBandwidth));
+        //Convert to bytes per second
+        float bwBytes = iBandwidth / 8.0f;
+        //Bytes/sec to IEEE floating format
+        int bandwidth = Float.floatToIntBits(bwBytes);
+
+        cb.writeByte(bandwidth >>> 24);
+        cb.writeByte(bandwidth >> 16 & 0xff);
+        cb.writeByte(bandwidth >> 8 & 0xff);
+        cb.writeByte(bandwidth & 0xff);
+
         short hLength = (short) (cb.writerIndex() - objStartIndex);
         cb.setShort(objLenIndex, hLength);
         //will be helpful during print().
diff --git a/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProvider.java b/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProvider.java
index e95eba09..e50e820 100644
--- a/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProvider.java
+++ b/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProvider.java
@@ -491,6 +491,8 @@
             switch (tlv.getType()) {
             case LinkStateAttributes.ATTR_LINK_MAX_RES_BANDWIDTH:
                 maxReservableBw = ((BgpLinkAttrMaxLinkBandwidth) tlv).linkAttrMaxLinkBandwidth();
+                //will get in bits/second , convert to MBPS to store in network config service
+                maxReservableBw = maxReservableBw / 1000000;
                 break;
             default: // do nothing
             }
diff --git a/providers/bgp/topology/src/test/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProviderTest.java b/providers/bgp/topology/src/test/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProviderTest.java
index 276bfb5..15a51de 100644
--- a/providers/bgp/topology/src/test/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProviderTest.java
+++ b/providers/bgp/topology/src/test/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProviderTest.java
@@ -1005,7 +1005,8 @@
         linkStateAttr.add(tlv);
         tlv = BgpLinkAttrTeDefaultMetric.of(20);
         linkStateAttr.add(tlv);
-        tlv = BgpLinkAttrMaxLinkBandwidth.of(70, LinkStateAttributes.ATTR_LINK_MAX_RES_BANDWIDTH);
+        tlv = BgpLinkAttrMaxLinkBandwidth.of((float) 70 * 1_000_000L,
+                LinkStateAttributes.ATTR_LINK_MAX_RES_BANDWIDTH);
         linkStateAttr.add(tlv);
         linkPathAttributes.add(new LinkStateAttributes(linkStateAttr));
         details.setPathAttribute(linkPathAttributes);
diff --git a/providers/bgpcep/flow/src/main/java/org/onosproject/provider/bgpcep/flow/impl/BgpcepFlowRuleProvider.java b/providers/bgpcep/flow/src/main/java/org/onosproject/provider/bgpcep/flow/impl/BgpcepFlowRuleProvider.java
index 4369f48..7330a3a 100644
--- a/providers/bgpcep/flow/src/main/java/org/onosproject/provider/bgpcep/flow/impl/BgpcepFlowRuleProvider.java
+++ b/providers/bgpcep/flow/src/main/java/org/onosproject/provider/bgpcep/flow/impl/BgpcepFlowRuleProvider.java
@@ -89,11 +89,14 @@
 import org.onosproject.pcepio.types.StatefulIPv4LspIdentifiersTlv;
 import org.onosproject.pcepio.types.SymbolicPathNameTlv;
 import org.onosproject.pcep.controller.LspType;
+import org.onosproject.pcepio.protocol.PcepAttribute;
+import org.onosproject.pcepio.protocol.PcepBandwidthObject;
 import org.onosproject.pcep.controller.SrpIdGenerators;
 import org.onosproject.pcep.controller.PcepAnnotationKeys;
 import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
 
+import static org.onosproject.pcep.controller.PcepAnnotationKeys.BANDWIDTH;
 import static org.onosproject.pcep.controller.PcepAnnotationKeys.DELEGATE;
 import static org.onosproject.pcep.controller.PcepAnnotationKeys.LSP_SIG_TYPE;
 import static org.onosproject.pcep.controller.PcepAnnotationKeys.PCE_INIT;
@@ -530,8 +533,23 @@
                               .setSubObjects(subObjects)
                               .build();
 
+        float  iBandwidth = 0;
+        if (tunnel.annotations().value(BANDWIDTH) != null) {
+            //iBandwidth = Float.floatToIntBits(Float.parseFloat(tunnel.annotations().value(BANDWIDTH)));
+            iBandwidth = Float.parseFloat(tunnel.annotations().value(BANDWIDTH));
+        }
+        // build bandwidth object
+        PcepBandwidthObject bandwidthObject = pc.factory().buildBandwidthObject()
+                                              .setBandwidth(iBandwidth)
+                                              .build();
+        // build pcep attribute
+        PcepAttribute pcepAttribute = pc.factory().buildPcepAttribute()
+                                      .setBandwidthObject(bandwidthObject)
+                                      .build();
+
         PcepMsgPath msgPath = pc.factory().buildPcepMsgPath()
                               .setEroObject(eroObj)
+                              .setPcepAttribute(pcepAttribute)
                               .build();
 
         PcepUpdateRequest updateReq = pc.factory().buildPcepUpdateRequest()
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 5fc6a95..8d45e08 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
@@ -66,6 +66,7 @@
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.SparseAnnotations;
 import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.link.LinkService;
 import org.onosproject.net.provider.AbstractProvider;
 import org.onosproject.net.provider.ProviderId;
 import org.onosproject.pcep.api.PcepController;
@@ -213,6 +214,9 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected DeviceService deviceService;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected LinkService linkService;
+
     TunnelProviderService service;
 
     HashMap<String, TunnelId> tunnelMap = new HashMap<String, TunnelId>();
@@ -609,6 +613,7 @@
         if (tunnel.type() == MPLS) {
             pcepTunnelApiMapper.removeFromCoreTunnelRequestQueue(tunnel.id());
             service.tunnelRemoved(tunnel);
+            return;
         }
 
         Tunnel tunnelOld = tunnelQueryById(tunnel.id());
@@ -1012,9 +1017,9 @@
         //build ERO object
         PcepEroObject eroobj = pc.factory().buildEroObject().setSubObjects(llSubObjects).build();
 
-        int  iBandwidth = DEFAULT_BANDWIDTH_VALUE;
+        float  iBandwidth = DEFAULT_BANDWIDTH_VALUE;
         if (tunnel.annotations().value(BANDWIDTH) != null) {
-            iBandwidth = Float.floatToIntBits(Float.parseFloat(tunnel.annotations().value(BANDWIDTH)));
+            iBandwidth = Float.valueOf(tunnel.annotations().value(BANDWIDTH));
         }
         // build bandwidth object
         PcepBandwidthObject bandwidthObject = pc.factory().buildBandwidthObject().setBandwidth(iBandwidth).build();
@@ -1680,8 +1685,8 @@
                         bandwidth, lspType,
                         tunnel.annotations().value(COST_TYPE));
                 td = new DefaultTunnelDescription(null, tunnelEndPointSrc, tunnelEndPointDst, MPLS, new DefaultGroupId(
-                        0), providerId, TunnelName.tunnelName(new String(pathNameTlv.getValue())), path, labelStack,
-                        annotations);
+                        0), providerId, TunnelName.tunnelName(new String(pathNameTlv.getValue())),
+                        tunnel.path(), labelStack, annotations);
                 tunnelUpdateInDelegatedCase(pccId, annotations, td, providerId);
             }
             removeOrUpdatetunnel(tunnel, pccId, lspObj, providerId, tunnelState);
@@ -1743,12 +1748,29 @@
 
                     IPv4SubObject ipv4SubObj = (IPv4SubObject) subObj;
                     if (!isSrcSet) {
-                        IpAddress srcIp = IpAddress.valueOf(ipv4SubObj.getIpAddress());
-                        src = new ConnectPoint(IpElementId.ipElement(srcIp), PortNumber.portNumber(0));
-                        isSrcSet = true;
-                    } else {
-                        IpAddress dstIp = IpAddress.valueOf(ipv4SubObj.getIpAddress());
-                        dst = new ConnectPoint(IpElementId.ipElement(dstIp), PortNumber.portNumber(0));
+                            Iterable<Link> links = linkService.getActiveLinks();
+                            for (Link l : links) {
+                                if (l.src().port().equals(PortNumber.portNumber(ipv4SubObj.getIpAddress()))) {
+                                    src = l.src();
+                                    isSrcSet = true;
+                                    break;
+                                } else if (l.dst().port().equals(PortNumber.portNumber(ipv4SubObj.getIpAddress()))) {
+                                    src = l.dst();
+                                    isSrcSet = true;
+                                    break;
+                                }
+                            }
+                        } else {
+                            Iterable<Link> links = linkService.getActiveLinks();
+                            for (Link l : links) {
+                                if (l.src().port().equals(PortNumber.portNumber(ipv4SubObj.getIpAddress()))) {
+                                    dst = l.src();
+                                    break;
+                                } else if (l.dst().port().equals(PortNumber.portNumber(ipv4SubObj.getIpAddress()))) {
+                                    dst = l.dst();
+                                    break;
+                                }
+                            }
                         Link link = DefaultLink.builder()
                                 .providerId(providerId)
                                 .src(src)
diff --git a/providers/pcep/tunnel/src/test/java/org/onosproject/provider/pcep/tunnel/impl/PcepTunnelAddedTest.java b/providers/pcep/tunnel/src/test/java/org/onosproject/provider/pcep/tunnel/impl/PcepTunnelAddedTest.java
index d96e83b..85eacbc 100644
--- a/providers/pcep/tunnel/src/test/java/org/onosproject/provider/pcep/tunnel/impl/PcepTunnelAddedTest.java
+++ b/providers/pcep/tunnel/src/test/java/org/onosproject/provider/pcep/tunnel/impl/PcepTunnelAddedTest.java
@@ -28,6 +28,7 @@
 import static org.onosproject.pcep.controller.LspType.WITHOUT_SIGNALLING_AND_WITHOUT_SR;
 import static org.onosproject.pcep.controller.PcepSyncStatus.SYNCED;
 import static org.onosproject.net.Device.Type.ROUTER;
+import static org.onosproject.net.Link.State.ACTIVE;
 import static org.onosproject.net.MastershipRole.MASTER;
 
 import java.io.IOException;
@@ -62,15 +63,20 @@
 import org.onosproject.incubator.net.tunnel.Tunnel.State;
 import org.onosproject.mastership.MastershipServiceAdapter;
 import org.onosproject.net.AnnotationKeys;
+import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.DefaultDevice;
+import org.onosproject.net.DefaultLink;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.ElementId;
+import org.onosproject.net.Link;
 import org.onosproject.net.MastershipRole;
 import org.onosproject.net.Path;
+import org.onosproject.net.PortNumber;
 import org.onosproject.net.SparseAnnotations;
 import org.onosproject.net.device.DeviceServiceAdapter;
+import org.onosproject.net.link.LinkServiceAdapter;
 import org.onosproject.net.provider.ProviderId;
 import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
 import org.onosproject.pcepio.exceptions.PcepParseException;
@@ -82,6 +88,7 @@
 import org.onosproject.pcep.controller.LspKey;
 import org.onosproject.pcep.controller.PccId;
 
+import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableSet;
 
 /**
@@ -99,8 +106,23 @@
     private final MockTunnelServiceAdapter tunnelService = new MockTunnelServiceAdapter();
     public final MockDeviceService deviceService = new MockDeviceService();
     private final MockMasterShipService masterShipService = new MockMasterShipService();
+    private final MockLinkService linkService = new MockLinkService();
     private final MockTunnelAdminService tunnelAdminService = new MockTunnelAdminService();
 
+    private class MockLinkService extends LinkServiceAdapter {
+        LinkedList<Link> links = new LinkedList<>();
+        void addLink(Link link) {
+            links.add(link);
+        }
+
+        @Override
+        public Iterable<Link> getActiveLinks() {
+
+            return FluentIterable.from(links)
+                    .filter(input -> input.state() == ACTIVE);
+        }
+    }
+
     private class MockTunnelAdminService implements TunnelAdminService {
 
         @Override
@@ -275,6 +297,7 @@
         tunnelProvider.tunnelService = tunnelService;
         tunnelProvider.tunnelAdminService = tunnelAdminService;
         tunnelProvider.service = registry.register(tunnelProvider);
+        tunnelProvider.linkService = linkService;
         tunnelProvider.activate();
     }
 
@@ -326,6 +349,14 @@
         controller.getClient(PccId.pccId(IpAddress.valueOf("1.1.1.1"))).setCapability(
                 new ClientCapability(true, true, true, true, true));
         masterShipService.setMaster(true);
+        Link link = DefaultLink.builder()
+                .src(new ConnectPoint(device.id(), PortNumber.portNumber(16843009)))
+                .dst(new ConnectPoint(device.id(), PortNumber.portNumber(84215045)))
+                .state(ACTIVE)
+                .type(Link.Type.DIRECT)
+                .providerId(ProviderId.NONE)
+                .build();
+        linkService.addLink(link);
         controller.processClientMessage(PccId.pccId(IpAddress.valueOf("1.1.1.1")), message);
 
         assertThat(registry.tunnelIdCounter, is((long) 1));
@@ -444,6 +475,14 @@
         controller.getClient(pccId).setLspDbSyncStatus(SYNCED);
         controller.getClient(pccId).setCapability(new ClientCapability(true, true, true, true, true));
 
+        Link link = DefaultLink.builder()
+                .src(new ConnectPoint(device.id(), PortNumber.portNumber(16843009)))
+                .dst(new ConnectPoint(device.id(), PortNumber.portNumber(84215045)))
+                .state(ACTIVE)
+                .type(Link.Type.DIRECT)
+                .providerId(ProviderId.NONE)
+                .build();
+        linkService.addLink(link);
         PcepClientAdapter pc = new PcepClientAdapter();
         pc.init(pccId, PcepVersion.PCEP_1);
         controller.getClient(pccId).setLspAndDelegationInfo(new LspKey(1, (short) 1), true);
@@ -505,6 +544,14 @@
         deviceService.addDevice(device);
         controller.getClient(PccId.pccId(IpAddress.valueOf("1.1.1.1"))).setCapability(
                 new ClientCapability(true, true, true, true, true));
+        Link link = DefaultLink.builder()
+                .src(new ConnectPoint(device.id(), PortNumber.portNumber(16843009)))
+                .dst(new ConnectPoint(device.id(), PortNumber.portNumber(84215045)))
+                .state(ACTIVE)
+                .type(Link.Type.DIRECT)
+                .providerId(ProviderId.NONE)
+                .build();
+        linkService.addLink(link);
         controller.processClientMessage(PccId.pccId(IpAddress.valueOf("1.1.1.1")), message);
         assertThat(tunnelService.tunnelIdAsKeyStore.values().iterator().next().annotations().value(DELEGATE),
                 is("false"));
@@ -624,6 +671,7 @@
         tunnelProvider.tunnelAdminService = null;
         tunnelProvider.deviceService = null;
         tunnelProvider.mastershipService = null;
+        tunnelProvider.linkService = null;
         tunnelProvider.service = null;
     }
 }