Added Template classes for all the static services. 54/10554/2
authorMadhu Venugopal <mavenugo@gmail.com>
Sun, 31 Aug 2014 19:30:54 +0000 (12:30 -0700)
committerMadhu Venugopal <mavenugo@gmail.com>
Sun, 31 Aug 2014 19:35:09 +0000 (12:35 -0700)
Though these are just Template classes, Since it inherits from AbstractServiceInstance parent, the default catch-all flow-rules
(that is required for an operational pipeline) are automatically installed. All the service specific code can be written in these
classes with the guarantee that the parent AbstractServiceInstance took care of the flows to keep the pipeline happy.

Also, please note that, all of these services must use the getMutablePipelineInstructionBuilder() method for all the non-drop
matched flows to make sure the pipeline is not messed up for the cases where a service performs some operations.

Sample output of the pipeline when none of the services are operational :

[mininet@opendaylight ~]\>sudo ovs-ofctl dump-flows -O OpenFlow13 br-int
OFPST_FLOW reply (OF1.3) (xid=0x2):
 cookie=0x0, duration=136.403s, table=0, n_packets=0, n_bytes=0, send_flow_rem dl_type=0x88cc actions=CONTROLLER:65535
 cookie=0x0, duration=136.418s, table=0, n_packets=3, n_bytes=230, send_flow_rem priority=0 actions=goto_table:20
 cookie=0x0, duration=136.436s, table=20, n_packets=3, n_bytes=230, send_flow_rem priority=0 actions=goto_table:30
 cookie=0x0, duration=136.427s, table=30, n_packets=3, n_bytes=230, send_flow_rem priority=0 actions=goto_table:40
 cookie=0x0, duration=136.429s, table=40, n_packets=3, n_bytes=230, send_flow_rem priority=0 actions=goto_table:50
 cookie=0x0, duration=136.421s, table=50, n_packets=3, n_bytes=230, send_flow_rem priority=0 actions=goto_table:60
 cookie=0x0, duration=136.424s, table=60, n_packets=3, n_bytes=230, send_flow_rem priority=0 actions=goto_table:70
 cookie=0x0, duration=138.24s, table=70, n_packets=3, n_bytes=230, send_flow_rem priority=0 actions=goto_table:80
 cookie=0x0, duration=136.4s, table=80, n_packets=3, n_bytes=230, send_flow_rem priority=0 actions=goto_table:90
 cookie=0x0, duration=136.433s, table=90, n_packets=3, n_bytes=230, send_flow_rem priority=0 actions=goto_table:100
 cookie=0x0, duration=136.441s, table=100, n_packets=3, n_bytes=230, send_flow_rem priority=0 actions=drop

Please note that, since we have moved to a static pipeline approach, there is no need for metadata, nor there is a
need to have a dedicated Director table. The AbstractServiceInstance takes care of cooking the pipeline based on the
static pipeline requirements.

Change-Id: Icf712991df3c7fbedf81872c04fdad168619b910
Signed-off-by: Madhu Venugopal <mavenugo@gmail.com>
openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/Activator.java
openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/ArpResponderService.java [new file with mode: 0644]
openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/ClassifierService.java [new file with mode: 0644]
openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/EgressAclService.java [new file with mode: 0644]
openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/InboundNatService.java [new file with mode: 0644]
openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/IngressAclService.java [new file with mode: 0644]
openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/L2ForwardingService.java [new file with mode: 0644]
openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/LoadBalancerService.java [new file with mode: 0644]
openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/OutboundNatService.java [new file with mode: 0644]
openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/RoutingService.java [new file with mode: 0644]

index c4c5d172292555702fff4a1fa9ff44e882da6886..0a09b75918d2fc2993402a6ac6ab655497d8d257 100644 (file)
@@ -29,7 +29,16 @@ import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.OF13Provide
 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.PipelineOrchestrator;
 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.PipelineOrchestratorImpl;
 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.Service;
+import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services.ArpResponderService;
+import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services.ClassifierService;
+import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services.EgressAclService;
+import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services.InboundNatService;
+import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services.IngressAclService;
+import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services.L2ForwardingService;
 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services.L2RewriteService;
+import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services.LoadBalancerService;
+import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services.OutboundNatService;
+import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services.RoutingService;
 import org.opendaylight.ovsdb.plugin.api.OvsdbConfigurationService;
 import org.opendaylight.ovsdb.plugin.api.OvsdbConnectionService;
 
@@ -69,7 +78,16 @@ public class Activator extends ComponentActivatorAbstractBase {
                         OF10Provider.class,
                         OF13Provider.class,
                         PipelineOrchestratorImpl.class,
-                        L2RewriteService.class};
+                        ClassifierService.class,
+                        ArpResponderService.class,
+                        InboundNatService.class,
+                        IngressAclService.class,
+                        LoadBalancerService.class,
+                        RoutingService.class,
+                        L2RewriteService.class,
+                        L2ForwardingService.class,
+                        EgressAclService.class,
+                        OutboundNatService.class};
         return res;
     }
 
