asynchronous refactoring
- don't execute celery tasks directly - introduce optional parameters to fileserver tasks to allow chaining - handle user/group/key create and delete tasks in new osusers.signals class - adapt unit tests - change TaskResults model to store the task signatures - generalize the local settings' logging configuration
This commit is contained in:
parent
bcfea10e6f
commit
d5bba7a22d
12 changed files with 290 additions and 170 deletions
|
@ -10,9 +10,12 @@ import logging
|
|||
import os
|
||||
import six
|
||||
|
||||
from celery import group
|
||||
|
||||
from django.db import models, transaction
|
||||
from django.conf import settings
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.dispatch import Signal
|
||||
from django.utils import timezone
|
||||
from django.utils.encoding import python_2_unicode_compatible
|
||||
from django.utils.translation import ugettext as _
|
||||
|
@ -24,28 +27,13 @@ from passlib.utils import generate_password
|
|||
|
||||
from taskresults.models import TaskResult
|
||||
|
||||
from ldaptasks.tasks import (
|
||||
add_ldap_user_to_group,
|
||||
create_ldap_group,
|
||||
create_ldap_user,
|
||||
delete_ldap_group,
|
||||
delete_ldap_user,
|
||||
remove_ldap_user_from_group,
|
||||
set_ldap_user_password,
|
||||
)
|
||||
|
||||
from fileservertasks.tasks import (
|
||||
delete_file_mail_userdir,
|
||||
delete_file_sftp_userdir,
|
||||
set_file_ssh_authorized_keys,
|
||||
setup_file_mail_userdir,
|
||||
setup_file_sftp_userdir,
|
||||
)
|
||||
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
password_set = Signal(providing_args=['instance', 'password'])
|
||||
|
||||
|
||||
CANNOT_USE_PRIMARY_GROUP_AS_ADDITIONAL = _(
|
||||
"You can not use a user's primary group.")
|
||||
|
||||
|
@ -108,9 +96,6 @@ class Group(TimeStampedModel, models.Model):
|
|||
|
||||
"""
|
||||
super(Group, self).save(*args, **kwargs)
|
||||
dn = create_ldap_group.delay(
|
||||
self.groupname, self.gid, self.descr).get()
|
||||
_LOGGER.info("created LDAP group with dn %s", dn)
|
||||
return self
|
||||
|
||||
@transaction.atomic
|
||||
|
@ -124,10 +109,6 @@ class Group(TimeStampedModel, models.Model):
|
|||
:py:meth:`django.db.Model.delete`
|
||||
|
||||
"""
|
||||
TaskResult.objects.create_task_result(
|
||||
delete_ldap_group.delay(self.groupname),
|
||||
'delete_ldap_group'
|
||||
)
|
||||
super(Group, self).delete(*args, **kwargs)
|
||||
|
||||
|
||||
|
@ -249,25 +230,13 @@ class User(TimeStampedModel, models.Model):
|
|||
"""
|
||||
if hasattr(self, 'shadow'):
|
||||
self.shadow.set_password(password)
|
||||
success = set_ldap_user_password.delay(
|
||||
self.username, password).get()
|
||||
if success:
|
||||
_LOGGER.info(
|
||||
"successfully set LDAP password for %s", self.username)
|
||||
else:
|
||||
_LOGGER.error(
|
||||
"setting the LDAP password for %s failed", self.username)
|
||||
return success
|
||||
else:
|
||||
self.shadow = Shadow.objects.create_shadow(
|
||||
user=self, password=password
|
||||
)
|
||||
dn = create_ldap_user.delay(
|
||||
self.username, self.uid, self.group.gid, self.gecos,
|
||||
self.homedir, self.shell, password
|
||||
).get()
|
||||
_LOGGER.info("set LDAP password for %s", dn)
|
||||
return True
|
||||
password_set.send(
|
||||
sender=self.__class__, password=password, instance=self)
|
||||
return True
|
||||
|
||||
def is_sftp_user(self):
|
||||
return self.additionalgroup_set.filter(
|
||||
|
@ -288,22 +257,6 @@ class User(TimeStampedModel, models.Model):
|
|||
:rtype: :py:class:`osusers.models.User`
|
||||
|
||||
"""
|
||||
dn = create_ldap_user.delay(
|
||||
self.username, self.uid, self.group.gid, self.gecos,
|
||||
self.homedir, self.shell, password=None).get()
|
||||
TaskResult.objects.create_task_result(
|
||||
setup_file_sftp_userdir.delay(self.username),
|
||||
'setup_file_sftp_userdir'
|
||||
)
|
||||
TaskResult.objects.create_task_result(
|
||||
setup_file_mail_userdir.delay(self.username),
|
||||
'setup_file_mail_userdir'
|
||||
)
|
||||
_LOGGER.info(
|
||||
"created user %(user)s with LDAP dn %(dn)s, scheduled home "
|
||||
"directory and mail base directory creation.", {
|
||||
'user': self, 'dn': dn,
|
||||
})
|
||||
return super(User, self).save(*args, **kwargs)
|
||||
|
||||
@transaction.atomic
|
||||
|
@ -318,18 +271,6 @@ class User(TimeStampedModel, models.Model):
|
|||
:py:meth:`django.db.Model.delete`
|
||||
|
||||
"""
|
||||
TaskResult.objects.create_task_result(
|
||||
delete_file_mail_userdir.delay(self.username),
|
||||
'delete_file_mail_userdir'
|
||||
)
|
||||
TaskResult.objects.create_task_result(
|
||||
delete_file_sftp_userdir.delay(self.username),
|
||||
'delete_file_sftp_userdir'
|
||||
)
|
||||
for group in [ag.group for ag in self.additionalgroup_set.all()]:
|
||||
remove_ldap_user_from_group.delay(
|
||||
self.username, group.groupname).get()
|
||||
delete_ldap_user.delay(self.username).get()
|
||||
self.group.delete()
|
||||
super(User, self).delete(*args, **kwargs)
|
||||
|
||||
|
@ -460,8 +401,6 @@ class AdditionalGroup(TimeStampedModel, models.Model):
|
|||
:rtype: :py:class:`AdditionalGroup <osusers.models.AdditionalGroup>`
|
||||
|
||||
"""
|
||||
add_ldap_user_to_group.delay(
|
||||
self.user.username, self.group.groupname).get()
|
||||
return super(AdditionalGroup, self).save(*args, **kwargs)
|
||||
|
||||
@transaction.atomic
|
||||
|
@ -474,11 +413,6 @@ class AdditionalGroup(TimeStampedModel, models.Model):
|
|||
:param kwargs: keyword arguments to be passed on to
|
||||
:py:meth:`django.db.Model.delete`
|
||||
"""
|
||||
TaskResult.objects.create_task_result(
|
||||
remove_ldap_user_from_group.delay(
|
||||
self.user.username, self.group.groupname),
|
||||
'remove_ldap_user_from_group'
|
||||
)
|
||||
super(AdditionalGroup, self).delete(*args, **kwargs)
|
||||
|
||||
|
||||
|
@ -583,24 +517,3 @@ class SshPublicKey(TimeStampedModel):
|
|||
return "{algorithm} {data} {comment}".format(
|
||||
algorithm=self.algorithm, data=self.data, comment=self.comment
|
||||
).strip()
|
||||
|
||||
def save(self, **kwargs):
|
||||
key = super(SshPublicKey, self).save(**kwargs)
|
||||
TaskResult.objects.create_task_result(
|
||||
set_file_ssh_authorized_keys.delay(
|
||||
self.user.username, [
|
||||
str(key) for key in
|
||||
SshPublicKey.objects.filter(user=self.user)]),
|
||||
'set_file_ssh_authorized_keys'
|
||||
)
|
||||
return key
|
||||
|
||||
def delete(self, **kwargs):
|
||||
super(SshPublicKey, self).delete(**kwargs)
|
||||
TaskResult.objects.create_task_result(
|
||||
set_file_ssh_authorized_keys.delay(
|
||||
self.user.username, [
|
||||
str(key) for key in
|
||||
SshPublicKey.objects.filter(user=self.user)]),
|
||||
'set_file_ssh_authorized_keys'
|
||||
)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue