Adds Minimum Bandwidth Rule to the Qos Policy 70/60170/40
authorPramod <pramod.raghavendra.jayathirth@intel.com>
Mon, 10 Jul 2017 22:36:19 +0000 (15:36 -0700)
committerpramod.rj07 <pramod.raghavendra.jayathirth@intel.com>
Wed, 17 Jan 2018 01:14:19 +0000 (17:14 -0800)
Qos Feature on Neutron Northbound has supported
two rules initially. This patch facilitates the
addition of a third rule (minimim bandwidth rule)

https://specs.openstack.org/openstack/neutron-specs/specs/newton/ml2-qos-minimum-egress-bw-support.html

Change-Id: Ia3681a28e01c886f6e4ab84d16cf3204e0dad709
Signed-off-by: Pramod <pramod.raghavendra.jayathirth@intel.com>
integration/test/src/test/java/org/opendaylight/neutron/e2etest/NeutronQosPolicyTests.java
model/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/neutron/constants/rev150712/NeutronUtils.java
model/src/main/yang/neutron-constants.yang
model/src/main/yang/neutron-qos.yang
neutron-spi/src/main/java/org/opendaylight/neutron/spi/NeutronQosMinimumBandwidthRule.java [new file with mode: 0644]
neutron-spi/src/main/java/org/opendaylight/neutron/spi/NeutronQosPolicy.java
neutron-spi/src/test/java/org/opendaylight/neutron/spi/NeutronQosJAXBTest.java
resources/Neutron_Northbound_Qos_Rest.postman_collection.json
transcriber/src/main/java/org/opendaylight/neutron/transcriber/NeutronMeteringLabelRuleInterface.java
transcriber/src/main/java/org/opendaylight/neutron/transcriber/NeutronQosPolicyInterface.java
transcriber/src/main/java/org/opendaylight/neutron/transcriber/NeutronSecurityRuleInterface.java

index 1c9afcf58ccb29b2db67f4f196213dbf80bbcefc..8684de11c492eec19434c1eeeb18c5c864db7eb5 100644 (file)
@@ -37,13 +37,16 @@ public class NeutronQosPolicyTests {
     public void qos_policy_modify_test() {
         String url = base + "/qos/policies/d6220bbb-35f3-48ab-8eae-69c60aef3546";
         String content = "{\"policy\": {\"id\": \"d6220bbb-35f3-48ab-8eae-69c60aef3546\","
-                + "\"tenant_id\": \"aa902936679e4ea29bfe1158e3450a13\"," + "\"name\": \"jaxb-test\", "
-                + "\"shared\": false,"
-                + "\"bandwidth_limit_rules\": [ {\"id\": \"d6220bbb-35f3-48ab-8eae-69c60aef3547\","
-                + "\"tenant_id\": \"aa902936679e4ea29bfe1158e3450a14\",\"max_kbps\": 25,"
-                + "\"max_burst_kbps\": 100 } ] ,"
-                + "\"dscp_marking_rules\": [ {\"id\": \"d6220bbb-35f3-48ab-8eae-69c60aef3547\","
-                + "\"tenant_id\": \"aa902936679e4ea29bfe1158e3450a14\", " + "\"dscp_mark\": 8 } ] }}";
+            + "\"tenant_id\": \"aa902936679e4ea29bfe1158e3450a13\"," + "\"name\": \"jaxb-test\", "
+            + "\"shared\": false,"
+            + "\"bandwidth_limit_rules\": [ {\"id\": \"d6220bbb-35f3-48ab-8eae-69c60aef3546\","
+            + "\"tenant_id\": \"aa902936679e4ea29bfe1158e3450a13\",\"max_kbps\": 25,"
+            + "\"max_burst_kbps\": 100 } ] ,"
+            + "\"dscp_marking_rules\": [ {\"id\": \"d6220bbb-35f3-48ab-8eae-69c60aef3546\","
+            + "\"tenant_id\": \"aa902936679e4ea29bfe1158e3450a13\", " + "\"dscp_mark\": 8 } ] ,"
+            + "\"minimum_bandwidth_rules\": [ {\"id\": \"d6220bbb-35f3-48ab-8eae-69c60aef3546\","
+            + "\"tenant_id\": \"aa902936679e4ea29bfe1158e3450a13\", " + "\"min_kbps\": 20,"
+            + "\"direction\": \"egress\" } ] }}";
         ITNeutronE2E.test_modify(url, content, "Qos Policy Singleton Put failed");
     }
 
index f416382b1da88f507b3055ac41e7202b490352a9..85f50734221b60142759250b5ee3f1e15055f6c0 100644 (file)
@@ -62,4 +62,44 @@ public final class NeutronUtils {
             return inverseMapper.get(key);
         }
     }
