create_experiment_workspace fails with an exception when the workspace / group name does already exist
We recently got this exception notified by email:
Exception in Task create_experiment_workspace
IntegrityError
duplicate key value violates unique constraint "db_group_unique_name_scope"
DETAIL: Key (name, scope_id)=(developers-tobi_log4cxx_test, 1) already exists.
[…]
The above exception (duplicate key value violates unique constraint "db_group_unique_name_scope"
DETAIL: Key (name, scope_id)=(developers-tobi_log4cxx_test, 1) already exists.
) was the direct cause of the following exception:
File "/usr/lib/python3/dist-packages/debusine/tasks/_task.py", line 542, in execute_logging_exceptions
return self.execute()
^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/debusine/server/tasks/base.py", line 74, in execute
return super().execute()
^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/debusine/tasks/_task.py", line 555, in execute
result = self._execute()
^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/debusine/server/tasks/create_experiment_workspace.py", line 72,
in _execute
owner_group = Group.objects.create_ephemeral(
File "/usr/lib/python3/dist-packages/debusine/db/models/auth.py", line 437, in create_ephemeral
group = self.create(scope=scope, name=name, ephemeral=True)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/django/db/models/manager.py", line 87, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/django/db/models/query.py", line 658, in create
obj.save(force_insert=True, using=self.db)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/debusine/db/models/auth.py", line 528, in save
super().save(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/django/db/models/base.py", line 814, in save
self.save_base(
^
File "/usr/lib/python3/dist-packages/django/db/models/base.py", line 877, in save_base
updated = self._save_table(
File "/usr/lib/python3/dist-packages/django/db/models/base.py", line 1020, in _save_table
results = self._do_insert(
File "/usr/lib/python3/dist-packages/django/db/models/base.py", line 1061, in _do_insert
return manager._insert(
File "/usr/lib/python3/dist-packages/django/db/models/manager.py", line 87, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/django/db/models/query.py", line 1805, in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/django/db/models/sql/compiler.py", line 1822, in execute_sql
cursor.execute(sql, params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/django/db/backends/utils.py", line 67, in execute
return self._execute_with_wrappers(
File "/usr/lib/python3/dist-packages/django/db/backends/utils.py", line 80, in _execute_with_wrappers
return executor(sql, params, many, context)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/django/db/backends/utils.py", line 84, in _execute
with self.db.wrap_database_errors:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/django/db/utils.py", line 91, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/django/db/backends/utils.py", line 89, in _execute
return self.cursor.execute(sql, params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/cc @tobi