Merge "Controller Blueprints Microservice"
[ccsdk/apps.git] / ms / controllerblueprints / modules / service / src / main / java / org / onap / ccsdk / apps / controllerblueprints / service / ConfigModelCreateService.java
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.controllerblueprints.service;\r
19 \r
20 import com.google.common.base.Preconditions;\r
21 import org.apache.commons.collections.CollectionUtils;\r
22 import org.apache.commons.io.IOUtils;\r
23 import org.apache.commons.lang3.StringUtils;\r
24 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintConstants;\r
25 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintException;\r
26 import org.onap.ccsdk.apps.controllerblueprints.core.ConfigModelConstant;\r
27 import org.onap.ccsdk.apps.controllerblueprints.core.data.ServiceTemplate;\r
28 import org.onap.ccsdk.apps.controllerblueprints.core.utils.JacksonUtils;\r
29 import org.onap.ccsdk.apps.controllerblueprints.service.common.ApplicationConstants;\r
30 import org.onap.ccsdk.apps.controllerblueprints.service.domain.ConfigModel;\r
31 import org.onap.ccsdk.apps.controllerblueprints.service.domain.ConfigModelContent;\r
32 import org.onap.ccsdk.apps.controllerblueprints.service.repository.ConfigModelRepository;\r
33 import org.slf4j.Logger;\r
34 import org.slf4j.LoggerFactory;\r
35 import org.springframework.stereotype.Service;\r
36 \r
37 import java.io.IOException;\r
38 import java.nio.charset.Charset;\r
39 import java.util.ArrayList;\r
40 import java.util.List;\r
41 import java.util.Optional;\r
42 \r
43 /**\r
44  * ServiceTemplateCreateService.java Purpose: Provide Service Template Create Service processing\r
45  * ServiceTemplateCreateService\r
46  *\r
47  * @author Brinda Santh\r
48  * @version 1.0\r
49  */\r
50 \r
51 @Service\r
52 public class ConfigModelCreateService {\r
53 \r
54     private static Logger log = LoggerFactory.getLogger(ConfigModelCreateService.class);\r
55 \r
56     private ConfigModelRepository configModelRepository;\r
57     private ConfigModelValidatorService configModelValidatorService;\r
58 \r
59     /**\r
60      * This is a ConfigModelCreateService\r
61      *\r
62      * @param configModelRepository       ConfigModelRepository\r
63      * @param configModelValidatorService ConfigModelValidatorService\r
64      */\r
65     public ConfigModelCreateService(ConfigModelRepository configModelRepository,\r
66                                     ConfigModelValidatorService configModelValidatorService) {\r
67         this.configModelRepository = configModelRepository;\r
68         this.configModelValidatorService = configModelValidatorService;\r
69     }\r
70 \r
71     /**\r
72      * This is a createInitialServiceTemplateContent method\r
73      *\r
74      * @param templateName templateName\r
75      * @return String\r
76      * @throws BluePrintException BluePrintException\r
77      */\r
78     public String createInitialServiceTemplateContent(String templateName) throws BluePrintException {\r
79         String serviceTemplateContent = null;\r
80         if (StringUtils.isNotBlank(templateName)) {\r
81             try {\r
82                 serviceTemplateContent = IOUtils.toString(ConfigModelCreateService.class.getClassLoader()\r
83                         .getResourceAsStream("service_template/" + templateName + ".json"), Charset.defaultCharset());\r
84             } catch (IOException e) {\r
85                 throw new BluePrintException(e.getMessage(), e);\r
86             }\r
87 \r
88         }\r
89         return serviceTemplateContent;\r
90     }\r
91 \r
92     /**\r
93      * This is a createInitialServiceTemplate method\r
94      *\r
95      * @param templateName templateName\r
96      * @return ServiceTemplate\r
97      * @throws BluePrintException BluePrintException\r
98      */\r
99     public ServiceTemplate createInitialServiceTemplate(String templateName) throws BluePrintException {\r
100         ServiceTemplate serviceTemplate = null;\r
101         if (StringUtils.isNotBlank(templateName)) {\r
102             try {\r
103                 String serviceTemplateContent = IOUtils.toString(ConfigModelCreateService.class.getClassLoader()\r
104                         .getResourceAsStream("service_template/" + templateName + ".json"), Charset.defaultCharset());\r
105                 if (StringUtils.isNotBlank(serviceTemplateContent)) {\r
106                     serviceTemplate = JacksonUtils.readValue(serviceTemplateContent, ServiceTemplate.class);\r
107                 }\r
108             } catch (IOException e) {\r
109                 throw new BluePrintException(e.getMessage(), e);\r
110             }\r
111 \r
112         }\r
113         return serviceTemplate;\r
114     }\r
115 \r
116     /**\r
117      * This is a saveConfigModel method\r
118      *\r
119      * @param configModel configModel\r
120      * @return ConfigModel\r
121      * @throws BluePrintException BluePrintException\r
122      */\r
123     public ConfigModel saveConfigModel(ConfigModel configModel) throws BluePrintException {\r
124 \r
125         if (configModel != null) {\r
126             String artifactName = configModel.getArtifactName();\r
127             String artifactVersion = configModel.getArtifactVersion();\r
128             String author = configModel.getUpdatedBy();\r
129             // configModel.setTags(artifactName);\r
130 \r
131             if (StringUtils.isBlank(author)) {\r
132                 throw new BluePrintException("Artifact Author is missing in the Service Template");\r
133             }\r
134 \r
135             if (StringUtils.isBlank(artifactName)) {\r
136                 throw new BluePrintException("Artifact Name is missing in the Service Template");\r
137             }\r
138 \r
139             if (StringUtils.isBlank(artifactVersion)) {\r
140                 throw new BluePrintException("Artifact Version is missing in the Service Template");\r
141             }\r
142             ConfigModel updateConfigModel;\r
143 \r
144             Optional<ConfigModel> dbConfigModelOptional = Optional.empty();\r
145 \r
146             if (configModel.getId() != null) {\r
147                 log.info("Searching for config model id : {}", configModel.getId());\r
148                 dbConfigModelOptional = configModelRepository.findById(configModel.getId());\r
149             }\r
150 \r
151             if (!dbConfigModelOptional.isPresent()) {\r
152                 log.info("Searching for config model name :"\r
153                         + configModel.getArtifactName() + ", version " + configModel.getArtifactVersion());\r
154                 dbConfigModelOptional = configModelRepository.findByArtifactNameAndArtifactVersion(\r
155                         configModel.getArtifactName(), configModel.getArtifactVersion());\r
156             }\r
157 \r
158             if (dbConfigModelOptional.isPresent()) {\r
159                 updateConfigModel = dbConfigModelOptional.get();\r
160                 log.info("Processing for config model id : {} with config model content count : {}"\r
161                         , updateConfigModel.getId(), updateConfigModel.getConfigModelContents().size());\r
162             } else {\r
163                 ConfigModel tempConfigModel = new ConfigModel();\r
164                 tempConfigModel.setArtifactType(ApplicationConstants.ASDC_ARTIFACT_TYPE_SDNC_MODEL);\r
165                 tempConfigModel.setArtifactName(artifactName);\r
166                 tempConfigModel.setArtifactVersion(artifactVersion);\r
167                 tempConfigModel.setUpdatedBy(author);\r
168                 tempConfigModel.setPublished(ApplicationConstants.ACTIVE_N);\r
169                 tempConfigModel.setTags(artifactName);\r
170                 configModelRepository.saveAndFlush(tempConfigModel);\r
171                 updateConfigModel = tempConfigModel;\r
172             }\r
173 \r
174             Long dbConfigModelId = updateConfigModel.getId();\r
175 \r
176             if (dbConfigModelId == null) {\r
177                 throw new BluePrintException("failed to get the initial saved config model id.");\r
178             }\r
179 \r
180             log.info("Processing for config model id : {}", dbConfigModelId);\r
181 \r
182             deleteConfigModelContent(dbConfigModelId);\r
183 \r
184             addConfigModelContent(dbConfigModelId, configModel);\r
185 \r
186             // Populate Content model types\r
187             updateConfigModel = updateConfigModel(dbConfigModelId, artifactName, artifactVersion, author);\r
188 \r
189 \r
190             return updateConfigModel;\r
191         } else {\r
192             throw new BluePrintException("Config model information is missing");\r
193         }\r
194 \r
195     }\r
196 \r
197     private void deleteConfigModelContent(Long dbConfigModelId) {\r
198         if (dbConfigModelId != null) {\r
199             ConfigModel dbConfigModel = configModelRepository.getOne(dbConfigModelId);\r
200             if (CollectionUtils.isNotEmpty(dbConfigModel.getConfigModelContents())) {\r
201                 dbConfigModel.getConfigModelContents().clear();\r
202                 log.debug("Configuration Model content deleting : {}", dbConfigModel.getConfigModelContents());\r
203                 configModelRepository.saveAndFlush(dbConfigModel);\r
204             }\r
205 \r
206         }\r
207     }\r
208 \r
209     private void addConfigModelContent(Long dbConfigModelId, ConfigModel configModel) {\r
210         if (dbConfigModelId != null && configModel != null\r
211                 && CollectionUtils.isNotEmpty(configModel.getConfigModelContents())) {\r
212             ConfigModel dbConfigModel = configModelRepository.getOne(dbConfigModelId);\r
213             for (ConfigModelContent configModelContent : configModel.getConfigModelContents()) {\r
214                 if (configModelContent != null) {\r
215                     configModelContent.setId(null);\r
216                     configModelContent.setConfigModel(dbConfigModel);\r
217                     dbConfigModel.getConfigModelContents().add(configModelContent);\r
218                     log.debug("Configuration Model content adding : {}", configModelContent);\r
219                 }\r
220             }\r
221             configModelRepository.saveAndFlush(dbConfigModel);\r
222         }\r
223     }\r
224 \r
225     private ConfigModel updateConfigModel(Long dbConfigModelId, String artifactName, String artifactVersion,\r
226                                           String author) throws BluePrintException {\r
227 \r
228         ConfigModel dbConfigModel = configModelRepository.getOne(dbConfigModelId);\r
229         // Populate tags from metadata\r
230         String tags = getConfigModelTags(dbConfigModel);\r
231         if (StringUtils.isBlank(tags)) {\r
232             throw new BluePrintException("Failed to populate tags for the config model name " + artifactName);\r
233         }\r
234         dbConfigModel.setArtifactType(ApplicationConstants.ASDC_ARTIFACT_TYPE_SDNC_MODEL);\r
235         dbConfigModel.setArtifactName(artifactName);\r
236         dbConfigModel.setArtifactVersion(artifactVersion);\r
237         dbConfigModel.setUpdatedBy(author);\r
238         dbConfigModel.setPublished(ApplicationConstants.ACTIVE_N);\r
239         dbConfigModel.setTags(tags);\r
240         configModelRepository.saveAndFlush(dbConfigModel);\r
241         log.info("Config model ({}) saved successfully.", dbConfigModel.getId());\r
242         return dbConfigModel;\r
243     }\r
244 \r
245     private List<String> getValidContentTypes() {\r
246         List<String> valids = new ArrayList<>();\r
247         valids.add(ConfigModelConstant.MODEL_CONTENT_TYPE_TOSCA_JSON);\r
248         valids.add(ConfigModelConstant.MODEL_CONTENT_TYPE_TEMPLATE);\r
249         return valids;\r
250 \r
251     }\r
252 \r
253     private String getConfigModelTags(ConfigModel configModel) throws BluePrintException {\r
254         String tags = null;\r
255         if (CollectionUtils.isNotEmpty(configModel.getConfigModelContents())) {\r
256 \r
257             for (ConfigModelContent configModelContent : configModel.getConfigModelContents()) {\r
258                 if (configModelContent != null && StringUtils.isNotBlank(configModelContent.getContentType())) {\r
259 \r
260                     if (!getValidContentTypes().contains(configModelContent.getContentType())) {\r
261                         throw new BluePrintException(configModelContent.getContentType()\r
262                                 + " is not a valid content type, It should be any one of this "\r
263                                 + getValidContentTypes());\r
264                     }\r
265 \r
266                     if (configModelContent.getContentType().equals(ConfigModelConstant.MODEL_CONTENT_TYPE_TOSCA_JSON)) {\r
267                         ServiceTemplate serviceTemplate =\r
268                                 JacksonUtils.readValue(configModelContent.getContent(), ServiceTemplate.class);\r
269                         Preconditions.checkNotNull(serviceTemplate, "failed to transform service template content");\r
270                         if (serviceTemplate.getMetadata() != null) {\r
271                             serviceTemplate.getMetadata().put(BluePrintConstants.METADATA_TEMPLATE_AUTHOR,\r
272                                     configModel.getUpdatedBy());\r
273                             serviceTemplate.getMetadata().put(BluePrintConstants.METADATA_TEMPLATE_VERSION,\r
274                                     configModel.getArtifactVersion());\r
275                             serviceTemplate.getMetadata().put(BluePrintConstants.METADATA_TEMPLATE_NAME,\r
276                                     configModel.getArtifactName());\r
277                         }\r
278                         tags = String.valueOf(serviceTemplate.getMetadata());\r
279                     }\r
280                 }\r
281             }\r
282         }\r
283         return tags;\r
284     }\r
285 \r
286     /**\r
287      * This is a publishConfigModel method\r
288      *\r
289      * @param id id\r
290      * @return ConfigModel\r
291      * @throws BluePrintException BluePrintException\r
292      */\r
293     public ConfigModel publishConfigModel(Long id) throws BluePrintException {\r
294         ConfigModel dbConfigModel = null;\r
295         if (id != null) {\r
296             Optional<ConfigModel> dbConfigModelOptional = configModelRepository.findById(id);\r
297             if (dbConfigModelOptional.isPresent()) {\r
298                 dbConfigModel = dbConfigModelOptional.get();\r
299                 List<ConfigModelContent> configModelContents = dbConfigModel.getConfigModelContents();\r
300                 if (configModelContents != null && !configModelContents.isEmpty()) {\r
301                     for (ConfigModelContent configModelContent : configModelContents) {\r
302                         if (configModelContent.getContentType()\r
303                                 .equals(ConfigModelConstant.MODEL_CONTENT_TYPE_TOSCA_JSON)) {\r
304                             ServiceTemplate serviceTemplate = JacksonUtils\r
305                                     .readValue(configModelContent.getContent(), ServiceTemplate.class);\r
306                             if (serviceTemplate != null) {\r
307                                 validateServiceTemplate(serviceTemplate);\r
308                             }\r
309                         }\r
310                     }\r
311                 }\r
312                 dbConfigModel.setPublished(ApplicationConstants.ACTIVE_Y);\r
313                 configModelRepository.save(dbConfigModel);\r
314                 log.info("Config model ({}) published successfully.", id);\r
315 \r
316             }\r
317 \r
318         }\r
319         return dbConfigModel;\r
320     }\r
321 \r
322     /**\r
323      * This is a validateServiceTemplate method\r
324      *\r
325      * @param serviceTemplate Service Template\r
326      * @return ServiceTemplate\r
327      * @throws BluePrintException BluePrintException\r
328      */\r
329     public ServiceTemplate validateServiceTemplate(ServiceTemplate serviceTemplate) throws BluePrintException {\r
330         return this.configModelValidatorService.validateServiceTemplate(serviceTemplate);\r
331     }\r
332 }\r