summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/onap/dcae/controller/PersistentEventConnection.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/onap/dcae/controller/PersistentEventConnection.java')
-rw-r--r--src/main/java/org/onap/dcae/controller/PersistentEventConnection.java207
1 files changed, 207 insertions, 0 deletions
diff --git a/src/main/java/org/onap/dcae/controller/PersistentEventConnection.java b/src/main/java/org/onap/dcae/controller/PersistentEventConnection.java
new file mode 100644
index 0000000..1c0d85b
--- /dev/null
+++ b/src/main/java/org/onap/dcae/controller/PersistentEventConnection.java
@@ -0,0 +1,207 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.collectors.restconf
+ * ================================================================================
+ * Copyright (C) 2018-2019 Huawei. 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.dcae.controller;
+
+import org.glassfish.jersey.media.sse.EventSource;
+import org.glassfish.jersey.media.sse.SseFeature;
+import org.onap.dcae.common.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.HttpHeaders;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.onap.dcae.common.RestapiCallNodeUtil.*;
+
+public class PersistentEventConnection implements Runnable {
+ public String event_name;
+ private String event_description;
+ private boolean event_sseventUrlEmbed;
+ private String event_sseventsField;
+ private String event_sseventsUrl;
+ private String event_subscriptionTemplate;
+ private String event_unSubscriptionTemplate;
+ private String event_ruleId;
+ private EventConnectionState state;
+ private volatile boolean running = true;
+ private static final Logger log = LoggerFactory.getLogger(PersistentEventConnection.class);
+
+
+ private RestConfContext ctx;
+ private AccessController parentCtrllr;
+ private Map<String, String> eventParaMap;
+
+ public PersistentEventConnection(String event_name,
+ String event_description,
+ boolean event_sseventUrlEmbed,
+ String event_sseventsField,
+ String event_sseventsUrl,
+ String event_subscriptionTemplate,
+ String event_unSubscriptionTemplate,
+ String event_ruleId,
+ AccessController parentCtrllr) {
+ this.event_name = event_name;
+ this.event_description = event_description;
+ this.event_sseventUrlEmbed = event_sseventUrlEmbed;
+ this.event_sseventsField = event_sseventsField;
+ this.event_sseventsUrl = event_sseventsUrl;
+ this.event_subscriptionTemplate = event_subscriptionTemplate;
+ this.event_unSubscriptionTemplate = event_unSubscriptionTemplate;
+ this.event_ruleId = event_ruleId;
+ this.state = EventConnectionState.INIT;
+
+ this.ctx = new RestConfContext();
+ for (String s : parentCtrllr.getCtx().getAttributeKeySet()) {
+ this.ctx.setAttribute(s, ctx.getAttribute(s));
+ }
+ this.parentCtrllr = parentCtrllr;
+ this.eventParaMap = new HashMap<>();
+ this.eventParaMap.putAll(parentCtrllr.getParaMap());
+ printEventParamMap();
+ log.info("New persistent connection created " + event_name);
+ }
+
+ @Override
+ public void run() {
+ Parameters p = null;
+ try {
+ modifyEventParamMap(Constants.KSETTING_REST_API_URL, getUriMethod(parentCtrllr.getProperties().authorizationEnabled())
+ + parentCtrllr.getCfgInfo().getController_restapiUrl()
+ + parentCtrllr.getCfgInfo().getController_subscriptionUrl());
+ modifyEventParamMap(Constants.KDEFAULT_TEMP_FILENAME, event_subscriptionTemplate);
+ modifyEventParamMap(Constants.KSETTING_REST_UNAME, parentCtrllr.getCfgInfo().getController_restapiUser());
+ modifyEventParamMap(Constants.KSETTING_REST_PASSWORD, parentCtrllr.getCfgInfo().getController_restapiPassword());
+ modifyEventParamMap(Constants.KSETTING_HTTP_METHOD, parentCtrllr.getCfgInfo().getController_subsMethod());
+
+ parentCtrllr.getRestApiCallNode().sendRequest(eventParaMap, ctx, null);
+ } catch (Exception e) {
+ log.error("Exception occured!", e);
+ Thread.currentThread().interrupt();
+ }
+
+ /* Retrieve url from result and construct SSE url */
+ if (event_sseventUrlEmbed) {
+ String key = getEventParamMapValue(Constants.KSETTING_RESP_PREFIX).concat(".").concat(event_sseventsField);
+ log.info("key " + key);
+ this.event_sseventsUrl = ctx.getAttribute(key);
+ }
+
+ log.info("SSE received url " + event_sseventsUrl);
+ try {
+ p = getParameters(eventParaMap);
+ } catch (Exception e) {
+ log.error("Exception occured!", e);
+ Thread.currentThread().interrupt();
+ }
+ printEventParamMap();
+ String url = getUriMethod(parentCtrllr.getProperties().authorizationEnabled()) +
+ parentCtrllr.getCfgInfo().getController_restapiUrl() + event_sseventsUrl;
+ Client client = ignoreSslClient().register(SseFeature.class);
+ WebTarget target = addAuthType(client, p).target(url);
+ String tokenId = getEventParamMapValue(Constants.KSETTING_TOKENID);
+ String headerName = "X-ACCESS-TOKEN";
+ if (tokenId == null) {
+ headerName = HttpHeaders.AUTHORIZATION;
+ tokenId = getAuthorizationToken(parentCtrllr.getCfgInfo().getController_restapiUser(),
+ parentCtrllr.getCfgInfo().getController_restapiPassword());
+ }
+ AdditionalHeaderWebTarget newTarget = new AdditionalHeaderWebTarget(target, tokenId, headerName);
+ EventSource eventSource = EventSource.target(newTarget).build();
+ eventSource.register(new DataChangeEventListener(this));
+ eventSource.open();
+ log.info("Connected to SSE source");
+ while (running) {
+ try {
+ log.info("SSE state " + eventSource.isOpen());
+ Thread.sleep(5000);
+ } catch (InterruptedException ie) {
+ log.info("Exception: " + ie.getMessage());
+ Thread.currentThread().interrupt();
+ running = false;
+ }
+ }
+ eventSource.close();
+ log.info("Closed connection to SSE source");
+ }
+
+ private String getAuthorizationToken(String userName, String password) {
+ return "Basic " + Base64.getEncoder().encodeToString((
+ userName + ":" + password).getBytes());
+ }
+
+ private Client ignoreSslClient() {
+ SSLContext sslcontext = null;
+
+ try {
+ sslcontext = SSLContext.getInstance("TLS");
+ sslcontext.init(null, new TrustManager[]{new X509TrustManager() {
+ @Override
+ public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
+ }
+
+ @Override
+ public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
+ }
+
+ @Override
+ public X509Certificate[] getAcceptedIssuers() {
+ return new X509Certificate[0];
+ }
+ }}, new java.security.SecureRandom());
+ } catch (NoSuchAlgorithmException | KeyManagementException e) {
+ throw new IllegalStateException(e);
+ }
+
+ return ClientBuilder.newBuilder().sslContext(sslcontext).hostnameVerifier((s1, s2) -> true).build();
+ }
+
+ public String getEvent_ruleId() {
+ return event_ruleId;
+ }
+
+ public void modifyEventParamMap(String fieldName, String value) {
+ eventParaMap.put(fieldName, value);
+ }
+
+ public String getEventParamMapValue(String fieldName) {
+ return eventParaMap.get(fieldName);
+ }
+
+ public void printEventParamMap() {
+ log.info("----------------Event Param Map-------------------");
+ for (String name : eventParaMap.keySet()) {
+ String value = eventParaMap.get(name);
+ log.info(name + " : " + value);
+ }
+ }
+}