6a67a99fcfccfb428a571d9cc959df88537e9c73
[sdc.git] / catalog-dao / src / main / java / org / openecomp / sdc / be / dao / impl / AuditingDao.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.dao.impl;
22
23 import fj.data.Either;
24 import org.elasticsearch.index.query.BoolQueryBuilder;
25 import org.elasticsearch.index.query.QueryBuilder;
26 import org.elasticsearch.index.query.QueryBuilders;
27 import org.openecomp.sdc.be.config.BeEcompErrorManager;
28 import org.openecomp.sdc.be.dao.api.ActionStatus;
29 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
30 import org.openecomp.sdc.be.resources.data.auditing.AuditingGenericEvent;
31 import org.openecomp.sdc.be.resources.data.auditing.AuditingTypesConstants;
32 import org.openecomp.sdc.be.resources.data.auditing.ResourceAdminEvent;
33 import org.openecomp.sdc.common.datastructure.AuditingFieldsKey;
34 import org.openecomp.sdc.common.datastructure.ESTimeBasedEvent;
35 import org.openecomp.sdc.common.log.wrappers.Logger;
36 import org.springframework.stereotype.Component;
37
38 import javax.annotation.PostConstruct;
39 import java.util.*;
40 import java.util.Map.Entry;
41
42 @Component("auditingDao")
43 public class AuditingDao extends ESTimeBasedDao {
44
45         private static final String SERVICE_INSTANCE_ID_FIELD = AuditingFieldsKey.AUDIT_SERVICE_INSTANCE_ID
46                         .getDisplayName(); // "serviceInstanceId";
47         private static final String STATUS_FIELD = AuditingFieldsKey.AUDIT_STATUS.getDisplayName(); // "status";
48         private static final String ACTION_FIELD = AuditingFieldsKey.AUDIT_ACTION.getDisplayName(); // "action";
49         private static final String DISTRIBUTION_ID_FIELD = AuditingFieldsKey.AUDIT_DISTRIBUTION_ID.getDisplayName(); // "distributionId";
50         private static Logger log = Logger.getLogger(AuditingDao.class.getName());
51         public static final String AUDITING_INDEX = "auditingevents";
52
53         @PostConstruct
54         private void init() {
55                 AuditingActionEnum[] values = AuditingActionEnum.values();
56                 for (AuditingActionEnum value : values) {
57                         typesToClasses.put(value.getAuditingEsType(), ESTimeBasedEvent.class);
58                 }
59         }
60
61         @Override
62         public String getIndexPrefix() {
63                 return AUDITING_INDEX;
64         }
65
66         public ActionStatus addRecord(Map<AuditingFieldsKey, Object> params, String type) {
67
68                 // TODO rhalili - remove? check debugEnabled?
69                 Map<String, Object> displayFields = new HashMap<>();
70                 StringBuilder sb = new StringBuilder();
71                 for (Entry<AuditingFieldsKey, Object> entry : params.entrySet()) {
72                         displayFields.put(entry.getKey().getDisplayName(), entry.getValue());
73                         sb.append(entry.getKey().getDisplayName()).append(" = ").append(entry.getValue()).append(",");
74                 }
75
76                 // Persisiting
77                 // String type = clazz.getSimpleName().toLowerCase();
78                 AuditingGenericEvent auditingGenericEvent = new AuditingGenericEvent();
79                 populateCommonFields(params, auditingGenericEvent);
80                 auditingGenericEvent.getFields().putAll(displayFields);
81
82                 log.debug("Auditing: Persisting object of type {}, fields: {}", type, sb.toString());
83
84                 return write(type, auditingGenericEvent);
85         }
86
87         public ActionStatus addRecord(AuditingGenericEvent auditEvent, String type) {
88
89                 log.debug("Auditing: Persisting object of type {}, fields: {}", type, auditEvent.getAction());
90 //              auditEvent.fillFields();
91                 return write(type, auditEvent);
92         }
93
94         public Either<List<ESTimeBasedEvent>, ActionStatus> getListOfDistributionStatuses(String did) {
95
96                 QueryBuilder componentNameMatch = QueryBuilders.matchQuery(DISTRIBUTION_ID_FIELD, did);
97                 QueryBuilder componentVersionMatch = QueryBuilders.matchQuery(ACTION_FIELD,
98                                 AuditingActionEnum.DISTRIBUTION_STATUS.getName());
99                 QueryBuilder remainingElementQueryBuilder = QueryBuilders.boolQuery().must(componentNameMatch)
100                                 .must(componentVersionMatch);
101                 List<ESTimeBasedEvent> remainingElements = null;
102                 try {
103                         remainingElements = customFindEvent(AuditingTypesConstants.DISTRIBUTION_STATUS_EVENT_TYPE,
104                                         remainingElementQueryBuilder, null);
105                 } catch (Exception e) {
106                         BeEcompErrorManager.getInstance().logBeDaoSystemError("Get DistributionStatuses List");
107                         log.debug("failed to get distribution statuses for ", e);
108                         return Either.right(ActionStatus.GENERAL_ERROR);
109                 }
110                 if (remainingElements != null && !remainingElements.isEmpty()) {
111                         return Either.left(remainingElements);
112                 } else {
113                         log.debug("not found distribution statuses for did {}", did);
114                         remainingElements = new ArrayList<>();
115                         return Either.left(remainingElements);
116                 }
117
118         }
119
120         public Either<List<ESTimeBasedEvent>, ActionStatus> getServiceDistributionStatusesList(String serviceInstanceId) {
121
122                 List<ESTimeBasedEvent> resList = new ArrayList<>();
123                 QueryBuilder componentNameMatch = QueryBuilders.matchQuery(SERVICE_INSTANCE_ID_FIELD, serviceInstanceId);
124                 QueryBuilder componentVersionMatch = QueryBuilders.matchQuery(ACTION_FIELD,
125                                 AuditingActionEnum.DISTRIBUTION_STATE_CHANGE_REQUEST.getName());
126                 QueryBuilder remainingElementQueryBuilder = QueryBuilders.boolQuery().must(componentNameMatch)
127                                 .must(componentVersionMatch);
128                 List<ESTimeBasedEvent> remainingElements = null;
129                 try {
130                         remainingElements = customFindEvent(AuditingTypesConstants.RESOURCE_ADMIN_EVENT_TYPE,
131                                         remainingElementQueryBuilder, null);
132                 } catch (Exception e) {
133                         BeEcompErrorManager.getInstance().logBeDaoSystemError("Get Service DistributionStatuses List");
134                         log.debug("failed to get  distribution statuses for action {}",
135                                         AuditingActionEnum.DISTRIBUTION_STATE_CHANGE_REQUEST.getName(), e);
136                         return Either.right(ActionStatus.GENERAL_ERROR);
137                 }
138                 if (remainingElements != null && !remainingElements.isEmpty()) {
139                         resList.addAll(remainingElements);
140                 }
141
142                 componentVersionMatch = QueryBuilders.matchQuery(ACTION_FIELD,
143                                 AuditingActionEnum.DISTRIBUTION_DEPLOY.getName());
144                 remainingElementQueryBuilder = QueryBuilders.boolQuery().must(componentNameMatch).must(componentVersionMatch);
145                 List<ESTimeBasedEvent> dResultElements = null;
146                 try {
147                         dResultElements = customFindEvent(AuditingTypesConstants.DISTRIBUTION_DEPLOY_EVENT_TYPE,
148                                         remainingElementQueryBuilder, null);
149                 } catch (Exception e) {
150                         BeEcompErrorManager.getInstance().logBeDaoSystemError("Get Service DistributionStatuses List");
151                         log.debug("failed to get distribution statuses for action {}",
152                                         AuditingActionEnum.DISTRIBUTION_DEPLOY.getName(), e);
153                         return Either.right(ActionStatus.GENERAL_ERROR);
154                 }
155                 if (dResultElements != null && !dResultElements.isEmpty()) {
156                         resList.addAll(dResultElements);
157                 }
158
159                 componentVersionMatch = QueryBuilders.matchQuery(ACTION_FIELD,
160                                 AuditingActionEnum.DISTRIBUTION_NOTIFY.getName());
161                 remainingElementQueryBuilder = QueryBuilders.boolQuery().must(componentNameMatch).must(componentVersionMatch);
162                 List<ESTimeBasedEvent> dNotifyElements = null;
163                 try {
164                         dNotifyElements = customFindEvent(AuditingTypesConstants.DISTRIBUTION_NOTIFICATION_EVENT_TYPE,
165                                         remainingElementQueryBuilder, null);
166                 } catch (Exception e) {
167                         BeEcompErrorManager.getInstance().logBeDaoSystemError("Get Service DistributionStatuses List");
168                         log.debug("failed to get distribution statuses for action {}",
169                                         AuditingActionEnum.DISTRIBUTION_NOTIFY.getName(), e);
170                         return Either.right(ActionStatus.GENERAL_ERROR);
171                 }
172                 if (remainingElements != null && !remainingElements.isEmpty()) {
173                         resList.addAll(dNotifyElements);
174                 }
175
176                 return Either.left(resList);
177
178         }
179
180         public Either<List<ESTimeBasedEvent>, ActionStatus> getFilteredResourceAdminAuditingEvents(
181                         Map<AuditingFieldsKey, Object> filterMap) {
182
183                 Iterator<Entry<AuditingFieldsKey, Object>> filterItr = filterMap.entrySet().iterator();
184                 BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
185                 while (filterItr.hasNext()) {
186                         Entry<AuditingFieldsKey, Object> curr = filterItr.next();
187                         boolQuery = boolQuery.must(QueryBuilders.termQuery(curr.getKey().getDisplayName(), curr.getValue()));
188                 }
189
190                 try {
191                         List<ESTimeBasedEvent> customFindEvent = customFindEvent(
192                                         ResourceAdminEvent.class.getSimpleName().toLowerCase(), boolQuery, null);
193                         return Either.left(customFindEvent);
194                 } catch (Exception e) {
195                         log.debug("Failed to query AuditRecords in es");
196                         return Either.right(ActionStatus.GENERAL_ERROR);
197                 }
198
199         }
200
201         public Either<List<ESTimeBasedEvent>, ActionStatus> getListOfDistributionByAction(String did, String actionType,
202                         String requestedStatus, Class<? extends AuditingGenericEvent> clazz) {
203
204                 QueryBuilder distributionIdMatch = QueryBuilders.matchQuery(DISTRIBUTION_ID_FIELD, did);
205                 QueryBuilder distributionActionMatch = QueryBuilders.matchQuery(ACTION_FIELD, actionType);
206                 QueryBuilder remainingElementQueryBuilder;
207
208                 if (requestedStatus != null && !requestedStatus.isEmpty()) {
209                         QueryBuilder statusMatch = QueryBuilders.matchQuery(STATUS_FIELD, requestedStatus);
210                         remainingElementQueryBuilder = QueryBuilders.boolQuery().must(distributionIdMatch)
211                                         .must(distributionActionMatch).must(statusMatch);
212                 } else {
213                         remainingElementQueryBuilder = QueryBuilders.boolQuery().must(distributionIdMatch)
214                                         .must(distributionActionMatch);
215                 }
216
217                 List<ESTimeBasedEvent> remainingElements = null;
218                 try {
219                         remainingElements = customFindEvent(clazz.getSimpleName().toLowerCase(), remainingElementQueryBuilder,
220                                         null);
221                 } catch (Exception e) {
222                         BeEcompErrorManager.getInstance().logBeDaoSystemError("Get DistributionStatuses List");
223                         log.debug("failed to get distribution statuses for action {}", actionType, e);
224                         return Either.right(ActionStatus.GENERAL_ERROR);
225                 }
226
227                 return Either.left(remainingElements);
228
229         }
230
231         private void populateCommonFields(Map<AuditingFieldsKey, Object> params,
232                         AuditingGenericEvent timeBasedIndexedData) {
233                 String dateStr = (String) params.get(AuditingFieldsKey.AUDIT_TIMESTAMP);
234                 if (dateStr != null) {
235                         timeBasedIndexedData.setTimestamp(dateStr);
236                 }
237                 timeBasedIndexedData.setAction((String) params.get(AuditingFieldsKey.AUDIT_ACTION));
238                 Object statusObj = params.get(AuditingFieldsKey.AUDIT_STATUS);
239                 // For BC. status was Integer and is String
240                 if (statusObj != null) {
241                         timeBasedIndexedData.setStatus(String.valueOf(statusObj));
242                 } else {
243                         timeBasedIndexedData.setStatus(null);
244                 }
245                 // timeBasedIndexedData.setStatus((String)params.get(AuditingFieldsKey.AUDIT_STATUS));
246                 timeBasedIndexedData.setDesc((String) params.get(AuditingFieldsKey.AUDIT_DESC));
247                 timeBasedIndexedData
248                                 .setServiceInstanceId((String) params.get(AuditingFieldsKey.AUDIT_SERVICE_INSTANCE_ID));
249                 timeBasedIndexedData.setRequestId((String) params.get(AuditingFieldsKey.AUDIT_REQUEST_ID));
250         }
251
252 }