aboutsummaryrefslogtreecommitdiffstats
path: root/services/appc-dmaap-service/appc-dmaap-event-service/src
diff options
context:
space:
mode:
authorPatrick Brady <patrick.brady@att.com>2019-10-10 15:34:00 -0700
committerTakamune Cho <takamune.cho@att.com>2019-11-08 16:38:47 +0000
commit6a6d3afd489ea3b8945f1cdd8a8a74afdcc5221a (patch)
tree1b9b67b9683145d693d831eea7128d36738aa9a4 /services/appc-dmaap-service/appc-dmaap-event-service/src
parent7b04a1754482ba02a49d4d6376dc45e4cd6551f4 (diff)
Dmaap micro service jar
Creating a service running in a standalone jar to handle the publishing and recieving of dmaap messages for appc. Dmaap adapter and event listener code is copeid from the main appc project. It will be moved in a later commit. Change-Id: I3fa7b5dc60345f0f38f763a243150b8472f985ac Signed-off-by: Patrick Brady <patrick.brady@att.com> Issue-ID: APPC-1744
Diffstat (limited to 'services/appc-dmaap-service/appc-dmaap-event-service/src')
-rw-r--r--services/appc-dmaap-service/appc-dmaap-event-service/src/main/java/org/onap/appc/services/dmaapService/App.java57
-rw-r--r--services/appc-dmaap-service/appc-dmaap-event-service/src/main/java/org/onap/appc/services/dmaapService/AuthenticationConfig.java46
-rw-r--r--services/appc-dmaap-service/appc-dmaap-event-service/src/main/java/org/onap/appc/services/dmaapService/EventServer.java54
-rw-r--r--services/appc-dmaap-service/appc-dmaap-event-service/src/main/java/org/onap/appc/services/dmaapService/MessagingException.java31
-rw-r--r--services/appc-dmaap-service/appc-dmaap-event-service/src/main/java/org/onap/appc/services/dmaapService/PublishRequest.java83
-rw-r--r--services/appc-dmaap-service/appc-dmaap-event-service/src/main/java/org/onap/appc/services/dmaapService/PublishResponse.java36
-rw-r--r--services/appc-dmaap-service/appc-dmaap-event-service/src/main/java/org/onap/appc/services/dmaapService/PublishService.java109
-rw-r--r--services/appc-dmaap-service/appc-dmaap-event-service/src/test/java/org/onap/appc/services/PublishRequestTest.java82
8 files changed, 498 insertions, 0 deletions
diff --git a/services/appc-dmaap-service/appc-dmaap-event-service/src/main/java/org/onap/appc/services/dmaapService/App.java b/services/appc-dmaap-service/appc-dmaap-event-service/src/main/java/org/onap/appc/services/dmaapService/App.java
new file mode 100644
index 000000000..afcb3277d
--- /dev/null
+++ b/services/appc-dmaap-service/appc-dmaap-event-service/src/main/java/org/onap/appc/services/dmaapService/App.java
@@ -0,0 +1,57 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.appc.services.dmaapService;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.Properties;
+import java.util.Set;
+import org.onap.appc.listener.AppcEventListenerActivator;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+
+/**
+ * Hello world!
+ *
+ */
+@SpringBootApplication
+public class App
+{
+ public static void main( String[] args )
+ {
+
+ System.out.println("Starting");
+ AppcEventListenerActivator event = new AppcEventListenerActivator();
+ try {
+ event.start();
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ SpringApplication.run(App.class, args);
+ }
+
+
+}
diff --git a/services/appc-dmaap-service/appc-dmaap-event-service/src/main/java/org/onap/appc/services/dmaapService/AuthenticationConfig.java b/services/appc-dmaap-service/appc-dmaap-event-service/src/main/java/org/onap/appc/services/dmaapService/AuthenticationConfig.java
new file mode 100644
index 000000000..4031a5144
--- /dev/null
+++ b/services/appc-dmaap-service/appc-dmaap-event-service/src/main/java/org/onap/appc/services/dmaapService/AuthenticationConfig.java
@@ -0,0 +1,46 @@
+package org.onap.appc.services.dmaapService;
+
+import java.util.Properties;
+
+import org.onap.appc.configuration.ConfigurationFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+
+@Configuration
+public class AuthenticationConfig extends WebSecurityConfigurerAdapter {
+
+ private final String PROPERTIES_PREFIX = "appc.srvcomm.messaging";
+ private final String DEFAULT_USER = "appc";
+ private final String DEFAULT_PASSWORD = "onapappc";
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+ http.csrf().disable().authorizeRequests().anyRequest().authenticated().and().httpBasic();
+ }
+
+ @Override
+ protected void configure(AuthenticationManagerBuilder auth) throws Exception {
+ org.onap.appc.configuration.Configuration configuration = ConfigurationFactory.getConfiguration();
+ Properties props = configuration.getProperties();
+ String user = props.getProperty(PROPERTIES_PREFIX + ".user");
+ String pass = props.getProperty(PROPERTIES_PREFIX + ".pass");
+ if(user == null) {
+ user = DEFAULT_USER;
+ }
+ if(pass == null) {
+ pass = DEFAULT_PASSWORD;
+ }
+ auth.inMemoryAuthentication().withUser(user).password(encoder().encode(pass)).roles("USER");
+ }
+
+ @Bean
+ public PasswordEncoder encoder() {
+ return new BCryptPasswordEncoder();
+ }
+
+}
diff --git a/services/appc-dmaap-service/appc-dmaap-event-service/src/main/java/org/onap/appc/services/dmaapService/EventServer.java b/services/appc-dmaap-service/appc-dmaap-event-service/src/main/java/org/onap/appc/services/dmaapService/EventServer.java
new file mode 100644
index 000000000..9df67cbf2
--- /dev/null
+++ b/services/appc-dmaap-service/appc-dmaap-event-service/src/main/java/org/onap/appc/services/dmaapService/EventServer.java
@@ -0,0 +1,54 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.appc.services.dmaapService;
+
+import org.onap.appc.adapter.messaging.dmaap.http.HttpDmaapConsumerImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+
+@RestController
+public class EventServer {
+
+ private static final EELFLogger LOG = EELFManager.getInstance().getLogger(EventServer.class);
+
+ @Autowired
+ private PublishService publishService;
+
+ @RequestMapping("/publish")
+ public PublishResponse publish(@RequestBody String body) {
+ PublishRequest req = PublishRequest.parsePublishRequest(body);
+ String result = publishService.publishMessage(req.getProps(),req.getPartition(),
+ req.getTopic(), req.getMessage());
+ if(result.equals("Success")) {
+ return new PublishResponse(result);
+ }
+ LOG.error("Error during message publish: " + result);
+ throw new MessagingException();
+ }
+
+}
diff --git a/services/appc-dmaap-service/appc-dmaap-event-service/src/main/java/org/onap/appc/services/dmaapService/MessagingException.java b/services/appc-dmaap-service/appc-dmaap-event-service/src/main/java/org/onap/appc/services/dmaapService/MessagingException.java
new file mode 100644
index 000000000..3c114a1ed
--- /dev/null
+++ b/services/appc-dmaap-service/appc-dmaap-event-service/src/main/java/org/onap/appc/services/dmaapService/MessagingException.java
@@ -0,0 +1,31 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.appc.services.dmaapService;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+@ResponseStatus(value=HttpStatus.INTERNAL_SERVER_ERROR, reason="Error Publishing Messsage")
+public class MessagingException extends RuntimeException {
+
+
+}
diff --git a/services/appc-dmaap-service/appc-dmaap-event-service/src/main/java/org/onap/appc/services/dmaapService/PublishRequest.java b/services/appc-dmaap-service/appc-dmaap-event-service/src/main/java/org/onap/appc/services/dmaapService/PublishRequest.java
new file mode 100644
index 000000000..c242fdbfd
--- /dev/null
+++ b/services/appc-dmaap-service/appc-dmaap-event-service/src/main/java/org/onap/appc/services/dmaapService/PublishRequest.java
@@ -0,0 +1,83 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.appc.services.dmaapService;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+
+public class PublishRequest {
+
+ private static final EELFLogger LOG = EELFManager.getInstance().getLogger(PublishRequest.class);
+
+ private String props;
+ private String partition;
+ private String message;
+ private String topic;
+
+ private PublishRequest(String props, String partition, String topic, String message) {
+ this.props = props;
+ this.partition = partition;
+ this.message = message;
+ this.topic = topic;
+ }
+
+ public String getProps() {
+ return props;
+ }
+
+ public String getPartition() {
+ return partition;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public String getTopic() {
+ return topic;
+ }
+
+ public static PublishRequest parsePublishRequest(String data) {
+ //body content: props, partition, topic, message
+ String[] bodyParameters = new String[4];
+ LOG.debug("Parsing message into " + bodyParameters.length + " parts: " + data);
+ int[] bodyParameterSizes = new int[bodyParameters.length];
+ for(int i = 0; i < bodyParameters.length; i ++) {
+ String[] split = data.split("\\.", 2);
+ try {
+ bodyParameterSizes[i] = Integer.parseInt(split[0]);
+ } catch(NumberFormatException e) {
+ LOG.error("Could not parse message: " + data);
+ }
+ data = split[1];
+ }
+ int cursor = 0;
+ for(int i = 0; i < bodyParameters.length; i ++) {
+ if(bodyParameterSizes[i] > 0) {
+ bodyParameters[i] = data.substring(cursor, cursor + bodyParameterSizes[i]);
+ cursor = cursor + bodyParameterSizes[i];
+ }
+ }
+ return new PublishRequest(bodyParameters[0], bodyParameters[1], bodyParameters[2], bodyParameters[3]);
+ }
+
+}
diff --git a/services/appc-dmaap-service/appc-dmaap-event-service/src/main/java/org/onap/appc/services/dmaapService/PublishResponse.java b/services/appc-dmaap-service/appc-dmaap-event-service/src/main/java/org/onap/appc/services/dmaapService/PublishResponse.java
new file mode 100644
index 000000000..576c80d80
--- /dev/null
+++ b/services/appc-dmaap-service/appc-dmaap-event-service/src/main/java/org/onap/appc/services/dmaapService/PublishResponse.java
@@ -0,0 +1,36 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.appc.services.dmaapService;
+
+public class PublishResponse {
+
+ private String status;
+
+ public PublishResponse(String status) {
+ this.status = status;
+ }
+
+ public String getName() {
+ return status;
+ }
+
+}
diff --git a/services/appc-dmaap-service/appc-dmaap-event-service/src/main/java/org/onap/appc/services/dmaapService/PublishService.java b/services/appc-dmaap-service/appc-dmaap-event-service/src/main/java/org/onap/appc/services/dmaapService/PublishService.java
new file mode 100644
index 000000000..1e1b9e7f8
--- /dev/null
+++ b/services/appc-dmaap-service/appc-dmaap-event-service/src/main/java/org/onap/appc/services/dmaapService/PublishService.java
@@ -0,0 +1,109 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.appc.services.dmaapService;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Properties;
+
+import org.onap.appc.adapter.factory.DmaapMessageAdapterFactoryImpl;
+import org.onap.appc.configuration.Configuration;
+import org.onap.appc.configuration.ConfigurationFactory;
+import org.springframework.stereotype.Service;
+import org.onap.appc.adapter.message.MessageAdapterFactory;
+import org.onap.appc.adapter.message.Producer;
+import org.onap.appc.adapter.messaging.dmaap.http.HttpDmaapProducerImpl;
+
+@Service
+public class PublishService {
+
+ private Map<String,Producer> producers;
+ private MessageAdapterFactory factory;
+ Configuration configuration;
+
+ public PublishService() {
+ this.factory = new DmaapMessageAdapterFactoryImpl();
+ producers = new HashMap<>();
+ }
+
+ public PublishService(MessageAdapterFactory factory) {
+ this.factory = factory;
+ producers = new HashMap<>();
+ }
+
+ public String publishMessage(String key, String partition, String topic, String message) {
+ Producer producer = getProducer(key, topic);
+ if(producer == null) {
+ return "Could not find producer with property prefix: " + key;
+ }
+ boolean success = producer.post(partition, message);
+ if(success) {
+ return "Success";
+ }
+ return "Failed. See dmaap service jar log.";
+ }
+
+ private Producer getProducer(String key, String topic) {
+ String searchKey = key;
+ if(topic != null) {
+ searchKey += topic;
+ }
+ Producer producer = producers.get(searchKey);
+ if(producer != null) {
+ return producer;
+ }
+ producer = newProducer(key, topic);
+ producers.put(searchKey,producer);
+ return producer;
+ }
+
+ private Producer newProducer(String key, String topic) {
+ Configuration configuration;
+ if(this.configuration != null) {
+ configuration = this.configuration;
+ } else {
+ configuration = ConfigurationFactory.getConfiguration();
+ }
+ Properties props = configuration.getProperties();
+ HashSet<String> pool = new HashSet<>();
+ if (props != null) {
+ String writeTopic;
+ if(topic == null) {
+ writeTopic = props.getProperty(key + ".topic.write");
+ } else {
+ writeTopic = topic;
+ }
+ String apiKey = props.getProperty(key + ".client.key");
+ String apiSecret = props.getProperty(key + ".client.secret");
+ String hostnames = props.getProperty(key + ".poolMembers");
+ if (hostnames != null && !hostnames.isEmpty()) {
+ for (String name : hostnames.split(",")) {
+ pool.add(name);
+ }
+ }
+ return factory.createProducer(pool, writeTopic, apiKey, apiSecret);
+ }
+ return null;
+ }
+
+}
diff --git a/services/appc-dmaap-service/appc-dmaap-event-service/src/test/java/org/onap/appc/services/PublishRequestTest.java b/services/appc-dmaap-service/appc-dmaap-event-service/src/test/java/org/onap/appc/services/PublishRequestTest.java
new file mode 100644
index 000000000..7cc9bccfd
--- /dev/null
+++ b/services/appc-dmaap-service/appc-dmaap-event-service/src/test/java/org/onap/appc/services/PublishRequestTest.java
@@ -0,0 +1,82 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.appc.services;
+
+import org.onap.appc.services.dmaapService.PublishRequest;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class PublishRequestTest {
+
+ @Test
+ public void testParsePublishRequest() {
+ //props, partition, topic, message
+ String props = "props.test";
+ String partition = "testPartition";
+ String topic = "testTopic";
+ String message = "sameple message data";
+ String data = props.length() + "." + partition.length() + "." + topic.length()
+ + "." + message.length() + "." + props + partition + topic + message;
+ PublishRequest publishRequest = PublishRequest.parsePublishRequest(data);
+ Assert.assertTrue(props.equals(publishRequest.getProps()));
+ Assert.assertTrue(partition.equals(publishRequest.getPartition()));
+ Assert.assertTrue(topic.equals(publishRequest.getTopic()));
+ Assert.assertTrue(message.equals(publishRequest.getMessage()));
+
+ }
+
+ @Test
+ public void testParsePublishRequest_period_in_message() {
+ //props, partition, topic, message
+ String props = "props.test";
+ String partition = "testPartition";
+ String topic = "testTopic";
+ String message = "sameple. message. dat.a";
+ String data = props.length() + "." + partition.length() + "." + topic.length()
+ + "." + message.length() + "." + props + partition + topic + message;
+ PublishRequest publishRequest = PublishRequest.parsePublishRequest(data);
+ Assert.assertTrue(props.equals(publishRequest.getProps()));
+ Assert.assertTrue(partition.equals(publishRequest.getPartition()));
+ Assert.assertTrue(topic.equals(publishRequest.getTopic()));
+ Assert.assertTrue(message.equals(publishRequest.getMessage()));
+
+ }
+
+ @Test
+ public void testParsePublishRequest_with_missing_value() {
+ //props, partition, topic, message
+ String props = "props.test";
+ String partition = "testPartition";
+ String topic = "";
+ String message = "sameple message data";
+ String data = props.length() + "." + partition.length() + "." + topic.length()
+ + "." + message.length() + "." + props + partition + topic + message;
+ PublishRequest publishRequest = PublishRequest.parsePublishRequest(data);
+ Assert.assertTrue(props.equals(publishRequest.getProps()));
+ Assert.assertTrue(partition.equals(publishRequest.getPartition()));
+ Assert.assertTrue(null == publishRequest.getTopic());
+ Assert.assertTrue(message.equals(publishRequest.getMessage()));
+
+ }
+
+}