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