Merge "Enable QoS using ovsdb for Evc" into stable/beryllium
authorAlexis de Talhouët <adetalhouet@inocybe.com>
Fri, 29 Jan 2016 19:33:22 +0000 (19:33 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Fri, 29 Jan 2016 19:33:22 +0000 (19:33 +0000)
impl/src/main/java/org/opendaylight/unimgr/command/EvcCreateCommand.java
impl/src/main/java/org/opendaylight/unimgr/command/UniCreateCommand.java
impl/src/main/java/org/opendaylight/unimgr/impl/UnimgrConstants.java
impl/src/main/java/org/opendaylight/unimgr/impl/UnimgrMapper.java
impl/src/main/java/org/opendaylight/unimgr/impl/UnimgrUtils.java

index e7dfdf69a27bc3e8b21d995ee88f42bb12f3f0f5..7ed73f73e64d2cfb05aa4e20f2905b86914eefb8 100644 (file)
@@ -113,6 +113,8 @@ public class EvcCreateCommand extends AbstractCreateCommand {
                         Optional<Node> optionalDestinationBr = UnimgrUtils.readNode(dataBroker,
                                                                                     LogicalDatastoreType.OPERATIONAL,
                                                                                     destinationBridgeIid);
+                        //update ovsdb qos-entry and queues with max-rate to match evc ingress BW
+                        UnimgrUtils.updateMaxRate(dataBroker, sourceUniAugmentation, destinationUniAugmentation, evc);
                         Node sourceBr;
                         Node destinationBr;
                         if (optionalSourceBr.isPresent() && optionalDestinationBr.isPresent()) {
index 49bf992fce0bea1a3080bbcf1ff8589f251b60e1..a81724e9886c21f8ca2451444f3b9ed85463193b 100644 (file)
@@ -72,6 +72,10 @@ public class UniCreateCommand extends AbstractCreateCommand {
                         if (optionalOvsdbNode.isPresent()) {
                             ovsdbNode = optionalOvsdbNode.get();
                             LOG.info("Retrieved the OVSDB node {}", ovsdbNode.getNodeId());
+                            // Update QoS entries to ovsdb if speed is configured to UNI node
+                            if (uni.getSpeed() != null) {
+                                UnimgrUtils.createQoSForOvsdbNode(dataBroker, uni);
+                            }
                             UnimgrUtils.updateUniNode(LogicalDatastoreType.CONFIGURATION,
                                                       uniKey,
                                                       uni,
@@ -99,6 +103,10 @@ public class UniCreateCommand extends AbstractCreateCommand {
                         ovsdbNode = optionalOvsdbNode.get();
                         InstanceIdentifier<Node> ovsdbIid = UnimgrMapper.getOvsdbNodeIid(ovsdbNode.getNodeId());
                         LOG.info("Retrieved the OVSDB node");
+                        // Update QoS entries to ovsdb if speed is configured to UNI node
+                        if (uni.getSpeed() != null) {
+                            UnimgrUtils.createQoSForOvsdbNode(dataBroker, uni);
+                        }
                         UnimgrUtils.createBridgeNode(dataBroker,
                                                      ovsdbIid,
                                                      uni,
@@ -153,6 +161,10 @@ public class UniCreateCommand extends AbstractCreateCommand {
                                                                     UnimgrMapper.getUniIid(dataBroker,
                                                                                            uniAugmentation.getIpAddress(),
                                                                                            LogicalDatastoreType.CONFIGURATION);
+                                        // Update QoS entries to ovsdb if speed is configured to UNI node
+                                        if (uniAugmentation.getSpeed() != null) {
+                                            UnimgrUtils.createQoSForOvsdbNode(dataBroker, uniAugmentation);
+                                        }
                                         UnimgrUtils.createBridgeNode(dataBroker,
                                                                      ovsdbIid,
                                                                      uniAugmentation,
index c37775377ff2ef718b6630c9cb754472744838b4..456e452ec1aa9f5a6d4a2202c2f59b7e6f4a2680 100644 (file)
@@ -44,4 +44,16 @@ public class UnimgrConstants {
     public static final String DEFAULT_GRE_NAME = "gre";
 
     public static final String DEFAULT_GRE_TUNNEL_NAME = "gre1";
+
+    public static final String QOS_DSCP_ATTRIBUTE = "dscp";
+
+    public static final String QOS_DSCP_ATTRIBUTE_VALUE = "0";
+
+    public static final String QOS_MAX_RATE = "max-rate";
+
+    public static final String QOS_PREFIX = "qos://";
+
+    public static final String QUEUE_PREFIX = "queue://";
+
+    public static final long OVSDB_UPDATE_TIMEOUT = 1000;
 }
index ff2293bb61c53e18d21c50e2c41469bfca296506..97b8df3d7875627e182be46aff75a48bcbef6d35 100755 (executable)
@@ -13,6 +13,16 @@ import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.QosEntries;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.QosEntriesKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.Queues;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.QueuesKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.qos.entries.QosOtherConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.qos.entries.QosOtherConfigKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.qos.entries.QueueList;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.qos.entries.QueueListKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.queues.QueuesOtherConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.queues.QueuesOtherConfigKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.UniAugmentation;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.LinkId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
@@ -297,4 +307,41 @@ public class UnimgrMapper {
                                                     new NodeKey(nodeId));
     return nodePath;
 }
+
+    public static InstanceIdentifier<QueueList> getOvsdbQueueListIid (NodeId ovsdbNodeId,
+            QosEntriesKey qosEntryKey,
+            Long queueNumber) {
+        InstanceIdentifier<QueueList> queueIid = InstanceIdentifier
+                .create(NetworkTopology.class)
+                .child(Topology.class, new TopologyKey(UnimgrConstants.OVSDB_TOPOLOGY_ID))
+                .child(Node.class, new NodeKey(ovsdbNodeId))
+                .augmentation(OvsdbNodeAugmentation.class)
+                .child(QosEntries.class, qosEntryKey)
+                .child(QueueList.class, new QueueListKey(queueNumber));
+        return queueIid;
+    }
+
+    public static InstanceIdentifier<QosOtherConfig> getQosOtherConfigIid (NodeId ovsdbNodeId,
+            QosEntriesKey qosEntryKey) {
+        InstanceIdentifier<QosOtherConfig> qosOtherConfigIid = InstanceIdentifier
+                .create(NetworkTopology.class)
+                .child(Topology.class, new TopologyKey(UnimgrConstants.OVSDB_TOPOLOGY_ID))
+                .child(Node.class, new NodeKey(ovsdbNodeId))
+                .augmentation(OvsdbNodeAugmentation.class)
+                .child(QosEntries.class, qosEntryKey)
+                .child(QosOtherConfig.class, new QosOtherConfigKey(UnimgrConstants.QOS_MAX_RATE));
+        return qosOtherConfigIid;
+    }
+
+    public static InstanceIdentifier<QueuesOtherConfig> getQueuesOtherConfigIid (NodeId ovsdbNodeId,
+            QueuesKey queuesKey) {
+        InstanceIdentifier<QueuesOtherConfig> queuesOtherConfig = InstanceIdentifier
+                .create(NetworkTopology.class)
+                .child(Topology.class, new TopologyKey(UnimgrConstants.OVSDB_TOPOLOGY_ID))
+                .child(Node.class, new NodeKey(ovsdbNodeId))
+                .augmentation(OvsdbNodeAugmentation.class)
+                .child(Queues.class, queuesKey)
+                .child(QueuesOtherConfig.class, new QueuesOtherConfigKey(UnimgrConstants.QOS_MAX_RATE));
+        return queuesOtherConfig;
+    }
 }
index 3e8734d93fbf6400bed0acd0eb80c99d749ad762..6124e7fe415aba370cb4f31c8e17f331be183ceb 100644 (file)
@@ -27,6 +27,7 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.ovsdb.southbound.SouthboundConstants;
+import org.opendaylight.ovsdb.southbound.SouthboundMapper;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
@@ -49,6 +50,21 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.re
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ProtocolEntryBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ConnectionInfo;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ConnectionInfoBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.QosEntries;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.QosEntriesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.QosEntriesKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.Queues;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.QueuesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.QueuesKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.qos.entries.QosOtherConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.qos.entries.QosOtherConfigBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.qos.entries.QosOtherConfigKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.qos.entries.QueueList;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.qos.entries.QueueListBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.qos.entries.QueueListKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.queues.QueuesOtherConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.queues.QueuesOtherConfigBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.queues.QueuesOtherConfigKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.Options;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.OptionsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.OptionsKey;
@@ -63,6 +79,11 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.evc.UniSource;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.evc.UniSourceBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.evc.UniSourceKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.service.speed.speed.Speed100M;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.service.speed.speed.Speed10G;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.service.speed.speed.Speed10M;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.service.speed.speed.Speed1G;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.service.speed.Speed;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
@@ -210,6 +231,11 @@ public class UnimgrUtils {
         options.add(destinationIp);
         tpAugmentationBuilder.setOptions(options);
         tpAugmentationBuilder.setInterfaceType(SouthboundConstants.OVSDB_INTERFACE_TYPE_MAP.get("gre"));
+        if (source.getSpeed() != null) {
+            Uuid qosUuid = getQosUuid(dataBroker, source);
+            tpAugmentationBuilder.setQos(getQosUuid(dataBroker, source));
+            LOG.info("Updating Qos {} to termination point {}", qosUuid , bridgeName);
+        }
         TerminationPointBuilder tpBuilder = new TerminationPointBuilder();
         tpBuilder.setKey(InstanceIdentifier.keyOf(tpIid));
         tpBuilder.addAugmentation(OvsdbTerminationPointAugmentation.class, tpAugmentationBuilder.build());
@@ -325,10 +351,273 @@ public class UnimgrUtils {
                                                 .setRemotePort(new PortNumber(UnimgrConstants.OVSDB_PORT))
                                                 .build();
         OvsdbNodeAugmentation ovsdbNode = new OvsdbNodeAugmentationBuilder()
-                                                .setConnectionInfo(connectionInfos).build();
+                                                .setConnectionInfo(connectionInfos)
+                                                .build();
         return ovsdbNode;
     }
 
+    public static OvsdbNodeAugmentation createOvsdbNodeAugmentation(UniAugmentation uni,
+            PortNumber remotePort) {
+        ConnectionInfo connectionInfos = new ConnectionInfoBuilder()
+                .setRemoteIp(uni.getIpAddress())
+                .setRemotePort(remotePort)
+                .build();
+        OvsdbNodeAugmentation ovsdbNode = new OvsdbNodeAugmentationBuilder()
+                .setConnectionInfo(connectionInfos)
+                .setQosEntries(createQosEntries(uni))
+                .setQueues(createQueues(uni))
+                .build();
+        return ovsdbNode;
+    }
+
+    public static Node createQoSForOvsdbNode (DataBroker dataBroker, UniAugmentation uni) {
+        Optional<Node> optionalNode = findOvsdbNode(dataBroker, uni);
+        if (optionalNode.isPresent()) {
+            NodeId ovsdbNodeId = optionalNode.get().getNodeId();
+            InstanceIdentifier<OvsdbNodeAugmentation> ovsdbNodeAugmentationIid = UnimgrMapper
+                    .getOvsdbNodeIid(ovsdbNodeId)
+                    .augmentation(OvsdbNodeAugmentation.class);
+            OvsdbNodeAugmentation ovsdbNodeAugmentation = createOvsdbNodeAugmentation(uni,
+                    getRemotePort(dataBroker, uni));
+            WriteTransaction transaction = dataBroker.newWriteOnlyTransaction();
+            transaction.put(LogicalDatastoreType.CONFIGURATION, ovsdbNodeAugmentationIid, ovsdbNodeAugmentation, true);
+            CheckedFuture<Void, TransactionCommitFailedException> future = transaction.submit();
+            try {
+                Thread.sleep(UnimgrConstants.OVSDB_UPDATE_TIMEOUT);
+            } catch (InterruptedException e) {
+                LOG.warn("Interrupted while waiting after OVSDB node augmentation {} {}", ovsdbNodeId, e);
+            }
+            try {
+                future.checkedGet();
+                LOG.trace("Update qos and queues to ovsdb for node {} {}", ovsdbNodeId, ovsdbNodeAugmentationIid);
+            } catch (TransactionCommitFailedException e) {
+                LOG.warn("Failed to put {} ", ovsdbNodeAugmentationIid, e);
+            }
+            updateQosEntries(dataBroker, uni);
+        }
+        return null;
+    }
+
+    private static PortNumber getRemotePort(DataBroker dataBroker, UniAugmentation uni) {
+        PortNumber remotePort = null;
+        Optional<Node> optionalNode = findOvsdbNode(dataBroker, uni);
+
+        if (optionalNode.isPresent()) {
+            remotePort = optionalNode.get()
+                    .getAugmentation(OvsdbNodeAugmentation.class)
+                    .getConnectionInfo().getRemotePort();
+        }
+        return remotePort;
+    }
+
+    private static List<QosEntries> createQosEntries(Uni uni) {
+        // Configure queue for best-effort dscp and max rate
+        List<QosOtherConfig> otherConfig = new ArrayList<>();
+        QosOtherConfig qOtherConfig = new QosOtherConfigBuilder()
+                .setKey(new QosOtherConfigKey(UnimgrConstants.QOS_DSCP_ATTRIBUTE))
+                .setOtherConfigKey(UnimgrConstants.QOS_DSCP_ATTRIBUTE)
+                .setOtherConfigValue(UnimgrConstants.QOS_DSCP_ATTRIBUTE_VALUE)
+                .build();
+        otherConfig.add(qOtherConfig);
+
+        qOtherConfig = new QosOtherConfigBuilder()
+                .setKey(new QosOtherConfigKey(UnimgrConstants.QOS_MAX_RATE))
+                .setOtherConfigKey(UnimgrConstants.QOS_MAX_RATE)
+                .setOtherConfigValue(getSpeed(uni.getSpeed().getSpeed()))
+                .build();
+        otherConfig.add(qOtherConfig);
+
+        Uuid qosUuid = new Uuid(UUID.randomUUID().toString());
+        QosEntries qosEntry = new QosEntriesBuilder()
+                .setKey(new QosEntriesKey(new Uri(UnimgrConstants.QOS_PREFIX + qosUuid.getValue())))
+                .setQosId(new Uri(UnimgrConstants.QOS_PREFIX + qosUuid.getValue()))
+                .setQosOtherConfig(otherConfig)
+                .setQosType(SouthboundMapper.createQosType(SouthboundConstants.QOS_LINUX_HTB))
+                .build();
+
+        List<QosEntries> qosEntries = new ArrayList<>();
+        qosEntries.add(qosEntry);
+        return qosEntries;
+    }
+
+    private static List<Queues> createQueues(Uni uni) {
+        List<QueuesOtherConfig> otherConfig = new ArrayList<>();
+        QueuesOtherConfig queuesOtherConfig = new QueuesOtherConfigBuilder()
+                .setKey(new QueuesOtherConfigKey(UnimgrConstants.QOS_DSCP_ATTRIBUTE))
+                .setQueueOtherConfigKey(UnimgrConstants.QOS_DSCP_ATTRIBUTE)
+                .setQueueOtherConfigValue(UnimgrConstants.QOS_DSCP_ATTRIBUTE_VALUE)
+                .build();
+        otherConfig.add(queuesOtherConfig);
+
+        queuesOtherConfig = new QueuesOtherConfigBuilder()
+                .setKey(new QueuesOtherConfigKey(UnimgrConstants.QOS_MAX_RATE))
+                .setQueueOtherConfigKey(UnimgrConstants.QOS_MAX_RATE)
+                .setQueueOtherConfigValue(getSpeed(uni.getSpeed().getSpeed()))
+                .build();
+        otherConfig.add(queuesOtherConfig);
+
+        // Configure dscp value for best-effort
+        Uuid queueUuid = new Uuid(UUID.randomUUID().toString());
+        Queues queues = new QueuesBuilder()
+                .setDscp(Short.parseShort(UnimgrConstants.QOS_DSCP_ATTRIBUTE_VALUE))
+                .setKey(new QueuesKey(new Uri(UnimgrConstants.QUEUE_PREFIX + queueUuid.getValue())))
+                .setQueueId(new Uri(UnimgrConstants.QUEUE_PREFIX + queueUuid.getValue()))
+                .setQueuesOtherConfig(otherConfig)
+                .build();
+
+        List<Queues> queuesList = new ArrayList<>();
+        queuesList.add(queues);
+        return queuesList;
+    }
+
+    private static String getSpeed(Speed speedObject) {
+        String speed = null;
+        if (speedObject instanceof Speed10M) {
+            // map to 1MB
+            speed = "1000000";
+        }
+        else if (speedObject instanceof Speed100M) {
+            // map to 2MB
+            speed = "2000000";
+        }
+        else if (speedObject instanceof Speed1G) {
+            // map to 3MB
+            speed = "3000000";
+        }
+        else if (speedObject instanceof Speed10G) {
+            // map to 4MB
+            speed = "4000000";
+        }
+        return speed;
+    }
+
+    private static void updateQosEntries(DataBroker dataBroker, UniAugmentation uni) {
+        Optional<Node> optionalNode = findOvsdbNode(dataBroker, uni);
+        if (optionalNode.isPresent()) {
+            NodeId ovsdbNodeId = optionalNode.get().getNodeId();
+            Long queueNumber = 0L;
+            List<QosEntries> qosList = optionalNode.get()
+                    .getAugmentation(OvsdbNodeAugmentation.class)
+                    .getQosEntries();
+            LOG.trace("QOS entries list {} for node {}", qosList, ovsdbNodeId);
+            QosEntriesKey qosEntryKey = null;
+            for (QosEntries qosEntry : qosList) {
+                qosEntryKey = qosEntry.getKey();
+            }
+            InstanceIdentifier<QueueList> queueIid = UnimgrMapper
+                    .getOvsdbQueueListIid(ovsdbNodeId, qosEntryKey, queueNumber);
+
+            Uuid queueUuid = null;
+            List<Queues> queuesList = optionalNode.get()
+                    .getAugmentation(OvsdbNodeAugmentation.class).getQueues();
+            for (Queues queue : queuesList) {
+                queueUuid = queue.getQueueUuid();
+            }
+            QueueList queueList = new QueueListBuilder()
+                    .setKey(new QueueListKey(queueNumber))
+                    .setQueueNumber(queueNumber)
+                    .setQueueUuid(queueUuid)
+                    .build();
+
+            WriteTransaction transaction = dataBroker.newWriteOnlyTransaction();
+            transaction.put(LogicalDatastoreType.CONFIGURATION, queueIid, queueList, true);
+            CheckedFuture<Void, TransactionCommitFailedException> future = transaction.submit();
+            try {
+                future.checkedGet();
+                LOG.info("Update qos-entries to ovsdb for node {} {}", ovsdbNodeId, queueIid);
+            } catch (TransactionCommitFailedException e) {
+                LOG.warn("Failed to put {} ", queueIid, e);
+            }
+        }
+    }
+
+    public static void updateMaxRate (DataBroker dataBroker,
+            UniAugmentation sourceUniAugmentation,
+            UniAugmentation destinationUniAugmentation,
+            EvcAugmentation evc) {
+        Optional<Node> optionalNode;
+        if (getSpeed(sourceUniAugmentation.getSpeed().getSpeed()).equals(getSpeed(evc.getIngressBw().getSpeed()))) {
+            LOG.info("Source UNI speed matches EVC ingress BW");
+        } else {
+            // update Uni's ovsdbNodeRef qos-entries and queues for max-rate to match EVC ingress BW
+            optionalNode = findOvsdbNode(dataBroker, sourceUniAugmentation);
+            if (optionalNode.isPresent()) {
+                updateQosMaxRate(dataBroker, optionalNode, evc);
+                updateQueuesMaxRate(dataBroker, optionalNode, evc);
+            }
+        }
+
+        if (getSpeed(destinationUniAugmentation.getSpeed().getSpeed()).equals(getSpeed(evc.getIngressBw().getSpeed()))) {
+            LOG.info("Destination UNI speed matches EVC ingress BW");
+        } else {
+            // update Uni's ovsdbNodeRef qos-entries and queues for max-rate to match EVC ingress BW
+            optionalNode = findOvsdbNode(dataBroker, destinationUniAugmentation);
+            if (optionalNode.isPresent()) {
+                updateQosMaxRate(dataBroker, optionalNode, evc);
+                updateQueuesMaxRate(dataBroker, optionalNode, evc);
+            }
+        }
+    }
+
+    private static void updateQosMaxRate(DataBroker dataBroker,
+            Optional<Node> optionalOvsdbNode,
+            EvcAugmentation evc) {
+        NodeId ovsdbNodeId = optionalOvsdbNode.get().getNodeId();
+        List<QosEntries> qosList = optionalOvsdbNode.get()
+                .getAugmentation(OvsdbNodeAugmentation.class)
+                .getQosEntries();
+        LOG.trace("QOS entries list {} for node {}", qosList, ovsdbNodeId);
+        QosEntriesKey qosEntryKey = null;
+        for (QosEntries qosEntry : qosList) {
+            qosEntryKey = qosEntry.getKey();
+        }
+        InstanceIdentifier<QosOtherConfig> qosOtherConfigIid = UnimgrMapper
+                .getQosOtherConfigIid(ovsdbNodeId, qosEntryKey);
+        QosOtherConfig qOtherConfig = new QosOtherConfigBuilder()
+                .setKey(new QosOtherConfigKey(UnimgrConstants.QOS_MAX_RATE))
+                .setOtherConfigKey(UnimgrConstants.QOS_MAX_RATE)
+                .setOtherConfigValue(getSpeed(evc.getIngressBw().getSpeed()))
+                .build();
+        WriteTransaction transaction = dataBroker.newWriteOnlyTransaction();
+        transaction.put(LogicalDatastoreType.CONFIGURATION, qosOtherConfigIid, qOtherConfig, true);
+        CheckedFuture<Void, TransactionCommitFailedException> future = transaction.submit();
+        try {
+            future.checkedGet();
+            LOG.info("Update qos-entries max-rate to ovsdb for node {} {}", ovsdbNodeId, qosOtherConfigIid);;
+        } catch (TransactionCommitFailedException e) {
+            LOG.warn("Failed to put {} ", qosOtherConfigIid, e);
+        }
+    }
+
+    private static void updateQueuesMaxRate(DataBroker dataBroker,
+            Optional<Node> optionalOvsdbNode,
+            EvcAugmentation evc) {
+        NodeId ovsdbNodeId = optionalOvsdbNode.get().getNodeId();
+        List<Queues> queues = optionalOvsdbNode.get()
+                .getAugmentation(OvsdbNodeAugmentation.class)
+                .getQueues();
+        QueuesKey queuesKey = null;
+        for (Queues queue: queues) {
+            queuesKey = queue.getKey();
+        }
+        InstanceIdentifier<QueuesOtherConfig> queuesOtherConfigIid = UnimgrMapper
+                .getQueuesOtherConfigIid(ovsdbNodeId, queuesKey);
+        QueuesOtherConfig queuesOtherConfig = new QueuesOtherConfigBuilder()
+                .setKey(new QueuesOtherConfigKey(UnimgrConstants.QOS_MAX_RATE))
+                .setQueueOtherConfigKey(UnimgrConstants.QOS_MAX_RATE)
+                .setQueueOtherConfigValue(getSpeed(evc.getIngressBw().getSpeed()))
+                .build();
+        WriteTransaction transaction = dataBroker.newWriteOnlyTransaction();
+        transaction.put(LogicalDatastoreType.CONFIGURATION, queuesOtherConfigIid, queuesOtherConfig, true);
+        CheckedFuture<Void, TransactionCommitFailedException> future = transaction.submit();
+        try {
+            future.checkedGet();
+            LOG.info("Update queues max-rate to ovsdb for node {} {}", ovsdbNodeId, queuesOtherConfigIid);;
+        } catch (TransactionCommitFailedException e) {
+            LOG.warn("Failed to put {} ", queuesOtherConfigIid, e);
+        }
+    }
+
     /**
      * Creates an OVSDB node Id with an IP Address.
      * @param ipAddress The IP address of the UNI (therefo the OVSDB node)
@@ -462,6 +751,11 @@ public class UnimgrUtils {
                                                      new OvsdbTerminationPointAugmentationBuilder();
         tpAugmentationBuilder.setName(portName);
         tpAugmentationBuilder.setInterfaceType(null);
+        if (uni.getSpeed() != null) {
+            Uuid qosUuid = getQosUuid(dataBroker, uni);
+            tpAugmentationBuilder.setQos(getQosUuid(dataBroker, uni));
+            LOG.info("Updating Qos {} to termination point {}", qosUuid , bridgeName);
+        }
         TerminationPointBuilder tpBuilder = new TerminationPointBuilder();
         tpBuilder.setKey(InstanceIdentifier.keyOf(tpIid));
         tpBuilder.addAugmentation(OvsdbTerminationPointAugmentation.class,
@@ -473,6 +767,26 @@ public class UnimgrUtils {
         transaction.submit();
     }
 
+    private static Uuid getQosUuid(DataBroker dataBroker, Uni uni) {
+        Uuid qosUuid = null;
+        Optional<Node> optionalNode = findUniNode(dataBroker, uni.getIpAddress());
+
+        if (optionalNode.isPresent()) {
+            UniAugmentation uniAugmentation = optionalNode.get()
+                    .getAugmentation(UniAugmentation.class);
+            Optional<Node> ovsdbNode = findOvsdbNode(dataBroker, uniAugmentation);
+            if (ovsdbNode.isPresent()) {
+                List<QosEntries> qosEntries = ovsdbNode.get()
+                        .getAugmentation(OvsdbNodeAugmentation.class)
+                        .getQosEntries();
+                for (QosEntries qosEntry : qosEntries) {
+                    qosUuid = qosEntry.getQosUuid();
+                }
+            }
+        }
+        return qosUuid;
+    }
+
     /**
      * Deletes a generic node
      * @param dataBroker The instance of the data broker to create transactions