浏览代码

HUE-5296 [fb] Allow GETTRASHROOT to be called on full file path

Jenny Kim 9 年之前
父节点
当前提交
9916b2b

+ 3 - 3
apps/filebrowser/src/filebrowser/views.py

@@ -173,11 +173,11 @@ def view(request, path):
 
     # default_to_home is set in bootstrap.js
     if 'default_to_trash' in request.GET:
-        home_trash = request.fs.join(request.fs.trash_path, 'Current', request.user.get_home_directory()[1:])
+        home_trash = request.fs.join(request.fs.trash_path(path), 'Current', request.user.get_home_directory()[1:])
         if request.fs.isdir(home_trash):
             return format_preserving_redirect(request, reverse(view, kwargs=dict(path=home_trash)))
-        if request.fs.isdir(request.fs.trash_path):
-            return format_preserving_redirect(request, reverse(view, kwargs=dict(path=request.fs.trash_path)))
+        if request.fs.isdir(request.fs.trash_path(path)):
+            return format_preserving_redirect(request, reverse(view, kwargs=dict(path=request.fs.trash_path(path))))
 
     try:
         decoded_path = urllib.unquote(path)

+ 14 - 13
desktop/libs/hadoop/src/hadoop/fs/test_webhdfs.py

@@ -424,9 +424,10 @@ class WebhdfsTests(unittest.TestCase):
       assert_true(self.cluster.fs.exists(PATH))
       self.cluster.fs.remove(PATH)
       assert_false(self.cluster.fs.exists(PATH))
-      assert_true(self.cluster.fs.exists(self.cluster.fs.trash_path))
-      trash_dirs = self.cluster.fs.listdir(self.cluster.fs.trash_path)
-      trash_paths = [self.cluster.fs.join(self.cluster.fs.trash_path, trash_dir, PATH[1:]) for trash_dir in trash_dirs]
+      assert_equals(self.cluster.fs.join(self.cluster.fs.get_home_dir(), '.Trash'), self.cluster.fs.trash_path())
+      assert_true(self.cluster.fs.exists(self.cluster.fs.trash_path(PATH)))
+      trash_dirs = self.cluster.fs.listdir(self.cluster.fs.trash_path(PATH))
+      trash_paths = [self.cluster.fs.join(self.cluster.fs.trash_path(PATH), trash_dir, PATH[1:]) for trash_dir in trash_dirs]
       exists = map(self.cluster.fs.exists, trash_paths)
       assert_true(reduce(lambda a, b: a or b, exists), trash_paths)
       trash_path = reduce(lambda a, b: a[0] and a or b, zip(exists, trash_paths))[1]
@@ -450,9 +451,9 @@ class WebhdfsTests(unittest.TestCase):
       assert_true(self.cluster.fs.exists(PATH))
       self.cluster.fs.remove(PATH)
       assert_false(self.cluster.fs.exists(PATH))
-      assert_true(self.cluster.fs.exists(self.cluster.fs.trash_path))
-      trash_dirs = self.cluster.fs.listdir(self.cluster.fs.trash_path)
-      trash_paths = [self.cluster.fs.join(self.cluster.fs.trash_path, trash_dir, PATH[1:]) for trash_dir in trash_dirs]
+      assert_true(self.cluster.fs.exists(self.cluster.fs.trash_path(PATH)))
+      trash_dirs = self.cluster.fs.listdir(self.cluster.fs.trash_path(PATH))
+      trash_paths = [self.cluster.fs.join(self.cluster.fs.trash_path(PATH), trash_dir, PATH[1:]) for trash_dir in trash_dirs]
       exists = map(self.cluster.fs.exists, trash_paths)
       assert_true(reduce(lambda a, b: a or b, exists), trash_paths)
       trash_path = reduce(lambda a, b: a[0] and a or b, zip(exists, trash_paths))[1]
@@ -476,9 +477,9 @@ class WebhdfsTests(unittest.TestCase):
       assert_true(self.cluster.fs.exists(PATH))
       self.cluster.fs.remove(PATH)
       assert_false(self.cluster.fs.exists(PATH))
-      assert_true(self.cluster.fs.exists(self.cluster.fs.trash_path))
-      trash_dirs = self.cluster.fs.listdir(self.cluster.fs.trash_path)
-      trash_paths = [self.cluster.fs.join(self.cluster.fs.trash_path, trash_dir, PATH[1:]) for trash_dir in trash_dirs]
+      assert_true(self.cluster.fs.exists(self.cluster.fs.trash_path(PATH)))
+      trash_dirs = self.cluster.fs.listdir(self.cluster.fs.trash_path(PATH))
+      trash_paths = [self.cluster.fs.join(self.cluster.fs.trash_path(PATH), trash_dir, PATH[1:]) for trash_dir in trash_dirs]
       exists = map(self.cluster.fs.exists, trash_paths)
       assert_true(reduce(lambda a, b: a or b, exists), trash_paths)
       trash_path = reduce(lambda a, b: a[0] and a or b, zip(exists, trash_paths))[1]
