d4924972b7887715a50bf90857a4e251f4d97bd2
[dcaegen2/services.git] /
1 /*\r
2  * ============LICENSE_START=======================================================\r
3  * ONAP : DataLake\r
4  * ================================================================================\r
5  * Copyright 2019 China Mobile\r
6  *=================================================================================\r
7  * Licensed under the Apache License, Version 2.0 (the "License");\r
8  * you may not use this file except in compliance with the License.\r
9  * You may obtain a copy of the License at\r
10  *\r
11  *     http://www.apache.org/licenses/LICENSE-2.0\r
12  *\r
13  * Unless required by applicable law or agreed to in writing, software\r
14  * distributed under the License is distributed on an "AS IS" BASIS,\r
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16  * See the License for the specific language governing permissions and\r
17  * limitations under the License.\r
18  * ============LICENSE_END=========================================================\r
19  */\r
20 \r
21 package org.onap.datalake.feeder.service;\r
22 \r
23 import java.util.ArrayList;\r
24 import java.util.List;\r
25 import java.util.Optional;\r
26 import java.util.Set;\r
27 import java.util.HashSet;\r
28 import java.util.Map;\r
29 import java.util.HashMap;\r
30 import java.util.Iterator;\r
31 \r
32 import org.onap.datalake.feeder.config.ApplicationConfiguration;\r
33 import org.onap.datalake.feeder.domain.*;\r
34 import org.onap.datalake.feeder.domain.Design;\r
35 import org.onap.datalake.feeder.dto.DesignConfig;\r
36 import org.onap.datalake.feeder.enumeration.DesignTypeEnum;\r
37 import org.onap.datalake.feeder.repository.DbRepository;\r
38 import org.onap.datalake.feeder.repository.DesignTypeRepository;\r
39 import org.onap.datalake.feeder.repository.DesignRepository;\r
40 import org.onap.datalake.feeder.repository.TopicNameRepository;\r
41 import org.onap.datalake.feeder.util.HttpClientUtil;\r
42 import org.slf4j.Logger;\r
43 import org.slf4j.LoggerFactory;\r
44 import org.springframework.beans.factory.annotation.Autowired;\r
45 import org.springframework.stereotype.Service;\r
46 \r
47 /**\r
48  * Service for portalDesigns\r
49  *\r
50  * @author guochunmeng\r
51  */\r
52 \r
53 @Service\r
54 public class DesignService {\r
55 \r
56         private final Logger log = LoggerFactory.getLogger(this.getClass());\r
57 \r
58         private static String POST_FLAG;\r
59 \r
60         private static String URL_FlAG;\r
61 \r
62         @Autowired\r
63         private DesignRepository designRepository;\r
64 \r
65         @Autowired\r
66         private TopicNameRepository topicNameRepository;\r
67 \r
68         @Autowired\r
69         private DesignTypeRepository designTypeRepository;\r
70 \r
71         @Autowired\r
72         private ApplicationConfiguration applicationConfiguration;\r
73 \r
74         @Autowired\r
75         private DbRepository dbRepository;\r
76 \r
77         public Design fillDesignConfiguration(DesignConfig designConfig) {\r
78                 Design design = new Design();\r
79                 fillDesign(designConfig, design);\r
80                 return design;\r
81         }\r
82 \r
83         public void fillDesignConfiguration(DesignConfig designConfig, Design design) {\r
84                 fillDesign(designConfig, design);\r
85         }\r
86 \r
87         private void fillDesign(DesignConfig designConfig, Design design) throws IllegalArgumentException {\r
88 \r
89                 design.setId(designConfig.getId());\r
90                 design.setBody(designConfig.getBody());\r
91                 design.setName(designConfig.getName());\r
92                 design.setNote(designConfig.getNote());\r
93                 design.setSubmitted(designConfig.getSubmitted());\r
94 \r
95                 if (designConfig.getTopicName() == null)\r
96                         throw new IllegalArgumentException("Can not find topicName in tpoic_name, topic name: " + designConfig.getTopicName());\r
97                 Optional<TopicName> topicName = topicNameRepository.findById(designConfig.getTopicName());\r
98                 if (!topicName.isPresent())\r
99                         throw new IllegalArgumentException("topicName is null " + designConfig.getTopicName());\r
100                 design.setTopicName(topicName.get());\r
101 \r
102                 if (designConfig.getDesignType() == null)\r
103                         throw new IllegalArgumentException("Can not find designType in design_type, designType id " + designConfig.getDesignType());\r
104                 Optional<DesignType> designType = designTypeRepository.findById(designConfig.getDesignType());\r
105                 if (!designType.isPresent())\r
106                         throw new IllegalArgumentException("designType is null");\r
107                 design.setDesignType(designType.get());\r
108 \r
109                 Set<Db> dbs = new HashSet<>();\r
110                 if (designConfig.getDbs() != null) {\r
111                         for (Integer item : designConfig.getDbs()) {\r
112                                 Optional<Db> db = dbRepository.findById(item);\r
113                                 if (db.isPresent()) {\r
114                                         dbs.add(db.get());\r
115                                 }\r
116                         }\r
117                         if (!dbs.isEmpty())\r
118                                 design.setDbs(dbs);\r
119                         else {\r
120                                 design.getDbs().clear();\r
121                                 design.setDbs(dbs);\r
122                         }\r
123                 } else {\r
124                         design.setDbs(dbs);\r
125                 }\r
126         }\r
127 \r
128         public Design getDesign(Integer id) {\r
129 \r
130                 Optional<Design> ret = designRepository.findById(id);\r
131                 return ret.isPresent() ? ret.get() : null;\r
132         }\r
133 \r
134         public List<DesignConfig> queryAllDesign() {\r
135 \r
136                 List<Design> designList = null;\r
137                 List<DesignConfig> designConfigList = new ArrayList<>();\r
138                 designList = (List<Design>) designRepository.findAll();\r
139                 if (!designList.isEmpty()) {\r
140                         log.info("DesignList is not null");\r
141                         for (Design design : designList) {\r
142                                 designConfigList.add(design.getDesignConfig());\r
143                         }\r
144                 }\r
145                 return designConfigList;\r
146         }\r
147 \r
148         public Map<Integer, Boolean> deploy(Design design) {\r
149                 Map<Integer, Boolean> resultMap = null;\r
150                 DesignType designType = design.getDesignType();\r
151                 DesignTypeEnum designTypeEnum = DesignTypeEnum.valueOf(designType.getId());\r
152 \r
153                 switch (designTypeEnum) {\r
154                 case KIBANA_DB:\r
155                         log.info("Deploy kibana dashboard");\r
156                         resultMap = deployKibanaDashboardImport(design);\r
157                         deploySave(resultMap, design);\r
158                         break;\r
159                 case ES_MAPPING:\r
160                         log.info("Deploy elasticsearch mapping template");\r
161                         resultMap = postEsMappingTemplate(design, design.getTopicName().getId().toLowerCase());\r
162                         deploySave(resultMap, design);\r
163                         break;\r
164                 default:\r
165                         log.error("Not implemented {}", designTypeEnum);\r
166                         break;\r
167                 }\r
168                 log.info("Response resultMap: " + resultMap);\r
169                 return resultMap;\r
170         }\r
171 \r
172         private Map<Integer, Boolean> deployKibanaDashboardImport(Design design) {\r
173                 URL_FlAG = "Kibana";\r
174                 POST_FLAG = "KibanaDashboardImport";\r
175                 String requestBody = design.getBody();\r
176                 Set<Db> dbs =  design.getDbs();\r
177                 Map<Integer, Boolean> deployKibanaMap = new HashMap<>();\r
178 \r
179                 if (!dbs.isEmpty()) {\r
180                         Map<Integer, String> map = urlMap(dbs, URL_FlAG);\r
181                         log.info("Deploy kibana dashboard url map: " + map);\r
182                         if (!map.isEmpty()) {\r
183                                 Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator();\r
184                                 while (it.hasNext()) {\r
185                                         Map.Entry<Integer, String> entry = it.next();\r
186                                         deployKibanaMap.put(entry.getKey(), HttpClientUtil.sendHttpClientPost(entry.getValue(), requestBody, POST_FLAG, URL_FlAG));\r
187                                 }\r
188                         }\r
189                         return deployKibanaMap;\r
190                 } else {\r
191                         return deployKibanaMap;\r
192                 }\r
193         }\r
194 \r
195         /**\r
196          * successed resp: { "acknowledged": true }\r
197          * \r
198          * @param design\r
199          * @param templateName\r
200          * @return flag\r
201          */\r
202         public Map<Integer, Boolean> postEsMappingTemplate(Design design, String templateName) {\r
203                 URL_FlAG = "Elasticsearch";\r
204                 POST_FLAG = "ElasticsearchMappingTemplate";\r
205                 String requestBody = design.getBody();\r
206                 Set<Db> dbs = design.getDbs();\r
207                 Map<Integer, Boolean> deployEsMap = new HashMap<>();\r
208 \r
209                 if (!dbs.isEmpty()) {\r
210                         Map<Integer, String> map = urlMap(dbs, URL_FlAG);\r
211                         log.info("Deploy elasticsearch url map: " + map);\r
212                         if (!map.isEmpty()) {\r
213                                 Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator();\r
214                                 while (it.hasNext()) {\r
215                                         Map.Entry<Integer, String> entry = it.next();\r
216                                         deployEsMap.put(entry.getKey(), HttpClientUtil.sendHttpClientPost(entry.getValue()+templateName, requestBody, POST_FLAG, URL_FlAG));\r
217                                 }\r
218                         }\r
219                         return deployEsMap;\r
220                 } else {\r
221                         return deployEsMap;\r
222                 }\r
223         }\r
224 \r
225         private Map<Integer, String> urlMap (Set<Db> dbs, String flag) {\r
226                 Map<Integer, String> map = new HashMap<>();\r
227                 for (Db item : dbs) {\r
228                         if (item.isEnabled()) {\r
229                                 map.put(item.getId(), httpRequestUrl(item.getHost(), item.getPort(), flag));\r
230                         }\r
231                 }\r
232                 return map;\r
233         }\r
234 \r
235         private String httpRequestUrl(String host, Integer port, String urlFlag) {\r
236                 String url = "";\r
237                 switch (urlFlag) {\r
238                         case "Kibana":\r
239                                 if (port == null) {\r
240                                         port = applicationConfiguration.getKibanaPort();\r
241                                 }\r
242                                 url = "http://" + host + ":" + port + applicationConfiguration.getKibanaDashboardImportApi();\r
243                                 log.info("Kibana url: " + url);\r
244                                 break;\r
245                         case "Elasticsearch":\r
246                                 if (port == null) {\r
247                                         port = applicationConfiguration.getEsPort();\r
248                                 }\r
249                                 url = "http://" + host + ":" + port + applicationConfiguration.getEsTemplateMappingApi();\r
250                                 log.info("Elasticsearch url: " + url);\r
251                                 break;\r
252                         default:\r
253                                 break;\r
254                 }\r
255                 return url;\r
256         }\r
257 \r
258         private void deploySave(Map<Integer, Boolean> map, Design design) {\r
259                 if (!map.isEmpty()) {\r
260                         Iterator<Map.Entry<Integer, Boolean>> it = map.entrySet().iterator();\r
261                         while (it.hasNext()) {\r
262                                 Map.Entry<Integer, Boolean> entry = it.next();\r
263                                 if (entry.getValue()) {\r
264                                         design.setSubmitted(true);\r
265                                         designRepository.save(design);\r
266                                         log.info("Status was modified");\r
267                                 }\r
268                         }\r
269                 }\r
270         }\r
271 \r
272 }\r