ce0f060eebc0d897eeb627ffa4fa8c735c9e0af1
[ccsdk/cds.git] /
1 /*\r
2  *  Copyright © 2017-2018 AT&T Intellectual Property.\r
3  *  Modifications Copyright © 2018 IBM.\r
4  *\r
5  *  Licensed under the Apache License, Version 2.0 (the "License");\r
6  *  you may not use this file except in compliance with the License.\r
7  *  You may obtain a copy of the License at\r
8  *\r
9  *      http://www.apache.org/licenses/LICENSE-2.0\r
10  *\r
11  *  Unless required by applicable law or agreed to in writing, software\r
12  *  distributed under the License is distributed on an "AS IS" BASIS,\r
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
14  *  See the License for the specific language governing permissions and\r
15  *  limitations under the License.\r
16  */\r
17 \r
18 package org.onap.ccsdk.apps.blueprintsprocessor.functions.resource.resolution\r
19 \r
20 import com.fasterxml.jackson.databind.node.JsonNodeFactory
21 import org.onap.ccsdk.apps.blueprintsprocessor.functions.resource.resolution.processor.ResourceAssignmentProcessor\r
22 import org.onap.ccsdk.apps.blueprintsprocessor.functions.resource.resolution.utils.ResourceAssignmentUtils\r
23 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintConstants\r
24 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintProcessorException\r
25 import org.onap.ccsdk.apps.controllerblueprints.core.service.BluePrintRuntimeService\r
26 import org.onap.ccsdk.apps.controllerblueprints.core.service.BluePrintTemplateService
27 import org.onap.ccsdk.apps.controllerblueprints.core.utils.JacksonUtils\r
28 import org.onap.ccsdk.apps.controllerblueprints.resource.dict.ResourceAssignment\r
29 import org.onap.ccsdk.apps.controllerblueprints.resource.dict.ResourceDefinition\r
30 import org.onap.ccsdk.apps.controllerblueprints.resource.dict.utils.BulkResourceSequencingUtils\r
31 import org.slf4j.LoggerFactory\r
32 import org.springframework.beans.factory.annotation.Autowired\r
33 import org.springframework.context.ApplicationContext\r
34 import org.springframework.stereotype.Service\r
35 import java.io.File\r
36 \r
37 /**\r
38  * ResourceResolutionService\r
39  * @author Brinda Santh\r
40  * 8/14/2018\r
41  */\r
42 \r
43 @Service\r
44 class ResourceResolutionService {\r
45 \r
46     private val log = LoggerFactory.getLogger(ResourceResolutionService::class.java)\r
47 \r
48     @Autowired\r
49     private lateinit var applicationContext: ApplicationContext\r
50 \r
51     fun registeredResourceSources(): List<String> {\r
52         return applicationContext.getBeanNamesForType(ResourceAssignmentProcessor::class.java)\r
53                 .filter { it.startsWith(ResourceResolutionConstants.PREFIX_RESOURCE_ASSIGNMENT_PROCESSOR) }\r
54                 .map { it.substringAfter(ResourceResolutionConstants.PREFIX_RESOURCE_ASSIGNMENT_PROCESSOR) }\r
55     }\r
56 \r
57 \r
58     fun resolveResources(bluePrintRuntimeService: BluePrintRuntimeService<*>, nodeTemplateName: String,\r
59                          artifactNames: List<String>): MutableMap<String, String> {\r
60 \r
61         val resolvedParams: MutableMap<String, String> = hashMapOf()\r
62         artifactNames.forEach { artifactName ->\r
63             val resolvedContent = resolveResources(bluePrintRuntimeService, nodeTemplateName, artifactName)\r
64             resolvedParams[artifactName] = resolvedContent\r
65         }\r
66         return resolvedParams\r
67     }\r
68 \r
69 \r
70     fun resolveResources(bluePrintRuntimeService: BluePrintRuntimeService<*>, nodeTemplateName: String, artifactName: String): String {\r
71 \r
72         var resolvedContent = ""\r
73         // Velocity Artifact Definition Name\r
74         val templateArtifactName = "$artifactName-template"\r
75         // Resource Assignment Artifact Definition Name\r
76         val mappingArtifactName = "$artifactName-mapping"\r
77 \r
78         log.info("Resolving resource for template artifact($templateArtifactName) with resource assignment artifact($mappingArtifactName)")\r
79 \r
80         val resourceAssignmentContent = bluePrintRuntimeService.resolveNodeTemplateArtifact(nodeTemplateName, mappingArtifactName)\r
81 \r
82         val resourceAssignments: MutableList<ResourceAssignment> = JacksonUtils.getListFromJson(resourceAssignmentContent, ResourceAssignment::class.java)\r
83                 as? MutableList<ResourceAssignment>\r
84                 ?: throw BluePrintProcessorException("couldn't get Dictionary Definitions")\r
85 \r
86         // Get the Resource Dictionary Name\r
87         val dictionaryFile = bluePrintRuntimeService.bluePrintContext().rootPath.plus(File.separator)\r
88                 .plus(BluePrintConstants.TOSCA_DEFINITIONS_DIR).plus(File.separator)\r
89                 .plus(ResourceResolutionConstants.FILE_NAME_RESOURCE_DEFINITION_TYPES)\r
90 \r
91         val resourceDictionaries: MutableMap<String, ResourceDefinition> = JacksonUtils.getMapFromFile(dictionaryFile, ResourceDefinition::class.java)\r
92                 ?: throw BluePrintProcessorException("couldn't get Dictionary Definitions")\r
93 \r
94         // Resolve resources
95         executeProcessors(bluePrintRuntimeService, resourceDictionaries, resourceAssignments, templateArtifactName)\r
96 \r
97         // Check Template is there\r
98         val templateContent = bluePrintRuntimeService.resolveNodeTemplateArtifact(nodeTemplateName, templateArtifactName)
99 \r
100         val resolvedParamJsonContent = ResourceAssignmentUtils.generateResourceDataForAssignments(resourceAssignments.toList())
101 \r
102         if (templateContent.isNotEmpty()) {\r
103             resolvedContent = BluePrintTemplateService.generateContent(templateContent, resolvedParamJsonContent)
104         } else {\r
105             resolvedContent = resolvedParamJsonContent\r
106         }\r
107         return resolvedContent\r
108     }\r
109 \r
110     private fun executeProcessors(blueprintRuntimeService: BluePrintRuntimeService<*>,\r
111                                   resourceDictionaries: MutableMap<String, ResourceDefinition>,\r
112                                   resourceAssignments: MutableList<ResourceAssignment>,\r
113                                   templateArtifactName: String) {\r
114 \r
115         val bulkSequenced = BulkResourceSequencingUtils.process(resourceAssignments)\r
116         val resourceAssignmentRuntimeService = ResourceAssignmentUtils.transformToRARuntimeService(blueprintRuntimeService, templateArtifactName)\r
117 \r
118         bulkSequenced.map { batchResourceAssignments ->\r
119             batchResourceAssignments.filter { it.name != "*" && it.name != "start" }\r
120                     .map { resourceAssignment ->\r
121                         val dictionarySource = resourceAssignment.dictionarySource\r
122                         val processorInstanceName = ResourceResolutionConstants.PREFIX_RESOURCE_ASSIGNMENT_PROCESSOR.plus(dictionarySource)\r
123 \r
124                         val resourceAssignmentProcessor = applicationContext.getBean(processorInstanceName) as? ResourceAssignmentProcessor\r
125                                 ?: throw BluePrintProcessorException("failed to get resource processor for instance name($processorInstanceName) " +\r
126                                         "for resource assignment(${resourceAssignment.name})")\r
127                         try {\r
128                             // Set BluePrint Runtime Service\r
129                             resourceAssignmentProcessor.raRuntimeService = resourceAssignmentRuntimeService\r
130                             // Set Resource Dictionaries\r
131                             resourceAssignmentProcessor.resourceDictionaries = resourceDictionaries\r
132                             // Invoke Apply Method\r
133                             resourceAssignmentProcessor.apply(resourceAssignment)\r
134                         } catch (e: RuntimeException) {\r
135                             resourceAssignmentProcessor.recover(e, resourceAssignment)\r
136                             throw BluePrintProcessorException(e)\r
137                         }\r
138                     }\r
139         }\r
140     }\r
141 \r
142 }\r