+
+    // Direction of the Traffic
+    public static class DirectionMapper {
+        private DirectionMapper() {
+            throw new UnsupportedOperationException("Utility class should not be instantiated.");
+        }
+
+        private static final ImmutableBiMap<String, Class<? extends DirectionBase>> MAPPER
+            = new ImmutableBiMap.Builder<String, Class<? extends DirectionBase>>()
+            .put("egress", DirectionEgress.class)
+            .put("ingress", DirectionIngress.class)
+            .build();
+
+        public static Class<? extends DirectionBase> get(String key) {
+            return MAPPER.get(key);
+        }
+
+        public static String getName(Class<? extends DirectionBase> key) {
+            ImmutableBiMap<Class<? extends DirectionBase>, String> inverseMapper = MAPPER.inverse();
+            return inverseMapper.get(key);
+        }
+
+        private static final ImmutableBiMap<String, Class<? extends DirectionMinimumBandwidthRule>>
+            MINIMUMBANDWIDTHRULE_MAPPER = new ImmutableBiMap.Builder<String, Class<? extends
+            DirectionMinimumBandwidthRule>>()
+            .put("egress", DirectionMinimumBandwidthRule.class)
+            .build();
+
+        public static Class<? extends DirectionMinimumBandwidthRule>
+            getMinimumBandwidthRuleDirection(String minimumBandwidthKey) {
+            return MINIMUMBANDWIDTHRULE_MAPPER.get(minimumBandwidthKey);
+        }
+
+        public static String getMinimumBandwidthRuleDirectionString(Class<? extends DirectionMinimumBandwidthRule>
+            minimumBandwidthKey) {
+            ImmutableBiMap<Class<? extends DirectionMinimumBandwidthRule>, String>
+            inverseMinimBandwidthRuleDirectionMapper = MINIMUMBANDWIDTHRULE_MAPPER.inverse();
+            return inverseMinimBandwidthRuleDirectionMapper.get(minimumBandwidthKey);
+        }
+    }
 }
index 74eea62f32a793d3646170d93b7536a5faee6f0b..cc942bf04508103d844e0629cbce11d4f3df28fe 100644 (file)
@@ -115,6 +115,11 @@ module neutron-constants {
 
     }
 
