[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;
}
}