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%2Fimpl%2FFlowForwarder.java;fp=opendaylight%2Fmd-sal%2Fforwardingrules-manager%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Ffrm%2Fimpl%2FFlowForwarder.java;h=fd0ddecd1c42acc6f8210d44f35cd7a97502d377;hp=0000000000000000000000000000000000000000;hb=3ed53ef05d371492040ca3e67b98a8cfebdcc76d;hpb=413e4ecb09769460eaf740f067e06f198957ce13 diff --git a/opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/frm/impl/FlowForwarder.java b/opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/frm/impl/FlowForwarder.java new file mode 100644 index 0000000000..fd0ddecd1c --- /dev/null +++ b/opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/frm/impl/FlowForwarder.java @@ -0,0 +1,140 @@ +/**ab + * 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.impl; + +import com.google.common.base.Preconditions; +import org.opendaylight.controller.frm.ForwardingRulesManager; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.DataChangeListener; +import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +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.FlowCapableNode; +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.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.RemoveFlowInputBuilder; +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.OriginalFlowBuilder; +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.FlowRef; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * GroupForwarder + * It implements {@link org.opendaylight.controller.md.sal.binding.api.DataChangeListener}} + * for WildCardedPath to {@link Flow} and ForwardingRulesCommiter interface for methods: + * add, update and remove {@link Flow} processing for + * {@link org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent}. + * + * @author Vaclav Demcak + * + */ +public class FlowForwarder extends AbstractListeningCommiter { + + private static final Logger LOG = LoggerFactory.getLogger(FlowForwarder.class); + + private ListenerRegistration listenerRegistration; + + public FlowForwarder (final ForwardingRulesManager manager, final DataBroker db) { + super(manager, Flow.class); + Preconditions.checkNotNull(db, "DataBroker can not be null!"); + this.listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION, + getWildCardPath(), FlowForwarder.this, DataChangeScope.BASE); + } + + @Override + public void close() { + if (listenerRegistration != null) { + try { + listenerRegistration.close(); + } catch (Exception e) { + LOG.error("Error by stop FRM FlowChangeListener.", e); + } + listenerRegistration = null; + } + } + + @Override + public void remove(final InstanceIdentifier identifier, + final Flow removeDataObj, + final InstanceIdentifier nodeIdent) { + + final TableKey tableKey = identifier.firstKeyOf(Table.class, TableKey.class); + if (tableIdValidationPrecondition(tableKey, removeDataObj)) { + final RemoveFlowInputBuilder builder = new RemoveFlowInputBuilder(removeDataObj); + builder.setFlowRef(new FlowRef(identifier)); + builder.setNode(new NodeRef(nodeIdent)); + builder.setFlowTable(new FlowTableRef(nodeIdent.child(Table.class, tableKey))); + builder.setTransactionUri(new Uri(provider.getNewTransactionId())); + this.provider.getSalFlowService().removeFlow(builder.build()); + } + } + + @Override + public void update(final InstanceIdentifier identifier, + final Flow original, final Flow update, + final InstanceIdentifier nodeIdent) { + + final TableKey tableKey = identifier.firstKeyOf(Table.class, TableKey.class); + if (tableIdValidationPrecondition(tableKey, update)) { + final UpdateFlowInputBuilder builder = new UpdateFlowInputBuilder(); + + builder.setNode(new NodeRef(nodeIdent)); + builder.setFlowRef(new FlowRef(identifier)); + builder.setTransactionUri(new Uri(provider.getNewTransactionId())); + builder.setUpdatedFlow((new UpdatedFlowBuilder(update)).build()); + builder.setOriginalFlow((new OriginalFlowBuilder(original)).build()); + + this.provider.getSalFlowService().updateFlow(builder.build()); + } + } + + @Override + public void add(final InstanceIdentifier identifier, + final Flow addDataObj, + final InstanceIdentifier nodeIdent) { + + final TableKey tableKey = identifier.firstKeyOf(Table.class, TableKey.class); + if (tableIdValidationPrecondition(tableKey, addDataObj)) { + final AddFlowInputBuilder builder = new AddFlowInputBuilder(addDataObj); + + builder.setNode(new NodeRef(nodeIdent)); + builder.setFlowRef(new FlowRef(identifier)); + builder.setFlowTable(new FlowTableRef(nodeIdent.child(Table.class, tableKey))); + builder.setTransactionUri(new Uri(provider.getNewTransactionId())); + this.provider.getSalFlowService().addFlow(builder.build()); + } + } + + @Override + protected InstanceIdentifier getWildCardPath() { + return InstanceIdentifier.create(Nodes.class).child(Node.class) + .augmentation(FlowCapableNode.class).child(Table.class).child(Flow.class); + } + + private boolean tableIdValidationPrecondition (final TableKey tableKey, final Flow flow) { + Preconditions.checkNotNull(tableKey, "TableKey can not be null or empty!"); + Preconditions.checkNotNull(flow, "Flow can not be null or empty!"); + if (flow.getTableId() != tableKey.getId()) { + LOG.error("TableID in URI tableId={} and in palyload tableId={} is not same.", + flow.getTableId(), tableKey.getId()); + return false; + } + return true; + } +} +