Sync Integ to Master
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / auditing / impl / AuditingManager.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.openecomp.sdc.be.auditing.impl;
22
23 import org.openecomp.sdc.be.auditing.api.AuditEventFactory;
24 import org.openecomp.sdc.be.config.ConfigurationManager;
25 import org.openecomp.sdc.be.dao.api.ActionStatus;
26 import org.openecomp.sdc.be.dao.cassandra.AuditCassandraDao;
27 import org.openecomp.sdc.be.dao.cassandra.CassandraOperationStatus;
28 import org.openecomp.sdc.be.dao.impl.AuditingDao;
29 import org.openecomp.sdc.be.resources.data.auditing.AuditRecordFactory;
30 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
31 import org.openecomp.sdc.be.resources.data.auditing.AuditingGenericEvent;
32 import org.openecomp.sdc.common.api.Constants;
33 import org.openecomp.sdc.common.datastructure.AuditingFieldsKeysEnum;
34 import org.openecomp.sdc.common.util.ThreadLocalsHolder;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37 import org.springframework.stereotype.Component;
38
39 import java.util.Map;
40 import java.util.Map.Entry;
41
42 @Component
43 public class AuditingManager {
44
45     private static final Logger log = LoggerFactory.getLogger(AuditingManager.class);
46     private final AuditingDao auditingDao;
47     private final AuditCassandraDao cassandraDao;
48
49     public AuditingManager(AuditingDao auditingDao, AuditCassandraDao cassandraDao) {
50         this.auditingDao = auditingDao;
51         this.cassandraDao = cassandraDao;
52     }
53
54     // TODO remove after completing refactoring
55     public String auditEvent(Map<AuditingFieldsKeysEnum, Object> auditingFields) {
56         String msg = "";
57         try {
58             boolean disableAudit = ConfigurationManager.getConfigurationManager().getConfiguration().isDisableAudit();
59             if (disableAudit) {
60                 return null;
61             }
62             // Adding UUID from thread local
63             auditingFields.put(AuditingFieldsKeysEnum.AUDIT_REQUEST_ID, ThreadLocalsHolder.getUuid());
64
65             Object status = auditingFields.get(AuditingFieldsKeysEnum.AUDIT_STATUS);
66             auditingFields.put(AuditingFieldsKeysEnum.AUDIT_STATUS, String.valueOf(status));
67
68             // normalizing empty string values - US471661
69             normalizeEmptyAuditStringValues(auditingFields);
70
71             // Format modifier
72             formatModifier(auditingFields);
73
74             // Format user
75             formatUser(auditingFields);
76
77             // Logging the event
78             msg = AuditingLogFormatUtil.logAuditEvent(auditingFields);
79
80             // Determining the type of the auditing data object
81             AuditingActionEnum actionEnum = AuditingActionEnum.getActionByName((String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_ACTION));
82             log.info("audit event {} of type {}", actionEnum.getName(), actionEnum.getAuditingEsType());
83             ActionStatus addRecordStatus = auditingDao.addRecord(auditingFields, actionEnum.getAuditingEsType());
84             if (!addRecordStatus.equals(ActionStatus.OK)) {
85                 log.warn("Failed to persist auditing event: {}", addRecordStatus);
86             }
87
88             AuditingGenericEvent recordForCassandra = AuditRecordFactory.createAuditRecord(auditingFields);
89             if (recordForCassandra != null) {
90                 saveEventToCassandra(recordForCassandra);
91             }
92
93         } catch (Exception e) {
94             // Error during auditing shouldn't terminate flow
95             log.warn("Error during auditEvent: {}", e);
96         }
97         return msg;
98     }
99
100
101     public String auditEvent(AuditEventFactory factory) {
102         if (ConfigurationManager.getConfigurationManager().getConfiguration().isDisableAudit()) {
103             return null;
104         }
105         AuditingGenericEvent event = factory.getDbEvent();
106         // Logging the event
107         //TODO - change this call after EELF Audit stuff merge
108         String msg = factory.getLogMessage();
109         AuditingLogFormatUtil.logAuditEvent(msg);
110
111         //TODO - remove this method after we got rid of ES
112         saveEventToElasticSearch(factory, event);
113         saveEventToCassandra(event);
114         return msg;
115     }
116
117     private void saveEventToCassandra(AuditingGenericEvent event) {
118         CassandraOperationStatus result = cassandraDao.saveRecord(event);
119         if (!result.equals(CassandraOperationStatus.OK)) {
120             log.warn("Failed to persist to cassandra auditing event: {}", result.name());
121         }
122     }
123
124     private void saveEventToElasticSearch(AuditEventFactory factory, AuditingGenericEvent event) {
125         ActionStatus addRecordStatus = auditingDao.addRecord(event, factory.getAuditingEsType());
126         if (!addRecordStatus.equals(ActionStatus.OK)) {
127             log.warn("Failed to persist auditing event: {}", addRecordStatus.name());
128         }
129     }
130
131
132     private void formatUser(Map<AuditingFieldsKeysEnum, Object> auditingFields) {
133         if (auditingFields.get(AuditingFieldsKeysEnum.AUDIT_USER_UID) != null) {
134             String userDetails = (String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_USER_UID);
135
136             String user = AuditingLogFormatUtil.getUser(userDetails);
137             auditingFields.put(AuditingFieldsKeysEnum.AUDIT_USER_UID, user);
138         }
139     }
140
141     private void formatModifier(Map<AuditingFieldsKeysEnum, Object> auditingFields) {
142         String modifier = AuditingLogFormatUtil.getModifier((String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_MODIFIER_NAME), (String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_MODIFIER_UID));
143         auditingFields.put(AuditingFieldsKeysEnum.AUDIT_MODIFIER_UID, modifier);
144         auditingFields.remove(AuditingFieldsKeysEnum.AUDIT_MODIFIER_NAME);
145     }
146
147     private void normalizeEmptyAuditStringValues(Map<AuditingFieldsKeysEnum, Object> auditingFields) {
148         for (Entry<AuditingFieldsKeysEnum, Object> auditingEntry : auditingFields.entrySet()) {
149             if (auditingEntry.getKey().getValueClass().equals(String.class)) {
150                 String auditingValue = (String) auditingEntry.getValue();
151                 boolean isEmpty = false;
152                 if (auditingValue != null) {
153                     String trimmedValue = auditingValue.trim();
154                     if ((trimmedValue.equals(Constants.EMPTY_STRING)) || trimmedValue.equals(Constants.NULL_STRING) || trimmedValue.equals(Constants.DOUBLE_NULL_STRING)) {
155                         isEmpty = true;
156                     }
157                 } else {// is null
158                     isEmpty = true;
159                 }
160                 // Normalizing to ""
161                 if (isEmpty) {
162                     auditingEntry.setValue(Constants.EMPTY_STRING);
163                 }
164             }
165         }
166     }
167 }