deploy improve 1
[dcaegen2/services.git] / components / datalake-handler / feeder / src / main / java / org / onap / datalake / feeder / service / DesignService.java
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         @Autowired\r
61         private DesignRepository designRepository;\r
62 \r
63         @Autowired\r
64         private TopicNameRepository topicNameRepository;\r
65 \r
66         @Autowired\r
67         private DesignTypeRepository designTypeRepository;\r
68 \r
69         @Autowired\r
70         private ApplicationConfiguration applicationConfiguration;\r
71 \r
72         @Autowired\r
73         private DbRepository dbRepository;\r
74 \r
75         public Design fillDesignConfiguration(DesignConfig designConfig) {\r
76                 Design design = new Design();\r
77                 fillDesign(designConfig, design);\r
78                 return design;\r
79         }\r
80 \r
81         public void fillDesignConfiguration(DesignConfig designConfig, Design design) {\r
82                 fillDesign(designConfig, design);\r
83         }\r
84 \r
85         private void fillDesign(DesignConfig designConfig, Design design) throws IllegalArgumentException {\r
86 \r
87                 design.setId(designConfig.getId());\r
88                 design.setBody(designConfig.getBody());\r
89                 design.setName(designConfig.getName());\r
90                 design.setNote(designConfig.getNote());\r
91                 design.setSubmitted(designConfig.getSubmitted());\r
92 \r
93                 if (designConfig.getTopicName() == null)\r
94                         throw new IllegalArgumentException("Can not find topicName in tpoic_name, topic name: " + designConfig.getTopicName());\r
95                 Optional<TopicName> topicName = topicNameRepository.findById(designConfig.getTopicName());\r
96                 if (!topicName.isPresent())\r
97                         throw new IllegalArgumentException("topicName is null " + designConfig.getTopicName());\r
98                 design.setTopicName(topicName.get());\r
99 \r
100                 if (designConfig.getDesignType() == null)\r
101                         throw new IllegalArgumentException("Can not find designType in design_type, designType id " + designConfig.getDesignType());\r
102                 Optional<DesignType> designType = designTypeRepository.findById(designConfig.getDesignType());\r
103                 if (!designType.isPresent())\r
104                         throw new IllegalArgumentException("designType is null");\r
105                 design.setDesignType(designType.get());\r
106 \r
107                 Set<Db> dbs = new HashSet<>();\r
108                 if (designConfig.getDbs() != null) {\r
109                         for (Integer item : designConfig.getDbs()) {\r
110                                 Optional<Db> db = dbRepository.findById(item);\r
111                                 if (db.isPresent()) {\r
112                                         dbs.add(db.get());\r
113                                 }\r
114                         }\r
115                         if (dbs.size() > 0)\r
116                                 design.setDbs(dbs);\r
117                         else {\r
118                                 design.getDbs().clear();\r
119                                 design.setDbs(dbs);\r
120                         }\r
121                 } else {\r
122                         design.setDbs(dbs);\r
123                 }\r
124         }\r
125 \r
126         public Design getDesign(Integer id) {\r
127 \r
128                 Optional<Design> ret = designRepository.findById(id);\r
129                 return ret.isPresent() ? ret.get() : null;\r
130         }\r
131 \r
132         public List<DesignConfig> queryAllDesign() {\r
133 \r
134                 List<Design> designList = null;\r
135                 List<DesignConfig> designConfigList = new ArrayList<>();\r
136                 designList = (List<Design>) designRepository.findAll();\r
137                 if (!designList.isEmpty()) {\r
138                         log.info("DesignList is not null");\r
139                         for (Design design : designList) {\r
140                                 designConfigList.add(design.getDesignConfig());\r
141                         }\r
142                 }\r
143                 return designConfigList;\r
144         }\r
145 \r
146         public Map<Integer, Boolean> deploy(Design design) {\r
147                 Map<Integer, Boolean> resultMap = null;\r
148                 DesignType designType = design.getDesignType();\r
149                 DesignTypeEnum designTypeEnum = DesignTypeEnum.valueOf(designType.getId());\r
150 \r
151                 switch (designTypeEnum) {\r
152                 case KIBANA_DB:\r
153                         resultMap = deployKibanaImport(design);\r
154                         if (!resultMap.isEmpty()) {\r
155                                 Iterator<Map.Entry<Integer, Boolean>> it = resultMap.entrySet().iterator();\r
156                                 while (it.hasNext()) {\r
157                                         Map.Entry<Integer, Boolean> entry = it.next();\r
158                                         if (entry.getValue()) {\r
159                                                 design.setSubmitted(true);\r
160                                                 designRepository.save(design);\r
161                                         }\r
162                                 }\r
163                         }\r
164                 case ES_MAPPING:\r
165                         //FIXME\r
166                         //return postEsMappingTemplate(design, design.getTopicName().getId().toLowerCase());\r
167                 default:\r
168                         log.error("Not implemented {}", designTypeEnum);\r
169                 }\r
170                 return resultMap;\r
171         }\r
172 \r
173         private Map<Integer, Boolean> deployKibanaImport(Design design) {\r
174                 POST_FLAG = "KibanaDashboardImport";\r
175                 String requestBody = design.getBody();\r
176                 Set<Db> dbs =  design.getDbs();\r
177                 Map<Integer, Boolean> deployMap = new HashMap<>();\r
178 \r
179                 if (!dbs.isEmpty()) {\r
180                         Map<Integer, String> map = new HashMap<>();\r
181                         for (Db item : dbs) {\r
182                                 if (item.isEnabled()) {\r
183                                         map.put(item.getId(), kibanaImportUrl(item.getHost(), item.getPort()));\r
184                                 }\r
185                         }\r
186                         if (!map.isEmpty()) {\r
187                                 Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator();\r
188                                 while (it.hasNext()) {\r
189                                         Map.Entry<Integer, String> entry = it.next();\r
190                                         deployMap.put(entry.getKey(), HttpClientUtil.sendPostKibana(entry.getValue(), requestBody, POST_FLAG));\r
191                                 }\r
192                         }\r
193                         return deployMap;\r
194                 } else {\r
195                         return deployMap;\r
196                 }\r
197         }\r
198 \r
199         private String kibanaImportUrl(String host, Integer port) {\r
200                 if (port == null) {\r
201                         port = applicationConfiguration.getKibanaPort();\r
202                 }\r
203                 return "http://" + host + ":" + port + applicationConfiguration.getKibanaDashboardImportApi();\r
204         }\r
205 \r
206         /**\r
207          * successed resp: { "acknowledged": true }\r
208          * \r
209          * @param design\r
210          * @param templateName\r
211          * @return flag\r
212          */\r
213         public boolean postEsMappingTemplate(Design design, String templateName) {\r
214                 POST_FLAG = "ElasticsearchMappingTemplate";\r
215                 String requestBody = design.getBody();\r
216 \r
217                 //FIXME\r
218                 Set<Db> dbs = design.getDbs();\r
219                 //submit to each ES in dbs\r
220 \r
221                 //return HttpClientUtil.sendPostHttpClient("http://"+dbService.getElasticsearch().getHost()+":9200/_template/"+templateName, requestBody, POST_FLAG);\r
222                 return false;\r
223         }\r
224 \r
225 }\r