blob: 076139a30a5dc3a7220cf438681097296158a89b [file] [log] [blame]
Shubham Sharma751e82e2020-03-02 06:05:41 +00001/*
2 * Copyright 2018-present Open Networking Foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.opencord.kafka.integrations;
18
19import com.fasterxml.jackson.databind.JsonNode;
20import com.fasterxml.jackson.databind.ObjectMapper;
21import com.fasterxml.jackson.databind.node.ObjectNode;
Ilayda Ozdemir8b96b322020-06-18 08:52:17 +000022import org.opencord.igmpproxy.IgmpStatisticType;
Shubham Sharma751e82e2020-03-02 06:05:41 +000023import org.osgi.service.component.annotations.Activate;
24import org.osgi.service.component.annotations.Component;
25import org.osgi.service.component.annotations.Deactivate;
26import org.osgi.service.component.annotations.Reference;
27import org.osgi.service.component.annotations.ReferenceCardinality;
28import org.osgi.service.component.annotations.ReferencePolicy;
29import org.opencord.kafka.EventBusService;
30import org.slf4j.Logger;
31import org.slf4j.LoggerFactory;
32
33import java.util.concurrent.atomic.AtomicReference;
34
35import org.opencord.igmpproxy.IgmpStatisticsEvent;
36import org.opencord.igmpproxy.IgmpStatisticsEventListener;
37import org.opencord.igmpproxy.IgmpStatisticsService;
38
39/**
40 * Listens for IGMP events and pushes them on a Kafka bus.
41 */
42
43@Component(immediate = true)
44public class IgmpKafkaIntegration extends AbstractKafkaIntegration {
45
46 public Logger log = LoggerFactory.getLogger(getClass());
47
48 @Reference(cardinality = ReferenceCardinality.MANDATORY)
49 protected EventBusService eventBusService;
50
51 @Reference(cardinality = ReferenceCardinality.OPTIONAL,
52 policy = ReferencePolicy.DYNAMIC,
53 bind = "bindIgmpStatService",
54 unbind = "unbindIgmpStatService")
55 protected volatile IgmpStatisticsService ignore;
56 private final AtomicReference<IgmpStatisticsService> igmpStatServiceRef = new AtomicReference<>();
57
58 private final IgmpStatisticsEventListener igmpStatisticsEventListener =
59 new InternalIgmpStatisticsListener();
60
61 //TOPIC
kishoreefa3db52020-03-23 16:09:26 +053062 protected static final String IGMP_STATISTICS_TOPIC = "onos.igmp.stats.kpis";
Shubham Sharma751e82e2020-03-02 06:05:41 +000063
64 // IGMP stats event params
65 private static final String IGMP_JOIN_REQ = "igmpJoinReq";
66 private static final String IGMP_SUCCESS_JOIN_REJOIN_REQ = "igmpSuccessJoinRejoinReq";
67 private static final String IGMP_FAIL_JOIN_REQ = "igmpFailJoinReq";
68 private static final String IGMP_LEAVE_REQ = "igmpLeaveReq";
69 private static final String IGMP_DISCONNECT = "igmpDisconnect";
70 private static final String IGMP_V3_MEMBERSHIP_QUERY = "igmpv3MembbershipQuery";
71 private static final String IGMP_V1_MEMBERSHIP_REPORT = "igmpv1MembershipReport";
72 private static final String IGMP_V2_MEMBERSHIP_REPORT = "igmpv2MembershipReport";
73 private static final String IGMP_V3_MEMBERSHIP_REPORT = "igmpv3MembershipReport";
74 private static final String IGMP_V2_LEAVE_GROUP = "igmpv2LeaveGroup";
75 private static final String TOTAL_MSG_RECEIVED = "totalMsgReceived";
76 private static final String IGMP_MSG_RECEIVED = "igmpMsgReceived";
77 private static final String INVALID_IGMP_MSG_RECEIVED = "invalidIgmpMsgReceived";
78
Sonal Kasliwal036c7942020-03-18 12:11:20 +000079 private static final String UNKNOWN_IGMP_TYPE_PACKETS_RX_COUNTER =
Ilayda Ozdemir8b96b322020-06-18 08:52:17 +000080 "unknownIgmpTypePacketsRxCounter";
Sonal Kasliwal036c7942020-03-18 12:11:20 +000081 private static final String REPORTS_RX_WITH_WRONG_MODE_COUNTER =
Ilayda Ozdemir8b96b322020-06-18 08:52:17 +000082 "reportsRxWithWrongModeCounter";
Sonal Kasliwal036c7942020-03-18 12:11:20 +000083 private static final String FAIL_JOIN_REQ_INSUFF_PERMISSION_ACCESS_COUNTER =
Ilayda Ozdemir8b96b322020-06-18 08:52:17 +000084 "failJoinReqInsuffPermissionAccessCounter";
Sonal Kasliwal036c7942020-03-18 12:11:20 +000085 private static final String FAIL_JOIN_REQ_UNKNOWN_MULTICAST_IP_COUNTER =
Ilayda Ozdemir8b96b322020-06-18 08:52:17 +000086 "failJoinReqUnknownMulticastIpCounter";
Sonal Kasliwal036c7942020-03-18 12:11:20 +000087 private static final String UNCONFIGURED_GROUP_COUNTER =
Ilayda Ozdemir8b96b322020-06-18 08:52:17 +000088 "unconfiguredGroupCounter";
Sonal Kasliwal036c7942020-03-18 12:11:20 +000089 private static final String VALID_IGMP_PACKET_COUNTER =
Ilayda Ozdemir8b96b322020-06-18 08:52:17 +000090 "validIgmpPacketCounter";
Sonal Kasliwal036c7942020-03-18 12:11:20 +000091 private static final String IGMP_CHANNEL_JOIN_COUNTER =
Ilayda Ozdemir8b96b322020-06-18 08:52:17 +000092 "igmpChannelJoinCounter";
Sonal Kasliwal036c7942020-03-18 12:11:20 +000093 private static final String CURRENT_GRP_NUM_COUNTER =
Ilayda Ozdemir8b96b322020-06-18 08:52:17 +000094 "currentGrpNumCounter";
Sonal Kasliwal036c7942020-03-18 12:11:20 +000095 private static final String IGMP_VALID_CHECKSUM_COUNTER =
Ilayda Ozdemir8b96b322020-06-18 08:52:17 +000096 "igmpValidChecksumCounter";
Sonal Kasliwal036c7942020-03-18 12:11:20 +000097 private static final String INVALID_IGMP_LENGTH =
Ilayda Ozdemir8b96b322020-06-18 08:52:17 +000098 "invalidIgmpLength";
Sonal Kasliwal036c7942020-03-18 12:11:20 +000099 private static final String IGMP_GENERAL_MEMBERSHIP_QUERY =
Ilayda Ozdemir8b96b322020-06-18 08:52:17 +0000100 "igmpGeneralMembershipQuery";
Sonal Kasliwal036c7942020-03-18 12:11:20 +0000101 private static final String IGMP_GRP_SPECIFIC_MEMBERSHIP_QUERY =
Ilayda Ozdemir8b96b322020-06-18 08:52:17 +0000102 "igmpGrpSpecificMembershipQuery";
Sonal Kasliwal036c7942020-03-18 12:11:20 +0000103 private static final String IGMP_GRP_AND_SRC_SPECIFIC_MEMBERSHIP_QUERY =
Ilayda Ozdemir8b96b322020-06-18 08:52:17 +0000104 "igmpGrpAndSrcSpecificMembershipQuery";
Sonal Kasliwal036c7942020-03-18 12:11:20 +0000105
Shubham Sharma751e82e2020-03-02 06:05:41 +0000106 protected void bindIgmpStatService(IgmpStatisticsService incomingService) {
107 bindAndAddListener(incomingService, igmpStatServiceRef, igmpStatisticsEventListener);
108 }
109
110 protected void unbindIgmpStatService(IgmpStatisticsService outgoingService) {
111 unbindAndRemoveListener(outgoingService, igmpStatServiceRef, igmpStatisticsEventListener);
112 }
113
114 @Activate
115 public void activate() {
116 log.info("Started IgmpKafkaIntegration");
117 }
118
119 @Deactivate
120 public void deactivate() {
121 log.info("Stopped IgmpKafkaIntegration");
122 }
123
124 private void handleStat(IgmpStatisticsEvent event) {
125 eventBusService.send(IGMP_STATISTICS_TOPIC, serializeStat(event));
Andrea Campanella4a2b01a2020-06-25 11:29:23 +0200126 log.info("IGMPStatisticsEvent sent successfully");
Shubham Sharma751e82e2020-03-02 06:05:41 +0000127 }
128
129 private JsonNode serializeStat(IgmpStatisticsEvent event) {
130 ObjectMapper mapper = new ObjectMapper();
131 ObjectNode igmpStatEvent = mapper.createObjectNode();
Ilayda Ozdemir8b96b322020-06-18 08:52:17 +0000132 igmpStatEvent.put(IGMP_JOIN_REQ, event.subject()
133 .getStat(IgmpStatisticType.IGMP_JOIN_REQ));
134 igmpStatEvent.put(IGMP_SUCCESS_JOIN_REJOIN_REQ, event.subject()
135 .getStat(IgmpStatisticType.IGMP_SUCCESS_JOIN_RE_JOIN_REQ));
136 igmpStatEvent.put(IGMP_FAIL_JOIN_REQ, event.subject()
137 .getStat(IgmpStatisticType.IGMP_FAIL_JOIN_REQ));
138 igmpStatEvent.put(IGMP_LEAVE_REQ, event.subject()
139 .getStat(IgmpStatisticType.IGMP_LEAVE_REQ));
140 igmpStatEvent.put(IGMP_DISCONNECT, event.subject()
141 .getStat(IgmpStatisticType.IGMP_DISCONNECT));
142 igmpStatEvent.put(IGMP_V3_MEMBERSHIP_QUERY, event.subject()
143 .getStat(IgmpStatisticType.IGMP_V3_MEMBERSHIP_QUERY));
144 igmpStatEvent.put(IGMP_V1_MEMBERSHIP_REPORT, event.subject()
145 .getStat(IgmpStatisticType.IGMP_V1_MEMBERSHIP_REPORT));
146 igmpStatEvent.put(IGMP_V2_MEMBERSHIP_REPORT, event.subject()
147 .getStat(IgmpStatisticType.IGMP_V2_MEMBERSHIP_REPORT));
148 igmpStatEvent.put(IGMP_V3_MEMBERSHIP_REPORT, event.subject()
149 .getStat(IgmpStatisticType.IGMP_V3_MEMBERSHIP_REPORT));
150 igmpStatEvent.put(IGMP_V2_LEAVE_GROUP, event.subject()
151 .getStat(IgmpStatisticType.IGMP_V2_LEAVE_GROUP));
152 igmpStatEvent.put(TOTAL_MSG_RECEIVED, event.subject()
153 .getStat(IgmpStatisticType.TOTAL_MSG_RECEIVED));
154 igmpStatEvent.put(IGMP_MSG_RECEIVED, event.subject()
155 .getStat(IgmpStatisticType.IGMP_MSG_RECEIVED));
156 igmpStatEvent.put(INVALID_IGMP_MSG_RECEIVED, event.subject()
157 .getStat(IgmpStatisticType.INVALID_IGMP_MSG_RECEIVED));
158 igmpStatEvent.put(UNKNOWN_IGMP_TYPE_PACKETS_RX_COUNTER, event.subject()
159 .getStat(IgmpStatisticType.UNKNOWN_IGMP_TYPE_PACKETS_RX_COUNTER));
160 igmpStatEvent.put(REPORTS_RX_WITH_WRONG_MODE_COUNTER, event.subject()
161 .getStat(IgmpStatisticType.REPORTS_RX_WITH_WRONG_MODE_COUNTER));
Sonal Kasliwal036c7942020-03-18 12:11:20 +0000162 igmpStatEvent.put(FAIL_JOIN_REQ_INSUFF_PERMISSION_ACCESS_COUNTER,
Ilayda Ozdemir8b96b322020-06-18 08:52:17 +0000163 event.subject().getStat(IgmpStatisticType.FAIL_JOIN_REQ_INSUFF_PERMISSION_ACCESS_COUNTER));
Sonal Kasliwal036c7942020-03-18 12:11:20 +0000164 igmpStatEvent.put(FAIL_JOIN_REQ_UNKNOWN_MULTICAST_IP_COUNTER,
Ilayda Ozdemir8b96b322020-06-18 08:52:17 +0000165 event.subject().getStat(IgmpStatisticType.FAIL_JOIN_REQ_UNKNOWN_MULTICAST_IP_COUNTER));
166 igmpStatEvent.put(UNCONFIGURED_GROUP_COUNTER, event.subject()
167 .getStat(IgmpStatisticType.UNCONFIGURED_GROUP_COUNTER));
168 igmpStatEvent.put(VALID_IGMP_PACKET_COUNTER, event.subject()
169 .getStat(IgmpStatisticType.VALID_IGMP_PACKET_COUNTER));
170 igmpStatEvent.put(IGMP_CHANNEL_JOIN_COUNTER, event.subject()
171 .getStat(IgmpStatisticType.IGMP_CHANNEL_JOIN_COUNTER));
172 igmpStatEvent.put(CURRENT_GRP_NUM_COUNTER, event.subject()
173 .getStat(IgmpStatisticType.CURRENT_GRP_NUMBER_COUNTER));
174 igmpStatEvent.put(IGMP_VALID_CHECKSUM_COUNTER, event.subject()
175 .getStat(IgmpStatisticType.IGMP_VALID_CHECKSUM_COUNTER));
176 igmpStatEvent.put(INVALID_IGMP_LENGTH, event.subject()
177 .getStat(IgmpStatisticType.INVALID_IGMP_LENGTH));
178 igmpStatEvent.put(IGMP_GENERAL_MEMBERSHIP_QUERY, event.subject()
179 .getStat(IgmpStatisticType.IGMP_GENERAL_MEMBERSHIP_QUERY));
180 igmpStatEvent.put(IGMP_GRP_SPECIFIC_MEMBERSHIP_QUERY, event.subject()
181 .getStat(IgmpStatisticType.IGMP_GRP_SPECIFIC_MEMBERSHIP_QUERY));
Sonal Kasliwal036c7942020-03-18 12:11:20 +0000182 igmpStatEvent.put(IGMP_GRP_AND_SRC_SPECIFIC_MEMBERSHIP_QUERY,
Ilayda Ozdemir8b96b322020-06-18 08:52:17 +0000183 event.subject().getStat(IgmpStatisticType.IGMP_GRP_AND_SRC_SPESIFIC_MEMBERSHIP_QUERY));
Shubham Sharma751e82e2020-03-02 06:05:41 +0000184 return igmpStatEvent;
185 }
186
187 public class InternalIgmpStatisticsListener implements
Ilayda Ozdemir8b96b322020-06-18 08:52:17 +0000188 IgmpStatisticsEventListener {
Shubham Sharma751e82e2020-03-02 06:05:41 +0000189
190 @Override
191 public void event(IgmpStatisticsEvent igmpStatisticsEvent) {
192 handleStat(igmpStatisticsEvent);
193 }
194 }
195}