From 6ca133db02a0480226b3a55856ab89caafe6945a Mon Sep 17 00:00:00 2001 From: William Hyun Date: Mon, 19 May 2025 10:31:20 -0700 Subject: [PATCH 01/23] started --- .../polaris/core/policy/PolicyEntityTest.java | 2 +- .../core/policy/PolicyValidatorsTest.java | 2 +- .../quarkus/catalog/PolicyCatalogTest.java | 16 ++++++++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/polaris-core/src/test/java/org/apache/polaris/core/policy/PolicyEntityTest.java b/polaris-core/src/test/java/org/apache/polaris/core/policy/PolicyEntityTest.java index 68be34bb69..439d91c639 100644 --- a/polaris-core/src/test/java/org/apache/polaris/core/policy/PolicyEntityTest.java +++ b/polaris-core/src/test/java/org/apache/polaris/core/policy/PolicyEntityTest.java @@ -52,7 +52,7 @@ public void testPolicyEntity(PolicyType policyType) { } @Test - public void testBuildPolicyEntityWithoutPolicyTye() { + public void testBuildPolicyEntityWithoutPolicyType() { Assertions.assertThatThrownBy( () -> new PolicyEntity.Builder(Namespace.of("NS1"), "testPolicy", null) diff --git a/polaris-core/src/test/java/org/apache/polaris/core/policy/PolicyValidatorsTest.java b/polaris-core/src/test/java/org/apache/polaris/core/policy/PolicyValidatorsTest.java index 04435ba734..9c53372139 100644 --- a/polaris-core/src/test/java/org/apache/polaris/core/policy/PolicyValidatorsTest.java +++ b/polaris-core/src/test/java/org/apache/polaris/core/policy/PolicyValidatorsTest.java @@ -100,7 +100,7 @@ public void testCanAttachReturnsTrueForCatalogType() { public void testCanAttachReturnsTrueForNamespaceType() { var targetEntity = new NamespaceEntity.Builder(ns).build(); var result = PolicyValidators.canAttach(policyEntity, targetEntity); - assertThat(result).isTrue().as("Expected canAttach() to return true for CATALOG type"); + assertThat(result).isTrue().as("Expected canAttach() to return true for NAMESPACE type"); } @Test diff --git a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java index 6e5cebb0dd..c5285b0bb2 100644 --- a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java +++ b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java @@ -577,6 +577,22 @@ public void testAttachPolicyConflict() { DATA_COMPACTION.getName(), CATALOG_NAME)); } + @Test + public void testAttachPolicyToNonExistentTarget() { + icebergCatalog.createNamespace(NS); + policyCatalog.createPolicy(POLICY1, DATA_COMPACTION.getName(), "test", "{\"enable\": false}"); + + var target = new PolicyAttachmentTarget(PolicyAttachmentTarget.TypeEnum.CATALOG, List.of()); + policyCatalog.attachPolicy(POLICY1, target, null); + // Attempt to attach a conflicting second policy and expect an exception + assertThatThrownBy(() -> policyCatalog.attachPolicy(POLICY2, target, null)) + .isInstanceOf(PolicyMappingAlreadyExistsException.class) + .hasMessage( + String.format( + "The policy mapping of same type (%s) for %s already exists", + DATA_COMPACTION.getName(), CATALOG_NAME)); + } + @Test public void testDetachPolicy() { icebergCatalog.createNamespace(NS); From 525e3d2c1f0091cc0c862aa813e5a841b7d47dde Mon Sep 17 00:00:00 2001 From: William Hyun Date: Wed, 21 May 2025 09:02:04 -0700 Subject: [PATCH 02/23] Commit --- .../PolarisPolicyServiceIntegrationTest.java | 28 +++++++++++++++++++ .../quarkus/catalog/PolicyCatalogTest.java | 16 ----------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java index c610f13ffa..5df93ee0c2 100644 --- a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java +++ b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java @@ -333,6 +333,34 @@ public void testCreatePolicyWithInvalidName(String policyName) { } } + @Test + public void testCreatePolicyWithInvalidNamespace() { + restCatalog.createNamespace(NS1); + PolicyIdentifier policyIdentifier = new PolicyIdentifier(NS1, "P1"); + + CreatePolicyRequest request = + CreatePolicyRequest.builder() + .setType(PredefinedPolicyTypes.DATA_COMPACTION.getName()) + .setName(policyIdentifier.getName()) + .setDescription("test policy") + .setContent(EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT) + .build(); + + String invalidNamespace = "INVALID_NAMESPACE"; + String nsEncoded = RESTUtil.encodeNamespace(Namespace.of(invalidNamespace)); + + try (Response res = + policyApi + .request( + "polaris/v1/{cat}/namespaces/{ns}/policies", + Map.of("cat", currentCatalogName, "ns", nsEncoded)) + .post(Entity.json(request))) { + Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); + System.out.println(res.readEntity(String.class)); + Assertions.assertThat(res.readEntity(String.class)).contains("Namespace does not exist"); + } + } + @Test public void testDropPolicy() { restCatalog.createNamespace(NS1); diff --git a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java index c5285b0bb2..6e5cebb0dd 100644 --- a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java +++ b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java @@ -577,22 +577,6 @@ public void testAttachPolicyConflict() { DATA_COMPACTION.getName(), CATALOG_NAME)); } - @Test - public void testAttachPolicyToNonExistentTarget() { - icebergCatalog.createNamespace(NS); - policyCatalog.createPolicy(POLICY1, DATA_COMPACTION.getName(), "test", "{\"enable\": false}"); - - var target = new PolicyAttachmentTarget(PolicyAttachmentTarget.TypeEnum.CATALOG, List.of()); - policyCatalog.attachPolicy(POLICY1, target, null); - // Attempt to attach a conflicting second policy and expect an exception - assertThatThrownBy(() -> policyCatalog.attachPolicy(POLICY2, target, null)) - .isInstanceOf(PolicyMappingAlreadyExistsException.class) - .hasMessage( - String.format( - "The policy mapping of same type (%s) for %s already exists", - DATA_COMPACTION.getName(), CATALOG_NAME)); - } - @Test public void testDetachPolicy() { icebergCatalog.createNamespace(NS); From 0801ccdc755412790bd4c5ef12dbffc25d52b117 Mon Sep 17 00:00:00 2001 From: William Hyun Date: Wed, 21 May 2025 10:46:27 -0700 Subject: [PATCH 03/23] in progress --- .../PolarisPolicyServiceIntegrationTest.java | 72 +++++++++++++++++-- 1 file changed, 66 insertions(+), 6 deletions(-) diff --git a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java index 5df93ee0c2..b7943d54ba 100644 --- a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java +++ b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java @@ -72,11 +72,7 @@ import org.apache.polaris.service.it.env.PolarisClient; import org.apache.polaris.service.it.env.PolicyApi; import org.apache.polaris.service.it.ext.PolarisIntegrationTestExtension; -import org.apache.polaris.service.types.ApplicablePolicy; -import org.apache.polaris.service.types.CreatePolicyRequest; -import org.apache.polaris.service.types.Policy; -import org.apache.polaris.service.types.PolicyAttachmentTarget; -import org.apache.polaris.service.types.PolicyIdentifier; +import org.apache.polaris.service.types.*; import org.assertj.core.api.Assertions; import org.assertj.core.api.InstanceOfAssertFactories; import org.junit.jupiter.api.AfterAll; @@ -105,6 +101,7 @@ public class PolarisPolicyServiceIntegrationTest { private static final PolicyIdentifier NS1_P1 = new PolicyIdentifier(NS1, "P1"); private static final PolicyIdentifier NS1_P2 = new PolicyIdentifier(NS1, "P2"); private static final PolicyIdentifier NS1_P3 = new PolicyIdentifier(NS1, "P3"); + private static final PolicyIdentifier NS2_P1 = new PolicyIdentifier(NS2, "P1"); private static final TableIdentifier NS2_T1 = TableIdentifier.of(NS2, "T1"); private static URI s3BucketBase; @@ -356,11 +353,74 @@ public void testCreatePolicyWithInvalidNamespace() { Map.of("cat", currentCatalogName, "ns", nsEncoded)) .post(Entity.json(request))) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); - System.out.println(res.readEntity(String.class)); Assertions.assertThat(res.readEntity(String.class)).contains("Namespace does not exist"); } } + @Test + public void testAttachPolicy() { + restCatalog.createNamespace(NS1); + restCatalog.createNamespace(NS2); + policyApi.createPolicy( + currentCatalogName, + NS1_P1, + PredefinedPolicyTypes.DATA_COMPACTION, + EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT, + "test policy"); + + PolicyAttachmentTarget catalogTarget = + PolicyAttachmentTarget.builder().setType(PolicyAttachmentTarget.TypeEnum.CATALOG).build(); + PolicyAttachmentTarget namespaceTarget = + PolicyAttachmentTarget.builder().setType(PolicyAttachmentTarget.TypeEnum.NAMESPACE).build(); + PolicyAttachmentTarget tableTarget = + PolicyAttachmentTarget.builder().setType(PolicyAttachmentTarget.TypeEnum.TABLE_LIKE).build(); + + AttachPolicyRequest catalogAttachRequest = + AttachPolicyRequest.builder() + .setTarget(catalogTarget) + .setParameters(Map.of()) + .build(); + AttachPolicyRequest namespaceAttachRequest = + AttachPolicyRequest.builder() + .setTarget(namespaceTarget) + .setParameters(Map.of()) + .build(); + AttachPolicyRequest tableAttachRequest = + AttachPolicyRequest.builder() + .setTarget(tableTarget) + .setParameters(Map.of()) + .build(); + + String ns2 = RESTUtil.encodeNamespace(NS2_P1.getNamespace()); + + try (Response res = + policyApi + .request( + "polaris/v1/{cat}/namespaces/{ns}/policies", + Map.of("cat", currentCatalogName, "ns", ns2)) + .post(Entity.json(catalogAttachRequest))) { + Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NO_CONTENT.getStatusCode()); + } + + try (Response res = + policyApi + .request( + "polaris/v1/{cat}/namespaces/{ns}/policies", + Map.of("cat", currentCatalogName, "ns", ns2)) + .post(Entity.json(catalogAttachRequest))) { + Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NO_CONTENT.getStatusCode()); + } + + try (Response res = + policyApi + .request( + "polaris/v1/{cat}/namespaces/{ns}/policies", + Map.of("cat", currentCatalogName, "ns", ns2)) + .post(Entity.json(catalogAttachRequest))) { + Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NO_CONTENT.getStatusCode()); + } + } + @Test public void testDropPolicy() { restCatalog.createNamespace(NS1); From d989fc6dc535f932f8d4504ae9449361b84292d6 Mon Sep 17 00:00:00 2001 From: William Hyun Date: Wed, 21 May 2025 11:15:07 -0700 Subject: [PATCH 04/23] Update imports --- .../it/test/PolarisPolicyServiceIntegrationTest.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java index b7943d54ba..a7c6d613cd 100644 --- a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java +++ b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java @@ -72,7 +72,12 @@ import org.apache.polaris.service.it.env.PolarisClient; import org.apache.polaris.service.it.env.PolicyApi; import org.apache.polaris.service.it.ext.PolarisIntegrationTestExtension; -import org.apache.polaris.service.types.*; +import org.apache.polaris.service.types.ApplicablePolicy; +import org.apache.polaris.service.types.AttachPolicyRequest; +import org.apache.polaris.service.types.CreatePolicyRequest; +import org.apache.polaris.service.types.Policy; +import org.apache.polaris.service.types.PolicyAttachmentTarget; +import org.apache.polaris.service.types.PolicyIdentifier; import org.assertj.core.api.Assertions; import org.assertj.core.api.InstanceOfAssertFactories; import org.junit.jupiter.api.AfterAll; @@ -385,6 +390,7 @@ public void testAttachPolicy() { .setTarget(namespaceTarget) .setParameters(Map.of()) .build(); + .build(); AttachPolicyRequest tableAttachRequest = AttachPolicyRequest.builder() .setTarget(tableTarget) From f3a6f230d2d87aecc8fb2c9ead90f90dc83646dc Mon Sep 17 00:00:00 2001 From: William Hyun Date: Wed, 21 May 2025 13:23:14 -0700 Subject: [PATCH 05/23] WIP --- .../PolarisPolicyServiceIntegrationTest.java | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java index a7c6d613cd..08207faea3 100644 --- a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java +++ b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java @@ -358,7 +358,9 @@ public void testCreatePolicyWithInvalidNamespace() { Map.of("cat", currentCatalogName, "ns", nsEncoded)) .post(Entity.json(request))) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); - Assertions.assertThat(res.readEntity(String.class)).contains("Namespace does not exist"); + Assertions.assertThat(res.readEntity(String.class)) + .contains( + "{\"error\":{\"message\":\"Invalid value: createPolicy.arg2.name: must match \\\"^[A-Za-z0-9\\\\-_]+$\\\"\",\"type\":\"ResteasyReactiveViolationException\",\"code\":400}}"po); } } @@ -390,7 +392,6 @@ public void testAttachPolicy() { .setTarget(namespaceTarget) .setParameters(Map.of()) .build(); - .build(); AttachPolicyRequest tableAttachRequest = AttachPolicyRequest.builder() .setTarget(tableTarget) @@ -399,20 +400,12 @@ public void testAttachPolicy() { String ns2 = RESTUtil.encodeNamespace(NS2_P1.getNamespace()); - try (Response res = - policyApi - .request( - "polaris/v1/{cat}/namespaces/{ns}/policies", - Map.of("cat", currentCatalogName, "ns", ns2)) - .post(Entity.json(catalogAttachRequest))) { - Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NO_CONTENT.getStatusCode()); - } + Response res = policyApi.request("polaris/v1/{cat}", Map.of("cat", currentCatalogName)) + .post(Entity.json(catalogAttachRequest)); + Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NO_CONTENT.getStatusCode()); - try (Response res = - policyApi - .request( - "polaris/v1/{cat}/namespaces/{ns}/policies", - Map.of("cat", currentCatalogName, "ns", ns2)) + res = policyApi.request("polaris/v1/{cat}/namespaces/{ns}/policies", + Map.of("cat", currentCatalogName, "ns", ns2)) .post(Entity.json(catalogAttachRequest))) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NO_CONTENT.getStatusCode()); } From 89479fed1f8a629da9cc37d4cc8367b821ec1528 Mon Sep 17 00:00:00 2001 From: William Hyun Date: Wed, 21 May 2025 14:00:16 -0700 Subject: [PATCH 06/23] WIP --- .../polaris/service/catalog/iceberg/IcebergCatalogAdapter.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java index c28fd491a6..97826fd332 100644 --- a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java +++ b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java @@ -456,6 +456,8 @@ public Response dropTable( SecurityContext securityContext) { Namespace ns = decodeNamespace(namespace); TableIdentifier tableIdentifier = TableIdentifier.of(ns, RESTUtil.decodeString(table)); + System.out.println("[DEBUG] WE ARE IN DROP TABLE " + tableIdentifier); + System.out.println("[DEBUG] PURGE_REQUESTED = " + purgeRequested); return withCatalog( securityContext, prefix, From 95e27cfcda7d5c4006132fda2f4c20ccdd334855 Mon Sep 17 00:00:00 2001 From: William Hyun Date: Thu, 22 May 2025 10:07:50 -0700 Subject: [PATCH 07/23] WIP --- .../PolarisPolicyServiceIntegrationTest.java | 111 +++++++++--------- .../main/resources/application-it.properties | 4 + .../resources/application-test.properties | 3 + 3 files changed, 65 insertions(+), 53 deletions(-) diff --git a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java index 08207faea3..d22c9e9bac 100644 --- a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java +++ b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java @@ -90,6 +90,8 @@ import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @ExtendWith(PolarisIntegrationTestExtension.class) public class PolarisPolicyServiceIntegrationTest { @@ -109,6 +111,9 @@ public class PolarisPolicyServiceIntegrationTest { private static final PolicyIdentifier NS2_P1 = new PolicyIdentifier(NS2, "P1"); private static final TableIdentifier NS2_T1 = TableIdentifier.of(NS2, "T1"); + private static final Logger LOG = + LoggerFactory.getLogger(PolarisPolicyServiceIntegrationTest.class); + private static URI s3BucketBase; private static String principalRoleName; private static ClientCredentials adminCredentials; @@ -348,6 +353,9 @@ public void testCreatePolicyWithInvalidNamespace() { .setContent(EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT) .build(); + LOG.info("WE ARE IN testCreatePolicyWithInvalidNamespace"); + LOG.info("CreatePolicyRequest: " + request); + String invalidNamespace = "INVALID_NAMESPACE"; String nsEncoded = RESTUtil.encodeNamespace(Namespace.of(invalidNamespace)); @@ -358,67 +366,64 @@ public void testCreatePolicyWithInvalidNamespace() { Map.of("cat", currentCatalogName, "ns", nsEncoded)) .post(Entity.json(request))) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); - Assertions.assertThat(res.readEntity(String.class)) - .contains( - "{\"error\":{\"message\":\"Invalid value: createPolicy.arg2.name: must match \\\"^[A-Za-z0-9\\\\-_]+$\\\"\",\"type\":\"ResteasyReactiveViolationException\",\"code\":400}}"po); + LOG.info(res.readEntity(String.class)); + Assertions.assertThat(res.readEntity(String.class)).contains("The given namespace does not exist"); } } - @Test - public void testAttachPolicy() { - restCatalog.createNamespace(NS1); - restCatalog.createNamespace(NS2); - policyApi.createPolicy( - currentCatalogName, - NS1_P1, - PredefinedPolicyTypes.DATA_COMPACTION, - EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT, - "test policy"); + @Test + public void testAttachPolicy() { + restCatalog.createNamespace(NS1); + restCatalog.createNamespace(NS2); + policyApi.createPolicy( + currentCatalogName, + NS1_P1, + PredefinedPolicyTypes.DATA_COMPACTION, + EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT, + "test policy"); + + PolicyAttachmentTarget catalogTarget = PolicyAttachmentTarget.builder().setType(PolicyAttachmentTarget.TypeEnum.CATALOG).build(); + PolicyAttachmentTarget namespaceTarget = PolicyAttachmentTarget.builder().setType(PolicyAttachmentTarget.TypeEnum.NAMESPACE).build(); + PolicyAttachmentTarget tableTarget = PolicyAttachmentTarget.builder().setType(PolicyAttachmentTarget.TypeEnum.TABLE_LIKE).build(); + + AttachPolicyRequest catalogAttachRequest = + AttachPolicyRequest.builder() + .setTarget(catalogTarget) + .setParameters(Map.of()) + .build(); + AttachPolicyRequest namespaceAttachRequest = + AttachPolicyRequest.builder() + .setTarget(namespaceTarget) + .setParameters(Map.of()) + .build(); + AttachPolicyRequest tableAttachRequest = + AttachPolicyRequest.builder() + .setTarget(tableTarget) + .setParameters(Map.of()) + .build(); + + String ns1 = RESTUtil.encodeNamespace(NS2_P1.getNamespace()); + String ns2 = RESTUtil.encodeNamespace(NS2_P1.getNamespace()); + + Response res = policyApi.request("polaris/v1/{cat}", Map.of("cat", currentCatalogName)) + .put(Entity.json(catalogAttachRequest)); - PolicyAttachmentTarget catalogTarget = - PolicyAttachmentTarget.builder().setType(PolicyAttachmentTarget.TypeEnum.CATALOG).build(); - PolicyAttachmentTarget namespaceTarget = - PolicyAttachmentTarget.builder().setType(PolicyAttachmentTarget.TypeEnum.NAMESPACE).build(); - PolicyAttachmentTarget tableTarget = - PolicyAttachmentTarget.builder().setType(PolicyAttachmentTarget.TypeEnum.TABLE_LIKE).build(); - - AttachPolicyRequest catalogAttachRequest = - AttachPolicyRequest.builder() - .setTarget(catalogTarget) - .setParameters(Map.of()) - .build(); - AttachPolicyRequest namespaceAttachRequest = - AttachPolicyRequest.builder() - .setTarget(namespaceTarget) - .setParameters(Map.of()) - .build(); - AttachPolicyRequest tableAttachRequest = - AttachPolicyRequest.builder() - .setTarget(tableTarget) - .setParameters(Map.of()) - .build(); - - String ns2 = RESTUtil.encodeNamespace(NS2_P1.getNamespace()); - - Response res = policyApi.request("polaris/v1/{cat}", Map.of("cat", currentCatalogName)) - .post(Entity.json(catalogAttachRequest)); - Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NO_CONTENT.getStatusCode()); - - res = policyApi.request("polaris/v1/{cat}/namespaces/{ns}/policies", - Map.of("cat", currentCatalogName, "ns", ns2)) - .post(Entity.json(catalogAttachRequest))) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NO_CONTENT.getStatusCode()); - } - try (Response res = - policyApi - .request( - "polaris/v1/{cat}/namespaces/{ns}/policies", - Map.of("cat", currentCatalogName, "ns", ns2)) - .post(Entity.json(catalogAttachRequest))) { + res = policyApi.request("polaris/v1/{cat}/namespaces/{ns}/policies/{policy}/mappings", + Map.of("cat", currentCatalogName, "ns", ns1, "policy", NS1_P1.getName())) + .put(Entity.json(tableAttachRequest)); + Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NO_CONTENT.getStatusCode()); + + + res = policyApi.request("polaris/v1/{cat}/namespaces/{ns}/policies", + Map.of("cat", currentCatalogName, "ns", ns2)) + .post(Entity.json(tableAttachRequest)); + + Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NO_CONTENT.getStatusCode()); + } - } @Test public void testDropPolicy() { diff --git a/quarkus/defaults/src/main/resources/application-it.properties b/quarkus/defaults/src/main/resources/application-it.properties index dc660f54ad..58f6834c23 100644 --- a/quarkus/defaults/src/main/resources/application-it.properties +++ b/quarkus/defaults/src/main/resources/application-it.properties @@ -25,6 +25,10 @@ quarkus.http.port=0 quarkus.management.port=0 +quarkus.log.console.enable=true +quarkus.log.level=DEBUG +quarkus.log.category.org.apache.polaris.level=DEBUG + # polaris.persistence.type=eclipse-link # polaris.persistence.type=in-memory-atomic polaris.persistence.type=in-memory diff --git a/quarkus/defaults/src/main/resources/application-test.properties b/quarkus/defaults/src/main/resources/application-test.properties index 61d7a518aa..1591e4744b 100644 --- a/quarkus/defaults/src/main/resources/application-test.properties +++ b/quarkus/defaults/src/main/resources/application-test.properties @@ -22,3 +22,6 @@ quarkus.log.file.enable=false quarkus.datasource.devservices.image-name=postgres:17-alpine +quarkus.log.console.enable=true +quarkus.log.level=DEBUG +quarkus.log.category.org.apache.polaris.level=DEBUG \ No newline at end of file From cbd1d5b14dbb00cbd9af87a9f74fe630d861baad Mon Sep 17 00:00:00 2001 From: William Hyun Date: Thu, 22 May 2025 11:27:46 -0700 Subject: [PATCH 08/23] Removed Debugging --- .../PolarisPolicyServiceIntegrationTest.java | 87 ++++++++----------- .../main/resources/application-it.properties | 4 - .../resources/application-test.properties | 3 - .../iceberg/IcebergCatalogAdapter.java | 2 - 4 files changed, 35 insertions(+), 61 deletions(-) diff --git a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java index d22c9e9bac..cc43e1ee4b 100644 --- a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java +++ b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java @@ -73,7 +73,6 @@ import org.apache.polaris.service.it.env.PolicyApi; import org.apache.polaris.service.it.ext.PolarisIntegrationTestExtension; import org.apache.polaris.service.types.ApplicablePolicy; -import org.apache.polaris.service.types.AttachPolicyRequest; import org.apache.polaris.service.types.CreatePolicyRequest; import org.apache.polaris.service.types.Policy; import org.apache.polaris.service.types.PolicyAttachmentTarget; @@ -367,63 +366,47 @@ public void testCreatePolicyWithInvalidNamespace() { .post(Entity.json(request))) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); LOG.info(res.readEntity(String.class)); - Assertions.assertThat(res.readEntity(String.class)).contains("The given namespace does not exist"); + Assertions.assertThat(res.readEntity(String.class)) + .contains("The given namespace does not exist"); } } - @Test - public void testAttachPolicy() { - restCatalog.createNamespace(NS1); - restCatalog.createNamespace(NS2); - policyApi.createPolicy( - currentCatalogName, - NS1_P1, - PredefinedPolicyTypes.DATA_COMPACTION, - EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT, - "test policy"); - - PolicyAttachmentTarget catalogTarget = PolicyAttachmentTarget.builder().setType(PolicyAttachmentTarget.TypeEnum.CATALOG).build(); - PolicyAttachmentTarget namespaceTarget = PolicyAttachmentTarget.builder().setType(PolicyAttachmentTarget.TypeEnum.NAMESPACE).build(); - PolicyAttachmentTarget tableTarget = PolicyAttachmentTarget.builder().setType(PolicyAttachmentTarget.TypeEnum.TABLE_LIKE).build(); - - AttachPolicyRequest catalogAttachRequest = - AttachPolicyRequest.builder() - .setTarget(catalogTarget) - .setParameters(Map.of()) - .build(); - AttachPolicyRequest namespaceAttachRequest = - AttachPolicyRequest.builder() - .setTarget(namespaceTarget) - .setParameters(Map.of()) - .build(); - AttachPolicyRequest tableAttachRequest = - AttachPolicyRequest.builder() - .setTarget(tableTarget) - .setParameters(Map.of()) - .build(); - - String ns1 = RESTUtil.encodeNamespace(NS2_P1.getNamespace()); - String ns2 = RESTUtil.encodeNamespace(NS2_P1.getNamespace()); - - Response res = policyApi.request("polaris/v1/{cat}", Map.of("cat", currentCatalogName)) - .put(Entity.json(catalogAttachRequest)); - - Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NO_CONTENT.getStatusCode()); - - res = policyApi.request("polaris/v1/{cat}/namespaces/{ns}/policies/{policy}/mappings", - Map.of("cat", currentCatalogName, "ns", ns1, "policy", NS1_P1.getName())) - .put(Entity.json(tableAttachRequest)); - - Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NO_CONTENT.getStatusCode()); - + @Test + public void testAttachPolicy() { + restCatalog.createNamespace(NS1); + policyApi.createPolicy( + currentCatalogName, + NS1_P1, + PredefinedPolicyTypes.DATA_COMPACTION, + EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT, + "test policy"); - res = policyApi.request("polaris/v1/{cat}/namespaces/{ns}/policies", - Map.of("cat", currentCatalogName, "ns", ns2)) - .post(Entity.json(tableAttachRequest)); + Assertions.assertThat(policyApi.listPolicies(currentCatalogName, NS1)).hasSize(1); - Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NO_CONTENT.getStatusCode()); + PolicyAttachmentTarget catalogTarget = + PolicyAttachmentTarget.builder().setType(PolicyAttachmentTarget.TypeEnum.CATALOG).build(); + PolicyAttachmentTarget namespaceTarget = + PolicyAttachmentTarget.builder().setType(PolicyAttachmentTarget.TypeEnum.NAMESPACE).build(); + PolicyAttachmentTarget tableTarget = + PolicyAttachmentTarget.builder() + .setType(PolicyAttachmentTarget.TypeEnum.TABLE_LIKE) + .build(); - } + policyApi.attachPolicy(currentCatalogName, NS1_P1, catalogTarget, Map.of()); + Assertions.assertThat(policyApi.listPolicies(currentCatalogName, NS1)).hasSize(2); + Assertions.assertThat(policyApi.getApplicablePolicies(currentCatalogName, NS1, null, null)) + .hasSize(2); + + policyApi.attachPolicy(currentCatalogName, NS2_P1, namespaceTarget, Map.of()); + Assertions.assertThat(policyApi.listPolicies(currentCatalogName, NS2)).hasSize(1); + Assertions.assertThat(policyApi.getApplicablePolicies(currentCatalogName, NS2, null, null)) + .hasSize(1); + + policyApi.attachPolicy(currentCatalogName, NS2_P1, tableTarget, Map.of()); + Assertions.assertThat(policyApi.listPolicies(currentCatalogName, NS2)).hasSize(2); + Assertions.assertThat(policyApi.getApplicablePolicies(currentCatalogName, NS2, null, null)) + .hasSize(2); + } @Test public void testDropPolicy() { diff --git a/quarkus/defaults/src/main/resources/application-it.properties b/quarkus/defaults/src/main/resources/application-it.properties index 58f6834c23..dc660f54ad 100644 --- a/quarkus/defaults/src/main/resources/application-it.properties +++ b/quarkus/defaults/src/main/resources/application-it.properties @@ -25,10 +25,6 @@ quarkus.http.port=0 quarkus.management.port=0 -quarkus.log.console.enable=true -quarkus.log.level=DEBUG -quarkus.log.category.org.apache.polaris.level=DEBUG - # polaris.persistence.type=eclipse-link # polaris.persistence.type=in-memory-atomic polaris.persistence.type=in-memory diff --git a/quarkus/defaults/src/main/resources/application-test.properties b/quarkus/defaults/src/main/resources/application-test.properties index 1591e4744b..61d7a518aa 100644 --- a/quarkus/defaults/src/main/resources/application-test.properties +++ b/quarkus/defaults/src/main/resources/application-test.properties @@ -22,6 +22,3 @@ quarkus.log.file.enable=false quarkus.datasource.devservices.image-name=postgres:17-alpine -quarkus.log.console.enable=true -quarkus.log.level=DEBUG -quarkus.log.category.org.apache.polaris.level=DEBUG \ No newline at end of file diff --git a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java index 97826fd332..c28fd491a6 100644 --- a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java +++ b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java @@ -456,8 +456,6 @@ public Response dropTable( SecurityContext securityContext) { Namespace ns = decodeNamespace(namespace); TableIdentifier tableIdentifier = TableIdentifier.of(ns, RESTUtil.decodeString(table)); - System.out.println("[DEBUG] WE ARE IN DROP TABLE " + tableIdentifier); - System.out.println("[DEBUG] PURGE_REQUESTED = " + purgeRequested); return withCatalog( securityContext, prefix, From f87455e014f38f1ff602dd7c04be13de9df89ca2 Mon Sep 17 00:00:00 2001 From: William Hyun Date: Thu, 22 May 2025 15:51:13 -0700 Subject: [PATCH 09/23] Implemented Quarkus Tests --- .../PolarisPolicyServiceIntegrationTest.java | 75 ---------------- .../quarkus/catalog/PolicyCatalogTest.java | 86 +++++++++++++++++++ 2 files changed, 86 insertions(+), 75 deletions(-) diff --git a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java index cc43e1ee4b..c610f13ffa 100644 --- a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java +++ b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java @@ -89,8 +89,6 @@ import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; @ExtendWith(PolarisIntegrationTestExtension.class) public class PolarisPolicyServiceIntegrationTest { @@ -107,12 +105,8 @@ public class PolarisPolicyServiceIntegrationTest { private static final PolicyIdentifier NS1_P1 = new PolicyIdentifier(NS1, "P1"); private static final PolicyIdentifier NS1_P2 = new PolicyIdentifier(NS1, "P2"); private static final PolicyIdentifier NS1_P3 = new PolicyIdentifier(NS1, "P3"); - private static final PolicyIdentifier NS2_P1 = new PolicyIdentifier(NS2, "P1"); private static final TableIdentifier NS2_T1 = TableIdentifier.of(NS2, "T1"); - private static final Logger LOG = - LoggerFactory.getLogger(PolarisPolicyServiceIntegrationTest.class); - private static URI s3BucketBase; private static String principalRoleName; private static ClientCredentials adminCredentials; @@ -339,75 +333,6 @@ public void testCreatePolicyWithInvalidName(String policyName) { } } - @Test - public void testCreatePolicyWithInvalidNamespace() { - restCatalog.createNamespace(NS1); - PolicyIdentifier policyIdentifier = new PolicyIdentifier(NS1, "P1"); - - CreatePolicyRequest request = - CreatePolicyRequest.builder() - .setType(PredefinedPolicyTypes.DATA_COMPACTION.getName()) - .setName(policyIdentifier.getName()) - .setDescription("test policy") - .setContent(EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT) - .build(); - - LOG.info("WE ARE IN testCreatePolicyWithInvalidNamespace"); - LOG.info("CreatePolicyRequest: " + request); - - String invalidNamespace = "INVALID_NAMESPACE"; - String nsEncoded = RESTUtil.encodeNamespace(Namespace.of(invalidNamespace)); - - try (Response res = - policyApi - .request( - "polaris/v1/{cat}/namespaces/{ns}/policies", - Map.of("cat", currentCatalogName, "ns", nsEncoded)) - .post(Entity.json(request))) { - Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); - LOG.info(res.readEntity(String.class)); - Assertions.assertThat(res.readEntity(String.class)) - .contains("The given namespace does not exist"); - } - } - - @Test - public void testAttachPolicy() { - restCatalog.createNamespace(NS1); - policyApi.createPolicy( - currentCatalogName, - NS1_P1, - PredefinedPolicyTypes.DATA_COMPACTION, - EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT, - "test policy"); - - Assertions.assertThat(policyApi.listPolicies(currentCatalogName, NS1)).hasSize(1); - - PolicyAttachmentTarget catalogTarget = - PolicyAttachmentTarget.builder().setType(PolicyAttachmentTarget.TypeEnum.CATALOG).build(); - PolicyAttachmentTarget namespaceTarget = - PolicyAttachmentTarget.builder().setType(PolicyAttachmentTarget.TypeEnum.NAMESPACE).build(); - PolicyAttachmentTarget tableTarget = - PolicyAttachmentTarget.builder() - .setType(PolicyAttachmentTarget.TypeEnum.TABLE_LIKE) - .build(); - - policyApi.attachPolicy(currentCatalogName, NS1_P1, catalogTarget, Map.of()); - Assertions.assertThat(policyApi.listPolicies(currentCatalogName, NS1)).hasSize(2); - Assertions.assertThat(policyApi.getApplicablePolicies(currentCatalogName, NS1, null, null)) - .hasSize(2); - - policyApi.attachPolicy(currentCatalogName, NS2_P1, namespaceTarget, Map.of()); - Assertions.assertThat(policyApi.listPolicies(currentCatalogName, NS2)).hasSize(1); - Assertions.assertThat(policyApi.getApplicablePolicies(currentCatalogName, NS2, null, null)) - .hasSize(1); - - policyApi.attachPolicy(currentCatalogName, NS2_P1, tableTarget, Map.of()); - Assertions.assertThat(policyApi.listPolicies(currentCatalogName, NS2)).hasSize(2); - Assertions.assertThat(policyApi.getApplicablePolicies(currentCatalogName, NS2, null, null)) - .hasSize(2); - } - @Test public void testDropPolicy() { restCatalog.createNamespace(NS1); diff --git a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java index 6e5cebb0dd..d2e8d67974 100644 --- a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java +++ b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java @@ -49,6 +49,8 @@ import org.apache.iceberg.catalog.Namespace; import org.apache.iceberg.catalog.TableIdentifier; import org.apache.iceberg.exceptions.AlreadyExistsException; +import org.apache.iceberg.exceptions.NoSuchNamespaceException; +import org.apache.iceberg.exceptions.NoSuchTableException; import org.apache.iceberg.types.Types; import org.apache.polaris.core.PolarisCallContext; import org.apache.polaris.core.PolarisDiagnostics; @@ -383,6 +385,18 @@ public void testCreatePolicyAlreadyExists() { .isInstanceOf(AlreadyExistsException.class); } + @Test + public void testCreatePolicyUnderNonExistentNamespace() { + assertThatThrownBy( + () -> + policyCatalog.createPolicy( + POLICY1, + PredefinedPolicyTypes.DATA_COMPACTION.getName(), + "test", + "{\"enable\": false}")) + .isInstanceOf(IllegalStateException.class); + } + @Test public void testListPolicies() { icebergCatalog.createNamespace(NS); @@ -560,6 +574,29 @@ public void testAttachPolicy() { assertThat(policyCatalog.getApplicablePolicies(null, null, null).size()).isEqualTo(1); } + @Test + public void testAttachPolicyToNonExistingNamespace() { + icebergCatalog.createNamespace(NS); + Namespace NS2 = Namespace.of("INVALID_NAMESPACE"); + policyCatalog.createPolicy(POLICY1, DATA_COMPACTION.getName(), "test", "{\"enable\": false}"); + + var invalidTarget = new PolicyAttachmentTarget(PolicyAttachmentTarget.TypeEnum.NAMESPACE, List.of(NS2.levels())); + assertThatThrownBy(() -> policyCatalog.attachPolicy(POLICY1, invalidTarget, null)) + .isInstanceOf(NoSuchNamespaceException.class) + .hasMessage("Namespace does not exist: INVALID_NAMESPACE"); + } + + @Test + public void testAttachPolicyToNonExistingTable() { + icebergCatalog.createNamespace(NS); + policyCatalog.createPolicy(POLICY1, DATA_COMPACTION.getName(), "test", "{\"enable\": false}"); + + var invalidTarget = new PolicyAttachmentTarget(PolicyAttachmentTarget.TypeEnum.TABLE_LIKE, List.of(NS.levels())); + assertThatThrownBy(() -> policyCatalog.attachPolicy(POLICY1, invalidTarget, null)) + .isInstanceOf(NoSuchTableException.class) + .hasMessage("Iceberg Table does not exist: ns1"); + } + @Test public void testAttachPolicyConflict() { icebergCatalog.createNamespace(NS); @@ -588,6 +625,37 @@ public void testDetachPolicy() { assertThat(policyCatalog.getApplicablePolicies(NS, null, null).size()).isEqualTo(0); } + @Test + public void testDetachPolicyFromNonExistingNamespace() { + icebergCatalog.createNamespace(NS); + policyCatalog.createPolicy(POLICY1, DATA_COMPACTION.getName(), "test", "{\"enable\": false}"); + + Namespace invalidNamespace = Namespace.of("INVALID_NAMESPACE"); + + PolicyAttachmentTarget invalidTarget = + new PolicyAttachmentTarget(PolicyAttachmentTarget.TypeEnum.NAMESPACE, List.of(invalidNamespace.levels())); + + assertThatThrownBy(() -> policyCatalog.detachPolicy(POLICY1, invalidTarget)) + .isInstanceOf(NoSuchNamespaceException.class) + .hasMessage("Namespace does not exist: INVALID_NAMESPACE"); + } + + + @Test + public void testDetachPolicyFromNonExistingTable() { + icebergCatalog.createNamespace(NS); + policyCatalog.createPolicy(POLICY1, DATA_COMPACTION.getName(), "test", "{\"enable\": false}"); + + TableIdentifier invalidTable = TableIdentifier.of(NS, "INVALID_TABLE"); + PolicyAttachmentTarget invalidTarget = + new PolicyAttachmentTarget( + PolicyAttachmentTarget.TypeEnum.TABLE_LIKE, List.of(invalidTable.toString().split("\\."))); + + assertThatThrownBy(() -> policyCatalog.detachPolicy(POLICY1, invalidTarget)) + .isInstanceOf(NoSuchTableException.class) + .hasMessage("Iceberg Table does not exist: ns1.INVALID_TABLE"); + } + @Test public void testPolicyOverwrite() { icebergCatalog.createNamespace(NS); @@ -669,6 +737,24 @@ public void testGetApplicablePoliciesFilterOnType() { assertThat(applicablePolicies.contains(policyToApplicablePolicy(p2, false, NS))).isTrue(); } + @Test + public void testGetApplicablePoliciesOnNonExistingNamespace() { + assertThatThrownBy(() -> policyCatalog.getApplicablePolicies(NS, null, DATA_COMPACTION)) + .isInstanceOf(NoSuchNamespaceException.class) + .hasMessage("Namespace does not exist: ns1"); + } + + @Test + public void testGetApplicablePoliciesOnNonExistingTable() { + icebergCatalog.createNamespace(NS); + policyCatalog.createPolicy(POLICY1, DATA_COMPACTION.getName(), "test", "{\"enable\": false}"); + TableIdentifier invalidTable = TableIdentifier.of(NS, "INVALID_TABLE"); + + assertThatThrownBy(() -> policyCatalog.getApplicablePolicies(NS, "INVALID_TABLE", DATA_COMPACTION)) + .isInstanceOf(NoSuchTableException.class) + .hasMessage("Iceberg Table does not exist: ns1.INVALID_TABLE"); + } + private static ApplicablePolicy policyToApplicablePolicy( Policy policy, boolean inherited, Namespace parent) { return new ApplicablePolicy( From 8d78fd8e0ad7905a255b4c96b328da9e8f178c01 Mon Sep 17 00:00:00 2001 From: William Hyun Date: Thu, 22 May 2025 16:47:34 -0700 Subject: [PATCH 10/23] WIP --- .../PolarisPolicyServiceIntegrationTest.java | 53 +++++++++++++++++ .../quarkus/catalog/PolicyCatalogTest.java | 58 ++++++++++--------- 2 files changed, 85 insertions(+), 26 deletions(-) diff --git a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java index c610f13ffa..08f5d04ef2 100644 --- a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java +++ b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java @@ -73,6 +73,7 @@ import org.apache.polaris.service.it.env.PolicyApi; import org.apache.polaris.service.it.ext.PolarisIntegrationTestExtension; import org.apache.polaris.service.types.ApplicablePolicy; +import org.apache.polaris.service.types.AttachPolicyRequest; import org.apache.polaris.service.types.CreatePolicyRequest; import org.apache.polaris.service.types.Policy; import org.apache.polaris.service.types.PolicyAttachmentTarget; @@ -333,6 +334,58 @@ public void testCreatePolicyWithInvalidName(String policyName) { } } + @Test + public void testCreatePolicyWithNonExistingNamespace() { + String ns = RESTUtil.encodeNamespace(NS1); + CreatePolicyRequest request = + CreatePolicyRequest.builder() + .setType(PredefinedPolicyTypes.DATA_COMPACTION.getName()) + .setName(currentCatalogName) + .setDescription("test policy") + .setContent(EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT) + .build(); + try (Response res = + policyApi + .request( + "polaris/v1/{cat}/namespaces/{ns}/policies", + Map.of("cat", currentCatalogName, "ns", ns)) + .post(Entity.json(request))) { + Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); + Assertions.assertThat(res.readEntity(String.class)) + .contains("Namespace does not exist: NS1"); + } + } + + @Test + public void testAttachPolicyToNonExistingNamespace() { + restCatalog.createNamespace(NS1); + String ns = RESTUtil.encodeNamespace(NS1); + policyApi.createPolicy( + currentCatalogName, + NS1_P1, + PredefinedPolicyTypes.DATA_COMPACTION, + EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT, + "test policy"); + + Namespace invalidNamespace = Namespace.of("INVALID_NAMESPACE"); + var invalidTarget = + new PolicyAttachmentTarget( + PolicyAttachmentTarget.TypeEnum.NAMESPACE, List.of(invalidNamespace.levels())); + + AttachPolicyRequest request = + AttachPolicyRequest.builder().setTarget(invalidTarget).setParameters(Map.of()).build(); + try (Response res = + policyApi + .request( + "polaris/v1/{cat}/namespaces/{ns}/policies/{policy-name}/mappings", + Map.of("cat", currentCatalogName, "ns", ns, "policy-name", NS1_P1.getName())) + .put(Entity.json(request))) { + Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); + Assertions.assertThat(res.readEntity(String.class)) + .contains("Namespace does not exist: INVALID_NAMESPACE"); + } + } + @Test public void testDropPolicy() { restCatalog.createNamespace(NS1); diff --git a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java index d2e8d67974..b1c8d1eb3c 100644 --- a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java +++ b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java @@ -389,12 +389,12 @@ public void testCreatePolicyAlreadyExists() { public void testCreatePolicyUnderNonExistentNamespace() { assertThatThrownBy( () -> - policyCatalog.createPolicy( - POLICY1, - PredefinedPolicyTypes.DATA_COMPACTION.getName(), - "test", - "{\"enable\": false}")) - .isInstanceOf(IllegalStateException.class); + policyCatalog.createPolicy( + POLICY1, + PredefinedPolicyTypes.DATA_COMPACTION.getName(), + "test", + "{\"enable\": false}")) + .isInstanceOf(IllegalStateException.class); } @Test @@ -577,13 +577,15 @@ public void testAttachPolicy() { @Test public void testAttachPolicyToNonExistingNamespace() { icebergCatalog.createNamespace(NS); - Namespace NS2 = Namespace.of("INVALID_NAMESPACE"); + Namespace invalidNamespace = Namespace.of("INVALID_NAMESPACE"); policyCatalog.createPolicy(POLICY1, DATA_COMPACTION.getName(), "test", "{\"enable\": false}"); - var invalidTarget = new PolicyAttachmentTarget(PolicyAttachmentTarget.TypeEnum.NAMESPACE, List.of(NS2.levels())); + var invalidTarget = + new PolicyAttachmentTarget( + PolicyAttachmentTarget.TypeEnum.NAMESPACE, List.of(invalidNamespace.levels())); assertThatThrownBy(() -> policyCatalog.attachPolicy(POLICY1, invalidTarget, null)) - .isInstanceOf(NoSuchNamespaceException.class) - .hasMessage("Namespace does not exist: INVALID_NAMESPACE"); + .isInstanceOf(NoSuchNamespaceException.class) + .hasMessage("Namespace does not exist: INVALID_NAMESPACE"); } @Test @@ -591,10 +593,12 @@ public void testAttachPolicyToNonExistingTable() { icebergCatalog.createNamespace(NS); policyCatalog.createPolicy(POLICY1, DATA_COMPACTION.getName(), "test", "{\"enable\": false}"); - var invalidTarget = new PolicyAttachmentTarget(PolicyAttachmentTarget.TypeEnum.TABLE_LIKE, List.of(NS.levels())); + var invalidTarget = + new PolicyAttachmentTarget( + PolicyAttachmentTarget.TypeEnum.TABLE_LIKE, List.of(NS.levels())); assertThatThrownBy(() -> policyCatalog.attachPolicy(POLICY1, invalidTarget, null)) - .isInstanceOf(NoSuchTableException.class) - .hasMessage("Iceberg Table does not exist: ns1"); + .isInstanceOf(NoSuchTableException.class) + .hasMessage("Iceberg Table does not exist: ns1"); } @Test @@ -633,14 +637,14 @@ public void testDetachPolicyFromNonExistingNamespace() { Namespace invalidNamespace = Namespace.of("INVALID_NAMESPACE"); PolicyAttachmentTarget invalidTarget = - new PolicyAttachmentTarget(PolicyAttachmentTarget.TypeEnum.NAMESPACE, List.of(invalidNamespace.levels())); + new PolicyAttachmentTarget( + PolicyAttachmentTarget.TypeEnum.NAMESPACE, List.of(invalidNamespace.levels())); assertThatThrownBy(() -> policyCatalog.detachPolicy(POLICY1, invalidTarget)) - .isInstanceOf(NoSuchNamespaceException.class) - .hasMessage("Namespace does not exist: INVALID_NAMESPACE"); + .isInstanceOf(NoSuchNamespaceException.class) + .hasMessage("Namespace does not exist: INVALID_NAMESPACE"); } - @Test public void testDetachPolicyFromNonExistingTable() { icebergCatalog.createNamespace(NS); @@ -648,12 +652,13 @@ public void testDetachPolicyFromNonExistingTable() { TableIdentifier invalidTable = TableIdentifier.of(NS, "INVALID_TABLE"); PolicyAttachmentTarget invalidTarget = - new PolicyAttachmentTarget( - PolicyAttachmentTarget.TypeEnum.TABLE_LIKE, List.of(invalidTable.toString().split("\\."))); + new PolicyAttachmentTarget( + PolicyAttachmentTarget.TypeEnum.TABLE_LIKE, + List.of(invalidTable.toString().split("\\."))); assertThatThrownBy(() -> policyCatalog.detachPolicy(POLICY1, invalidTarget)) - .isInstanceOf(NoSuchTableException.class) - .hasMessage("Iceberg Table does not exist: ns1.INVALID_TABLE"); + .isInstanceOf(NoSuchTableException.class) + .hasMessage("Iceberg Table does not exist: ns1.INVALID_TABLE"); } @Test @@ -740,8 +745,8 @@ public void testGetApplicablePoliciesFilterOnType() { @Test public void testGetApplicablePoliciesOnNonExistingNamespace() { assertThatThrownBy(() -> policyCatalog.getApplicablePolicies(NS, null, DATA_COMPACTION)) - .isInstanceOf(NoSuchNamespaceException.class) - .hasMessage("Namespace does not exist: ns1"); + .isInstanceOf(NoSuchNamespaceException.class) + .hasMessage("Namespace does not exist: ns1"); } @Test @@ -750,9 +755,10 @@ public void testGetApplicablePoliciesOnNonExistingTable() { policyCatalog.createPolicy(POLICY1, DATA_COMPACTION.getName(), "test", "{\"enable\": false}"); TableIdentifier invalidTable = TableIdentifier.of(NS, "INVALID_TABLE"); - assertThatThrownBy(() -> policyCatalog.getApplicablePolicies(NS, "INVALID_TABLE", DATA_COMPACTION)) - .isInstanceOf(NoSuchTableException.class) - .hasMessage("Iceberg Table does not exist: ns1.INVALID_TABLE"); + assertThatThrownBy( + () -> policyCatalog.getApplicablePolicies(NS, "INVALID_TABLE", DATA_COMPACTION)) + .isInstanceOf(NoSuchTableException.class) + .hasMessage("Iceberg Table does not exist: ns1.INVALID_TABLE"); } private static ApplicablePolicy policyToApplicablePolicy( From b85f50e85a5d01f223980a50d8e5d6c89a612dda Mon Sep 17 00:00:00 2001 From: William Hyun Date: Thu, 22 May 2025 16:57:48 -0700 Subject: [PATCH 11/23] Good checkpoint --- .../service/it/test/PolarisPolicyServiceIntegrationTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java index 08f5d04ef2..bf4d8708d3 100644 --- a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java +++ b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java @@ -384,6 +384,7 @@ public void testAttachPolicyToNonExistingNamespace() { Assertions.assertThat(res.readEntity(String.class)) .contains("Namespace does not exist: INVALID_NAMESPACE"); } + policyApi.dropPolicy(currentCatalogName, NS1_P1); } @Test From a2e72a5c3b7a163cf89593245ae1971384dc4b35 Mon Sep 17 00:00:00 2001 From: William Hyun Date: Thu, 22 May 2025 17:09:23 -0700 Subject: [PATCH 12/23] Detach cases covered --- .../PolarisPolicyServiceIntegrationTest.java | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java index bf4d8708d3..d5b6bad09b 100644 --- a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java +++ b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java @@ -387,6 +387,97 @@ public void testAttachPolicyToNonExistingNamespace() { policyApi.dropPolicy(currentCatalogName, NS1_P1); } + @Test + public void testAttachPolicyToNonExistingTable() { + restCatalog.createNamespace(NS1); + String ns = RESTUtil.encodeNamespace(NS1); + + policyApi.createPolicy( + currentCatalogName, + NS1_P1, + PredefinedPolicyTypes.DATA_COMPACTION, + EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT, + "test policy"); + TableIdentifier invalidTable = TableIdentifier.of(NS1, "INVALID_TABLE"); + var invalidTarget = + new PolicyAttachmentTarget( + PolicyAttachmentTarget.TypeEnum.TABLE_LIKE, List.of(invalidTable.toString().split("\\."))); + + AttachPolicyRequest request = + AttachPolicyRequest.builder().setTarget(invalidTarget).setParameters(Map.of()).build(); + try (Response res = + policyApi + .request( + "polaris/v1/{cat}/namespaces/{ns}/policies/{policy-name}/mappings", + Map.of("cat", currentCatalogName, "ns", ns, "policy-name", NS1_P1.getName())) + .put(Entity.json(request))) { + Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); + Assertions.assertThat(res.readEntity(String.class)) + .contains("Table or view does not exist: NS1"); + } + policyApi.dropPolicy(currentCatalogName, NS1_P1); + } + + @Test + public void testDetachPolicyFromNonExistingNamespace() { + restCatalog.createNamespace(NS1); + String ns = RESTUtil.encodeNamespace(NS1); + policyApi.createPolicy( + currentCatalogName, + NS1_P1, + PredefinedPolicyTypes.DATA_COMPACTION, + EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT, + "test policy"); + Namespace invalidNamespace = Namespace.of("INVALID_NAMESPACE"); + var invalidTarget = + new PolicyAttachmentTarget( + PolicyAttachmentTarget.TypeEnum.NAMESPACE, List.of(invalidNamespace.levels())); + + AttachPolicyRequest request = + AttachPolicyRequest.builder().setTarget(invalidTarget).setParameters(Map.of()).build(); + try (Response res = + policyApi + .request( + "polaris/v1/{cat}/namespaces/{ns}/policies/{policy-name}/mappings", + Map.of("cat", currentCatalogName, "ns", ns, "policy-name", NS1_P1.getName())) + .post(Entity.json(request))) { + Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); + Assertions.assertThat(res.readEntity(String.class)) + .contains("Namespace does not exist: INVALID_NAMESPACE"); + } + policyApi.dropPolicy(currentCatalogName, NS1_P1); + } + + @Test + public void testDetachPolicyFromNonExistingTable() { + restCatalog.createNamespace(NS1); + String ns = RESTUtil.encodeNamespace(NS1); + policyApi.createPolicy( + currentCatalogName, + NS1_P1, + PredefinedPolicyTypes.DATA_COMPACTION, + EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT, + "test policy"); + TableIdentifier invalidTable = TableIdentifier.of(NS1, "INVALID_TABLE"); + var invalidTarget = + new PolicyAttachmentTarget( + PolicyAttachmentTarget.TypeEnum.TABLE_LIKE, List.of(invalidTable.toString().split("\\."))); + + AttachPolicyRequest request = + AttachPolicyRequest.builder().setTarget(invalidTarget).setParameters(Map.of()).build(); + try (Response res = + policyApi + .request( + "polaris/v1/{cat}/namespaces/{ns}/policies/{policy-name}/mappings", + Map.of("cat", currentCatalogName, "ns", ns, "policy-name", NS1_P1.getName())) + .post(Entity.json(request))) { + Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); + Assertions.assertThat(res.readEntity(String.class)) + .contains("Table or view does not exist: NS1"); + } + policyApi.dropPolicy(currentCatalogName, NS1_P1); + } + @Test public void testDropPolicy() { restCatalog.createNamespace(NS1); From 56961ae689668ad1cfe767048a5214cf37dd436f Mon Sep 17 00:00:00 2001 From: William Hyun Date: Thu, 22 May 2025 17:10:55 -0700 Subject: [PATCH 13/23] End of day --- .../PolarisPolicyServiceIntegrationTest.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java index d5b6bad09b..22e1a98113 100644 --- a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java +++ b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java @@ -19,8 +19,10 @@ package org.apache.polaris.service.it.test; import static jakarta.ws.rs.core.Response.Status.NOT_FOUND; +import static org.apache.polaris.core.policy.PredefinedPolicyTypes.DATA_COMPACTION; import static org.apache.polaris.service.it.env.PolarisClient.polarisClient; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.google.common.collect.ImmutableMap; import jakarta.ws.rs.client.Entity; @@ -39,6 +41,8 @@ import org.apache.iceberg.Schema; import org.apache.iceberg.catalog.Namespace; import org.apache.iceberg.catalog.TableIdentifier; +import org.apache.iceberg.exceptions.NoSuchNamespaceException; +import org.apache.iceberg.exceptions.NoSuchTableException; import org.apache.iceberg.rest.RESTCatalog; import org.apache.iceberg.rest.RESTUtil; import org.apache.iceberg.types.Types; @@ -562,6 +566,26 @@ public void testListPolicies() { policyApi.dropPolicy(currentCatalogName, NS1_P2); } + // @TODO WRAP UP THIS TEST CASE AND WE CAN OPEN A PULL REQUEST +// @Test +// public void testGetApplicablePoliciesOnNonExistingNamespace() { +// assertThatThrownBy(() -> policyCatalog.getApplicablePolicies(NS1, null, DATA_COMPACTION)) +// .isInstanceOf(NoSuchNamespaceException.class) +// .hasMessage("Namespace does not exist: ns1"); +// } +// +// @Test +// public void testGetApplicablePoliciesOnNonExistingTable() { +// icebergCatalog.createNamespace(NS); +// policyCatalog.createPolicy(POLICY1, DATA_COMPACTION.getName(), "test", "{\"enable\": false}"); +// TableIdentifier invalidTable = TableIdentifier.of(NS, "INVALID_TABLE"); +// +// assertThatThrownBy( +// () -> policyCatalog.getApplicablePolicies(NS, "INVALID_TABLE", DATA_COMPACTION)) +// .isInstanceOf(NoSuchTableException.class) +// .hasMessage("Iceberg Table does not exist: ns1.INVALID_TABLE"); +// } + @Test public void testPolicyMapping() { restCatalog.createNamespace(NS1); From 9af9066498842b3e512dc0f836ca4914599ea6b6 Mon Sep 17 00:00:00 2001 From: William Hyun Date: Fri, 23 May 2025 11:31:17 -0700 Subject: [PATCH 14/23] Done --- .../PolarisPolicyServiceIntegrationTest.java | 144 +++++++++++++----- 1 file changed, 104 insertions(+), 40 deletions(-) diff --git a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java index 22e1a98113..2df8dddb89 100644 --- a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java +++ b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java @@ -32,17 +32,11 @@ import java.lang.reflect.Method; import java.net.URI; import java.nio.file.Path; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; +import java.util.*; import java.util.stream.Stream; import org.apache.iceberg.Schema; import org.apache.iceberg.catalog.Namespace; import org.apache.iceberg.catalog.TableIdentifier; -import org.apache.iceberg.exceptions.NoSuchNamespaceException; -import org.apache.iceberg.exceptions.NoSuchTableException; import org.apache.iceberg.rest.RESTCatalog; import org.apache.iceberg.rest.RESTUtil; import org.apache.iceberg.types.Types; @@ -76,12 +70,7 @@ import org.apache.polaris.service.it.env.PolarisClient; import org.apache.polaris.service.it.env.PolicyApi; import org.apache.polaris.service.it.ext.PolarisIntegrationTestExtension; -import org.apache.polaris.service.types.ApplicablePolicy; -import org.apache.polaris.service.types.AttachPolicyRequest; -import org.apache.polaris.service.types.CreatePolicyRequest; -import org.apache.polaris.service.types.Policy; -import org.apache.polaris.service.types.PolicyAttachmentTarget; -import org.apache.polaris.service.types.PolicyIdentifier; +import org.apache.polaris.service.types.*; import org.assertj.core.api.Assertions; import org.assertj.core.api.InstanceOfAssertFactories; import org.junit.jupiter.api.AfterAll; @@ -94,6 +83,7 @@ import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.opentest4j.AssertionFailedError; @ExtendWith(PolarisIntegrationTestExtension.class) public class PolarisPolicyServiceIntegrationTest { @@ -340,7 +330,6 @@ public void testCreatePolicyWithInvalidName(String policyName) { @Test public void testCreatePolicyWithNonExistingNamespace() { - String ns = RESTUtil.encodeNamespace(NS1); CreatePolicyRequest request = CreatePolicyRequest.builder() .setType(PredefinedPolicyTypes.DATA_COMPACTION.getName()) @@ -352,11 +341,11 @@ public void testCreatePolicyWithNonExistingNamespace() { policyApi .request( "polaris/v1/{cat}/namespaces/{ns}/policies", - Map.of("cat", currentCatalogName, "ns", ns)) + Map.of("cat", currentCatalogName, "ns", "INVALID_NAMESPACE")) .post(Entity.json(request))) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); Assertions.assertThat(res.readEntity(String.class)) - .contains("Namespace does not exist: NS1"); + .contains("Namespace does not exist: INVALID_NAMESPACE"); } } @@ -417,7 +406,7 @@ public void testAttachPolicyToNonExistingTable() { .put(Entity.json(request))) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); Assertions.assertThat(res.readEntity(String.class)) - .contains("Table or view does not exist: NS1"); + .contains("Table or view does not exist: NS1.INVALID_TABLE"); } policyApi.dropPolicy(currentCatalogName, NS1_P1); } @@ -437,8 +426,8 @@ public void testDetachPolicyFromNonExistingNamespace() { new PolicyAttachmentTarget( PolicyAttachmentTarget.TypeEnum.NAMESPACE, List.of(invalidNamespace.levels())); - AttachPolicyRequest request = - AttachPolicyRequest.builder().setTarget(invalidTarget).setParameters(Map.of()).build(); + DetachPolicyRequest request = + DetachPolicyRequest.builder().setTarget(invalidTarget).build(); try (Response res = policyApi .request( @@ -467,8 +456,8 @@ public void testDetachPolicyFromNonExistingTable() { new PolicyAttachmentTarget( PolicyAttachmentTarget.TypeEnum.TABLE_LIKE, List.of(invalidTable.toString().split("\\."))); - AttachPolicyRequest request = - AttachPolicyRequest.builder().setTarget(invalidTarget).setParameters(Map.of()).build(); + DetachPolicyRequest request = + DetachPolicyRequest.builder().setTarget(invalidTarget).build(); try (Response res = policyApi .request( @@ -508,6 +497,20 @@ public void testDropPolicy() { .hasSize(0); } + @Test + public void testDropNonExistingPolicy() { + restCatalog.createNamespace(NS1); + try (Response res = + policyApi.request( + "polaris/v1/{cat}/namespaces/{ns}/policies/{policy}", + Map.of("cat", currentCatalogName, "ns", "NS1", "policy", "INVALID_POLICY")) + .delete()) { + Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); + Assertions.assertThat(res.readEntity(String.class)) + .contains("Policy does not exist: class PolicyIdentifier {\\n namespace: NS1\\n name: INVALID_POLICY\\n}"); + } + } + @Test public void testUpdatePolicy() { restCatalog.createNamespace(NS1); @@ -536,6 +539,25 @@ public void testUpdatePolicy() { policyApi.dropPolicy(currentCatalogName, NS1_P1); } + @Test + public void testUpdateNonExistingPolicy() { + restCatalog.createNamespace(NS1); + UpdatePolicyRequest request = + UpdatePolicyRequest.builder() + .setContent("{\"enable\":false}") + .setDescription("updated test policy") + .build(); + try (Response res = + policyApi.request( + "polaris/v1/{cat}/namespaces/{ns}/policies/{policy}", + Map.of("cat", currentCatalogName, "ns", "NS1", "policy", "INVALID_POLICY")) + .put(Entity.json(request))) { + Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); + Assertions.assertThat(res.readEntity(String.class)) + .contains("Policy does not exist: class PolicyIdentifier {\\n namespace: NS1\\n name: INVALID_POLICY\\n}"); + } + } + @Test public void testListPolicies() { restCatalog.createNamespace(NS1); @@ -566,25 +588,67 @@ public void testListPolicies() { policyApi.dropPolicy(currentCatalogName, NS1_P2); } - // @TODO WRAP UP THIS TEST CASE AND WE CAN OPEN A PULL REQUEST -// @Test -// public void testGetApplicablePoliciesOnNonExistingNamespace() { -// assertThatThrownBy(() -> policyCatalog.getApplicablePolicies(NS1, null, DATA_COMPACTION)) -// .isInstanceOf(NoSuchNamespaceException.class) -// .hasMessage("Namespace does not exist: ns1"); -// } -// -// @Test -// public void testGetApplicablePoliciesOnNonExistingTable() { -// icebergCatalog.createNamespace(NS); -// policyCatalog.createPolicy(POLICY1, DATA_COMPACTION.getName(), "test", "{\"enable\": false}"); -// TableIdentifier invalidTable = TableIdentifier.of(NS, "INVALID_TABLE"); -// -// assertThatThrownBy( -// () -> policyCatalog.getApplicablePolicies(NS, "INVALID_TABLE", DATA_COMPACTION)) -// .isInstanceOf(NoSuchTableException.class) -// .hasMessage("Iceberg Table does not exist: ns1.INVALID_TABLE"); -// } + @Test + public void testListPoliciesOnNonExistingNamespace() { + try (Response res = + policyApi.request( + "polaris/v1/{cat}/namespaces/{ns}/policies", + Map.of("cat", currentCatalogName, "ns", "INVALID_NAMESPACE")) + .get()) { + Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); + Assertions.assertThat(res.readEntity(String.class)) + .contains("Namespace does not exist: INVALID_NAMESPACE"); + } + } + + @Test + public void testGetApplicablePoliciesOnNonExistingNamespace() { + Map queryParams = new HashMap<>(); + queryParams.put("namespace", "INVALID_NAMESPACE"); + try (Response res = + policyApi.request("polaris/v1/{cat}/applicable-policies", Map.of("cat", currentCatalogName), queryParams) + .get()) { + Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); + Assertions.assertThat(res.readEntity(String.class)) + .contains("Namespace does not exist: INVALID_NAMESPACE\",\"type\":\"NoSuchNamespaceException"); + } + } + + @Test + public void testGetApplicablePoliciesOnNonExistingTable() { + restCatalog.createNamespace(NS1); + policyApi.createPolicy( + currentCatalogName, + NS1_P1, + PredefinedPolicyTypes.DATA_COMPACTION, + EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT, + "test policy"); + Map queryParams = new HashMap<>(); + queryParams.put("namespace", RESTUtil.encodeNamespace(NS1)); + queryParams.put("target-name", "INVALID_TABLE"); + try (Response res = + policyApi.request("polaris/v1/{cat}/applicable-policies", Map.of("cat", currentCatalogName), queryParams) + .get()) { + Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); + Assertions.assertThat(res.readEntity(String.class)) + .contains("Table does not exist: NS1.INVALID_TABLE"); + } + policyApi.dropPolicy(currentCatalogName, NS1_P1); + } + + @Test + public void testLoadNonExistingPolicy() { + restCatalog.createNamespace(NS1); + try (Response res = + policyApi.request( + "polaris/v1/{cat}/namespaces/{ns}/policies/{policy}", + Map.of("cat", currentCatalogName, "ns", NS2_T1.name(), "policy", "INVALID_POLICY")) + .get()) { + Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); + Assertions.assertThat(res.readEntity(String.class)) + .contains("Policy does not exist: class PolicyIdentifier {\\n namespace: T1\\n name: INVALID_POLICY\\n}"); + } + } @Test public void testPolicyMapping() { From c5048f183013fccb6471fc54f9095c44925b6937 Mon Sep 17 00:00:00 2001 From: William Hyun Date: Fri, 23 May 2025 11:38:04 -0700 Subject: [PATCH 15/23] Ready to open PR --- .../PolarisPolicyServiceIntegrationTest.java | 187 ++++++++++-------- .../polaris/core/policy/PolicyEntityTest.java | 2 +- .../core/policy/PolicyValidatorsTest.java | 2 +- .../quarkus/catalog/PolicyCatalogTest.java | 92 --------- 4 files changed, 102 insertions(+), 181 deletions(-) diff --git a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java index 2df8dddb89..d6eb0ef668 100644 --- a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java +++ b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java @@ -19,10 +19,8 @@ package org.apache.polaris.service.it.test; import static jakarta.ws.rs.core.Response.Status.NOT_FOUND; -import static org.apache.polaris.core.policy.PredefinedPolicyTypes.DATA_COMPACTION; import static org.apache.polaris.service.it.env.PolarisClient.polarisClient; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.google.common.collect.ImmutableMap; import jakarta.ws.rs.client.Entity; @@ -83,7 +81,6 @@ import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; -import org.opentest4j.AssertionFailedError; @ExtendWith(PolarisIntegrationTestExtension.class) public class PolarisPolicyServiceIntegrationTest { @@ -354,11 +351,11 @@ public void testAttachPolicyToNonExistingNamespace() { restCatalog.createNamespace(NS1); String ns = RESTUtil.encodeNamespace(NS1); policyApi.createPolicy( - currentCatalogName, - NS1_P1, - PredefinedPolicyTypes.DATA_COMPACTION, - EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT, - "test policy"); + currentCatalogName, + NS1_P1, + PredefinedPolicyTypes.DATA_COMPACTION, + EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT, + "test policy"); Namespace invalidNamespace = Namespace.of("INVALID_NAMESPACE"); var invalidTarget = @@ -386,27 +383,28 @@ public void testAttachPolicyToNonExistingTable() { String ns = RESTUtil.encodeNamespace(NS1); policyApi.createPolicy( - currentCatalogName, - NS1_P1, - PredefinedPolicyTypes.DATA_COMPACTION, - EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT, - "test policy"); + currentCatalogName, + NS1_P1, + PredefinedPolicyTypes.DATA_COMPACTION, + EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT, + "test policy"); TableIdentifier invalidTable = TableIdentifier.of(NS1, "INVALID_TABLE"); var invalidTarget = - new PolicyAttachmentTarget( - PolicyAttachmentTarget.TypeEnum.TABLE_LIKE, List.of(invalidTable.toString().split("\\."))); + new PolicyAttachmentTarget( + PolicyAttachmentTarget.TypeEnum.TABLE_LIKE, + List.of(invalidTable.toString().split("\\."))); AttachPolicyRequest request = - AttachPolicyRequest.builder().setTarget(invalidTarget).setParameters(Map.of()).build(); + AttachPolicyRequest.builder().setTarget(invalidTarget).setParameters(Map.of()).build(); try (Response res = - policyApi - .request( - "polaris/v1/{cat}/namespaces/{ns}/policies/{policy-name}/mappings", - Map.of("cat", currentCatalogName, "ns", ns, "policy-name", NS1_P1.getName())) - .put(Entity.json(request))) { + policyApi + .request( + "polaris/v1/{cat}/namespaces/{ns}/policies/{policy-name}/mappings", + Map.of("cat", currentCatalogName, "ns", ns, "policy-name", NS1_P1.getName())) + .put(Entity.json(request))) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); Assertions.assertThat(res.readEntity(String.class)) - .contains("Table or view does not exist: NS1.INVALID_TABLE"); + .contains("Table or view does not exist: NS1.INVALID_TABLE"); } policyApi.dropPolicy(currentCatalogName, NS1_P1); } @@ -416,27 +414,26 @@ public void testDetachPolicyFromNonExistingNamespace() { restCatalog.createNamespace(NS1); String ns = RESTUtil.encodeNamespace(NS1); policyApi.createPolicy( - currentCatalogName, - NS1_P1, - PredefinedPolicyTypes.DATA_COMPACTION, - EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT, - "test policy"); + currentCatalogName, + NS1_P1, + PredefinedPolicyTypes.DATA_COMPACTION, + EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT, + "test policy"); Namespace invalidNamespace = Namespace.of("INVALID_NAMESPACE"); var invalidTarget = - new PolicyAttachmentTarget( - PolicyAttachmentTarget.TypeEnum.NAMESPACE, List.of(invalidNamespace.levels())); + new PolicyAttachmentTarget( + PolicyAttachmentTarget.TypeEnum.NAMESPACE, List.of(invalidNamespace.levels())); - DetachPolicyRequest request = - DetachPolicyRequest.builder().setTarget(invalidTarget).build(); + DetachPolicyRequest request = DetachPolicyRequest.builder().setTarget(invalidTarget).build(); try (Response res = - policyApi - .request( - "polaris/v1/{cat}/namespaces/{ns}/policies/{policy-name}/mappings", - Map.of("cat", currentCatalogName, "ns", ns, "policy-name", NS1_P1.getName())) - .post(Entity.json(request))) { + policyApi + .request( + "polaris/v1/{cat}/namespaces/{ns}/policies/{policy-name}/mappings", + Map.of("cat", currentCatalogName, "ns", ns, "policy-name", NS1_P1.getName())) + .post(Entity.json(request))) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); Assertions.assertThat(res.readEntity(String.class)) - .contains("Namespace does not exist: INVALID_NAMESPACE"); + .contains("Namespace does not exist: INVALID_NAMESPACE"); } policyApi.dropPolicy(currentCatalogName, NS1_P1); } @@ -446,27 +443,27 @@ public void testDetachPolicyFromNonExistingTable() { restCatalog.createNamespace(NS1); String ns = RESTUtil.encodeNamespace(NS1); policyApi.createPolicy( - currentCatalogName, - NS1_P1, - PredefinedPolicyTypes.DATA_COMPACTION, - EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT, - "test policy"); + currentCatalogName, + NS1_P1, + PredefinedPolicyTypes.DATA_COMPACTION, + EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT, + "test policy"); TableIdentifier invalidTable = TableIdentifier.of(NS1, "INVALID_TABLE"); var invalidTarget = - new PolicyAttachmentTarget( - PolicyAttachmentTarget.TypeEnum.TABLE_LIKE, List.of(invalidTable.toString().split("\\."))); + new PolicyAttachmentTarget( + PolicyAttachmentTarget.TypeEnum.TABLE_LIKE, + List.of(invalidTable.toString().split("\\."))); - DetachPolicyRequest request = - DetachPolicyRequest.builder().setTarget(invalidTarget).build(); + DetachPolicyRequest request = DetachPolicyRequest.builder().setTarget(invalidTarget).build(); try (Response res = - policyApi - .request( - "polaris/v1/{cat}/namespaces/{ns}/policies/{policy-name}/mappings", - Map.of("cat", currentCatalogName, "ns", ns, "policy-name", NS1_P1.getName())) - .post(Entity.json(request))) { + policyApi + .request( + "polaris/v1/{cat}/namespaces/{ns}/policies/{policy-name}/mappings", + Map.of("cat", currentCatalogName, "ns", ns, "policy-name", NS1_P1.getName())) + .post(Entity.json(request))) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); Assertions.assertThat(res.readEntity(String.class)) - .contains("Table or view does not exist: NS1"); + .contains("Table or view does not exist: NS1"); } policyApi.dropPolicy(currentCatalogName, NS1_P1); } @@ -501,13 +498,15 @@ public void testDropPolicy() { public void testDropNonExistingPolicy() { restCatalog.createNamespace(NS1); try (Response res = - policyApi.request( - "polaris/v1/{cat}/namespaces/{ns}/policies/{policy}", - Map.of("cat", currentCatalogName, "ns", "NS1", "policy", "INVALID_POLICY")) - .delete()) { + policyApi + .request( + "polaris/v1/{cat}/namespaces/{ns}/policies/{policy}", + Map.of("cat", currentCatalogName, "ns", "NS1", "policy", "INVALID_POLICY")) + .delete()) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); Assertions.assertThat(res.readEntity(String.class)) - .contains("Policy does not exist: class PolicyIdentifier {\\n namespace: NS1\\n name: INVALID_POLICY\\n}"); + .contains( + "Policy does not exist: class PolicyIdentifier {\\n namespace: NS1\\n name: INVALID_POLICY\\n}"); } } @@ -543,18 +542,20 @@ public void testUpdatePolicy() { public void testUpdateNonExistingPolicy() { restCatalog.createNamespace(NS1); UpdatePolicyRequest request = - UpdatePolicyRequest.builder() - .setContent("{\"enable\":false}") - .setDescription("updated test policy") - .build(); + UpdatePolicyRequest.builder() + .setContent("{\"enable\":false}") + .setDescription("updated test policy") + .build(); try (Response res = - policyApi.request( - "polaris/v1/{cat}/namespaces/{ns}/policies/{policy}", - Map.of("cat", currentCatalogName, "ns", "NS1", "policy", "INVALID_POLICY")) - .put(Entity.json(request))) { + policyApi + .request( + "polaris/v1/{cat}/namespaces/{ns}/policies/{policy}", + Map.of("cat", currentCatalogName, "ns", "NS1", "policy", "INVALID_POLICY")) + .put(Entity.json(request))) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); Assertions.assertThat(res.readEntity(String.class)) - .contains("Policy does not exist: class PolicyIdentifier {\\n namespace: NS1\\n name: INVALID_POLICY\\n}"); + .contains( + "Policy does not exist: class PolicyIdentifier {\\n namespace: NS1\\n name: INVALID_POLICY\\n}"); } } @@ -591,13 +592,14 @@ public void testListPolicies() { @Test public void testListPoliciesOnNonExistingNamespace() { try (Response res = - policyApi.request( - "polaris/v1/{cat}/namespaces/{ns}/policies", - Map.of("cat", currentCatalogName, "ns", "INVALID_NAMESPACE")) - .get()) { + policyApi + .request( + "polaris/v1/{cat}/namespaces/{ns}/policies", + Map.of("cat", currentCatalogName, "ns", "INVALID_NAMESPACE")) + .get()) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); Assertions.assertThat(res.readEntity(String.class)) - .contains("Namespace does not exist: INVALID_NAMESPACE"); + .contains("Namespace does not exist: INVALID_NAMESPACE"); } } @@ -606,11 +608,16 @@ public void testGetApplicablePoliciesOnNonExistingNamespace() { Map queryParams = new HashMap<>(); queryParams.put("namespace", "INVALID_NAMESPACE"); try (Response res = - policyApi.request("polaris/v1/{cat}/applicable-policies", Map.of("cat", currentCatalogName), queryParams) - .get()) { + policyApi + .request( + "polaris/v1/{cat}/applicable-policies", + Map.of("cat", currentCatalogName), + queryParams) + .get()) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); Assertions.assertThat(res.readEntity(String.class)) - .contains("Namespace does not exist: INVALID_NAMESPACE\",\"type\":\"NoSuchNamespaceException"); + .contains( + "Namespace does not exist: INVALID_NAMESPACE"); } } @@ -618,20 +625,24 @@ public void testGetApplicablePoliciesOnNonExistingNamespace() { public void testGetApplicablePoliciesOnNonExistingTable() { restCatalog.createNamespace(NS1); policyApi.createPolicy( - currentCatalogName, - NS1_P1, - PredefinedPolicyTypes.DATA_COMPACTION, - EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT, - "test policy"); + currentCatalogName, + NS1_P1, + PredefinedPolicyTypes.DATA_COMPACTION, + EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT, + "test policy"); Map queryParams = new HashMap<>(); queryParams.put("namespace", RESTUtil.encodeNamespace(NS1)); queryParams.put("target-name", "INVALID_TABLE"); try (Response res = - policyApi.request("polaris/v1/{cat}/applicable-policies", Map.of("cat", currentCatalogName), queryParams) - .get()) { + policyApi + .request( + "polaris/v1/{cat}/applicable-policies", + Map.of("cat", currentCatalogName), + queryParams) + .get()) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); Assertions.assertThat(res.readEntity(String.class)) - .contains("Table does not exist: NS1.INVALID_TABLE"); + .contains("Table does not exist: NS1.INVALID_TABLE"); } policyApi.dropPolicy(currentCatalogName, NS1_P1); } @@ -640,13 +651,15 @@ public void testGetApplicablePoliciesOnNonExistingTable() { public void testLoadNonExistingPolicy() { restCatalog.createNamespace(NS1); try (Response res = - policyApi.request( - "polaris/v1/{cat}/namespaces/{ns}/policies/{policy}", - Map.of("cat", currentCatalogName, "ns", NS2_T1.name(), "policy", "INVALID_POLICY")) - .get()) { + policyApi + .request( + "polaris/v1/{cat}/namespaces/{ns}/policies/{policy}", + Map.of("cat", currentCatalogName, "ns", NS2_T1.name(), "policy", "INVALID_POLICY")) + .get()) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); Assertions.assertThat(res.readEntity(String.class)) - .contains("Policy does not exist: class PolicyIdentifier {\\n namespace: T1\\n name: INVALID_POLICY\\n}"); + .contains( + "Policy does not exist: class PolicyIdentifier {\\n namespace: T1\\n name: INVALID_POLICY\\n}"); } } diff --git a/polaris-core/src/test/java/org/apache/polaris/core/policy/PolicyEntityTest.java b/polaris-core/src/test/java/org/apache/polaris/core/policy/PolicyEntityTest.java index 439d91c639..68be34bb69 100644 --- a/polaris-core/src/test/java/org/apache/polaris/core/policy/PolicyEntityTest.java +++ b/polaris-core/src/test/java/org/apache/polaris/core/policy/PolicyEntityTest.java @@ -52,7 +52,7 @@ public void testPolicyEntity(PolicyType policyType) { } @Test - public void testBuildPolicyEntityWithoutPolicyType() { + public void testBuildPolicyEntityWithoutPolicyTye() { Assertions.assertThatThrownBy( () -> new PolicyEntity.Builder(Namespace.of("NS1"), "testPolicy", null) diff --git a/polaris-core/src/test/java/org/apache/polaris/core/policy/PolicyValidatorsTest.java b/polaris-core/src/test/java/org/apache/polaris/core/policy/PolicyValidatorsTest.java index 9c53372139..04435ba734 100644 --- a/polaris-core/src/test/java/org/apache/polaris/core/policy/PolicyValidatorsTest.java +++ b/polaris-core/src/test/java/org/apache/polaris/core/policy/PolicyValidatorsTest.java @@ -100,7 +100,7 @@ public void testCanAttachReturnsTrueForCatalogType() { public void testCanAttachReturnsTrueForNamespaceType() { var targetEntity = new NamespaceEntity.Builder(ns).build(); var result = PolicyValidators.canAttach(policyEntity, targetEntity); - assertThat(result).isTrue().as("Expected canAttach() to return true for NAMESPACE type"); + assertThat(result).isTrue().as("Expected canAttach() to return true for CATALOG type"); } @Test diff --git a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java index b1c8d1eb3c..6e5cebb0dd 100644 --- a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java +++ b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java @@ -49,8 +49,6 @@ import org.apache.iceberg.catalog.Namespace; import org.apache.iceberg.catalog.TableIdentifier; import org.apache.iceberg.exceptions.AlreadyExistsException; -import org.apache.iceberg.exceptions.NoSuchNamespaceException; -import org.apache.iceberg.exceptions.NoSuchTableException; import org.apache.iceberg.types.Types; import org.apache.polaris.core.PolarisCallContext; import org.apache.polaris.core.PolarisDiagnostics; @@ -385,18 +383,6 @@ public void testCreatePolicyAlreadyExists() { .isInstanceOf(AlreadyExistsException.class); } - @Test - public void testCreatePolicyUnderNonExistentNamespace() { - assertThatThrownBy( - () -> - policyCatalog.createPolicy( - POLICY1, - PredefinedPolicyTypes.DATA_COMPACTION.getName(), - "test", - "{\"enable\": false}")) - .isInstanceOf(IllegalStateException.class); - } - @Test public void testListPolicies() { icebergCatalog.createNamespace(NS); @@ -574,33 +560,6 @@ public void testAttachPolicy() { assertThat(policyCatalog.getApplicablePolicies(null, null, null).size()).isEqualTo(1); } - @Test - public void testAttachPolicyToNonExistingNamespace() { - icebergCatalog.createNamespace(NS); - Namespace invalidNamespace = Namespace.of("INVALID_NAMESPACE"); - policyCatalog.createPolicy(POLICY1, DATA_COMPACTION.getName(), "test", "{\"enable\": false}"); - - var invalidTarget = - new PolicyAttachmentTarget( - PolicyAttachmentTarget.TypeEnum.NAMESPACE, List.of(invalidNamespace.levels())); - assertThatThrownBy(() -> policyCatalog.attachPolicy(POLICY1, invalidTarget, null)) - .isInstanceOf(NoSuchNamespaceException.class) - .hasMessage("Namespace does not exist: INVALID_NAMESPACE"); - } - - @Test - public void testAttachPolicyToNonExistingTable() { - icebergCatalog.createNamespace(NS); - policyCatalog.createPolicy(POLICY1, DATA_COMPACTION.getName(), "test", "{\"enable\": false}"); - - var invalidTarget = - new PolicyAttachmentTarget( - PolicyAttachmentTarget.TypeEnum.TABLE_LIKE, List.of(NS.levels())); - assertThatThrownBy(() -> policyCatalog.attachPolicy(POLICY1, invalidTarget, null)) - .isInstanceOf(NoSuchTableException.class) - .hasMessage("Iceberg Table does not exist: ns1"); - } - @Test public void testAttachPolicyConflict() { icebergCatalog.createNamespace(NS); @@ -629,38 +588,6 @@ public void testDetachPolicy() { assertThat(policyCatalog.getApplicablePolicies(NS, null, null).size()).isEqualTo(0); } - @Test - public void testDetachPolicyFromNonExistingNamespace() { - icebergCatalog.createNamespace(NS); - policyCatalog.createPolicy(POLICY1, DATA_COMPACTION.getName(), "test", "{\"enable\": false}"); - - Namespace invalidNamespace = Namespace.of("INVALID_NAMESPACE"); - - PolicyAttachmentTarget invalidTarget = - new PolicyAttachmentTarget( - PolicyAttachmentTarget.TypeEnum.NAMESPACE, List.of(invalidNamespace.levels())); - - assertThatThrownBy(() -> policyCatalog.detachPolicy(POLICY1, invalidTarget)) - .isInstanceOf(NoSuchNamespaceException.class) - .hasMessage("Namespace does not exist: INVALID_NAMESPACE"); - } - - @Test - public void testDetachPolicyFromNonExistingTable() { - icebergCatalog.createNamespace(NS); - policyCatalog.createPolicy(POLICY1, DATA_COMPACTION.getName(), "test", "{\"enable\": false}"); - - TableIdentifier invalidTable = TableIdentifier.of(NS, "INVALID_TABLE"); - PolicyAttachmentTarget invalidTarget = - new PolicyAttachmentTarget( - PolicyAttachmentTarget.TypeEnum.TABLE_LIKE, - List.of(invalidTable.toString().split("\\."))); - - assertThatThrownBy(() -> policyCatalog.detachPolicy(POLICY1, invalidTarget)) - .isInstanceOf(NoSuchTableException.class) - .hasMessage("Iceberg Table does not exist: ns1.INVALID_TABLE"); - } - @Test public void testPolicyOverwrite() { icebergCatalog.createNamespace(NS); @@ -742,25 +669,6 @@ public void testGetApplicablePoliciesFilterOnType() { assertThat(applicablePolicies.contains(policyToApplicablePolicy(p2, false, NS))).isTrue(); } - @Test - public void testGetApplicablePoliciesOnNonExistingNamespace() { - assertThatThrownBy(() -> policyCatalog.getApplicablePolicies(NS, null, DATA_COMPACTION)) - .isInstanceOf(NoSuchNamespaceException.class) - .hasMessage("Namespace does not exist: ns1"); - } - - @Test - public void testGetApplicablePoliciesOnNonExistingTable() { - icebergCatalog.createNamespace(NS); - policyCatalog.createPolicy(POLICY1, DATA_COMPACTION.getName(), "test", "{\"enable\": false}"); - TableIdentifier invalidTable = TableIdentifier.of(NS, "INVALID_TABLE"); - - assertThatThrownBy( - () -> policyCatalog.getApplicablePolicies(NS, "INVALID_TABLE", DATA_COMPACTION)) - .isInstanceOf(NoSuchTableException.class) - .hasMessage("Iceberg Table does not exist: ns1.INVALID_TABLE"); - } - private static ApplicablePolicy policyToApplicablePolicy( Policy policy, boolean inherited, Namespace parent) { return new ApplicablePolicy( From bbbdaef96294c24b944637ed1dba9cc8f9fd7e1f Mon Sep 17 00:00:00 2001 From: William Hyun Date: Fri, 23 May 2025 12:47:01 -0700 Subject: [PATCH 16/23] Style Check --- .../service/it/test/PolarisPolicyServiceIntegrationTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java index d6eb0ef668..2666c0e7e8 100644 --- a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java +++ b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java @@ -616,8 +616,7 @@ public void testGetApplicablePoliciesOnNonExistingNamespace() { .get()) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); Assertions.assertThat(res.readEntity(String.class)) - .contains( - "Namespace does not exist: INVALID_NAMESPACE"); + .contains("Namespace does not exist: INVALID_NAMESPACE"); } } From ad3205bda9bd81990d7129e199d6a73e02c0f40c Mon Sep 17 00:00:00 2001 From: William Hyun Date: Mon, 26 May 2025 18:35:00 -0700 Subject: [PATCH 17/23] Applied Feedback --- .../PolarisPolicyServiceIntegrationTest.java | 69 ++++++++++--------- 1 file changed, 37 insertions(+), 32 deletions(-) diff --git a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java index 2666c0e7e8..7c91c64b0e 100644 --- a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java +++ b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java @@ -30,7 +30,11 @@ import java.lang.reflect.Method; import java.net.URI; import java.nio.file.Path; -import java.util.*; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; import java.util.stream.Stream; import org.apache.iceberg.Schema; import org.apache.iceberg.catalog.Namespace; @@ -92,6 +96,11 @@ public class PolarisPolicyServiceIntegrationTest { private static final String CATALOG_ROLE_1 = "catalogrole1"; private static final String CATALOG_ROLE_2 = "catalogrole2"; private static final String EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT = "{\"enable\":true}"; + private static final String INVALID_NAMESPACE = "INVALID_NAMESPACE"; + private static final String INVALID_TABLE = "INVALID_TABLE"; + private static final String INVALID_POLICY = "INVALID_POLICY"; + private static final String INVALID_NAMESPACE_MSG = + String.format("Namespace does not exist: %s", INVALID_NAMESPACE); private static final Namespace NS1 = Namespace.of("NS1"); private static final Namespace NS2 = Namespace.of("NS2"); private static final PolicyIdentifier NS1_P1 = new PolicyIdentifier(NS1, "P1"); @@ -338,11 +347,10 @@ public void testCreatePolicyWithNonExistingNamespace() { policyApi .request( "polaris/v1/{cat}/namespaces/{ns}/policies", - Map.of("cat", currentCatalogName, "ns", "INVALID_NAMESPACE")) + Map.of("cat", currentCatalogName, "ns", INVALID_NAMESPACE)) .post(Entity.json(request))) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); - Assertions.assertThat(res.readEntity(String.class)) - .contains("Namespace does not exist: INVALID_NAMESPACE"); + Assertions.assertThat(res.readEntity(String.class)).contains(INVALID_NAMESPACE_MSG); } } @@ -357,7 +365,7 @@ public void testAttachPolicyToNonExistingNamespace() { EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT, "test policy"); - Namespace invalidNamespace = Namespace.of("INVALID_NAMESPACE"); + Namespace invalidNamespace = Namespace.of(INVALID_NAMESPACE); var invalidTarget = new PolicyAttachmentTarget( PolicyAttachmentTarget.TypeEnum.NAMESPACE, List.of(invalidNamespace.levels())); @@ -371,8 +379,7 @@ public void testAttachPolicyToNonExistingNamespace() { Map.of("cat", currentCatalogName, "ns", ns, "policy-name", NS1_P1.getName())) .put(Entity.json(request))) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); - Assertions.assertThat(res.readEntity(String.class)) - .contains("Namespace does not exist: INVALID_NAMESPACE"); + Assertions.assertThat(res.readEntity(String.class)).contains(INVALID_NAMESPACE_MSG); } policyApi.dropPolicy(currentCatalogName, NS1_P1); } @@ -388,7 +395,7 @@ public void testAttachPolicyToNonExistingTable() { PredefinedPolicyTypes.DATA_COMPACTION, EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT, "test policy"); - TableIdentifier invalidTable = TableIdentifier.of(NS1, "INVALID_TABLE"); + TableIdentifier invalidTable = TableIdentifier.of(NS1, INVALID_TABLE); var invalidTarget = new PolicyAttachmentTarget( PolicyAttachmentTarget.TypeEnum.TABLE_LIKE, @@ -404,7 +411,7 @@ public void testAttachPolicyToNonExistingTable() { .put(Entity.json(request))) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); Assertions.assertThat(res.readEntity(String.class)) - .contains("Table or view does not exist: NS1.INVALID_TABLE"); + .contains(String.format("Table or view does not exist: %s.%s", ns, INVALID_TABLE)); } policyApi.dropPolicy(currentCatalogName, NS1_P1); } @@ -419,7 +426,7 @@ public void testDetachPolicyFromNonExistingNamespace() { PredefinedPolicyTypes.DATA_COMPACTION, EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT, "test policy"); - Namespace invalidNamespace = Namespace.of("INVALID_NAMESPACE"); + Namespace invalidNamespace = Namespace.of(INVALID_NAMESPACE); var invalidTarget = new PolicyAttachmentTarget( PolicyAttachmentTarget.TypeEnum.NAMESPACE, List.of(invalidNamespace.levels())); @@ -432,8 +439,7 @@ public void testDetachPolicyFromNonExistingNamespace() { Map.of("cat", currentCatalogName, "ns", ns, "policy-name", NS1_P1.getName())) .post(Entity.json(request))) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); - Assertions.assertThat(res.readEntity(String.class)) - .contains("Namespace does not exist: INVALID_NAMESPACE"); + Assertions.assertThat(res.readEntity(String.class)).contains(INVALID_NAMESPACE_MSG); } policyApi.dropPolicy(currentCatalogName, NS1_P1); } @@ -448,7 +454,7 @@ public void testDetachPolicyFromNonExistingTable() { PredefinedPolicyTypes.DATA_COMPACTION, EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT, "test policy"); - TableIdentifier invalidTable = TableIdentifier.of(NS1, "INVALID_TABLE"); + TableIdentifier invalidTable = TableIdentifier.of(NS1, INVALID_TABLE); var invalidTarget = new PolicyAttachmentTarget( PolicyAttachmentTarget.TypeEnum.TABLE_LIKE, @@ -463,7 +469,7 @@ public void testDetachPolicyFromNonExistingTable() { .post(Entity.json(request))) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); Assertions.assertThat(res.readEntity(String.class)) - .contains("Table or view does not exist: NS1"); + .contains(String.format("Table or view does not exist: %s.%s", ns, INVALID_TABLE)); } policyApi.dropPolicy(currentCatalogName, NS1_P1); } @@ -501,12 +507,14 @@ public void testDropNonExistingPolicy() { policyApi .request( "polaris/v1/{cat}/namespaces/{ns}/policies/{policy}", - Map.of("cat", currentCatalogName, "ns", "NS1", "policy", "INVALID_POLICY")) + Map.of("cat", currentCatalogName, "ns", "NS1", "policy", INVALID_POLICY)) .delete()) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); Assertions.assertThat(res.readEntity(String.class)) .contains( - "Policy does not exist: class PolicyIdentifier {\\n namespace: NS1\\n name: INVALID_POLICY\\n}"); + "Policy does not exist: class PolicyIdentifier", + "namespace: NS1", + String.format("name: %s", INVALID_POLICY)); } } @@ -550,12 +558,14 @@ public void testUpdateNonExistingPolicy() { policyApi .request( "polaris/v1/{cat}/namespaces/{ns}/policies/{policy}", - Map.of("cat", currentCatalogName, "ns", "NS1", "policy", "INVALID_POLICY")) + Map.of("cat", currentCatalogName, "ns", "NS1", "policy", INVALID_POLICY)) .put(Entity.json(request))) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); Assertions.assertThat(res.readEntity(String.class)) .contains( - "Policy does not exist: class PolicyIdentifier {\\n namespace: NS1\\n name: INVALID_POLICY\\n}"); + "Policy does not exist: class PolicyIdentifier", + "namespace: NS1", + String.format("name: %s", INVALID_POLICY)); } } @@ -595,28 +605,24 @@ public void testListPoliciesOnNonExistingNamespace() { policyApi .request( "polaris/v1/{cat}/namespaces/{ns}/policies", - Map.of("cat", currentCatalogName, "ns", "INVALID_NAMESPACE")) + Map.of("cat", currentCatalogName, "ns", INVALID_NAMESPACE)) .get()) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); - Assertions.assertThat(res.readEntity(String.class)) - .contains("Namespace does not exist: INVALID_NAMESPACE"); + Assertions.assertThat(res.readEntity(String.class)).contains(INVALID_NAMESPACE_MSG); } } @Test public void testGetApplicablePoliciesOnNonExistingNamespace() { - Map queryParams = new HashMap<>(); - queryParams.put("namespace", "INVALID_NAMESPACE"); try (Response res = policyApi .request( "polaris/v1/{cat}/applicable-policies", Map.of("cat", currentCatalogName), - queryParams) + Map.of("namespace", INVALID_NAMESPACE)) .get()) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); - Assertions.assertThat(res.readEntity(String.class)) - .contains("Namespace does not exist: INVALID_NAMESPACE"); + Assertions.assertThat(res.readEntity(String.class)).contains(INVALID_NAMESPACE_MSG); } } @@ -629,15 +635,12 @@ public void testGetApplicablePoliciesOnNonExistingTable() { PredefinedPolicyTypes.DATA_COMPACTION, EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT, "test policy"); - Map queryParams = new HashMap<>(); - queryParams.put("namespace", RESTUtil.encodeNamespace(NS1)); - queryParams.put("target-name", "INVALID_TABLE"); try (Response res = policyApi .request( "polaris/v1/{cat}/applicable-policies", Map.of("cat", currentCatalogName), - queryParams) + Map.of("namespace", RESTUtil.encodeNamespace(NS1), "target-name", "INVALID_TABLE")) .get()) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); Assertions.assertThat(res.readEntity(String.class)) @@ -653,12 +656,14 @@ public void testLoadNonExistingPolicy() { policyApi .request( "polaris/v1/{cat}/namespaces/{ns}/policies/{policy}", - Map.of("cat", currentCatalogName, "ns", NS2_T1.name(), "policy", "INVALID_POLICY")) + Map.of("cat", currentCatalogName, "ns", "NS1", "policy", INVALID_POLICY)) .get()) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); Assertions.assertThat(res.readEntity(String.class)) .contains( - "Policy does not exist: class PolicyIdentifier {\\n namespace: T1\\n name: INVALID_POLICY\\n}"); + "Policy does not exist: class PolicyIdentifier", + "namespace: NS1", + "name: INVALID_POLICY"); } } From 18ee295ca5672832fdb1c8547a80cf4a504f2a6d Mon Sep 17 00:00:00 2001 From: William Hyun Date: Tue, 27 May 2025 11:11:12 -0700 Subject: [PATCH 18/23] Move Testing Message Constants --- .../it/test/PolarisPolicyServiceIntegrationTest.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java index 7c91c64b0e..39e25943eb 100644 --- a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java +++ b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java @@ -96,11 +96,6 @@ public class PolarisPolicyServiceIntegrationTest { private static final String CATALOG_ROLE_1 = "catalogrole1"; private static final String CATALOG_ROLE_2 = "catalogrole2"; private static final String EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT = "{\"enable\":true}"; - private static final String INVALID_NAMESPACE = "INVALID_NAMESPACE"; - private static final String INVALID_TABLE = "INVALID_TABLE"; - private static final String INVALID_POLICY = "INVALID_POLICY"; - private static final String INVALID_NAMESPACE_MSG = - String.format("Namespace does not exist: %s", INVALID_NAMESPACE); private static final Namespace NS1 = Namespace.of("NS1"); private static final Namespace NS2 = Namespace.of("NS2"); private static final PolicyIdentifier NS1_P1 = new PolicyIdentifier(NS1, "P1"); @@ -108,6 +103,12 @@ public class PolarisPolicyServiceIntegrationTest { private static final PolicyIdentifier NS1_P3 = new PolicyIdentifier(NS1, "P3"); private static final TableIdentifier NS2_T1 = TableIdentifier.of(NS2, "T1"); + private static final String INVALID_NAMESPACE = "INVALID_NAMESPACE"; + private static final String INVALID_TABLE = "INVALID_TABLE"; + private static final String INVALID_POLICY = "INVALID_POLICY"; + private static final String INVALID_NAMESPACE_MSG = + String.format("Namespace does not exist: %s", INVALID_NAMESPACE); + private static URI s3BucketBase; private static String principalRoleName; private static ClientCredentials adminCredentials; From 4a4804bf959f54442edd1f6c7b803782818eb626 Mon Sep 17 00:00:00 2001 From: William Hyun Date: Tue, 27 May 2025 11:19:25 -0700 Subject: [PATCH 19/23] Revert Wildcard Import --- .../it/test/PolarisPolicyServiceIntegrationTest.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java index 39e25943eb..081cae7893 100644 --- a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java +++ b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java @@ -72,7 +72,14 @@ import org.apache.polaris.service.it.env.PolarisClient; import org.apache.polaris.service.it.env.PolicyApi; import org.apache.polaris.service.it.ext.PolarisIntegrationTestExtension; -import org.apache.polaris.service.types.*; +import org.apache.polaris.service.types.ApplicablePolicy; +import org.apache.polaris.service.types.AttachPolicyRequest; +import org.apache.polaris.service.types.CreatePolicyRequest; +import org.apache.polaris.service.types.DetachPolicyRequest; +import org.apache.polaris.service.types.Policy; +import org.apache.polaris.service.types.PolicyAttachmentTarget; +import org.apache.polaris.service.types.PolicyIdentifier; +import org.apache.polaris.service.types.UpdatePolicyRequest; import org.assertj.core.api.Assertions; import org.assertj.core.api.InstanceOfAssertFactories; import org.junit.jupiter.api.AfterAll; @@ -107,7 +114,7 @@ public class PolarisPolicyServiceIntegrationTest { private static final String INVALID_TABLE = "INVALID_TABLE"; private static final String INVALID_POLICY = "INVALID_POLICY"; private static final String INVALID_NAMESPACE_MSG = - String.format("Namespace does not exist: %s", INVALID_NAMESPACE); + String.format("Namespace does not exist: %s", INVALID_NAMESPACE); private static URI s3BucketBase; private static String principalRoleName; From 94dfb79b35bcdc1eaba67cfcabf07ab5fd5f66ac Mon Sep 17 00:00:00 2001 From: Adnan Hemani Date: Tue, 27 May 2025 11:58:51 -0700 Subject: [PATCH 20/23] fix(quickstart): Correct Quickstart Instructions (#1673) --- .../assets/cloud_providers/deploy-aws.sh | 4 ++-- .../assets/cloud_providers/deploy-azure.sh | 4 ++-- .../assets/cloud_providers/deploy-gcp.sh | 4 ++-- .../deploying-polaris/quickstart-deploy-aws.md | 13 ++++++------- .../deploying-polaris/quickstart-deploy-azure.md | 13 ++++++------- .../deploying-polaris/quickstart-deploy-gcp.md | 13 ++++++------- .../in-dev/unreleased/getting-started/quickstart.md | 7 +++++-- .../unreleased/getting-started/using-polaris.md | 4 ++-- 8 files changed, 31 insertions(+), 31 deletions(-) diff --git a/getting-started/assets/cloud_providers/deploy-aws.sh b/getting-started/assets/cloud_providers/deploy-aws.sh index 82e811fb37..aceefb51c7 100644 --- a/getting-started/assets/cloud_providers/deploy-aws.sh +++ b/getting-started/assets/cloud_providers/deploy-aws.sh @@ -70,7 +70,7 @@ POSTGRES_ADDR=$(echo $DESCRIBE_DB | jq -r '.["DBInstances"][0]["Endpoint"]' | jq export QUARKUS_DATASOURCE_JDBC_URL=$(printf '%s' "jdbc:postgresql://$POSTGRES_ADDR/POLARIS") export QUARKUS_DATASOURCE_USERNAME=postgres export QUARKUS_DATASOURCE_PASSWORD=postgres -echo ($QUARKUS_DATASOURCE_JDBC_URL) +echo $QUARKUS_DATASOURCE_JDBC_URL S3_BUCKET_NAME="polaris-quickstart-s3-$RANDOM_SUFFIX" echo "S3 Bucket Name: $S3_BUCKET_NAME" @@ -84,4 +84,4 @@ export STORAGE_LOCATION="s3://$S3_BUCKET_NAME/quickstart_catalog/" -Dquarkus.container-image.build=true \ --no-build-cache -docker compose -f getting-started/jdbc/docker-compose-bootstrap-db.yml -f getting-started/jdbc/docker-compose.yml up -d +docker compose -p polaris -f getting-started/jdbc/docker-compose-bootstrap-db.yml -f getting-started/jdbc/docker-compose.yml up -d diff --git a/getting-started/assets/cloud_providers/deploy-azure.sh b/getting-started/assets/cloud_providers/deploy-azure.sh index 764c18dc53..c6a76e4f19 100644 --- a/getting-started/assets/cloud_providers/deploy-azure.sh +++ b/getting-started/assets/cloud_providers/deploy-azure.sh @@ -32,7 +32,7 @@ POSTGRES_ADDR=$(echo $CREATE_DB_RESPONSE | jq -r '.host') export QUARKUS_DATASOURCE_JDBC_URL=$(printf '%s' "jdbc:postgresql://$POSTGRES_ADDR/POLARIS") export QUARKUS_DATASOURCE_USERNAME=postgres export QUARKUS_DATASOURCE_PASSWORD=postgres -echo ($QUARKUS_DATASOURCE_JDBC_URL) +echo $QUARKUS_DATASOURCE_JDBC_URL STORAGE_ACCOUNT_NAME="polaristest$RANDOM_SUFFIX" STORAGE_CONTAINER_NAME="polaris-test-container-$RANDOM_SUFFIX" @@ -71,4 +71,4 @@ EOF -Dquarkus.container-image.build=true \ --no-build-cache -docker compose -f getting-started/jdbc/docker-compose-bootstrap-db.yml -f getting-started/jdbc/docker-compose.yml up -d +docker compose -p polaris -f getting-started/jdbc/docker-compose-bootstrap-db.yml -f getting-started/jdbc/docker-compose.yml up -d diff --git a/getting-started/assets/cloud_providers/deploy-gcp.sh b/getting-started/assets/cloud_providers/deploy-gcp.sh index e6ed2cfb45..fd57d9d799 100644 --- a/getting-started/assets/cloud_providers/deploy-gcp.sh +++ b/getting-started/assets/cloud_providers/deploy-gcp.sh @@ -39,7 +39,7 @@ gcloud sql databases create POLARIS --instance=$DB_INSTANCE_NAME export QUARKUS_DATASOURCE_JDBC_URL=$(printf '%s' "jdbc:postgresql://$POSTGRES_ADDR/POLARIS") export QUARKUS_DATASOURCE_USERNAME=postgres export QUARKUS_DATASOURCE_PASSWORD=postgres -echo ($QUARKUS_DATASOURCE_JDBC_URL) +echo $QUARKUS_DATASOURCE_JDBC_URL GCS_BUCKET_NAME="polaris-test-gcs-$RANDOM_SUFFIX" echo "GCS Bucket Name: $GCS_BUCKET_NAME" @@ -52,4 +52,4 @@ export STORAGE_LOCATION="gs://$GCS_BUCKET_NAME/quickstart_catalog/" -Dquarkus.container-image.build=true \ --no-build-cache -docker compose -f getting-started/jdbc/docker-compose-bootstrap-db.yml -f getting-started/jdbc/docker-compose.yml up -d +docker compose -p polaris -f getting-started/jdbc/docker-compose-bootstrap-db.yml -f getting-started/jdbc/docker-compose.yml up -d diff --git a/site/content/in-dev/unreleased/getting-started/deploying-polaris/quickstart-deploy-aws.md b/site/content/in-dev/unreleased/getting-started/deploying-polaris/quickstart-deploy-aws.md index 8754408c87..8aa3b34a78 100644 --- a/site/content/in-dev/unreleased/getting-started/deploying-polaris/quickstart-deploy-aws.md +++ b/site/content/in-dev/unreleased/getting-started/deploying-polaris/quickstart-deploy-aws.md @@ -38,21 +38,20 @@ The requirements to run the script below are: ```shell chmod +x getting-started/assets/cloud_providers/deploy-aws.sh export ASSETS_PATH=$(pwd)/getting-started/assets/ -./getting-started/assets/cloud_providers/deploy-aws.sh -``` - -Also, set the following static credentials for interacting with the Polaris server in the following exercises: - -```shell export CLIENT_ID=root export CLIENT_SECRET=s3cr3t +./getting-started/assets/cloud_providers/deploy-aws.sh ``` +## Next Steps +Congrats, you now have a running instance of1 Polaris! For details on how to use Polaris, check out the [Using Polaris]({{% ref "using-polaris" %}}) page. + +## Cleanup Instructions To shut down the Polaris server, run the following commands: ```shell export ASSETS_PATH=$(pwd)/getting-started/assets/ -docker compose -f getting-started/eclipselink/docker-compose.yml down +docker compose -p polaris -f getting-started/eclipselink/docker-compose.yml down ``` To deploy Polaris in a production setting, please review further recommendations at the [Configuring Polaris for Production]({{% relref "../../configuring-polaris-for-production" %}}) page. \ No newline at end of file diff --git a/site/content/in-dev/unreleased/getting-started/deploying-polaris/quickstart-deploy-azure.md b/site/content/in-dev/unreleased/getting-started/deploying-polaris/quickstart-deploy-azure.md index 53ab57a9a3..ff1f2c6472 100644 --- a/site/content/in-dev/unreleased/getting-started/deploying-polaris/quickstart-deploy-azure.md +++ b/site/content/in-dev/unreleased/getting-started/deploying-polaris/quickstart-deploy-azure.md @@ -33,21 +33,20 @@ The requirements to run the script below are: ```shell chmod +x getting-started/assets/cloud_providers/deploy-azure.sh export ASSETS_PATH=$(pwd)/getting-started/assets/ -./getting-started/assets/cloud_providers/deploy-azure.sh -``` - -Also, set the following static credentials for interacting with the Polaris server in the following exercises: - -```shell export CLIENT_ID=root export CLIENT_SECRET=s3cr3t +./getting-started/assets/cloud_providers/deploy-azure.sh ``` +## Next Steps +Congrats, you now have a running instance of Polaris! For further information regarding how to use Polaris, check out the [Using Polaris]({{% ref "using-polaris" %}}) page. + +## Cleanup Instructions To shut down the Polaris server, run the following commands: ```shell export ASSETS_PATH=$(pwd)/getting-started/assets/ -docker compose -f getting-started/eclipselink/docker-compose.yml down +docker compose -p polaris -f getting-started/eclipselink/docker-compose.yml down ``` To deploy Polaris in a production setting, please review further recommendations at the [Configuring Polaris for Production]({{% relref "../../configuring-polaris-for-production" %}}) page. \ No newline at end of file diff --git a/site/content/in-dev/unreleased/getting-started/deploying-polaris/quickstart-deploy-gcp.md b/site/content/in-dev/unreleased/getting-started/deploying-polaris/quickstart-deploy-gcp.md index d76d82b74f..cbf15a8761 100644 --- a/site/content/in-dev/unreleased/getting-started/deploying-polaris/quickstart-deploy-gcp.md +++ b/site/content/in-dev/unreleased/getting-started/deploying-polaris/quickstart-deploy-gcp.md @@ -33,21 +33,20 @@ The requirements to run the script below are: ```shell chmod +x getting-started/assets/cloud_providers/deploy-gcp.sh export ASSETS_PATH=$(pwd)/getting-started/assets/ -./getting-started/assets/cloud_providers/deploy-gcp.sh -``` - -Also, set the following static credentials for interacting with the Polaris server in the following exercises: - -```shell export CLIENT_ID=root export CLIENT_SECRET=s3cr3t +./getting-started/assets/cloud_providers/deploy-gcp.sh ``` +## Next Steps +Congrats, you now have a running instance of Polaris! For further information regarding how to use Polaris, check out the [Using Polaris]({{% ref "using-polaris" %}}) page. + +## Cleanup Instructions To shut down the Polaris server, run the following commands: ```shell export ASSETS_PATH=$(pwd)/getting-started/assets/ -docker compose -f getting-started/eclipselink/docker-compose.yml down +docker compose -p polaris -f getting-started/eclipselink/docker-compose.yml down ``` To deploy Polaris in a production setting, please review further recommendations at the [Configuring Polaris for Production]({{% relref "../../configuring-polaris-for-production" %}}) page. \ No newline at end of file diff --git a/site/content/in-dev/unreleased/getting-started/quickstart.md b/site/content/in-dev/unreleased/getting-started/quickstart.md index d59d76ac73..6fac350e89 100644 --- a/site/content/in-dev/unreleased/getting-started/quickstart.md +++ b/site/content/in-dev/unreleased/getting-started/quickstart.md @@ -45,11 +45,14 @@ To start using Polaris in Docker and launch Polaris, which is packaged with a Po ```shell export ASSETS_PATH=$(pwd)/getting-started/assets/ +export QUARKUS_DATASOURCE_JDBC_URL=jdbc:postgresql://postgres:5432/POLARIS +export QUARKUS_DATASOURCE_USERNAME=postgres +export QUARKUS_DATASOURCE_PASSWORD=postgres export CLIENT_ID=root export CLIENT_SECRET=s3cr3t docker compose -p polaris -f getting-started/assets/postgres/docker-compose-postgres.yml \ - -f getting-started/eclipselink/docker-compose-bootstrap-db.yml \ - -f getting-started/eclipselink/docker-compose.yml up + -f getting-started/jdbc/docker-compose-bootstrap-db.yml \ + -f getting-started/jdbc/docker-compose.yml up -d ``` You should see output for some time as Polaris, Spark, and Trino build and start up. Eventually, you won’t see any more logs and see some logs relating to Spark, resembling the following: diff --git a/site/content/in-dev/unreleased/getting-started/using-polaris.md b/site/content/in-dev/unreleased/getting-started/using-polaris.md index 9c01d1c164..35f0bae336 100644 --- a/site/content/in-dev/unreleased/getting-started/using-polaris.md +++ b/site/content/in-dev/unreleased/getting-started/using-polaris.md @@ -24,7 +24,7 @@ weight: 400 ## Setup -Define your `CLIENT_ID` & `CLIENT_SECRET` and export them for future use. +Ensure your `CLIENT_ID` & `CLIENT_SECRET` variables are already defined, as they were required for starting the Polaris server earlier. ```shell export CLIENT_ID=YOUR_CLIENT_ID @@ -309,7 +309,7 @@ curl -v http://127.0.0.1:8181/api/management/v1/catalogs/quickstart_catalog -H " * A Getting Started experience for using Spark with Jupyter Notebooks is documented [here](https://github.com/apache/polaris/blob/main/getting-started/spark/README.md). * To shut down a locally-deployed Polaris server and clean up all related Docker containers, run the command listed below. Cloud Deployments have their respective termination commands on their Deployment page, while Polaris running on Gradle will terminate when the Gradle process terminates. ```shell -docker compose -f getting-started/eclipselink/docker-compose-postgres.yml -f getting-started/eclipselink/docker-compose-bootstrap-db.yml -f getting-started/eclipselink/docker-compose.yml down +docker compose -p polaris -f getting-started/assets/postgres/docker-compose-postgres.yml -f getting-started/jdbc/docker-compose-bootstrap-db.yml -f getting-started/jdbc/docker-compose.yml down ``` From a4cbc7aca0a7901771ba4bdb67aaab5555ac6ed4 Mon Sep 17 00:00:00 2001 From: Adnan Hemani Date: Tue, 27 May 2025 13:54:26 -0700 Subject: [PATCH 21/23] Remove Java URI validations for Blob Storage providers (#1604) This is a retry at #1586, which I'll close if this PR is on the right direction instead. Java URI does not actually apply any normalization to URIs if we do not call URI.normalize() (which we currently do not). Additionally, blob storage providers like S3 and GCS can provide ".." and "." as valid fragments in URLs - which Java URI would attempt to normalize incorrectly. As a result, attempting to validate and/or normalize URIs for blob storage providers using the Java URI class is the incorrect behavior. While we may want to add location validation via regex later, removing it first should at least unblock the bug we see in #1545. --- .../polaris/core/storage/StorageLocation.java | 4 +- .../service/storage/StorageLocationTest.java | 51 +++++++++++++++++-- 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/polaris-core/src/main/java/org/apache/polaris/core/storage/StorageLocation.java b/polaris-core/src/main/java/org/apache/polaris/core/storage/StorageLocation.java index 5c27a7d375..c9f731a8cd 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/storage/StorageLocation.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/storage/StorageLocation.java @@ -40,12 +40,12 @@ public static StorageLocation of(String location) { protected StorageLocation(@Nonnull String location) { if (location == null) { this.location = null; - } else if (location.startsWith("file:/") && !location.startsWith(LOCAL_PATH_PREFIX)) { + } else if (location.startsWith("file:/")) { this.location = URI.create(location.replaceFirst("file:/+", LOCAL_PATH_PREFIX)).toString(); } else if (location.startsWith("/")) { this.location = URI.create(location.replaceFirst("/+", LOCAL_PATH_PREFIX)).toString(); } else { - this.location = URI.create(location).toString(); + this.location = location; } } diff --git a/polaris-core/src/test/java/org/apache/polaris/service/storage/StorageLocationTest.java b/polaris-core/src/test/java/org/apache/polaris/service/storage/StorageLocationTest.java index cb0bb0da01..9675ab075c 100644 --- a/polaris-core/src/test/java/org/apache/polaris/service/storage/StorageLocationTest.java +++ b/polaris-core/src/test/java/org/apache/polaris/service/storage/StorageLocationTest.java @@ -18,7 +18,9 @@ */ package org.apache.polaris.service.storage; +import java.net.URISyntaxException; import org.apache.polaris.core.storage.StorageLocation; +import org.apache.polaris.core.storage.azure.AzureLocation; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; @@ -26,10 +28,53 @@ public class StorageLocationTest { @Test public void testOfDifferentPrefixes() { - StorageLocation StandardLocation = StorageLocation.of("file:///path/to/file"); + StorageLocation standardLocation = StorageLocation.of("file:///path/to/file"); StorageLocation slashLeadingLocation = StorageLocation.of("/path/to/file"); + StorageLocation manySlashLeadingLocation = StorageLocation.of("////////path/to/file"); StorageLocation fileSingleSlashLocation = StorageLocation.of("file:/path/to/file"); - Assertions.assertThat(slashLeadingLocation.equals(StandardLocation)).isTrue(); - Assertions.assertThat(fileSingleSlashLocation.equals(StandardLocation)).isTrue(); + StorageLocation fileTooManySlashesLocation = StorageLocation.of("file://///////path/to/file"); + Assertions.assertThat(slashLeadingLocation.equals(standardLocation)).isTrue(); + Assertions.assertThat(manySlashLeadingLocation.equals(standardLocation)).isTrue(); + Assertions.assertThat(fileSingleSlashLocation.equals(standardLocation)).isTrue(); + Assertions.assertThat(fileTooManySlashesLocation.equals(standardLocation)).isTrue(); + Assertions.assertThat(standardLocation).isExactlyInstanceOf(StorageLocation.class); + Assertions.assertThat(slashLeadingLocation).isExactlyInstanceOf(StorageLocation.class); + Assertions.assertThat(manySlashLeadingLocation).isExactlyInstanceOf(StorageLocation.class); + Assertions.assertThat(fileSingleSlashLocation).isExactlyInstanceOf(StorageLocation.class); + Assertions.assertThat(fileTooManySlashesLocation).isExactlyInstanceOf(StorageLocation.class); + } + + @Test + public void testBlobStorageLocations() { + StorageLocation azureLocation = + StorageLocation.of("wasb://container@storageaccount.blob.core.windows.net/myfile"); + Assertions.assertThat(azureLocation instanceof AzureLocation).isTrue(); + azureLocation = + StorageLocation.of("abfss://container@storageaccount.blob.core.windows.net/myfile"); + Assertions.assertThat(azureLocation instanceof AzureLocation).isTrue(); + + String s3LocationStr = "s3://test-bucket/mydirectory"; + StorageLocation s3Location = StorageLocation.of(s3LocationStr); + Assertions.assertThat(s3Location instanceof AzureLocation).isFalse(); + + Assertions.assertThat(s3Location.toString()).isEqualTo(s3LocationStr); + } + + @Test + public void testSpecialCharacters() { + // Blob Storage does not have validations + String specialCharsBlobStorage = "s3://test-bucket/quote'/equals=/period/../myfile.parquet"; + StorageLocation s3LocationSpecialCharacters = StorageLocation.of(specialCharsBlobStorage); + + Assertions.assertThat(s3LocationSpecialCharacters.toString()) + .isEqualTo(specialCharsBlobStorage); + + // But local filesystems do + String specialCharsLocalStorage = "file:///var/tmp\"/myfile.parquet"; + Assertions.assertThatThrownBy( + () -> { + StorageLocation.of(specialCharsLocalStorage); + }) + .hasCauseInstanceOf(URISyntaxException.class); } } From 1257407cb9d430d07dd28693c39a1f552fce519b Mon Sep 17 00:00:00 2001 From: William Hyun Date: Tue, 27 May 2025 14:06:35 -0700 Subject: [PATCH 22/23] Remove Magic Strings --- .../PolarisPolicyServiceIntegrationTest.java | 46 +++++++++---------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java index 081cae7893..a735d08c8e 100644 --- a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java +++ b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java @@ -110,11 +110,12 @@ public class PolarisPolicyServiceIntegrationTest { private static final PolicyIdentifier NS1_P3 = new PolicyIdentifier(NS1, "P3"); private static final TableIdentifier NS2_T1 = TableIdentifier.of(NS2, "T1"); + private static final String NS1_NAME = RESTUtil.encodeNamespace(NS1); private static final String INVALID_NAMESPACE = "INVALID_NAMESPACE"; - private static final String INVALID_TABLE = "INVALID_TABLE"; private static final String INVALID_POLICY = "INVALID_POLICY"; + private static final String INVALID_TABLE = "INVALID_TABLE"; private static final String INVALID_NAMESPACE_MSG = - String.format("Namespace does not exist: %s", INVALID_NAMESPACE); + "Namespace does not exist: " + INVALID_NAMESPACE; private static URI s3BucketBase; private static String principalRoleName; @@ -365,7 +366,6 @@ public void testCreatePolicyWithNonExistingNamespace() { @Test public void testAttachPolicyToNonExistingNamespace() { restCatalog.createNamespace(NS1); - String ns = RESTUtil.encodeNamespace(NS1); policyApi.createPolicy( currentCatalogName, NS1_P1, @@ -384,7 +384,7 @@ public void testAttachPolicyToNonExistingNamespace() { policyApi .request( "polaris/v1/{cat}/namespaces/{ns}/policies/{policy-name}/mappings", - Map.of("cat", currentCatalogName, "ns", ns, "policy-name", NS1_P1.getName())) + Map.of("cat", currentCatalogName, "ns", NS1_NAME, "policy-name", NS1_P1.getName())) .put(Entity.json(request))) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); Assertions.assertThat(res.readEntity(String.class)).contains(INVALID_NAMESPACE_MSG); @@ -395,8 +395,6 @@ public void testAttachPolicyToNonExistingNamespace() { @Test public void testAttachPolicyToNonExistingTable() { restCatalog.createNamespace(NS1); - String ns = RESTUtil.encodeNamespace(NS1); - policyApi.createPolicy( currentCatalogName, NS1_P1, @@ -415,11 +413,12 @@ public void testAttachPolicyToNonExistingTable() { policyApi .request( "polaris/v1/{cat}/namespaces/{ns}/policies/{policy-name}/mappings", - Map.of("cat", currentCatalogName, "ns", ns, "policy-name", NS1_P1.getName())) + Map.of("cat", currentCatalogName, "ns", NS1_NAME, "policy-name", NS1_P1.getName())) .put(Entity.json(request))) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); Assertions.assertThat(res.readEntity(String.class)) - .contains(String.format("Table or view does not exist: %s.%s", ns, INVALID_TABLE)); + .contains( + String.format("Table or view does not exist: " + NS1_NAME + "." + INVALID_TABLE)); } policyApi.dropPolicy(currentCatalogName, NS1_P1); } @@ -427,7 +426,6 @@ public void testAttachPolicyToNonExistingTable() { @Test public void testDetachPolicyFromNonExistingNamespace() { restCatalog.createNamespace(NS1); - String ns = RESTUtil.encodeNamespace(NS1); policyApi.createPolicy( currentCatalogName, NS1_P1, @@ -444,7 +442,7 @@ public void testDetachPolicyFromNonExistingNamespace() { policyApi .request( "polaris/v1/{cat}/namespaces/{ns}/policies/{policy-name}/mappings", - Map.of("cat", currentCatalogName, "ns", ns, "policy-name", NS1_P1.getName())) + Map.of("cat", currentCatalogName, "ns", NS1_NAME, "policy-name", NS1_P1.getName())) .post(Entity.json(request))) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); Assertions.assertThat(res.readEntity(String.class)).contains(INVALID_NAMESPACE_MSG); @@ -455,7 +453,6 @@ public void testDetachPolicyFromNonExistingNamespace() { @Test public void testDetachPolicyFromNonExistingTable() { restCatalog.createNamespace(NS1); - String ns = RESTUtil.encodeNamespace(NS1); policyApi.createPolicy( currentCatalogName, NS1_P1, @@ -473,11 +470,12 @@ public void testDetachPolicyFromNonExistingTable() { policyApi .request( "polaris/v1/{cat}/namespaces/{ns}/policies/{policy-name}/mappings", - Map.of("cat", currentCatalogName, "ns", ns, "policy-name", NS1_P1.getName())) + Map.of("cat", currentCatalogName, "ns", NS1_NAME, "policy-name", NS1_P1.getName())) .post(Entity.json(request))) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); Assertions.assertThat(res.readEntity(String.class)) - .contains(String.format("Table or view does not exist: %s.%s", ns, INVALID_TABLE)); + .contains( + String.format("Table or view does not exist: " + NS1_NAME + "." + INVALID_TABLE)); } policyApi.dropPolicy(currentCatalogName, NS1_P1); } @@ -515,14 +513,14 @@ public void testDropNonExistingPolicy() { policyApi .request( "polaris/v1/{cat}/namespaces/{ns}/policies/{policy}", - Map.of("cat", currentCatalogName, "ns", "NS1", "policy", INVALID_POLICY)) + Map.of("cat", currentCatalogName, "ns", NS1_NAME, "policy", INVALID_POLICY)) .delete()) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); Assertions.assertThat(res.readEntity(String.class)) .contains( "Policy does not exist: class PolicyIdentifier", - "namespace: NS1", - String.format("name: %s", INVALID_POLICY)); + "namespace: " + NS1_NAME, + "name: " + INVALID_POLICY); } } @@ -566,14 +564,14 @@ public void testUpdateNonExistingPolicy() { policyApi .request( "polaris/v1/{cat}/namespaces/{ns}/policies/{policy}", - Map.of("cat", currentCatalogName, "ns", "NS1", "policy", INVALID_POLICY)) + Map.of("cat", currentCatalogName, "ns", NS1_NAME, "policy", INVALID_POLICY)) .put(Entity.json(request))) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); Assertions.assertThat(res.readEntity(String.class)) .contains( "Policy does not exist: class PolicyIdentifier", - "namespace: NS1", - String.format("name: %s", INVALID_POLICY)); + "namespace: " + NS1_NAME, + "name: " + INVALID_POLICY); } } @@ -648,11 +646,11 @@ public void testGetApplicablePoliciesOnNonExistingTable() { .request( "polaris/v1/{cat}/applicable-policies", Map.of("cat", currentCatalogName), - Map.of("namespace", RESTUtil.encodeNamespace(NS1), "target-name", "INVALID_TABLE")) + Map.of("namespace", NS1_NAME, "target-name", INVALID_TABLE)) .get()) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); Assertions.assertThat(res.readEntity(String.class)) - .contains("Table does not exist: NS1.INVALID_TABLE"); + .contains("Table does not exist: " + NS1_NAME + "." + INVALID_TABLE); } policyApi.dropPolicy(currentCatalogName, NS1_P1); } @@ -664,14 +662,14 @@ public void testLoadNonExistingPolicy() { policyApi .request( "polaris/v1/{cat}/namespaces/{ns}/policies/{policy}", - Map.of("cat", currentCatalogName, "ns", "NS1", "policy", INVALID_POLICY)) + Map.of("cat", currentCatalogName, "ns", NS1_NAME, "policy", INVALID_POLICY)) .get()) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); Assertions.assertThat(res.readEntity(String.class)) .contains( "Policy does not exist: class PolicyIdentifier", - "namespace: NS1", - "name: INVALID_POLICY"); + "namespace: " + NS1_NAME, + "name: " + INVALID_POLICY); } } From 1fcb7fbd159597185432109766099a21cbab9015 Mon Sep 17 00:00:00 2001 From: William Hyun Date: Tue, 27 May 2025 14:13:12 -0700 Subject: [PATCH 23/23] Remove String Format --- .../it/test/PolarisPolicyServiceIntegrationTest.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java index a735d08c8e..c836ffdabc 100644 --- a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java +++ b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java @@ -417,8 +417,7 @@ public void testAttachPolicyToNonExistingTable() { .put(Entity.json(request))) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); Assertions.assertThat(res.readEntity(String.class)) - .contains( - String.format("Table or view does not exist: " + NS1_NAME + "." + INVALID_TABLE)); + .contains("Table or view does not exist: " + NS1_NAME + "." + INVALID_TABLE); } policyApi.dropPolicy(currentCatalogName, NS1_P1); } @@ -474,8 +473,7 @@ public void testDetachPolicyFromNonExistingTable() { .post(Entity.json(request))) { Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode()); Assertions.assertThat(res.readEntity(String.class)) - .contains( - String.format("Table or view does not exist: " + NS1_NAME + "." + INVALID_TABLE)); + .contains("Table or view does not exist: " + NS1_NAME + "." + INVALID_TABLE); } policyApi.dropPolicy(currentCatalogName, NS1_P1); }