Add DataRateUnit to help specifying Bandwidth.

Change-Id: I2b83922d98cab5571408b920a89bb8b704934255
diff --git a/core/api/src/main/java/org/onosproject/net/intent/constraint/BandwidthConstraint.java b/core/api/src/main/java/org/onosproject/net/intent/constraint/BandwidthConstraint.java
index 43b8e4b..20ccb55 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/constraint/BandwidthConstraint.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/constraint/BandwidthConstraint.java
@@ -16,6 +16,8 @@
 package org.onosproject.net.intent.constraint;
 
 import com.google.common.annotations.Beta;
+
+import org.onlab.util.DataRateUnit;
 import org.onosproject.net.Link;
 import org.onosproject.net.resource.link.BandwidthResource;
 import org.onosproject.net.resource.link.BandwidthResourceRequest;
@@ -32,7 +34,7 @@
  * Constraint that evaluates links based on available bandwidths.
  */
 @Beta
-public class BandwidthConstraint extends BooleanConstraint {
+public final class BandwidthConstraint extends BooleanConstraint {
 
     private final BandwidthResource bandwidth;
 
@@ -45,6 +47,17 @@
         this.bandwidth = checkNotNull(bandwidth, "Bandwidth cannot be null");
     }
 
+    /**
+     * Creates a new bandwidth constraint.
+     *
+     * @param v         required amount of bandwidth
+     * @param unit      {@link DataRateUnit} of {@code v}
+     * @return  {@link BandwidthConstraint} instance with given bandwidth requirement
+     */
+    public static BandwidthConstraint of(double v, DataRateUnit unit) {
+        return new BandwidthConstraint(BandwidthResource.of(v, unit));
+    }
+
     // Constructor for serialization
     private BandwidthConstraint() {
         this.bandwidth = null;
diff --git a/core/api/src/main/java/org/onosproject/net/resource/link/BandwidthResource.java b/core/api/src/main/java/org/onosproject/net/resource/link/BandwidthResource.java
index fe21e04..0bfb379 100644
--- a/core/api/src/main/java/org/onosproject/net/resource/link/BandwidthResource.java
+++ b/core/api/src/main/java/org/onosproject/net/resource/link/BandwidthResource.java
@@ -16,7 +16,7 @@
 package org.onosproject.net.resource.link;
 
 import org.onlab.util.Bandwidth;
-
+import org.onlab.util.DataRateUnit;
 import java.util.Objects;
 
 import static com.google.common.base.Preconditions.checkNotNull;
@@ -43,6 +43,17 @@
     }
 
     /**
+     * Creates a new bandwidth resource.
+     *
+     * @param v         amount of bandwidth to request
+     * @param unit      {@link DataRateUnit} of {@code v}
+     * @return  {@link BandwidthResource} instance with given bandwidth
+     */
+    public static BandwidthResource of(double v, DataRateUnit unit) {
+        return new BandwidthResource(Bandwidth.of(v, unit));
+    }
+
+    /**
      * Returns bandwidth as a double value.
      *
      * @return bandwidth as a double value
diff --git a/core/api/src/test/java/org/onosproject/net/intent/HostToHostIntentTest.java b/core/api/src/test/java/org/onosproject/net/intent/HostToHostIntentTest.java
index f870df6..c3a9547 100644
--- a/core/api/src/test/java/org/onosproject/net/intent/HostToHostIntentTest.java
+++ b/core/api/src/test/java/org/onosproject/net/intent/HostToHostIntentTest.java
@@ -16,14 +16,12 @@
 package org.onosproject.net.intent;
 
 import org.junit.Test;
-import org.onlab.util.Bandwidth;
+import org.onlab.util.DataRateUnit;
 import org.onosproject.TestApplicationId;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.net.HostId;
 import org.onosproject.net.flow.TrafficSelector;
 import org.onosproject.net.intent.constraint.BandwidthConstraint;
-import org.onosproject.net.resource.link.BandwidthResource;
-
 import com.google.common.collect.ImmutableList;
 import com.google.common.testing.EqualsTester;
 
@@ -109,8 +107,7 @@
 
     @Test
     public void testImplicitConstraintsAreAdded() {
-        final BandwidthConstraint other = new BandwidthConstraint(
-                                           new BandwidthResource(Bandwidth.gbps(1)));
+        final Constraint other = BandwidthConstraint.of(1, DataRateUnit.GBPS);
         final HostToHostIntent intent = HostToHostIntent.builder()
                 .appId(APPID)
                 .one(id1)
diff --git a/utils/misc/src/main/java/org/onlab/util/Bandwidth.java b/utils/misc/src/main/java/org/onlab/util/Bandwidth.java
index 349e660..6080656 100644
--- a/utils/misc/src/main/java/org/onlab/util/Bandwidth.java
+++ b/utils/misc/src/main/java/org/onlab/util/Bandwidth.java
@@ -42,6 +42,17 @@
     }
 
     /**
+     * Creates a new instance with given bandwidth.
+     *
+     * @param v         bandwidth value
+     * @param unit      {@link DataRateUnit} of {@code v}
+     * @return {@link Bandwidth} instance with given bandwidth
+     */
+    public static Bandwidth of(double v, DataRateUnit unit) {
+        return new Bandwidth(unit.toBitsPerSecond(v));
+    }
+
+    /**
      * Creates a new instance with given bandwidth in bps.
      *
      * @param bps bandwidth value to be assigned
diff --git a/utils/misc/src/main/java/org/onlab/util/DataRateUnit.java b/utils/misc/src/main/java/org/onlab/util/DataRateUnit.java
new file mode 100644
index 0000000..d49ed7b
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/util/DataRateUnit.java
@@ -0,0 +1,64 @@
+package org.onlab.util;
+
+import com.google.common.annotations.Beta;
+
+/**
+ * Data rate unit.
+ */
+@Beta
+public enum DataRateUnit {
+    /**
+     * Bit per second.
+     */
+    BPS(1L),
+    /**
+     * Kilobit per second.
+     * (Decimal/SI)
+     */
+    KBPS(1_000L),
+    /**
+     * Megabit per second.
+     * (Decimal/SI)
+     */
+    MBPS(1_000_000L),
+    /**
+     * Gigabit per second.
+     * (Decimal/SI)
+     */
+    GBPS(1_000_000_000L);
+
+    private final long multiplier;
+
+    DataRateUnit(long multiplier) {
+        this.multiplier = multiplier;
+    }
+
+    /**
+     * Returns the multiplier to use, when converting value of this unit to bps.
+     *
+     * @return multiplier
+     */
+    public long multiplier() {
+        return multiplier;
+    }
+
+    /**
+     * Converts given value in this unit to bits per seconds.
+     *
+     * @param v data rate value
+     * @return {@code v} in bits per seconds
+     */
+    public long toBitsPerSecond(long v) {
+        return v * multiplier;
+    }
+
+    /**
+     * Converts given value in this unit to bits per seconds.
+     *
+     * @param v data rate value
+     * @return {@code v} in bits per seconds
+     */
+    public double toBitsPerSecond(double v) {
+        return v * multiplier;
+    }
+}