gaborkaszab commented on code in PR #6045:
URL: https://github.com/apache/iceberg/pull/6045#discussion_r1011702120


##########
hive-metastore/src/main/java/org/apache/iceberg/hive/HiveCatalog.java:
##########
@@ -539,12 +541,22 @@ Database convertToDatabase(Namespace namespace, 
Map<String, String> meta) {
             database.setDescription(value);
           } else if (key.equals("location")) {
             database.setLocationUri(value);
+          } else if (key.equals(TableProperties.HMS_DB_OWNER)) {
+            database.setOwnerName(value);
+          } else if (key.equals(TableProperties.HMS_DB_OWNER_TYPE) && value != 
null) {
+            database.setOwnerType(PrincipalType.valueOf(value));

Review Comment:
   I believe that valueOf() can throw an IllegalArgumentException if there is 
no such enum value as the input parameter. This exception might be handled on 
the API level but we might want to take care of it more gracefully here.
   Additionally, some test coverage for this would be great.



##########
hive-metastore/src/test/java/org/apache/iceberg/hive/TestHiveCatalog.java:
##########
@@ -358,6 +359,63 @@ public void testCreateNamespace() throws Exception {
         "There no same location for db and namespace", 
database2.getLocationUri(), hiveLocalDir);
   }
 
+  @Test
+  public void testCreateNamespaceWithOwnership() throws Exception {
+    Map<String, String> prop =
+        ImmutableMap.of(
+            TableProperties.HMS_DB_OWNER,
+            "apache",
+            TableProperties.HMS_DB_OWNER_TYPE,
+            PrincipalType.USER.name());
+
+    String expectedOwner = "apache";
+    PrincipalType expectedOwnerType = PrincipalType.USER;
+
+    createNamespaceAndVerifyOwnership("userOwnership", prop, expectedOwner, 
expectedOwnerType);
+
+    prop =
+        ImmutableMap.of(
+            TableProperties.HMS_DB_OWNER,
+            "iceberg",
+            TableProperties.HMS_DB_OWNER_TYPE,
+            PrincipalType.GROUP.name());
+    expectedOwner = "iceberg";
+    expectedOwnerType = PrincipalType.GROUP;
+
+    createNamespaceAndVerifyOwnership("groupOwnership", prop, expectedOwner, 
expectedOwnerType);
+
+    prop = ImmutableMap.of(TableProperties.HMS_DB_OWNER, "someone");
+    expectedOwner = "someone";
+    expectedOwnerType = PrincipalType.USER; // default is user if not specified
+
+    createNamespaceAndVerifyOwnership("ownedBySomeone", prop, expectedOwner, 
expectedOwnerType);
+
+    prop = ImmutableMap.of();
+    expectedOwner = System.getProperty("user.name"); // default value if not 
specified
+    expectedOwnerType = PrincipalType.USER; // default is user if not specified
+
+    createNamespaceAndVerifyOwnership("ownedByDefaultUser", prop, 
expectedOwner, expectedOwnerType);
+
+    prop = ImmutableMap.of(TableProperties.HMS_DB_OWNER_TYPE, 
PrincipalType.GROUP.name());

Review Comment:
   Just thinking out loud, but shouldn't we indicate failure if only the owner 
type is set without the owner, instead of silently omitting it?



##########
hive-metastore/src/test/java/org/apache/iceberg/hive/TestHiveCatalog.java:
##########
@@ -448,6 +540,36 @@ public void testRemoveNamespaceProperties() throws 
TException {
         });
   }
 
+  @Test
+  public void testRemoveNamespaceOwnership() throws TException {
+    Map<String, String> prop = ImmutableMap.of(TableProperties.HMS_DB_OWNER, 
"some_owner");
+    removeNamespaceOwnershipAndVerify("remove_individual_ownership", prop);
+    prop =
+        ImmutableMap.of(
+            TableProperties.HMS_DB_OWNER,
+            "some_owner",
+            TableProperties.HMS_DB_OWNER_TYPE,
+            PrincipalType.GROUP.name());
+    removeNamespaceOwnershipAndVerify("remove_group_ownership", prop);
+  }
+
+  private void removeNamespaceOwnershipAndVerify(String name, Map<String, 
String> prop)

