Sonar Critical Fix
[dcaegen2/analytics/tca.git] / dcae-analytics-cdap-tca / src / main / java / org / onap / dcae / apod / analytics / cdap / tca / utils / CDAPTCAUtils.java
1 /*
2  * ===============================LICENSE_START======================================
3  *  dcae-analytics
4  * ================================================================================
5  *    Copyright © 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  *  Licensed under the Apache License, Version 2.0 (the "License");
8  *  you may not use this file except in compliance with the License.
9  *   You may obtain a copy of the License at
10  *
11  *          http://www.apache.org/licenses/LICENSE-2.0
12  *
13  *  Unless required by applicable law or agreed to in writing, software
14  *  distributed under the License is distributed on an "AS IS" BASIS,
15  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  *  See the License for the specific language governing permissions and
17  *  limitations under the License.
18  *  ============================LICENSE_END===========================================
19  */
20
21 package org.onap.dcae.apod.analytics.cdap.tca.utils;
22
23 import co.cask.cdap.api.RuntimeContext;
24 import com.google.common.base.Function;
25 import com.google.common.collect.Lists;
26 import org.apache.commons.lang3.StringUtils;
27 import org.onap.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfig;
28 import org.onap.dcae.apod.analytics.aai.domain.config.AAIHttpClientConfigBuilder;
29 import org.onap.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException;
30 import org.onap.dcae.apod.analytics.cdap.common.persistance.tca.TCAVESAlertEntity;
31 import org.onap.dcae.apod.analytics.cdap.tca.settings.TCAAppPreferences;
32 import org.onap.dcae.apod.analytics.cdap.tca.settings.TCAPolicyPreferences;
33 import org.onap.dcae.apod.analytics.cdap.tca.validator.TCAPolicyPreferencesValidator;
34 import org.onap.dcae.apod.analytics.cdap.tca.validator.TCAPreferencesValidator;
35 import org.onap.dcae.apod.analytics.common.AnalyticsConstants;
36 import org.onap.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException;
37 import org.onap.dcae.apod.analytics.model.config.tca.DMAAPInfo;
38 import org.onap.dcae.apod.analytics.model.config.tca.TCAControllerAppConfig;
39 import org.onap.dcae.apod.analytics.model.config.tca.TCAHandleIn;
40 import org.onap.dcae.apod.analytics.model.config.tca.TCAHandleOut;
41 import org.onap.dcae.apod.analytics.model.domain.policy.tca.TCAPolicy;
42 import org.onap.dcae.apod.analytics.tca.utils.TCAUtils;
43 import org.slf4j.Logger;
44 import org.slf4j.LoggerFactory;
45
46 import java.io.IOException;
47 import java.net.MalformedURLException;
48 import java.net.URL;
49 import java.util.Collection;
50 import java.util.List;
51 import java.util.Map;
52 import java.util.TreeMap;
53
54 import static com.google.common.collect.Lists.newArrayList;
55 import static org.onap.dcae.apod.analytics.cdap.common.utils.ValidationUtils.validateSettings;
56 import static org.onap.dcae.apod.analytics.common.AnalyticsConstants.TCA_POLICY_METRICS_PER_FUNCTIONAL_ROLE_PATH;
57
58 /**
59  * Utility Helper methods for CDAP TCA sub module.
60  *
61  * <p>
62  * @author Rajiv Singla . Creation Date: 10/24/2016.
63  */
64 public abstract class CDAPTCAUtils extends TCAUtils {
65
66     private static final Logger LOG = LoggerFactory.getLogger(CDAPTCAUtils.class);
67
68     /**
69      * Function that extracts alert message string from {@link TCAVESAlertEntity}
70      */
71     public static final Function<TCAVESAlertEntity, String> MAP_ALERT_ENTITY_TO_ALERT_STRING_FUNCTION =
72             new Function<TCAVESAlertEntity, String>() {
73                 @Override
74                 public String apply(TCAVESAlertEntity alertEntity) {
75                     return alertEntity == null ? null : alertEntity.getAlertMessage();
76                 }
77             };
78
79
80     /**
81      * Parses and validates Runtime Arguments to {@link TCAAppPreferences} object
82      *
83      * @param runtimeContext Runtime Context
84      *
85      * @return validated runtime arguments as {@link TCAAppPreferences} object
86      */
87     public static TCAAppPreferences getValidatedTCAAppPreferences(final RuntimeContext runtimeContext) {
88         // Parse runtime arguments
89         final Map<String, String> runtimeArguments = runtimeContext.getRuntimeArguments();
90         final TCAAppPreferences tcaAppPreferences =
91                 ANALYTICS_MODEL_OBJECT_MAPPER.convertValue(runtimeArguments, TCAAppPreferences.class);
92
93         final String appConfigString = runtimeContext.getApplicationSpecification().getConfiguration();
94
95         // populate DMaaP Information from App Config String
96         populateDMaaPInfoFromAppConfiguration(appConfigString, tcaAppPreferences);
97
98         // Validate runtime arguments
99         validateSettings(tcaAppPreferences, new TCAPreferencesValidator());
100
101         return tcaAppPreferences;
102     }
103
104     /**
105      * Creates an A&AI Http Client config from give {@link TCAAppPreferences}
106      *
107      * @param tcaAppPreferences TCA App Preferences
108      *
109      * @return A&AI Http Client config
110      */
111     public static AAIHttpClientConfig createAAIEnrichmentClientConfig(final TCAAppPreferences tcaAppPreferences) {
112         final String aaiEnrichmentProxyURLString = tcaAppPreferences.getAaiEnrichmentProxyURL();
113         URL aaiEnrichmentProxyURL = null;
114         if (StringUtils.isNotBlank(aaiEnrichmentProxyURLString)) {
115             aaiEnrichmentProxyURL = parseURL(aaiEnrichmentProxyURLString);
116         }
117
118         return new AAIHttpClientConfigBuilder(tcaAppPreferences.getAaiEnrichmentHost())
119                 .setAaiProtocol(tcaAppPreferences.getAaiEnrichmentProtocol())
120                 .setAaiHostPortNumber(tcaAppPreferences.getAaiEnrichmentPortNumber())
121                 .setAaiUserName(tcaAppPreferences.getAaiEnrichmentUserName())
122                 .setAaiUserPassword(tcaAppPreferences.getAaiEnrichmentUserPassword())
123                 .setAaiProxyURL(aaiEnrichmentProxyURL)
124                 .setAaiIgnoreSSLCertificateErrors(tcaAppPreferences.getAaiEnrichmentIgnoreSSLCertificateErrors())
125                 .build();
126     }
127
128     /**
129      * Populated App Preferences DMaaP Information from Application Config String
130      *
131      * @param appConfigString  CDAP Application config String
132      * @param tcaAppPreferences TCA App Preferences
133      */
134     private static void populateDMaaPInfoFromAppConfiguration(final String appConfigString,
135                                                               final TCAAppPreferences tcaAppPreferences) {
136
137         if (null != tcaAppPreferences.getSubscriberHostName() || null != tcaAppPreferences.getPublisherHostName()) {
138             LOG.info("DMaaP Information is set from runtime preferences. Skipping getting DMaaP info from App Config");
139             return;
140         }
141
142         LOG.info("Fetching DMaaP information from App Configuration String: {}", appConfigString);
143
144         try {
145             final TCAControllerAppConfig tcaControllerAppConfig =
146                     readValue(appConfigString, TCAControllerAppConfig.class);
147
148             // Parse Subscriber DMaaP information from App Config String
149             if (tcaControllerAppConfig.getStreamsSubscribes() != null &&
150                     tcaControllerAppConfig.getStreamsSubscribes().getTcaHandleIn() != null &&
151                     tcaControllerAppConfig.getStreamsSubscribes().getTcaHandleIn().getDmaapInfo() != null) {
152
153                 final DMAAPInfo subscriberDmaapInfo =
154                         tcaControllerAppConfig.getStreamsSubscribes().getTcaHandleIn().getDmaapInfo();
155                 LOG.debug("App Config Subscriber Host URL: {}", subscriberDmaapInfo.getTopicUrl());
156                 final URL subscriberUrl = parseURL(subscriberDmaapInfo.getTopicUrl());
157                 tcaAppPreferences.setSubscriberProtocol(subscriberUrl.getProtocol());
158                 tcaAppPreferences.setSubscriberHostName(subscriberUrl.getHost());
159                 final int subscriberUrlPort = subscriberUrl.getPort() != -1 ?
160                         subscriberUrl.getPort() : getDefaultDMaaPPort(subscriberUrl.getProtocol());
161                 tcaAppPreferences.setSubscriberHostPort(subscriberUrlPort);
162                 tcaAppPreferences.setSubscriberTopicName(subscriberUrl.getPath().substring(8));
163
164                 final TCAHandleIn tcaHandleIn = tcaControllerAppConfig.getStreamsSubscribes().getTcaHandleIn();
165                 tcaAppPreferences.setSubscriberUserName(tcaHandleIn.getAafUserName());
166                 tcaAppPreferences.setSubscriberUserPassword(tcaHandleIn.getAafPassword());
167             } else {
168                 LOG.warn("Unable to populate Subscriber DMaaP Information from App Config String: {}", appConfigString);
169             }
170
171
172             // Parse Publisher DMaaP information from App Config String
173             if (tcaControllerAppConfig.getStreamsPublishes() != null &&
174                     tcaControllerAppConfig.getStreamsPublishes().getTcaHandleOut() != null &&
175                     tcaControllerAppConfig.getStreamsPublishes().getTcaHandleOut().getDmaapInfo() != null) {
176
177                 final DMAAPInfo publisherDmaapInfo =
178                         tcaControllerAppConfig.getStreamsPublishes().getTcaHandleOut().getDmaapInfo();
179                 LOG.debug("App Config Publisher Host URL: {}", publisherDmaapInfo.getTopicUrl());
180                 final URL publisherUrl = parseURL(publisherDmaapInfo.getTopicUrl());
181                 tcaAppPreferences.setPublisherProtocol(publisherUrl.getProtocol());
182                 tcaAppPreferences.setPublisherHostName(publisherUrl.getHost());
183                 final int publisherUrlPort = publisherUrl.getPort() != -1 ?
184                         publisherUrl.getPort() : getDefaultDMaaPPort(publisherUrl.getProtocol());
185                 tcaAppPreferences.setPublisherHostPort(publisherUrlPort);
186                 tcaAppPreferences.setPublisherTopicName(publisherUrl.getPath().substring(8));
187
188                 final TCAHandleOut tcaHandleOut = tcaControllerAppConfig.getStreamsPublishes().getTcaHandleOut();
189                 tcaAppPreferences.setPublisherUserName(tcaHandleOut.getAafUserName());
190                 tcaAppPreferences.setPublisherUserPassword(tcaHandleOut.getAafPassword());
191             } else {
192                 LOG.warn("Unable to populate Publisher DMaaP Information from App Config String: {}", appConfigString);
193             }
194
195
196         } catch (IOException e) {
197             throw new CDAPSettingsException(
198                     "Unable to parse App Config to Json Object.Invalid App Config String: " + appConfigString, LOG, e);
199         }
200     }
201
202     /**
203      * Parses provided DMaaP MR URL string to {@link URL} object
204      *
205      * @param urlString url string
206      *
207      * @return url object
208      */
209     private static URL parseURL(final String urlString) {
210         try {
211             return new URL(urlString);
212         } catch (MalformedURLException e) {
213             final String errorMessage = String.format("Invalid URL format: %s", urlString);
214             throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e);
215         }
216     }
217
218     /**
219      * Sets up default DMaaP Port if not provided with DMaaP URL
220      *
221      * @param protocol protocol e.g. http or https
222      *
223      * @return default DMaaP MR port number
224      */
225     private static int getDefaultDMaaPPort(final String protocol) {
226         if ("http".equals(protocol)) {
227             return 3904;
228         } else if ("https".equals(protocol)) {
229             return 3905;
230         } else {
231             return 80;
232         }
233     }
234
235
236     /**
237      * Extracts alert message strings from {@link TCAVESAlertEntity}
238      *
239      * @param alertEntities collection of alert entities
240      *
241      * @return List of alert message strings
242      */
243     public static List<String> extractAlertFromAlertEntities(final Collection<TCAVESAlertEntity> alertEntities) {
244         return Lists.transform(newArrayList(alertEntities), MAP_ALERT_ENTITY_TO_ALERT_STRING_FUNCTION);
245     }
246
247
248     /**
249      * Converts Runtime Arguments to {@link TCAPolicyPreferences} object
250      *
251      * @param runtimeContext CDAP Runtime Arguments
252      *
253      * @return TCA Policy Preferences
254      */
255     public static TCAPolicy getValidatedTCAPolicyPreferences(final RuntimeContext runtimeContext) {
256
257         final Map<String, String> runtimeArguments = runtimeContext.getRuntimeArguments();
258         final TreeMap<String, String> sortedRuntimeArguments = new TreeMap<>(runtimeArguments);
259
260         LOG.debug("Printing all Received Runtime Arguments:");
261         for (Map.Entry<String, String> runtimeArgsEntry : sortedRuntimeArguments.entrySet()) {
262             LOG.debug("{}:{}", runtimeArgsEntry.getKey(), runtimeArgsEntry.getValue());
263         }
264
265         TCAPolicyPreferences tcaPolicyPreferences = new TCAPolicyPreferences();
266
267         final String tcaPolicyJsonString = sortedRuntimeArguments.get(AnalyticsConstants.TCA_POLICY_JSON_KEY);
268
269         if (StringUtils.isNotBlank(tcaPolicyJsonString)) {
270
271             LOG.info("TcaPolicy will be set from input argument name: {} as JSON String with value: {}",
272                     AnalyticsConstants.TCA_POLICY_JSON_KEY, tcaPolicyJsonString);
273
274             // initialize unquotedTCAPolicy
275             String unquotedTCAPolicy = tcaPolicyJsonString.trim();
276
277             //remove starting and ending quote from passed tca policy Json string if present
278             if (tcaPolicyJsonString.trim().startsWith(AnalyticsConstants.TCA_POLICY_STRING_DELIMITER) &&
279                     tcaPolicyJsonString.trim().endsWith(AnalyticsConstants.TCA_POLICY_STRING_DELIMITER)) {
280                 unquotedTCAPolicy = tcaPolicyJsonString.trim().substring(1, tcaPolicyJsonString.trim().length() - 1);
281             }
282
283             try {
284                 tcaPolicyPreferences = readValue(unquotedTCAPolicy , TCAPolicyPreferences.class);
285             } catch (IOException e) {
286                 throw new CDAPSettingsException(
287                         "Input tca_policy string format is not correct. tca_policy: " + tcaPolicyJsonString, LOG, e);
288             }
289
290         } else {  // classical controller is being used.  Validate preferences as received from classical controller
291
292             LOG.info("TcaPolicy is being parsed as key value pair from classical controller");
293
294             // extract TCA Policy Domain from Runtime Arguments
295             final String policyDomain = sortedRuntimeArguments.get(AnalyticsConstants.TCA_POLICY_DOMAIN_PATH);
296
297             // create new TCA Policy object
298             tcaPolicyPreferences.setDomain(policyDomain);
299
300             // filter out other non relevant fields which are not related to tca policy
301             final Map<String, String> tcaPolicyMap = filterMapByKeyNamePrefix(sortedRuntimeArguments,
302                     TCA_POLICY_METRICS_PER_FUNCTIONAL_ROLE_PATH);
303
304             // determine functional Roles
305             final Map<String, Map<String, String>> functionalRolesMap =
306                     extractSubTree(tcaPolicyMap, 2, 3, AnalyticsConstants.TCA_POLICY_DELIMITER);
307
308             // create metrics per functional role list
309             tcaPolicyPreferences.setMetricsPerEventName(
310                     createTCAPolicyMetricsPerEventNameList(functionalRolesMap));
311
312         }
313
314         // validate tca Policy Preferences
315         validateSettings(tcaPolicyPreferences, new TCAPolicyPreferencesValidator());
316
317         LOG.info("Printing Effective TCA Policy: {}", tcaPolicyPreferences);
318
319         return tcaPolicyPreferences;
320     }
321 }