def delete(self, user, force=False):
"""Release all user's resources and mark user as deleted.
:param user: user id, username or kuberdock.users.models.User object
:param force: if True, will not raise ResourceReleaseError
:raises ResourceReleaseError: if couldn't release some resources
:raises APIError: if user was not found
"""
user = self._convert_user(user)
self._is_deletable(user, raise_=True)
uid = user.id
user.logout(commit=False)
pod_collection = PodCollection(user)
for pod in pod_collection.get(as_json=False):
pod_collection.delete(pod['id'])
# Now, when we have deleted all pods, events will rape db session a
# little bit.
# Get new, clean user instance to prevent a lot of various SA errors
user = User.get(uid)
# Add some delay for deleting drives to allow kubernetes unmap drives
# after a pod was deleted. Also in some cases this delay is not enough,
# for example DBMS in container may save data to PD for a long time.
# So there is a regular procedure to clean such undeleted drives
# tasks.clean_drives_for_deleted_users.
for pd in user.persistent_disks:
PersistentStorage.end_stat(pd.name, user.id)
delete_persistent_drives_task.apply_async(
([pd.id for pd in user.persistent_disks],),
countdown=10
)
prefix = '__' + generate()
user.username += prefix
user.email += prefix
user.deleted = True
try:
db.session.commit()
except (IntegrityError, InvalidRequestError), e:
db.session.rollback()
raise APIError('Cannot delete a user: {0}'.format(str(e)), 500)
评论列表
文章目录