Browse Source

[raz] Append username to default home dir in RAZ enabled env (#2601)

- Much better experience when clicking S3 or ABFS left assist icons.
- Should not give 403 error now for the user now.
- Need to define REMOTE_STORAGE_HOME with ending /user dir which should be the same with Ranger policy.
Harsh Gupta 4 năm trước cách đây
mục cha
commit
e002726f59

+ 7 - 3
desktop/core/src/desktop/models.py

@@ -51,7 +51,7 @@ from useradmin.organization import _fitered_queryset
 from desktop import appmanager
 from desktop.auth.backend import is_admin
 from desktop.conf import get_clusters, IS_MULTICLUSTER_ONLY, ENABLE_ORGANIZATIONS, ENABLE_PROMETHEUS, \
-    has_connectors, TASK_SERVER, APP_BLACKLIST, ENABLE_SHARING, ENABLE_CONNECTORS, ENABLE_UNIFIED_ANALYTICS
+    has_connectors, TASK_SERVER, APP_BLACKLIST, ENABLE_SHARING, ENABLE_CONNECTORS, ENABLE_UNIFIED_ANALYTICS, RAZ
 from desktop.lib import fsmanager
 from desktop.lib.connectors.api import _get_installed_connectors
 from desktop.lib.connectors.models import Connector
@@ -1726,13 +1726,17 @@ class Document2Permission(models.Model):
 def get_cluster_config(user):
   return Cluster(user).get_app_config().get_config()
 
-def get_remote_home_storage():
+def get_remote_home_storage(user=None):
   remote_home_storage = REMOTE_STORAGE_HOME.get() if hasattr(REMOTE_STORAGE_HOME, 'get') and REMOTE_STORAGE_HOME.get() else None
 
   if not remote_home_storage:
     if get_raz_api_url() and get_raz_s3_default_bucket():
       remote_home_storage = 's3a://%(bucket)s' % get_raz_s3_default_bucket()
 
+  # In RAZ env, apppend username so that it defaults to user's dir and doesn't give 403 error
+  if user and remote_home_storage and RAZ.IS_ENABLED.get() and remote_home_storage.endswith('/user'):
+    remote_home_storage += '/' + user.username
+
   return remote_home_storage
 
 
@@ -1966,7 +1970,7 @@ class ClusterConfig(object):
       hdfs_connectors.append(_('Files'))
 
 
-    remote_home_storage = get_remote_home_storage()
+    remote_home_storage = get_remote_home_storage(self.user)
 
     for hdfs_connector in hdfs_connectors:
       force_home = remote_home_storage and not remote_home_storage.startswith('/')

+ 58 - 2
desktop/core/src/desktop/models_tests.py

@@ -31,13 +31,15 @@ from beeswax.design import hql_query
 from notebook.models import import_saved_beeswax_query
 from useradmin.models import get_default_user_group, User
 
-from desktop.conf import has_connectors
+from filebrowser.conf import REMOTE_STORAGE_HOME
+
+from desktop.conf import has_connectors, RAZ
 from desktop.converters import DocumentConverter
 from desktop.lib.connectors.models import Connector
 from desktop.lib.django_test_util import make_logged_in_client
 from desktop.lib.fs import ProxyFS
 from desktop.lib.test_utils import grant_access
-from desktop.models import Directory, Document2, Document, Document2Permission, ClusterConfig
+from desktop.models import Directory, Document2, Document, Document2Permission, ClusterConfig, get_remote_home_storage
 
 try:
   from oozie.models2 import Workflow
@@ -62,6 +64,9 @@ class TestClusterConfig(object):
     self.client = make_logged_in_client(username="test", groupname="test", recreate=True, is_superuser=False)
     self.user = User.objects.get(username="test")
 
+    self.client_not_me = make_logged_in_client(username="test_not_me", groupname="test_not_me", recreate=True, is_superuser=False)
+    self.user_not_me = User.objects.get(username="test_not_me")
+
   def test_get_fs(self):
     if not has_connectors():
       raise SkipTest
@@ -83,6 +88,57 @@ class TestClusterConfig(object):
       assert_true({'type': 1, 'name': 'SQL'}, main_app)
 
 
+  def test_get_remote_storage_home(self):
+
+    # When default home ends with /user in RAZ ADLS env.
+    resets = [
+      RAZ.IS_ENABLED.set_for_testing(True),
+      REMOTE_STORAGE_HOME.set_for_testing('abfs://gethue-container/user')
+    ]
+
+    try:
+      remote_home_storage = get_remote_home_storage(self.user)
+      assert_equal(remote_home_storage, 'abfs://gethue-container/user/test')
+
+      remote_home_storage = get_remote_home_storage(self.user_not_me)
+      assert_equal(remote_home_storage, 'abfs://gethue-container/user/test_not_me')
+    finally:
+      for reset in resets:
+        reset()
+
+    # When default home ends with /user in RAZ S3 env.
+    resets = [
+      RAZ.IS_ENABLED.set_for_testing(True),
+      REMOTE_STORAGE_HOME.set_for_testing('s3a://gethue-bucket/user')
+    ]
+
+    try:
+      remote_home_storage = get_remote_home_storage(self.user)
+      assert_equal(remote_home_storage, 's3a://gethue-bucket/user/test')
+
+      remote_home_storage = get_remote_home_storage(self.user_not_me)
+      assert_equal(remote_home_storage, 's3a://gethue-bucket/user/test_not_me')
+    finally:
+      for reset in resets:
+        reset()
+
+    # When default home does not ends with /user in RAZ env
+    resets = [
+      RAZ.IS_ENABLED.set_for_testing(True),
+      REMOTE_STORAGE_HOME.set_for_testing('abfs://gethue-container')
+    ]
+
+    try:
+      remote_home_storage = get_remote_home_storage(self.user)
+      assert_equal(remote_home_storage, 'abfs://gethue-container')
+
+      remote_home_storage = get_remote_home_storage(self.user_not_me)
+      assert_equal(remote_home_storage, 'abfs://gethue-container')
+    finally:
+      for reset in resets:
+        reset()
+
+
 class TestDocument2(object):
 
   def setUp(self):