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.common.dmaap;
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;
37 public class DmaapService {
40 private AaiQuery aaiQuery;
41 public static final ConcurrentHashMap<String, String> loopControlNames = new ConcurrentHashMap<>();
42 public static final ConcurrentHashMap<String, String> alarmUniqueRequestID = new ConcurrentHashMap<>();
44 public void publishPolicyMsg(PolicyMsg policyMsg, String dmaapConfigKey) {
46 Publisher publisher = new Publisher();
47 publisher.setUrl(DcaeConfigurationsCache.getPubSecInfo(dmaapConfigKey).getDmaapInfo()
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!");
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));
65 private PolicyMsg getEnrichedPolicyMsg(VmEntity vmEntity, VesAlarm rootAlarm, VesAlarm childAlarm,
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);
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);
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);
85 policyMsg.getAai().put("vserver.prov-status", vmEntity.getProvStatus());
86 policyMsg.getAai().put("vserver.resource-version", vmEntity.getResourceVersion());
88 policyMsg.setClosedLoopAlarmEnd(rootAlarm.getLastEpochMicrosec());
89 policyMsg.setClosedLoopEventStatus(EVENT_STATUS.ABATED);
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");
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);
116 private String getUniqueRequestId(VesAlarm rootAlarm) {
117 String alarmUniqueKey = "";
118 if (rootAlarm.getAlarmIsCleared() == PolicyMassgeConstant.POLICY_MESSAGE_ABATED) {
120 rootAlarm.getSourceId() + ":" + rootAlarm.getEventName().replace("Cleared", "");
122 alarmUniqueKey = rootAlarm.getSourceId() + ":" + rootAlarm.getEventName();
124 if (alarmUniqueRequestID.containsKey(alarmUniqueKey)) {
125 return alarmUniqueRequestID.get(alarmUniqueKey);
127 String requestID = UUID.randomUUID().toString();
128 alarmUniqueRequestID.put(alarmUniqueKey, requestID);
133 private void enrichVnfInfo(VmEntity vmEntity, VesAlarm childAlarm, PolicyMsg policyMsg) {
136 if (null != childAlarm) {
137 vnfId = childAlarm.getSourceId();
138 vnfName = childAlarm.getSourceName();
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);
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);
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;
162 vserverInstanceId = relationship
163 .getRelationshipDataValue(PolicyMassgeConstant.SERVICE_INSTANCE_ID);
165 return vserverInstanceId;
168 private VnfEntity getVnfEntity(String vnfId, String vnfName) {
169 VnfEntity vnfEntity = null;
171 vnfEntity = aaiQuery.getAaiVnfData(vnfId, vnfName);
172 } catch (CorrelationException e) {
173 log.error("Failed to get the VNF data.", e);
178 private VmEntity getVmEntity(String sourceId, String sourceName) {
179 VmEntity vmEntity = null;
181 vmEntity = aaiQuery.getAaiVmData(sourceId, sourceName);
182 } catch (CorrelationException e) {
183 log.error("Failed to get the VM data.", e);
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);
197 log.info("Clear alarm, requestId deleted successful");