Support to provision and unprovision physical bridge along with ports

Change-Id: I16868a264ea95099b2184e652859a9adbec9eacd
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackFlowRuleManager.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackFlowRuleManager.java
index 5608bce..e1f579e 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackFlowRuleManager.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackFlowRuleManager.java
@@ -24,6 +24,7 @@
 import org.onosproject.core.CoreService;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Port;
+import org.onosproject.net.PortNumber;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.flow.DefaultFlowRule;
 import org.onosproject.net.flow.DefaultTrafficSelector;
@@ -59,6 +60,8 @@
 import static org.onosproject.openstacknetworking.api.Constants.OPENSTACK_NETWORKING_APP_ID;
 import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_FLAT_JUMP_UPSTREAM_RULE;
 import static org.onosproject.openstacknetworking.api.Constants.STAT_FLAT_OUTBOUND_TABLE;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.structurePortName;
+import static org.onosproject.openstacknode.api.Constants.INTEGRATION_TO_PHYSICAL_PREFIX;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.COMPUTE;
 import static org.slf4j.LoggerFactory.getLogger;
 
@@ -255,50 +258,44 @@
         osNodeService.node(deviceId)
                      .phyIntfs()
                      .forEach(phyInterface ->
-                             setFlatJumpRulesForPhyIntf(deviceId, phyInterface));
+                             setFlatJumpRulesForPatchPort(deviceId, phyInterface));
     }
 
-    private void setFlatJumpRulesForPhyIntf(DeviceId deviceId,
-                                            OpenstackPhyInterface phyInterface) {
-        Optional<Port> phyPort = deviceService.getPorts(deviceId).stream()
-                .filter(port ->
-                        Objects.equals(port.annotations().value(PORT_NAME), phyInterface.intf()))
+    private void setFlatJumpRuleForPatchPort(DeviceId deviceId,
+                                           PortNumber portNumber, short ethType) {
+        TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
+        selector.matchInPort(portNumber)
+                .matchEthType(ethType);
+
+        TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
+        treatment.transition(STAT_FLAT_OUTBOUND_TABLE);
+        FlowRule flowRuleForIp = DefaultFlowRule.builder()
+                .forDevice(deviceId)
+                .withSelector(selector.build())
+                .withTreatment(treatment.build())
+                .withPriority(PRIORITY_FLAT_JUMP_UPSTREAM_RULE)
+                .fromApp(appId)
+                .makePermanent()
+                .forTable(DHCP_TABLE)
+                .build();
+
+        applyRule(flowRuleForIp, true);
+    }
+
+    private void setFlatJumpRulesForPatchPort(DeviceId deviceId,
+                                              OpenstackPhyInterface phyIntf) {
+        Optional<Port> patchPort = deviceService.getPorts(deviceId).stream()
+                .filter(port -> {
+                    String annotPortName = port.annotations().value(PORT_NAME);
+                    String portName = structurePortName(
+                            INTEGRATION_TO_PHYSICAL_PREFIX + phyIntf.network());
+                    return Objects.equals(annotPortName, portName);
+                })
                 .findAny();
 
-        phyPort.ifPresent(port -> {
-            TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
-            selector.matchInPort(port.number())
-                    .matchEthType(Ethernet.TYPE_IPV4);
-
-            TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
-            treatment.transition(STAT_FLAT_OUTBOUND_TABLE);
-            FlowRule flowRuleForIp = DefaultFlowRule.builder()
-                    .forDevice(deviceId)
-                    .withSelector(selector.build())
-                    .withTreatment(treatment.build())
-                    .withPriority(PRIORITY_FLAT_JUMP_UPSTREAM_RULE)
-                    .fromApp(appId)
-                    .makePermanent()
-                    .forTable(DHCP_TABLE)
-                    .build();
-
-            applyRule(flowRuleForIp, true);
-
-            selector = DefaultTrafficSelector.builder();
-            selector.matchInPort(port.number())
-                    .matchEthType(Ethernet.TYPE_ARP);
-
-            FlowRule flowRuleForArp = DefaultFlowRule.builder()
-                    .forDevice(deviceId)
-                    .withSelector(selector.build())
-                    .withTreatment(treatment.build())
-                    .withPriority(PRIORITY_FLAT_JUMP_UPSTREAM_RULE)
-                    .fromApp(appId)
-                    .makePermanent()
-                    .forTable(DHCP_TABLE)
-                    .build();
-
-            applyRule(flowRuleForArp, true);
+        patchPort.ifPresent(port -> {
+            setFlatJumpRuleForPatchPort(deviceId, port.number(), Ethernet.TYPE_IPV4);
+            setFlatJumpRuleForPatchPort(deviceId, port.number(), Ethernet.TYPE_ARP);
         });
     }