PCE Changes to handle bandwidth changes from network

Change-Id: Ib4961ac4ea8ed803fb035ab93725ae6f0968a5c0
diff --git a/apps/pce/app/src/test/java/org/onosproject/pce/pceservice/PathComputationTest.java b/apps/pce/app/src/test/java/org/onosproject/pce/pceservice/PathComputationTest.java
index 60a84cc..36b7eb5 100644
--- a/apps/pce/app/src/test/java/org/onosproject/pce/pceservice/PathComputationTest.java
+++ b/apps/pce/app/src/test/java/org/onosproject/pce/pceservice/PathComputationTest.java
@@ -15,6 +15,12 @@
  */
 package org.onosproject.pce.pceservice;
 
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -25,7 +31,6 @@
 import org.onlab.graph.GraphPathSearch;
 import org.onlab.packet.ChassisId;
 import org.onlab.util.Bandwidth;
-import org.onlab.util.Tools;
 import org.onosproject.net.AnnotationKeys;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DefaultAnnotations;
@@ -33,45 +38,30 @@
 import org.onosproject.net.DefaultLink;
 import org.onosproject.net.DefaultPath;
 import org.onosproject.net.Device;
+import org.onosproject.net.Device.Type;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Link;
+import org.onosproject.net.LinkKey;
 import org.onosproject.net.Path;
 import org.onosproject.net.PortNumber;
-import org.onosproject.net.intent.Constraint;
-import org.onosproject.net.intent.IntentId;
-import org.onosproject.net.Device.Type;
 import org.onosproject.net.config.Config;
 import org.onosproject.net.config.ConfigApplyDelegate;
 import org.onosproject.net.config.ConfigFactory;
 import org.onosproject.net.config.NetworkConfigRegistryAdapter;
-import org.onosproject.net.intent.constraint.BandwidthConstraint;
 import org.onosproject.net.device.DeviceServiceAdapter;
-import org.onosproject.net.resource.ContinuousResource;
-import org.onosproject.net.resource.ContinuousResourceId;
-import org.onosproject.net.resource.DiscreteResource;
-import org.onosproject.net.resource.DiscreteResourceId;
-import org.onosproject.net.resource.Resource;
-import org.onosproject.net.resource.ResourceAllocation;
-import org.onosproject.net.resource.ResourceConsumer;
-import org.onosproject.net.resource.ResourceId;
-import org.onosproject.net.resource.Resources;
+import org.onosproject.net.intent.Constraint;
 import org.onosproject.net.provider.ProviderId;
 import org.onosproject.net.topology.DefaultTopologyEdge;
 import org.onosproject.net.topology.DefaultTopologyVertex;
-import org.onosproject.net.topology.LinkWeigher;
 import org.onosproject.net.topology.LinkWeight;
 import org.onosproject.net.topology.TopologyEdge;
 import org.onosproject.net.topology.TopologyVertex;
 import org.onosproject.pce.pceservice.constraint.CapabilityConstraint;
 import org.onosproject.pce.pceservice.constraint.CostConstraint;
+import org.onosproject.pce.pceservice.constraint.PceBandwidthConstraint;
 import org.onosproject.pce.pceservice.constraint.SharedBandwidthConstraint;
 import org.onosproject.pcep.api.DeviceCapability;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.JsonNodeFactory;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
+import org.onosproject.pcep.api.TeLinkConfig;
 
 import java.util.Collections;
 import java.util.HashMap;
@@ -80,19 +70,18 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.ImmutableSet.of;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.core.Is.is;
 import static org.onlab.graph.GraphPathSearch.ALL_PATHS;
 import static org.onosproject.core.CoreService.CORE_PROVIDER_ID;
-import static com.google.common.collect.ImmutableSet.of;
-import static org.onosproject.net.resource.Resources.continuous;
-import static org.onosproject.net.Link.Type.DIRECT;
-import static org.onosproject.net.Link.State.ACTIVE;
 import static org.onosproject.net.DeviceId.deviceId;
+import static org.onosproject.net.Link.State.ACTIVE;
+import static org.onosproject.net.Link.Type.DIRECT;
 import static org.onosproject.net.topology.AdapterLinkWeigher.adapt;
 import static org.onosproject.pce.pceservice.constraint.CostConstraint.Type.COST;
 import static org.onosproject.pce.pceservice.constraint.CostConstraint.Type.TE_COST;
