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


##########
hive-metastore/src/main/java/org/apache/iceberg/hive/HiveCatalog.java:
##########
@@ -518,11 +522,36 @@ private Map<String, String> convertToMetadata(Database 
database) {
     if (database.getDescription() != null) {
       meta.put("comment", database.getDescription());
     }
+    if (database.getOwnerName() != null) {
+      meta.put(TableProperties.HMS_DB_OWNER, database.getOwnerName());
+      if (database.getOwnerType() != null) {
+        meta.put(TableProperties.HMS_DB_OWNER_TYPE, 
database.getOwnerType().name());
+      }
+    }
 
     return meta;
   }
 
   Database convertToDatabase(Namespace namespace, Map<String, String> meta) {
+    Preconditions.checkArgument(

Review Comment:
   In my understanding Preconditions are for checking some internal state that 
should be always true. Here, if I'm not mistaken you use it to verify user 
input. This seems a bit odd for me.



##########
core/src/main/java/org/apache/iceberg/TableProperties.java:
##########
@@ -360,5 +360,7 @@ private TableProperties() {}
   public static final String UPSERT_ENABLED = "write.upsert.enabled";
   public static final boolean UPSERT_ENABLED_DEFAULT = false;
 
-  public static final String HMS_TABLE_OWNER = "hms_table_owner";
+  public static final String HMS_TABLE_OWNER = "hive.metastore.table.owner";

Review Comment:
   What I'm not sure about is if we release 1.1.0 now with HMS_TABLE_OWNER = 
"hms_table_owner" but then we change this property to 
"hive.metastore.table.owner" then when this patch gets released (most probably 
in 1.2.0) wouldn't it be a breaking change?
   @danielcweeks could you please share your view on this?



##########
hive-metastore/src/main/java/org/apache/iceberg/hive/HiveCatalog.java:
##########
@@ -518,11 +522,36 @@ private Map<String, String> convertToMetadata(Database 
database) {
     if (database.getDescription() != null) {
       meta.put("comment", database.getDescription());
     }
+    if (database.getOwnerName() != null) {
+      meta.put(TableProperties.HMS_DB_OWNER, database.getOwnerName());
+      if (database.getOwnerType() != null) {
+        meta.put(TableProperties.HMS_DB_OWNER_TYPE, 
database.getOwnerType().name());
+      }
+    }
 
     return meta;
   }
 
   Database convertToDatabase(Namespace namespace, Map<String, String> meta) {
+    Preconditions.checkArgument(
+        meta.get(TableProperties.HMS_DB_OWNER_TYPE) == null
+            || meta.get(TableProperties.HMS_DB_OWNER) != null,
+        "Setting "
+            + TableProperties.HMS_DB_OWNER_TYPE
+            + " without setting "
+            + TableProperties.HMS_DB_OWNER
+            + "is not allowed");
+
+    Preconditions.checkArgument(

Review Comment:
   Same here



##########
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:
   See my comment above about preconditions.



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

Review Comment:
   This tests that what happens when there is no specific owner/ownertype set 
for the namespace but then we try to remove them, right?
   
   What would also be beneficial in my opinion is to create the namespace with 
some owner and then run a noop remove and check if the owner is still the same 
what we provided during creation.



##########
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:
   I think you got me wrong. I just wanted to say that when you call 
catalog.createNamespace() at L619 then you immediately call 
catalog.removeNamespace(). To be on the safe side I'd add an extra check 
between these two steps that right after creating the namespace the owner and 
owner type are as expected.



##########
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:
   No, what I meant is to instead of this:
   `String expectedOwner = "apache";
   PrincipalType expectedOwnerType = PrincipalType.USER;
   createNamespaceAndVerifyOwnership("userOwnership", prop, expectedOwner, 
expectedOwnerType);`
   
   we could have this:
   `createNamespaceAndVerifyOwnership(
       "userOwnership",
       prop,
       "apache",
       PrincipalType.USER);`
   
   Might be personal preference. Let me know if you feel that this wouldn't 
improve readability.



-- 
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