+    identity direction-minimum-bandwidth-rule {
+        description "Direction for minimum bandwidth rule.";
+        base direction-base;
+    }
+
     // IP VERSION
     identity ip-version-base {
         description "the base identity for ip versions";
index 746619e816954ad60b7e47260d58117a5210f327..bfbc959b9c43aa93cd78cdb778129ad7c1e2e177 100644 (file)
@@ -15,6 +15,7 @@ module neutron-qos {
 
     import ietf-yang-types { prefix "yang"; revision-date "2013-07-15"; }
     import neutron-attrs { prefix "attrs"; }
+    import neutron-constants { prefix "constants"; }
 
     organization "OpenDaylight Neutron Group";
 
@@ -63,6 +64,19 @@ module neutron-qos {
         }
     }
 
+    grouping minimumbandwidth-rule-attributes {
+        leaf min-kbps {
+            type uint64;
+            description "The minimum KBPS value";
+        }
+        leaf direction {
+            type identityref {
+                base "constants:direction-minimum-bandwidth-rule";
+            }
+            description "The traffic direction";
+        }
+    }
+
     grouping qos-attributes {
         container qos-policies {
             list qos-policy {
@@ -79,6 +93,11 @@ module neutron-qos {
                     uses attrs:id-attributes;
                     uses dscpmarking-rule-attributes;
                 }
+                list minimumbandwidth-rules {
+                    key "uuid";
+                    uses attrs:id-attributes;
+                    uses minimumbandwidth-rule-attributes;
+                }
             }
         }
         container qos-rule-types {
diff --git a/neutron-spi/src/main/java/org/opendaylight/neutron/spi/NeutronQosMinimumBandwidthRule.java b/neutron-spi/src/main/java/org/opendaylight/neutron/spi/NeutronQosMinimumBandwidthRule.java
new file mode 100644 (file)
index 0000000..3f7df09
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2017 Intel Corporation.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.neutron.spi;
+import java.io.Serializable;
+import java.math.BigInteger;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.NONE)
+public final class NeutronQosMinimumBandwidthRule extends NeutronObject<NeutronQosMinimumBandwidthRule>
+    implements Serializable, INeutronObject<NeutronQosMinimumBandwidthRule> {
+    private static final long serialVersionUID = 1L;
+
+    @XmlElement(name = "min_kbps")
+    BigInteger minKbps;
+
+    @XmlElement(defaultValue = "egress", name = "direction")
+    String direction;
+
+    public BigInteger getMinKbps() {
+        return minKbps;
+    }
+
+    public void setMinKbps(BigInteger minKbps) {
+        this.minKbps = minKbps;
+    }
+
+    public String getDirection() {
+        return direction;
+    }
+
+    public void setDirection(String direction) {
+        this.direction = direction;
+    }
+
+    @Override
+    public boolean extractField(String field, NeutronQosMinimumBandwidthRule ans) {
+        switch (field) {
+            case "min_kbps":
+                ans.setMinKbps(this.getMinKbps());
+                break;
+            case "direction":
+                ans.setDirection(this.getDirection());
+                break;
+            default:
+                return super.extractField(field, ans);
+        }
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return "qosMinimumBandwidthRules{" + "qosMinimumBandwidthRuleUUID='" + uuid + '\'' + ","
+                + " qosMinimumBandwidthRuleTenantID='" + tenantID
+                + '\'' + ", qosMinimumBandwidthMinValue='" + minKbps
+                + '\'' + ", qosMinimumBandwidthDirection='" + direction + '\''
+                + '}';
+    }
+}
\ No newline at end of file
index 46478e618a167eeb36b3345e37f75d0a21e7026c..97965796caf09c96df2042e348e68b8a0a733c3a 100644 (file)
@@ -30,6 +30,9 @@ public final class NeutronQosPolicy extends NeutronBaseAttributes<NeutronQosPoli
     @XmlElement(name = "dscp_marking_rules")
     List<NeutronQosDscpMarkingRule> dscpMarkingRules;
 
+    @XmlElement(name = "minimum_bandwidth_rules")
+    List<NeutronQosMinimumBandwidthRule> minimumBandwidthRules;
+
     public Boolean getPolicyIsShared() {
         return shared;
     }
@@ -54,6 +57,14 @@ public final class NeutronQosPolicy extends NeutronBaseAttributes<NeutronQosPoli
         this.dscpMarkingRules = qosDscpMarkingRules;
     }
 
+    public List<NeutronQosMinimumBandwidthRule> getMinimumBandwidthRules() {
+        return minimumBandwidthRules;
+    }
+
+    public void setMinimumBandwidthRules(List<NeutronQosMinimumBandwidthRule> qosMinimumBandwidthRules) {
+        this.minimumBandwidthRules = qosMinimumBandwidthRules;
+    }
+
     @Override
     protected boolean extractField(String field, NeutronQosPolicy ans) {
         switch (field) {
@@ -70,6 +81,11 @@ public final class NeutronQosPolicy extends NeutronBaseAttributes<NeutronQosPoli
                 qosDscpMarkingRuleList.addAll(this.getDscpMarkingRules());
                 ans.setDscpMarkingRules(qosDscpMarkingRuleList);
                 break;
+            case "minimum_bandwidth_rules":
+                List<NeutronQosMinimumBandwidthRule> qosMinimumBandwidthRuleList = new ArrayList<>();
+                qosMinimumBandwidthRuleList.addAll(this.getMinimumBandwidthRules());
+                ans.setMinimumBandwidthRules(qosMinimumBandwidthRuleList);
+                break;
             default:
                 return super.extractField(field, ans);
         }
@@ -81,8 +97,7 @@ public final class NeutronQosPolicy extends NeutronBaseAttributes<NeutronQosPoli
         return "NeutronQosPolicy{" + "qosPolicyUUID='" + uuid + '\'' + ", qosPolicyTenantID='" + tenantID + '\''
                 + ", qosPolicyName='" + name + '\'' + ", qosPolicyIsShared='" + shared + '\''
                 + ", qosbandwidthLimitRules='" + bandwidthLimitRules + '\'' + ", qosDscpMarkingRules='"
-                + dscpMarkingRules
-                + '\''
+                + dscpMarkingRules + '\'' + ", qosMinimumBandwidthRules='" + minimumBandwidthRules + '\''
                 + '}';
     }
 }