@@ -102,10 +91,10 @@
  */
 public class PathComputationTest {
 
-    private final MockPathResourceService resourceService = new MockPathResourceService();
     private final MockDeviceService deviceService = new MockDeviceService();
     private final MockNetConfigRegistryAdapter netConfigRegistry = new MockNetConfigRegistryAdapter();
     private PceManager pceManager = new PceManager();
+    private final MockBandwidthMgmtService bandwidthMgmtService = new MockBandwidthMgmtService();
     public static ProviderId providerId = new ProviderId("pce", "foo");
     public static final String DEVICE1 = "D001";
     public static final String DEVICE2 = "D002";
@@ -132,7 +121,6 @@
 
     @Before
     public void startUp() {
-        pceManager.resourceService = resourceService;
         pceManager.deviceService = deviceService;
         pceManager.netCfgService = netConfigRegistry;
     }
@@ -160,11 +148,6 @@
         ConnectPoint dst = new ConnectPoint(DeviceId.deviceId(device2), PortNumber.portNumber(port2));
         Link curLink;
         DefaultAnnotations.Builder annotationBuilder = DefaultAnnotations.builder();
-        if (setCost) {
-            annotationBuilder.set(ANNOTATION_COST, String.valueOf(value));
-        } else {
-            annotationBuilder.set(ANNOTATION_TE_COST, String.valueOf(value));
-        }
 
         //TODO:If cost not set cost : default value case
         curLink = DefaultLink.builder().src(src).dst(dst).state(ACTIVE).type(DIRECT)
@@ -174,7 +157,6 @@
 
     @After
     public void tearDown() {
-        pceManager.resourceService = null;
         pceManager.deviceService = null;
         pceManager.netCfgService = null;
     }
@@ -186,8 +168,8 @@
      * @param constraints path constraints
      * @return edge-weight function
      */
-    private LinkWeigher weight(List<Constraint> constraints) {
-        return adapt(new MockTeConstraintBasedLinkWeight(constraints));
+    private LinkWeight weight(List<Constraint> constraints) {
+        return new MockTeConstraintBasedLinkWeight(constraints);
     }
 
     private Set<Path> computePath(Link link1, Link link2, Link link3, Link link4, List<Constraint> constraints) {
@@ -198,7 +180,7 @@
                    new DefaultTopologyEdge(D3, D4, link4)));
 
         GraphPathSearch.Result<TopologyVertex, TopologyEdge> result =
-                graphSearch().search(graph, D1, D4, weight(constraints), ALL_PATHS);
+                graphSearch().search(graph, D1, D4, adapt(weight(constraints)), ALL_PATHS);
         ImmutableSet.Builder<Path> builder = ImmutableSet.builder();
         for (org.onlab.graph.Path<TopologyVertex, TopologyEdge> path : result.paths()) {
             builder.add(networkPath(path));
@@ -262,9 +244,19 @@
                 Constraint constraint = it.next();
                 if (constraint instanceof CapabilityConstraint) {
                     cost = ((CapabilityConstraint) constraint).isValidLink(edge.link(), deviceService,
-                                                                           netConfigRegistry) ? 1 : -1;
+                            netConfigRegistry) ? 1 : -1;
+                } else if (constraint instanceof PceBandwidthConstraint) {
+                    cost = ((PceBandwidthConstraint) constraint).isValidLink(edge.link(),
+                            bandwidthMgmtService) ? 1 : -1;
+
+                } else if (constraint instanceof SharedBandwidthConstraint) {
+                    cost = ((SharedBandwidthConstraint) constraint).isValidLink(edge.link(),
+                            bandwidthMgmtService) ? 1 : -1;
+
+                } else if (constraint instanceof CostConstraint) {
+                    cost = ((CostConstraint) constraint).isValidLink(edge.link(), netConfigRegistry);
                 } else {
-                    cost = constraint.cost(edge.link(), resourceService::isAvailable);
+                    cost = constraint.cost(edge.link(), null);
                 }
             }
             return cost;
@@ -279,85 +271,92 @@
         return new DefaultPath(CORE_PROVIDER_ID, links, path.cost());
     }
 
