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