2 * ===============================LICENSE_START======================================
\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
11 * http://www.apache.org/licenses/LICENSE-2.0
\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
21 package org.openecomp.dcae.apod.analytics.cdap.tca.utils;
\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
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
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
59 * Utility Helper methods for CDAP TCA sub module.
\r
62 * @author Rajiv Singla . Creation Date: 10/24/2016.
\r
64 public abstract class CDAPTCAUtils extends TCAUtils {
\r
66 private static final Logger LOG = LoggerFactory.getLogger(CDAPTCAUtils.class);
\r
69 * Function that extracts alert message string from {@link TCAVESAlertEntity}
\r
71 public static final Function<TCAVESAlertEntity, String> MAP_ALERT_ENTITY_TO_ALERT_STRING_FUNCTION =
\r
72 new Function<TCAVESAlertEntity, String>() {
\r
74 public String apply(TCAVESAlertEntity alertEntity) {
\r
75 return alertEntity == null ? null : alertEntity.getAlertMessage();
\r
81 * Parses and validates Runtime Arguments to {@link TCAAppPreferences} object
\r
83 * @param runtimeContext Runtime Context
\r
85 * @return validated runtime arguments as {@link TCAAppPreferences} object
\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
93 final String appConfigString = runtimeContext.getApplicationSpecification().getConfiguration();
\r
95 // populate DMaaP Information from App Config String
\r
96 populateDMaaPInfoFromAppConfiguration(appConfigString, tcaAppPreferences);
\r
98 // Validate runtime arguments
\r
99 validateSettings(tcaAppPreferences, new TCAPreferencesValidator());
\r
101 return tcaAppPreferences;
\r
105 * Creates an A&AI Http Client config from give {@link TCAAppPreferences}
\r
107 * @param tcaAppPreferences TCA App Preferences
\r
109 * @return A&AI Http Client config
\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
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
129 * Populated App Preferences DMaaP Information from Application Config String
\r
131 * @param appConfigString CDAP Application config String
\r
132 * @param tcaAppPreferences TCA App Preferences
\r
134 private static void populateDMaaPInfoFromAppConfiguration(final String appConfigString,
\r
135 final TCAAppPreferences tcaAppPreferences) {
\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
142 LOG.info("Fetching DMaaP information from App Configuration String: {}", appConfigString);
\r
145 final TCAControllerAppConfig tcaControllerAppConfig =
\r
146 readValue(appConfigString, TCAControllerAppConfig.class);
\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
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
164 final TCAHandleIn tcaHandleIn = tcaControllerAppConfig.getStreamsSubscribes().getTcaHandleIn();
\r
165 tcaAppPreferences.setSubscriberUserName(tcaHandleIn.getAafUserName());
\r
166 tcaAppPreferences.setSubscriberUserPassword(tcaHandleIn.getAafPassword());
\r
168 LOG.warn("Unable to populate Subscriber DMaaP Information from App Config String: {}", appConfigString);
\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
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
188 final TCAHandleOut tcaHandleOut = tcaControllerAppConfig.getStreamsPublishes().getTcaHandleOut();
\r
189 tcaAppPreferences.setPublisherUserName(tcaHandleOut.getAafUserName());
\r
190 tcaAppPreferences.setPublisherUserPassword(tcaHandleOut.getAafPassword());
\r
192 LOG.warn("Unable to populate Publisher DMaaP Information from App Config String: {}", appConfigString);
\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
203 * Parses provided DMaaP MR URL string to {@link URL} object
\r
205 * @param urlString url string
\r
207 * @return url object
\r
209 private static URL parseURL(final String urlString) {
\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
219 * Sets up default DMaaP Port if not provided with DMaaP URL
\r
221 * @param protocol protocol e.g. http or https
\r
223 * @return default DMaaP MR port number
\r
225 private static int getDefaultDMaaPPort(final String protocol) {
\r
226 if ("http".equals(protocol)) {
\r
228 } else if ("https".equals(protocol)) {
\r
237 * Extracts alert message strings from {@link TCAVESAlertEntity}
\r
239 * @param alertEntities collection of alert entities
\r
241 * @return List of alert message strings
\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
249 * Converts Runtime Arguments to {@link TCAPolicyPreferences} object
\r
251 * @param runtimeContext CDAP Runtime Arguments
\r
253 * @return TCA Policy Preferences
\r
255 public static TCAPolicy getValidatedTCAPolicyPreferences(final RuntimeContext runtimeContext) {
\r
257 final Map<String, String> runtimeArguments = runtimeContext.getRuntimeArguments();
\r
258 final TreeMap<String, String> sortedRuntimeArguments = new TreeMap<>(runtimeArguments);
\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
265 TCAPolicyPreferences tcaPolicyPreferences = new TCAPolicyPreferences();
\r
267 final String tcaPolicyJsonString = sortedRuntimeArguments.get(AnalyticsConstants.TCA_POLICY_JSON_KEY);
\r
269 if (StringUtils.isNotBlank(tcaPolicyJsonString)) {
\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
274 // initialize unquotedTCAPolicy
\r
275 String unquotedTCAPolicy = tcaPolicyJsonString.trim();
\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
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
290 } else { // classical controller is being used. Validate preferences as received from classical controller
\r
292 LOG.info("TcaPolicy is being parsed as key value pair from classical controller");
\r
294 // extract TCA Policy Domain from Runtime Arguments
\r
295 final String policyDomain = sortedRuntimeArguments.get(AnalyticsConstants.TCA_POLICY_DOMAIN_PATH);
\r
297 // create new TCA Policy object
\r
298 tcaPolicyPreferences.setDomain(policyDomain);
\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
304 // determine functional Roles
\r
305 final Map<String, Map<String, String>> functionalRolesMap =
\r
306 extractSubTree(tcaPolicyMap, 2, 3, AnalyticsConstants.TCA_POLICY_DELIMITER);
\r
308 // create metrics per functional role list
\r
309 tcaPolicyPreferences.setMetricsPerEventName(
\r
310 createTCAPolicyMetricsPerEventNameList(functionalRolesMap));
\r
314 // validate tca Policy Preferences
\r
315 validateSettings(tcaPolicyPreferences, new TCAPolicyPreferencesValidator());
\r
317 LOG.info("Printing Effective TCA Policy: {}", tcaPolicyPreferences);
\r
319 return tcaPolicyPreferences;
\r