Fixing ONOS-39 to allow configured links to be marked as durable.

Change-Id: I97b920bf5f597ddb8b64ecc5c4c3769527ad5260
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/link/impl/GossipLinkStore.java b/core/store/dist/src/main/java/org/onlab/onos/store/link/impl/GossipLinkStore.java
index e82742a..9810d7a 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/link/impl/GossipLinkStore.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/link/impl/GossipLinkStore.java
@@ -65,6 +65,7 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentHashMap;
@@ -448,8 +449,12 @@
                 // outdated remove request, ignore
                 return null;
             }
+            Link link = links.get(key);
+            if (isDurable(link)) {
+                return null;
+            }
             removedLinks.put(key, timestamp);
-            Link link = links.remove(key);
+            links.remove(key);
             linkDescriptions.clear();
             if (link != null) {
                 srcLinks.remove(link.src().deviceId(), key);
@@ -460,6 +465,11 @@
         }
     }
 
+    // Indicates if the link has been marked as durable via annotations.
+    private boolean isDurable(Link link) {
+        return link != null && Objects.equals(link.annotations().value("durable"), "true");
+    }
+
     private static <K, V> SetMultimap<K, V> createSynchronizedHashMultiMap() {
         return synchronizedSetMultimap(HashMultimap.<K, V>create());
     }
diff --git a/core/store/trivial/src/main/java/org/onlab/onos/store/trivial/impl/SimpleLinkStore.java b/core/store/trivial/src/main/java/org/onlab/onos/store/trivial/impl/SimpleLinkStore.java
index 8383754..50f4e06 100644
--- a/core/store/trivial/src/main/java/org/onlab/onos/store/trivial/impl/SimpleLinkStore.java
+++ b/core/store/trivial/src/main/java/org/onlab/onos/store/trivial/impl/SimpleLinkStore.java
@@ -46,6 +46,7 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentHashMap;
@@ -233,7 +234,11 @@
         final LinkKey key = linkKey(src, dst);
         Map<ProviderId, LinkDescription> descs = getOrCreateLinkDescriptions(key);
         synchronized (descs) {
-            Link link = links.remove(key);
+            Link link = links.get(key);
+            if (isDurable(link)) {
+                return null;
+            }
+            links.remove(key);
             descs.clear();
             if (link != null) {
                 srcLinks.remove(link.src().deviceId(), key);
@@ -244,6 +249,11 @@
         }
     }
 
+    // Indicates if the link has been marked as durable via annotations.
+    private boolean isDurable(Link link) {
+        return link != null && Objects.equals(link.annotations().value("durable"), "true");
+    }
+
     private static <K, V> SetMultimap<K, V> createSynchronizedHashMultiMap() {
         return synchronizedSetMultimap(HashMultimap.<K, V>create());
     }