Fixes #1358 - Add change events to DatabaseService entity

This commit is contained in:
sureshms 2021-11-24 12:57:31 -08:00
parent ece03712f8
commit ec6c6f48c4
2 changed files with 47 additions and 62 deletions

View File

@ -32,7 +32,6 @@ import org.openmetadata.catalog.util.EntityUtil;
import org.openmetadata.catalog.util.EntityUtil.Fields; import org.openmetadata.catalog.util.EntityUtil.Fields;
import org.openmetadata.catalog.util.JsonUtils; import org.openmetadata.catalog.util.JsonUtils;
import javax.ws.rs.core.UriInfo;
import java.io.IOException; import java.io.IOException;
import java.net.URI; import java.net.URI;
import java.text.ParseException; import java.text.ParseException;
@ -213,7 +212,7 @@ public class DatabaseServiceRepository extends EntityRepository<DatabaseService>
private void updateIngestionSchedule() throws JsonProcessingException { private void updateIngestionSchedule() throws JsonProcessingException {
Schedule origSchedule = original.getEntity().getIngestionSchedule(); Schedule origSchedule = original.getEntity().getIngestionSchedule();
Schedule updatedSchedule = updated.getEntity().getIngestionSchedule(); Schedule updatedSchedule = updated.getEntity().getIngestionSchedule();
recordChange("ingestionSchedule", origSchedule, updatedSchedule); recordChange("ingestionSchedule", origSchedule, updatedSchedule, true);
} }
} }
} }

View File