index d51228c5c23764eac5f07bbc6986559cb7158b64..801cce182a22fbb68f91f15b696b51c9cb92d833 100644 (file)
@@ -24,7 +24,10 @@ public class NeutronQosJAXBTest {
             + "\"tenant_id\": \"aa902936679e4ea29bfe1158e3450a14\"," + "\"max_kbps\": 25, "
             + "\"max_burst_kbps\": 100 } ],"
             + "\"dscp_marking_rules\": [ {\"id\": \"d6220bbb-35f3-48ab-8eae-69c60aef3547\","
-            + " \"tenant_id\": \"aa902936679e4ea29bfe1158e3450a14\", " + "\"dscp_mark\": 8 } ] " + "}";
+            + " \"tenant_id\": \"aa902936679e4ea29bfe1158e3450a14\", " + "\"dscp_mark\": 8 } ],"
+            + "\"minimum_bandwidth_rules\": [ {\"id\": \"d6220bbb-35f3-48ab-8eae-69c60aef3547\","
+            + "\"tenant_id\": \"aa902936679e4ea29bfe1158e3450a14\", " + "\"min_kbps\": 20,"
+            + "\"direction\": \"egress\" } ]" + "}";
 
     @Test
     public void test_NeutronQosPolicy_JAXB() throws JAXBException {
@@ -70,7 +73,21 @@ public class NeutronQosJAXBTest {
         Assert.assertEquals("NeutronQosPolicy JaxB Test 6.2 : Testing Tenant ID failed",
                 "aa902936679e4ea29bfe1158e3450a14", dscpMarkingPolicyRules.get(0).tenantID);
 
-        Assert.assertEquals("NeutronQosPolicy JaxB Test 6.3 : Testing Max ingress/Egress value failed", new Short("8"),
-                dscpMarkingPolicyRules.get(0).dscpMark);
+        Assert.assertEquals("NeutronQosPolicy JaxB Test 6.3 : Testing Max ingress/Egress value failed",
+            new Short("8"), dscpMarkingPolicyRules.get(0).dscpMark);
+
+        List<NeutronQosMinimumBandwidthRule> minBandwidthLimitRules = neutronObject.getMinimumBandwidthRules();
+
+        Assert.assertEquals("NeutronQosPolicy JAXB Test 7.0: Testing Bandwidth Policy length failed", 1,
+            minBandwidthLimitRules.size());
+
+        Assert.assertEquals("NeutronQosPolicy JaxB Test 7.2 : Testing Tenant ID failed",
+            "aa902936679e4ea29bfe1158e3450a14", minBandwidthLimitRules.get(0).tenantID);
+
+        Assert.assertEquals("NeutronQosPolicy JaxB Test 7.3 : Testing Minimum Bandwidth failed",
+            new BigInteger("20"), minBandwidthLimitRules.get(0).minKbps);
+
+        Assert.assertEquals("NeutronQosPolicy JaxB Test 7.4 : Testing Direction failed", "egress",
+            minBandwidthLimitRules.get(0).direction);
     }
 }
index 02d2bba2cac89a64e5cacb7a9b2da4bd0a0f7183..3f00b6dec8e5164544e9274560421fe45dddee30 100644 (file)
@@ -2,7 +2,7 @@
        "variables": [],
        "info": {
                "name": "Quality_Of_Service",
-               "_postman_id": "27c8c2eb-995a-b9a2-4a82-af222f6a9806",
+               "_postman_id": "a85eb530-aab5-a5fd-f5e1-90efc89b76df",
                "description": "",
                "schema": "https://schema.getpostman.com/json/collection/v2.0.0/collection.json"
        },
@@ -71,7 +71,7 @@
                                ],
                                "body": {
                                        "mode": "raw",
-                                       "raw": "{\"policy\":  {\"id\": \"d6220bbb-35f3-48ab-8eae-69c60aef3546\",\n                 \"tenant_id\": \"aa902936679e4ea29bfe1158e3450a14\",\n                  \"name\" : \"qos-test\",\n                  \"shared\": false,\n                  \"bandwidth_limit_rules\": [ {\"id\": \"d6220bbb-35f3-48ab-8eae-69c60aef3547\",\n                  \"tenant_id\": \"aa902936679e4ea29bfe1158e3450a14\",\"max_kbps\": 25,\n                  \"max_burst_kbps\": 100 } ] ,\n                  \"dscp_marking_rules\" : [ {\"id\":\"d6220bbb-35f3-48ab-8eae-69c60aef3548\",\n                  \"tenant_id\": \"aa902936679e4ea29bfe1158e3450a14\",\n                  \"dscp_mark\": 8 } ] }}\n"
+                                       "raw": "{\"policy\":  {\"id\": \"d6220bbb-35f3-48ab-8eae-69c60aef3546\",\n                 \"tenant_id\": \"aa902936679e4ea29bfe1158e3450a14\",\n                  \"name\" : \"qos-test\",\n                  \"shared\": false,\n                  \"bandwidth_limit_rules\": [ {\"id\": \"d6220bbb-35f3-48ab-8eae-69c60aef3547\",\n                  \"tenant_id\": \"aa902936679e4ea29bfe1158e3450a14\",\"max_kbps\": 25,\n                  \"max_burst_kbps\": 100 } ] ,\n                  \"dscp_marking_rules\" : [ {\"id\":\"d6220bbb-35f3-48ab-8eae-69c60aef3548\",\n                  \"tenant_id\": \"aa902936679e4ea29bfe1158e3450a14\",\n                  \"dscp_mark\": 8 } ] ,\n                  \"minimum_bandwidth_rules\":  [ {\"id\": \"d6220bbb-35f3-48ab-8eae-69c60aef3549\",\n                  \"tenant_id\": \"aa902936679e4ea29bfe1158e3450a14\",\"min_kbps\": 25,\n                  \"direction\": \"egress" } ] }}\n"
                                },
                                "description": "Update a QOS Policy"
                        },
                                                "description": ""
                                        }
                                ],
