Sometimes maintain-dbusers tries to provision an account before maintain-kubeusers has had the chance to create the Kubernetes namespace and credentials. When that happens, the service on NFS nodes 500s with this:
Apr 23 07:15:37 tools-nfs-3 uwsgi-toolsdb-replica-cnf-web[1267]: [2026-04-23 07:15:37,122] ERROR in app: Exception on /v1/write-replica-cnf [POST] Apr 23 07:15:37 tools-nfs-3 uwsgi-toolsdb-replica-cnf-web[1267]: Traceback (most recent call last): Apr 23 07:15:37 tools-nfs-3 uwsgi-toolsdb-replica-cnf-web[1267]: File "/usr/lib/python3/dist-packages/flask/app.py", line 1511, in wsgi_app Apr 23 07:15:37 tools-nfs-3 uwsgi-toolsdb-replica-cnf-web[1267]: response = self.full_dispatch_request() Apr 23 07:15:37 tools-nfs-3 uwsgi-toolsdb-replica-cnf-web[1267]: File "/usr/lib/python3/dist-packages/flask/app.py", line 919, in full_dispatch_request Apr 23 07:15:37 tools-nfs-3 uwsgi-toolsdb-replica-cnf-web[1267]: rv = self.handle_user_exception(e) Apr 23 07:15:37 tools-nfs-3 uwsgi-toolsdb-replica-cnf-web[1267]: File "/usr/lib/python3/dist-packages/flask/app.py", line 917, in full_dispatch_request Apr 23 07:15:37 tools-nfs-3 uwsgi-toolsdb-replica-cnf-web[1267]: rv = self.dispatch_request() Apr 23 07:15:37 tools-nfs-3 uwsgi-toolsdb-replica-cnf-web[1267]: File "/usr/lib/python3/dist-packages/flask/app.py", line 902, in dispatch_request Apr 23 07:15:37 tools-nfs-3 uwsgi-toolsdb-replica-cnf-web[1267]: return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] Apr 23 07:15:37 tools-nfs-3 uwsgi-toolsdb-replica-cnf-web[1267]: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^ Apr 23 07:15:37 tools-nfs-3 uwsgi-toolsdb-replica-cnf-web[1267]: File "/home/www-data/replica_cnf_api_service/replica_cnf_api_service/views.py", line 220, in write_replica_cnf Apr 23 07:15:37 tools-nfs-3 uwsgi-toolsdb-replica-cnf-web[1267]: new_replica_cnf = backend.save_replica_cnf( Apr 23 07:15:37 tools-nfs-3 uwsgi-toolsdb-replica-cnf-web[1267]: replica_cnf=replica_cnf, Apr 23 07:15:37 tools-nfs-3 uwsgi-toolsdb-replica-cnf-web[1267]: account_uid=uid, Apr 23 07:15:37 tools-nfs-3 uwsgi-toolsdb-replica-cnf-web[1267]: dry_run=dry_run, Apr 23 07:15:37 tools-nfs-3 uwsgi-toolsdb-replica-cnf-web[1267]: ) Apr 23 07:15:37 tools-nfs-3 uwsgi-toolsdb-replica-cnf-web[1267]: File "/home/www-data/replica_cnf_api_service/replica_cnf_api_service/backends/envvars_backend.py", line 86, in save_replica_cnf Apr 23 07:15:37 tools-nfs-3 uwsgi-toolsdb-replica-cnf-web[1267]: cli = self._get_user_client(user_name=replica_cnf.user) Apr 23 07:15:37 tools-nfs-3 uwsgi-toolsdb-replica-cnf-web[1267]: File "/home/www-data/replica_cnf_api_service/replica_cnf_api_service/backends/envvars_backend.py", line 61, in _get_user_client Apr 23 07:15:37 tools-nfs-3 uwsgi-toolsdb-replica-cnf-web[1267]: raise RuntimeError( Apr 23 07:15:37 tools-nfs-3 uwsgi-toolsdb-replica-cnf-web[1267]: ...<3 lines>... Apr 23 07:15:37 tools-nfs-3 uwsgi-toolsdb-replica-cnf-web[1267]: ) Apr 23 07:15:37 tools-nfs-3 uwsgi-toolsdb-replica-cnf-web[1267]: RuntimeError: Unable to get kubeconfig for user 'tools.snowybot': Apr 23 07:15:37 tools-nfs-3 uwsgi-toolsdb-replica-cnf-web[1267]: out:b'' Apr 23 07:15:37 tools-nfs-3 uwsgi-toolsdb-replica-cnf-web[1267]: err:b'Traceback (most recent call last):\n File "/usr/local/bin/load_user_kubeconfig.py", line 77, in <module>\n main()\n ~~~~^^\n File "/usr/lib/python3/dist-packages/click/core.py", line 1161, in __call__\n return self.main(*args, **kwargs)\n ~~~~~~~~~^^^^^^^^^^^^^^^^^\n File "/usr/lib/python3/dist-packages/click/core.py", line 1082, in main\n rv = self.invoke(ctx)\n File "/usr/lib/python3/dist-packages/click/core.py", line 1443, in invoke\n return ctx.invoke(self.callback, **ctx.params)\n ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File "/usr/lib/python3/dist-packages/click/core.py", line 788, in invoke\n return __callback(*args, **kwargs)\n File "/usr/local/bin/load_user_kubeconfig.py", line 53, in main\n kubeconfig = Kubeconfig.load(path=Path(kubeconfig_path))\n File "/usr/lib/python3/dist-packages/toolforge_weld/kubernetes_config.py", line 98, in load\n raise KubernetesConfigFileNotFoundException(str(path.resolve()))\ntoolforge_weld.kubernetes_config.KubernetesConfigFileNotFoundException: /srv/tools/project/snowybot/.kube/config\n'
That, in turn, results in the maintain-dbusers error alert firing. The app should handle this case gracefully instead.