-    /**
-     * Tests Resource service for path computation.
-     */
-    public class MockPathResourceService extends ResourceServiceAdapter {
-        private final Map<Resource, ResourceConsumer> assignment = new HashMap<>();
-        private Map<ResourceId, List<ResourceAllocation>> resourcesAllocations = new HashMap<>();
+    public static class MockBandwidthMgmtService extends BandwidthMgmtServiceAdapter {
+        private Map<LinkKey, Double> teCost = new HashMap<>();
+        // Locally maintain unreserved bandwidth of each link.
+        private Map<LinkKey, Set<Double>> unResvBw = new HashMap<>();
+
+        // Mapping tunnel with link key with local reserved bandwidth
+        private Map<LinkKey, Double> localReservedBw = new HashMap<>();
 
         @Override
-        public Optional<ResourceAllocation> allocate(ResourceConsumer consumer, Resource resources) {
-            List<ResourceAllocation> allocations = allocate(consumer, ImmutableList.of(resources));
-            if (allocations.isEmpty()) {
-                return Optional.empty();
+        public boolean allocLocalReservedBw(LinkKey linkkey, Double bandwidth) {
+            Double allocatedBw = localReservedBw.get(linkkey);
+            if (allocatedBw != null) {
+                localReservedBw.put(linkkey, (allocatedBw + bandwidth));
+            } else {
+                localReservedBw.put(linkkey, bandwidth);
             }
 
-            assert allocations.size() == 1;
-            ResourceAllocation allocation = allocations.get(0);
-            assert allocation.resource().equals(resources);
-
-            // cast is ensured by the assertions above
-            return Optional.of(allocation);
+            return true;
         }
 
         @Override
-        public List<ResourceAllocation> allocate(ResourceConsumer consumer, List<? extends Resource> resources) {
-            for (Resource resource: resources) {
-                if (resource instanceof ContinuousResource) {
-                    List<ResourceAllocation> allocs = new LinkedList<>();
-                    allocs.add(new ResourceAllocation(resource, consumer));
-                    resourcesAllocations.put(resource.id(), allocs);
-                }
+        public boolean releaseLocalReservedBw(LinkKey linkkey, Double bandwidth) {
+            Double allocatedBw = localReservedBw.get(linkkey);
+            if (allocatedBw == null || allocatedBw < bandwidth) {
+                return false;
             }
-            return resources.stream()
-                    .map(x -> new ResourceAllocation(x, consumer))
-                    .collect(Collectors.toList());
+
+            Double releasedBw = allocatedBw - bandwidth;
+            if (releasedBw == 0.0) {
+                localReservedBw.remove(linkkey);
+            } else {
+                localReservedBw.put(linkkey, releasedBw);
+            }
+            return true;
         }
 
         @Override
-        public List<ResourceAllocation> getResourceAllocations(ResourceId id) {
-            if (id instanceof ContinuousResourceId) {
-                return resourcesAllocations.get(id);
-            }
-            DiscreteResource discrete = Resources.discrete((DiscreteResourceId) id).resource();
-            return Optional.ofNullable(assignment.get(discrete))
-                    .map(x -> ImmutableList.of(new ResourceAllocation(discrete, x)))
-                    .orElse(ImmutableList.of());
+        public Double getAllocatedLocalReservedBw(LinkKey linkkey) {
+            return localReservedBw.get(linkkey);
         }
 
         @Override
-        public <T> Set<Resource> getAvailableResources(DiscreteResourceId parent, Class<T> cls) {
-            return getAvailableResources(parent).stream()
-                    .filter(x -> x.isTypeOf(cls))
-                    .collect(Collectors.toSet());
+        public boolean addUnreservedBw(LinkKey linkkey, Set<Double> bandwidth) {
+            unResvBw.put(linkkey, bandwidth);
+            return true;
         }
 
         @Override
-        public <T> Set<T> getAvailableResourceValues(DiscreteResourceId parent, Class<T> cls) {
-            return getAvailableResources(parent).stream()
-                    .filter(x -> x.isTypeOf(cls))
-                    .flatMap(x -> Tools.stream(x.valueAs(cls)))
-                    .collect(Collectors.toSet());
+        public boolean removeUnreservedBw(LinkKey linkkey) {
+            unResvBw.remove(linkkey);
+            return true;
         }
 
         @Override
-        public boolean isAvailable(Resource resource) {
-            if (resource instanceof DiscreteResource) {
-                return true;
-            }
+        public Set<Double> getUnreservedBw(LinkKey linkkey) {
+            checkNotNull(linkkey);
+            return unResvBw.get(linkkey);
+        }
 
-            if (resource instanceof ContinuousResource) {
-                List<ResourceAllocation> resalloc = resourcesAllocations.get(resource.id());
+        @Override
+        public boolean isBandwidthAvailable(Link link, Double bandwidth) {
+            LinkKey linkKey = LinkKey.linkKey(link);
+            Double localAllocBw = getAllocatedLocalReservedBw(linkKey);
 
-                if ((resalloc != null) && (!resalloc.isEmpty())) {
-                    if (((ContinuousResource) resalloc.iterator().next().resource()).value()
-                            >= ((ContinuousResource) resource).value()) {
-                        return true;
-                    }
-                }
+            Set<Double> unResvBw = getUnreservedBw(linkKey);
+
+            Double prirZeroBw = unResvBw.iterator().next();
+            return (bandwidth <= prirZeroBw -  (localAllocBw != null ? localAllocBw : 0));
+        }
+
+        @Override
+        public Double getTeCost(LinkKey linkKey) {
+            if (teCost.get(linkKey) != null) {
+                return teCost.get(linkKey);
             }
-            return false;
+            return null;
+        }
+
+        @Override
+        public Double getAvailableBandwidth(LinkKey linkKey) {
+            if (unResvBw.get(linkKey) != null && localReservedBw.get(linkKey) != null) {
+
+                return unResvBw.get(linkKey).iterator().next().doubleValue()
+                        - localReservedBw.get(linkKey).doubleValue();
+            }
+            return unResvBw.get(linkKey).iterator().next().doubleValue();
         }
     }
 
@@ -365,6 +364,7 @@
     public static class MockNetConfigRegistryAdapter extends NetworkConfigRegistryAdapter {
         private ConfigFactory cfgFactory;
         private Map<DeviceId, DeviceCapability> classConfig = new HashMap<>();
+        private Map<LinkKey, TeLinkConfig> teLinkConfig = new HashMap<>();
 
         @Override
         public void registerConfigFactory(ConfigFactory configFactory) {
@@ -387,6 +387,15 @@
                 ConfigApplyDelegate delegate = new InternalApplyDelegate();
                 devCap.init((DeviceId) subject, null, node, mapper, delegate);
                 return (C) devCap;
+            } else if (configClass == TeLinkConfig.class) {
+                TeLinkConfig teConfig = new TeLinkConfig();
+                teLinkConfig.put((LinkKey) subject, teConfig);
+
+                JsonNode node = new ObjectNode(new MockJsonNode());
+                ObjectMapper mapper = new ObjectMapper();
+                ConfigApplyDelegate delegate = new InternalApplyDelegate();
+                teConfig.init((LinkKey) subject, null, node, mapper, delegate);
+                return (C) teConfig;
             }
 
             return null;
@@ -394,13 +403,19 @@
 
         @Override
         public <S, C extends Config<S>> void removeConfig(S subject, Class<C> configClass) {
-            classConfig.remove(subject);
+            if (configClass == DeviceCapability.class) {
+                classConfig.remove(subject);
+            } else if (configClass == TeLinkConfig.class) {
+                teLinkConfig.remove(subject);
+            }
         }
 
         @Override
         public <S, C extends Config<S>> C getConfig(S subject, Class<C> configClass) {
             if (configClass == DeviceCapability.class) {
                 return (C) classConfig.get(subject);
+            } else if (configClass == TeLinkConfig.class) {
+                return (C) teLinkConfig.get(subject);
             }
             return null;
         }
@@ -432,6 +447,23 @@
         List<Constraint> constraints = new LinkedList<>();
         constraints.add(costConst);
 
+        TeLinkConfig teLinkConfig = netConfigRegistry.addConfig(LinkKey.linkKey(link1), TeLinkConfig.class);
+        teLinkConfig.igpCost(50)
+                .apply();
+
+
+        TeLinkConfig teLinkConfig2 = netConfigRegistry.addConfig(LinkKey.linkKey(link2), TeLinkConfig.class);
+        teLinkConfig2.igpCost(20)
+                .apply();
+
+        TeLinkConfig teLinkConfig3 = netConfigRegistry.addConfig(LinkKey.linkKey(link3), TeLinkConfig.class);
+        teLinkConfig3.igpCost(100)
+                .apply();
+
+        TeLinkConfig teLinkConfig4 = netConfigRegistry.addConfig(LinkKey.linkKey(link4), TeLinkConfig.class);
+        teLinkConfig4.igpCost(50)
+                .apply();
+
         Set<Path> paths = computePath(link1, link2, link3, link4, constraints);
 
         List<Link> links = new LinkedList<>();
@@ -456,6 +488,24 @@
         CostConstraint costConst = CostConstraint.of(COST);
         List<Constraint> constraints = new LinkedList<>();
         constraints.add(costConst);
+
+        TeLinkConfig teLinkConfig = netConfigRegistry.addConfig(LinkKey.linkKey(link1), TeLinkConfig.class);
+        teLinkConfig.igpCost(100)
+                .apply();
+
+
+        TeLinkConfig teLinkConfig2 = netConfigRegistry.addConfig(LinkKey.linkKey(link2), TeLinkConfig.class);
+        teLinkConfig2.igpCost(100)
+                .apply();
+
+        TeLinkConfig teLinkConfig3 = netConfigRegistry.addConfig(LinkKey.linkKey(link3), TeLinkConfig.class);
+        teLinkConfig3.igpCost(1000)
+                .apply();
+
+        TeLinkConfig teLinkConfig4 = netConfigRegistry.addConfig(LinkKey.linkKey(link4), TeLinkConfig.class);
+        teLinkConfig4.igpCost(100)
+                .apply();
+
         Set<Path> paths = computePath(link1, link2, link3, link4, constraints);
 
         List<Link> links = new LinkedList<>();
@@ -476,29 +526,24 @@
         Link link3 = addLink(DEVICE1, 80, DEVICE3, 70, true, 100);
         Link link4 = addLink(DEVICE3, 60, DEVICE4, 50, true, 50);
 
-        List<Resource> resources = new LinkedList<>();
+        Set<Double> unreserved = new HashSet<>();
+        unreserved.add(new Double(50));
 
-        resources.add(continuous(link1.src().deviceId(), link1.src().port(), Bandwidth.class)
-                .resource(50));
-        resources.add(continuous(link2.src().deviceId(), link2.src().port(), Bandwidth.class)
-                .resource(50));
-        resources.add(continuous(link3.src().deviceId(), link3.src().port(), Bandwidth.class)
-                .resource(100));
-        resources.add(continuous(link4.src().deviceId(), link4.src().port(), Bandwidth.class)
-                .resource(100));
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link1), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link1), new Double(0));
 
-        resources.add(continuous(link1.dst().deviceId(), link1.dst().port(), Bandwidth.class)
-                .resource(50));
-        resources.add(continuous(link2.dst().deviceId(), link2.dst().port(), Bandwidth.class)
-                .resource(50));
-        resources.add(continuous(link3.dst().deviceId(), link3.src().port(), Bandwidth.class)
-                .resource(100));
-        resources.add(continuous(link4.dst().deviceId(), link4.dst().port(), Bandwidth.class)
-                .resource(100));
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link2), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link2), new Double(0));
 
-        resourceService.allocate(IntentId.valueOf(70), resources);
+        unreserved.remove(new Double(50));
+        unreserved.add(new Double(100));
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link3), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link3), new Double(0));
 
-        BandwidthConstraint bandwidthConst = new BandwidthConstraint(Bandwidth.bps(10.0));
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link4), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link4), new Double(0));
+
+        PceBandwidthConstraint bandwidthConst = new PceBandwidthConstraint(Bandwidth.bps(10.0));
 
         List<Constraint> constraints = new LinkedList<>();
         constraints.add(bandwidthConst);
