**List of steps to reproduce** (step by step, including full links if applicable):
* I was trying to migrate a cronjob from the Grid to toolforge-jobs. So I entered:
* toolforge-jobs run fer_efem --command /data/project/jorobot/periodics/efemerides/fer_efem.sh --image tf-bullseye-std --schedule "12 20 * * 3"
* I get an error, saying "likely wrong schedule time"
* So I retry the same command minus the --schedule option
* Then I get another error: likely an internal bug.
* After some thought, I replace the underscore in fer_efem with a hyphen.
* toolforge-jobs run fer-efem --command /data/project/jorobot/periodics/efemerides/fer_efem.sh --image tf-bullseye-std --schedule "2 21 * * 3"
* that gets accepted, so it must have been the underscore.
**What happens?**:
* The complete first error is:
** ERROR: unable to create job: "HTTP 422: likely wrong schedule time. k8s JSON: {\"apiVersion\": \"batch/v1beta1\", \"kind\": \"CronJob\", \"metadata\": {\"name\": \"fer_efem\", \"namespace\": \"tool-jorobot\", \"labels\": {\"toolforge\": \"tool\", \"app.kubernetes.io/version\": \"1\", \"app.kubernetes.io/managed-by\": \"toolforge-jobs-framework\", \"app.kubernetes.io/created-by\": \"jorobot\", \"app.kubernetes.io/component\": \"cronjobs\", \"app.kubernetes.io/name\": \"fer_efem\", \"jobs.toolforge.org/filelog\": \"yes\", \"jobs.toolforge.org/emails\": \"none\"}}, \"spec\": {\"schedule\": \"15 20 * * 3\", \"successfulJobsHistoryLimit\": 0, \"failedJobsHistoryLimit\": 0, \"concurrencyPolicy\": \"Forbid\", \"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\": \"jorobot\", \"app.kubernetes.io/component\": \"cronjobs\", \"app.kubernetes.io/name\": \"fer_efem\", \"jobs.toolforge.org/filelog\": \"yes\", \"jobs.toolforge.org/emails\": \"none\"}}, \"spec\": {\"restartPolicy\": \"Never\", \"containers\": [{\"name\": \"fer_efem\", \"image\": \"docker-registry.tools.wmflabs.org/toolforge-bullseye-standalone:latest\", \"workingDir\": \"/data/project/jorobot\", \"command\": [\"/bin/sh\", \"-c\", \"--\", \"/data/project/jorobot/periodics/efemerides/fer_efem.sh 1>>fer_efem.out 2>>fer_efem.err\"], \"resources\": {}, \"env\": [{\"name\": \"HOME\", \"value\": \"/data/project/jorobot\"}], \"volumeMounts\": [{\"mountPath\": \"/data/project\", \"name\": \"home\"}]}], \"volumes\": [{\"name\": \"home\", \"hostPath\": {\"path\": \"/data/project\", \"type\": \"Directory\"}}]}}, \"ttlSecondsAfterFinished\": 30, \"backoffLimit\": 1}}}}"```
ERROR: unable to create job: "HTTP 422: likely wrong schedule time. k8s JSON: {\"apiVersion\": \"batch/v1beta1\", \"kind\": \"CronJob\", \"metadata\": {\"name\": \"fer_efem\", \"namespace\": \"tool-jorobot\", \"labels\": {\"toolforge\": \"tool\", \"app.kubernetes.io/version\": \"1\", \"app.kubernetes.io/managed-by\": \"toolforge-jobs-framework\", \"app.kubernetes.io/created-by\": \"jorobot\", \"app.kubernetes.io/component\": \"cronjobs\", \"app.kubernetes.io/name\": \"fer_efem\", \"jobs.toolforge.org/filelog\": \"yes\", \"jobs.toolforge.org/emails\": \"none\"}}, \"spec\": {\"schedule\": \"15 20 * * 3\", \"successfulJobsHistoryLimit\": 0, \"failedJobsHistoryLimit\": 0, \"concurrencyPolicy\": \"Forbid\", \"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\": \"jorobot\", \"app.kubernetes.io/component\": \"cronjobs\", \"app.kubernetes.io/name\": \"fer_efem\", \"jobs.toolforge.org/filelog\": \"yes\", \"jobs.toolforge.org/emails\": \"none\"}}, \"spec\": {\"restartPolicy\": \"Never\", \"containers\": [{\"name\": \"fer_efem\", \"image\": \"docker-registry.tools.wmflabs.org/toolforge-bullseye-standalone:latest\", \"workingDir\": \"/data/project/jorobot\", \"command\": [\"/bin/sh\", \"-c\", \"--\", \"/data/project/jorobot/periodics/efemerides/fer_efem.sh 1>>fer_efem.out 2>>fer_efem.err\"], \"resources\": {}, \"env\": [{\"name\": \"HOME\", \"value\": \"/data/project/jorobot\"}], \"volumeMounts\": [{\"mountPath\": \"/data/project\", \"name\": \"home\"}]}], \"volumes\": [{\"name\": \"home\", \"hostPath\": {\"path\": \"/data/project\", \"type\": \"Directory\"}}]}}, \"ttlSecondsAfterFinished\": 30, \"backoffLimit\": 1}}}}"
```
```lang=json,lines=10
{
"apiVersion": "batch/v1beta1",
"kind": "CronJob",
"metadata": {
"name": "fer_efem",
"namespace": "tool-jorobot",
"labels": {
"toolforge": "tool",
"app.kubernetes.io/version": "1",
"app.kubernetes.io/managed-by": "toolforge-jobs-framework",
"app.kubernetes.io/created-by": "jorobot",
"app.kubernetes.io/component": "cronjobs",
"app.kubernetes.io/name": "fer_efem",
"jobs.toolforge.org/filelog": "yes",
"jobs.toolforge.org/emails": "none"
}
},
"spec": {
"schedule": "15 20 * * 3",
"successfulJobsHistoryLimit": 0,
"failedJobsHistoryLimit": 0,
"concurrencyPolicy": "Forbid",
"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": "jorobot",
"app.kubernetes.io/component": "cronjobs",
"app.kubernetes.io/name": "fer_efem",
"jobs.toolforge.org/filelog": "yes",
"jobs.toolforge.org/emails": "none"
}
},
"spec": {
"restartPolicy": "Never",
"containers": [
{
"name": "fer_efem",
"image": "docker-registry.tools.wmflabs.org/toolforge-bullseye-standalone:latest",
"workingDir": "/data/project/jorobot",
"command": [
"/bin/sh",
"-c",
"--",
"/data/project/jorobot/periodics/efemerides/fer_efem.sh 1>>fer_efem.out 2>>fer_efem.err"
],
"resources": {},
"env": [
{
"name": "HOME",
"value": "/data/project/jorobot"
}
],
"volumeMounts": [
{
"mountPath": "/data/project",
"name": "home"
}
]
}
],
"volumes": [
{
"name": "home",
"hostPath": {
"path": "/data/project",
"type": "Directory"
}
}
]
}
},
"ttlSecondsAfterFinished": 30,
"backoffLimit": 1
}
}
}
}
```
* The complete second error is:
** ERROR: unable to create job: "HTTP 422: likely an internal bug. k8s JSON: {\"apiVersion\": \"batch/v1\", \"kind\": \"Job\", \"metadata\": {\"name\": \"fer_efem\", \"namespace\": \"tool-jorobot\", \"labels\": {\"toolforge\": \"tool\", \"app.kubernetes.io/version\": \"1\", \"app.kubernetes.io/managed-by\": \"toolforge-jobs-framework\", \"app.kubernetes.io/created-by\": \"jorobot\", \"app.kubernetes.io/component\": \"jobs\", \"app.kubernetes.io/name\": \"fer_efem\", \"jobs.toolforge.org/filelog\": \"yes\", \"jobs.toolforge.org/emails\": \"none\"}}, \"spec\": {\"template\": {\"metadata\": {\"labels\": {\"toolforge\": \"tool\", \"app.kubernetes.io/version\": \"1\", \"app.kubernetes.io/managed-by\": \"toolforge-jobs-framework\", \"app.kubernetes.io/created-by\": \"jorobot\", \"app.kubernetes.io/component\": \"jobs\", \"app.kubernetes.io/name\": \"fer_efem\", \"jobs.toolforge.org/filelog\": \"yes\", \"jobs.toolforge.org/emails\": \"none\"}}, \"spec\": {\"restartPolicy\": \"Never\", \"containers\": [{\"name\": \"fer_efem\", \"image\": \"docker-registry.tools.wmflabs.org/toolforge-bullseye-standalone:latest\", \"workingDir\": \"/data/project/jorobot\", \"command\": [\"/bin/sh\", \"-c\", \"--\", \"/data/project/jorobot/periodics/efemerides/fer_efem.sh 1>>fer_efem.out 2>>fer_efem.err\"], \"resources\": {}, \"env\": [{\"name\": \"HOME\", \"value\": \"/data/project/jorobot\"}], \"volumeMounts\": [{\"mountPath\": \"/data/project\", \"name\": \"home\"}]}], \"volumes\": [{\"name\": \"home\", \"hostPath\": {\"path\": \"/data/project\", \"type\": \"Directory\"}}]}}, \"ttlSecondsAfterFinished\": 30, \"backoffLimit\": 1}}"
```
ERROR: unable to create job: "HTTP 422: likely an internal bug. k8s JSON: {\"apiVersion\": \"batch/v1\", \"kind\": \"Job\", \"metadata\": {\"name\": \"fer_efem\", \"namespace\": \"tool-jorobot\", \"labels\": {\"toolforge\": \"tool\", \"app.kubernetes.io/version\": \"1\", \"app.kubernetes.io/managed-by\": \"toolforge-jobs-framework\", \"app.kubernetes.io/created-by\": \"jorobot\", \"app.kubernetes.io/component\": \"jobs\", \"app.kubernetes.io/name\": \"fer_efem\", \"jobs.toolforge.org/filelog\": \"yes\", \"jobs.toolforge.org/emails\": \"none\"}}, \"spec\": {\"template\": {\"metadata\": {\"labels\": {\"toolforge\": \"tool\", \"app.kubernetes.io/version\": \"1\", \"app.kubernetes.io/managed-by\": \"toolforge-jobs-framework\", \"app.kubernetes.io/created-by\": \"jorobot\", \"app.kubernetes.io/component\": \"jobs\", \"app.kubernetes.io/name\": \"fer_efem\", \"jobs.toolforge.org/filelog\": \"yes\", \"jobs.toolforge.org/emails\": \"none\"}}, \"spec\": {\"restartPolicy\": \"Never\", \"containers\": [{\"name\": \"fer_efem\", \"image\": \"docker-registry.tools.wmflabs.org/toolforge-bullseye-standalone:latest\", \"workingDir\": \"/data/project/jorobot\", \"command\": [\"/bin/sh\", \"-c\", \"--\", \"/data/project/jorobot/periodics/efemerides/fer_efem.sh 1>>fer_efem.out 2>>fer_efem.err\"], \"resources\": {}, \"env\": [{\"name\": \"HOME\", \"value\": \"/data/project/jorobot\"}], \"volumeMounts\": [{\"mountPath\": \"/data/project\", \"name\": \"home\"}]}], \"volumes\": [{\"name\": \"home\", \"hostPath\": {\"path\": \"/data/project\", \"type\": \"Directory\"}}]}}, \"ttlSecondsAfterFinished\": 30, \"backoffLimit\": 1}}"
```
```lang=json,lines=10
{
"apiVersion": "batch/v1",
"kind": "Job",
"metadata": {
"name": "fer_efem",
"namespace": "tool-jorobot",
"labels": {
"toolforge": "tool",
"app.kubernetes.io/version": "1",
"app.kubernetes.io/managed-by": "toolforge-jobs-framework",
"app.kubernetes.io/created-by": "jorobot",
"app.kubernetes.io/component": "jobs",
"app.kubernetes.io/name": "fer_efem",
"jobs.toolforge.org/filelog": "yes",
"jobs.toolforge.org/emails": "none"
}
},
"spec": {
"template": {
"metadata": {
"labels": {
"toolforge": "tool",
"app.kubernetes.io/version": "1",
"app.kubernetes.io/managed-by": "toolforge-jobs-framework",
"app.kubernetes.io/created-by": "jorobot",
"app.kubernetes.io/component": "jobs",
"app.kubernetes.io/name": "fer_efem",
"jobs.toolforge.org/filelog": "yes",
"jobs.toolforge.org/emails": "none"
}
},
"spec": {
"restartPolicy": "Never",
"containers": [
{
"name": "fer_efem",
"image": "docker-registry.tools.wmflabs.org/toolforge-bullseye-standalone:latest",
"workingDir": "/data/project/jorobot",
"command": [
"/bin/sh",
"-c",
"--",
"/data/project/jorobot/periodics/efemerides/fer_efem.sh 1>>fer_efem.out 2>>fer_efem.err"
],
"resources": {},
"env": [
{
"name": "HOME",
"value": "/data/project/jorobot"
}
],
"volumeMounts": [
{
"mountPath": "/data/project",
"name": "home"
}
]
}
],
"volumes": [
{
"name": "home",
"hostPath": {
"path": "/data/project",
"type": "Directory"
}
}
]
}
},
"ttlSecondsAfterFinished": 30,
"backoffLimit": 1
}
}
```
**What should have happened instead?**:
* I think that underscores should be accepted in the job name.
* If this is not possible, the error message should at least be helpful and suggest replacing the underscore by a hyphen.
**Software version (if not a Wikimedia wiki), browser information, screenshots, other information, etc.**:
This was in tools.jorobot@tools-sgebastion-10:~$