Ensures internal link state is up to date on a restarted ONOS instance. Also fixes an NPE in FpmManager.

Change-Id: Idb0df0ef961c6bb2f3b2c3dc72957af8a4987e1b
diff --git a/src/main/java/org/onosproject/segmentrouting/LinkHandler.java b/src/main/java/org/onosproject/segmentrouting/LinkHandler.java
index 2961e50..c643991 100644
--- a/src/main/java/org/onosproject/segmentrouting/LinkHandler.java
+++ b/src/main/java/org/onosproject/segmentrouting/LinkHandler.java
@@ -71,6 +71,7 @@
                 .withTimestampProvider((k, v) -> new WallClockTimestamp())
                 .build();
         log.trace("Current size {}", downedPortStore.size());
+        init();
     }
 
     /**
@@ -85,6 +86,15 @@
     }
 
     /**
+     * Initialize LinkHandler.
+     */
+    private void init() {
+        log.info("Loading stored links");
+        srManager.linkService.getActiveLinks()
+                .forEach(link -> processLinkAdded(link));
+    }
+
+    /**
      * Preprocessing of added link before being sent for route-path handling.
      * Also performs post processing of link.
      *
@@ -95,8 +105,8 @@
         if (!isLinkValid(link)) {
             return;
         }
-        if (!srManager.deviceConfiguration
-                .isConfigured(link.src().deviceId())) {
+        if (srManager.deviceConfiguration == null ||
+                !srManager.deviceConfiguration.isConfigured(link.src().deviceId())) {
             updateSeenLink(link, true);
             // XXX revisit - what about devicePortMap
             log.warn("Source device of this link is not configured.. "
@@ -262,6 +272,10 @@
             return false;
         }
         DeviceConfiguration devConfig = srManager.deviceConfiguration;
+        if (devConfig == null) {
+            log.warn("Cannot check validity of link without device config");
+            return true;
+        }
         try {
             if (!devConfig.isEdgeDevice(srcId)
                     && !devConfig.isEdgeDevice(dstId)) {