This is an automated email from the ASF dual-hosted git repository.
etudenhoefner pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/iceberg.git
The following commit(s) were added to refs/heads/main by this push:
new c0486eef4d Nessie: Gracefully handle empty namespace lookup (#9877)
c0486eef4d is described below
commit c0486eef4d8bce7089f688d95a39ebccd68a7623
Author: Ajantha Bhat <[email protected]>
AuthorDate: Thu Mar 7 14:28:23 2024 +0530
Nessie: Gracefully handle empty namespace lookup (#9877)
---
.../apache/iceberg/nessie/NessieIcebergClient.java | 14 ++++++++--
.../org/apache/iceberg/nessie/TestNamespace.java | 32 ++++++++++++++++++++++
.../iceberg/nessie/TestNessieIcebergClient.java | 6 ++--
3 files changed, 46 insertions(+), 6 deletions(-)
diff --git
a/nessie/src/main/java/org/apache/iceberg/nessie/NessieIcebergClient.java
b/nessie/src/main/java/org/apache/iceberg/nessie/NessieIcebergClient.java
index 0dc9f30497..583e45a263 100644
--- a/nessie/src/main/java/org/apache/iceberg/nessie/NessieIcebergClient.java
+++ b/nessie/src/main/java/org/apache/iceberg/nessie/NessieIcebergClient.java
@@ -216,10 +216,8 @@ public class NessieIcebergClient implements AutoCloseable {
}
public void createNamespace(Namespace namespace, Map<String, String>
metadata) {
+ checkNamespaceIsValid(namespace);
getRef().checkMutable();
- if (namespace.isEmpty()) {
- throw new IllegalArgumentException("Creating empty namespaces is not
supported");
- }
ContentKey key = ContentKey.of(namespace.levels());
org.projectnessie.model.Namespace content =
org.projectnessie.model.Namespace.of(key.getElements(), metadata);
@@ -308,6 +306,7 @@ public class NessieIcebergClient implements AutoCloseable {
}
public boolean dropNamespace(Namespace namespace) throws
NamespaceNotEmptyException {
+ checkNamespaceIsValid(namespace);
getRef().checkMutable();
ContentKey key = ContentKey.of(namespace.levels());
try {
@@ -353,8 +352,16 @@ public class NessieIcebergClient implements AutoCloseable {
return false;
}
+ private static void checkNamespaceIsValid(Namespace namespace) {
+ if (namespace.isEmpty()) {
+ throw new NoSuchNamespaceException("Invalid namespace: %s", namespace);
+ }
+ }
+
public Map<String, String> loadNamespaceMetadata(Namespace namespace)
throws NoSuchNamespaceException {
+ checkNamespaceIsValid(namespace);
+
ContentKey key = ContentKey.of(namespace.levels());
try {
Map<ContentKey, Content> contentMap =
withReference(api.getContent()).key(key).get();
@@ -380,6 +387,7 @@ public class NessieIcebergClient implements AutoCloseable {
}
private boolean updateProperties(Namespace namespace, Consumer<Map<String,
String>> action) {
+ checkNamespaceIsValid(namespace);
getRef().checkMutable();
ContentKey key = ContentKey.of(namespace.levels());
try {
diff --git a/nessie/src/test/java/org/apache/iceberg/nessie/TestNamespace.java
b/nessie/src/test/java/org/apache/iceberg/nessie/TestNamespace.java
index 0b1af9763d..7238df9c12 100644
--- a/nessie/src/test/java/org/apache/iceberg/nessie/TestNamespace.java
+++ b/nessie/src/test/java/org/apache/iceberg/nessie/TestNamespace.java
@@ -21,6 +21,7 @@ package org.apache.iceberg.nessie;
import static org.apache.iceberg.types.Types.NestedField.required;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -30,6 +31,7 @@ import org.apache.iceberg.catalog.TableIdentifier;
import org.apache.iceberg.exceptions.NamespaceNotEmptyException;
import org.apache.iceberg.exceptions.NoSuchNamespaceException;
import org.apache.iceberg.relocated.com.google.common.collect.ImmutableMap;
+import org.apache.iceberg.relocated.com.google.common.collect.ImmutableSet;
import org.apache.iceberg.relocated.com.google.common.collect.Sets;
import org.apache.iceberg.types.Types;
import org.assertj.core.api.Assertions;
@@ -132,6 +134,36 @@ public class TestNamespace extends BaseTestIceberg {
.hasMessage("Namespace does not exist: unknown");
}
+ @Test
+ public void testEmptyNamespace() {
+ Assertions.assertThatThrownBy(
+ () -> catalog.createNamespace(Namespace.empty(),
Collections.emptyMap()))
+ .isInstanceOf(NoSuchNamespaceException.class)
+ .hasMessage("Invalid namespace: ");
+
+
Assertions.assertThat(catalog.namespaceExists(Namespace.empty())).isFalse();
+
+ Assertions.assertThatThrownBy(() ->
catalog.loadNamespaceMetadata(Namespace.empty()))
+ .isInstanceOf(NoSuchNamespaceException.class)
+ .hasMessage("Invalid namespace: ");
+
+ Assertions.assertThatThrownBy(
+ () ->
+ catalog.setProperties(
+ Namespace.empty(), ImmutableMap.of("prop2", "val2",
"prop", "val")))
+ .isInstanceOf(NoSuchNamespaceException.class)
+ .hasMessage("Invalid namespace: ");
+
+ Assertions.assertThatThrownBy(
+ () -> catalog.removeProperties(Namespace.empty(),
ImmutableSet.of("prop2")))
+ .isInstanceOf(NoSuchNamespaceException.class)
+ .hasMessage("Invalid namespace: ");
+
+ Assertions.assertThatThrownBy(() ->
catalog.dropNamespace(Namespace.empty()))
+ .isInstanceOf(NoSuchNamespaceException.class)
+ .hasMessage("Invalid namespace: ");
+ }
+
@Test
public void testRemovingProperties() {
Map<String, String> properties = ImmutableMap.of("prop2", "val2", "prop",
"val");
diff --git
a/nessie/src/test/java/org/apache/iceberg/nessie/TestNessieIcebergClient.java
b/nessie/src/test/java/org/apache/iceberg/nessie/TestNessieIcebergClient.java
index 0316a9ea7e..e49990f360 100644
---
a/nessie/src/test/java/org/apache/iceberg/nessie/TestNessieIcebergClient.java
+++
b/nessie/src/test/java/org/apache/iceberg/nessie/TestNessieIcebergClient.java
@@ -147,9 +147,9 @@ public class TestNessieIcebergClient extends
BaseTestIceberg {
createBranch(branch);
NessieIcebergClient client = new NessieIcebergClient(api, branch, null,
Map.of());
- Assertions.assertThatIllegalArgumentException()
- .isThrownBy(() -> client.createNamespace(Namespace.empty(), Map.of()))
- .withMessageContaining("Creating empty namespaces is not supported");
+ Assertions.assertThatThrownBy(() ->
client.createNamespace(Namespace.empty(), Map.of()))
+ .isInstanceOf(NoSuchNamespaceException.class)
+ .hasMessageContaining("Invalid namespace: ");
Assertions.assertThatThrownBy(() ->
client.createNamespace(Namespace.of("a", "b"), Map.of()))
.isInstanceOf(NoSuchNamespaceException.class)