Commit includes ControlLoopPolicy API and bugfixes
[policy/engine.git] / ECOMP-PDP-REST / src / main / java / org / openecomp / policy / pdp / rest / api / services / GetDecisionService.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.Collection;
23 import java.util.Map;
24 import java.util.UUID;
25
26 import javax.json.Json;
27 import javax.json.JsonArrayBuilder;
28 import javax.json.JsonObject;
29 import javax.json.JsonObjectBuilder;
30
31 import org.openecomp.policy.api.DecisionRequestParameters;
32 import org.openecomp.policy.api.DecisionResponse;
33 import org.openecomp.policy.api.PolicyDecision;
34 import org.openecomp.policy.api.PolicyDecisionException;
35 import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
36 import org.openecomp.policy.common.logging.flexlogger.Logger;
37 import org.openecomp.policy.pdp.rest.api.models.PDPResponse;
38 import org.openecomp.policy.std.StdDecisionResponse;
39 import org.openecomp.policy.xacml.api.XACMLErrorConstants;
40 import org.springframework.http.HttpStatus;
41
42 public class GetDecisionService {
43     private static Logger LOGGER = FlexLogger.getLogger(GetDecisionService.class.getName());
44     
45     private DecisionResponse decisionResponse = null;
46     private HttpStatus status = HttpStatus.BAD_REQUEST;
47     private DecisionRequestParameters decisionRequestParameters = null;
48     private String message = null;
49     private String eCOMPComponentName = null;
50     private Map<String,String> decisionAttributes = null;
51     
52     public GetDecisionService(
53             DecisionRequestParameters decisionRequestParameters,
54             String requestID) {
55         this.decisionRequestParameters = decisionRequestParameters;
56         if(decisionRequestParameters.getRequestID()==null){
57             UUID requestUUID = null;
58             if (requestID != null && !requestID.isEmpty()) {
59                 try {
60                     requestUUID = UUID.fromString(requestID);
61                 } catch (IllegalArgumentException e) {
62                     requestUUID = UUID.randomUUID();
63                     LOGGER.info("Generated Random UUID: " + requestUUID.toString());
64                 }
65             }else{
66                 requestUUID = UUID.randomUUID();
67                 LOGGER.info("Generated Random UUID: " + requestUUID.toString());
68             }
69             this.decisionRequestParameters.setRequestID(requestUUID);
70         }
71         try{
72             run();
73         }catch(PolicyDecisionException e){
74             StdDecisionResponse decisionResponse = new StdDecisionResponse();
75             decisionResponse.setDecision(PolicyDecision.ERROR);
76             decisionResponse.setDetails(XACMLErrorConstants.ERROR_DATA_ISSUE + e);
77             this.decisionResponse = decisionResponse;
78             status = HttpStatus.BAD_REQUEST;
79         }
80     }
81
82     private void run() throws PolicyDecisionException{
83         // Get Validation.
84         if(!getValidation()){
85             LOGGER.error(message);
86             throw new PolicyDecisionException(message);
87         }
88         // Generate Request. 
89         String modelString = getModel().toString();
90         LOGGER.debug("Generated JSON Request is: " + modelString);
91         // Process Result. 
92         try {
93             PDPServices pdpServices = new PDPServices();
94             status = HttpStatus.OK;
95             decisionResponse = decisionResult(pdpServices.generateRequest(modelString, decisionRequestParameters.getRequestID(), false, true));
96         } catch (Exception e) {
97             LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE + e);
98             status = HttpStatus.BAD_REQUEST;
99             throw new PolicyDecisionException(e);
100         }
101     }
102
103     private DecisionResponse decisionResult(
104             Collection<PDPResponse> generateRequest) {
105         StdDecisionResponse policyDecision = new StdDecisionResponse();
106         if (generateRequest == null) {
107             return policyDecision;
108         }
109         if (!generateRequest.isEmpty()) {
110             for (PDPResponse stdStatus : generateRequest) {
111                 policyDecision.setDecision(stdStatus.getDecision());
112                 policyDecision.setDetails(stdStatus.getDetails());
113             }
114         }
115         return policyDecision;
116     }
117
118     private JsonObject getModel() throws PolicyDecisionException{
119         JsonArrayBuilder resourceArray = Json.createArrayBuilder();
120         for (String key : decisionAttributes.keySet()) {
121             if (key.isEmpty()) {
122                 String message = XACMLErrorConstants.ERROR_DATA_ISSUE + "Cannot have an Empty Key";
123                 LOGGER.error(message);
124                 throw new PolicyDecisionException(message);
125             }
126             JsonObjectBuilder resourceBuilder = Json.createObjectBuilder();
127             if (decisionAttributes.get(key).matches("[0-9]+")) {
128                 int val = Integer.parseInt(decisionAttributes.get(key));
129                 resourceBuilder.add("Value", val);
130             } else {
131                 resourceBuilder.add("Value", decisionAttributes.get(key));
132             }
133             resourceBuilder.add("AttributeId", key);
134             resourceArray.add(resourceBuilder);
135         }
136         JsonObject model = Json
137                 .createObjectBuilder()
138                 .add("Request", Json.createObjectBuilder()
139                                 .add("AccessSubject", Json.createObjectBuilder()
140                                                 .add("Attribute", Json.createObjectBuilder()
141                                                                 .add("Value", eCOMPComponentName)
142                                                                 .add("AttributeId", "ECOMPName")))
143                                 .add("Resource", Json.createObjectBuilder()
144                                                 .add("Attribute", resourceArray))
145                                 .add("Action", Json.createObjectBuilder()
146                                                 .add("Attribute", Json.createObjectBuilder()
147                                                                 .add("Value", "DECIDE")
148                                                                 .add("AttributeId", "urn:oasis:names:tc:xacml:1.0:action:action-id"))))
149                 .build();
150         return model;
151     }
152
153     private boolean getValidation() {
154         if(decisionRequestParameters==null){
155             message = XACMLErrorConstants.ERROR_DATA_ISSUE + "No Decision Request Paramaters";
156             return false; 
157         }
158         eCOMPComponentName = decisionRequestParameters.getECOMPComponentName();
159         decisionAttributes = decisionRequestParameters.getDecisionAttributes();
160         if (eCOMPComponentName == null || eCOMPComponentName.isEmpty()) {
161             message = XACMLErrorConstants.ERROR_DATA_ISSUE + "No eCOMPComponentName given : " + eCOMPComponentName;
162             return false;
163         }
164         if (decisionAttributes == null || decisionAttributes.isEmpty()) {
165             message = XACMLErrorConstants.ERROR_DATA_ISSUE + "No Decision Attributes Given. ";
166             return false;
167         }
168         return true;
169     }
170
171     public DecisionResponse getResult() {
172         return decisionResponse;
173     }
174
175     public HttpStatus getResponseCode() {
176         return status;
177     }
178
179 }
180