Эх сурвалжийг харах

[core] Error creating the home directory for first user should not stop user creation

abec 13 жил өмнө
parent
commit
2f6c518

+ 1 - 1
apps/beeswax/src/beeswax/models.py

@@ -313,7 +313,7 @@ class QueryHandle(object):
     self.log_context = log_context
 
   def is_valid(self):
-    return all([self.get()])
+    return sum([bool(obj) for obj in [self.get()]]) > 0
 
   def __str__(self):
     return '%s %s' % (self.secret, self.guid)

+ 1 - 1
apps/beeswax/src/beeswax/server/hive_server2_lib.py

@@ -67,7 +67,7 @@ class HiveServerTable(Table):
   @property
   def cols(self):
     cols = HiveServerTTableSchema(self.results, self.schema).cols()
-    if sum([col['col_name'] for col in cols]) == len(cols):
+    if sum([bool(col['col_name']) for col in cols]) == len(cols):
       return cols
     else:
       return cols[:-2] # Drop last 2 lines of Extended describe

+ 1 - 1
apps/useradmin/src/useradmin/views.py

@@ -460,7 +460,7 @@ def ensure_home_directory(fs, username):
   """
   Adds a users home directory if it doesn't already exist.
 
-  Throws WebHdfsException.
+  Throws IOError, WebHdfsException.
   """
   home_dir = '/user/%s' % username
   fs.do_as_user(username, fs.create_home_dir, home_dir)

+ 7 - 1
desktop/core/src/desktop/auth/views.py

@@ -24,6 +24,8 @@ from django.contrib.auth import login, get_backends
 from django.contrib.auth.models import User
 from django.contrib.sessions.models import Session
 from django.http import HttpResponseRedirect
+from django.utils.translation import ugettext as _
+from hadoop.fs.exceptions import WebHdfsException
 from useradmin.views import ensure_home_directory
 
 from desktop.auth.backend import AllowFirstUserDjangoBackend
@@ -77,7 +79,11 @@ def dt_login(request):
         request.session.delete_test_cookie()
 
       if is_first_login_ever:
-        ensure_home_directory(request.fs, request.POST.get('username'))
+        try:
+          ensure_home_directory(request.fs, request.POST.get('username'))
+        except (IOError, WebHdfsException), e:
+          LOG.error(_('Could not create home directory.'), exc_info=e)
+          request.error(_('Could not create home directory.'))
 
       access_warn(request, '"%s" login ok' % (request.user.username,))
       return HttpResponseRedirect(redirect_to)

+ 11 - 10
desktop/core/src/desktop/auth/views_test.py

@@ -24,7 +24,17 @@ from desktop.lib.django_test_util import make_logged_in_client
 from hadoop.test_base import PseudoHdfsTestBase
 
 
-class TestLogin(PseudoHdfsTestBase):
+class TestLogin(object):
+  def test_non_jframe_login():
+    client = make_logged_in_client(username="test", password="test")
+    # Logout first
+    client.get('/accounts/logout')
+    # Login
+    response = client.post('/accounts/login/', dict(username="test", password="test"), follow=True)
+    assert_equal(response.template, 'index.mako')
+
+
+class TestLoginWithHadoop(PseudoHdfsTestBase):
   def test_jframe_login(self):
     # Simulate first login ever
     for user in User.objects.all():
@@ -45,12 +55,3 @@ class TestLogin(PseudoHdfsTestBase):
     response = c.get('/accounts/login/')
     assert_equal(200, response.status_code, "Expected ok status.")
     assert_false(response.context['first_login_ever'])
-
-
-def test_non_jframe_login():
-  client = make_logged_in_client(username="test", password="test")
-  # Logout first
-  client.get('/accounts/logout')
-  # Login
-  response = client.post('/accounts/login/', dict(username="test", password="test"), follow=True)
-  assert_equal(response.template, 'index.mako')

+ 36 - 16
desktop/libs/hadoop/src/hadoop/fs/hadoopfs.py

@@ -220,23 +220,25 @@ class Hdfs(object):
     path = url[i:]
     return (schema, netloc, normpath(path), '', '')
 
-  def exists(self):
-    raise NotImplementedError(_("%(function)s has not been implemented.") % {'function': 'exists'})
-
-  def do_as_user(self):
-    raise NotImplementedError(_("%(function)s has not been implemented.") % {'function': 'do_as_user'})
+  def create_home_dir(self, home_path=None):
+    if home_path is None:
+      home_path = self.get_home_dir()
 
-  def create(self):
-    raise NotImplementedError(_("%(function)s has not been implemented.") % {'function': 'exists'})
-
-  def append(self):
-    raise NotImplementedError(_("%(function)s has not been implemented.") % {'function': 'append'})
-
-  def mkdir(self):
-    raise NotImplementedError(_("%(function)s has not been implemented.") % {'function': 'mkdir'})
-
-  def isdir(self):
-    raise NotImplementedError(_("%(function)s has not been implemented.") % {'function': 'isdir'})
+    if not self.exists(home_path):
+      user = self.user
+      try:
+        try:
+          self.setuser(self.superuser)
+          self.mkdir(home_path)
+          self.chmod(home_path, 0755)
+          self.chown(home_path, user, user)
+        except IOError:
+          msg = 'Failed to create home dir ("%s") as superuser %s' %\
+                (home_path, self.superuser)
+          LOG.exception(msg)
+          raise
+      finally:
+        self.setuser(user)
 
   def copyFromLocal(self, local_src, remote_dst, mode=0755):
     remote_dst = remote_dst.endswith(posixpath.sep) and remote_dst[:-1] or remote_dst
@@ -285,6 +287,24 @@ class Hdfs(object):
     else:
       LOG.info(_('Skipping %s (not a file)') % local_src)
 
+  def exists(self):
+    raise NotImplementedError(_("%(function)s has not been implemented.") % {'function': 'exists'})
+
+  def do_as_user(self):
+    raise NotImplementedError(_("%(function)s has not been implemented.") % {'function': 'do_as_user'})
+
+  def create(self):
+    raise NotImplementedError(_("%(function)s has not been implemented.") % {'function': 'exists'})
+
+  def append(self):
+    raise NotImplementedError(_("%(function)s has not been implemented.") % {'function': 'append'})
+
+  def mkdir(self):
+    raise NotImplementedError(_("%(function)s has not been implemented.") % {'function': 'mkdir'})
+
+  def isdir(self):
+    raise NotImplementedError(_("%(function)s has not been implemented.") % {'function': 'isdir'})
+
 
 """
 Deprecated! Use WebHdfs instead

+ 0 - 21
desktop/libs/hadoop/src/hadoop/fs/webhdfs.py

@@ -467,27 +467,6 @@ class WebHdfs(Hdfs):
     return posixpath.join(self.fs_defaultfs, path.lstrip('/'))
 
 
-  def create_home_dir(self, home_path=None):
-    if home_path is None:
-      home_path = self.get_home_dir()
-
-    if not self.exists(home_path):
-      user = self.user
-      try:
-        try:
-          self.setuser(self.superuser)
-          self.mkdir(home_path)
-          self.chmod(home_path, 0755)
-          self.chown(home_path, user, user)
-        except IOError, e:
-          msg = 'Failed to create home dir ("%s") as superuser %s' %\
-                (home_path, self.superuser)
-          LOG.exception(msg)
-          raise PopupException(msg, detail=e)
-      finally:
-        self.setuser(user)
-
-
   def _invoke_with_redirect(self, method, path, params=None, data=None):
     """
     Issue a request, and expect a redirect, and then submit the data to