X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fforwardingrules-manager%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Ffrm%2Fflow%2FFlowChangeListener.java;h=c10b0da2ba959d74800a918fc4b55c2fd7091c86;hp=df086c7acc9ac92f13bad11cec3f5957d75beebe;hb=413e4ecb09769460eaf740f067e06f198957ce13;hpb=9d269c372a5d565101629cea6dad14a35a9e0591 diff --git a/opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/frm/flow/FlowChangeListener.java b/opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/frm/flow/FlowChangeListener.java index df086c7acc..c10b0da2ba 100644 --- a/opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/frm/flow/FlowChangeListener.java +++ b/opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/frm/flow/FlowChangeListener.java @@ -1,28 +1,27 @@ /** * Copyright (c) 2014 Cisco Systems, 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.controller.frm.flow; +import java.math.BigInteger; + import org.opendaylight.controller.frm.AbstractChangeListener; +import org.opendaylight.controller.frm.FlowCookieProducer; +import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowTableRef; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.OriginalFlow; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.OriginalFlowBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlow; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlowBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowRef; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; @@ -31,90 +30,97 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.base.Preconditions; + /** - * + * Flow Change Listener + * add, update and remove {@link Flow} processing from {@link org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent}. + * * @author Vaclav Demcak * */ public class FlowChangeListener extends AbstractChangeListener { - private final static Logger LOG = LoggerFactory.getLogger(FlowChangeListener.class); + private static final Logger LOG = LoggerFactory.getLogger(FlowChangeListener.class); - private final SalFlowService salFlowService; + private final FlowProvider provider; - public SalFlowService getSalFlowService() { - return this.salFlowService; - } - - public FlowChangeListener(final SalFlowService manager) { - this.salFlowService = manager; + public FlowChangeListener (final FlowProvider provider) { + this.provider = Preconditions.checkNotNull(provider, "FlowProvider can not be null !"); } @Override - protected void validate() throws IllegalStateException { - FlowTransactionValidator.validate(this); + protected void remove(final InstanceIdentifier identifier, + final DataObject removeDataObj) { + + final Flow flow = ((Flow) removeDataObj); + final InstanceIdentifier tableIdent = identifier.firstIdentifierOf(Table.class); + final InstanceIdentifier nodeIdent = identifier.firstIdentifierOf(Node.class); + final RemoveFlowInputBuilder builder = new RemoveFlowInputBuilder(flow); + + // use empty cookie mask in order to delete flow even with generated cookie + builder.setCookieMask(new FlowCookie(BigInteger.ZERO)); + + builder.setFlowRef(new FlowRef(identifier)); + builder.setNode(new NodeRef(nodeIdent)); + builder.setFlowTable(new FlowTableRef(tableIdent)); + + Uri uri = new Uri(this.getTransactionId()); + builder.setTransactionUri(uri); + this.provider.getSalFlowService().removeFlow(builder.build()); + LOG.debug("Transaction {} - Removed Flow has removed flow: {}", new Object[]{uri, removeDataObj}); } @Override - protected void remove(InstanceIdentifier identifier, DataObject removeDataObj) { - if ((removeDataObj instanceof Flow)) { - - final Flow flow = ((Flow) removeDataObj); - final InstanceIdentifier
tableInstanceId = identifier.
firstIdentifierOf(Table.class); - final InstanceIdentifier nodeInstanceId = identifier. firstIdentifierOf(Node.class); - final RemoveFlowInputBuilder builder = new RemoveFlowInputBuilder(flow); - - builder.setFlowRef(new FlowRef(identifier)); - builder.setNode(new NodeRef(nodeInstanceId)); - builder.setFlowTable(new FlowTableRef(tableInstanceId)); - - Uri uri = new Uri(this.getTransactionId()); - builder.setTransactionUri(uri); - this.salFlowService.removeFlow((RemoveFlowInput) builder.build()); - LOG.debug("Transaction {} - Removed Flow has removed flow: {}", new Object[]{uri, removeDataObj}); - } + protected void update(final InstanceIdentifier identifier, + final DataObject original, final DataObject update) { + + final Flow originalFlow = ((Flow) original); + final Flow updatedFlow = ((Flow) update); + final InstanceIdentifier nodeIdent = identifier.firstIdentifierOf(Node.class); + final UpdateFlowInputBuilder builder = new UpdateFlowInputBuilder(); + + builder.setNode(new NodeRef(nodeIdent)); + builder.setFlowRef(new FlowRef(identifier)); + + Uri uri = new Uri(this.getTransactionId()); + builder.setTransactionUri(uri); + + builder.setUpdatedFlow((new UpdatedFlowBuilder(updatedFlow)).build()); + builder.setOriginalFlow((new OriginalFlowBuilder(originalFlow)).build()); + + this.provider.getSalFlowService().updateFlow(builder.build()); + LOG.debug("Transaction {} - Update Flow has updated flow {} with {}", new Object[]{uri, original, update}); } @Override - protected void update(InstanceIdentifier identifier, DataObject original, DataObject update) { - if (original instanceof Flow && update instanceof Flow) { - - final Flow originalFlow = ((Flow) original); - final Flow updatedFlow = ((Flow) update); - final InstanceIdentifier nodeInstanceId = identifier.firstIdentifierOf(Node.class); - final UpdateFlowInputBuilder builder = new UpdateFlowInputBuilder(); - - builder.setNode(new NodeRef(nodeInstanceId)); - builder.setFlowRef(new FlowRef(identifier)); - - Uri uri = new Uri(this.getTransactionId()); - builder.setTransactionUri(uri); - - builder.setUpdatedFlow((UpdatedFlow) (new UpdatedFlowBuilder(updatedFlow)).build()); - builder.setOriginalFlow((OriginalFlow) (new OriginalFlowBuilder(originalFlow)).build()); - - this.salFlowService.updateFlow((UpdateFlowInput) builder.build()); - LOG.debug("Transaction {} - Update Flow has updated flow {} with {}", new Object[]{uri, original, update}); - } + protected void add(final InstanceIdentifier identifier, + final DataObject addDataObj) { + + final Flow flow = ((Flow) addDataObj); + final InstanceIdentifier
tableIdent = identifier.firstIdentifierOf(Table.class); + final NodeRef nodeRef = new NodeRef(identifier.firstIdentifierOf(Node.class)); + final FlowCookie flowCookie = new FlowCookie(FlowCookieProducer.INSTANCE.getNewCookie(tableIdent)); + final AddFlowInputBuilder builder = new AddFlowInputBuilder(flow); + + builder.setNode(nodeRef); + builder.setFlowRef(new FlowRef(identifier)); + builder.setFlowTable(new FlowTableRef(tableIdent)); + builder.setCookie( flowCookie ); + + Uri uri = new Uri(this.getTransactionId()); + builder.setTransactionUri(uri); + this.provider.getSalFlowService().addFlow(builder.build()); + LOG.debug("Transaction {} - Add Flow has added flow: {}", new Object[]{uri, addDataObj}); } @Override - protected void add(InstanceIdentifier identifier, DataObject addDataObj) { - if ((addDataObj instanceof Flow)) { - - final Flow flow = ((Flow) addDataObj); - final InstanceIdentifier
tableInstanceId = identifier.
firstIdentifierOf(Table.class); - final InstanceIdentifier nodeInstanceId = identifier. firstIdentifierOf(Node.class); - final AddFlowInputBuilder builder = new AddFlowInputBuilder(flow); - - builder.setNode(new NodeRef(nodeInstanceId)); - builder.setFlowRef(new FlowRef(identifier)); - builder.setFlowTable(new FlowTableRef(tableInstanceId)); - - Uri uri = new Uri(this.getTransactionId()); - builder.setTransactionUri(uri); - this.salFlowService.addFlow((AddFlowInput) builder.build()); - LOG.debug("Transaction {} - Add Flow has added flow: {}", new Object[]{uri, addDataObj}); - } + protected boolean preconditionForChange(final InstanceIdentifier identifier, + final DataObject dataObj, final DataObject update) { + + final ReadOnlyTransaction trans = this.provider.getDataService().newReadOnlyTransaction(); + return update != null + ? (dataObj instanceof Flow && update instanceof Flow && isNodeAvailable(identifier, trans)) + : (dataObj instanceof Flow && isNodeAvailable(identifier, trans)); } }