@ -28,14 +28,17 @@ import org.openmetadata.catalog.exception.CatalogExceptionMessage;
import org.openmetadata.catalog.jdbi3.DatabaseServiceRepository.DatabaseServiceEntityInterface; import org.openmetadata.catalog.jdbi3.DatabaseServiceRepository.DatabaseServiceEntityInterface;
import org.openmetadata.catalog.resources.EntityResourceTest; import org.openmetadata.catalog.resources.EntityResourceTest;
import org.openmetadata.catalog.resources.services.database.DatabaseServiceResource.DatabaseServiceList; import org.openmetadata.catalog.resources.services.database.DatabaseServiceResource.DatabaseServiceList;
import org.openmetadata.catalog.type.ChangeDescription;
import org.openmetadata.catalog.type.ColumnConstraint;
import org.openmetadata.catalog.type.EntityReference; import org.openmetadata.catalog.type.EntityReference;
import org.openmetadata.catalog.type.JdbcInfo; import org.openmetadata.catalog.type.FieldChange;
import org.openmetadata.catalog.type.Schedule; import org.openmetadata.catalog.type.Schedule;
import org.openmetadata.catalog.util.EntityInterface; import org.openmetadata.catalog.util.EntityInterface;
import org.openmetadata.catalog.util.JsonUtils;
import org.openmetadata.catalog.util.TestUtils; import org.openmetadata.catalog.util.TestUtils;
import org.openmetadata.catalog.util.TestUtils.UpdateType;
import javax.ws.rs.client.WebTarget; import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response.Status;
import java.io.IOException; import java.io.IOException;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.util.Date; import java.util.Date;
@ -48,10 +51,10 @@ import static javax.ws.rs.core.Response.Status.FORBIDDEN;
import static javax.ws.rs.core.Response.Status.NOT_FOUND; import static javax.ws.rs.core.Response.Status.NOT_FOUND;
import static javax.ws.rs.core.Response.Status.OK; import static javax.ws.rs.core.Response.Status.OK;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.openmetadata.catalog.util.TestUtils.adminAuthHeaders; import static org.openmetadata.catalog.util.TestUtils.adminAuthHeaders;
import static org.openmetadata.catalog.util.TestUtils.authHeaders; import static org.openmetadata.catalog.util.TestUtils.authHeaders;
import static org.openmetadata.catalog.util.TestUtils.getPrincipal;
public class DatabaseServiceResourceTest extends EntityResourceTest<DatabaseService> { public class DatabaseServiceResourceTest extends EntityResourceTest<DatabaseService> {
public DatabaseServiceResourceTest() { public DatabaseServiceResourceTest() {
@ -180,18 +183,24 @@ public class DatabaseServiceResourceTest extends EntityResourceTest<DatabaseServ
@Test @Test
public void put_updateDatabaseService_as_admin_2xx(TestInfo test) throws IOException { public void put_updateDatabaseService_as_admin_2xx(TestInfo test) throws IOException {
createAndCheckEntity(create(test).withDescription(null).withIngestionSchedule(null), adminAuthHeaders()); DatabaseService service = createAndCheckEntity(create(test).withDescription(null).withIngestionSchedule(null),
adminAuthHeaders());
// Update database description and ingestion service that are null // Update database description and ingestion service that are null
CreateDatabaseService update = create(test).withDescription("description1"); CreateDatabaseService update = create(test).withDescription("description1");
updateAndCheckService(update, OK, adminAuthHeaders()); Schedule schedule = update.getIngestionSchedule();
// Update ingestion schedule ChangeDescription change = getChangeDescription(service.getVersion());
Schedule schedule = new Schedule().withStartDate(new Date()).withRepeatFrequency("P1D"); change.getFieldsAdded().add(new FieldChange().withName("description").withNewValue("description1"));
update.withIngestionSchedule(schedule); change.getFieldsAdded().add(new FieldChange().withName("ingestionSchedule").withNewValue(schedule));
updateAndCheckService(update, OK, adminAuthHeaders()); service = updateAndCheckEntity(update, OK, adminAuthHeaders(), UpdateType.MINOR_UPDATE, change);
// Update description and ingestion schedule again // Update ingestion schedule
update.withDescription("description1").withIngestionSchedule(schedule.withRepeatFrequency("PT1H")); Schedule schedule1 = new Schedule().withStartDate(new Date()).withRepeatFrequency("PT1H");
updateAndCheckService(update, OK, adminAuthHeaders()); update.withIngestionSchedule(schedule1);
change = getChangeDescription(service.getVersion());
change.getFieldsUpdated().add(new FieldChange().withName("ingestionSchedule")
.withOldValue(schedule).withNewValue(schedule1));
updateAndCheckEntity(update, OK, adminAuthHeaders(), UpdateType.MINOR_UPDATE, change);
} }
@Test @Test
@ -201,7 +210,8 @@ public class DatabaseServiceResourceTest extends EntityResourceTest<DatabaseServ
// Update as non admin should be forbidden // Update as non admin should be forbidden
HttpResponseException exception = assertThrows(HttpResponseException.class, () -> HttpResponseException exception = assertThrows(HttpResponseException.class, () ->
updateAndCheckService(create(test), OK, authHeaders("test@open-metadata.org"))); updateAndCheckEntity(create(test), OK, authHeaders("test@open-metadata.org"),
UpdateType.MINOR_UPDATE, null));
TestUtils.assertResponse(exception, FORBIDDEN, "Principal: CatalogPrincipal{name='test'} " + TestUtils.assertResponse(exception, FORBIDDEN, "Principal: CatalogPrincipal{name='test'} " +
"is not admin"); "is not admin");
} }
@ -228,23 +238,6 @@ public class DatabaseServiceResourceTest extends EntityResourceTest<DatabaseServ
create, DatabaseService.class, authHeaders); create, DatabaseService.class, authHeaders);
} }
private static void validateService(DatabaseService service, String expectedName, String expectedDescription,
JdbcInfo expectedJdbc, Schedule expectedIngestion, String expectedUpdatedBy) {
assertNotNull(service.getId());
assertNotNull(service.getHref());
assertEquals(expectedName, service.getName());
assertEquals(expectedDescription, service.getDescription());
assertEquals(expectedUpdatedBy, service.getUpdatedBy());
// Validate jdbc
assertEquals(expectedJdbc, service.getJdbc());
if (expectedIngestion != null) {
assertEquals(expectedIngestion.getStartDate(), service.getIngestionSchedule().getStartDate());
assertEquals(expectedIngestion.getRepeatFrequency(), service.getIngestionSchedule().getRepeatFrequency());
}
}
public static DatabaseService getService(UUID id, Map<String, String> authHeaders) throws HttpResponseException { public static DatabaseService getService(UUID id, Map<String, String> authHeaders) throws HttpResponseException {
return getService(id, null, authHeaders); return getService(id, null, authHeaders);
} }
@ -321,31 +314,6 @@ public class DatabaseServiceResourceTest extends EntityResourceTest<DatabaseServ
.withJdbc(TestUtils.JDBC_INFO); .withJdbc(TestUtils.JDBC_INFO);
} }
public static void updateAndCheckService(CreateDatabaseService update, Status status,
Map<String, String> authHeaders) throws HttpResponseException {
String updatedBy = TestUtils.getPrincipal(authHeaders);
DatabaseService service = updateDatabaseService(update, status, authHeaders);
validateService(service, service.getName(), update.getDescription(), service.getJdbc(),
update.getIngestionSchedule(), updatedBy);
// GET the newly updated database and validate
DatabaseService getService = getService(service.getId(), authHeaders);
validateService(getService, service.getName(), update.getDescription(), service.getJdbc(),
update.getIngestionSchedule(), updatedBy);
// GET the newly updated database by name and validate
getService = getServiceByName(service.getName(), null, authHeaders);
validateService(getService, service.getName(), update.getDescription(), service.getJdbc(),
update.getIngestionSchedule(), updatedBy);
}
public static DatabaseService updateDatabaseService(CreateDatabaseService updated,
Status status, Map<String, String> authHeaders)
throws HttpResponseException {
return TestUtils.put(CatalogApplicationTest.getResource("services/databaseServices"), updated,
DatabaseService.class, status, authHeaders);
}
@Override @Override
public Object createRequest(TestInfo test, int index, String description, String displayName, EntityReference owner) public Object createRequest(TestInfo test, int index, String description, String displayName, EntityReference owner)
throws URISyntaxException { throws URISyntaxException {
@ -353,21 +321,32 @@ public class DatabaseServiceResourceTest extends EntityResourceTest<DatabaseServ
} }
@Override @Override
public void validateCreatedEntity(DatabaseService createdEntity, Object request, Map<String, String> authHeaders) public void validateCreatedEntity(DatabaseService service, Object request, Map<String, String> authHeaders)
throws HttpResponseException { throws HttpResponseException {
CreateDatabaseService createRequest = (CreateDatabaseService) request;
validateCommonEntityFields(getEntityInterface(service), createRequest.getDescription(), getPrincipal(authHeaders),
null);
assertEquals(createRequest.getName(), service.getName());
// Validate jdbc
assertEquals(createRequest.getJdbc(), service.getJdbc());
Schedule expectedIngestion = createRequest.getIngestionSchedule();
if (expectedIngestion != null) {
assertEquals(expectedIngestion.getStartDate(), service.getIngestionSchedule().getStartDate());
assertEquals(expectedIngestion.getRepeatFrequency(), service.getIngestionSchedule().getRepeatFrequency());
}
} }
@Override @Override
public void validateUpdatedEntity(DatabaseService updatedEntity, Object request, Map<String, String> authHeaders) public void validateUpdatedEntity(DatabaseService service, Object request, Map<String, String> authHeaders)
throws HttpResponseException { throws HttpResponseException {
validateCreatedEntity(service, request, authHeaders);
} }
@Override @Override
public void compareEntities(DatabaseService expected, DatabaseService updated, Map<String, String> authHeaders) public void compareEntities(DatabaseService expected, DatabaseService updated, Map<String, String> authHeaders)
throws HttpResponseException { throws HttpResponseException {
} }
@Override @Override
@ -377,6 +356,13 @@ public class DatabaseServiceResourceTest extends EntityResourceTest<DatabaseServ
@Override @Override
public void assertFieldChange(String fieldName, Object expected, Object actual) throws IOException { public void assertFieldChange(String fieldName, Object expected, Object actual) throws IOException {
if (fieldName.equals("ingestionSchedule")) {
Schedule expectedSchedule = (Schedule) expected;
System.out.println(actual);
Schedule actualSchedule = JsonUtils.readValue((String) actual, Schedule.class);
assertEquals(expectedSchedule, actualSchedule);
} else {
super.assertCommonFieldChange(fieldName, expected, actual);
}
} }
} }