81e76897e01e5db8184f440ea506f798d24afa63
[ccsdk/features.git] /
1 /*\r
2  * Copyright © 2017-2018 AT&T Intellectual Property.\r
3  * \r
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except\r
5  * in compliance with the License. You may obtain a copy of the License at\r
6  * \r
7  * http://www.apache.org/licenses/LICENSE-2.0\r
8  * \r
9  * Unless required by applicable law or agreed to in writing, software distributed under the License\r
10  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\r
11  * or implied. See the License for the specific language governing permissions and limitations under\r
12  * the License.\r
13  */\r
14 \r
15 package org.onap.ccsdk.config.assignment.service;\r
16 \r
17 import java.util.HashMap;\r
18 import java.util.List;\r
19 import java.util.Map;\r
20 import org.apache.commons.collections.CollectionUtils;\r
21 import org.apache.commons.lang3.StringUtils;\r
22 import org.onap.ccsdk.config.assignment.ConfigAssignmentConstants;\r
23 import org.onap.ccsdk.config.assignment.data.ResourceAssignmentData;\r
24 import org.onap.ccsdk.config.assignment.processor.ProcessorFactory;\r
25 import org.onap.ccsdk.config.assignment.processor.ResourceAssignmentProcessor;\r
26 import org.onap.ccsdk.config.data.adaptor.service.ConfigResourceService;\r
27 import org.onap.ccsdk.config.generator.service.ConfigGeneratorService;\r
28 import org.onap.ccsdk.config.model.ConfigModelConstant;\r
29 import org.onap.ccsdk.config.model.data.ResourceAssignment;\r
30 import org.onap.ccsdk.config.model.data.dict.ResourceDefinition;\r
31 import org.onap.ccsdk.config.model.service.ComponentNode;\r
32 import org.onap.ccsdk.config.model.service.ComponentNodeService;\r
33 import org.onap.ccsdk.config.model.service.ConfigModelService;\r
34 import org.onap.ccsdk.config.model.utils.ResourceAssignmentUtils;\r
35 import org.onap.ccsdk.config.model.utils.TransformationUtils;\r
36 import org.onap.ccsdk.config.rest.adaptor.service.ConfigRestAdaptorService;\r
37 import org.onap.ccsdk.sli.core.sli.SvcLogicContext;\r
38 import org.onap.ccsdk.sli.core.sli.SvcLogicException;\r
39 import com.att.eelf.configuration.EELFLogger;\r
40 import com.att.eelf.configuration.EELFManager;\r
41 \r
42 public class ConfigAssignmentProcessService {\r
43     \r
44     private static EELFLogger logger = EELFManager.getInstance().getLogger(ConfigAssignmentProcessService.class);\r
45     \r
46     private ComponentNodeService componentNodeService;\r
47     private ConfigResourceService configResourceService;\r
48     private ConfigModelService configModelService;\r
49     private ConfigRestAdaptorService configRestAdaptorService;\r
50     private ConfigGeneratorService configGeneratorService;\r
51     \r
52     public ConfigAssignmentProcessService(ConfigResourceService configResourceService,\r
53             ConfigRestAdaptorService configRestAdaptorService, ConfigModelService configModelService,\r
54             ComponentNodeService componentNodeService, ConfigGeneratorService configGeneratorService) {\r
55         this.componentNodeService = componentNodeService;\r
56         this.configResourceService = configResourceService;\r
57         this.configModelService = configModelService;\r
58         this.configRestAdaptorService = configRestAdaptorService;\r
59         this.configGeneratorService = configGeneratorService;\r
60     }\r
61     \r
62     @SuppressWarnings("squid:S1141")\r
63     public void resolveResources(ResourceAssignmentData resourceAssignmentData) throws SvcLogicException {\r
64         try {\r
65             validateInputParams(resourceAssignmentData);\r
66             \r
67             String serviceTemplateName = resourceAssignmentData.getServiceTemplateName();\r
68             String serviceTemplateVersion = resourceAssignmentData.getServiceTemplateVersion();\r
69             String actionName = resourceAssignmentData.getActionName();\r
70             String inputData = resourceAssignmentData.getInputData();\r
71             SvcLogicContext svcLogicContext = resourceAssignmentData.getSvcLogicContext();\r
72             List<String> templateNames = resourceAssignmentData.getTemplateNames();\r
73             \r
74             if (resourceAssignmentData.isReloadModel()) {\r
75                 Map<String, String> context = new HashMap<>();\r
76                 context.put(ConfigModelConstant.PROPERTY_ACTION_NAME, actionName);\r
77                 context = configModelService.prepareContext(context, inputData, serviceTemplateName,\r
78                         serviceTemplateVersion);\r
79                 context.forEach((key, value) -> svcLogicContext.setAttribute(key, value));\r
80                 logger.info("List of Resources provided in input: {}", svcLogicContext.toProperties());\r
81             }\r
82             \r
83             Map<String, Object> componentContext = resourceAssignmentData.getContext();\r
84             \r
85             if (CollectionUtils.isNotEmpty(templateNames)) {\r
86                 // Get the Resource Assignments for templates and Validate the mappings\r
87                 ResourceModelService resourceModelService = new ResourceModelService(configModelService);\r
88                 \r
89                 // Get the Resource Assignment\r
90                 Map<String, List<ResourceAssignment>> templatesResourceAssignments =\r
91                         resourceModelService.getTemplatesResourceAssignments(svcLogicContext, templateNames);\r
92                 \r
93                 // Get the Template Contents\r
94                 Map<String, String> templatesContents =\r
95                         resourceModelService.getTemplatesContents(svcLogicContext, templateNames);\r
96                 \r
97                 // Process each template\r
98                 for (String templateName : templateNames) {\r
99                     List<ResourceAssignment> resourceAssignments = templatesResourceAssignments.get(templateName);\r
100                     String templateContent = templatesContents.get(templateName);\r
101                     if (resourceAssignments != null) {\r
102                         String templateData = null;\r
103                         try {\r
104                             // Populate the Dictionary\r
105                             ResourceDictionaryService resourceDictionaryService =\r
106                                     new ResourceDictionaryService(configRestAdaptorService);\r
107                             Map<String, ResourceDefinition> dictionaries =\r
108                                     resourceDictionaryService.getDataDictionaryDefinitions(resourceAssignments);\r
109                             \r
110                             processResourceAssignments(resourceAssignmentData, svcLogicContext, componentContext,\r
111                                     templateName, resourceAssignments, dictionaries);\r
112                             \r
113                             logger.info("decrypting config data for templateName {}", templateName);\r
114                             templateData =\r
115                                     ResourceAssignmentUtils.generateResourceDataForAssignments(resourceAssignments);\r
116                         } finally {\r
117                             saveResourceMapping(resourceAssignmentData, templateName, resourceAssignments);\r
118                         }\r
119                         \r
120                         logger.info("generating config preview for templateName {}", templateName);\r
121                         ConfigPreviewService configPreviewService = new ConfigPreviewService(configResourceService,\r
122                                 configModelService, configGeneratorService);\r
123                         String mashedData = configPreviewService.generatePreview(templateContent, templateData);\r
124                         resourceAssignmentData.getTemplatesMashedContents().put(templateName, mashedData);\r
125                         resourceAssignmentData.getTemplatesData().put(templateName, templateData);\r
126                         \r
127                     } else {\r
128                         // Do nothing for Mapping not found\r
129                         logger.warn("No resource Assignment mappings to resolve for templateName {}", templateName);\r
130                     }\r
131                 }\r
132             }\r
133             \r
134         } catch (Exception e) {\r
135             throw new SvcLogicException(e.getMessage(), e);\r
136         }\r
137     }\r
138     \r
139     private void processResourceAssignments(ResourceAssignmentData resourceAssignmentData, SvcLogicContext ctx,\r
140             Map<String, Object> componentContext, String templateName, List<ResourceAssignment> resourceAssignments,\r
141             Map<String, ResourceDefinition> dictionaries) throws SvcLogicException {\r
142         \r
143         String recipeName = resourceAssignmentData.getActionName();\r
144         \r
145         ResourceAssignmentProcessor resourceAssignmentProcessor =\r
146                 new ResourceAssignmentProcessor(resourceAssignments, ctx);\r
147         List<List<ResourceAssignment>> sequenceBatchResourceAssignment = resourceAssignmentProcessor.process();\r
148         \r
149         logger.debug("Resource dictionary Info  ({})", dictionaries);\r
150         \r
151         if (sequenceBatchResourceAssignment != null) {\r
152             componentContext.put(ConfigModelConstant.PROPERTY_ACTION_NAME, recipeName);\r
153             componentContext.put(ConfigModelConstant.PROPERTY_TEMPLATE_NAME, templateName);\r
154             componentContext.put(ConfigModelConstant.PROPERTY_DICTIONARIES, dictionaries);\r
155             for (List<ResourceAssignment> batchResourceAssignment : sequenceBatchResourceAssignment) {\r
156                 \r
157                 processBatchResourceAssignments(resourceAssignmentData, ctx, componentContext, batchResourceAssignment);\r
158                 \r
159                 logger.debug("Batch Resource data status ({})", TransformationUtils.getJson(batchResourceAssignment));\r
160             }\r
161         }\r
162     }\r
163     \r
164     private void processBatchResourceAssignments(ResourceAssignmentData resourceAssignmentData, SvcLogicContext ctx,\r
165             Map<String, Object> componentContext, List<ResourceAssignment> batchResourceAssignment)\r
166             throws SvcLogicException {\r
167         \r
168         if (CollectionUtils.isNotEmpty(batchResourceAssignment)) {\r
169             \r
170             ResourceAssignment batchFirstResourceAssignment = batchResourceAssignment.get(0);\r
171             if (batchFirstResourceAssignment != null\r
172                     && StringUtils.isNotBlank(batchFirstResourceAssignment.getDictionarySource())) {\r
173                 String source = batchFirstResourceAssignment.getDictionarySource();\r
174                 // Processing their Source\r
175                 logger.info("Processing source ({})  with batch ({}) ", source, batchResourceAssignment);\r
176                 componentContext.put(ConfigModelConstant.PROPERTY_RESOURCE_ASSIGNMENTS, batchResourceAssignment);\r
177                 \r
178                 ProcessorFactory factory =\r
179                         new ProcessorFactory(configResourceService, configRestAdaptorService, componentNodeService);\r
180                 \r
181                 ComponentNode processor = factory.getInstance(source);\r
182                 \r
183                 Map<String, String> inParams = new HashMap<>();\r
184                 inParams.put(ConfigAssignmentConstants.INPUT_PARAM_REQUEST_ID, resourceAssignmentData.getRequestId());\r
185                 inParams.put(ConfigAssignmentConstants.INPUT_PARAM_RESOURCE_ID, resourceAssignmentData.getResourceId());\r
186                 inParams.put(ConfigAssignmentConstants.INPUT_PARAM_RESOURCE_TYPE,\r
187                         resourceAssignmentData.getResourceType());\r
188                 inParams.put(ConfigAssignmentConstants.INPUT_PARAM_ACTION_NAME, resourceAssignmentData.getActionName());\r
189                 inParams.put(ConfigAssignmentConstants.INPUT_PARAM_TEMPLATE_NAMES,\r
190                         resourceAssignmentData.getTemplateNames().toString());\r
191                 processor.process(inParams, ctx, componentContext);\r
192             }\r
193         }\r
194     }\r
195     \r
196     private void saveResourceMapping(ResourceAssignmentData resourceAssignmentData, String templateName,\r
197             List<ResourceAssignment> resourceAssignments) throws SvcLogicException {\r
198         if (resourceAssignmentData != null && StringUtils.isNotBlank(templateName)) {\r
199             \r
200             ConfigAssignmentPersistService configAssignmentPersistService =\r
201                     new ConfigAssignmentPersistService(configResourceService);\r
202             configAssignmentPersistService.saveResourceMapping(resourceAssignmentData, templateName,\r
203                     resourceAssignments);\r
204         }\r
205     }\r
206     \r
207     private void validateInputParams(ResourceAssignmentData resourceAssignmentData) throws SvcLogicException {\r
208         if (resourceAssignmentData == null) {\r
209             throw new SvcLogicException("Input parameters missing");\r
210         }\r
211         \r
212         String requestId = resourceAssignmentData.getRequestId();\r
213         if (StringUtils.isBlank(requestId)) {\r
214             throw new SvcLogicException("Request id parameters missing");\r
215         }\r
216         String resourceId = resourceAssignmentData.getResourceId();\r
217         if (StringUtils.isBlank(resourceId)) {\r
218             throw new SvcLogicException("Resource id parameter is missing");\r
219         }\r
220         String resourceType = resourceAssignmentData.getResourceType();\r
221         if (StringUtils.isBlank(resourceType)) {\r
222             throw new SvcLogicException("Resource type parameter is missing");\r
223         }\r
224         String actionName = resourceAssignmentData.getActionName();\r
225         if (StringUtils.isBlank(actionName)) {\r
226             throw new SvcLogicException("Action name is parameter is missing");\r
227         }\r
228         \r
229         List<String> templatesNames = resourceAssignmentData.getTemplateNames();\r
230         if (CollectionUtils.isEmpty(templatesNames)) {\r
231             throw new SvcLogicException("Template names parameter missing");\r
232         }\r
233     }\r
234     \r
235 }\r