From e98ae8aa2ae799f63ec80dffa94c87f355ffb653 Mon Sep 17 00:00:00 2001 From: Suresh Srinivas Date: Mon, 25 Dec 2023 13:09:07 -0800 Subject: [PATCH] 14493 Part 1 - Support for database schema, table import export (#14494) * Fixes #14493 - Import & export support for database * Import export support for database schema --- .../java/org/openmetadata/csv/EntityCsv.java | 24 ++-- .../service/jdbi3/DatabaseRepository.java | 103 ++++++++++++++++++ .../jdbi3/DatabaseSchemaRepository.java | 101 ++++++++++++++++- .../resources/databases/DatabaseResource.java | 61 +++++++++++ .../databases/DatabaseSchemaResource.java | 60 ++++++++++ .../database/databaseCsvDocumentation.json | 71 ++++++++++++ .../databaseSchemaCsvDocumentation.json | 71 ++++++++++++ .../org/openmetadata/csv/EntityCsvTest.java | 5 +- .../databases/DatabaseResourceTest.java | 72 ++++++++++++ .../databases/DatabaseSchemaResourceTest.java | 75 ++++++++++++- .../glossary/GlossaryResourceTest.java | 11 +- .../resources/teams/TeamResourceTest.java | 11 +- .../resources/teams/UserResourceTest.java | 8 +- 13 files changed, 648 insertions(+), 25 deletions(-) create mode 100644 openmetadata-service/src/main/resources/json/data/database/databaseCsvDocumentation.json create mode 100644 openmetadata-service/src/main/resources/json/data/databaseSchema/databaseSchemaCsvDocumentation.json diff --git a/openmetadata-service/src/main/java/org/openmetadata/csv/EntityCsv.java b/openmetadata-service/src/main/java/org/openmetadata/csv/EntityCsv.java index fc9f00fe096..b9f2c9b98cb 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/csv/EntityCsv.java +++ b/openmetadata-service/src/main/java/org/openmetadata/csv/EntityCsv.java @@ -153,17 +153,19 @@ public abstract class EntityCsv { /** Owner field is in entityType;entityName format */ public EntityReference getOwner(CSVPrinter printer, CSVRecord csvRecord, int fieldNumber) throws IOException { - String owner = csvRecord.get(fieldNumber); - if (nullOrEmpty(owner)) { + String ownerField = csvRecord.get(fieldNumber); + if (nullOrEmpty(ownerField)) { return null; } - List list = CsvUtil.fieldToStrings(owner); + List list = CsvUtil.fieldToStrings(ownerField); if (list.size() != 2) { importFailure(printer, invalidOwner(fieldNumber), csvRecord); return null; } - return getEntityReference(printer, csvRecord, fieldNumber, list.get(0), list.get(1)); + EntityReference owner = + getEntityReference(printer, csvRecord, fieldNumber, list.get(0), list.get(1)); + return owner == null || Boolean.TRUE.equals(owner.getInherited()) ? null : owner; } /** Owner field is in entityName format */ @@ -218,7 +220,7 @@ public abstract class EntityCsv { } EntityInterface entity = getEntityByName(entityType, fqn); if (entity == null) { - importFailure(printer, entityNotFound(fieldNumber, fqn), csvRecord); + importFailure(printer, entityNotFound(fieldNumber, entityType, fqn), csvRecord); processRecord = false; return null; } @@ -283,7 +285,7 @@ public abstract class EntityCsv { private Iterator parse(String csv) { Reader in = new StringReader(csv); try { - return CSVFormat.DEFAULT.parse(in).iterator(); + return CSVFormat.DEFAULT.withEscape('\\').parse(in).iterator(); } catch (IOException e) { documentFailure(failed(e.getMessage(), CsvErrorType.PARSER_FAILURE)); } @@ -326,11 +328,9 @@ public abstract class EntityCsv { return; } - // Finally, convert record into entity for importing - T entity = toEntity(resultsPrinter, csvRecord); + T entity = toEntity(resultsPrinter, csvRecord); // Convert record into entity for importing if (entity != null) { - // Finally, create entities - createEntity(resultsPrinter, csvRecord, entity); + createEntity(resultsPrinter, csvRecord, entity); // Finally, create entities } } @@ -398,8 +398,8 @@ public abstract class EntityCsv { return String.format(FIELD_ERROR_MSG, CsvErrorType.INVALID_FIELD, field + 1, error); } - public static String entityNotFound(int field, String fqn) { - String error = String.format("Entity %s not found", fqn); + public static String entityNotFound(int field, String entityType, String fqn) { + String error = String.format("Entity %s of type %s not found", fqn, entityType); return String.format(FIELD_ERROR_MSG, CsvErrorType.INVALID_FIELD, field + 1, error); } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseRepository.java index df07c1f524a..da1b25b1fb2 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseRepository.java @@ -13,17 +13,32 @@ package org.openmetadata.service.jdbi3; +import static org.openmetadata.csv.CsvUtil.addField; +import static org.openmetadata.csv.CsvUtil.addOwner; +import static org.openmetadata.csv.CsvUtil.addTagLabels; +import static org.openmetadata.service.Entity.DATABASE_SCHEMA; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.UUID; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.csv.CSVPrinter; +import org.apache.commons.csv.CSVRecord; import org.jdbi.v3.sqlobject.transaction.Transaction; +import org.openmetadata.csv.EntityCsv; import org.openmetadata.schema.EntityInterface; import org.openmetadata.schema.entity.data.Database; +import org.openmetadata.schema.entity.data.DatabaseSchema; import org.openmetadata.schema.entity.services.DatabaseService; import org.openmetadata.schema.type.DatabaseProfilerConfig; import org.openmetadata.schema.type.EntityReference; import org.openmetadata.schema.type.Include; import org.openmetadata.schema.type.Relationship; +import org.openmetadata.schema.type.csv.CsvDocumentation; +import org.openmetadata.schema.type.csv.CsvHeader; +import org.openmetadata.schema.type.csv.CsvImportResult; import org.openmetadata.service.Entity; import org.openmetadata.service.resources.databases.DatabaseResource; import org.openmetadata.service.util.EntityUtil; @@ -85,6 +100,26 @@ public class DatabaseRepository extends EntityRepository { return Entity.getEntity(entity.getService(), fields, Include.ALL); } + @Override + public String exportToCsv(String name, String user) throws IOException { + Database database = getByName(null, name, Fields.EMPTY_FIELDS); // Validate database name + DatabaseSchemaRepository repository = + (DatabaseSchemaRepository) Entity.getEntityRepository(DATABASE_SCHEMA); + ListFilter filter = new ListFilter(Include.NON_DELETED).addQueryParam("database", name); + List schemas = + repository.listAll(repository.getFields("owner,tags,domain"), filter); + schemas.sort(Comparator.comparing(EntityInterface::getFullyQualifiedName)); + return new DatabaseCsv(database, user).exportCsv(schemas); + } + + @Override + public CsvImportResult importFromCsv(String name, String csv, boolean dryRun, String user) + throws IOException { + Database database = getByName(null, name, Fields.EMPTY_FIELDS); // Validate glossary name + DatabaseCsv databaseCsv = new DatabaseCsv(database, user); + return databaseCsv.importCsv(csv, dryRun); + } + public void setFields(Database database, Fields fields) { database.setService(getContainer(database.getId())); database.setSourceHash(fields.contains("sourceHash") ? database.getSourceHash() : null); @@ -180,4 +215,72 @@ public class DatabaseRepository extends EntityRepository { recordChange("sourceHash", original.getSourceHash(), updated.getSourceHash()); } } + + public static class DatabaseCsv extends EntityCsv { + public static final CsvDocumentation DOCUMENTATION = getCsvDocumentation(Entity.DATABASE); + public static final List HEADERS = DOCUMENTATION.getHeaders(); + private final Database database; + + DatabaseCsv(Database database, String user) { + super(DATABASE_SCHEMA, DOCUMENTATION.getHeaders(), user); + this.database = database; + } + + @Override + protected DatabaseSchema toEntity(CSVPrinter printer, CSVRecord csvRecord) throws IOException { + String schemaFqn = FullyQualifiedName.add(database.getFullyQualifiedName(), csvRecord.get(0)); + DatabaseSchema schema; + try { + schema = Entity.getEntityByName(DATABASE_SCHEMA, schemaFqn, "*", Include.NON_DELETED); + } catch (Exception ex) { + importFailure(printer, entityNotFound(0, DATABASE_SCHEMA, schemaFqn), csvRecord); + processRecord = false; + return null; + } + + // Headers: name, displayName, description, owner, tags, retentionPeriod, sourceUrl, domain + // Field 1,2,3,6,7 - database schema name, displayName, description + schema + .withName(csvRecord.get(0)) + .withDisplayName(csvRecord.get(1)) + .withDescription(csvRecord.get(2)) + .withRetentionPeriod(csvRecord.get(5)) + .withSourceUrl(csvRecord.get(6)); + + // Field 4 - owner + schema.withOwner(getOwner(printer, csvRecord, 3)); + + // Field 5 - tags + schema.withTags(getTagLabels(printer, csvRecord, 4)); + if (!processRecord) { + return null; + } + + // Field 8 - domain + schema.withDomain(getEntityReference(printer, csvRecord, 7, Entity.DOMAIN)); + if (!processRecord) { + return null; + } + return schema; + } + + @Override + protected List toRecord(DatabaseSchema entity) { + // Headers: name, displayName, description, owner, tags, retentionPeriod, sourceUrl, domain + List recordList = new ArrayList<>(); + addField(recordList, entity.getName()); + addField(recordList, entity.getDisplayName()); + addField(recordList, entity.getDescription()); + addOwner(recordList, entity.getOwner()); + addTagLabels(recordList, entity.getTags()); + addField(recordList, entity.getRetentionPeriod()); + addField(recordList, entity.getSourceUrl()); + String domain = + entity.getDomain() == null || Boolean.TRUE.equals(entity.getDomain().getInherited()) + ? "" + : entity.getDomain().getFullyQualifiedName(); + addField(recordList, domain); + return recordList; + } + } } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseSchemaRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseSchemaRepository.java index 1b049c32308..01672dfe79a 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseSchemaRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseSchemaRepository.java @@ -13,20 +13,35 @@ package org.openmetadata.service.jdbi3; +import static org.openmetadata.csv.CsvUtil.addField; +import static org.openmetadata.csv.CsvUtil.addOwner; +import static org.openmetadata.csv.CsvUtil.addTagLabels; import static org.openmetadata.schema.type.Include.ALL; +import static org.openmetadata.service.Entity.DATABASE_SCHEMA; +import static org.openmetadata.service.Entity.TABLE; +import java.io.IOException; +import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.UUID; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.csv.CSVPrinter; +import org.apache.commons.csv.CSVRecord; import org.jdbi.v3.sqlobject.transaction.Transaction; +import org.openmetadata.csv.EntityCsv; import org.openmetadata.schema.EntityInterface; import org.openmetadata.schema.entity.data.Database; import org.openmetadata.schema.entity.data.DatabaseSchema; +import org.openmetadata.schema.entity.data.Table; import org.openmetadata.schema.type.DatabaseSchemaProfilerConfig; import org.openmetadata.schema.type.EntityReference; import org.openmetadata.schema.type.Include; import org.openmetadata.schema.type.Relationship; +import org.openmetadata.schema.type.csv.CsvDocumentation; +import org.openmetadata.schema.type.csv.CsvHeader; +import org.openmetadata.schema.type.csv.CsvImportResult; import org.openmetadata.service.Entity; import org.openmetadata.service.resources.databases.DatabaseSchemaResource; import org.openmetadata.service.util.EntityUtil; @@ -89,7 +104,7 @@ public class DatabaseSchemaRepository extends EntityRepository { private List getTables(DatabaseSchema schema) { return schema == null ? Collections.emptyList() - : findTo(schema.getId(), Entity.DATABASE_SCHEMA, Relationship.CONTAINS, Entity.TABLE); + : findTo(schema.getId(), Entity.DATABASE_SCHEMA, Relationship.CONTAINS, TABLE); } public void setFields(DatabaseSchema schema, Fields fields) { @@ -159,6 +174,23 @@ public class DatabaseSchemaRepository extends EntityRepository { .withServiceType(database.getServiceType()); } + @Override + public String exportToCsv(String name, String user) throws IOException { + DatabaseSchema schema = getByName(null, name, Fields.EMPTY_FIELDS); // Validate database schema + TableRepository repository = (TableRepository) Entity.getEntityRepository(TABLE); + ListFilter filter = new ListFilter(Include.NON_DELETED).addQueryParam("databaseSchema", name); + List tables = repository.listAll(repository.getFields("owner,tags,domain"), filter); + tables.sort(Comparator.comparing(EntityInterface::getFullyQualifiedName)); + return new DatabaseSchemaCsv(schema, user).exportCsv(tables); + } + + @Override + public CsvImportResult importFromCsv(String name, String csv, boolean dryRun, String user) + throws IOException { + DatabaseSchema schema = getByName(null, name, Fields.EMPTY_FIELDS); // Validate database schema + return new DatabaseSchemaCsv(schema, user).importCsv(csv, dryRun); + } + public class DatabaseSchemaUpdater extends EntityUpdater { public DatabaseSchemaUpdater( DatabaseSchema original, DatabaseSchema updated, Operation operation) { @@ -215,4 +247,71 @@ public class DatabaseSchemaRepository extends EntityRepository { setFieldsInternal(database, Fields.EMPTY_FIELDS); return database; } + + public static class DatabaseSchemaCsv extends EntityCsv
{ + public static final CsvDocumentation DOCUMENTATION = getCsvDocumentation(DATABASE_SCHEMA); + public static final List HEADERS = DOCUMENTATION.getHeaders(); + private final DatabaseSchema schema; + + DatabaseSchemaCsv(DatabaseSchema schema, String user) { + super(TABLE, DOCUMENTATION.getHeaders(), user); + this.schema = schema; + } + + @Override + protected Table toEntity(CSVPrinter printer, CSVRecord csvRecord) throws IOException { + String tableFqn = FullyQualifiedName.add(schema.getFullyQualifiedName(), csvRecord.get(0)); + Table table; + try { + table = Entity.getEntityByName(TABLE, tableFqn, "*", Include.NON_DELETED); + } catch (Exception ex) { + importFailure(printer, entityNotFound(0, TABLE, tableFqn), csvRecord); + processRecord = false; + return null; + } + + // Headers: name, displayName, description, owner, tags, retentionPeriod, sourceUrl, domain + // Field 1,2,3,6,7 - database schema name, displayName, description + table + .withDisplayName(csvRecord.get(1)) + .withDescription(csvRecord.get(2)) + .withRetentionPeriod(csvRecord.get(5)) + .withSourceUrl(csvRecord.get(6)); + + // Field 4 - owner + table.withOwner(getOwner(printer, csvRecord, 3)); + + // Field 5 - tags + table.withTags(getTagLabels(printer, csvRecord, 4)); + if (!processRecord) { + return null; + } + + // Field 8 - domain + table.withDomain(getEntityReference(printer, csvRecord, 7, Entity.DOMAIN)); + if (!processRecord) { + return null; + } + return table; + } + + @Override + protected List toRecord(Table entity) { + // Headers: name, displayName, description, owner, tags, retentionPeriod, sourceUrl, domain + List recordList = new ArrayList<>(); + addField(recordList, entity.getName()); + addField(recordList, entity.getDisplayName()); + addField(recordList, entity.getDescription()); + addOwner(recordList, entity.getOwner()); + addTagLabels(recordList, entity.getTags()); + addField(recordList, entity.getRetentionPeriod()); + addField(recordList, entity.getSourceUrl()); + String domain = + entity.getDomain() == null || Boolean.TRUE.equals(entity.getDomain().getInherited()) + ? "" + : entity.getDomain().getFullyQualifiedName(); + addField(recordList, domain); + return recordList; + } + } } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/resources/databases/DatabaseResource.java b/openmetadata-service/src/main/java/org/openmetadata/service/resources/databases/DatabaseResource.java index 077fa578efb..244fa654eb3 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/resources/databases/DatabaseResource.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/resources/databases/DatabaseResource.java @@ -24,6 +24,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.parameters.RequestBody; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.tags.Tag; +import java.io.IOException; import java.util.List; import java.util.UUID; import javax.json.JsonPatch; @@ -56,6 +57,7 @@ import org.openmetadata.schema.type.DatabaseProfilerConfig; import org.openmetadata.schema.type.EntityHistory; import org.openmetadata.schema.type.Include; import org.openmetadata.schema.type.MetadataOperation; +import org.openmetadata.schema.type.csv.CsvImportResult; import org.openmetadata.service.Entity; import org.openmetadata.service.jdbi3.DatabaseRepository; import org.openmetadata.service.jdbi3.ListFilter; @@ -390,6 +392,65 @@ public class DatabaseResource extends EntityResource getHeaders(Object[][] headers) { diff --git a/openmetadata-service/src/test/java/org/openmetadata/service/resources/databases/DatabaseResourceTest.java b/openmetadata-service/src/test/java/org/openmetadata/service/resources/databases/DatabaseResourceTest.java index 6728c38cd6f..69a346248fe 100644 --- a/openmetadata-service/src/test/java/org/openmetadata/service/resources/databases/DatabaseResourceTest.java +++ b/openmetadata-service/src/test/java/org/openmetadata/service/resources/databases/DatabaseResourceTest.java @@ -14,9 +14,17 @@ package org.openmetadata.service.resources.databases; import static javax.ws.rs.core.Response.Status.BAD_REQUEST; +import static org.apache.commons.lang.StringEscapeUtils.escapeCsv; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.openmetadata.common.utils.CommonUtil.listOf; import static org.openmetadata.common.utils.CommonUtil.nullOrEmpty; +import static org.openmetadata.csv.CsvUtil.recordToString; +import static org.openmetadata.csv.EntityCsv.entityNotFound; +import static org.openmetadata.csv.EntityCsvTest.assertRows; +import static org.openmetadata.csv.EntityCsvTest.assertSummary; +import static org.openmetadata.csv.EntityCsvTest.createCsv; +import static org.openmetadata.csv.EntityCsvTest.getFailedRecord; import static org.openmetadata.service.util.EntityUtil.getFqn; import static org.openmetadata.service.util.TestUtils.ADMIN_AUTH_HEADERS; import static org.openmetadata.service.util.TestUtils.assertListNotEmpty; @@ -27,15 +35,21 @@ import static org.openmetadata.service.util.TestUtils.assertResponseContains; import java.io.IOException; import java.util.HashMap; import java.util.Map; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.HttpResponseException; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInfo; +import org.openmetadata.csv.EntityCsv; import org.openmetadata.schema.api.data.CreateDatabase; import org.openmetadata.schema.api.data.CreateDatabaseSchema; import org.openmetadata.schema.entity.data.Database; +import org.openmetadata.schema.type.ApiStatus; import org.openmetadata.schema.type.EntityReference; +import org.openmetadata.schema.type.csv.CsvImportResult; import org.openmetadata.service.Entity; +import org.openmetadata.service.jdbi3.DatabaseRepository.DatabaseCsv; +import org.openmetadata.service.jdbi3.DatabaseSchemaRepository.DatabaseSchemaCsv; import org.openmetadata.service.resources.EntityResourceTest; import org.openmetadata.service.resources.databases.DatabaseResource.DatabaseList; import org.openmetadata.service.util.FullyQualifiedName; @@ -90,6 +104,64 @@ public class DatabaseResourceTest extends EntityResourceTest updateRecords = + listOf( + String.format( + "s1,dsp1,new-dsc1,user;%s,Tier.Tier1,P23DT23H,http://test.com,%s", + user1, escapeCsv(DOMAIN.getFullyQualifiedName()))); + + // Update created entity with changes + importCsvAndValidate( + schema.getFullyQualifiedName(), DatabaseSchemaCsv.HEADERS, null, updateRecords); + } + @Override public DatabaseSchema validateGetWithDifferentFields(DatabaseSchema schema, boolean byName) throws HttpResponseException { diff --git a/openmetadata-service/src/test/java/org/openmetadata/service/resources/glossary/GlossaryResourceTest.java b/openmetadata-service/src/test/java/org/openmetadata/service/resources/glossary/GlossaryResourceTest.java index 05cbcb2b94f..7ea9a6cbd5b 100644 --- a/openmetadata-service/src/test/java/org/openmetadata/service/resources/glossary/GlossaryResourceTest.java +++ b/openmetadata-service/src/test/java/org/openmetadata/service/resources/glossary/GlossaryResourceTest.java @@ -371,7 +371,7 @@ public class GlossaryResourceTest extends EntityResourceTest true); assertSummary(result, ApiStatus.FAILURE, 2, 1, 1); String[] expectedRows = { - resultsHeader, getFailedRecord(record, "[name must match \"\"(?U)^[\\w'\\- .&()%]+$\"\"]") + resultsHeader, getFailedRecord(record, "[name must match \"(?U)^[\\w'\\- .&()%]+$\"]") }; assertRows(result, expectedRows); @@ -382,7 +382,10 @@ public class GlossaryResourceTest extends EntityResourceTest true); assertSummary(result, ApiStatus.FAILURE, 2, 1, 1); expectedRows = - new String[] {resultsHeader, getFailedRecord(record, entityNotFound(0, "invalidParent"))}; + new String[] { + resultsHeader, + getFailedRecord(record, entityNotFound(0, Entity.GLOSSARY_TERM, "invalidParent")) + }; assertRows(result, expectedRows); // Create glossaryTerm with invalid tags field @@ -391,7 +394,9 @@ public class GlossaryResourceTest extends EntityResourceTest { CsvImportResult result = importCsv(team.getName(), csv, false); assertSummary(result, ApiStatus.FAILURE, 2, 1, 1); String[] expectedRows = { - resultsHeader, getFailedRecord(record, EntityCsv.entityNotFound(8, "invalidPolicy")) + resultsHeader, + getFailedRecord(record, EntityCsv.entityNotFound(8, Entity.POLICY, "invalidPolicy")) }; assertRows(result, expectedRows); @@ -812,7 +813,8 @@ public class TeamResourceTest extends EntityResourceTest { assertSummary(result, ApiStatus.FAILURE, 2, 1, 1); expectedRows = new String[] { - resultsHeader, getFailedRecord(record, EntityCsv.entityNotFound(7, "invalidRole")) + resultsHeader, + getFailedRecord(record, EntityCsv.entityNotFound(7, Entity.ROLE, "invalidRole")) }; assertRows(result, expectedRows); @@ -823,7 +825,8 @@ public class TeamResourceTest extends EntityResourceTest { assertSummary(result, ApiStatus.FAILURE, 2, 1, 1); expectedRows = new String[] { - resultsHeader, getFailedRecord(record, EntityCsv.entityNotFound(5, "invalidOwner")) + resultsHeader, + getFailedRecord(record, EntityCsv.entityNotFound(5, Entity.USER, "invalidOwner")) }; assertRows(result, expectedRows); @@ -834,7 +837,7 @@ public class TeamResourceTest extends EntityResourceTest { assertSummary(result, ApiStatus.FAILURE, 2, 1, 1); expectedRows = new String[] { - resultsHeader, getFailedRecord(record, EntityCsv.entityNotFound(4, "invalidParent")) + resultsHeader, getFailedRecord(record, EntityCsv.entityNotFound(4, TEAM, "invalidParent")) }; assertRows(result, expectedRows); diff --git a/openmetadata-service/src/test/java/org/openmetadata/service/resources/teams/UserResourceTest.java b/openmetadata-service/src/test/java/org/openmetadata/service/resources/teams/UserResourceTest.java index 5851f792743..da2d9d54739 100644 --- a/openmetadata-service/src/test/java/org/openmetadata/service/resources/teams/UserResourceTest.java +++ b/openmetadata-service/src/test/java/org/openmetadata/service/resources/teams/UserResourceTest.java @@ -1096,7 +1096,7 @@ public class UserResourceTest extends EntityResourceTest { CsvImportResult result = importCsv(team.getName(), csv, false); assertSummary(result, ApiStatus.FAILURE, 2, 1, 1); String[] expectedRows = { - resultsHeader, getFailedRecord(record, "[name must match \"\"(?U)^[\\w\\-.]+$\"\"]") + resultsHeader, getFailedRecord(record, "[name must match \"(?U)^[\\w\\-.]+$\"]") }; assertRows(result, expectedRows); @@ -1108,7 +1108,8 @@ public class UserResourceTest extends EntityResourceTest { assertSummary(result, ApiStatus.FAILURE, 2, 1, 1); expectedRows = new String[] { - resultsHeader, getFailedRecord(record, EntityCsv.entityNotFound(6, "invalidTeam")) + resultsHeader, + getFailedRecord(record, EntityCsv.entityNotFound(6, Entity.TEAM, "invalidTeam")) }; assertRows(result, expectedRows); @@ -1119,7 +1120,8 @@ public class UserResourceTest extends EntityResourceTest { assertSummary(result, ApiStatus.FAILURE, 2, 1, 1); expectedRows = new String[] { - resultsHeader, getFailedRecord(record, EntityCsv.entityNotFound(7, "invalidRole")) + resultsHeader, + getFailedRecord(record, EntityCsv.entityNotFound(7, Entity.ROLE, "invalidRole")) }; assertRows(result, expectedRows); }