@@ -518,21 +563,24 @@
         Link link3 = addLink(DEVICE1, 80, DEVICE3, 70, true, 100);
         Link link4 = addLink(DEVICE3, 60, DEVICE4, 50, true, 100);
 
-        List<Resource> resources = new LinkedList<>();
+        Set<Double> unreserved = new HashSet<>();
+        unreserved.add(new Double(50));
 
-        resources.add(continuous(link1.src().deviceId(), link1.src().port(), Bandwidth.class).resource(50));
-        resources.add(continuous(link2.src().deviceId(), link2.src().port(), Bandwidth.class).resource(50));
-        resources.add(continuous(link3.src().deviceId(), link3.src().port(), Bandwidth.class).resource(100));
-        resources.add(continuous(link4.src().deviceId(), link4.src().port(), Bandwidth.class).resource(100));
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link1), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link1), new Double(0));
 
-        resources.add(continuous(link1.dst().deviceId(), link1.dst().port(), Bandwidth.class).resource(50));
-        resources.add(continuous(link2.dst().deviceId(), link2.dst().port(), Bandwidth.class).resource(50));
-        resources.add(continuous(link3.dst().deviceId(), link3.dst().port(), Bandwidth.class).resource(100));
-        resources.add(continuous(link4.dst().deviceId(), link4.dst().port(), Bandwidth.class).resource(100));
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link2), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link2), new Double(0));
 