-                               "body": {
-                                       "mode": "formdata",
-                                       "formdata": []
-                               },
+                               "body": {},
                                "description": "View the existing QOS policy"
                        },
                        "response": []
index ccfabb53a241414666a6cab01c374407b65c7f11..3154b47d1b6410f88af9c4fec7136d102139be92 100644 (file)
@@ -8,15 +8,12 @@
 
 package org.opendaylight.neutron.transcriber;
 
-import com.google.common.collect.ImmutableBiMap;
 import java.util.List;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.neutron.spi.INeutronMeteringLabelRuleCRUD;
 import org.opendaylight.neutron.spi.NeutronMeteringLabelRule;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.DirectionBase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.DirectionEgress;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.DirectionIngress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.NeutronUtils.DirectionMapper;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.metering.rev150712.metering.rules.attributes.MeteringRules;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.metering.rev150712.metering.rules.attributes.metering.rules.MeteringRule;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.metering.rev150712.metering.rules.attributes.metering.rules.MeteringRuleBuilder;
@@ -25,10 +22,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.metering.rev150712.
 public final class NeutronMeteringLabelRuleInterface
         extends AbstractNeutronInterface<MeteringRule, MeteringRules, MeteringRuleKey, NeutronMeteringLabelRule>
         implements INeutronMeteringLabelRuleCRUD {
-    private static final ImmutableBiMap<Class<? extends DirectionBase>,
-            String> DIRECTION_MAP = new ImmutableBiMap.Builder<Class<? extends DirectionBase>, String>()
-                    .put(DirectionEgress.class, "egress").put(DirectionIngress.class, "ingress").build();
-
     NeutronMeteringLabelRuleInterface(DataBroker db) {
         super(MeteringRuleBuilder.class, db);
     }
@@ -47,9 +40,8 @@ public final class NeutronMeteringLabelRuleInterface
             meteringRuleBuilder.setMeteringLabelId(toUuid(meteringLabelRule.getMeteringLabelRuleLabelID()));
         }
         if (meteringLabelRule.getMeteringLabelRuleDirection() != null) {
-            final ImmutableBiMap<String, Class<? extends DirectionBase>> mapper = DIRECTION_MAP.inverse();
             meteringRuleBuilder.setDirection(
-                    mapper.get(meteringLabelRule.getMeteringLabelRuleDirection()));
+                    DirectionMapper.get(meteringLabelRule.getMeteringLabelRuleDirection()));
         }
         if (meteringLabelRule.getMeteringLabelRuleRemoteIpPrefix() != null) {
             final IpPrefix ipPrefix = new IpPrefix(
@@ -68,7 +60,7 @@ public final class NeutronMeteringLabelRuleInterface
             answer.setMeteringLabelRuleLabelID(rule.getMeteringLabelId().getValue());
         }
         if (rule.getDirection() != null) {
-            answer.setMeteringLabelRuleDirection(DIRECTION_MAP.get(rule.getDirection()));
+            answer.setMeteringLabelRuleDirection(DirectionMapper.getName(rule.getDirection()));
         }
         if (rule.getRemoteIpPrefix() != null) {
             answer.setMeteringLabelRuleRemoteIpPrefix(new String(rule.getRemoteIpPrefix().getValue()));
index 9699df0afb2c5e217fa8aad0c6b28ed814cd4bc4..4c89de6d1bd0dc6affed68b7347594f26b0659aa 100644 (file)
@@ -14,7 +14,9 @@ import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.neutron.spi.INeutronQosPolicyCRUD;
 import org.opendaylight.neutron.spi.NeutronQosBandwidthLimitRule;
 import org.opendaylight.neutron.spi.NeutronQosDscpMarkingRule;
+import org.opendaylight.neutron.spi.NeutronQosMinimumBandwidthRule;
 import org.opendaylight.neutron.spi.NeutronQosPolicy;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.NeutronUtils.DirectionMapper;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.rev160613.qos.attributes.QosPolicies;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.rev160613.qos.attributes.qos.policies.QosPolicy;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.rev160613.qos.attributes.qos.policies.QosPolicyBuilder;
@@ -23,6 +25,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.rev160613.qos.a
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.rev160613.qos.attributes.qos.policies.qos.policy.BandwidthLimitRulesBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.rev160613.qos.attributes.qos.policies.qos.policy.DscpmarkingRules;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.rev160613.qos.attributes.qos.policies.qos.policy.DscpmarkingRulesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.rev160613.qos.attributes.qos.policies.qos.policy.MinimumbandwidthRules;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.rev160613.qos.attributes.qos.policies.qos.policy.MinimumbandwidthRulesBuilder;
 
 public final class NeutronQosPolicyInterface
         extends AbstractNeutronInterface<QosPolicy, QosPolicies, QosPolicyKey,NeutronQosPolicy>
@@ -65,6 +69,20 @@ public final class NeutronQosPolicyInterface
             }
             qosPolicyBuilder.setDscpmarkingRules(listDscpMarking);
         }
