X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openstack%2Fnet-virt-providers%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetvirt%2Fopenstack%2Fnetvirt%2Fproviders%2Fopenflow13%2FAbstractServiceInstance.java;fp=openstack%2Fnet-virt-providers%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetvirt%2Fopenstack%2Fnetvirt%2Fproviders%2Fopenflow13%2FAbstractServiceInstance.java;h=0000000000000000000000000000000000000000;hb=2cc383c822570b8582f4fc486a10dfc3584ebe43;hp=4f3a245d1207462238a0e0c20dc21d8e9e50ece0;hpb=ddef7ee58970dfef4ef00c1933b748e412e87bb3;p=netvirt.git diff --git a/openstack/net-virt-providers/src/main/java/org/opendaylight/netvirt/openstack/netvirt/providers/openflow13/AbstractServiceInstance.java b/openstack/net-virt-providers/src/main/java/org/opendaylight/netvirt/openstack/netvirt/providers/openflow13/AbstractServiceInstance.java deleted file mode 100644 index 4f3a245d12..0000000000 --- a/openstack/net-virt-providers/src/main/java/org/opendaylight/netvirt/openstack/netvirt/providers/openflow13/AbstractServiceInstance.java +++ /dev/null @@ -1,283 +0,0 @@ -/* - * Copyright (c) 2014, 2015 Red Hat, Inc. and others. All rights reserved. - * - * 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 - */ - -package org.opendaylight.netvirt.openstack.netvirt.providers.openflow13; - -import com.google.common.base.Optional; -import com.google.common.util.concurrent.CheckedFuture; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutionException; -import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; -import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; -import org.opendaylight.netvirt.openstack.netvirt.api.Constants; -import org.opendaylight.netvirt.openstack.netvirt.api.Southbound; -import org.opendaylight.netvirt.openstack.netvirt.providers.NetvirtProvidersProvider; -import org.opendaylight.netvirt.utils.mdsal.openflow.InstructionUtils; -import org.opendaylight.netvirt.utils.servicehelper.ServiceHelper; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey; -import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.osgi.framework.ServiceReference; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Any ServiceInstance class that extends AbstractServiceInstance to be a part of the pipeline - * have 2 basic requirements :
- * 1. Program a default pipeline flow to take any unmatched traffic to the next table in the pipeline.
- * 2. Get Pipeline Instructions from AbstractServiceInstance (using getMutablePipelineInstructionBuilder) and - * use it in any matching flows that needs to be further processed by next service in the pipeline. - * - */ -public abstract class AbstractServiceInstance { - public static final String SERVICE_PROPERTY ="serviceProperty"; - private static final Logger LOG = LoggerFactory.getLogger(AbstractServiceInstance.class); - public static final String OPENFLOW = "openflow:"; - protected DataBroker dataBroker = null; - // OSGi Services that we are dependent on. - private volatile PipelineOrchestrator orchestrator; - private volatile Southbound southbound; - - // Concrete Service that this AbstractServiceInstance represents - private Service service; - - public AbstractServiceInstance (Service service) { - this.service = service; - this.dataBroker = NetvirtProvidersProvider.getDataBroker(); - } - - protected void setDependencies(final ServiceReference ref, AbstractServiceInstance serviceInstance) { - this.orchestrator = - (PipelineOrchestrator) ServiceHelper.getGlobalInstance(PipelineOrchestrator.class, serviceInstance); - orchestrator.registerService(ref, serviceInstance); - this.southbound = - (Southbound) ServiceHelper.getGlobalInstance(Southbound.class, serviceInstance); - } - - public boolean isBridgeInPipeline (Node node){ - String bridgeName = southbound.getBridgeName(node); - return bridgeName != null && Constants.INTEGRATION_BRIDGE.equals(bridgeName); - } - - /** - * Return the offset adjusted table for this {@link Service} - * @return The table id - */ - public short getTable() { - return (short)(orchestrator.getTableOffset() + service.getTable()); - } - - /** - * Return the offset adjusted table for the given {@link Service} - * @param service Identifies the openflow {@link Service} - * @return The table id - */ - public short getTable(Service service) { - return (short)(orchestrator.getTableOffset() + service.getTable()); - } - - public Service getService() { - return service; - } - - public void setService(Service service) { - this.service = service; - } - - public NodeBuilder createNodeBuilder(String nodeId) { - NodeBuilder builder = new NodeBuilder(); - builder.setId(new NodeId(nodeId)); - builder.setKey(new NodeKey(builder.getId())); - return builder; - } - - protected static InstanceIdentifier createFlowPath(FlowBuilder flowBuilder, NodeBuilder nodeBuilder) { - return InstanceIdentifier.builder(Nodes.class) - .child(org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node.class, - nodeBuilder.getKey()) - .augmentation(FlowCapableNode.class) - .child(Table.class, new TableKey(flowBuilder.getTableId())) - .child(Flow.class, flowBuilder.getKey()).build(); - } - - private static InstanceIdentifier - createNodePath(NodeBuilder nodeBuilder) { - return InstanceIdentifier.builder(Nodes.class) - .child(org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node.class, - nodeBuilder.getKey()).build(); - } - - /** - * This method returns the required Pipeline Instructions to by used by any matching flows that need - * to be further processed by next service in the pipeline. - * - * Important to note that this is a convenience method which returns a mutable instructionBuilder which - * needs to be further adjusted by the concrete ServiceInstance class such as setting the Instruction Order, etc. - * @return Newly created InstructionBuilder to be used along with other instructions on the main flow - */ - protected final InstructionBuilder getMutablePipelineInstructionBuilder() { - Service nextService = orchestrator.getNextServiceInPipeline(service); - if (nextService != null) { - return InstructionUtils.createGotoTableInstructions(new InstructionBuilder(), - orchestrator.getTable(nextService)); - } else { - return InstructionUtils.createDropInstructions(new InstructionBuilder()); - } - } - - protected void writeFlow(FlowBuilder flowBuilder, NodeBuilder nodeBuilder) { - if (NetvirtProvidersProvider.isMasterProviderInstance()) { - LOG.debug("writeFlow: flowBuilder: {}, nodeBuilder: {}", - flowBuilder.build(), nodeBuilder.build()); - WriteTransaction modification = dataBroker.newWriteOnlyTransaction(); - //modification.put(LogicalDatastoreType.CONFIGURATION, createNodePath(nodeBuilder), - // nodeBuilder.build(), true /*createMissingParents*/); - modification.put(LogicalDatastoreType.CONFIGURATION, createFlowPath(flowBuilder, nodeBuilder), - flowBuilder.build(), true /*createMissingParents*/); - CheckedFuture commitFuture = modification.submit(); - try { - commitFuture.checkedGet(); // TODO: Make it async (See bug 1362) - LOG.debug("Transaction success for write of Flow : {}", flowBuilder.getFlowName()); - } catch (Exception e) { - LOG.error("Failed to write flow : {}", flowBuilder.getFlowName(), e); - modification.cancel(); - } - } - } - - protected void removeFlow(FlowBuilder flowBuilder, NodeBuilder nodeBuilder) { - if (NetvirtProvidersProvider.isMasterProviderInstance()) { - LOG.debug("removeFlow: flowBuilder: {}, nodeBuilder: {}", - flowBuilder.build(), nodeBuilder.build()); - WriteTransaction modification = dataBroker.newWriteOnlyTransaction(); - modification.delete(LogicalDatastoreType.CONFIGURATION, createFlowPath(flowBuilder, nodeBuilder)); - - CheckedFuture commitFuture = modification.submit(); - try { - commitFuture.get(); // TODO: Make it async (See bug 1362) - LOG.debug("Transaction success for deletion of Flow : {}", flowBuilder.getFlowName()); - } catch (Exception e) { - LOG.error("Failed to remove flow : {}", flowBuilder.getFlowName(), e); - modification.cancel(); - } - } - } - - public Flow getFlow(FlowBuilder flowBuilder, NodeBuilder nodeBuilder) { - ReadOnlyTransaction readTx = dataBroker.newReadOnlyTransaction(); - try { - Optional data = - readTx.read(LogicalDatastoreType.CONFIGURATION, createFlowPath(flowBuilder, nodeBuilder)).get(); - if (data.isPresent()) { - return data.get(); - } - } catch (InterruptedException|ExecutionException e) { - LOG.error("Failed to get flow : {}", flowBuilder.getFlowName(), e); - } - - LOG.debug("Cannot find data for Flow : {}", flowBuilder.getFlowName()); - return null; - } - - public org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node - getOpenFlowNode(String nodeId) { - - ReadOnlyTransaction readTx = dataBroker.newReadOnlyTransaction(); - try { - Optional data = - readTx.read(LogicalDatastoreType.OPERATIONAL, createNodePath(createNodeBuilder(nodeId))).get(); - if (data.isPresent()) { - return data.get(); - } - } catch (InterruptedException|ExecutionException e) { - LOG.error("Failed to get openflow node : {}", nodeId, e); - } - - LOG.debug("Cannot find data for Node : {}", nodeId); - return null; - } - - private long getDpid(Node node) { - long dpid = southbound.getDataPathId(node); - if (dpid == 0) { - LOG.warn("getDpid: dpid not found for the Node: {}", node); - } - return dpid; - } - - /** - * Program Default Pipeline Flow. - * - * @param node on which the default pipeline flow is programmed. - */ - protected void programDefaultPipelineRule(Node node) { - if (!isBridgeInPipeline(node)) { - //LOG.trace("Bridge is not in pipeline {} ", node); - return; - } - MatchBuilder matchBuilder = new MatchBuilder(); - FlowBuilder flowBuilder = new FlowBuilder(); - long dpid = getDpid(node); - if (dpid == 0L) { - LOG.trace("could not find dpid for the Node: {}", node.getNodeId()); - return; - } - String nodeName = OPENFLOW + getDpid(node); - NodeBuilder nodeBuilder = createNodeBuilder(nodeName); - - // Create the OF Actions and Instructions - InstructionsBuilder isb = new InstructionsBuilder(); - - // Instructions List Stores Individual Instructions - List instructions = new ArrayList<>(); - - // Call the InstructionBuilder Methods Containing Actions - InstructionBuilder ib = this.getMutablePipelineInstructionBuilder(); - ib.setOrder(0); - ib.setKey(new InstructionKey(0)); - instructions.add(ib.build()); - - // Add InstructionBuilder to the Instruction(s)Builder List - isb.setInstruction(instructions); - - // Add InstructionsBuilder to FlowBuilder - flowBuilder.setInstructions(isb.build()); - - String flowId = "DEFAULT_PIPELINE_FLOW_" + getTable(); - flowBuilder.setId(new FlowId(flowId)); - FlowKey key = new FlowKey(new FlowId(flowId)); - flowBuilder.setMatch(matchBuilder.build()); - flowBuilder.setPriority(0); - flowBuilder.setBarrier(false); - flowBuilder.setTableId(getTable()); - flowBuilder.setKey(key); - flowBuilder.setFlowName(flowId); - flowBuilder.setHardTimeout(0); - flowBuilder.setIdleTimeout(0); - writeFlow(flowBuilder, nodeBuilder); - } -}