Fix: guarantee to reserve an IP address from IPAM pool for k8s POD

Returns port number as zero in case pod has null spec value.
Also return null group bucket when we have zero port number returned.

Change-Id: Iad6f307e950e263732db5f6349c83a60a194cb23
diff --git a/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/impl/K8sServiceHandler.java b/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/impl/K8sServiceHandler.java
index 2640508..18b9a11 100644
--- a/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/impl/K8sServiceHandler.java
+++ b/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/impl/K8sServiceHandler.java
@@ -398,6 +398,10 @@
                                 }
                             }
 
+                            if (targetPortInt == 0) {
+                                continue;
+                            }
+
                             for (EndpointPort endpointPort : endpointSubset.getPorts()) {
                                 if (targetProtocol.equals(endpointPort.getProtocol()) &&
                                         (targetPortInt.equals(endpointPort.getPort()) ||
@@ -426,12 +430,17 @@
                 List<GroupBucket> bkts = Lists.newArrayList();
 
                 for (String ip : epas) {
+                    GroupBucket bkt = buildBuckets(node.intgBridge(),
+                            nodeIpGatewayIpMap.getOrDefault(ip, ip), sp);
+
+                    if (bkt == null) {
+                        continue;
+                    }
+
                     if (install) {
-                        bkts.add(buildBuckets(node.intgBridge(),
-                                nodeIpGatewayIpMap.getOrDefault(ip, ip), sp));
+                        bkts.add(bkt);
                     } else {
-                        bkts.add(buildBuckets(node.intgBridge(),
-                                nodeIpGatewayIpMap.getOrDefault(ip, ip), sp));
+                        bkts.remove(bkt);
                     }
                 }
 
@@ -462,10 +471,12 @@
                             targetPort = sp.getTargetPort().getIntVal();
                         }
 
-                        setUnshiftDomainRules(node.intgBridge(), POD_TABLE,
-                                PRIORITY_NAT_RULE, serviceIp, sp.getPort(),
-                                sp.getProtocol(), podIp,
-                                targetPort, install);
+                        if (targetPort != 0) {
+                            setUnshiftDomainRules(node.intgBridge(), POD_TABLE,
+                                    PRIORITY_NAT_RULE, serviceIp, sp.getPort(),
+                                    sp.getProtocol(), podIp,
+                                    targetPort, install);
+                        }
                     })
             );
         }
@@ -483,6 +494,10 @@
             targetPort = sp.getTargetPort().getIntVal();
         }
 
+        if (targetPort == 0) {
+            return null;
+        }
+
         if (TCP.equals(sp.getProtocol())) {
             tBuilder.setTcpDst(TpPort.tpPort(targetPort));
         } else if (UDP.equals(sp.getProtocol())) {
@@ -493,6 +508,7 @@
                 deviceService.getDevice(deviceId), ACL_TABLE);
         tBuilder.extension(resubmitTreatment, deviceId);
 
+        // TODO: need to adjust group bucket weight by considering POD locality
         return buildGroupBucket(tBuilder.build(), SELECT, (short) -1);
     }