-        resourceService.allocate(IntentId.valueOf(70), resources);
+        unreserved.remove(new Double(50));
+        unreserved.add(new Double(100));
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link3), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link3), new Double(0));
 
-        BandwidthConstraint bandwidthConst = new BandwidthConstraint(Bandwidth.bps(60.0));
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link4), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link4), new Double(0));
+
+        PceBandwidthConstraint bandwidthConst = new PceBandwidthConstraint(Bandwidth.bps(60.0));
 
         List<Constraint> constraints = new LinkedList<>();
         constraints.add(bandwidthConst);
@@ -551,18 +599,22 @@
         Link link3 = addLink(DEVICE1, 80, DEVICE3, 70, true, 100);
         Link link4 = addLink(DEVICE3, 60, DEVICE4, 50, true, 80);
 
-        List<Resource> resources = new LinkedList<>();
+        Set<Double> unreserved = new HashSet<>();
+        unreserved.add(new Double(50));
 
-        resources.add(continuous(link1.src().deviceId(), link1.src().port(), Bandwidth.class).resource(50));
-        resources.add(continuous(link2.src().deviceId(), link2.src().port(), Bandwidth.class).resource(50));
-        resources.add(continuous(link3.src().deviceId(), link3.src().port(), Bandwidth.class).resource(100));
-        resources.add(continuous(link4.src().deviceId(), link4.src().port(), Bandwidth.class).resource(100));
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link1), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link1), new Double(0));
 
