[POLICY-122] Policy GUI Fixes
[policy/engine.git] / ECOMP-PDP-REST / src / main / java / org / openecomp / policy / pdp / rest / api / services / GetConfigService.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ECOMP-PDP-REST
4  * ================================================================================
5  * Copyright (C) 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 package org.openecomp.policy.pdp.rest.api.services;
21
22 import java.util.ArrayList;
23 import java.util.Arrays;
24 import java.util.Collection;
25 import java.util.HashMap;
26 import java.util.HashSet;
27 import java.util.List;
28 import java.util.Map;
29 import java.util.UUID;
30
31 import javax.json.Json;
32 import javax.json.JsonArrayBuilder;
33 import javax.json.JsonObject;
34 import javax.json.JsonObjectBuilder;
35
36 import org.openecomp.policy.api.ConfigRequestParameters;
37 import org.openecomp.policy.api.PolicyConfigException;
38 import org.openecomp.policy.api.PolicyConfigStatus;
39 import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
40 import org.openecomp.policy.common.logging.flexlogger.Logger;
41 import org.openecomp.policy.pdp.rest.api.models.PDPResponse;
42 import org.openecomp.policy.pdp.rest.api.models.PolicyConfig;
43 import org.openecomp.policy.xacml.api.XACMLErrorConstants;
44 import org.springframework.http.HttpStatus;
45
46 public class GetConfigService {
47     private static final Logger LOGGER = FlexLogger.getLogger(GetConfigService.class.getName());
48     
49     private ConfigRequestParameters configRequestParameters = null;
50     private String message = null;
51     private HttpStatus responseCode = HttpStatus.BAD_REQUEST;
52     private Collection<PolicyConfig> policyConfigs = null;
53     private boolean unique = false;
54     
55     public GetConfigService(ConfigRequestParameters configRequestParameters,
56             String requestID){
57         this.configRequestParameters = configRequestParameters;
58         if(configRequestParameters.getRequestID()==null){
59             UUID requestUUID = null;
60             if (requestID != null && !requestID.isEmpty()) {
61                 try {
62                     requestUUID = UUID.fromString(requestID);
63                 } catch (IllegalArgumentException e) {
64                     requestUUID = UUID.randomUUID();
65                     LOGGER.info("Generated Random UUID: " + requestUUID.toString(),e);
66                 }
67             }else{
68                 requestUUID = UUID.randomUUID();
69                 LOGGER.info("Generated Random UUID: " + requestUUID.toString());
70             }
71             this.configRequestParameters.setRequestID(requestUUID);
72         }
73         policyConfigs = new ArrayList<>();
74         try{
75             run();
76             specialCheck();
77         }catch(PolicyConfigException e){
78                 LOGGER.error(e);
79             PolicyConfig policyConfig = new PolicyConfig();
80             policyConfig.setPolicyConfigMessage(e.getMessage());
81             policyConfig.setPolicyConfigStatus(PolicyConfigStatus.CONFIG_NOT_FOUND);
82             policyConfigs.add(policyConfig);
83             responseCode = HttpStatus.BAD_REQUEST;
84         }
85     }
86     
87     private void specialCheck() {
88         if(policyConfigs==null || policyConfigs.isEmpty()){
89             responseCode = HttpStatus.BAD_REQUEST;
90         }else if(policyConfigs.size()==1){
91             for(PolicyConfig policyConfig: policyConfigs){
92                 if(policyConfig.getPolicyConfigMessage()!=null && policyConfig.getPolicyConfigMessage().contains("PE300")){
93                     responseCode = HttpStatus.BAD_REQUEST;
94                 }
95             }
96         }else{
97             responseCode = HttpStatus.OK;
98         }
99     }
100
101     private void run() throws PolicyConfigException{
102         // getValidation. 
103         if(!getValidation()){
104             LOGGER.error(message);
105             throw new PolicyConfigException(message);
106         }
107         // Generate Request. 
108         String modelString = getModel().toString();
109         LOGGER.debug("Generated JSON Request is: " + modelString);
110         if(configRequestParameters.getUnique()){
111             LOGGER.info("Requested for Unique Result only. ");
112             unique = true;
113         }
114         // Process Result. 
115         try {
116             PDPServices pdpServices = new PDPServices(); 
117             responseCode = HttpStatus.OK;
118             policyConfigs = configResult(pdpServices.generateRequest(modelString, configRequestParameters.getRequestID(), unique, false));
119             // Filter addition. 
120             policyConfigs = filterResults(policyConfigs, configRequestParameters);
121         } catch (Exception e) {
122             LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE + e);
123             responseCode = HttpStatus.BAD_REQUEST;
124             throw new PolicyConfigException(XACMLErrorConstants.ERROR_DATA_ISSUE +e);
125         }
126     }
127
128     private Collection<PolicyConfig> configResult(
129             Collection<PDPResponse> generateRequest) {
130         Collection<PolicyConfig> result = new HashSet<>();
131         if (generateRequest == null) {
132             return null;
133         }
134         if (!generateRequest.isEmpty()) {
135             for (PDPResponse stdStatus : generateRequest) {
136                 PolicyConfig policyConfig = new PolicyConfig();
137                 policyConfig.setConfig(stdStatus.getConfig());
138                 policyConfig.setMatchingConditions(stdStatus.getMatchingConditions());
139                 policyConfig.setPolicyConfigMessage(stdStatus.getPolicyConfigMessage());
140                 policyConfig.setPolicyConfigStatus(stdStatus.getPolicyConfigStatus());
141                 policyConfig.setPolicyName(stdStatus.getPolicyName());
142                 policyConfig.setPolicyVersion(stdStatus.getPolicyVersion());
143                 policyConfig.setProperty(stdStatus.getProperty());
144                 policyConfig.setResponseAttributes(stdStatus.getResponseAttributes());
145                 policyConfig.setType(stdStatus.getType());
146                 result.add(policyConfig);
147             }
148         }
149         return result;
150     }
151
152     // Filter logic required for results comparing with requests. 
153     private Collection<PolicyConfig> filterResults(
154             Collection<PolicyConfig> policyConfigs,
155             ConfigRequestParameters configRequestParameters) {
156         List<PolicyConfig> policyConfig = new ArrayList<>();
157         for(PolicyConfig config: policyConfigs){
158             if(config.getPolicyName()!=null && configRequestParameters.getPolicyName()!=null && configRequestParameters.getPolicyName().trim().length()>0){
159                 if(!config.getPolicyName().matches(configRequestParameters.getPolicyName())){
160                     continue;
161                 }
162             }
163             if(config.getMatchingConditions()!=null && config.getMatchingConditions().size()>0){
164                 if(configRequestParameters.getEcompName()!=null && configRequestParameters.getEcompName().trim().length()>0 && config.getMatchingConditions().containsKey("ECOMPName")){
165                     if(!config.getMatchingConditions().get("ECOMPName").matches(configRequestParameters.getEcompName())){
166                         continue;
167                     }
168                 }
169                 if(configRequestParameters.getConfigName()!=null && configRequestParameters.getConfigName().trim().length()>0 && config.getMatchingConditions().containsKey("ConfigName")){
170                     if(!config.getMatchingConditions().get("ConfigName").matches(configRequestParameters.getConfigName())){
171                         continue;
172                     }
173                 }
174                 if(configRequestParameters.getConfigAttributes()!=null && configRequestParameters.getConfigAttributes().size()>0){
175                     boolean flag = false; 
176                     for(String key: configRequestParameters.getConfigAttributes().keySet()){
177                         if(key.equals("RiskType")||key.equals("RiskLevel")||key.equals("guard")||key.equals("TTLDate")){
178                                 continue;
179                         }
180                         if(config.getMatchingConditions().containsKey(key)){
181                                 if(config.getMatchingConditions().get(key).contains(",")){
182                                         List<String> elements = Arrays.asList(config.getMatchingConditions().get(key).split(","));
183                                         if(!elements.contains(configRequestParameters.getConfigAttributes().get(key))){
184                                                 flag=true;
185                                         }
186                                 }else if(!config.getMatchingConditions().get(key).matches(configRequestParameters.getConfigAttributes().get(key))){
187                                 flag = true;
188                                 }
189                         }else{
190                                 flag = true;
191                         }
192                         if(flag){
193                                 break;
194                         }
195                     }
196                     if(flag){
197                         continue;
198                     }
199                 }
200             }
201             policyConfig.add(config);
202         }
203         if(policyConfig.isEmpty()){
204             PolicyConfig pConfig = new PolicyConfig();
205             pConfig.setPolicyConfigStatus(PolicyConfigStatus.CONFIG_NOT_FOUND);
206             pConfig.setPolicyConfigMessage(XACMLErrorConstants.ERROR_DATA_ISSUE+"No Match Found, for the parameters sent.");
207             policyConfig.add(pConfig);
208         }
209         return policyConfig;
210     }
211
212     private JsonObject getModel() throws PolicyConfigException{
213         String policyName = configRequestParameters.getPolicyName();
214         if(policyName!= null && !policyName.trim().isEmpty() && !policyName.endsWith("xml")){
215             policyName = policyName + ".[\\d].*";
216             configRequestParameters.setPolicyName(policyName);
217         }
218         JsonArrayBuilder subjectArray = Json.createArrayBuilder();
219         JsonArrayBuilder resourceArray = Json.createArrayBuilder();
220         if(configRequestParameters.getPolicyName()!=null){
221             JsonObjectBuilder subjectBuilder = Json.createObjectBuilder();
222             subjectBuilder.add("Value", policyName);
223             subjectBuilder.add("AttributeId", "PolicyName");
224             subjectArray.add(subjectBuilder);
225         }else{
226             LOGGER.info("PolicyName values are not given. ");
227         }
228         if(configRequestParameters.getEcompName()!=null){
229             JsonObjectBuilder subjectBuilder = Json.createObjectBuilder();
230             subjectBuilder.add("Value", configRequestParameters.getEcompName());
231             subjectBuilder.add("AttributeId", "ECOMPName");
232             subjectArray.add(subjectBuilder);
233             if(configRequestParameters.getConfigName()!=null){
234                 subjectBuilder = Json.createObjectBuilder();
235                 subjectBuilder.add("Value", configRequestParameters.getConfigName());
236                 subjectBuilder.add("AttributeId", "ConfigName");
237                 subjectArray.add(subjectBuilder);
238                 resourceArray = getResourceArray(configRequestParameters.getConfigAttributes());
239             }else{
240                 LOGGER.info("Config Name is not given. ");
241             }
242         }else{
243             LOGGER.info("Ecomp Name is not given. ");
244         }
245         return Json.createObjectBuilder()
246                 .add("Request",Json.createObjectBuilder()
247                                 .add("AccessSubject",Json.createObjectBuilder()
248                                                 .add("Attribute",subjectArray))
249                                 .add("Action",Json.createObjectBuilder()
250                                                 .add("Attribute",Json.createObjectBuilder()
251                                                                 .add("Value","ACCESS")
252                                                                 .add("AttributeId","urn:oasis:names:tc:xacml:1.0:action:action-id")))
253                                 .add("Resource",Json.createObjectBuilder()
254                                                 .add("Attribute",resourceArray
255                                                                 .add(Json.createObjectBuilder()
256                                                                         .add("Value","Config")
257                                                                         .add("AttributeId","urn:oasis:names:tc:xacml:1.0:resource:resource-id")))))
258                 .build();
259     }
260     
261     private JsonArrayBuilder getResourceArray(Map<String, String> configAttributes) throws PolicyConfigException{
262         JsonArrayBuilder resourceArray = Json.createArrayBuilder();
263         configAttributes = configRequestParameters.getConfigAttributes();
264         if (configAttributes != null && !configAttributes.isEmpty()) {
265             if(!configAttributes.containsKey("RiskType")){
266                 configAttributes.put("RiskType", ".*");
267             }
268             if(!configAttributes.containsKey("RiskLevel")){
269                 configAttributes.put("RiskLevel", ".*");
270             }
271             if(!configAttributes.containsKey("guard")){
272                 configAttributes.put("guard", ".*");
273             }
274             if(!configAttributes.containsKey("TTLDate")){
275                 configAttributes.put("TTLDate", ".*");
276             }
277         }else{
278             // ConfigAttributes is Null. So add basic values.
279             configAttributes = new HashMap<>();
280             configAttributes.put("RiskType", ".*");
281             configAttributes.put("RiskLevel", ".*");
282             configAttributes.put("guard", ".*");
283             configAttributes.put("TTLDate", ".*");
284         }
285         for (String key : configAttributes.keySet()) {
286             if (key.isEmpty()) {
287                 String message = XACMLErrorConstants.ERROR_DATA_ISSUE + "Cannot have an Empty Key";
288                 LOGGER.error(message);
289                 throw new PolicyConfigException(message);
290             }
291             JsonObjectBuilder resourceBuilder = Json.createObjectBuilder();
292             resourceBuilder.add("Value", configAttributes.get(key));
293             resourceBuilder.add("AttributeId", key);
294             resourceArray.add(resourceBuilder);
295         }
296         return resourceArray;
297     }
298     
299     private Boolean getValidation(){
300         if(configRequestParameters==null){
301             message = XACMLErrorConstants.ERROR_DATA_ISSUE + "No config Request Parameters given.";
302             return false;
303         }
304         if(configRequestParameters.getEcompName()==null && configRequestParameters.getPolicyName()==null){
305             message = XACMLErrorConstants.ERROR_DATA_ISSUE + "Cannot proceed without eCOMPComponentName or PolicyName";
306             return false;
307         }
308         return true;
309     }
310
311     public Collection<PolicyConfig> getResult() {
312         return policyConfigs;
313     }
314
315     public HttpStatus getResponseCode() {
316         return responseCode;
317     }
318 }