2 * ============LICENSE_START=======================================================
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
20 package org.onap.policy.pdp.rest.api.services;
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;
29 import java.util.UUID;
31 import javax.json.Json;
32 import javax.json.JsonArrayBuilder;
33 import javax.json.JsonObject;
34 import javax.json.JsonObjectBuilder;
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;
47 public class GetConfigService {
48 private static final Logger LOGGER = FlexLogger.getLogger(GetConfigService.class.getName());
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;
56 public GetConfigService(ConfigRequestParameters configRequestParameters,
58 this.configRequestParameters = configRequestParameters;
59 if(configRequestParameters.getRequestID()==null){
60 UUID requestUUID = null;
61 if (requestID != null && !requestID.isEmpty()) {
63 requestUUID = UUID.fromString(requestID);
64 } catch (IllegalArgumentException e) {
65 requestUUID = UUID.randomUUID();
66 LOGGER.info("Generated Random UUID: " + requestUUID.toString(),e);
69 requestUUID = UUID.randomUUID();
70 LOGGER.info("Generated Random UUID: " + requestUUID.toString());
72 this.configRequestParameters.setRequestID(requestUUID);
74 policyConfigs = new ArrayList<>();
78 }catch(PolicyConfigException 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;
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;
98 responseCode = HttpStatus.OK;
102 private void run() throws PolicyConfigException{
104 if(!getValidation()){
105 LOGGER.error(message);
106 throw new PolicyConfigException(message);
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. ");
117 PDPServices pdpServices = new PDPServices();
118 responseCode = HttpStatus.OK;
119 policyConfigs = configResult(pdpServices.generateRequest(modelString, configRequestParameters.getRequestID(), unique, false));
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);
129 private Collection<PolicyConfig> configResult(
130 Collection<PDPResponse> generateRequest) {
131 Collection<PolicyConfig> result = new HashSet<>();
132 if (generateRequest == null) {
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);
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('.'));
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;
185 public PolicyConfigType extendedServices(String policyName) {
186 // For extended services policyName will be required.
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())){
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())){
207 if(configRequestParameters.getConfigName()!=null && configRequestParameters.getConfigName().trim().length()>0 && config.getMatchingConditions().containsKey("ConfigName")){
208 if(!config.getMatchingConditions().get("ConfigName").matches(configRequestParameters.getConfigName())){
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")){
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))){
224 }else if(!config.getMatchingConditions().get(key).matches(configRequestParameters.getConfigAttributes().get(key))){
239 policyConfig.add(config);
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);
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);
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);
264 LOGGER.info("PolicyName values are not given. ");
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());
278 LOGGER.info("Config Name is not given. ");
281 LOGGER.info("Onap Name is not given. ");
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")))))
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", ".*");
306 if(!configAttributes.containsKey("RiskLevel")){
307 configAttributes.put("RiskLevel", ".*");
309 if(!configAttributes.containsKey("guard")){
310 configAttributes.put("guard", ".*");
312 if(!configAttributes.containsKey("TTLDate")){
313 configAttributes.put("TTLDate", ".*");
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", ".*");
323 for (String key : configAttributes.keySet()) {
325 String message = XACMLErrorConstants.ERROR_DATA_ISSUE + "Cannot have an Empty Key";
326 LOGGER.error(message);
327 throw new PolicyConfigException(message);
329 JsonObjectBuilder resourceBuilder = Json.createObjectBuilder();
330 resourceBuilder.add("Value", configAttributes.get(key));
331 resourceBuilder.add("AttributeId", key);
332 resourceArray.add(resourceBuilder);
334 return resourceArray;
337 private Boolean getValidation(){
338 if(configRequestParameters==null){
339 message = XACMLErrorConstants.ERROR_DATA_ISSUE + "No config Request Parameters given.";
342 if(configRequestParameters.getOnapName()==null && configRequestParameters.getPolicyName()==null){
343 message = XACMLErrorConstants.ERROR_DATA_ISSUE + "Cannot proceed without onapName or PolicyName";
349 public Collection<PolicyConfig> getResult() {
350 return policyConfigs;
353 public HttpStatus getResponseCode() {