2 * ============LICENSE_START=======================================================
\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
11 * http://www.apache.org/licenses/LICENSE-2.0
\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
21 package org.onap.datalake.feeder.service;
\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
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
48 * Service for portalDesigns
\r
50 * @author guochunmeng
\r
54 public class DesignService {
\r
56 private final Logger log = LoggerFactory.getLogger(this.getClass());
\r
58 private static String POST_FLAG;
\r
60 private static String URL_FlAG;
\r
63 private DesignRepository designRepository;
\r
66 private TopicNameRepository topicNameRepository;
\r
69 private DesignTypeRepository designTypeRepository;
\r
72 private ApplicationConfiguration applicationConfiguration;
\r
75 private DbRepository dbRepository;
\r
77 public Design fillDesignConfiguration(DesignConfig designConfig) {
\r
78 Design design = new Design();
\r
79 fillDesign(designConfig, design);
\r
83 public void fillDesignConfiguration(DesignConfig designConfig, Design design) {
\r
84 fillDesign(designConfig, design);
\r
87 private void fillDesign(DesignConfig designConfig, Design design) throws IllegalArgumentException {
\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
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
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
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
117 if (dbs.size() > 0)
\r
118 design.setDbs(dbs);
\r
120 design.getDbs().clear();
\r
121 design.setDbs(dbs);
\r
124 design.setDbs(dbs);
\r
128 public Design getDesign(Integer id) {
\r
130 Optional<Design> ret = designRepository.findById(id);
\r
131 return ret.isPresent() ? ret.get() : null;
\r
134 public List<DesignConfig> queryAllDesign() {
\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
145 return designConfigList;
\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
153 switch (designTypeEnum) {
\r
155 log.info("Deploy kibana dashboard");
\r
156 resultMap = deployKibanaDashboardImport(design);
\r
157 deploySave(resultMap, design);
\r
160 log.info("Deploy elasticsearch mapping template");
\r
161 resultMap = postEsMappingTemplate(design, design.getTopicName().getId().toLowerCase());
\r
162 deploySave(resultMap, design);
\r
165 log.error("Not implemented {}", designTypeEnum);
\r
168 log.info("Response resultMap: " + resultMap);
\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
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
189 return deployKibanaMap;
\r
191 return deployKibanaMap;
\r
196 * successed resp: { "acknowledged": true }
\r
199 * @param templateName
\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
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
219 return deployEsMap;
\r
221 return deployEsMap;
\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
235 private String httpRequestUrl(String host, Integer port, String urlFlag) {
\r
239 if (port == null) {
\r
240 port = applicationConfiguration.getKibanaPort();
\r
242 url = "http://" + host + ":" + port + applicationConfiguration.getKibanaDashboardImportApi();
\r
243 log.info("Kibana url: " + url);
\r
245 case "Elasticsearch":
\r
246 if (port == null) {
\r
247 port = applicationConfiguration.getEsPort();
\r
249 url = "http://" + host + ":" + port + applicationConfiguration.getEsTemplateMappingApi();
\r
250 log.info("Elasticsearch url: " + url);
\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