2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.frm.flow;
10 import java.math.BigInteger;
12 import org.opendaylight.controller.frm.AbstractChangeListener;
13 import org.opendaylight.controller.frm.FlowCookieProducer;
14 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
15 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowTableRef;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInputBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInputBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.OriginalFlowBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlowBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowRef;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
28 import org.opendaylight.yangtools.yang.binding.DataObject;
29 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
33 import com.google.common.base.Preconditions;
36 * Flow Change Listener
37 * add, update and remove {@link Flow} processing from {@link org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent}.
39 * @author <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>
42 public class FlowChangeListener extends AbstractChangeListener {
44 private static final Logger LOG = LoggerFactory.getLogger(FlowChangeListener.class);
46 private final FlowProvider provider;
48 public FlowChangeListener (final FlowProvider provider) {
49 this.provider = Preconditions.checkNotNull(provider, "FlowProvider can not be null !");
53 protected void remove(final InstanceIdentifier<? extends DataObject> identifier,
54 final DataObject removeDataObj) {
56 final Flow flow = ((Flow) removeDataObj);
57 final InstanceIdentifier<Table> tableIdent = identifier.firstIdentifierOf(Table.class);
58 final InstanceIdentifier<Node> nodeIdent = identifier.firstIdentifierOf(Node.class);
59 final RemoveFlowInputBuilder builder = new RemoveFlowInputBuilder(flow);
61 // use empty cookie mask in order to delete flow even with generated cookie
62 builder.setCookieMask(new FlowCookie(BigInteger.ZERO));
64 builder.setFlowRef(new FlowRef(identifier));
65 builder.setNode(new NodeRef(nodeIdent));
66 builder.setFlowTable(new FlowTableRef(tableIdent));
68 Uri uri = new Uri(this.getTransactionId());
69 builder.setTransactionUri(uri);
70 this.provider.getSalFlowService().removeFlow(builder.build());
71 LOG.debug("Transaction {} - Removed Flow has removed flow: {}", new Object[]{uri, removeDataObj});
75 protected void update(final InstanceIdentifier<? extends DataObject> identifier,
76 final DataObject original, final DataObject update) {
78 final Flow originalFlow = ((Flow) original);
79 final Flow updatedFlow = ((Flow) update);
80 final InstanceIdentifier<Node> nodeIdent = identifier.firstIdentifierOf(Node.class);
81 final UpdateFlowInputBuilder builder = new UpdateFlowInputBuilder();
83 builder.setNode(new NodeRef(nodeIdent));
84 builder.setFlowRef(new FlowRef(identifier));
86 Uri uri = new Uri(this.getTransactionId());
87 builder.setTransactionUri(uri);
89 builder.setUpdatedFlow((new UpdatedFlowBuilder(updatedFlow)).build());
90 builder.setOriginalFlow((new OriginalFlowBuilder(originalFlow)).build());
92 this.provider.getSalFlowService().updateFlow(builder.build());
93 LOG.debug("Transaction {} - Update Flow has updated flow {} with {}", new Object[]{uri, original, update});
97 protected void add(final InstanceIdentifier<? extends DataObject> identifier,
98 final DataObject addDataObj) {
100 final Flow flow = ((Flow) addDataObj);
101 final InstanceIdentifier<Table> tableIdent = identifier.firstIdentifierOf(Table.class);
102 final NodeRef nodeRef = new NodeRef(identifier.firstIdentifierOf(Node.class));
103 final FlowCookie flowCookie = new FlowCookie(FlowCookieProducer.INSTANCE.getNewCookie(tableIdent));
104 final AddFlowInputBuilder builder = new AddFlowInputBuilder(flow);
106 builder.setNode(nodeRef);
107 builder.setFlowRef(new FlowRef(identifier));
108 builder.setFlowTable(new FlowTableRef(tableIdent));
109 builder.setCookie( flowCookie );
111 Uri uri = new Uri(this.getTransactionId());
112 builder.setTransactionUri(uri);
113 this.provider.getSalFlowService().addFlow(builder.build());
114 LOG.debug("Transaction {} - Add Flow has added flow: {}", new Object[]{uri, addDataObj});
118 protected boolean preconditionForChange(final InstanceIdentifier<? extends DataObject> identifier,
119 final DataObject dataObj, final DataObject update) {
121 final ReadOnlyTransaction trans = this.provider.getDataService().newReadOnlyTransaction();
122 return update != null
123 ? (dataObj instanceof Flow && update instanceof Flow && isNodeAvailable(identifier, trans))
124 : (dataObj instanceof Flow && isNodeAvailable(identifier, trans));