@@ -140,23 +158,78 @@ public class Activator extends ComponentActivatorAbstractBase {
             c.add(createServiceDependency().setService(MdsalConsumer.class).setRequired(true));
         }
 
+        if (imp.equals(PipelineOrchestratorImpl.class)) {
+            c.setInterface(PipelineOrchestrator.class.getName(), null);
+            c.add(createServiceDependency()
+                           .setService(AbstractServiceInstance.class)
+                           .setCallbacks("registerService", "unregisterService"));
+        }
+
+        if (AbstractServiceInstance.class.isAssignableFrom((Class)imp)) {
+            c.add(createServiceDependency()
+                    .setService(PipelineOrchestrator.class)
+                    .setRequired(true));
+            c.add(createServiceDependency().setService(MdsalConsumer.class).setRequired(true));
+        }
+
+        if (imp.equals(ClassifierService.class)) {
+            Properties properties = new Properties();
+            properties.put(AbstractServiceInstance.SERVICE_PROPERTY, Service.CLASSIFIER);
+            c.setInterface(AbstractServiceInstance.class.getName(), properties);
+        }
+
+        if (imp.equals(ArpResponderService.class)) {
+            Properties properties = new Properties();
+            properties.put(AbstractServiceInstance.SERVICE_PROPERTY, Service.ARP_RESPONDER);
+            c.setInterface(AbstractServiceInstance.class.getName(), properties);
+        }
+
+        if (imp.equals(InboundNatService.class)) {
+            Properties properties = new Properties();
+            properties.put(AbstractServiceInstance.SERVICE_PROPERTY, Service.INBOUND_NAT);
+            c.setInterface(AbstractServiceInstance.class.getName(), properties);
+        }
+
+        if (imp.equals(IngressAclService.class)) {
+            Properties properties = new Properties();
+            properties.put(AbstractServiceInstance.SERVICE_PROPERTY, Service.INGRESS_ACL);
+            c.setInterface(AbstractServiceInstance.class.getName(), properties);
+        }
+
+        if (imp.equals(LoadBalancerService.class)) {
+            Properties properties = new Properties();
+            properties.put(AbstractServiceInstance.SERVICE_PROPERTY, Service.LOAD_BALANCER);
+            c.setInterface(AbstractServiceInstance.class.getName(), properties);
+        }
+
+        if (imp.equals(RoutingService.class)) {
+            Properties properties = new Properties();
+            properties.put(AbstractServiceInstance.SERVICE_PROPERTY, Service.ROUTING);
+            c.setInterface(AbstractServiceInstance.class.getName(), properties);
+        }
+
         if (imp.equals(L2RewriteService.class)) {
             Properties properties = new Properties();
             properties.put(AbstractServiceInstance.SERVICE_PROPERTY, Service.L2_REWRITE);
             c.setInterface(AbstractServiceInstance.class.getName(), properties);
+        }
 
-            c.add(createServiceDependency()
-                          .setService(PipelineOrchestrator.class)
-                          .setRequired(true));
-            c.add(createServiceDependency().setService(MdsalConsumer.class).setRequired(true));
+        if (imp.equals(L2ForwardingService.class)) {
+            Properties properties = new Properties();
+            properties.put(AbstractServiceInstance.SERVICE_PROPERTY, Service.L2_FORWARDING);
+            c.setInterface(AbstractServiceInstance.class.getName(), properties);
         }
 
-        if (imp.equals(PipelineOrchestratorImpl.class)) {
-            c.setInterface(PipelineOrchestrator.class.getName(), null);
-            c.add(createServiceDependency()
-                           .setService(AbstractServiceInstance.class)
-                           .setCallbacks("registerService", "unregisterService"));
+        if (imp.equals(IngressAclService.class)) {
+            Properties properties = new Properties();
+            properties.put(AbstractServiceInstance.SERVICE_PROPERTY, Service.INGRESS_ACL);
+            c.setInterface(AbstractServiceInstance.class.getName(), properties);
         }
 
+        if (imp.equals(OutboundNatService.class)) {
+            Properties properties = new Properties();
+            properties.put(AbstractServiceInstance.SERVICE_PROPERTY, Service.OUTBOUND_NAT);
+            c.setInterface(AbstractServiceInstance.class.getName(), properties);
+        }
     }
 }