Review Comment:
   This test has a precondition in a sense that prop is expected to hold some 
username and owner type that is going to be used when creating a namespace. For 
reflecting this I'd add an extra check right after the createNamespace() call 
that these are reflected in the DB ownership (before we remove these 
properties).



##########
hive-metastore/src/test/java/org/apache/iceberg/hive/TestHiveCatalog.java:
##########
@@ -426,6 +484,40 @@ public void testSetNamespaceProperties() throws TException 
{
         });
   }
 
+  @Test
+  public void testSetNamespaceOwnership() throws TException {
+    Map<String, String> prop =
+        ImmutableMap.of(TableProperties.HMS_DB_OWNER, "some_individual_owner");
+    String expectedOwner = "some_individual_owner";
+    PrincipalType expectedType = PrincipalType.USER;
+
+    setNamespaceOwnershipAndVerify("set_individual_ownership", prop, 
expectedOwner, expectedType);
+
+    prop =
+        ImmutableMap.of(
+            TableProperties.HMS_DB_OWNER,
+            "some_group_owner",
+            TableProperties.HMS_DB_OWNER_TYPE,
+            PrincipalType.GROUP.name());
+    expectedOwner = "some_group_owner";
+    expectedType = PrincipalType.GROUP;
+
+    setNamespaceOwnershipAndVerify("set_group_ownership", prop, expectedOwner, 
expectedType);
+  }
+
+  private void setNamespaceOwnershipAndVerify(
+      String name, Map<String, String> prop, String expectedOwner, 
PrincipalType expectedType)
+      throws TException {
+    Namespace namespace = Namespace.of(name);
+    catalog.createNamespace(namespace);
+    catalog.setProperties(namespace, prop);
+    Database database = metastoreClient.getDatabase(namespace.level(0));
+
+    // Once ownership is removed, expect the ownership and type to fall back 
to the default value

Review Comment:
   nit: This comment is rather valid for the "removeOwnership" test and not for 
the "setOwnership" test, right?



##########
hive-metastore/src/test/java/org/apache/iceberg/hive/TestHiveCatalog.java:
##########
@@ -358,6 +359,63 @@ public void testCreateNamespace() throws Exception {
         "There no same location for db and namespace", 
database2.getLocationUri(), hiveLocalDir);
   }
 
+  @Test
+  public void testCreateNamespaceWithOwnership() throws Exception {
+    Map<String, String> prop =
+        ImmutableMap.of(
+            TableProperties.HMS_DB_OWNER,
+            "apache",
+            TableProperties.HMS_DB_OWNER_TYPE,
+            PrincipalType.USER.name());
+
+    String expectedOwner = "apache";
+    PrincipalType expectedOwnerType = PrincipalType.USER;

Review Comment:
   nit: I think its more readable to not introduce variables here for the 
expected result but provide the expected values right at the test runner 
function call. Might be only a personal preference, though.



##########
core/src/main/java/org/apache/iceberg/TableProperties.java:
##########
@@ -361,4 +361,6 @@ private TableProperties() {}
   public static final boolean UPSERT_ENABLED_DEFAULT = false;
 
   public static final String HMS_TABLE_OWNER = "hms_table_owner";
+  public static final String HMS_DB_OWNER = "hms_db_owner";

Review Comment:
   @danielcweeks yes, currently the table owner is for "USER" types.
   About the naming, when I introduced HMS_TABLE_OWNER frankly I wasn't aware 
of the existing naming convention, so I'm absolutely open to rename them to 
follow how other properties are named.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscr...@iceberg.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@iceberg.apache.org
For additional commands, e-mail: issues-h...@iceberg.apache.org

Reply via email to