2 * ============LICENSE_START=======================================================
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
21 package org.openecomp.sdc.be.resources;
23 import fj.data.Either;
24 import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse;
25 import org.elasticsearch.action.search.SearchResponse;
26 import org.elasticsearch.index.query.MatchAllQueryBuilder;
27 import org.elasticsearch.search.SearchHit;
28 import org.elasticsearch.search.SearchHits;
29 import org.junit.After;
30 import org.junit.Before;
31 import org.junit.Test;
32 import org.junit.runner.RunWith;
33 import org.openecomp.sdc.be.config.Configuration;
34 import org.openecomp.sdc.be.config.Configuration.ElasticSearchConfig.IndicesTimeFrequencyEntry;
35 import org.openecomp.sdc.be.dao.api.ActionStatus;
36 import org.openecomp.sdc.be.dao.es.ElasticSearchClient;
37 import org.openecomp.sdc.be.dao.impl.AuditingDao;
38 import org.openecomp.sdc.be.resources.data.auditing.*;
39 import org.openecomp.sdc.be.utils.DAOConfDependentTest;
40 import org.openecomp.sdc.common.api.Constants;
41 import org.openecomp.sdc.common.datastructure.AuditingFieldsKey;
42 import org.openecomp.sdc.common.datastructure.ESTimeBasedEvent;
43 import org.slf4j.Logger;
44 import org.slf4j.LoggerFactory;
45 import org.springframework.test.context.ContextConfiguration;
46 import org.springframework.test.context.TestExecutionListeners;
47 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
48 import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
49 import org.springframework.test.context.support.DirtiesContextTestExecutionListener;
50 import org.springframework.test.context.transaction.TransactionalTestExecutionListener;
52 import javax.annotation.Resource;
53 import java.util.ArrayList;
54 import java.util.HashMap;
55 import java.util.List;
57 import java.util.Map.Entry;
59 import static org.junit.Assert.*;
61 @RunWith(SpringJUnit4ClassRunner.class)
62 @ContextConfiguration("classpath:application-context-test.xml")
63 @TestExecutionListeners(listeners = { DependencyInjectionTestExecutionListener.class,
64 DirtiesContextTestExecutionListener.class, TransactionalTestExecutionListener.class })
65 public class AuditingDaoTest extends DAOConfDependentTest{
66 private static Logger log = LoggerFactory.getLogger(AuditingDaoTest.class.getName());
67 @Resource(name = "elasticsearch-client")
68 private ElasticSearchClient esclient;
70 @Resource(name = "auditingDao")
71 private AuditingDao auditingDao;
74 public void tearDown() {
80 auditingDao.setConfigurationManager(configurationManager);
84 private void deleteOldIndexes() {
85 DeleteIndexResponse deleteResponse = esclient.getClient().admin().indices()
86 .prepareDelete(auditingDao.getIndexPrefix() + "*").execute().actionGet();
87 if (!deleteResponse.isAcknowledged()) {
88 log.debug("Couldn't delete old auditing indexes!");
94 public void testAddUpdateAdminEventMinute() {
96 String timestamp = "2015-06-23 13:34:53.123";
98 String creationPeriod = Constants.MINUTE;
99 String expectedIndexName = auditingDao.getIndexPrefix() + "-2015-06-23-13-34";
100 assertTrue(!esclient.getClient().admin().indices().prepareExists(expectedIndexName).execute().actionGet()
102 Map<AuditingFieldsKey, Object> params = getUserAdminEventParams(timestamp);
103 testCreationPeriodScenario(params, creationPeriod, expectedIndexName, UserAdminEvent.class);
104 params = getUserAccessEventParams(timestamp);
105 testCreationPeriodScenario(params, creationPeriod, expectedIndexName, UserAccessEvent.class);
106 params = getResourceAdminEventParams(timestamp, "addResource");
107 testCreationPeriodScenario(params, creationPeriod, expectedIndexName, ResourceAdminEvent.class);
111 public void testAddUpdateAdminEventYearly() {
113 String timestamp = "2016-06-23 13:34:53.123";
114 String creationPeriod = Constants.YEAR;
115 String expectedIndexName = auditingDao.getIndexPrefix() + "-2016";
116 assertTrue(!esclient.getClient().admin().indices().prepareExists(expectedIndexName).execute().actionGet()
118 Map<AuditingFieldsKey, Object> params = getUserAdminEventParams(timestamp);
119 testCreationPeriodScenario(params, creationPeriod, expectedIndexName, UserAdminEvent.class);
120 params = getUserAccessEventParams(timestamp);
121 testCreationPeriodScenario(params, creationPeriod, expectedIndexName, UserAccessEvent.class);
122 params = getResourceAdminEventParams(timestamp, "addResource");
123 testCreationPeriodScenario(params, creationPeriod, expectedIndexName, ResourceAdminEvent.class);
127 public void testGetDistributionStatusEvent() {
129 String timestamp1 = "2016-06-23 13:34:53.123";
130 String creationPeriod = Constants.MONTH;
131 String expectedIndexName1 = auditingDao.getIndexPrefix() + "-2016-06";
132 assertTrue(!esclient.getClient().admin().indices().prepareExists(expectedIndexName1).execute().actionGet()
134 Map<AuditingFieldsKey, Object> params = getDistributionStatusEventParams(timestamp1);
135 testCreationPeriodScenario(params, creationPeriod, expectedIndexName1, DistributionStatusEvent.class);
136 String timestamp2 = "2015-06-23 13:34:53.123";
138 String expectedIndexName2 = auditingDao.getIndexPrefix() + "-2015-06";
139 assertTrue(!esclient.getClient().admin().indices().prepareExists(expectedIndexName2).execute().actionGet()
141 Map<AuditingFieldsKey, Object> params2 = getDistributionStatusEventParams(timestamp2);
142 testCreationPeriodScenario(params2, creationPeriod, expectedIndexName2, DistributionStatusEvent.class);
143 Either<List<ESTimeBasedEvent>, ActionStatus> status = auditingDao.getListOfDistributionStatuses("123-456");
144 assertEquals(2, status.left().value().size());
148 public void testGetCountAdminEventMonthly() {
150 String timestamp1 = "2016-06-23 13:34:53.123";
151 String timestamp2 = "2015-06-23 13:34:53.123";
152 String creationPeriod = Constants.MONTH;
153 String expectedIndexName1 = auditingDao.getIndexPrefix() + "-2016-06";
154 assertTrue(!esclient.getClient().admin().indices().prepareExists(expectedIndexName1).execute().actionGet()
156 String expectedIndexName2 = auditingDao.getIndexPrefix() + "-2015-06";
157 assertTrue(!esclient.getClient().admin().indices().prepareExists(expectedIndexName2).execute().actionGet()
160 Map<AuditingFieldsKey, Object> params1 = getUserAdminEventParams(timestamp1);
161 testCreationPeriodScenario(params1, creationPeriod, expectedIndexName1, UserAdminEvent.class);
162 Map<AuditingFieldsKey, Object> params2 = getUserAdminEventParams(timestamp2);
163 testCreationPeriodScenario(params2, creationPeriod, expectedIndexName2, UserAdminEvent.class);
165 long count = auditingDao.count(UserAdminEvent.class, new MatchAllQueryBuilder());
166 log.debug("Testing auditing count {}", count);
167 assertEquals(2, count);
171 public void testServiceDistributionStatuses() {
173 String timestamp = "2016-06-23 13:34:53.123";
174 String creationPeriod = Constants.MONTH;
175 String expectedIndexName = auditingDao.getIndexPrefix() + "-2016-06";
176 assertTrue(!esclient.getClient().admin().indices().prepareExists(expectedIndexName).execute().actionGet()
178 Map<AuditingFieldsKey, Object> params = getUserAdminEventParams(timestamp);
179 testCreationPeriodScenario(params, creationPeriod, expectedIndexName, UserAdminEvent.class);
180 params = getUserAccessEventParams(timestamp);
181 testCreationPeriodScenario(params, creationPeriod, expectedIndexName, UserAccessEvent.class);
182 params = getResourceAdminEventParams(timestamp, "DRequest");
183 testCreationPeriodScenario(params, creationPeriod, expectedIndexName, ResourceAdminEvent.class);
184 params = getDistributionNotificationEventParams(timestamp);
185 testCreationPeriodScenario(params, creationPeriod, expectedIndexName, DistributionNotificationEvent.class);
186 Either<List<ESTimeBasedEvent>, ActionStatus> status = auditingDao
187 .getServiceDistributionStatusesList("SeviceId");
188 log.debug("Testing auditing count {}", status);
192 public void testAddUpdateAdminEventMonthly() {
194 String timestamp = "2016-06-23 13:34:53.123";
195 String creationPeriod = Constants.MONTH;
196 String expectedIndexName = auditingDao.getIndexPrefix() + "-2016-06";
197 assertTrue(!esclient.getClient().admin().indices().prepareExists(expectedIndexName).execute().actionGet()
199 Map<AuditingFieldsKey, Object> params = getUserAdminEventParams(timestamp);
200 testCreationPeriodScenario(params, creationPeriod, expectedIndexName, UserAdminEvent.class);
201 params = getUserAccessEventParams(timestamp);
202 testCreationPeriodScenario(params, creationPeriod, expectedIndexName, UserAccessEvent.class);
203 params = getResourceAdminEventParams(timestamp, "addResource");
204 testCreationPeriodScenario(params, creationPeriod, expectedIndexName, ResourceAdminEvent.class);
208 public void testGetFilteredResourceAdminAuditingEvents() {
209 Map<AuditingFieldsKey, Object> filterMap = new HashMap<>();
210 filterMap.put(AuditingFieldsKey.AUDIT_ACTION, new Object());
211 Either<List<ESTimeBasedEvent>, ActionStatus> filteredResourceAdminAuditingEvents = auditingDao
212 .getFilteredResourceAdminAuditingEvents(filterMap);
216 public void testGetListOfDistributionByAction() {
217 Either<List<ESTimeBasedEvent>, ActionStatus> filteredResourceAdminAuditingEvents = auditingDao
218 .getListOfDistributionByAction("mock", "mock", "mock", AuditingGenericEvent.class);
219 filteredResourceAdminAuditingEvents = auditingDao
220 .getListOfDistributionByAction("mock", "mock", null, AuditingGenericEvent.class);
223 private SearchResponse testCreationPeriodScenario(Map<AuditingFieldsKey, Object> params, String creationPeriod,
224 String expectedIndexName, Class<? extends AuditingGenericEvent> clazz) {
226 String typeName = clazz.getSimpleName().toLowerCase();
227 log.debug("Testing auditing type {}", typeName);
228 setCreationPeriod(creationPeriod);
229 ActionStatus saveUserAdminEvent = auditingDao.addRecord(params, typeName);
230 assertEquals(ActionStatus.OK, saveUserAdminEvent);
231 assertTrue(esclient.getClient().admin().indices().prepareExists(expectedIndexName).execute().actionGet()
233 MatchAllQueryBuilder matchAllQueryBuilder = new MatchAllQueryBuilder();
235 SearchResponse searchResponse = esclient.getClient().prepareSearch(expectedIndexName).setTypes(typeName)
236 .setQuery(matchAllQueryBuilder).execute().actionGet();
238 SearchHits hits = searchResponse.getHits();
239 assertEquals(1, hits.getTotalHits());
240 log.debug("Checking that all expected fields are properly persisted");
241 validateHitValues(params, hits.getAt(0));
242 log.debug("testCreationPeriodScenario successful");
243 return searchResponse;
246 private void validateHitValues(Map<AuditingFieldsKey, Object> params, SearchHit searchHit) {
247 Map<String, Object> source = searchHit.getSource();
248 log.debug("Hit source is {}", searchHit.sourceAsString());
249 for (Entry<AuditingFieldsKey, Object> paramsEntry : params.entrySet()) {
250 AuditingFieldsKey key = paramsEntry.getKey();
251 log.debug("Testing auditing field {}", key.name());
252 Object value = paramsEntry.getValue();
253 // assertEquals(value, source.get(auditField2esField.get(key)));
254 assertEquals(value, source.get(key.getDisplayName()));
258 private void setCreationPeriod(String creationPeriod) {
259 Configuration configuration = configurationManager.getConfiguration();
260 List<IndicesTimeFrequencyEntry> indicesTimeFrequencyEntries = new ArrayList<>();
261 IndicesTimeFrequencyEntry indicesTimeFrequencyEntry = new IndicesTimeFrequencyEntry();
262 indicesTimeFrequencyEntry.setIndexPrefix("auditingevents");
263 indicesTimeFrequencyEntry.setCreationPeriod(creationPeriod);
264 configuration.getElasticSearch().setIndicesTimeFrequency(indicesTimeFrequencyEntries);
267 private Map<AuditingFieldsKey, Object> getUserAdminEventParams(String timestamp) {
269 Map<AuditingFieldsKey, Object> params = new HashMap<>();
270 String action = "updateUser";
271 String modifierName = "moshe moshe";
272 String modifierUid = "mosheUid";
273 String userUid = "mosheUid";
274 String userBeforeName = "moshe moshe";
275 String userBeforeEmail = "moshe@moshe1.com";
276 String userBeforeRole = "TESTER";
277 String userAfterName = "moshe moshe";
278 String userAfterEmail = "moshe@moshe2.com";
279 String userAfterRole = "TESTER";
280 String userStatus = "200";
281 String userDesc = "OK";
283 params.put(AuditingFieldsKey.AUDIT_ACTION, action);
284 params.put(AuditingFieldsKey.AUDIT_MODIFIER_UID, modifierName + '(' + modifierUid + ')');
285 params.put(AuditingFieldsKey.AUDIT_USER_UID, userUid);
286 params.put(AuditingFieldsKey.AUDIT_USER_BEFORE,
287 userUid + ", " + userBeforeName + ", " + userBeforeEmail + ", " + userBeforeRole);
288 params.put(AuditingFieldsKey.AUDIT_USER_AFTER,
289 userUid + ", " + userAfterName + ", " + userAfterEmail + ", " + userAfterRole);
290 params.put(AuditingFieldsKey.AUDIT_STATUS, userStatus);
291 params.put(AuditingFieldsKey.AUDIT_DESC, userDesc);
292 params.put(AuditingFieldsKey.AUDIT_TIMESTAMP, timestamp);
297 private Map<AuditingFieldsKey, Object> getUserAccessEventParams(String timestamp) {
299 Map<AuditingFieldsKey, Object> params = new HashMap<>();
300 String action = "userAccess";
301 String userUid = "mosheUid";
302 String userName = "moshe moshe";
303 String userStatus = "200";
304 String userDesc = "OK";
306 params.put(AuditingFieldsKey.AUDIT_ACTION, action);
307 params.put(AuditingFieldsKey.AUDIT_USER_UID, userName + '(' + userUid + ')');
308 params.put(AuditingFieldsKey.AUDIT_STATUS, userStatus);
309 params.put(AuditingFieldsKey.AUDIT_DESC, userDesc);
310 params.put(AuditingFieldsKey.AUDIT_TIMESTAMP, timestamp);
315 private Map<AuditingFieldsKey, Object> getResourceAdminEventParams(String timestamp, String action) {
317 Map<AuditingFieldsKey, Object> params = new HashMap<>();
319 String modifierName = "moshe moshe";
320 String modifierUid = "mosheUid";
321 String resourceName = "Centos";
322 String resourceType = "Resource";
323 String currState = "READY_FOR_CERTIFICATION";
324 String prevState = "CHECKED_OUT";
325 String currVersion = "1.1.4";
326 String prevVersion = "1.1.3";
327 String status = "200";
329 String distributionId = "123-456";
330 String serviceId = "SeviceId";
332 params.put(AuditingFieldsKey.AUDIT_ACTION, action);
333 params.put(AuditingFieldsKey.AUDIT_MODIFIER_NAME, modifierName);
334 params.put(AuditingFieldsKey.AUDIT_MODIFIER_UID, modifierUid);
335 params.put(AuditingFieldsKey.AUDIT_RESOURCE_NAME, resourceName);
336 params.put(AuditingFieldsKey.AUDIT_RESOURCE_TYPE, resourceType);
337 params.put(AuditingFieldsKey.AUDIT_RESOURCE_CURR_STATE, currState);
338 params.put(AuditingFieldsKey.AUDIT_RESOURCE_PREV_STATE, prevState);
339 params.put(AuditingFieldsKey.AUDIT_RESOURCE_CURR_VERSION, currVersion);
340 params.put(AuditingFieldsKey.AUDIT_RESOURCE_PREV_VERSION, prevVersion);
341 params.put(AuditingFieldsKey.AUDIT_STATUS, status);
342 params.put(AuditingFieldsKey.AUDIT_DESC, desc);
343 params.put(AuditingFieldsKey.AUDIT_TIMESTAMP, timestamp);
344 params.put(AuditingFieldsKey.AUDIT_DISTRIBUTION_ID, distributionId);
345 params.put(AuditingFieldsKey.AUDIT_SERVICE_INSTANCE_ID, serviceId);
350 private Map<AuditingFieldsKey, Object> getDistributionStatusEventParams(String timestamp) {
352 Map<AuditingFieldsKey, Object> params = new HashMap<>();
353 String action = "DStatus";
354 String modifierName = "moshe moshe";
355 String modifierUid = "mosheUid";
356 String topicName = "Centos";
357 String serviceId = "SeviceId";
358 String resourceUrl = "resourceUrl";
359 String distributionId = "123-456";
361 String status = "200";
364 params.put(AuditingFieldsKey.AUDIT_DESC, desc);
365 params.put(AuditingFieldsKey.AUDIT_TIMESTAMP, timestamp);
366 params.put(AuditingFieldsKey.AUDIT_STATUS, status);
367 params.put(AuditingFieldsKey.AUDIT_ACTION, action);
368 params.put(AuditingFieldsKey.AUDIT_DISTRIBUTION_ID, distributionId);
369 params.put(AuditingFieldsKey.AUDIT_DISTRIBUTION_CONSUMER_ID, modifierUid);
370 params.put(AuditingFieldsKey.AUDIT_DISTRIBUTION_TOPIC_NAME, topicName);
371 params.put(AuditingFieldsKey.AUDIT_DISTRIBUTION_RESOURCE_URL, resourceUrl);
372 params.put(AuditingFieldsKey.AUDIT_DISTRIBUTION_STATUS_TIME, timestamp);
373 params.put(AuditingFieldsKey.AUDIT_SERVICE_INSTANCE_ID, serviceId);
379 public void getListOfDistributionByActionTest() {
381 String timestamp = "2016-06-23 13:34:53.123";
382 String distributionId = "123-456";
384 String creationPeriod = Constants.MONTH;
385 String expectedIndexName = auditingDao.getIndexPrefix() + "-2016-06";
386 assertTrue(!esclient.getClient().admin().indices().prepareExists(expectedIndexName).execute().actionGet()
389 Map<AuditingFieldsKey, Object> params = getResourceAdminEventParams(timestamp, "DRequest");
390 params.put(AuditingFieldsKey.AUDIT_DISTRIBUTION_ID, distributionId);
391 testCreationPeriodScenario(params, creationPeriod, expectedIndexName, ResourceAdminEvent.class);
392 params = getDistributionNotificationEventParams(timestamp);
393 params.put(AuditingFieldsKey.AUDIT_DISTRIBUTION_ID, distributionId);
395 testCreationPeriodScenario(params, creationPeriod, expectedIndexName, DistributionNotificationEvent.class);
397 Either<List<ESTimeBasedEvent>, ActionStatus> distributionByAction = auditingDao
398 .getListOfDistributionByAction(distributionId, "DRequest", "200", ResourceAdminEvent.class);
399 assertTrue(distributionByAction.isLeft());
400 assertFalse(distributionByAction.left().value().isEmpty());
402 distributionByAction = auditingDao.getListOfDistributionByAction(distributionId, "DNotify", "200",
403 DistributionNotificationEvent.class);
404 assertTrue(distributionByAction.isLeft());
405 assertFalse(distributionByAction.left().value().isEmpty());
409 private Map<AuditingFieldsKey, Object> getDistributionNotificationEventParams(String timestamp) {
411 Map<AuditingFieldsKey, Object> params = new HashMap<>();
413 String action = "DNotify";
414 String modifierName = "moshe moshe";
415 String modifierUid = "mosheUid";
416 String resourceName = "Centos";
417 String resourceType = "Resource";
419 String currVersion = "1.1.4";
420 String currState = "READY_FOR_CERTIFICATION";
421 String status = "200";
424 String topicName = "Centos";
425 String serviceId = "SeviceId";
426 String requestId = "12364";
428 params.put(AuditingFieldsKey.AUDIT_ACTION, action);
429 params.put(AuditingFieldsKey.AUDIT_MODIFIER_NAME, requestId);
430 params.put(AuditingFieldsKey.AUDIT_MODIFIER_UID, modifierUid);
431 params.put(AuditingFieldsKey.AUDIT_MODIFIER_NAME, modifierName);
432 params.put(AuditingFieldsKey.AUDIT_RESOURCE_NAME, resourceName);
433 params.put(AuditingFieldsKey.AUDIT_RESOURCE_TYPE, resourceType);
434 params.put(AuditingFieldsKey.AUDIT_RESOURCE_CURR_STATE, currState);
435 params.put(AuditingFieldsKey.AUDIT_DISTRIBUTION_TOPIC_NAME, topicName);
436 params.put(AuditingFieldsKey.AUDIT_RESOURCE_CURR_VERSION, currVersion);
437 params.put(AuditingFieldsKey.AUDIT_STATUS, status);
438 params.put(AuditingFieldsKey.AUDIT_DESC, desc);
439 params.put(AuditingFieldsKey.AUDIT_TIMESTAMP, timestamp);
440 params.put(AuditingFieldsKey.AUDIT_DISTRIBUTION_ID, did);
441 params.put(AuditingFieldsKey.AUDIT_SERVICE_INSTANCE_ID, serviceId);