Skip to content

Commit 2e965c5

Browse files
jianxiaoguoduanhongyi
authored andcommitted
chore(controller): transfer app ownership in async
1 parent bbba3a4 commit 2e965c5

2 files changed

Lines changed: 24 additions & 8 deletions

File tree

rootfs/api/tasks.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from django.core import signals
77
from celery import shared_task
88

9-
from api import manager
9+
from api import manager, models
1010
from api.exceptions import ServiceUnavailable
1111
from api.models.resource import Resource
1212
logger = logging.getLogger(__name__)
@@ -107,3 +107,24 @@ def mount_app(app, user, volume):
107107
raise e
108108
else:
109109
signals.request_finished.send(sender=task_id)
110+
111+
112+
@shared_task(
113+
retry_kwargs={'max_retries': None}
114+
)
115+
def downstream_model_owner(app, old_owner, new_owner):
116+
task_id = uuid.uuid4().hex
117+
signals.request_started.send(sender=task_id)
118+
try:
119+
for downstream_model in [
120+
models.appsettings.AppSettings, models.build.Build, models.certificate.Certificate,
121+
models.config.Config, models.domain.Domain, models.key.Key, models.release.Release,
122+
models.resource.Resource, models.tls.TLS, models.service.Service,
123+
models.volume.Volume, models.gateway.Gateway, models.gateway.Route]:
124+
downstream_model.objects.filter(owner=old_owner, app=app).update(owner=new_owner)
125+
app.owner = new_owner
126+
app.save()
127+
except Exception as e:
128+
signals.got_request_exception.send(sender=task_id)
129+
else:
130+
signals.request_finished.send(sender=task_id)

rootfs/api/views.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
from rest_framework.viewsets import GenericViewSet
2020

2121
from api import monitor, models, permissions, serializers, viewsets, authentication
22-
from api.tasks import scale_app, restart_app, mount_app
22+
from api.tasks import scale_app, restart_app, mount_app, downstream_model_owner
2323
from api.exceptions import AlreadyExists, ServiceUnavailable, DryccException, \
2424
UnprocessableEntity
2525

@@ -281,14 +281,9 @@ def update(self, request, **kwargs):
281281
if self.request.user != app.owner and not self.request.user.is_superuser:
282282
raise PermissionDenied()
283283
new_owner = get_object_or_404(User, username=request.data['owner'])
284-
app.owner = new_owner
285284
# ensure all downstream objects that are owned by this user and are part of this app
286285
# is also updated
287-
for downstream_model in [
288-
models.appsettings.AppSettings, models.build.Build, models.config.Config,
289-
models.domain.Domain, models.release.Release, models.tls.TLS]:
290-
downstream_model.objects.filter(owner=old_owner, app=app).update(owner=new_owner)
291-
app.save()
286+
downstream_model_owner.delay(app, old_owner, new_owner)
292287
return Response(status=status.HTTP_200_OK)
293288

294289

0 commit comments

Comments
 (0)