-        resources.add(continuous(link1.dst().deviceId(), link1.dst().port(), Bandwidth.class).resource(50));
-        resources.add(continuous(link2.dst().deviceId(), link2.dst().port(), Bandwidth.class).resource(50));
-        resources.add(continuous(link3.dst().deviceId(), link3.dst().port(), Bandwidth.class).resource(100));
-        resources.add(continuous(link4.dst().deviceId(), link4.dst().port(), Bandwidth.class).resource(100));
-        resourceService.allocate(IntentId.valueOf(70), resources);
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link2), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link2), new Double(0));
+
+        unreserved.remove(new Double(50));
+        unreserved.add(new Double(100));
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link3), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link3), new Double(0));
+
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link4), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link4), new Double(0));
 
         List<Constraint> constraints = new LinkedList<>();
 
@@ -573,6 +625,25 @@
         links.add(link2);
 
         CostConstraint costConst = CostConstraint.of(COST);
+
+
+        TeLinkConfig teLinkConfig = netConfigRegistry.addConfig(LinkKey.linkKey(link1), TeLinkConfig.class);
+        teLinkConfig.igpCost(50)
+                .apply();
+
+
+        TeLinkConfig teLinkConfig2 = netConfigRegistry.addConfig(LinkKey.linkKey(link2), TeLinkConfig.class);
+        teLinkConfig2.igpCost(20)
+                .apply();
+
+        TeLinkConfig teLinkConfig3 = netConfigRegistry.addConfig(LinkKey.linkKey(link3), TeLinkConfig.class);
+        teLinkConfig3.igpCost(100)
+                .apply();
+
+        TeLinkConfig teLinkConfig4 = netConfigRegistry.addConfig(LinkKey.linkKey(link4), TeLinkConfig.class);
+        teLinkConfig4.igpCost(50)
+                .apply();
+
         sharedLinks.addAll(links);
         SharedBandwidthConstraint sharedBw = new SharedBandwidthConstraint(sharedLinks, Bandwidth.bps(10),
                 Bandwidth.bps(20.0));
@@ -593,18 +664,22 @@
         Link link3 = addLink(DEVICE1, 80, DEVICE3, 70, true, 100);
         Link link4 = addLink(DEVICE3, 60, DEVICE4, 50, true, 80);
 
-        List<Resource> resources = new LinkedList<>();
+        Set<Double> unreserved = new HashSet<>();
+        unreserved.add(new Double(50));
 
-        resources.add(continuous(link1.src().deviceId(), link1.src().port(), Bandwidth.class).resource(50));
-        resources.add(continuous(link2.src().deviceId(), link2.src().port(), Bandwidth.class).resource(50));
-        resources.add(continuous(link3.src().deviceId(), link3.src().port(), Bandwidth.class).resource(100));
-        resources.add(continuous(link4.src().deviceId(), link4.src().port(), Bandwidth.class).resource(100));
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link1), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link1), new Double(0));
 
-        resources.add(continuous(link1.dst().deviceId(), link1.dst().port(), Bandwidth.class).resource(50));
-        resources.add(continuous(link2.dst().deviceId(), link2.dst().port(), Bandwidth.class).resource(50));
-        resources.add(continuous(link3.dst().deviceId(), link3.dst().port(), Bandwidth.class).resource(100));
-        resources.add(continuous(link4.dst().deviceId(), link4.dst().port(), Bandwidth.class).resource(100));
-        resourceService.allocate(IntentId.valueOf(70), resources);
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link2), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link2), new Double(0));
+
+        unreserved.remove(new Double(50));
+        unreserved.add(new Double(100));
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link3), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link3), new Double(0));
+
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link4), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link4), new Double(0));
 
         List<Constraint> constraints = new LinkedList<>();
 
@@ -614,6 +689,25 @@
         links.add(link1);
         links.add(link2);
         CostConstraint costConst = CostConstraint.of(COST);
+
+
+        TeLinkConfig teLinkConfig = netConfigRegistry.addConfig(LinkKey.linkKey(link1), TeLinkConfig.class);
+        teLinkConfig.igpCost(50)
+                .apply();
+
+
+        TeLinkConfig teLinkConfig2 = netConfigRegistry.addConfig(LinkKey.linkKey(link2), TeLinkConfig.class);
+        teLinkConfig2.igpCost(20)
+                .apply();
+
+        TeLinkConfig teLinkConfig3 = netConfigRegistry.addConfig(LinkKey.linkKey(link3), TeLinkConfig.class);
+        teLinkConfig3.igpCost(100)
+                .apply();
+
+        TeLinkConfig teLinkConfig4 = netConfigRegistry.addConfig(LinkKey.linkKey(link4), TeLinkConfig.class);
+        teLinkConfig4.igpCost(80)
+                .apply();
+
         sharedLinks.addAll(links);
         SharedBandwidthConstraint sharedBwConst = new SharedBandwidthConstraint(sharedLinks, Bandwidth.bps(20),
                 Bandwidth.bps(10.0));
