PCE Changes to handle bandwidth changes from network
Change-Id: Ib4961ac4ea8ed803fb035ab93725ae6f0968a5c0
diff --git a/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/constraint/CostConstraint.java b/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/constraint/CostConstraint.java
index 229644d..9aed3a2 100644
--- a/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/constraint/CostConstraint.java
+++ b/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/constraint/CostConstraint.java
@@ -16,9 +16,12 @@
package org.onosproject.pce.pceservice.constraint;
import org.onosproject.net.Link;
+import org.onosproject.net.LinkKey;
import org.onosproject.net.Path;
-import org.onosproject.net.intent.ResourceContext;
+import org.onosproject.net.config.NetworkConfigService;
import org.onosproject.net.intent.Constraint;
+import org.onosproject.net.intent.ResourceContext;
+import org.onosproject.pcep.api.TeLinkConfig;
import java.util.Objects;
@@ -130,25 +133,38 @@
@Override
public double cost(Link link, ResourceContext context) {
- //TODO: Usage of annotations are for transient solution. In future will be replaces with the
- // network config service / Projection model.
+ return 0;
+ }
+
+ /**
+ * Validates the link based on cost type specified.
+ *
+ * @param link to validate cost type constraint
+ * @param netCfgService instance of netCfgService
+ * @return true if link satisfies cost constraint otherwise false
+ */
+ public double isValidLink(Link link, NetworkConfigService netCfgService) {
+ if (netCfgService == null) {
+ return -1;
+ }
+
+ TeLinkConfig cfg = netCfgService.getConfig(LinkKey.linkKey(link.src(), link.dst()), TeLinkConfig.class);
+ if (cfg == null) {
+ //If cost configuration absent return -1[It is not L3 device]
+ return -1;
+ }
+
switch (type) {
- case COST:
- if (link.annotations().value(COST) != null) {
- return Double.parseDouble(link.annotations().value(COST));
- }
+ case COST:
+ //If IGP cost is zero then IGP cost is not assigned for that link
+ return cfg.igpCost() == 0 ? -1 : cfg.igpCost();
- //If cost annotations absent return -1[It is not L3 device]
- return -1;
- case TE_COST:
- if (link.annotations().value(TE_COST) != null) {
- return Double.parseDouble(link.annotations().value(TE_COST));
- }
+ case TE_COST:
+ //If TE cost is zero then TE cost is not assigned for that link
+ return cfg.teCost() == 0 ? -1 : cfg.teCost();
- //If TE cost annotations absent return -1[It is not L3 device]
- return -1;
- default:
- return -1;
+ default:
+ return -1;
}
}
diff --git a/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/constraint/PceBandwidthConstraint.java b/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/constraint/PceBandwidthConstraint.java
new file mode 100644
index 0000000..6a15023
--- /dev/null
+++ b/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/constraint/PceBandwidthConstraint.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2017-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.pce.pceservice.constraint;
+
+import org.onlab.util.Bandwidth;
+import org.onlab.util.DataRateUnit;
+import org.onosproject.net.Link;
+import org.onosproject.net.intent.ResourceContext;
+import org.onosproject.net.intent.constraint.BooleanConstraint;
+import org.onosproject.bandwidthmgr.api.BandwidthMgmtService;
+
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Constraint that evaluates links based on available pce bandwidths.
+ */
+public final class PceBandwidthConstraint extends BooleanConstraint {
+
+ private final Bandwidth bandwidth;
+
+ /**
+ * Creates a new pce bandwidth constraint.
+ *
+ * @param bandwidth required bandwidth
+ */
+ public PceBandwidthConstraint(Bandwidth bandwidth) {
+ this.bandwidth = checkNotNull(bandwidth, "Bandwidth cannot be null");
+ }
+
+ /**
+ * Creates a new pce bandwidth constraint.
+ *
+ * @param v required amount of bandwidth
+ * @param unit {@link DataRateUnit} of {@code v}
+ * @return {@link PceBandwidthConstraint} instance with given bandwidth requirement
+ */
+ public static PceBandwidthConstraint of(double v, DataRateUnit unit) {
+ return new PceBandwidthConstraint(Bandwidth.of(v, unit));
+ }
+
+ // Constructor for serialization
+ private PceBandwidthConstraint() {
+ this.bandwidth = null;
+ }
+
+ @Override
+ public boolean isValid(Link link, ResourceContext context) {
+ return false;
+ //Do nothing instead using isValidLink needs bandwidthMgmtService to validate link
+ }
+
+ /**
+ * Validates the link based on pce bandwidth constraint.
+ *
+ * @param link to validate pce bandwidth constraint
+ * @param bandwidthMgmtService instance of BandwidthMgmtService
+ * @return true if link satisfies pce bandwidth constraint otherwise false
+ */
+ public boolean isValidLink(Link link, BandwidthMgmtService bandwidthMgmtService) {
+ if (bandwidthMgmtService == null) {
+ return false;
+ }
+
+ return bandwidthMgmtService.isBandwidthAvailable(link, bandwidth.bps());
+
+ }
+
+ /**
+ * Returns the bandwidth required by this constraint.
+ *
+ * @return required bandwidth
+ */
+ public Bandwidth bandwidth() {
+ return bandwidth;
+ }
+
+ @Override
+ public int hashCode() {
+ return bandwidth.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null || getClass() != obj.getClass()) {
+ return false;
+ }
+ final PceBandwidthConstraint other = (PceBandwidthConstraint) obj;
+ return Objects.equals(this.bandwidth, other.bandwidth);
+ }
+
+ @Override
+ public String toString() {
+ return toStringHelper(this).add("bandwidth", bandwidth).toString();
+ }
+}
diff --git a/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/constraint/SharedBandwidthConstraint.java b/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/constraint/SharedBandwidthConstraint.java
index 2985f24..c5ced44 100644
--- a/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/constraint/SharedBandwidthConstraint.java
+++ b/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/constraint/SharedBandwidthConstraint.java
@@ -19,11 +19,10 @@
import org.onosproject.net.Link;
import org.onosproject.net.intent.ResourceContext;
import org.onosproject.net.intent.constraint.BooleanConstraint;
-import org.onosproject.net.resource.Resources;
+import org.onosproject.bandwidthmgr.api.BandwidthMgmtService;
import java.util.List;
import java.util.Objects;
-import java.util.stream.Stream;
import static com.google.common.base.MoreObjects.toStringHelper;
@@ -99,16 +98,28 @@
@Override
public boolean isValid(Link link, ResourceContext context) {
+ return false;
+ //Do nothing instead using isValidLink needs pce service to validate link
+ }
+
+ /**
+ * Validates the link based on shared bandwidth constraint.
+ *
+ * @param link to validate shared bandwidth constraint
+ * @param bandwidthMgmtService instance of BandwidthMgmtService
+ * @return true if link satisfies shared bandwidth constraint otherwise false
+ */
+ public boolean isValidLink(Link link, BandwidthMgmtService bandwidthMgmtService) {
+ if (bandwidthMgmtService == null) {
+ return false;
+ }
changedBwValue = requestBwValue;
if (links.contains(link)) {
changedBwValue = requestBwValue.isGreaterThan(sharedBwValue) ? requestBwValue.subtract(sharedBwValue)
: Bandwidth.bps(0);
}
- return Stream
- .of(link.src(), link.dst())
- .map(cp -> Resources.continuous(cp.deviceId(), cp.port(), Bandwidth.class).resource(
- changedBwValue.bps())).allMatch(context::isAvailable);
+ return bandwidthMgmtService.isBandwidthAvailable(link, changedBwValue.bps());
}
@Override