diff --git a/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/ArpResponderService.java b/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/ArpResponderService.java
new file mode 100644 (file)
index 0000000..9efa6e6
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2014 Red Hat, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Authors : Madhu Venugopal
+ */
+package org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services;
+
+import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.AbstractServiceInstance;
+import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.Service;
+
+public class ArpResponderService extends AbstractServiceInstance {
+    public ArpResponderService() {
+        super(Service.ARP_RESPONDER);
+    }
+
+    public ArpResponderService(Service service) {
+        super(service);
+    }
+
+    @Override
+    public boolean isBridgeInPipeline (String nodeId) {
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/ClassifierService.java b/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/ClassifierService.java
new file mode 100644 (file)
index 0000000..16ce635
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2014 Red Hat, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Authors : Madhu Venugopal
+ */
+package org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services;
+
+import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.AbstractServiceInstance;
+import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.Service;
+
+public class ClassifierService extends AbstractServiceInstance {
+    public ClassifierService() {
+        super(Service.CLASSIFIER);
+    }
+
+    public ClassifierService(Service service) {
+        super(service);
+    }
+
+    @Override
+    public boolean isBridgeInPipeline (String nodeId) {
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/EgressAclService.java b/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/EgressAclService.java
new file mode 100644 (file)
index 0000000..2c0b3c4
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2014 Red Hat, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Authors : Madhu Venugopal
+ */
+package org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services;
+
+import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.AbstractServiceInstance;
+import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.Service;
+
+public class EgressAclService extends AbstractServiceInstance {
+    public EgressAclService() {
+        super(Service.EGRESS_ACL);
+    }
+
+    public EgressAclService(Service service) {
+        super(service);
+    }
+
+    @Override
+    public boolean isBridgeInPipeline (String nodeId) {
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/InboundNatService.java b/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/InboundNatService.java
new file mode 100644 (file)
index 0000000..b617e1f
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2014 Red Hat, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Authors : Madhu Venugopal
+ */
+package org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services;
+
+import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.AbstractServiceInstance;
+import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.Service;
+
+public class InboundNatService extends AbstractServiceInstance {
+    public InboundNatService() {
+        super(Service.INBOUND_NAT);
+    }
+
+    public InboundNatService(Service service) {
+        super(service);
+    }
+
+    @Override
+    public boolean isBridgeInPipeline (String nodeId) {
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/IngressAclService.java b/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/IngressAclService.java
new file mode 100644 (file)
index 0000000..b77643a
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2014 Red Hat, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Authors : Madhu Venugopal
+ */
+package org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services;
+
+import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.AbstractServiceInstance;
+import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.Service;
+
+public class IngressAclService extends AbstractServiceInstance {
+    public IngressAclService() {
+        super(Service.INGRESS_ACL);
+    }
+
+    public IngressAclService(Service service) {
+        super(service);
+    }
+
+    @Override
+    public boolean isBridgeInPipeline (String nodeId) {
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/L2ForwardingService.java b/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/L2ForwardingService.java
new file mode 100644 (file)
index 0000000..0d2467c
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2014 Red Hat, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Authors : Madhu Venugopal
+ */
+package org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services;
+
+import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.AbstractServiceInstance;
+import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.Service;
+
+public class L2ForwardingService extends AbstractServiceInstance {
+    public L2ForwardingService() {
+        super(Service.L2_FORWARDING);
+    }
+
+    public L2ForwardingService(Service service) {
+        super(service);
+    }
+
+    @Override
+    public boolean isBridgeInPipeline (String nodeId) {
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/LoadBalancerService.java b/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/LoadBalancerService.java
new file mode 100644 (file)
index 0000000..e1b121c
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2014 Red Hat, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Authors : Madhu Venugopal
+ */
+package org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services;
+
+import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.AbstractServiceInstance;
+import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.Service;
+
+public class LoadBalancerService extends AbstractServiceInstance {
+    public LoadBalancerService() {
+        super(Service.LOAD_BALANCER);
+    }
+
+    public LoadBalancerService(Service service) {
+        super(service);
+    }
+
+    @Override
+    public boolean isBridgeInPipeline (String nodeId) {
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/OutboundNatService.java b/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/OutboundNatService.java
new file mode 100644 (file)
index 0000000..103b127
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2014 Red Hat, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Authors : Madhu Venugopal
+ */
+package org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services;
+
+import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.AbstractServiceInstance;
+import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.Service;
+
+public class OutboundNatService extends AbstractServiceInstance {
+    public OutboundNatService() {
+        super(Service.OUTBOUND_NAT);
+    }
+
+    public OutboundNatService(Service service) {
+        super(service);
+    }
+
+    @Override
+    public boolean isBridgeInPipeline (String nodeId) {
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/RoutingService.java b/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/RoutingService.java
new file mode 100644 (file)
index 0000000..9bbe443
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2014 Red Hat, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Authors : Madhu Venugopal
+ */
+package org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.services;
+
+import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.AbstractServiceInstance;
+import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.Service;
+
+public class RoutingService extends AbstractServiceInstance {
+    public RoutingService() {
+        super(Service.ROUTING);
+    }
+
+    public RoutingService(Service service) {
+        super(service);
+    }
+
+    @Override
+    public boolean isBridgeInPipeline (String nodeId) {
+        return true;
+    }
+}
\ No newline at end of file