f19b89ce6bdd43475dc2cc7acc0851daadbd2ea3
[holmes/common.git] / holmes-actions / src / main / java / org / onap / holmes / common / dmaap / DmaapService.java
1 /*
2  * Copyright 2017 ZTE Corporation.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16 package org.onap.holmes.common.dmaap;
17
18 import java.util.Optional;
19 import java.util.UUID;
20 import java.util.concurrent.ConcurrentHashMap;
21 import javax.inject.Inject;
22 import lombok.extern.slf4j.Slf4j;
23 import org.jvnet.hk2.annotations.Service;
24 import org.onap.holmes.common.aai.AaiQuery;
25 import org.onap.holmes.common.aai.entity.RelationshipList.Relationship;
26 import org.onap.holmes.common.aai.entity.VmEntity;
27 import org.onap.holmes.common.aai.entity.VnfEntity;
28 import org.onap.holmes.common.api.stat.VesAlarm;
29 import org.onap.holmes.common.dcae.DcaeConfigurationsCache;
30 import org.onap.holmes.common.dmaap.entity.PolicyMsg;
31 import org.onap.holmes.common.dmaap.entity.PolicyMsg.EVENT_STATUS;
32 import org.onap.holmes.common.exception.CorrelationException;
33 import org.onap.holmes.common.utils.GsonUtil;
34
35 @Slf4j
36 @Service
37 public class DmaapService {
38
39     @Inject
40     private AaiQuery aaiQuery;
41     public static final ConcurrentHashMap<String, String> loopControlNames = new ConcurrentHashMap<>();
42     public static final ConcurrentHashMap<String, String> alarmUniqueRequestID = new ConcurrentHashMap<>();
43
44     public void publishPolicyMsg(PolicyMsg policyMsg, String dmaapConfigKey) {
45         try {
46             Publisher publisher = new Publisher();
47             publisher.setUrl(DcaeConfigurationsCache.getPubSecInfo(dmaapConfigKey).getDmaapInfo()
48                     .getTopicUrl());
49             publisher.publish(policyMsg);
50             deleteRequestId(policyMsg);
51             log.info("send policyMsg: " + GsonUtil.beanToJson(policyMsg));
52         } catch (CorrelationException e) {
53             log.error("Failed to publish the control loop event to DMaaP", e);
54         } catch (NullPointerException e) {
55             log.error("DMaaP configurations do not exist!");
56         }
57     }
58
59     public PolicyMsg getPolicyMsg(VesAlarm rootAlarm, VesAlarm childAlarm, String packgeName) {
60         return Optional.ofNullable(getVmEntity(rootAlarm.getSourceId(), rootAlarm.getSourceName()))
61                 .map(vmEntity -> getEnrichedPolicyMsg(vmEntity, rootAlarm, childAlarm, packgeName))
62                 .orElse(getDefaultPolicyMsg(rootAlarm, packgeName));
63     }
64
65     private PolicyMsg getEnrichedPolicyMsg(VmEntity vmEntity, VesAlarm rootAlarm, VesAlarm childAlarm,
66             String packageName) {
67         PolicyMsg policyMsg = new PolicyMsg();
68         policyMsg.setRequestID(getUniqueRequestId(rootAlarm));
69         if (rootAlarm.getAlarmIsCleared() == PolicyMassgeConstant.POLICY_MESSAGE_ONSET) {
70             enrichVnfInfo(vmEntity, childAlarm, policyMsg);
71             policyMsg.setClosedLoopEventStatus(EVENT_STATUS.ONSET);
72             try {
73                 policyMsg.getAai().put("vserver.in-maint", Boolean.valueOf(vmEntity.getInMaint()).booleanValue());
74             } catch (Exception e) {
75                 log.error("Failed to parse the field \"in-maint\". A boolean string (\"true\"/\"false\")"
76                         + " is expected but the actual value is " + vmEntity.getInMaint() + ".", e);
77             }
78             try {
79                 policyMsg.getAai().put("vserver.is-closed-loop-disabled",
80                         Boolean.valueOf(vmEntity.getClosedLoopDisable()).booleanValue());
81             } catch (Exception e) {
82                 log.error("Failed to parse the field \"is-closed-loop-disabled\". A boolean string (\"true\"/\"false\")"
83                         + " is expected but the actual value is " + vmEntity.getClosedLoopDisable() + ".", e);
84             }
85             policyMsg.getAai().put("vserver.prov-status", vmEntity.getProvStatus());
86             policyMsg.getAai().put("vserver.resource-version", vmEntity.getResourceVersion());
87         } else {
88             policyMsg.setClosedLoopAlarmEnd(rootAlarm.getLastEpochMicrosec());
89             policyMsg.setClosedLoopEventStatus(EVENT_STATUS.ABATED);
90         }
91         policyMsg.setClosedLoopControlName(loopControlNames.get(packageName));
92         policyMsg.setClosedLoopAlarmStart(rootAlarm.getStartEpochMicrosec());
93         policyMsg.getAai().put("vserver.vserver-id", vmEntity.getVserverId());
94         policyMsg.getAai().put("vserver.vserver-name", vmEntity.getVserverName());
95         policyMsg.getAai().put("vserver.vserver-name2", vmEntity.getVserverName2());
96         policyMsg.getAai().put("vserver.vserver-selflink", vmEntity.getVserverSelflink());
97         policyMsg.setTarget("vserver.vserver-name");
98         return policyMsg;
99     }
100
101     private PolicyMsg getDefaultPolicyMsg(VesAlarm rootAlarm, String packageName) {
102         PolicyMsg policyMsg = new PolicyMsg();
103         policyMsg.setRequestID(getUniqueRequestId(rootAlarm));
104         policyMsg.setClosedLoopControlName(loopControlNames.get(packageName));
105         policyMsg.setClosedLoopAlarmStart(rootAlarm.getStartEpochMicrosec());
106         policyMsg.setTarget("vserver.vserver-name");
107         policyMsg.setTargetType("VM");
108         policyMsg.getAai().put("vserver.vserver-name", rootAlarm.getSourceName());
109         if (rootAlarm.getAlarmIsCleared() == PolicyMassgeConstant.POLICY_MESSAGE_ABATED) {
110             policyMsg.setClosedLoopAlarmEnd(rootAlarm.getLastEpochMicrosec());
111             policyMsg.setClosedLoopEventStatus(EVENT_STATUS.ABATED);
112         }
113         return policyMsg;
114     }
115
116     private String getUniqueRequestId(VesAlarm rootAlarm) {
117         String alarmUniqueKey = "";
118         if (rootAlarm.getAlarmIsCleared() == PolicyMassgeConstant.POLICY_MESSAGE_ABATED) {
119             alarmUniqueKey =
120                     rootAlarm.getSourceId() + ":" + rootAlarm.getEventName().replace("Cleared", "");
121         } else {
122             alarmUniqueKey = rootAlarm.getSourceId() + ":" + rootAlarm.getEventName();
123         }
124         if (alarmUniqueRequestID.containsKey(alarmUniqueKey)) {
125             return alarmUniqueRequestID.get(alarmUniqueKey);
126         } else {
127             String requestID = UUID.randomUUID().toString();
128             alarmUniqueRequestID.put(alarmUniqueKey, requestID);
129             return requestID;
130         }
131     }
132
133     private void enrichVnfInfo(VmEntity vmEntity, VesAlarm childAlarm, PolicyMsg policyMsg) {
134         String vnfId = "";
135         String vnfName = "";
136         if (null != childAlarm) {
137             vnfId = childAlarm.getSourceId();
138             vnfName = childAlarm.getSourceName();
139         } else {
140             Relationship relationship = vmEntity.getRelationshipList()
141                     .getRelationship(PolicyMassgeConstant.GENERIC_VNF);
142             if (null != relationship) {
143                 vnfId = relationship.getRelationshipDataValue(PolicyMassgeConstant.GENERIC_VNF_VNF_ID);
144                 vnfName = relationship.getRelatedToPropertyValue(PolicyMassgeConstant.GENERIC_VNF_VNF_NAME);
145             }
146         }
147         VnfEntity vnfEntity = getVnfEntity(vnfId, vnfName);
148         String vserverInstatnceId = getVserverInstanceId(vnfEntity);
149         policyMsg.getAai().put("generic-vnf.vnf-id", vnfId);
150         policyMsg.getAai().put("generic-vnf.service-instance-id", vserverInstatnceId);
151     }
152
153
154     private String getVserverInstanceId(VnfEntity vnfEntity) {
155         String vserverInstanceId = "";
156         if (vnfEntity != null) {
157             Relationship relationship = vnfEntity.getRelationshipList()
158                     .getRelationship(PolicyMassgeConstant.SERVICE_INSTANCE);
159             if (relationship == null) {
160                 return vserverInstanceId;
161             }
162             vserverInstanceId = relationship
163                     .getRelationshipDataValue(PolicyMassgeConstant.SERVICE_INSTANCE_ID);
164         }
165         return vserverInstanceId;
166     }
167
168     private VnfEntity getVnfEntity(String vnfId, String vnfName) {
169         VnfEntity vnfEntity = null;
170         try {
171             vnfEntity = aaiQuery.getAaiVnfData(vnfId, vnfName);
172         } catch (CorrelationException e) {
173             log.error("Failed to get the VNF data.", e);
174         }
175         return vnfEntity;
176     }
177
178     private VmEntity getVmEntity(String sourceId, String sourceName) {
179         VmEntity vmEntity = null;
180         try {
181             vmEntity = aaiQuery.getAaiVmData(sourceId, sourceName);
182         } catch (CorrelationException e) {
183             log.error("Failed to get the VM data.", e);
184         }
185         return vmEntity;
186     }
187
188     private void deleteRequestId(PolicyMsg policyMsg){
189         String status = policyMsg.getClosedLoopEventStatus().toString();
190         if(status == "ABATED"){
191             String requestId = policyMsg.getRequestID();
192             for(String key: alarmUniqueRequestID.keySet()){
193                 if(alarmUniqueRequestID.get(key).equals(requestId)){
194                     alarmUniqueRequestID.remove(key);
195                 }
196             }
197             log.info("Clear alarm, requestId deleted successful");
198         }
199     }
200 }