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