2 * ============LICENSE_START========================================================================
3 * ONAP : ccsdk feature sdnr wt mountpoint-registrar
4 * =================================================================================================
5 * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
6 * Copyright (C) 2021 Samsung Electronics Intellectual Property. All rights reserved.
7 * =================================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
9 * in compliance with the License. You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software distributed under the License
14 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
15 * or implied. See the License for the specific language governing permissions and limitations under
17 * ============LICENSE_END==========================================================================
20 package org.onap.ccsdk.features.sdnr.wt.mountpointregistrar.impl;
22 import com.fasterxml.jackson.core.JsonProcessingException;
23 import com.fasterxml.jackson.databind.JsonNode;
24 import com.fasterxml.jackson.databind.ObjectMapper;
25 import java.util.List;
26 import java.util.Properties;
27 import java.util.concurrent.ExecutionException;
28 import org.apache.kafka.clients.CommonClientConfigs;
29 import org.apache.kafka.clients.admin.Admin;
30 import org.onap.ccsdk.features.sdnr.wt.mountpointregistrar.config.GeneralConfig;
31 import org.onap.ccsdk.features.sdnr.wt.mountpointregistrar.kafka.VESMsgKafkaConsumer;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
35 public abstract class StrimziKafkaVESMsgConsumerImpl
36 implements StrimziKafkaVESMsgConsumer, StrimziKafkaVESMsgValidator {
38 private static final Logger LOG = LoggerFactory.getLogger(StrimziKafkaVESMsgConsumerImpl.class);
39 private static final String DEFAULT_SDNRUSER = "admin";
40 private static final String DEFAULT_SDNRPASSWD = "admin";
42 private final String name = this.getClass().getSimpleName();
43 private VESMsgKafkaConsumer consumer = null;
44 private boolean running = false;
45 private boolean ready = false;
46 private int fetchPause = 5000; // Default pause between fetch - 5 seconds
47 protected final GeneralConfig generalConfig;
48 Admin kafkaAdminClient = null;
50 protected StrimziKafkaVESMsgConsumerImpl(GeneralConfig generalConfig) {
51 this.generalConfig = generalConfig;
55 * Thread to fetch messages from the Kafka topic. Waits for the messages to
56 * arrive on the topic until a certain timeout and returns. If no data arrives
57 * on the topic, sleeps for a certain time period before checking again
65 boolean noData = true;
66 List<String> consumerResponse = null;
67 if (isTopicExists(consumer.getTopicName())) {
68 consumerResponse = consumer.poll();
69 for (String msg : consumerResponse) {
71 LOG.debug("{} received ActualMessage from Kafka VES Message topic {}", name, msg);
72 if (isMessageValid(msg)) {
80 } catch (InterruptedException e) {
81 LOG.warn("Caught exception reading from Kafka Message Topic", e);
82 Thread.currentThread().interrupt();
83 } catch (JsonProcessingException jsonProcessingException) {
84 LOG.warn("Failed to convert message to JsonNode: {}", jsonProcessingException.getMessage());
85 } catch (InvalidMessageException invalidMessageException) {
86 LOG.warn("Message is invalid because of: {}", invalidMessageException.getMessage());
87 } catch (Exception e) {
88 LOG.error("Caught exception reading from Kafka Message Topic", e);
96 public boolean isMessageValid(String message) {
100 protected JsonNode convertMessageToJsonNode(String message) throws JsonProcessingException {
101 return new ObjectMapper().readTree(message);
105 * Create a Kafka consumer by specifying properties containing information such as
106 * topic name, timeout, URL etc
109 public void init(Properties strimziKafkaProperties, Properties consumerProperties) {
110 Properties props = new Properties();
111 props.put(CommonClientConfigs.BOOTSTRAP_SERVERS_CONFIG, strimziKafkaProperties.getProperty("bootstrapServers"));
112 kafkaAdminClient = Admin.create(props);
115 this.consumer = new VESMsgKafkaConsumer(strimziKafkaProperties, consumerProperties);
116 this.consumer.subscribe(consumerProperties.getProperty("topic"));
118 } catch (Exception e) {
119 LOG.error("Error initializing Kafka Message consumer from file {} {}", consumerProperties, e);
123 private void pauseThread() throws InterruptedException {
124 if (fetchPause > 0) {
125 LOG.debug("No data received from fetch. Pausing {} ms before retry", fetchPause);
126 Thread.sleep(fetchPause);
128 LOG.debug("No data received from fetch. No fetch pause specified - retrying immediately");
132 private boolean isTopicExists(String topicName) {
133 LOG.trace("Checking for existence of topic - {}", topicName);
135 for (String kafkaTopic : kafkaAdminClient.listTopics().names().get()) {
136 if (kafkaTopic.equals(topicName))
139 } catch (InterruptedException | ExecutionException e) {
140 LOG.error("Exception in isTopicExists method - ", e);
146 public boolean isReady() {
151 public boolean isRunning() {
156 * public String getProperty(String name) { return properties.getProperty(name,
160 public void stopConsumer() {
164 public String getBaseUrl() {
165 return generalConfig.getBaseUrl();
168 public String getSDNRUser() {
169 return generalConfig.getSDNRUser() != null ? generalConfig.getSDNRUser() : DEFAULT_SDNRUSER;
172 public String getSDNRPasswd() {
173 return generalConfig.getSDNRPasswd() != null ? generalConfig.getSDNRPasswd() : DEFAULT_SDNRPASSWD;