mirror of
				https://github.com/open-metadata/OpenMetadata.git
				synced 2025-11-04 12:36:23 +00:00 
			
		
		
		
	* FIX #19768 - Delete pipelines from logical suites at deletion * FIX #19768 - Delete pipelines from logical suites at deletion * FIX #19768 - Delete pipelines from logical suites at deletion * FIX #19768 - Delete pipelines from logical suites at deletion
This commit is contained in:
		
							parent
							
								
									a1c257f2fd
								
							
						
					
					
						commit
						ea1d2c700d
					
				@ -1351,7 +1351,7 @@ public abstract class EntityRepository<T extends EntityInterface> {
 | 
				
			|||||||
                List.of(Relationship.CONTAINS.ordinal(), Relationship.PARENT_OF.ordinal()));
 | 
					                List.of(Relationship.CONTAINS.ordinal(), Relationship.PARENT_OF.ordinal()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (childrenRecords.isEmpty()) {
 | 
					    if (childrenRecords.isEmpty()) {
 | 
				
			||||||
      LOG.info("No children to delete");
 | 
					      LOG.debug("No children to delete");
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    // Entity being deleted contains children entities
 | 
					    // Entity being deleted contains children entities
 | 
				
			||||||
 | 
				
			|||||||
@ -440,6 +440,7 @@ public class TestSuiteRepository extends EntityRepository<TestSuite> {
 | 
				
			|||||||
    String updatedBy = securityContext.getUserPrincipal().getName();
 | 
					    String updatedBy = securityContext.getUserPrincipal().getName();
 | 
				
			||||||
    preDelete(original, updatedBy);
 | 
					    preDelete(original, updatedBy);
 | 
				
			||||||
    setFieldsInternal(original, putFields);
 | 
					    setFieldsInternal(original, putFields);
 | 
				
			||||||
 | 
					    deleteChildIngestionPipelines(original.getId(), hardDelete, updatedBy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EventType changeType;
 | 
					    EventType changeType;
 | 
				
			||||||
    TestSuite updated = JsonUtils.readValue(JsonUtils.pojoToJson(original), TestSuite.class);
 | 
					    TestSuite updated = JsonUtils.readValue(JsonUtils.pojoToJson(original), TestSuite.class);
 | 
				
			||||||
@ -460,6 +461,24 @@ public class TestSuiteRepository extends EntityRepository<TestSuite> {
 | 
				
			|||||||
    return new RestUtil.DeleteResponse<>(updated, changeType);
 | 
					    return new RestUtil.DeleteResponse<>(updated, changeType);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Always delete as if it was marked recursive. Deleting a Logical Suite should
 | 
				
			||||||
 | 
					   * just go ahead and clean the Ingestion Pipelines
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  private void deleteChildIngestionPipelines(UUID id, boolean hardDelete, String updatedBy) {
 | 
				
			||||||
 | 
					    List<CollectionDAO.EntityRelationshipRecord> childrenRecords =
 | 
				
			||||||
 | 
					        daoCollection
 | 
				
			||||||
 | 
					            .relationshipDAO()
 | 
				
			||||||
 | 
					            .findTo(id, entityType, Relationship.CONTAINS.ordinal(), Entity.INGESTION_PIPELINE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (childrenRecords.isEmpty()) {
 | 
				
			||||||
 | 
					      LOG.debug("No children to delete");
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    // Delete all the contained entities
 | 
				
			||||||
 | 
					    deleteChildren(childrenRecords, hardDelete, updatedBy);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private void updateTestSummaryFromBucket(JsonObject bucket, TestSummary testSummary) {
 | 
					  private void updateTestSummaryFromBucket(JsonObject bucket, TestSummary testSummary) {
 | 
				
			||||||
    String key = bucket.getString("key");
 | 
					    String key = bucket.getString("key");
 | 
				
			||||||
    Integer count = bucket.getJsonNumber("doc_count").intValue();
 | 
					    Integer count = bucket.getJsonNumber("doc_count").intValue();
 | 
				
			||||||
 | 
				
			|||||||
@ -2802,8 +2802,7 @@ public abstract class EntityResourceTest<T extends EntityInterface, K extends Cr
 | 
				
			|||||||
    return getFollowersCollection(id).path("/" + userId);
 | 
					    return getFollowersCollection(id).path("/" + userId);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  protected final T getEntity(UUID id, Map<String, String> authHeaders)
 | 
					  public final T getEntity(UUID id, Map<String, String> authHeaders) throws HttpResponseException {
 | 
				
			||||||
      throws HttpResponseException {
 | 
					 | 
				
			||||||
    WebTarget target = getResource(id);
 | 
					    WebTarget target = getResource(id);
 | 
				
			||||||
    target = target.queryParam("fields", allFields);
 | 
					    target = target.queryParam("fields", allFields);
 | 
				
			||||||
    return TestUtils.get(target, entityClass, authHeaders);
 | 
					    return TestUtils.get(target, entityClass, authHeaders);
 | 
				
			||||||
 | 
				
			|||||||
@ -35,6 +35,7 @@ import org.junit.jupiter.api.Assertions;
 | 
				
			|||||||
import org.junit.jupiter.api.Test;
 | 
					import org.junit.jupiter.api.Test;
 | 
				
			||||||
import org.junit.jupiter.api.TestInfo;
 | 
					import org.junit.jupiter.api.TestInfo;
 | 
				
			||||||
import org.openmetadata.schema.api.data.CreateTable;
 | 
					import org.openmetadata.schema.api.data.CreateTable;
 | 
				
			||||||
 | 
					import org.openmetadata.schema.api.services.ingestionPipelines.CreateIngestionPipeline;
 | 
				
			||||||
import org.openmetadata.schema.api.teams.CreateTeam;
 | 
					import org.openmetadata.schema.api.teams.CreateTeam;
 | 
				
			||||||
import org.openmetadata.schema.api.teams.CreateUser;
 | 
					import org.openmetadata.schema.api.teams.CreateUser;
 | 
				
			||||||
import org.openmetadata.schema.api.tests.CreateLogicalTestCases;
 | 
					import org.openmetadata.schema.api.tests.CreateLogicalTestCases;
 | 
				
			||||||
@ -42,8 +43,11 @@ import org.openmetadata.schema.api.tests.CreateTestCase;
 | 
				
			|||||||
import org.openmetadata.schema.api.tests.CreateTestCaseResult;
 | 
					import org.openmetadata.schema.api.tests.CreateTestCaseResult;
 | 
				
			||||||
import org.openmetadata.schema.api.tests.CreateTestSuite;
 | 
					import org.openmetadata.schema.api.tests.CreateTestSuite;
 | 
				
			||||||
import org.openmetadata.schema.entity.data.Table;
 | 
					import org.openmetadata.schema.entity.data.Table;
 | 
				
			||||||
 | 
					import org.openmetadata.schema.entity.services.ingestionPipelines.IngestionPipeline;
 | 
				
			||||||
import org.openmetadata.schema.entity.teams.Team;
 | 
					import org.openmetadata.schema.entity.teams.Team;
 | 
				
			||||||
import org.openmetadata.schema.entity.teams.User;
 | 
					import org.openmetadata.schema.entity.teams.User;
 | 
				
			||||||
 | 
					import org.openmetadata.schema.metadataIngestion.SourceConfig;
 | 
				
			||||||
 | 
					import org.openmetadata.schema.metadataIngestion.TestSuitePipeline;
 | 
				
			||||||
import org.openmetadata.schema.tests.TestCase;
 | 
					import org.openmetadata.schema.tests.TestCase;
 | 
				
			||||||
import org.openmetadata.schema.tests.TestSuite;
 | 
					import org.openmetadata.schema.tests.TestSuite;
 | 
				
			||||||
import org.openmetadata.schema.tests.type.TestCaseStatus;
 | 
					import org.openmetadata.schema.tests.type.TestCaseStatus;
 | 
				
			||||||
@ -55,6 +59,7 @@ import org.openmetadata.schema.type.Include;
 | 
				
			|||||||
import org.openmetadata.service.Entity;
 | 
					import org.openmetadata.service.Entity;
 | 
				
			||||||
import org.openmetadata.service.resources.EntityResourceTest;
 | 
					import org.openmetadata.service.resources.EntityResourceTest;
 | 
				
			||||||
import org.openmetadata.service.resources.databases.TableResourceTest;
 | 
					import org.openmetadata.service.resources.databases.TableResourceTest;
 | 
				
			||||||
 | 
					import org.openmetadata.service.resources.services.ingestionpipelines.IngestionPipelineResourceTest;
 | 
				
			||||||
import org.openmetadata.service.resources.teams.TeamResourceTest;
 | 
					import org.openmetadata.service.resources.teams.TeamResourceTest;
 | 
				
			||||||
import org.openmetadata.service.resources.teams.UserResourceTest;
 | 
					import org.openmetadata.service.resources.teams.UserResourceTest;
 | 
				
			||||||
import org.openmetadata.service.search.models.IndexMapping;
 | 
					import org.openmetadata.service.search.models.IndexMapping;
 | 
				
			||||||
@ -729,6 +734,80 @@ public class TestSuiteResourceTest extends EntityResourceTest<TestSuite, CreateT
 | 
				
			|||||||
    assertEquals(5, actualExecutableTestSuite.getTests().size());
 | 
					    assertEquals(5, actualExecutableTestSuite.getTests().size());
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @Test
 | 
				
			||||||
 | 
					  void delete_logicalSuiteWithPipeline(TestInfo test) throws IOException {
 | 
				
			||||||
 | 
					    TestCaseResourceTest testCaseResourceTest = new TestCaseResourceTest();
 | 
				
			||||||
 | 
					    TableResourceTest tableResourceTest = new TableResourceTest();
 | 
				
			||||||
 | 
					    CreateTable tableReq =
 | 
				
			||||||
 | 
					        tableResourceTest
 | 
				
			||||||
 | 
					            .createRequest(test)
 | 
				
			||||||
 | 
					            .withColumns(
 | 
				
			||||||
 | 
					                List.of(
 | 
				
			||||||
 | 
					                    new Column()
 | 
				
			||||||
 | 
					                        .withName(C1)
 | 
				
			||||||
 | 
					                        .withDisplayName("c1")
 | 
				
			||||||
 | 
					                        .withDataType(ColumnDataType.VARCHAR)
 | 
				
			||||||
 | 
					                        .withDataLength(10)));
 | 
				
			||||||
 | 
					    Table table = tableResourceTest.createEntity(tableReq, ADMIN_AUTH_HEADERS);
 | 
				
			||||||
 | 
					    CreateTestSuite createExecutableTestSuite = createRequest(table.getFullyQualifiedName());
 | 
				
			||||||
 | 
					    TestSuite executableTestSuite =
 | 
				
			||||||
 | 
					        createBasicTestSuite(createExecutableTestSuite, ADMIN_AUTH_HEADERS);
 | 
				
			||||||
 | 
					    List<EntityReference> testCases1 = new ArrayList<>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // We'll create tests cases for testSuite1
 | 
				
			||||||
 | 
					    for (int i = 0; i < 5; i++) {
 | 
				
			||||||
 | 
					      CreateTestCase createTestCase =
 | 
				
			||||||
 | 
					          testCaseResourceTest
 | 
				
			||||||
 | 
					              .createRequest(String.format("test_testSuite_2_%s_", test.getDisplayName()) + i)
 | 
				
			||||||
 | 
					              .withTestSuite(executableTestSuite.getFullyQualifiedName());
 | 
				
			||||||
 | 
					      TestCase testCase =
 | 
				
			||||||
 | 
					          testCaseResourceTest.createAndCheckEntity(createTestCase, ADMIN_AUTH_HEADERS);
 | 
				
			||||||
 | 
					      testCases1.add(testCase.getEntityReference());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // We'll create a logical test suite and associate the test cases to it
 | 
				
			||||||
 | 
					    CreateTestSuite createTestSuite = createRequest(test);
 | 
				
			||||||
 | 
					    TestSuite testSuite = createEntity(createTestSuite, ADMIN_AUTH_HEADERS);
 | 
				
			||||||
 | 
					    addTestCasesToLogicalTestSuite(
 | 
				
			||||||
 | 
					        testSuite, testCases1.stream().map(EntityReference::getId).collect(Collectors.toList()));
 | 
				
			||||||
 | 
					    TestSuite logicalTestSuite = getEntity(testSuite.getId(), "*", ADMIN_AUTH_HEADERS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Add ingestion pipeline to the database service
 | 
				
			||||||
 | 
					    IngestionPipelineResourceTest ingestionPipelineResourceTest =
 | 
				
			||||||
 | 
					        new IngestionPipelineResourceTest();
 | 
				
			||||||
 | 
					    CreateIngestionPipeline createIngestionPipeline =
 | 
				
			||||||
 | 
					        ingestionPipelineResourceTest
 | 
				
			||||||
 | 
					            .createRequest(test)
 | 
				
			||||||
 | 
					            .withService(logicalTestSuite.getEntityReference());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    TestSuitePipeline testSuitePipeline = new TestSuitePipeline();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SourceConfig sourceConfig = new SourceConfig().withConfig(testSuitePipeline);
 | 
				
			||||||
 | 
					    createIngestionPipeline.withSourceConfig(sourceConfig);
 | 
				
			||||||
 | 
					    IngestionPipeline ingestionPipeline =
 | 
				
			||||||
 | 
					        ingestionPipelineResourceTest.createEntity(createIngestionPipeline, ADMIN_AUTH_HEADERS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // We can GET the Ingestion Pipeline now
 | 
				
			||||||
 | 
					    IngestionPipeline actualIngestionPipeline =
 | 
				
			||||||
 | 
					        ingestionPipelineResourceTest.getEntity(ingestionPipeline.getId(), ADMIN_AUTH_HEADERS);
 | 
				
			||||||
 | 
					    assertNotNull(actualIngestionPipeline);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // After deleting the test suite, we can't GET the Ingestion Pipeline
 | 
				
			||||||
 | 
					    deleteEntity(logicalTestSuite.getId(), true, true, ADMIN_AUTH_HEADERS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    assertResponse(
 | 
				
			||||||
 | 
					        () ->
 | 
				
			||||||
 | 
					            ingestionPipelineResourceTest.getEntity(ingestionPipeline.getId(), ADMIN_AUTH_HEADERS),
 | 
				
			||||||
 | 
					        NOT_FOUND,
 | 
				
			||||||
 | 
					        String.format(
 | 
				
			||||||
 | 
					            "ingestionPipeline instance for %s not found", actualIngestionPipeline.getId()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Test Cases are still there
 | 
				
			||||||
 | 
					    TestCase testCaseInLogical =
 | 
				
			||||||
 | 
					        testCaseResourceTest.getEntity(testCases1.get(0).getId(), "*", ADMIN_AUTH_HEADERS);
 | 
				
			||||||
 | 
					    assertNotNull(testCaseInLogical);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @Test
 | 
					  @Test
 | 
				
			||||||
  void get_listTestSuiteFromSearchWithPagination(TestInfo testInfo) throws IOException {
 | 
					  void get_listTestSuiteFromSearchWithPagination(TestInfo testInfo) throws IOException {
 | 
				
			||||||
    if (supportsSearchIndex) {
 | 
					    if (supportsSearchIndex) {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user