Similar to T305592, putting a "." in a job name gives an unhelpful error message.
To reproduce on tools-sgebastion-11
As a one-off job:
$ toolforge-jobs run bad.job.name --command /usr/bin/date --image tf-python39 ERROR: unable to create job: "HTTP 422: likely an internal bug. k8s JSON: {\"apiVersion\": \"batch/v1\", \"kind\": \"Job\", \"metadata\": {\"name\": \"bad.job.name\", \"namespace\": \"tool-dyk-tools\", \"labels\": {\"toolforge\": \"tool\", \"app.kubernetes.io/version\": \"1\", \"app.kubernetes.io/managed-by\": \"toolforge-jobs-framework\", \"app.kubernetes.io/created-by\": \"dyk-tools\", \"app.kubernetes.io/component\": \"jobs\", \"app.kubernetes.io/name\": \"bad.job.name\", \"jobs.toolforge.org/filelog\": \"yes\", \"jobs.toolforge.org/emails\": \"none\", \"jobs.toolforge.org/command-new-format\": \"yes\"}}, \"spec\": {\"template\": {\"metadata\": {\"labels\": {\"toolforge\": \"tool\", \"app.kubernetes.io/version\": \"1\", \"app.kubernetes.io/managed-by\": \"toolforge-jobs-framework\", \"app.kubernetes.io/created-by\": \"dyk-tools\", \"app.kubernetes.io/component\": \"jobs\", \"app.kubernetes.io/name\": \"bad.job.name\", \"jobs.toolforge.org/filelog\": \"yes\", \"jobs.toolforge.org/emails\": \"none\", \"jobs.toolforge.org/command-new-format\": \"yes\"}}, \"spec\": {\"restartPolicy\": \"Never\", \"containers\": [{\"name\": \"bad.job.name\", \"image\": \"docker-registry.tools.wmflabs.org/toolforge-python39-sssd-base:latest\", \"workingDir\": \"/data/project/dyk-tools\", \"command\": [\"/bin/sh\", \"-c\", \"--\", \"exec 1>>bad.job.name.out;exec 2>>bad.job.name.err;/usr/bin/date\"], \"resources\": {}}]}}, \"ttlSecondsAfterFinished\": 30, \"backoffLimit\": 0}}"
As a scheduled job:
$ toolforge-jobs run bad.job.name --command /usr/bin/date --image tf-python39 --schedule "1 * * * *" ERROR: unable to create job: "HTTP 422: likely wrong schedule time. k8s JSON: {\"apiVersion\": \"batch/v1\", \"kind\": \"CronJob\", \"metadata\": {\"name\": \"bad.job.name\", \"namespace\": \"tool-dyk-tools\", \"labels\": {\"toolforge\": \"tool\", \"app.kubernetes.io/version\": \"1\", \"app.kubernetes.io/managed-by\": \"toolforge-jobs-framework\", \"app.kubernetes.io/created-by\": \"dyk-tools\", \"app.kubernetes.io/component\": \"cronjobs\", \"app.kubernetes.io/name\": \"bad.job.name\", \"jobs.toolforge.org/filelog\": \"yes\", \"jobs.toolforge.org/emails\": \"none\", \"jobs.toolforge.org/command-new-format\": \"yes\"}}, \"spec\": {\"schedule\": \"1 * * * *\", \"successfulJobsHistoryLimit\": 0, \"failedJobsHistoryLimit\": 0, \"concurrencyPolicy\": \"Forbid\", \"startingDeadlineSeconds\": 30, \"jobTemplate\": {\"spec\": {\"template\": {\"metadata\": {\"labels\": {\"toolforge\": \"tool\", \"app.kubernetes.io/version\": \"1\", \"app.kubernetes.io/managed-by\": \"toolforge-jobs-framework\", \"app.kubernetes.io/created-by\": \"dyk-tools\", \"app.kubernetes.io/component\": \"cronjobs\", \"app.kubernetes.io/name\": \"bad.job.name\", \"jobs.toolforge.org/filelog\": \"yes\", \"jobs.toolforge.org/emails\": \"none\", \"jobs.toolforge.org/command-new-format\": \"yes\"}}, \"spec\": {\"restartPolicy\": \"Never\", \"containers\": [{\"name\": \"bad.job.name\", \"image\": \"docker-registry.tools.wmflabs.org/toolforge-python39-sssd-base:latest\", \"workingDir\": \"/data/project/dyk-tools\", \"command\": [\"/bin/sh\", \"-c\", \"--\", \"exec 1>>bad.job.name.out;exec 2>>bad.job.name.err;/usr/bin/date\"], \"resources\": {}}]}}, \"ttlSecondsAfterFinished\": 30, \"backoffLimit\": 0}}}}"
In both cases, toolforge-jobs should produce a useful diagnostic such as:
"bad.job.name" is not a valid k8s job name
It would be even better if it could say why it wasn't valid, but even this would be better than what it does now. Likewise for any other invalid characters, not just dot.