+        if (qosPolicy.getMinimumBandwidthRules() != null) {
+            final List<MinimumbandwidthRules> listMinimumBandwidth = new ArrayList<>();
+            for (final NeutronQosMinimumBandwidthRule minimumBandwidthRule : qosPolicy.getMinimumBandwidthRules()) {
+                final MinimumbandwidthRulesBuilder minimumBandwidthRulesBuilder =
+                        new MinimumbandwidthRulesBuilder();
+                minimumBandwidthRulesBuilder.setUuid(toUuid(minimumBandwidthRule.getID()));
+                minimumBandwidthRulesBuilder.setTenantId(toUuid(minimumBandwidthRule.getTenantID()));
+                minimumBandwidthRulesBuilder.setMinKbps(minimumBandwidthRule.getMinKbps());
+                minimumBandwidthRulesBuilder.setDirection(DirectionMapper.getMinimumBandwidthRuleDirection(
+                    minimumBandwidthRule.getDirection()));
+                listMinimumBandwidth.add(minimumBandwidthRulesBuilder.build());
+            }
+            qosPolicyBuilder.setMinimumbandwidthRules(listMinimumBandwidth);
+        }
         return qosPolicyBuilder.build();
     }
 
@@ -94,6 +112,18 @@ public final class NeutronQosPolicyInterface
             }
             result.setDscpMarkingRules(dscpMarkingRules);
         }
