Merge "Remove Optional.ofNullable() antipatterns"
[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 java.util.Optional;
11 import java.util.concurrent.ExecutionException;
12 import java.util.concurrent.atomic.AtomicInteger;
13 import java.util.concurrent.atomic.AtomicLong;
14 import org.opendaylight.mdsal.binding.api.DataBroker;
15 import org.opendaylight.mdsal.binding.api.ReadTransaction;
16 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
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 (ReadTransaction readOnlyTransaction = dataBroker.newReadOnlyTransaction()) {
83                     Optional<Flow> flowOptional;
84                     if (isConfigDs) {
85                         flowOptional = readOnlyTransaction.read(LogicalDatastoreType.CONFIGURATION, flowIid).get();
86                     } else {
87                         flowOptional = readOnlyTransaction.read(LogicalDatastoreType.OPERATIONAL, flowIid).get();
88                     }
89
90                     if (flowOptional.isPresent()) {
91                         flowCount.incrementAndGet();
92                         if (verbose) {
93                             LOG.info("Flow found: {}", flowOptional.get());
94                         }
95                     } else {
96                         if (verbose) {
97                             LOG.info("Flow: {} not found", flowIid);
98                         }
99                     }
100                 } catch (InterruptedException | ExecutionException e) {
101                     readOpStatus.set(FlowCounter.OperationStatus.FAILURE.status());
102                     LOG.error("Error", e);
103                 }
104             }
105         }
106         if (readOpStatus.get() != FlowCounter.OperationStatus.FAILURE.status()) {
107             readOpStatus.set(FlowCounter.OperationStatus.SUCCESS.status());
108         }
109         LOG.info("Total Flows read: {}", flowCount);
110     }
111
112     private InstanceIdentifier<Flow> getFlowInstanceIdentifier(String dpId, Short tableId, String flowId) {
113         return InstanceIdentifier.create(Nodes.class).child(Node.class, new NodeKey(new NodeId(dpId)))
114                 .augmentation(FlowCapableNode.class).child(Table.class, new TableKey(tableId))
115                 .child(Flow.class, new FlowKey(new FlowId(flowId)));
116     }
117
118     @Override
119     public long getFlowCount() {
120         return flowCount.get();
121     }
122
123     @Override
124     public int getReadOpStatus() {
125         return readOpStatus.get();
126     }
127 }