2 * Copyright 2017 ZTE Corporation.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package org.onap.holmes.rulemgt.wrapper;
18 import java.util.ArrayList;
19 import java.util.Date;
20 import java.util.List;
21 import javax.annotation.PostConstruct;
22 import javax.inject.Inject;
23 import javax.inject.Singleton;
25 import lombok.extern.slf4j.Slf4j;
26 import org.jvnet.hk2.annotations.Service;
27 import org.onap.holmes.rulemgt.bean.request.CorrelationCheckRule4Engine;
28 import org.onap.holmes.rulemgt.bean.response.RuleResult4API;
29 import org.onap.holmes.rulemgt.constant.RuleMgtConstant;
30 import org.onap.holmes.rulemgt.db.CorrelationRuleDao;
31 import org.onap.holmes.common.api.entity.CorrelationRule;
32 import org.onap.holmes.common.exception.CorrelationException;
33 import org.onap.holmes.common.utils.DbDaoUtil;
34 import org.onap.holmes.rulemgt.bean.request.CorrelationDeployRule4Engine;
35 import org.onap.holmes.rulemgt.bean.request.RuleCreateRequest;
36 import org.onap.holmes.rulemgt.bean.request.RuleDeleteRequest;
37 import org.onap.holmes.rulemgt.bean.request.RuleQueryCondition;
38 import org.onap.holmes.rulemgt.bean.request.RuleUpdateRequest;
39 import org.onap.holmes.rulemgt.bean.response.RuleAddAndUpdateResponse;
40 import org.onap.holmes.rulemgt.bean.response.RuleQueryListResponse;
41 import org.onap.holmes.rulemgt.bolt.enginebolt.EngineWrapper;
42 import org.onap.holmes.rulemgt.db.CorrelationRuleQueryDao;
43 import org.onap.holmes.rulemgt.tools.EngineTools;
49 public class RuleMgtWrapper {
52 private EngineTools engineTools;
55 private RuleQueryWrapper ruleQueryWrapper;
58 private CorrelationRuleQueryDao correlationRuleQueryDao;
60 private EngineWrapper engineWarpper;
62 private DbDaoUtil daoUtil;
64 private CorrelationRuleDao correlationRuleDao;
67 public void initDaoUtil() {
68 correlationRuleDao = daoUtil.getJdbiDaoByOnDemand(CorrelationRuleDao.class);
71 public RuleAddAndUpdateResponse addCorrelationRule(String creator, RuleCreateRequest ruleCreateRequest)
72 throws CorrelationException {
73 if (ruleCreateRequest == null) {
74 throw new CorrelationException("The request object can not be empty!");
76 CorrelationRule correlationRule = convertCreateRequest2Rule(creator,
78 validateCorrelationRule(correlationRule);
79 CorrelationRule ruleTemp = correlationRuleDao.queryRuleByRuleName(correlationRule.getName());
80 if (ruleTemp != null) {
81 throw new CorrelationException("A rule with the same name already exists.");
85 ip = engineTools.getEngineWithLeastRules();
86 } catch (Exception e) {
87 log.error("When adding rules, can not get engine instance ip");
89 String packageName = deployRule2Engine(correlationRule, ip);
90 correlationRule.setPackageName(packageName);
91 correlationRule.setEngineInstance(ip);
92 CorrelationRule result = null;
94 result = correlationRuleDao.saveRule(correlationRule);
95 } catch (CorrelationException e) {
96 engineWarpper.deleteRuleFromEngine(packageName, ip);
97 throw new CorrelationException(e.getMessage(), e);
99 RuleAddAndUpdateResponse ruleAddAndUpdateResponse = new RuleAddAndUpdateResponse();
100 ruleAddAndUpdateResponse.setRuleId(result.getRid());
101 return ruleAddAndUpdateResponse;
104 public RuleAddAndUpdateResponse updateCorrelationRule(String modifier, RuleUpdateRequest ruleUpdateRequest)
105 throws CorrelationException {
106 if (ruleUpdateRequest == null) {
107 throw new CorrelationException("The request object can not be empty!");
109 CorrelationRule oldCorrelationRule = correlationRuleDao.queryRuleByRid(ruleUpdateRequest.getRuleId());
110 if (oldCorrelationRule == null) {
111 throw new CorrelationException("You're trying to update a rule which does not exist in the system.");
114 String updateIp = oldCorrelationRule.getEngineInstance();
115 if (!checkIfEngineExists(updateIp)) {
116 updateIp = engineTools.getEngineWithLeastRules();
118 CorrelationRule newCorrelationRule = convertRuleUpdateRequest2CorrelationRule(modifier,
119 ruleUpdateRequest, oldCorrelationRule.getName());
120 newCorrelationRule.setEngineInstance(updateIp);
121 validateCorrelationRule(newCorrelationRule);
122 RuleAddAndUpdateResponse ruleChangeResponse = new RuleAddAndUpdateResponse();
123 ruleChangeResponse.setRuleId(newCorrelationRule.getRid());
125 if (!checkIfRuleChanged(newCorrelationRule, oldCorrelationRule)) {
126 return ruleChangeResponse;
128 String engineInstance = oldCorrelationRule.getEngineInstance();
129 if (oldCorrelationRule.getEnabled() == RuleMgtConstant.STATUS_ENABLED
130 && checkIfEngineExists(engineInstance)) {
131 engineWarpper.deleteRuleFromEngine(oldCorrelationRule.getPackageName(), engineInstance);
133 newCorrelationRule.setPackageName(deployRule2Engine(newCorrelationRule, updateIp));
134 correlationRuleDao.updateRule(newCorrelationRule);
135 return ruleChangeResponse;
138 private void validateCorrelationRule(CorrelationRule correlationRule) throws CorrelationException {
139 int enabled = correlationRule.getEnabled();
140 String ruleName = correlationRule.getName() == null ? "" : correlationRule.getName().trim();
141 String content = correlationRule.getContent() == null ? "" : correlationRule.getContent().trim();
142 if ("".equals(content)) {
143 throw new CorrelationException("The contents of the rule can not be empty!");
145 if (enabled != RuleMgtConstant.STATUS_DISABLED
146 && enabled != RuleMgtConstant.STATUS_ENABLED) {
147 throw new CorrelationException("Invalid rule status. Only 0 (disabled) and 1 (enabled) are allowed.");
149 if ("".equals(ruleName)) {
150 throw new CorrelationException("The name of the rule can not be empty.");
154 private boolean checkIfRuleChanged(CorrelationRule newCorrelationRule, CorrelationRule oldCorrelationRule) {
155 String newContent = newCorrelationRule.getContent();
156 String oldContent = oldCorrelationRule.getContent();
157 int newEnabled = newCorrelationRule.getEnabled();
158 int oldEnabled = oldCorrelationRule.getEnabled();
159 String newDes = newCorrelationRule.getDescription();
160 String oldDes = oldCorrelationRule.getDescription();
161 String oldControlLoop = oldCorrelationRule.getClosedControlLoopName();
162 String newControlLoop = newCorrelationRule.getClosedControlLoopName();
163 if (newContent.equals(oldContent) && newEnabled == oldEnabled
164 && newDes.equals(oldDes) && newControlLoop.equals(oldControlLoop)) {
170 public void deleteCorrelationRule(RuleDeleteRequest ruleDeleteRequest)
171 throws CorrelationException {
172 if (ruleDeleteRequest == null) {
173 throw new CorrelationException("The request object can not be empty!");
175 CorrelationRule correlationRule = correlationRuleDao.queryRuleByRid(ruleDeleteRequest.getRuleId());
176 if (correlationRule == null) {
177 log.warn("the rule:rule id=" + ruleDeleteRequest.getRuleId() + " does not exist the database.");
178 throw new CorrelationException("You're trying to delete a rule which does not exist in the system.");
180 if (correlationRule.getEnabled() == RuleMgtConstant.STATUS_ENABLED) {
181 String ip = correlationRule.getEngineInstance();
182 engineWarpper.deleteRuleFromEngine(correlationRule.getPackageName(), ip);
184 correlationRuleDao.deleteRule(correlationRule);
187 private CorrelationRule convertCreateRequest2Rule(String userName,
188 RuleCreateRequest ruleCreateRequest) throws CorrelationException {
189 String tempContent = ruleCreateRequest.getContent();
190 CorrelationRule correlationRule = new CorrelationRule();
191 String ruleId = "rule_" + System.currentTimeMillis();
192 String description = ruleCreateRequest.getDescription() == null ? "" : ruleCreateRequest.getDescription();
193 correlationRule.setRid(ruleId);
194 if (tempContent != null) {
195 correlationRule.setContent(tempContent.trim());
197 correlationRule.setDescription(description);
198 correlationRule.setCreateTime(new Date());
199 correlationRule.setUpdateTime(new Date());
200 correlationRule.setName(ruleCreateRequest.getRuleName());
201 correlationRule.setEngineID("correlation-d");
202 correlationRule.setEngineType("");
203 correlationRule.setTemplateID(0);
204 correlationRule.setVendor("");
205 correlationRule.setCreator(userName);
206 correlationRule.setModifier(userName);
207 correlationRule.setEnabled(ruleCreateRequest.getEnabled());
208 correlationRule.setClosedControlLoopName(ruleCreateRequest.getLoopControlName());
209 return correlationRule;
212 private CorrelationRule convertRuleUpdateRequest2CorrelationRule(String modifier,
213 RuleUpdateRequest ruleUpdateRequest, String ruleName) throws CorrelationException {
214 CorrelationRule correlationRule = new CorrelationRule();
215 String description = ruleUpdateRequest.getDescription() == null ? "" : ruleUpdateRequest.getDescription();
216 correlationRule.setRid(ruleUpdateRequest.getRuleId());
217 correlationRule.setContent(ruleUpdateRequest.getContent());
218 correlationRule.setDescription(description);
219 correlationRule.setEnabled(ruleUpdateRequest.getEnabled());
220 correlationRule.setUpdateTime(new Date());
221 correlationRule.setModifier(modifier);
222 correlationRule.setName(ruleName);
223 correlationRule.setClosedControlLoopName(ruleUpdateRequest.getLoopControlName());
224 return correlationRule;
227 public String deployRule2Engine(CorrelationRule correlationRule, String ip)
228 throws CorrelationException {
229 if (engineWarpper.checkRuleFromEngine(toCorrelationCheckRule(correlationRule), ip) && (
230 correlationRule.getEnabled() == RuleMgtConstant.STATUS_ENABLED)) {
231 return engineWarpper.deployEngine(correlationRules2DeployRule(correlationRule), ip);
236 public RuleQueryListResponse getCorrelationRuleByCondition(
237 RuleQueryCondition ruleQueryCondition) throws CorrelationException {
238 List<CorrelationRule> correlationRule = correlationRuleQueryDao
239 .getCorrelationRulesByCondition(ruleQueryCondition);
240 RuleQueryListResponse ruleQueryListResponse = new RuleQueryListResponse();
241 ruleQueryListResponse.setTotalCount(correlationRule.size());
242 ruleQueryListResponse
243 .setCorrelationRules(correlationRules2RuleResult4APIs(correlationRule));
244 return ruleQueryListResponse;
247 private List<RuleResult4API> correlationRules2RuleResult4APIs(
248 List<CorrelationRule> correlationRules) {
249 List<RuleResult4API> ruleResult4APIs = new ArrayList<RuleResult4API>();
250 for (CorrelationRule correlationRule : correlationRules) {
251 RuleResult4API ruleResult4API = new RuleResult4API();
252 String description = correlationRule.getDescription() == null ? "" : correlationRule.getDescription();
253 ruleResult4API.setRuleId(correlationRule.getRid());
254 ruleResult4API.setRuleName(correlationRule.getName());
255 ruleResult4API.setDescription(description);
256 ruleResult4API.setContent(correlationRule.getContent());
257 ruleResult4API.setCreateTime(correlationRule.getCreateTime());
258 ruleResult4API.setCreator(correlationRule.getCreator());
259 ruleResult4API.setUpdateTime(correlationRule.getUpdateTime());
260 ruleResult4API.setModifier(correlationRule.getModifier());
261 ruleResult4API.setEnabled(correlationRule.getEnabled());
262 ruleResult4API.setLoopControlName(correlationRule.getClosedControlLoopName());
263 ruleResult4APIs.add(ruleResult4API);
265 return ruleResult4APIs;
268 private CorrelationDeployRule4Engine correlationRules2DeployRule(
269 CorrelationRule correlationRule) {
270 CorrelationDeployRule4Engine correlationDeployRule4Engine = new CorrelationDeployRule4Engine();
271 correlationDeployRule4Engine.setContent(correlationRule.getContent());
272 correlationDeployRule4Engine.setEngineId(correlationRule.getEngineID());
273 correlationDeployRule4Engine.setLoopControlName(correlationRule.getClosedControlLoopName());
274 return correlationDeployRule4Engine;
277 private CorrelationCheckRule4Engine toCorrelationCheckRule(
278 CorrelationRule correlationRule) {
279 CorrelationCheckRule4Engine correlationCheckRule4Engine = new CorrelationCheckRule4Engine();
280 correlationCheckRule4Engine.setContent(correlationRule.getContent());
281 return correlationCheckRule4Engine;
284 private boolean checkIfEngineExists(String ip) {
285 List engineList = engineTools.getInstanceList();
286 return engineList.contains(ip);