Support security group for provider typed networks (FLAT and VLAN)

Change-Id: I759b89eb16c0ab27ee068694dd455265bac4bf52
(cherry picked from commit 8ed2c9875172daf2a2be95a210e3e151eb4a6525)
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtNode.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtNode.java
index 2b0c8f8..f647503 100644
--- a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtNode.java
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtNode.java
@@ -26,12 +26,15 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.Objects;
+import java.util.Set;
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static org.onosproject.kubevirtnode.api.Constants.DEFAULT_CLUSTER_NAME;
 import static org.onosproject.kubevirtnode.api.Constants.GENEVE;
 import static org.onosproject.kubevirtnode.api.Constants.GRE;
+import static org.onosproject.kubevirtnode.api.Constants.INTEGRATION_TO_PHYSICAL_PREFIX;
 import static org.onosproject.kubevirtnode.api.Constants.VXLAN;
 import static org.onosproject.net.AnnotationKeys.PORT_NAME;
 
@@ -42,6 +45,7 @@
 
     private static final String NOT_NULL_MSG = "Node % cannot be null";
     private static final String OVSDB = "ovsdb:";
+    private static final int PORT_NAME_MAX_LENGTH = 15;
 
     private final String clusterName;
     private final String hostname;
@@ -189,6 +193,20 @@
     }
 
     @Override
+    public Set<PortNumber> physPatchPorts() {
+        Set<PortNumber> portNumbers = new HashSet<>();
+        for (KubevirtPhyInterface phyIntf : this.phyIntfs()) {
+            String portName = structurePortName(
+                    INTEGRATION_TO_PHYSICAL_PREFIX + phyIntf.network());
+            PortNumber portNumber = patchPort(portName);
+            if (portNumber != null) {
+                portNumbers.add(portNumber);
+            }
+        }
+        return portNumbers;
+    }
+
+    @Override
     public PortNumber vxlanPort() {
         return tunnelPort(VXLAN);
     }
@@ -220,6 +238,32 @@
         return port != null ? port.number() : null;
     }
 
+    private PortNumber patchPort(String portName) {
+        DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
+        Port port = deviceService.getPorts(intgBridge).stream()
+                .filter(p -> p.isEnabled() &&
+                        Objects.equals(p.annotations().value(PORT_NAME), portName))
+                .findAny().orElse(null);
+        return port != null ? port.number() : null;
+    }
+
+    /**
+     * Re-structures the OVS port name.
+     * The length of OVS port name should be not large than 15.
+     *
+     * @param portName  original port name
+     * @return re-structured OVS port name
+     */
+    private String structurePortName(String portName) {
+
+        // The size of OVS port name should not be larger than 15
+        if (portName.length() > PORT_NAME_MAX_LENGTH) {
+            return StringUtils.substring(portName, 0, PORT_NAME_MAX_LENGTH);
+        }
+
+        return portName;
+    }
+
     /**
      * Returns new builder instance.
      *