Bump mdsal to 5.0.2
[bgpcep.git] / pcep / topology / topology-provider / src / main / java / org / opendaylight / bgpcep / pcep / topology / provider / session / stats / SessionStateImpl.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
9 package org.opendaylight.bgpcep.pcep.topology.provider.session.stats;
10
11 import static java.util.Objects.requireNonNull;
12
13 import com.google.common.base.Stopwatch;
14 import java.util.concurrent.TimeUnit;
15 import java.util.concurrent.atomic.LongAdder;
16 import org.opendaylight.protocol.pcep.PCEPSessionState;
17 import org.opendaylight.protocol.util.StatisticsUtil;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev181109.Tlvs3;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev181109.speaker.entity.id.tlv.SpeakerEntityId;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev181109.Pcinitiate;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.Pcupd;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.PcepEntityIdStatsAug;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.PcepEntityIdStatsAugBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulCapabilitiesStatsAug;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulCapabilitiesStatsAugBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulMessagesStatsAug;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulMessagesStatsAugBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.PcepSessionState;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.LocalPref;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.LocalPrefBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.Messages;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.MessagesBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.PeerCapabilities;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.PeerCapabilitiesBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.PeerPref;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.reply.time.grouping.ReplyTime;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.reply.time.grouping.ReplyTimeBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.Message;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.open.object.Open;
40 import org.opendaylight.yangtools.yang.common.Uint16;
41
42 public final class SessionStateImpl implements PcepSessionState {
43     private final LongAdder lastReceivedRptMsgTimestamp = new LongAdder();
44     private final LongAdder receivedRptMsgCount = new LongAdder();
45     private final LongAdder sentUpdMsgCount = new LongAdder();
46     private final LongAdder sentInitMsgCount = new LongAdder();
47     private final Stopwatch sessionUpDuration;
48
49     private final LongAdder minReplyTime = new LongAdder();
50     private final LongAdder maxReplyTime = new LongAdder();
51     private final LongAdder totalTime = new LongAdder();
52     private final LongAdder reqCount = new LongAdder();
53     private final TopologySessionStats topologySessionStats;
54     private LocalPref localPref;
55     private PeerPref peerPref;
56     private PCEPSessionState pcepSessionState;
57
58     public SessionStateImpl(final TopologySessionStats topologySessionStats) {
59         this.sessionUpDuration = Stopwatch.createUnstarted();
60         this.topologySessionStats = requireNonNull(topologySessionStats);
61     }
62
63     public synchronized void init(final PCEPSessionState session) {
64         requireNonNull(session);
65         this.pcepSessionState = session;
66         final Open localOpen = session.getLocalOpen();
67
68         if (localOpen.getTlvs() != null && localOpen.getTlvs().augmentation(Tlvs3.class) != null) {
69             final SpeakerEntityId entityId = localOpen.getTlvs().augmentation(Tlvs3.class).getSpeakerEntityId();
70             if (entityId != null) {
71                 this.localPref = new LocalPrefBuilder(session.getLocalPref())
72                         .addAugmentation(PcepEntityIdStatsAug.class,
73                                 new PcepEntityIdStatsAugBuilder(entityId).build()).build();
74             }
75         } else {
76             this.localPref = session.getLocalPref();
77         }
78
79         this.peerPref = session.getPeerPref();
80         this.sessionUpDuration.start();
81     }
82
83     public synchronized void processRequestStats(final long duration) {
84         if (this.minReplyTime.longValue() == 0) {
85             this.minReplyTime.reset();
86             this.minReplyTime.add(duration);
87         } else if (duration < this.minReplyTime.longValue()) {
88             this.minReplyTime.reset();
89             this.minReplyTime.add(duration);
90         }
91         if (duration > this.maxReplyTime.longValue()) {
92             this.maxReplyTime.reset();
93             this.maxReplyTime.add(duration);
94         }
95         this.totalTime.add(duration);
96         this.reqCount.increment();
97     }
98
99     public synchronized void updateLastReceivedRptMsg() {
100         this.lastReceivedRptMsgTimestamp.reset();
101         this.lastReceivedRptMsgTimestamp.add(StatisticsUtil.getCurrentTimestampInSeconds());
102         this.receivedRptMsgCount.increment();
103     }
104
105     public synchronized void updateStatefulSentMsg(final Message msg) {
106         if (msg instanceof Pcinitiate) {
107             this.sentInitMsgCount.increment();
108         } else if (msg instanceof Pcupd) {
109             this.sentUpdMsgCount.increment();
110         }
111     }
112
113     @Override
114     public synchronized String getSessionDuration() {
115         return StatisticsUtil.formatElapsedTime(this.sessionUpDuration.elapsed(TimeUnit.SECONDS));
116     }
117
118     @Override
119     public synchronized Boolean isSynchronized() {
120         return this.topologySessionStats.isSessionSynchronized();
121     }
122
123     @Override
124     public synchronized PeerCapabilities getPeerCapabilities() {
125         return new PeerCapabilitiesBuilder()
126                 .addAugmentation(StatefulCapabilitiesStatsAug.class, createStatefulCapabilities())
127                 .build();
128     }
129
130     private StatefulCapabilitiesStatsAug createStatefulCapabilities() {
131         return new StatefulCapabilitiesStatsAugBuilder()
132                 .setActive(this.topologySessionStats.isLspUpdateCapability())
133                 .setInstantiation(this.topologySessionStats.isInitiationCapability())
134                 .setStateful(this.topologySessionStats.isStatefulCapability())
135                 .build();
136     }
137
138     @Override
139     public Messages getMessages() {
140         return new MessagesBuilder(this.pcepSessionState.getMessages())
141                 .setReplyTime(setReplyTime())
142                 .addAugmentation(StatefulMessagesStatsAug.class, createStatefulMessages())
143                 .build();
144     }
145
146     private StatefulMessagesStatsAug createStatefulMessages() {
147         return new StatefulMessagesStatsAugBuilder()
148                 .setLastReceivedRptMsgTimestamp(this.lastReceivedRptMsgTimestamp.longValue())
149                 .setReceivedRptMsgCount(this.receivedRptMsgCount.longValue())
150                 .setSentInitMsgCount(this.sentInitMsgCount.longValue())
151                 .setSentUpdMsgCount(this.sentUpdMsgCount.longValue())
152                 .build();
153     }
154
155     private synchronized ReplyTime setReplyTime() {
156         long avg = 0;
157         if (this.reqCount.longValue() != 0) {
158             avg = Math.round((double) this.totalTime.longValue() / this.reqCount.longValue());
159         }
160         return new ReplyTimeBuilder()
161                 .setAverageTime(avg)
162                 .setMaxTime(this.maxReplyTime.longValue())
163                 .setMinTime(this.minReplyTime.longValue())
164                 .build();
165     }
166
167     @Override
168     public LocalPref getLocalPref() {
169         return this.localPref;
170     }
171
172     @Override
173     public PeerPref getPeerPref() {
174         return this.peerPref;
175     }
176
177     @Override
178     public Uint16 getDelegatedLspsCount() {
179         return Uint16.valueOf(this.topologySessionStats.getDelegatedLspsCount());
180     }
181
182     @Override
183     public Class<PcepSessionState> implementedInterface() {
184         return PcepSessionState.class;
185     }
186 }