Replace Table with TableFeatures in FRM.
[openflowplugin.git] / applications / forwardingrules-manager / src / main / java / org / opendaylight / openflowplugin / applications / frm / impl / MeterForwarder.java
1 /**
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.openflowplugin.applications.frm.impl;
9
10 import com.google.common.base.Preconditions;
11 import java.util.concurrent.Callable;
12 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
13 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
14 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
15 import org.opendaylight.openflowplugin.applications.frm.ForwardingRulesManager;
16 import org.opendaylight.openflowplugin.common.wait.SimpleTaskRetryLooper;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.Meter;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInputBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterInputBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterInputBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.meter.update.OriginalMeterBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.meter.update.UpdatedMeterBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterRef;
29 import org.opendaylight.yangtools.concepts.ListenerRegistration;
30 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
33
34 /**
35  * MeterForwarder
36  * It implements {@link org.opendaylight.controller.md.sal.binding.api.DataChangeListener}}
37  * for WildCardedPath to {@link Meter} and ForwardingRulesCommiter interface for methods:
38  *  add, update and remove {@link Meter} processing for
39  *  {@link org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent}.
40  *
41  * @author <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>
42  *
43  */
44 public class MeterForwarder extends AbstractListeningCommiter<Meter> {
45
46     private static final Logger LOG = LoggerFactory.getLogger(MeterForwarder.class);
47
48     private ListenerRegistration<MeterForwarder> listenerRegistration;
49
50     public MeterForwarder (final ForwardingRulesManager manager, final DataBroker db) {
51         super(manager, Meter.class);
52         Preconditions.checkNotNull(db, "DataBroker can not be null!");
53         final DataTreeIdentifier<Meter> treeId = new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, getWildCardPath());
54
55         try {
56             SimpleTaskRetryLooper looper = new SimpleTaskRetryLooper(ForwardingRulesManagerImpl.STARTUP_LOOP_TICK,
57                     ForwardingRulesManagerImpl.STARTUP_LOOP_MAX_RETRIES);
58             listenerRegistration = looper.loopUntilNoException(new Callable<ListenerRegistration<MeterForwarder>>() {
59                 @Override
60                 public ListenerRegistration<MeterForwarder> call() throws Exception {
61                     return db.registerDataTreeChangeListener(treeId, MeterForwarder.this);
62                 }
63             });
64         } catch (final Exception e) {
65             LOG.warn("FRM Meter DataChange listener registration fail!");
66             LOG.debug("FRM Meter DataChange listener registration fail ..", e);
67             throw new IllegalStateException("FlowForwarder startup fail! System needs restart.", e);
68         }
69     }
70
71     @Override
72     public void close() {
73         if (listenerRegistration != null) {
74             try {
75                 listenerRegistration.close();
76             } catch (Exception e) {
77                 LOG.error("Error by stop FRM MeterChangeListener.", e);
78             }
79             listenerRegistration = null;
80         }
81     }
82
83     @Override
84     protected InstanceIdentifier<Meter> getWildCardPath() {
85         return InstanceIdentifier.create(Nodes.class).child(Node.class)
86                 .augmentation(FlowCapableNode.class).child(Meter.class);
87     }
88
89     @Override
90     public void remove(final InstanceIdentifier<Meter> identifier, final Meter removeDataObj,
91                        final InstanceIdentifier<FlowCapableNode> nodeIdent) {
92
93         final RemoveMeterInputBuilder builder = new RemoveMeterInputBuilder(removeDataObj);
94
95         builder.setNode(new NodeRef(nodeIdent.firstIdentifierOf(Node.class)));
96         builder.setMeterRef(new MeterRef(identifier));
97         builder.setTransactionUri(new Uri(provider.getNewTransactionId()));
98         this.provider.getSalMeterService().removeMeter(builder.build());
99     }
100
101     @Override
102     public void update(final InstanceIdentifier<Meter> identifier,
103                        final Meter original, final Meter update,
104                        final InstanceIdentifier<FlowCapableNode> nodeIdent) {
105
106         final UpdateMeterInputBuilder builder = new UpdateMeterInputBuilder();
107
108         builder.setNode(new NodeRef(nodeIdent.firstIdentifierOf(Node.class)));
109         builder.setMeterRef(new MeterRef(identifier));
110         builder.setTransactionUri(new Uri(provider.getNewTransactionId()));
111         builder.setUpdatedMeter((new UpdatedMeterBuilder(update)).build());
112         builder.setOriginalMeter((new OriginalMeterBuilder(original)).build());
113
114         this.provider.getSalMeterService().updateMeter(builder.build());
115     }
116
117     @Override
118     public void add(final InstanceIdentifier<Meter> identifier, final Meter addDataObj,
119                     final InstanceIdentifier<FlowCapableNode> nodeIdent) {
120
121         final AddMeterInputBuilder builder = new AddMeterInputBuilder(addDataObj);
122
123         builder.setNode(new NodeRef(nodeIdent.firstIdentifierOf(Node.class)));
124         builder.setMeterRef(new MeterRef(identifier));
125         builder.setTransactionUri(new Uri(provider.getNewTransactionId()));
126         this.provider.getSalMeterService().addMeter(builder.build());
127     }
128 }
129