Bump monitoring app code coverage
[policy/xacml-pdp.git] / applications / monitoring / src / main / java / org / onap / policy / xacml / pdp / application / monitoring / MonitoringPdpApplication.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP
4  * ================================================================================
5  * Copyright (C) 2019-2020 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  *
19  * SPDX-License-Identifier: Apache-2.0
20  * ============LICENSE_END=========================================================
21  */
22
23 package org.onap.policy.xacml.pdp.application.monitoring;
24
25 import com.att.research.xacml.api.Request;
26 import com.att.research.xacml.api.Response;
27 import java.util.ArrayList;
28 import java.util.Arrays;
29 import java.util.List;
30 import java.util.Map;
31 import java.util.Map.Entry;
32 import org.apache.commons.lang3.tuple.Pair;
33 import org.onap.policy.models.decisions.concepts.DecisionRequest;
34 import org.onap.policy.models.decisions.concepts.DecisionResponse;
35 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier;
36 import org.onap.policy.pdp.xacml.application.common.ToscaPolicyTranslator;
37 import org.onap.policy.pdp.xacml.application.common.std.StdCombinedPolicyResultsTranslator;
38 import org.onap.policy.pdp.xacml.application.common.std.StdXacmlApplicationServiceProvider;
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
41
42 /**
43  * This is the engine class that manages the instance of the XACML PDP engine.
44  *
45  * <p>It is responsible for initializing it and shutting it down properly in a thread-safe manner.
46  *
47  *
48  * @author pameladragosh
49  *
50  */
51 public class MonitoringPdpApplication extends StdXacmlApplicationServiceProvider {
52     private static final Logger LOGGER = LoggerFactory.getLogger(MonitoringPdpApplication.class);
53
54     public static final String ONAP_MONITORING_BASE_POLICY_TYPE = "onap.Monitoring";
55     public static final String ONAP_MONITORING_CDAP = "onap.policies.monitoring.cdap.tca.hi.lo.app";
56     public static final String ONAP_MONITORING_APPSERVER =
57             "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server";
58     public static final String ONAP_MONITORING_SONHANDLER = "onap.policies.monitoring.docker.sonhandler.app";
59     public static final String ONAP_MONITORING_DERIVED_POLICY_TYPE = "onap.policies.monitoring.";
60
61     public static final String VERSION_100 = "1.0.0";
62
63     private StdCombinedPolicyResultsTranslator translator = new StdCombinedPolicyResultsTranslator();
64     private List<ToscaPolicyTypeIdentifier> supportedPolicyTypes = new ArrayList<>();
65
66     /**
67      * Constructor.
68      */
69     public MonitoringPdpApplication() {
70         //
71         // By default this supports just Monitoring policy types
72         //
73         supportedPolicyTypes.add(new ToscaPolicyTypeIdentifier(ONAP_MONITORING_BASE_POLICY_TYPE, VERSION_100));
74         supportedPolicyTypes.add(new ToscaPolicyTypeIdentifier(ONAP_MONITORING_CDAP, VERSION_100));
75         supportedPolicyTypes.add(new ToscaPolicyTypeIdentifier(ONAP_MONITORING_APPSERVER, VERSION_100));
76         supportedPolicyTypes.add(new ToscaPolicyTypeIdentifier(ONAP_MONITORING_SONHANDLER, VERSION_100));
77     }
78
79     @Override
80     public String applicationName() {
81         return "monitoring";
82     }
83
84     @Override
85     public List<String> actionDecisionsSupported() {
86         return Arrays.asList("configure");
87     }
88
89     @Override
90     public synchronized List<ToscaPolicyTypeIdentifier> supportedPolicyTypes() {
91         return supportedPolicyTypes;
92     }
93
94     @Override
95     public boolean canSupportPolicyType(ToscaPolicyTypeIdentifier policyTypeId) {
96         //
97         // For Monitoring, we will attempt to support all versions
98         // of the policy type. Since we are only packaging a decision
99         // back with a JSON payload of the property contents.
100         //
101         return (policyTypeId.getName().equals(ONAP_MONITORING_BASE_POLICY_TYPE)
102                 || policyTypeId.getName().equals(ONAP_MONITORING_CDAP)
103                 || policyTypeId.getName().equals(ONAP_MONITORING_APPSERVER)
104                 || policyTypeId.getName().equals(ONAP_MONITORING_SONHANDLER)
105                 || policyTypeId.getName().startsWith(ONAP_MONITORING_DERIVED_POLICY_TYPE));
106     }
107
108     @Override
109     public Pair<DecisionResponse, Response> makeDecision(DecisionRequest request,
110             Map<String, String[]> requestQueryParams) {
111         //
112         // Convert to a XacmlRequest
113         //
114         Request xacmlRequest = this.getTranslator().convertRequest(request);
115         //
116         // Now get a decision
117         //
118         Response xacmlResponse = this.xacmlDecision(xacmlRequest);
119         //
120         // Convert to a DecisionResponse
121         //
122         DecisionResponse decisionResponse = this.getTranslator().convertResponse(xacmlResponse);
123         //
124         // Abbreviate results if needed
125         //
126         if (checkAbbreviateResults(requestQueryParams) && decisionResponse.getPolicies() != null) {
127             LOGGER.info("Abbreviating decision results {}", decisionResponse);
128             for (Entry<String, Object> entry : decisionResponse.getPolicies().entrySet()) {
129                 //
130                 // DecisionResponse policies will always be a map
131                 //
132                 @SuppressWarnings("unchecked")
133                 Map<String, Object> policy = (Map<String, Object>) entry.getValue();
134                 policy.remove("type_version");
135                 policy.remove("properties");
136                 policy.remove("name");
137                 policy.remove("version");
138             }
139         }
140         return Pair.of(decisionResponse, xacmlResponse);
141     }
142
143     @Override
144     protected ToscaPolicyTranslator getTranslator(String type) {
145         return translator;
146     }
147
148     /**
149      * Checks the query parameters to determine whether the decision results should be abbreviated.
150      *
151      * @param queryParams - http request query parameters
152      */
153     private boolean checkAbbreviateResults(Map<String, String[]> queryParams) {
154         if (queryParams != null && !queryParams.isEmpty()) {
155             // Check if query params contains "abbrev" flag
156             if (queryParams.containsKey("abbrev")) {
157                 return Arrays.asList(queryParams.get("abbrev")).contains("true");
158             } else {
159                 LOGGER.info("Unsupported query param for Monitoring application: {}", queryParams);
160                 return false;
161             }
162         }
163         LOGGER.info("Query parameters empty");
164         return false;
165     }
166 }