@@ -654,6 +748,25 @@
 
         List<Constraint> constraints = new LinkedList<>();
         constraints.add(tecostConst);
+
+
+        TeLinkConfig teLinkConfig = netConfigRegistry.addConfig(LinkKey.linkKey(link1), TeLinkConfig.class);
+        teLinkConfig.teCost(50)
+                .apply();
+
+
+        TeLinkConfig teLinkConfig2 = netConfigRegistry.addConfig(LinkKey.linkKey(link2), TeLinkConfig.class);
+        teLinkConfig2.teCost(20)
+                .apply();
+
+        TeLinkConfig teLinkConfig3 = netConfigRegistry.addConfig(LinkKey.linkKey(link3), TeLinkConfig.class);
+        teLinkConfig3.teCost(100)
+                .apply();
+
+        TeLinkConfig teLinkConfig4 = netConfigRegistry.addConfig(LinkKey.linkKey(link4), TeLinkConfig.class);
+        teLinkConfig4.teCost(80)
+                .apply();
+
         Set<Path> paths = computePath(link1, link2, link3, link4, constraints);
 
         List<Link> links = new LinkedList<>();
@@ -674,6 +787,25 @@
         Link link4 = addLink(DEVICE3, 60, DEVICE4, 50, false, 80);
 
         CostConstraint tecostConst = CostConstraint.of(TE_COST);
+
+        TeLinkConfig teLinkConfig = netConfigRegistry.addConfig(LinkKey.linkKey(link1), TeLinkConfig.class);
+        teLinkConfig.teCost(50)
+                .apply();
+
+
+        TeLinkConfig teLinkConfig2 = netConfigRegistry.addConfig(LinkKey.linkKey(link2), TeLinkConfig.class);
+        teLinkConfig2.teCost(20)
+                .apply();
+
+        TeLinkConfig teLinkConfig3 = netConfigRegistry.addConfig(LinkKey.linkKey(link3), TeLinkConfig.class);
+        teLinkConfig3.teCost(100)
+                .apply();
+
+        TeLinkConfig teLinkConfig4 = netConfigRegistry.addConfig(LinkKey.linkKey(link4), TeLinkConfig.class);
+        teLinkConfig4.teCost(80)
+                .apply();
+
+
         CapabilityConstraint capabilityConst = CapabilityConstraint
                 .of(CapabilityConstraint.CapabilityType.WITH_SIGNALLING);
 
@@ -754,6 +886,23 @@
         constraints.add(capabilityConst);
         CostConstraint costConst = CostConstraint.of(COST);
         constraints.add(costConst);
+        TeLinkConfig teLinkConfig = netConfigRegistry.addConfig(LinkKey.linkKey(link1), TeLinkConfig.class);
+        teLinkConfig.igpCost(50)
+                .apply();
+
+
+        TeLinkConfig teLinkConfig2 = netConfigRegistry.addConfig(LinkKey.linkKey(link2), TeLinkConfig.class);
+        teLinkConfig2.igpCost(20)
+                .apply();
+
+        TeLinkConfig teLinkConfig3 = netConfigRegistry.addConfig(LinkKey.linkKey(link3), TeLinkConfig.class);
+        teLinkConfig3.igpCost(100)
+                .apply();
+
+        TeLinkConfig teLinkConfig4 = netConfigRegistry.addConfig(LinkKey.linkKey(link4), TeLinkConfig.class);
+        teLinkConfig4.igpCost(80)
+                .apply();
+
         //Device1
         DefaultAnnotations.Builder builder = DefaultAnnotations.builder();
         builder.set(AnnotationKeys.TYPE, L3);
@@ -824,6 +973,23 @@
         constraints.add(capabilityConst);
         CostConstraint costConst = CostConstraint.of(COST);
         constraints.add(costConst);
+
+        TeLinkConfig teLinkConfig = netConfigRegistry.addConfig(LinkKey.linkKey(link1), TeLinkConfig.class);
+        teLinkConfig.igpCost(50)
+                .apply();
+
+
+        TeLinkConfig teLinkConfig2 = netConfigRegistry.addConfig(LinkKey.linkKey(link2), TeLinkConfig.class);
+        teLinkConfig2.igpCost(20)
+                .apply();
+
+        TeLinkConfig teLinkConfig3 = netConfigRegistry.addConfig(LinkKey.linkKey(link3), TeLinkConfig.class);
+        teLinkConfig3.igpCost(100)
+                .apply();
+
+        TeLinkConfig teLinkConfig4 = netConfigRegistry.addConfig(LinkKey.linkKey(link4), TeLinkConfig.class);
+        teLinkConfig4.igpCost(80)
+                .apply();
         //Device1
         DefaultAnnotations.Builder builder = DefaultAnnotations.builder();
         builder.set(AnnotationKeys.TYPE, L3);
