Merge "Support for SO to ExtAPI"
[so.git] / bpmn / so-bpmn-infrastructure-common / src / main / groovy / org / onap / so / bpmn / infrastructure / scripts / DoCompareServiceInstanceData.groovy
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  * ============LICENSE_END=========================================================
16  */
17 package org.onap.so.bpmn.infrastructure.scripts
18
19 import org.camunda.bpm.engine.delegate.DelegateExecution
20 import org.onap.aai.domain.yang.ServiceInstance
21 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
22 import org.onap.so.bpmn.common.scripts.ExceptionUtil
23 import org.onap.so.bpmn.core.domain.Resource
24 import org.onap.so.bpmn.core.domain.ServiceDecomposition
25 import org.onap.so.bpmn.core.json.JsonUtils
26 import org.onap.so.bpmn.infrastructure.workflow.service.ServicePluginFactory
27 import org.slf4j.Logger
28 import org.slf4j.LoggerFactory
29 /**
30  * This groovy class supports the <class>DoCompareServiceInstanceData.bpmn</class> process.
31  *
32  * Inputs:
33  * @param - serviceInstanceData-original
34  * @param - serviceInstanceId
35  * @param - uuiRequest
36  * @param - model-invariant-id-original
37  * @param - model-version-id-original
38  * @param - msoRequestId
39  * @param - isDebugLogEnabled
40  *
41  * Outputs:
42  * @param - addResourceList
43  * @param - delResourceList
44  * @param - uuiRequest-add
45  * @param - uuiRequest-del
46  *
47  */
48 public class DoCompareServiceInstanceData extends AbstractServiceTaskProcessor {
49
50         ExceptionUtil exceptionUtil = new ExceptionUtil()
51         JsonUtils jsonUtil = new JsonUtils()
52     private static final Logger logger = LoggerFactory.getLogger( DoCompareServiceInstanceData.class);
53
54     public void preProcessRequest (DelegateExecution execution) {
55                 def isDebugEnabled = execution.getVariable("isDebugLogEnabled")
56                 logger.info("INFO"," ***** preProcessRequest *****",  isDebugEnabled)
57                 try {
58             checkInput("serviceInstanceData-original", execution, isDebugEnabled)
59             checkInput("serviceInstanceId", execution, isDebugEnabled)
60             checkInput("uuiRequest", execution, isDebugEnabled)
61             checkInput("model-invariant-id-original", execution, isDebugEnabled)
62             checkInput("model-version-id-original", execution, isDebugEnabled)
63             checkInput("msoRequestId", execution, isDebugEnabled)
64                 } catch (Exception ex){
65             String msg = "Exception in preProcessRequest " + ex.getMessage()
66                         logger.info("INFO", msg, isDebugEnabled)
67                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
68                 }
69                 logger.info("INFO"," ***** Exit preProcessRequest *****",  isDebugEnabled)
70         }
71
72     private void checkInput(String inputName, DelegateExecution execution, isDebugEnabled) {
73         String msg
74         Object inputValue = execution.getVariable(inputName)
75         if (inputValue == null) {
76             msg = "Input" + inputName + "is null"
77             logger.info("INFO", msg, isDebugEnabled)
78             exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
79         }
80     }
81
82
83     public void prepareDecomposeService_Original(DelegateExecution execution) {
84         def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
85
86         try {
87             logger.debug( " ***** Inside prepareDecomposeService_Original of update generic e2e service ***** ")
88             String modelInvariantUuid = execution.getVariable("model-invariant-id-original")
89             String modelUuid = execution.getVariable("model-version-id-original")
90             //here modelVersion is not set, we use modelUuid to decompose the service.
91             String serviceModelInfo = """{
92             "modelInvariantUuid":"${modelInvariantUuid}",
93             "modelUuid":"${modelUuid}",
94             "modelVersion":""
95              }"""
96
97             execution.setVariable("serviceModelInfo_Original", serviceModelInfo)
98
99             logger.debug( " ***** Completed prepareDecomposeService_Original of update generic e2e service ***** ")
100         } catch (Exception ex) {
101             // try error in method block
102             String exceptionMessage = "Bpmn error encountered in update generic e2e service flow. Unexpected Error from method prepareDecomposeService_Original() - " + ex.getMessage()
103             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
104         }
105     }
106
107     public void processDecomposition_Original(DelegateExecution execution) {
108         def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
109
110         logger.debug( " ***** Inside processDecomposition_Original() of update generic e2e service flow ***** ")
111         try {
112             ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition")
113             execution.setVariable("serviceDecomposition_Original", serviceDecomposition)
114         } catch (Exception ex) {
115             String exceptionMessage = "Bpmn error encountered in update generic e2e service flow. processDecomposition_Original() - " + ex.getMessage()
116             logger.debug( exceptionMessage)
117             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
118         }
119     }
120
121     public void doCompareUuiRquestInput(DelegateExecution execution) {
122
123         def isDebugEnabled = execution.getVariable("isDebugLogEnabled")
124         logger.info("INFO", "======== Start doCompareUuiRquestInput Process ======== ", isDebugEnabled)
125
126         String uuiRequest_Target = execution.getVariable("uuiRequest")
127         Map<String, Object> serviceParametersObject_Target = getServiceParametersObject(uuiRequest_Target)
128         Map<String, Object> serviceRequestInputs_Target = (Map<String, Object>) serviceParametersObject_Target.get("requestInputs")
129         List<Object> resources_Target = (List<Object>) serviceParametersObject_Target.get("resources")
130
131         String uuiRequest_Original = ((ServiceInstance) execution.getVariable("serviceInstanceData-original")).getInputParameters()
132         Map<String, Object> serviceParametersObject_Original = getServiceParametersObject(uuiRequest_Original)
133         Map<String, Object> serviceRequestInputs_Original = (Map<String, Object>) serviceParametersObject_Original.get("requestInputs")
134         List<Object> resources_Original = (List<Object>) serviceParametersObject_Original.get("resources")
135
136         logger.info("INFO", "uuiRequest is: " + uuiRequest_Target, isDebugEnabled)
137
138         //the resources which are included by resources_Target but resources_Original are the resources going to be added
139         ArrayList<Object> resourceList_Add = findResourceListIncluded(resources_Target, resources_Original)
140         HashMap<String, Object> serviceRequestInputs_Add = getServiceRequestInputsIncluded(resourceList_Add, serviceRequestInputs_Target, serviceParametersObject_Target)
141         String uuiRequest_add = loadUuiRequestJsonString(uuiRequest_Target, resourceList_Add, serviceRequestInputs_Add)
142         execution.setVariable("uuiRequest", uuiRequest_add)
143         logger.info("INFO", "uuiRequest will be changed to: " + uuiRequest_add, isDebugEnabled)
144
145         //the resources which are included by resources_Original but resources_Target are the resources going to be deleted
146         ArrayList<Object> resourceList_Del = findResourceListIncluded(resources_Original, resources_Target)
147         HashMap<String, Object> serviceRequestInputs_Del = getServiceRequestInputsIncluded(resourceList_Del, serviceRequestInputs_Original, serviceParametersObject_Original)
148         String uuiRequest_del = loadUuiRequestJsonString(uuiRequest_Original, resourceList_Del, serviceRequestInputs_Del)
149         execution.setVariable("uuiRequest-del", uuiRequest_del)
150         logger.info("INFO", "uuiRequest-del: " + uuiRequest_del, isDebugEnabled)
151
152         List<Resource> addResourceList = findResourceList(resourceList_Add, execution)
153         execution.setVariable("addResourceList", addResourceList)
154         logger.info("INFO", "addResourceList: " + addResourceList, isDebugEnabled)
155
156         List<Resource> delResourceList = findResourceList(resourceList_Del, execution)
157         execution.setVariable("delResourceList", delResourceList)
158         logger.info("INFO", "delResourceList: " + delResourceList, isDebugEnabled)
159
160         logger.info("INFO", "======== COMPLETED doCompareUuiRquestInput Process ======== ", isDebugEnabled)
161     }
162
163     private List<Resource> findResourceList(ArrayList<Object> uuiResourceList, DelegateExecution execution) {
164         HashSet<String> addResourceCustomizationUuidSet = getCustomizationUuidSet(uuiResourceList)
165         Set<Resource> resourceSet = new HashSet<>()
166         ServiceDecomposition serviceDecomposition_Original = execution.getVariable("serviceDecomposition_Original")
167         List<Resource> allSR_original = serviceDecomposition_Original.getServiceResources()
168         for (Resource resource : allSR_original) {
169             if (addResourceCustomizationUuidSet.contains(resource.getModelInfo().getModelCustomizationUuid())) {
170                 resourceSet.add(resource)
171             }
172         }
173         List<Resource> resourceList = new ArrayList<String>(resourceSet)
174         resourceList
175     }
176
177     private HashSet<String> getCustomizationUuidSet(ArrayList<Object> resourceList_Add) {
178         Set<String> addRsourceCustomizationUuidSet = new HashSet<>()
179         for (Map<String, Object> resourceAdded : resourceList_Add) {
180             addRsourceCustomizationUuidSet.add(resourceAdded.get("rsourceCustomizationUuid"))
181         }
182         addRsourceCustomizationUuidSet
183     }
184
185     private String loadUuiRequestJsonString(String uuiRequest_Target, ArrayList<Object> resourceList_Add, HashMap<String, Object> serviceRequestInputs_Add) {
186         Map<String, Object> uuiObject = ServicePluginFactory.getInstance().getJsonObject(uuiRequest_Target, Map.class)
187         Map<String, Object> serviceObject = (Map<String, Object>) uuiObject.get("service")
188         Map<String, Object> serviceParametersObject = (Map<String, Object>) serviceObject.get("parameters")
189         serviceParametersObject.put("resources", resourceList_Add)
190         serviceParametersObject.put("requestInputs", serviceRequestInputs_Add)
191         String uuiRequest_add = ServicePluginFactory.getInstance().getJsonString(serviceObject)
192         uuiRequest_add
193     }
194
195     private HashMap<String, Object> getServiceRequestInputsIncluded(ArrayList<Object> resourceList_Add, Map<String, Object> serviceRequestInputs_Target, Map<String, Object> serviceParametersObject_Target) {
196         ArrayList<String> newResourceNames = getNewResourceNames(resourceList_Add)
197         Map<String, Object> serviceRequestInputs_Add = new HashMap<String, Object>()
198         for (String inputKey : serviceRequestInputs_Target.keySet()) {
199             String resourceName = (inputKey.split("_"))[0]
200             if (newResourceNames.contains(resourceName)) {
201                 serviceRequestInputs_Add.put(inputKey, serviceParametersObject_Target.get(inputKey))
202             }
203         }
204         serviceRequestInputs_Add
205     }
206
207     private ArrayList<String> getNewResourceNames(ArrayList<Object> addResourceList) {
208         Set<String> newResourceNames = new ArrayList<String>()
209         for (Object resourceObject : addResourceList) {
210             Map<String, Object> resourceAdded = (Map<String, Object>) resourceObject
211             String resName = new String(resourceAdded.get("resourceName"))
212             normalizeName(resName)
213             newResourceNames.add(resName)
214         }
215         newResourceNames
216     }
217
218     private void normalizeName(String resName) {
219         resName.replaceAll("_", "")
220         resName.replaceAll(" ", "")
221         resName.toLowerCase()
222     }
223
224     private ArrayList<Object> findResourceListIncluded(List<Object> resources_Target, List<Object> resources_Original) {
225         List<Object> addResourceList = new ArrayList<Object>()
226         for (Object resource_Target : resources_Target) {
227             Map<String, Object> resourceObject_Target = (Map<String, Object>) resource_Target
228             boolean isNewResourceInstance = isNewResourceInstance(resourceObject_Target, resources_Original)
229             if (isNewResourceInstance) {
230                 addResourceList.add(resource_Target)
231             }
232         }
233         addResourceList
234     }
235
236     private boolean isNewResourceInstance(Map<String, Object> resourceObject_Target, List<Object> resources_Original) {
237         String resourceIndex_Target = null
238         if (resourceObject_Target.keySet().contains("resourceIndex")) {
239             resourceIndex_Target = resourceObject_Target.get("resourceIndex")
240         }
241         String resourceName_Target = resourceObject_Target.get("resourceName")
242         boolean isNewResourceInstance = true
243         for (Object resource_Original : resources_Original) {
244             Map<String, Object> resourceObject_Original = (Map<String, Object>) resource_Original
245             String resourceIndex_Original = null
246             if (resourceObject_Original.keySet().contains("resourceIndex")) {
247                 resourceIndex_Original = resourceObject_Original.get("resourceIndex")
248             }
249             String resourceName_Original = resourceObject_Original.get("resourceName")
250             if (resourceName_Target.equals(resourceName_Original)) {
251                 if (resourceIndex_Target != null && resourceIndex_Original != null) {
252                     if (resourceIndex_Target.equals(resourceIndex_Original)) {
253                         isNewResourceInstance = false
254                     }
255                 } else {
256                     isNewResourceInstance = false
257                 }
258             }
259         }
260         isNewResourceInstance
261     }
262
263     private Map<String, Object> getServiceParametersObject(String uuiRequest_Target) {
264         Map<String, Object> uuiObject = ServicePluginFactory.getInstance().getJsonObject(uuiRequest_Target, Map.class)
265         Map<String, Object> serviceObject = (Map<String, Object>) uuiObject.get("service")
266         Map<String, Object> serviceParametersObject = (Map<String, Object>) serviceObject.get("parameters")
267         serviceParametersObject
268     }
269
270 }