From f82c1f8a651398a83ffeef398876b599d474ab5a Mon Sep 17 00:00:00 2001 From: Madhu Venugopal Date: Sun, 31 Aug 2014 12:30:54 -0700 Subject: [PATCH] Added Template classes for all the static services. 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 --- .../netvirt/providers/Activator.java | 93 +++++++++++++++++-- .../services/ArpResponderService.java | 28 ++++++ .../services/ClassifierService.java | 28 ++++++ .../openflow13/services/EgressAclService.java | 28 ++++++ .../services/InboundNatService.java | 28 ++++++ .../services/IngressAclService.java | 28 ++++++ .../services/L2ForwardingService.java | 28 ++++++ .../services/LoadBalancerService.java | 28 ++++++ .../services/OutboundNatService.java | 28 ++++++ .../openflow13/services/RoutingService.java | 28 ++++++ 10 files changed, 335 insertions(+), 10 deletions(-) create mode 100644 openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/ArpResponderService.java create mode 100644 openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/ClassifierService.java create mode 100644 openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/EgressAclService.java create mode 100644 openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/InboundNatService.java create mode 100644 openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/IngressAclService.java create mode 100644 openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/L2ForwardingService.java create mode 100644 openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/LoadBalancerService.java create mode 100644 openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/OutboundNatService.java create mode 100644 openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/RoutingService.java diff --git a/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/Activator.java b/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/Activator.java index c4c5d1722..0a09b7591 100644 --- a/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/Activator.java +++ b/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/Activator.java @@ -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 index 000000000..9efa6e6e7 --- /dev/null +++ b/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/ArpResponderService.java @@ -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 index 000000000..16ce635bb --- /dev/null +++ b/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/ClassifierService.java @@ -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 index 000000000..2c0b3c4dd --- /dev/null +++ b/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/EgressAclService.java @@ -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 index 000000000..b617e1fed --- /dev/null +++ b/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/InboundNatService.java @@ -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 index 000000000..b77643a71 --- /dev/null +++ b/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/IngressAclService.java @@ -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 index 000000000..0d2467c1f --- /dev/null +++ b/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/L2ForwardingService.java @@ -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 index 000000000..e1b121cb5 --- /dev/null +++ b/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/LoadBalancerService.java @@ -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 index 000000000..103b127c2 --- /dev/null +++ b/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/OutboundNatService.java @@ -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 index 000000000..9bbe4438d --- /dev/null +++ b/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/RoutingService.java @@ -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 -- 2.36.6