@@ -505,9 +506,9 @@ class WebhdfsTests(unittest.TestCase):
       assert_true(self.cluster.fs.exists(PATH))
       self.cluster.fs.remove(PATH)
       assert_false(self.cluster.fs.exists(PATH))
-      assert_true(self.cluster.fs.exists(self.cluster.fs.trash_path))
-      trash_dirs = self.cluster.fs.listdir(self.cluster.fs.trash_path)
-      trash_paths = [self.cluster.fs.join(self.cluster.fs.trash_path, trash_dir, PATH[1:]) for trash_dir in trash_dirs]
+      assert_true(self.cluster.fs.exists(self.cluster.fs.trash_path(PATH)))
+      trash_dirs = self.cluster.fs.listdir(self.cluster.fs.trash_path(PATH))
+      trash_paths = [self.cluster.fs.join(self.cluster.fs.trash_path(PATH), trash_dir, PATH[1:]) for trash_dir in trash_dirs]
       exists = map(self.cluster.fs.exists, trash_paths)
       assert_true(reduce(lambda a, b: a or b, exists), trash_paths)
       trash_path = reduce(lambda a, b: a[0] and a or b, zip(exists, trash_paths))[1]
@@ -551,7 +552,7 @@ class WebhdfsTests(unittest.TestCase):
         assert_true(self.cluster.fs.exists(PATH))
         self.cluster.fs.remove(PATH)
         assert_false(self.cluster.fs.exists(PATH))
-        assert_true(self.cluster.fs.exists(self.cluster.fs.trash_path))
+        assert_true(self.cluster.fs.exists(self.cluster.fs.trash_path(PATH)))
     finally:
       reload(threading)
       self.cluster.fs.setuser(self.cluster.superuser)

+ 15 - 16
desktop/libs/hadoop/src/hadoop/fs/webhdfs.py

@@ -161,11 +161,11 @@ class WebHdfs(Hdfs):
     except AttributeError:
       return WebHdfs.DEFAULT_USER
 
-  @property
-  def trash_path(self):
+  def trash_path(self, path=None):
     trash_path = self.join(self.get_home_dir(), '.Trash')
     try:
-      path = '/'
+      if not path:
+        path = self.get_home_dir()
       params = self._getparams()
       params['op'] = 'GETTRASHROOT'
       json = self._root.get(path, params)
@@ -177,9 +177,8 @@ class WebHdfs(Hdfs):
         raise e
     return trash_path
 
-  @property
-  def current_trash_path(self):
-    return self.join(self.trash_path, self.TRASH_CURRENT)
+  def current_trash_path(self, path):
+    return self.join(self.trash_path(path), self.TRASH_CURRENT)
 
   def _getparams(self):
     return {
@@ -268,11 +267,11 @@ class WebHdfs(Hdfs):
   def isroot(self, path):
     return path == '/'
 
-  def _ensure_current_trash_directory(self):
+  def _ensure_current_trash_directory(self, path):
     """Create trash directory for a user if it doesn't exist."""
-    if self.exists(self.current_trash_path):
-      self.mkdir(self.current_trash_path)
-    return self.current_trash_path
+    if self.exists(self.current_trash_path(path)):
+      self.mkdir(self.current_trash_path(path))
+    return self.current_trash_path(path)
 
   def _trash(self, path, recursive=False):
     """
@@ -289,11 +288,11 @@ class WebHdfs(Hdfs):
     if not recursive and self.isdir(path):
       raise IOError(errno.EISDIR, _("File %s is a directory") % path)
 
-    if path.startswith(self.trash_path):
+    if path.startswith(self.trash_path(path)):
       raise IOError(errno.EPERM, _("File %s is already trashed") % path)
 
     # Make path (with timestamp suffix if necessary)
-    base_trash_path = self.join(self._ensure_current_trash_directory(), path[1:])
+    base_trash_path = self.join(self._ensure_current_trash_directory(path), path[1:])
     trash_path = base_trash_path
     while self.exists(trash_path):
       trash_path = base_trash_path + str(time.time())
@@ -345,13 +344,13 @@ class WebHdfs(Hdfs):
     Removing the root from ``path`` will provide the original path.
     Ensure parent directories exist and rename path.
     """
-    if not path.startswith(self.trash_path):
+    if not path.startswith(self.trash_path(path)):
       raise IOError(errno.EPERM, _("File %s is not in trash") % path)
 
     # Build original path
     original_path = []
     split_path = self.split(path)
-    while split_path[0] != self.trash_path:
+    while split_path[0] != self.trash_path(path):
       original_path.append(split_path[1])
       split_path = self.split(split_path[0])
     original_path.reverse()
@@ -369,8 +368,8 @@ class WebHdfs(Hdfs):
 
     Purge all trash in users ``trash_path``
     """
-    for timestamped_directory in self.listdir(self.trash_path):
-      self.rmtree(self.join(self.trash_path, timestamped_directory), True)
+    for timestamped_directory in self.listdir(self.trash_path()):
+      self.rmtree(self.join(self.trash_path(), timestamped_directory), True)
 
   def mkdir(self, path, mode=None):
     """