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)

Reply via email to