GBP coexistence - OF renderer can remove only its own flows from node
[groupbasedpolicy.git] / renderers / ofoverlay / src / main / java / org / opendaylight / groupbasedpolicy / renderer / ofoverlay / OFOverlayRenderer.java
index 9c41ce9210bf34c4467f13184f4e9740182a1af4..6ca185f4df633333ab03982db91b80c73fdb08a2 100644 (file)
@@ -26,13 +26,18 @@ import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataCh
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
+import org.opendaylight.groupbasedpolicy.api.EpRendererAugmentationRegistry;
+import org.opendaylight.groupbasedpolicy.api.PolicyValidatorRegistry;
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.endpoint.EndpointManager;
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.endpoint.OfOverlayAug;
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.endpoint.OfOverlayL3NatAug;
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.node.SwitchManager;
+import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sf.Action;
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sf.ActionDefinitionListener;
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sf.ClassifierDefinitionListener;
+import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sf.SubjectFeatures;
 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionDefinitionId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayConfig;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayConfigBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.RendererName;
@@ -49,7 +54,6 @@ import com.google.common.util.concurrent.ListenableFuture;
 /**
  * Renderer that uses OpenFlow and OVSDB to implement an overlay network
  * using Open vSwitch.
-
  */
 public class OFOverlayRenderer implements AutoCloseable, DataChangeListener {
     private static final Logger LOG =
@@ -75,41 +79,43 @@ public class OFOverlayRenderer implements AutoCloseable, DataChangeListener {
     public OFOverlayRenderer(final DataBroker dataProvider,
                              RpcProviderRegistry rpcRegistry,
                              NotificationService notificationService,
+                             EpRendererAugmentationRegistry epRendererAugmentationRegistry,
+                             PolicyValidatorRegistry policyValidatorRegistry,
                              final short tableOffset) {
         super();
         this.dataBroker = dataProvider;
-
         int numCPU = Runtime.getRuntime().availableProcessors();
         //TODO: Consider moving to groupbasedpolicy-ofoverlay-config so as to be user configurable in distribution.
         executor = Executors.newScheduledThreadPool(numCPU * 2);
 
         switchManager = new SwitchManager(dataProvider);
         endpointManager = new EndpointManager(dataProvider, rpcRegistry, notificationService,
-                                              executor, switchManager);
+                executor, switchManager);
 
         classifierDefinitionListener = new ClassifierDefinitionListener(dataBroker);
         actionDefinitionListener = new ActionDefinitionListener(dataProvider);
 
-        // TODO we need register action/classifier validators to gpb-base
+        for (Entry<ActionDefinitionId, Action> entry : SubjectFeatures.getActions().entrySet()) {
+            policyValidatorRegistry.register(entry.getKey(), entry.getValue());
+        }
 
         policyManager = new PolicyManager(dataProvider,
-                                          switchManager,
-                                          endpointManager,
-                                          rpcRegistry,
-                                          executor,
-                                          tableOffset);
-        ofOverlayAug = new OfOverlayAug(dataProvider);
-        ofOverlayL3NatAug = new OfOverlayL3NatAug();
-            Optional<OfOverlayConfig> config = readConfig();
-            OfOverlayConfigBuilder configBuilder = new OfOverlayConfigBuilder();
-            if (config.isPresent()) {
-                configBuilder = new OfOverlayConfigBuilder(config.get());
-            }
-            registerConfigListener(dataProvider);
-            if (configBuilder.getGbpOfoverlayTableOffset() == null) {
-                configBuilder.setGbpOfoverlayTableOffset(tableOffset).build();
-                writeTableOffset(configBuilder.build());
-            }
+                switchManager,
+                endpointManager,
+                executor,
+                tableOffset);
+        ofOverlayAug = new OfOverlayAug(dataProvider, epRendererAugmentationRegistry);
+        ofOverlayL3NatAug = new OfOverlayL3NatAug(epRendererAugmentationRegistry);
+        Optional<OfOverlayConfig> config = readConfig();
+        OfOverlayConfigBuilder configBuilder = new OfOverlayConfigBuilder();
+        if (config.isPresent()) {
+            configBuilder = new OfOverlayConfigBuilder(config.get());
+        }
+        registerConfigListener(dataProvider);
+        if (configBuilder.getGbpOfoverlayTableOffset() == null) {
+            configBuilder.setGbpOfoverlayTableOffset(tableOffset).build();
+            writeTableOffset(configBuilder.build());
+        }
     }
 
     // *************
@@ -163,17 +169,17 @@ public class OFOverlayRenderer implements AutoCloseable, DataChangeListener {
     private void registerConfigListener(DataBroker dataProvider) {
         configReg =
                 dataProvider.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
-                                                        configIid,
-                                                        this,
-                                                        DataChangeScope.SUBTREE);
+                        configIid,
+                        this,
+                        DataChangeScope.SUBTREE);
     }
 
     private Optional<OfOverlayConfig> readConfig() {
         final ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();
         Optional<OfOverlayConfig> config =
                 DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,
-                                           configIid,
-                                           rTx);
+                        configIid,
+                        rTx);
         rTx.close();
         return config;
     }