+        if (qosPolicy.getMinimumbandwidthRules() != null) {
+            final List<NeutronQosMinimumBandwidthRule> minimumBandwidthRules = new ArrayList<>();
+            for (final MinimumbandwidthRules rule : qosPolicy.getMinimumbandwidthRules()) {
+                NeutronQosMinimumBandwidthRule opt = new NeutronQosMinimumBandwidthRule();
+                opt.setID(rule.getTenantId().getValue());
+                opt.setTenantID(rule.getTenantId().getValue());
+                opt.setMinKbps(rule.getMinKbps());
+                opt.setDirection(DirectionMapper.getMinimumBandwidthRuleDirectionString(rule.getDirection()));
+                minimumBandwidthRules.add(opt);
+            }
+            result.setMinimumBandwidthRules(minimumBandwidthRules);
+        }
         return result;
     }
 }
index ac5a5d391e67ebb261a23c9290e32e9141a8902b..4808007bbc9255149e2b6f1dbce2814362695da4 100644 (file)
@@ -15,12 +15,10 @@ import org.opendaylight.neutron.northbound.api.BadRequestException;
 import org.opendaylight.neutron.spi.INeutronSecurityRuleCRUD;
 import org.opendaylight.neutron.spi.NeutronSecurityRule;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.DirectionBase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.DirectionEgress;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.DirectionIngress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.EthertypeBase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.EthertypeV4;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.EthertypeV6;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.NeutronUtils.DirectionMapper;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.NeutronUtils.ProtocolMapper;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.secgroups.rev150712.SecurityRuleAttributes.Protocol;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.secgroups.rev150712.security.rules.attributes.SecurityRules;
@@ -35,9 +33,6 @@ public final class NeutronSecurityRuleInterface extends
         implements INeutronSecurityRuleCRUD {
     private static final Logger LOG = LoggerFactory.getLogger(NeutronSecurityRuleInterface.class);
 
-    private static final ImmutableBiMap<Class<? extends DirectionBase>,
-            String> DIRECTION_MAP = new ImmutableBiMap.Builder<Class<? extends DirectionBase>, String>()
-                    .put(DirectionEgress.class, "egress").put(DirectionIngress.class, "ingress").build();
     private static final ImmutableBiMap<Class<? extends EthertypeBase>,
             String> ETHERTYPE_MAP = new ImmutableBiMap.Builder<Class<? extends EthertypeBase>, String>()
                     .put(EthertypeV4.class, "IPv4").put(EthertypeV6.class, "IPv6").build();
@@ -56,7 +51,7 @@ public final class NeutronSecurityRuleInterface extends
         final NeutronSecurityRule answer = new NeutronSecurityRule();
         fromMdIds(rule, answer);
         if (rule.getDirection() != null) {
-            answer.setSecurityRuleDirection(DIRECTION_MAP.get(rule.getDirection()));
+            answer.setSecurityRuleDirection(DirectionMapper.getName(rule.getDirection()));
         }
         if (rule.getSecurityGroupId() != null) {
             answer.setSecurityRuleGroupID(rule.getSecurityGroupId().getValue());
@@ -95,9 +90,8 @@ public final class NeutronSecurityRuleInterface extends
         final SecurityRuleBuilder securityRuleBuilder = new SecurityRuleBuilder();
         toMdIds(securityRule, securityRuleBuilder);
         if (securityRule.getSecurityRuleDirection() != null) {
-            final ImmutableBiMap<String, Class<? extends DirectionBase>> mapper = DIRECTION_MAP.inverse();
             securityRuleBuilder
-                    .setDirection(mapper.get(securityRule.getSecurityRuleDirection()));
+                    .setDirection(DirectionMapper.get(securityRule.getSecurityRuleDirection()));
         }
         if (securityRule.getSecurityRuleGroupID() != null) {
             securityRuleBuilder.setSecurityGroupId(toUuid(securityRule.getSecurityRuleGroupID()));