[ONOS-3946] Implement IcmpHandler for OpenstackRoutingService
- Process Icmp packet sent from Host to external network for OpenstackGateway Node
- Process Arp packet sent from physical  router to gateway

Change-Id: Ifcde71a9ca10180682811c9e1bcf58f991b36443
diff --git a/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackSwitchingManager.java b/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackSwitchingManager.java
index 2c88b3a..7cc974f 100644
--- a/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackSwitchingManager.java
+++ b/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackSwitchingManager.java
@@ -94,6 +94,7 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected DriverService driverService;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected OpenstackInterfaceService openstackService;
 
     public static final String PORTNAME_PREFIX_VM = "tap";
@@ -126,6 +127,7 @@
         packetService.addProcessor(internalPacketProcessor, PacketProcessor.director(1));
         deviceService.addListener(internalDeviceListener);
         hostService.addListener(internalHostListener);
+        arpHandler = new OpenstackArpHandler(openstackService, packetService, hostService);
 
         arpHandler = new OpenstackArpHandler(openstackService, packetService, hostService);
         sgRulePopulator = new OpenstackSecurityGroupRulePopulator(appId, openstackService, flowObjectiveService);
@@ -204,10 +206,12 @@
 
     @Override
     public void createNetwork(OpenstackNetwork openstackNetwork) {
+        //TODO
     }
 
     @Override
     public void createSubnet(OpenstackSubnet openstackSubnet) {
+        //TODO
     }
 
     @Override
@@ -296,9 +300,17 @@
 
     private void updatePortMap(DeviceId deviceId, String portName, Collection<OpenstackNetwork> networks,
                                Collection<OpenstackSubnet> subnets, OpenstackPort openstackPort) {
-        long vni = Long.parseLong(networks.stream()
+        long vni;
+        OpenstackNetwork openstackNetwork = networks.stream()
                 .filter(n -> n.id().equals(openstackPort.networkId()))
-                .findAny().orElse(null).segmentId());
+                .findAny().orElse(null);
+        if (openstackNetwork != null) {
+            vni = Long.parseLong(openstackNetwork.segmentId());
+        } else {
+            log.debug("updatePortMap failed because there's no OpenstackNetwork matches {}", openstackPort.networkId());
+            return;
+        }
+
 
         OpenstackSubnet openstackSubnet = subnets.stream()
                 .filter(n -> n.networkId().equals(openstackPort.networkId()))
@@ -312,6 +324,7 @@
                 .setHostMac(openstackPort.macAddress())
                 .setVni(vni)
                 .setGatewayIP(gatewayIPAddress)
+                .setNetworkId(openstackPort.networkId())
                 .setSecurityGroups(openstackPort.securityGroups());
 
         openstackPortInfoMap.put(portName, portBuilder.build());
@@ -321,7 +334,6 @@
                 securityGroupMap.put(sgId, openstackService.getSecurityGroup(sgId));
             }
         });
-
     }
 
     private void processHostRemoved(Host host) {
@@ -440,6 +452,7 @@
                         processPortRemoved((Device) deviceEvent.subject(), deviceEvent.port());
                         break;
                     default:
+                        log.debug("Unsupported deviceEvent type {}", deviceEvent.type().toString());
                         break;
                 }
             } else if (event instanceof HostEvent) {
@@ -450,6 +463,7 @@
                         processHostRemoved((Host) hostEvent.subject());
                         break;
                     default:
+                        log.debug("Unsupported hostEvent type {}", hostEvent.type().toString());
                         break;
                 }
             }