Fixing a couple of NPEs

Change-Id: I19b5a2787b26e67e05640f6c64a13b58f2dc089a
diff --git a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/ArpHandler.java b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/ArpHandler.java
index 388e313..5e4f7d2 100644
--- a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/ArpHandler.java
+++ b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/ArpHandler.java
@@ -24,7 +24,6 @@
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Host;
-import org.onosproject.net.PortNumber;
 import org.onosproject.net.flow.DefaultTrafficTreatment;
 import org.onosproject.net.flow.TrafficTreatment;
 import org.onosproject.net.packet.DefaultOutboundPacket;
@@ -88,10 +87,7 @@
         ARP arp = (ARP) ethernet.getPayload();
 
         ConnectPoint connectPoint = pkt.receivedFrom();
-        PortNumber inPort = connectPoint.port();
         DeviceId deviceId = connectPoint.deviceId();
-        byte[] senderMacAddressByte = arp.getSenderHardwareAddress();
-        Ip4Address hostIpAddress = Ip4Address.valueOf(arp.getSenderProtocolAddress());
         if (arp.getOpCode() == ARP.OP_REQUEST) {
             handleArpRequest(deviceId, connectPoint, ethernet);
         } else {
@@ -254,15 +250,23 @@
                 ((ARP) packet.getPayload()).getTargetProtocolAddress()
         );
 
-        srManager.deviceConfiguration.getSubnetPortsMap(inPort.deviceId()).forEach((subnet, ports) -> {
-            if (subnet.contains(targetProtocolAddress)) {
-                ports.stream()
-                        .filter(port -> port != inPort.port())
-                        .forEach(port -> {
-                            removeVlanAndForward(packet, new ConnectPoint(inPort.deviceId(), port));
-                        });
-            }
-        });
+        try {
+            srManager.deviceConfiguration
+                 .getSubnetPortsMap(inPort.deviceId()).forEach((subnet, ports) -> {
+                     if (subnet.contains(targetProtocolAddress)) {
+                         ports.stream()
+                         .filter(port -> port != inPort.port())
+                         .forEach(port -> {
+                             removeVlanAndForward(packet,
+                                 new ConnectPoint(inPort.deviceId(), port));
+                         });
+                     }
+                 });
+        } catch (DeviceConfigNotFoundException e) {
+            log.warn(e.getMessage()
+                    + " Cannot flood in subnet as device config not available"
+                    + " for device: " + inPort.deviceId());
+        }
     }
 
     /**
diff --git a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/DefaultRoutingHandler.java b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/DefaultRoutingHandler.java
index df340a9..5b99105 100644
--- a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/DefaultRoutingHandler.java
+++ b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/DefaultRoutingHandler.java
@@ -564,6 +564,8 @@
 
     public void purgeEcmpGraph(DeviceId deviceId) {
         currentEcmpSpgMap.remove(deviceId);
-        updatedEcmpSpgMap.remove(deviceId);
+        if (updatedEcmpSpgMap != null) {
+            updatedEcmpSpgMap.remove(deviceId);
+        }
     }
 }
diff --git a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/config/DeviceConfiguration.java b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/config/DeviceConfiguration.java
index 5d48b6d..11c3d38 100644
--- a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/config/DeviceConfiguration.java
+++ b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/config/DeviceConfiguration.java
@@ -264,12 +264,16 @@
     }
 
     @Override
-    public Map<Ip4Prefix, List<PortNumber>> getSubnetPortsMap(DeviceId deviceId) {
-        Map<Ip4Prefix, List<PortNumber>> subnetPortMap = new HashMap<>();
-
+    public Map<Ip4Prefix, List<PortNumber>> getSubnetPortsMap(DeviceId deviceId)
+            throws DeviceConfigNotFoundException {
+        SegmentRouterInfo srinfo = deviceConfigMap.get(deviceId);
+        if (srinfo == null) {
+            String message = "getSubnetPortsMap fails for device: " + deviceId + ".";
+            throw new DeviceConfigNotFoundException(message);
+        }
         // Construct subnet-port mapping from port-subnet mapping
-        SetMultimap<PortNumber, Ip4Prefix> portSubnetMap =
-                this.deviceConfigMap.get(deviceId).subnets;
+        SetMultimap<PortNumber, Ip4Prefix> portSubnetMap = srinfo.subnets;
+        Map<Ip4Prefix, List<PortNumber>> subnetPortMap = new HashMap<>();
 
         portSubnetMap.entries().forEach(entry -> {
             PortNumber port = entry.getKey();
diff --git a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/config/DeviceProperties.java b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/config/DeviceProperties.java
index 9d4d884..632eeec 100644
--- a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/config/DeviceProperties.java
+++ b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/config/DeviceProperties.java
@@ -93,8 +93,10 @@
      *
      * @param deviceId device identifier
      * @return a map that contains all subnet-to-ports mapping of given device
+     * @throws DeviceConfigNotFoundException
      */
-    Map<Ip4Prefix, List<PortNumber>> getSubnetPortsMap(DeviceId deviceId);
+    Map<Ip4Prefix, List<PortNumber>> getSubnetPortsMap(DeviceId deviceId)
+            throws DeviceConfigNotFoundException;
 
     /**
      * Returns the VLAN cross-connect configuration.
diff --git a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/grouphandler/DefaultGroupHandler.java b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/grouphandler/DefaultGroupHandler.java
index 0243693..ca3a6c6 100644
--- a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/grouphandler/DefaultGroupHandler.java
+++ b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/grouphandler/DefaultGroupHandler.java
@@ -677,8 +677,14 @@
      * Creates broadcast groups for all ports in the same configured subnet.
      */
     public void createGroupsFromSubnetConfig() {
-        Map<Ip4Prefix, List<PortNumber>> subnetPortMap =
-                this.deviceConfig.getSubnetPortsMap(this.deviceId);
+        Map<Ip4Prefix, List<PortNumber>> subnetPortMap;
+        try {
+            subnetPortMap = this.deviceConfig.getSubnetPortsMap(this.deviceId);
+        } catch (DeviceConfigNotFoundException e) {
+            log.warn(e.getMessage()
+                     + " Not creating broadcast groups for device: " + deviceId);
+            return;
+        }
         // Construct a broadcast group for each subnet
         subnetPortMap.forEach((subnet, ports) -> {
             SubnetNextObjectiveStoreKey key =