986c3010401f70204aa88b3d3540cafc9d904386
[dcaegen2/analytics/tca.git] /
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         }\r
140 \r
141         LOG.info("Fetching DMaaP information from App Configuration String: {}", appConfigString);\r
142 \r
143         try {\r
144             final TCAControllerAppConfig tcaControllerAppConfig =\r
145                     readValue(appConfigString, TCAControllerAppConfig.class);\r
146 \r
147             // Parse Subscriber DMaaP information from App Config String\r
148             if (tcaControllerAppConfig.getStreamsSubscribes() != null &&\r
149                     tcaControllerAppConfig.getStreamsSubscribes().getTcaHandleIn() != null &&\r
150                     tcaControllerAppConfig.getStreamsSubscribes().getTcaHandleIn().getDmaapInfo() != null) {\r
151 \r
152                 final DMAAPInfo subscriberDmaapInfo =\r
153                         tcaControllerAppConfig.getStreamsSubscribes().getTcaHandleIn().getDmaapInfo();\r
154                 LOG.debug("App Config Subscriber Host URL: {}", subscriberDmaapInfo.getTopicUrl());\r
155                 final URL subscriberUrl = parseURL(subscriberDmaapInfo.getTopicUrl());\r
156                 tcaAppPreferences.setSubscriberProtocol(subscriberUrl.getProtocol());\r
157                 tcaAppPreferences.setSubscriberHostName(subscriberUrl.getHost());\r
158                 final int subscriberUrlPort = subscriberUrl.getPort() != -1 ?\r
159                         subscriberUrl.getPort() : getDefaultDMaaPPort(subscriberUrl.getProtocol());\r
160                 tcaAppPreferences.setSubscriberHostPort(subscriberUrlPort);\r
161                 tcaAppPreferences.setSubscriberTopicName(subscriberUrl.getPath().substring(8));\r
162 \r
163                 final TCAHandleIn tcaHandleIn = tcaControllerAppConfig.getStreamsSubscribes().getTcaHandleIn();\r
164                 tcaAppPreferences.setSubscriberUserName(tcaHandleIn.getAafUserName());\r
165                 tcaAppPreferences.setSubscriberUserPassword(tcaHandleIn.getAafPassword());\r
166             } else {\r
167                 LOG.warn("Unable to populate Subscriber DMaaP Information from App Config String: {}", appConfigString);\r
168             }\r
169 \r
170 \r
171             // Parse Publisher DMaaP information from App Config String\r
172             if (tcaControllerAppConfig.getStreamsPublishes() != null &&\r
173                     tcaControllerAppConfig.getStreamsPublishes().getTcaHandleOut() != null &&\r
174                     tcaControllerAppConfig.getStreamsPublishes().getTcaHandleOut().getDmaapInfo() != null) {\r
175 \r
176                 final DMAAPInfo publisherDmaapInfo =\r
177                         tcaControllerAppConfig.getStreamsPublishes().getTcaHandleOut().getDmaapInfo();\r
178                 LOG.debug("App Config Publisher Host URL: {}", publisherDmaapInfo.getTopicUrl());\r
179                 final URL publisherUrl = parseURL(publisherDmaapInfo.getTopicUrl());\r
180                 tcaAppPreferences.setPublisherProtocol(publisherUrl.getProtocol());\r
181                 tcaAppPreferences.setPublisherHostName(publisherUrl.getHost());\r
182                 final int publisherUrlPort = publisherUrl.getPort() != -1 ?\r
183                         publisherUrl.getPort() : getDefaultDMaaPPort(publisherUrl.getProtocol());\r
184                 tcaAppPreferences.setPublisherHostPort(publisherUrlPort);\r
185                 tcaAppPreferences.setPublisherTopicName(publisherUrl.getPath().substring(8));\r
186 \r
187                 final TCAHandleOut tcaHandleOut = tcaControllerAppConfig.getStreamsPublishes().getTcaHandleOut();\r
188                 tcaAppPreferences.setPublisherUserName(tcaHandleOut.getAafUserName());\r
189                 tcaAppPreferences.setPublisherUserPassword(tcaHandleOut.getAafPassword());\r
190             } else {\r
191                 LOG.warn("Unable to populate Publisher DMaaP Information from App Config String: {}", appConfigString);\r
192             }\r
193 \r
194 \r
195         } catch (IOException e) {\r
196             throw new CDAPSettingsException(\r
197                     "Unable to parse App Config to Json Object.Invalid App Config String: " + appConfigString, LOG, e);\r
198         }\r
199     }\r
200 \r
201     /**\r
202      * Parses provided DMaaP MR URL string to {@link URL} object\r
203      *\r
204      * @param urlString url string\r
205      *\r
206      * @return url object\r
207      */\r
208     private static URL parseURL(final String urlString) {\r
209         try {\r
210             return new URL(urlString);\r
211         } catch (MalformedURLException e) {\r
212             final String errorMessage = String.format("Invalid URL format: %s", urlString);\r
213             throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e);\r
214         }\r
215     }\r
216 \r
217     /**\r
218      * Sets up default DMaaP Port if not provided with DMaaP URL\r
219      *\r
220      * @param protocol protocol e.g. http or https\r
221      *\r
222      * @return default DMaaP MR port number\r
223      */\r
224     private static int getDefaultDMaaPPort(final String protocol) {\r
225         if ("http".equals(protocol)) {\r
226             return 3904;\r
227         } else if ("https".equals(protocol)) {\r
228             return 3905;\r
229         } else {\r
230             return 80;\r
231         }\r
232     }\r
233 \r
234 \r
235     /**\r
236      * Extracts alert message strings from {@link TCAVESAlertEntity}\r
237      *\r
238      * @param alertEntities collection of alert entities\r
239      *\r
240      * @return List of alert message strings\r
241      */\r
242     public static List<String> extractAlertFromAlertEntities(final Collection<TCAVESAlertEntity> alertEntities) {\r
243         return Lists.transform(newArrayList(alertEntities), MAP_ALERT_ENTITY_TO_ALERT_STRING_FUNCTION);\r
244     }\r
245 \r
246 \r
247     /**\r
248      * Converts Runtime Arguments to {@link TCAPolicyPreferences} object\r
249      *\r
250      * @param runtimeContext CDAP Runtime Arguments\r
251      *\r
252      * @return TCA Policy Preferences\r
253      */\r
254     public static TCAPolicy getValidatedTCAPolicyPreferences(final RuntimeContext runtimeContext) {\r
255 \r
256         final Map<String, String> runtimeArguments = runtimeContext.getRuntimeArguments();\r
257         final TreeMap<String, String> sortedRuntimeArguments = new TreeMap<>(runtimeArguments);\r
258 \r
259         LOG.debug("Printing all Received Runtime Arguments:");\r
260         for (Map.Entry<String, String> runtimeArgsEntry : sortedRuntimeArguments.entrySet()) {\r
261             LOG.debug("{}:{}", runtimeArgsEntry.getKey(), runtimeArgsEntry.getValue());\r
262         }\r
263 \r
264         TCAPolicyPreferences tcaPolicyPreferences = new TCAPolicyPreferences();\r
265 \r
266         final String tcaPolicyJsonString = sortedRuntimeArguments.get(AnalyticsConstants.TCA_POLICY_JSON_KEY);\r
267 \r
268         if (StringUtils.isNotBlank(tcaPolicyJsonString)) {\r
269 \r
270             LOG.info("TcaPolicy will be set from input argument name: {} as JSON String with value: {}",\r
271                     AnalyticsConstants.TCA_POLICY_JSON_KEY, tcaPolicyJsonString);\r
272 \r
273             // initialize unquotedTCAPolicy\r
274             String unquotedTCAPolicy = tcaPolicyJsonString.trim();\r
275 \r
276             //remove starting and ending quote from passed tca policy Json string if present\r
277             if (tcaPolicyJsonString.trim().startsWith(AnalyticsConstants.TCA_POLICY_STRING_DELIMITER) &&\r
278                     tcaPolicyJsonString.trim().endsWith(AnalyticsConstants.TCA_POLICY_STRING_DELIMITER)) {\r
279                 unquotedTCAPolicy = tcaPolicyJsonString.trim().substring(1, tcaPolicyJsonString.trim().length() - 1);\r
280             }\r
281 \r
282             try {\r
283                 tcaPolicyPreferences = readValue(unquotedTCAPolicy , TCAPolicyPreferences.class);\r
284             } catch (IOException e) {\r
285                 throw new CDAPSettingsException(\r
286                         "Input tca_policy string format is not correct. tca_policy: " + tcaPolicyJsonString, LOG, e);\r
287             }\r
288 \r
289         } else {  // classical controller is being used.  Validate preferences as received from classical controller\r
290 \r
291             LOG.info("TcaPolicy is being parsed as key value pair from classical controller");\r
292 \r
293             // extract TCA Policy Domain from Runtime Arguments\r
294             final String policyDomain = sortedRuntimeArguments.get(AnalyticsConstants.TCA_POLICY_DOMAIN_PATH);\r
295 \r
296             // create new TCA Policy object\r
297             tcaPolicyPreferences.setDomain(policyDomain);\r
298 \r
299             // filter out other non relevant fields which are not related to tca policy\r
300             final Map<String, String> tcaPolicyMap = filterMapByKeyNamePrefix(sortedRuntimeArguments,\r
301                     TCA_POLICY_METRICS_PER_FUNCTIONAL_ROLE_PATH);\r
302 \r
303             // determine functional Roles\r
304             final Map<String, Map<String, String>> functionalRolesMap =\r
305                     extractSubTree(tcaPolicyMap, 2, 3, AnalyticsConstants.TCA_POLICY_DELIMITER);\r
306 \r
307             // create metrics per functional role list\r
308             tcaPolicyPreferences.setMetricsPerEventName(\r
309                     createTCAPolicyMetricsPerEventNameList(functionalRolesMap));\r
310 \r
311         }\r
312 \r
313         // validate tca Policy Preferences\r
314         validateSettings(tcaPolicyPreferences, new TCAPolicyPreferencesValidator());\r
315 \r
316         LOG.info("Printing Effective TCA Policy: {}", tcaPolicyPreferences);\r
317 \r
318         return tcaPolicyPreferences;\r
319     }\r
320 }\r