Added annotations for tier and meteredUsage

Change-Id: I9a32bc1b5787361cdb7c4b6d7a23279c75188571
diff --git a/core/api/src/main/java/org/onosproject/net/AnnotationKeys.java b/core/api/src/main/java/org/onosproject/net/AnnotationKeys.java
index d19117f..2cfb333 100644
--- a/core/api/src/main/java/org/onosproject/net/AnnotationKeys.java
+++ b/core/api/src/main/java/org/onosproject/net/AnnotationKeys.java
@@ -248,6 +248,19 @@
     public static final String METERED = "metered";
 
     /**
+     * Annotation key for data usage on a metered link.
+     * The value of this key is expected to be a percentage of the data available within the plan.
+     */
+    public static final String METERED_USAGE = "meteredUsage";
+
+    /**
+     * Annotation key for identifying the tier ranking of a link. Links with a lower tier would be
+     * selected in the path over links with a higher tier.
+     * The value of this key is expected to be a number that represents the tier value.
+     */
+    public static final String TIER = "tier";
+
+    /**
      * Returns the value annotated object for the specified annotation key.
      * The annotated value is expected to be String that can be parsed as double.
      * If parsing fails, the returned value will be {@value #DEFAULT_VALUE}.
diff --git a/core/api/src/main/java/org/onosproject/net/config/basics/BasicLinkConfig.java b/core/api/src/main/java/org/onosproject/net/config/basics/BasicLinkConfig.java
index 8ee0c1b..e6a5c85 100644
--- a/core/api/src/main/java/org/onosproject/net/config/basics/BasicLinkConfig.java
+++ b/core/api/src/main/java/org/onosproject/net/config/basics/BasicLinkConfig.java
@@ -45,6 +45,8 @@
     public static final String DELAY = "delay";
     public static final String LOSS = "loss";
     public static final String AVAILABILITY = "availability";
+    public static final String TIER = "tier";
+    public static final String METERED_USAGE = "meteredUsage";
     public static final String FLAPPING = "flapping";
     public static final String IS_DURABLE = "durable";
     public static final String IS_BIDIRECTIONAL = "bidirectional";
@@ -56,11 +58,13 @@
         type();
 
         return hasOnlyFields(ALLOWED, TYPE, METRIC, LATENCY, BANDWIDTH, JITTER, DELAY, LOSS, AVAILABILITY, FLAPPING,
-                IS_DURABLE, IS_BIDIRECTIONAL, IS_METERED) &&
+                IS_DURABLE, IS_BIDIRECTIONAL, IS_METERED, TIER, METERED_USAGE) &&
                 isBoolean(ALLOWED, OPTIONAL) && isNumber(METRIC, OPTIONAL) &&
                 isNumber(LATENCY, OPTIONAL) && isNumber(BANDWIDTH, OPTIONAL) && isDecimal(JITTER, OPTIONAL) &&
                 isDecimal(DELAY, OPTIONAL) && isDecimal(LOSS, OPTIONAL) && isDecimal(AVAILABILITY, OPTIONAL) &&
                 isDecimal(FLAPPING, OPTIONAL) &&
+                isNumber(TIER, OPTIONAL) &&
+                isDecimal(METERED_USAGE, OPTIONAL) &&
                 isBoolean(IS_BIDIRECTIONAL, OPTIONAL) &&
                 isBoolean(IS_METERED, OPTIONAL);
     }
@@ -322,7 +326,7 @@
     }
 
     /**
-     * Sets durability for this link.
+     * Sets metered flag for this link.
      *
      * @param isMetered true for metered, false otherwise
      * @return this BasicLinkConfig
@@ -332,6 +336,44 @@
     }
 
     /**
+     * Returns link tier.
+     *
+     * @return link tier value; -1 if not set
+     */
+    public long tier() {
+        return get(TIER, -1);
+    }
+
+    /**
+     * Sets the link tier.
+     *
+     * @param tier new link tier value; null to clear
+     * @return self
+     */
+    public BasicLinkConfig tier(Long tier) {
+        return (BasicLinkConfig) setOrClear(TIER, tier);
+    }
+
+    /**
+     * Returns metered link usage in terms of percentage.
+     *
+     * @return metered link usage value; -1 if not set
+     */
+    public double meteredUsage() {
+        return get(METERED_USAGE, -1.0);
+    }
+
+    /**
+     * Sets the metered link usage.
+     *
+     * @param meteredUsage new metered usage value; null to clear
+     * @return self
+     */
+    public BasicLinkConfig meteredUsage(Double meteredUsage) {
+        return (BasicLinkConfig) setOrClear(METERED_USAGE, meteredUsage);
+    }
+
+    /**
      * Create a {@link BasicLinkConfig} instance.
      * <p>
      * Note: created instance needs to be initialized by #init(..) before using.
diff --git a/core/api/src/test/java/org/onosproject/net/config/basics/BasicLinkConfigTest.java b/core/api/src/test/java/org/onosproject/net/config/basics/BasicLinkConfigTest.java
index cb56847..315552b 100644
--- a/core/api/src/test/java/org/onosproject/net/config/basics/BasicLinkConfigTest.java
+++ b/core/api/src/test/java/org/onosproject/net/config/basics/BasicLinkConfigTest.java
@@ -42,6 +42,8 @@
     private static final double LOSS = 3.0;
     private static final double AVAILABILITY = 3.0;
     private static final double FLAPPING = 3.0;
+    private static final long TIER = 4;
+    private static final double METERED_USAGE = 85.0;
     private static final Duration LATENCY =  Duration.ofNanos(5555);
 
     /**
@@ -70,7 +72,9 @@
                 .type(Link.Type.DIRECT)
                 .latency(LATENCY)
                 .isBidirectional(FALSE)
-                .isMetered(TRUE);
+                .isMetered(TRUE)
+                .tier(TIER)
+                .meteredUsage(METERED_USAGE);
 
         assertThat(config.bandwidth(), is(BANDWIDTH));
         assertThat(config.jitter(), is(JITTER));
@@ -85,5 +89,7 @@
         assertThat(config.isBidirectional(), is(FALSE));
         assertThat(config.isValid(), is(true));
         assertThat(config.isMetered(), is(TRUE));
+        assertThat(config.tier(), is(TIER));
+        assertThat(config.meteredUsage(), is(METERED_USAGE));
     }
 }
diff --git a/core/net/src/main/java/org/onosproject/net/link/impl/BasicLinkOperator.java b/core/net/src/main/java/org/onosproject/net/link/impl/BasicLinkOperator.java
index 05943e5..f3b7f27 100644
--- a/core/net/src/main/java/org/onosproject/net/link/impl/BasicLinkOperator.java
+++ b/core/net/src/main/java/org/onosproject/net/link/impl/BasicLinkOperator.java
@@ -44,6 +44,8 @@
     private static final double DEF_AVAILABILITY = -1.0;
     private static final double DEF_FLAPPING = -1.0;
     private static final double DEF_METRIC = -1;
+    private static final long DEF_TIER = -1;
+    private static final double DEF_METERED_USAGE = -1;
     private static final Duration DEF_DURATION = Duration.ofNanos(-1L);
     private static final Logger log = getLogger(BasicLinkOperator.class);
 
@@ -116,6 +118,12 @@
         if (cfg.isMetered() != null) {
             b.set(AnnotationKeys.METERED, String.valueOf(cfg.isMetered()));
         }
+        if (cfg.tier() != DEF_TIER) {
+            b.set(AnnotationKeys.TIER, String.valueOf(cfg.tier()));
+        }
+        if (cfg.meteredUsage() != DEF_METERED_USAGE) {
+            b.set(AnnotationKeys.METERED_USAGE, String.valueOf(cfg.meteredUsage()));
+        }
         return b.build();
     }