2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 - 2019 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.onap.vid.services;
23 import static java.util.stream.Collectors.toList;
24 import static org.hamcrest.MatcherAssert.assertThat;
25 import static org.hamcrest.Matchers.contains;
26 import static org.hamcrest.Matchers.containsInAnyOrder;
27 import static org.hamcrest.Matchers.hasProperty;
28 import static org.hamcrest.Matchers.is;
29 import static org.hamcrest.Matchers.notNullValue;
30 import static org.hamcrest.Matchers.nullValue;
31 import static org.hamcrest.core.Every.everyItem;
32 import static org.onap.vid.job.Job.JobStatus.COMPLETED;
33 import static org.onap.vid.job.Job.JobStatus.IN_PROGRESS;
34 import static org.onap.vid.job.Job.JobStatus.PAUSE;
35 import static org.onap.vid.job.Job.JobStatus.PENDING;
36 import static org.onap.vid.utils.DaoUtils.getPropsMap;
37 import static org.testng.Assert.assertTrue;
39 import com.google.common.collect.ImmutableList;
40 import com.google.common.collect.Streams;
41 import java.io.IOException;
42 import java.lang.reflect.Method;
43 import java.time.LocalDateTime;
44 import java.time.ZoneId;
45 import java.util.Date;
46 import java.util.List;
47 import java.util.Objects;
48 import java.util.UUID;
49 import java.util.stream.IntStream;
50 import java.util.stream.Stream;
51 import javax.inject.Inject;
52 import org.apache.commons.lang3.tuple.Pair;
53 import org.hibernate.SessionFactory;
54 import org.mockito.MockitoAnnotations;
55 import org.onap.portalsdk.core.service.DataAccessService;
56 import org.onap.portalsdk.core.util.SystemProperties;
57 import org.onap.vid.config.DataSourceConfig;
58 import org.onap.vid.config.JobCommandsConfigWithMockedMso;
59 import org.onap.vid.config.MockedAaiClientAndFeatureManagerConfig;
60 import org.onap.vid.job.Job;
61 import org.onap.vid.job.Job.JobStatus;
62 import org.onap.vid.job.impl.JobDaoImpl;
63 import org.onap.vid.model.JobAuditStatus;
64 import org.onap.vid.model.JobAuditStatus.SourceStatus;
65 import org.onap.vid.model.NameCounter;
66 import org.onap.vid.model.ServiceInfo;
67 import org.onap.vid.mso.rest.AsyncRequestStatusList;
68 import org.onap.vid.testUtils.TestUtils;
69 import org.onap.vid.utils.DaoUtils;
70 import org.springframework.beans.factory.annotation.Autowired;
71 import org.springframework.test.context.ContextConfiguration;
72 import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
73 import org.testng.Assert;
74 import org.testng.annotations.AfterMethod;
75 import org.testng.annotations.BeforeClass;
76 import org.testng.annotations.DataProvider;
77 import org.testng.annotations.Test;
79 @ContextConfiguration(classes = {DataSourceConfig.class, SystemProperties.class, MockedAaiClientAndFeatureManagerConfig.class, JobCommandsConfigWithMockedMso.class})
80 public class AuditServiceIntegrativeTest extends AbstractTestNGSpringContextTests {
83 private DataAccessService dataAccessService;
86 private AuditService auditService;
89 private SessionFactory sessionFactory;
93 MockitoAnnotations.initMocks(this);
98 dataAccessService.deleteDomainObjects(JobDaoImpl.class, "1=1", getPropsMap());
99 dataAccessService.deleteDomainObjects(ServiceInfo.class, "1=1", getPropsMap());
100 dataAccessService.deleteDomainObjects(JobAuditStatus.class, "1=1", getPropsMap());
101 dataAccessService.deleteDomainObjects(NameCounter.class, "1=1", getPropsMap());
106 public void testConvertMsoResponseStatusToJobAuditStatus_missingDateFromMso_shouldNoError() throws IOException {
107 final AsyncRequestStatusList asyncRequestStatusList = TestUtils.readJsonResourceFileAsObject("/orchestrationRequestsByServiceInstanceId.json", AsyncRequestStatusList.class);
109 AuditServiceImpl auditService = new AuditServiceImpl(null, null);
110 final List<JobAuditStatus> jobAuditStatuses = auditService.convertMsoResponseStatusToJobAuditStatus(asyncRequestStatusList.getRequestList(), "foo");
112 final List<Date> dates = jobAuditStatuses.stream().map(JobAuditStatus::getCreatedDate).collect(toList());
113 final List<String> statuses = jobAuditStatuses.stream().map(JobAuditStatus::getJobStatus).collect(toList());
115 assertThat(dates, containsInAnyOrder(notNullValue(), notNullValue(), nullValue()));
116 assertThat(statuses, containsInAnyOrder("COMPLETE", "COMPLETE", "IN_PROGRESS"));
121 public static Object[][] resourceTypeFilter() {
123 return new Object[][]{
124 {JobAuditStatus.ResourceTypeFilter.SERVICE, "serviceInstanceId"},
125 {JobAuditStatus.ResourceTypeFilter.VNF,"vnfInstanceId"},
126 {JobAuditStatus.ResourceTypeFilter.VFMODULE,"vfModuleInstanceId"},
127 {JobAuditStatus.ResourceTypeFilter.NETWORK,"networkInstanceId"},
128 {JobAuditStatus.ResourceTypeFilter.VNFGROUP,"instanceGroupId"},
134 //In case any of ResourceTypeFilter are accidentally changed or removed
135 @Test(dataProvider = "resourceTypeFilter")
136 public void testAllInstanceTypesForAuditInfoExist(JobAuditStatus.ResourceTypeFilter resourceTypeFilter, String value){
137 assertThat("ResourceTypeFilter value changed! Check the relevant usage vs MSO before changing it.", resourceTypeFilter.getFilterBy().equals(value));
140 private static final String MSO_ARBITRARY_STATUS = "completed mso status";
143 public static Object[][] auditStatuses(Method test) {
144 return new Object[][]{
147 new String[]{ PENDING.toString(), IN_PROGRESS.toString(), COMPLETED.toString()}
150 new String[]{ IN_PROGRESS.toString(), MSO_ARBITRARY_STATUS }
156 @Test(dataProvider = "auditStatuses")
157 public void givenSomeAuditStatuses_getStatusesOfSpecificSourceAndJobId_getSortedResultsMatchingToParameters(
158 SourceStatus expectedSource, String [] expectedSortedStatuses){
159 UUID jobUuid = UUID.randomUUID();
161 final Date nowMinus3 = toDate(LocalDateTime.now().minusHours(3));
162 final Date nowMinus2 = toDate(LocalDateTime.now().minusHours(2));
163 final Date nowMinus30 = toDate(LocalDateTime.now().minusHours(30));
165 List<JobAuditStatus> auditStatusList = com.google.common.collect.ImmutableList.of(
166 JobAuditStatus.createForTest(jobUuid, PENDING.toString(), SourceStatus.VID, nowMinus3, 0),
167 JobAuditStatus.createForTest(jobUuid, IN_PROGRESS.toString(), SourceStatus.VID, nowMinus3, 1),
168 JobAuditStatus.createForTest(jobUuid, IN_PROGRESS.toString(), SourceStatus.MSO, UUID.randomUUID(),"", nowMinus30),
169 JobAuditStatus.createForTest(jobUuid, COMPLETED.toString(), SourceStatus.VID, nowMinus2, 2),
170 JobAuditStatus.createForTest(jobUuid, MSO_ARBITRARY_STATUS, SourceStatus.MSO, UUID.randomUUID(),"", nowMinus3),
172 JobAuditStatus.createForTest(UUID.randomUUID(), PENDING.toString(), SourceStatus.VID, nowMinus3, 0)
174 auditStatusList.forEach((auditStatus) -> createNewAuditStatus(auditStatus));
176 List<JobAuditStatus> statuses = auditService.getAuditStatuses(jobUuid, expectedSource);
177 List<String> statusesList = statuses.stream().map(status -> status.getJobStatus()).collect(toList());
179 assertTrue(statuses.stream().allMatch(status -> (status.getSource().equals(expectedSource)&& status.getJobId().equals(jobUuid))),"Only statuses of " + expectedSource + " for " + jobUuid + " should be returned. Returned statuses: " + String.join(",", statusesList ));
180 assertThat(statusesList + " is not ok", statusesList, contains(expectedSortedStatuses));
183 private static Date toDate(LocalDateTime localDateTime) {
184 return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
187 private void createNewAuditStatus(JobAuditStatus auditStatus)
189 Date createdDate= auditStatus.getCreated();
190 dataAccessService.saveDomainObject(auditStatus, getPropsMap());
191 setDateToStatus(auditStatus.getSource(), auditStatus.getJobStatus(), createdDate);
194 private void setDateToStatus(SourceStatus source, String status, Date date) {
195 List<JobAuditStatus> jobAuditStatusList = dataAccessService.getList(JobAuditStatus.class, getPropsMap());
196 DaoUtils.tryWithSessionAndTransaction(sessionFactory, session -> {
197 jobAuditStatusList.stream()
198 .filter(auditStatus -> source.equals(auditStatus.getSource()) && status.equals(auditStatus.getJobStatus()))
199 .forEach(auditStatus -> {
200 auditStatus.setCreated(date);
201 session.saveOrUpdate(auditStatus);
208 public void addSomeVidStatuses_getThem_verifyGetIsWithoutDuplicates(){
209 final Stream<JobStatus> statusesToPush = Stream.of(PENDING, IN_PROGRESS, IN_PROGRESS, PAUSE, PAUSE, IN_PROGRESS, COMPLETED);
210 final Stream<JobStatus> statusesToExpect = Stream.of(PENDING, IN_PROGRESS, PAUSE, IN_PROGRESS, COMPLETED);
211 final UUID jobUuid = UUID.randomUUID();
214 statusesToPush.forEach(status-> auditService.auditVidStatus(jobUuid, status));
217 List<JobAuditStatus> auditStatusesFromDB = auditService.getAuditStatuses(jobUuid, SourceStatus.VID);
218 List<Pair<String, Integer>> statusesAndOrdinalsFromDB =
219 auditStatusesFromDB.stream()
220 .map(status -> Pair.of(status.getJobStatus(), status.getOrdinal()))
224 List<Pair<String, Integer>> expectedStatusesAndOrdinals =
226 statusesToExpect.map(Objects::toString),
227 IntStream.range(0, 100).boxed(), // max=100 will be truncated
231 assertThat(statusesAndOrdinalsFromDB, is(expectedStatusesAndOrdinals));
235 public void addSameStatusOfVidAndMso_verifyThatBothWereAdded(){
236 UUID jobUuid = UUID.randomUUID();
237 Job.JobStatus sameStatus = IN_PROGRESS;
238 auditService.auditMsoStatus(jobUuid, sameStatus.toString(),null,null);
239 auditService.auditVidStatus(jobUuid, sameStatus);
240 List<JobAuditStatus> list = dataAccessService.getList(
241 JobAuditStatus.class,
242 String.format(" where JOB_ID = '%s'", jobUuid),
244 Assert.assertEquals(list.size(),2);
245 assertThat(list,everyItem(hasProperty("jobStatus", is(sameStatus.toString()))));
249 public static Object[][] msoAuditStatuses(Method test) {
250 UUID jobUuid = UUID.randomUUID();
251 UUID requestId = UUID.randomUUID();
252 return new Object[][]{
256 new JobAuditStatus(jobUuid, PENDING.toString(), SourceStatus.MSO, null, null),
257 new JobAuditStatus(jobUuid, IN_PROGRESS.toString(), SourceStatus.MSO, requestId, null),
258 new JobAuditStatus(jobUuid, IN_PROGRESS.toString(), SourceStatus.MSO, requestId, null),
259 new JobAuditStatus(jobUuid, IN_PROGRESS.toString(), SourceStatus.MSO, requestId, null),
260 new JobAuditStatus(jobUuid, COMPLETED.toString(), SourceStatus.MSO, requestId, null)),
261 ImmutableList.of(PENDING.toString(), IN_PROGRESS.toString(), COMPLETED.toString()),
262 "All distinct statuses should be without duplicates"
267 new JobAuditStatus(jobUuid, PENDING.toString(), SourceStatus.MSO, null, null),
268 new JobAuditStatus(jobUuid, IN_PROGRESS.toString(), SourceStatus.MSO, requestId, null),
269 new JobAuditStatus(jobUuid, IN_PROGRESS.toString(), SourceStatus.MSO, requestId, "aa"),
270 new JobAuditStatus(jobUuid, IN_PROGRESS.toString(), SourceStatus.MSO, requestId, "aa"),
271 new JobAuditStatus(jobUuid, IN_PROGRESS.toString(), SourceStatus.MSO, UUID.randomUUID(), "aa"),
272 new JobAuditStatus(jobUuid, COMPLETED.toString(), SourceStatus.MSO, requestId, null)),
273 ImmutableList.of(PENDING.toString(), IN_PROGRESS.toString(), IN_PROGRESS.toString(),IN_PROGRESS.toString(), COMPLETED.toString()),
274 "Statuses should be without duplicates only with same requestId and additionalInfo"
279 @Test(dataProvider = "msoAuditStatuses")
280 public void addSomeMsoStatuses_getThem_verifyGetInsertedWithoutDuplicates(UUID jobUuid, ImmutableList<JobAuditStatus> msoStatuses, ImmutableList<String> expectedStatuses, String assertionReason) {
281 msoStatuses.forEach(status -> {
282 auditService.auditMsoStatus(status.getJobId(), status.getJobStatus(), status.getRequestId() != null ? status.getRequestId().toString() : null, status.getAdditionalInfo());
284 List<String> statusesFromDB = auditService.getAuditStatuses(jobUuid, SourceStatus.MSO).stream().map(auditStatus -> auditStatus.getJobStatus()).collect(
286 assertThat( assertionReason, statusesFromDB, is(expectedStatuses));