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