Close ReadTransactions
[openflowplugin.git] / applications / bulk-o-matic / src / main / java / org / opendaylight / openflowplugin / applications / bulk / o / matic / FlowReader.java
1 /*
2  * Copyright (c) 2016, 2017 Ericsson 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.bulk.o.matic;
9
10 import com.google.common.base.Optional;
11 import java.util.concurrent.atomic.AtomicInteger;
12 import java.util.concurrent.atomic.AtomicLong;
13 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
14 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
15 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
16 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableKey;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
27 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30
31 public final class FlowReader implements Runnable, FlowCounterMBean {
32     private static final Logger LOG = LoggerFactory.getLogger(FlowReader.class);
33     private final DataBroker dataBroker;
34     private final Integer dpnCount;
35     private final boolean verbose;
36     private final int flowsPerDpn;
37     private final short startTableId;
38     private final short endTableId;
39     private final boolean isConfigDs;
40     private final AtomicLong flowCount = new AtomicLong();
41     private final AtomicInteger readOpStatus = new AtomicInteger(FlowCounter.OperationStatus.INIT.status());
42
43     private FlowReader(final DataBroker dataBroker, final Integer dpnCount, final int flowsPerDpn,
44             final boolean verbose, final boolean isConfigDs, final short startTableId, final short endTableId) {
45         this.dataBroker = dataBroker;
46         this.dpnCount = dpnCount;
47         this.verbose = verbose;
48         this.flowsPerDpn = flowsPerDpn;
49         this.startTableId = startTableId;
50         this.endTableId = endTableId;
51         this.isConfigDs = isConfigDs;
52     }
53
54     public static FlowReader getNewInstance(final DataBroker dataBroker,
55             final Integer dpnCount, final int flowsPerDpn,
56             final boolean verbose, final boolean isConfigDs,
57             final short startTableId, final short endTableId) {
58         return new FlowReader(dataBroker, dpnCount,
59                 flowsPerDpn, verbose,
60                 isConfigDs, startTableId,
61                 endTableId);
62     }
63
64     @Override
65     public void run() {
66         readFlowsX();
67     }
68
69     private void readFlowsX() {
70         readOpStatus.set(FlowCounter.OperationStatus.IN_PROGRESS.status());
71         for (int i = 1; i <= dpnCount; i++) {
72             String dpId = BulkOMaticUtils.DEVICE_TYPE_PREFIX + i;
73             for (int j = 0; j < flowsPerDpn; j++) {
74                 short tableRollover = (short) (endTableId - startTableId + 1);
75                 short tableId = (short) (j % tableRollover + startTableId);
76
77                 Integer sourceIp = j + 1;
78
79                 String flowId = "Flow-" + dpId + "." + tableId + "." + sourceIp;
80                 InstanceIdentifier<Flow> flowIid = getFlowInstanceIdentifier(dpId, tableId, flowId);
81
82                 try (ReadOnlyTransaction readOnlyTransaction = dataBroker.newReadOnlyTransaction()) {
83                     Optional<Flow> flowOptional;
84                     if (isConfigDs) {
85                         flowOptional = readOnlyTransaction.read(LogicalDatastoreType.CONFIGURATION, flowIid)
86                                 .checkedGet();
87                     } else {
88                         flowOptional = readOnlyTransaction.read(LogicalDatastoreType.OPERATIONAL, flowIid).checkedGet();
89                     }
90
91                     if (flowOptional.isPresent()) {
92                         flowCount.incrementAndGet();
93                         if (verbose) {
94                             LOG.info("Flow found: {}", flowOptional.get());
95                         }
96                     } else {
97                         if (verbose) {
98                             LOG.info("Flow: {} not found", flowIid);
99                         }
100                     }
101                 } catch (ReadFailedException e) {
102                     readOpStatus.set(FlowCounter.OperationStatus.FAILURE.status());
103                     LOG.error("Error {}", e);
104                 }
105             }
106         }
107         if (readOpStatus.get() != FlowCounter.OperationStatus.FAILURE.status()) {
108             readOpStatus.set(FlowCounter.OperationStatus.SUCCESS.status());
109         }
110         LOG.info("Total Flows read: {}", flowCount);
111     }
112
113     private InstanceIdentifier<Flow> getFlowInstanceIdentifier(String dpId, Short tableId, String flowId) {
114         return InstanceIdentifier.create(Nodes.class).child(Node.class, new NodeKey(new NodeId(dpId)))
115                 .augmentation(FlowCapableNode.class).child(Table.class, new TableKey(tableId))
116                 .child(Flow.class, new FlowKey(new FlowId(flowId)));
117     }
118
119     @Override
120     public long getFlowCount() {
121         return flowCount.get();
122     }
123
124     @Override
125     public int getReadOpStatus() {
126         return readOpStatus.get();
127     }
128 }