@@ -894,6 +1060,23 @@
 
         constraints.add(capabilityConst);
         constraints.add(tecostConst);
+
+        TeLinkConfig teLinkConfig = netConfigRegistry.addConfig(LinkKey.linkKey(link1), TeLinkConfig.class);
+        teLinkConfig.teCost(50)
+                .apply();
+
+
+        TeLinkConfig teLinkConfig2 = netConfigRegistry.addConfig(LinkKey.linkKey(link2), TeLinkConfig.class);
+        teLinkConfig2.teCost(20)
+                .apply();
+
+        TeLinkConfig teLinkConfig3 = netConfigRegistry.addConfig(LinkKey.linkKey(link3), TeLinkConfig.class);
+        teLinkConfig3.teCost(100)
+                .apply();
+
+        TeLinkConfig teLinkConfig4 = netConfigRegistry.addConfig(LinkKey.linkKey(link4), TeLinkConfig.class);
+        teLinkConfig4.teCost(80)
+                .apply();
         //Device1
         DefaultAnnotations.Builder builder = DefaultAnnotations.builder();
         builder.set(AnnotationKeys.TYPE, L3);
@@ -1061,6 +1244,28 @@
 
         List<Constraint> constraints = new LinkedList<>();
         constraints.add(costConst);
+
+        TeLinkConfig teLinkConfig = netConfigRegistry.addConfig(LinkKey.linkKey(link1), TeLinkConfig.class);
+        teLinkConfig.igpCost(50)
+                .apply();
+
+
+        TeLinkConfig teLinkConfig2 = netConfigRegistry.addConfig(LinkKey.linkKey(link2), TeLinkConfig.class);
+        teLinkConfig2.igpCost(100)
+                .apply();
+
+        TeLinkConfig teLinkConfig3 = netConfigRegistry.addConfig(LinkKey.linkKey(link3), TeLinkConfig.class);
+        teLinkConfig3.igpCost(10)
+                .apply();
+
+        TeLinkConfig teLinkConfig4 = netConfigRegistry.addConfig(LinkKey.linkKey(link4), TeLinkConfig.class);
+        teLinkConfig4.igpCost(10)
+                .apply();
+
+        TeLinkConfig teLinkConfig5 = netConfigRegistry.addConfig(LinkKey.linkKey(link5), TeLinkConfig.class);
+        teLinkConfig5.igpCost(20)
+                .apply();
+
         Graph<TopologyVertex, TopologyEdge> graph = new AdjacencyListsGraph<>(of(D1, D2, D3, D4, D5),
                 of(new DefaultTopologyEdge(D1, D2, link1),
                    new DefaultTopologyEdge(D2, D4, link2),
@@ -1069,7 +1274,7 @@
                    new DefaultTopologyEdge(D4, D5, link5)));
 
         GraphPathSearch.Result<TopologyVertex, TopologyEdge> result =
-                graphSearch().search(graph, D1, D5, weight(constraints), ALL_PATHS);
+                graphSearch().search(graph, D1, D5, adapt(weight(constraints)), ALL_PATHS);
         ImmutableSet.Builder<Path> builder = ImmutableSet.builder();
         for (org.onlab.graph.Path<TopologyVertex, TopologyEdge> path : result.paths()) {
             builder.add(networkPath(path));
@@ -1154,6 +1359,24 @@
         CapabilityConstraint capabilityConst = CapabilityConstraint
                 .of(CapabilityConstraint.CapabilityType.WITHOUT_SIGNALLING_AND_WITHOUT_SR);
         CostConstraint costConst = CostConstraint.of(COST);
+
+        TeLinkConfig teLinkConfig = netConfigRegistry.addConfig(LinkKey.linkKey(link1), TeLinkConfig.class);
+        teLinkConfig.igpCost(50)
+                .apply();
+
+
+        TeLinkConfig teLinkConfig2 = netConfigRegistry.addConfig(LinkKey.linkKey(link2), TeLinkConfig.class);
+        teLinkConfig2.igpCost(20)
+                .apply();
+
+        TeLinkConfig teLinkConfig3 = netConfigRegistry.addConfig(LinkKey.linkKey(link3), TeLinkConfig.class);
+        teLinkConfig3.igpCost(10)
+                .apply();
+
+        TeLinkConfig teLinkConfig4 = netConfigRegistry.addConfig(LinkKey.linkKey(link4), TeLinkConfig.class);
+        teLinkConfig4.igpCost(10)
+                .apply();
+
         List<Constraint> constraints = new LinkedList<>();
         constraints.add(capabilityConst);
         constraints.add(costConst);
@@ -1199,4 +1422,4 @@
         UNKNOWN, UNKNOWN, UNKNOWN,
         UNKNOWN, new ChassisId(), builder.build()));
     }
-}
+}
\ No newline at end of file