{"record":{"id":"d6111170c0ad504f","repo":"apache/pulsar","slug":"kubernetes-does-not-allow-upper-case-jobnames","errorCode":null,"errorMessage":"Kubernetes does not allow upper case jobNames.","messagePattern":"Kubernetes does not allow upper case jobNames\\.","errorType":"validation","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/kubernetes/KubernetesRuntime.java","lineNumber":1164,"sourceCode":"        final String jobNameBase = String.format(\"%s-%s-%s\", tenant, namespace, functionName);\n        final String jobName = \"pf-\" + jobNameBase;\n        final String convertedJobName = toValidPodName(jobName);\n        if (jobName.equals(convertedJobName)) {\n            return jobName;\n        }\n        // toValidPodName may cause naming collisions, add a short hash here to avoid it\n        final String shortHash = DigestUtils.sha1Hex(jobNameBase).toLowerCase().substring(0, 8);\n        return convertedJobName + \"-\" + shortHash;\n    }\n    @VisibleForTesting\n    String getServiceUrl(String jobName, String jobNamespace, int instanceId) {\n        String suffix = isNotBlank(kubernetesServiceDomainSuffix) ? kubernetesServiceDomainSuffix : \"svc.cluster.local\";\n        return String.format(\"%s-%d.%s.%s.%s\", jobName, instanceId, jobName, jobNamespace, suffix);\n    }\n    public static void doChecks(FunctionDetails functionDetails, String overridenJobName) {\n        final String jobName = createJobName(functionDetails, overridenJobName);\n        if (!jobName.equals(jobName.toLowerCase())) {\n            throw new RuntimeException(\"Kubernetes does not allow upper case jobNames.\");\n        }\n        final Matcher matcher = VALID_POD_NAME_REGEX.matcher(jobName);\n        if (!matcher.matches()) {\n            throw new RuntimeException(\"Kubernetes only admits lower case and numbers. \"\n                    + \"(jobName=\" + jobName + \")\");\n        }\n        if (jobName.length() > maxJobNameSize) {\n            throw new RuntimeException(\"Kubernetes job name size should be less than \" + maxJobNameSize);\n        }\n    }\n}\n","sourceCodeStart":1146,"sourceCodeEnd":1176,"githubUrl":"https://github.com/apache/pulsar/blob/820761864ed8e2a7d2e52dd9763ad2ae117c1395/pulsar-functions/runtime/src/main/java/org/apache/pulsar/functions/runtime/kubernetes/KubernetesRuntime.java#L1146-L1176","documentation":"KubernetesRuntime.doChecks() validates the derived job name because Kubernetes resource names must be RFC-1123 DNS labels (lowercase). If the job name (derived from tenant/namespace/function names or an overridden job name) contains uppercase characters, a RuntimeException is thrown before any k8s call.","triggerScenarios":"Function metadata (tenant, namespace, name) or the overridden job name contains uppercase letters, producing a jobName like \"MyFunction\"; doChecks() rejects it via jobName.equals(jobName.toLowerCase()).","commonSituations":"Users create functions with CamelCase names; cluster-level custom job name overrides include capitals; older clients allowed names Kubernetes rejects.","solutions":["Rename the function using only lowercase letters, numbers, and '-'.","If using an overridden job name, change it to lowercase.","Where renaming is impossible, configure a sanitized/translated job name (the runtime normally translates invalid chars — check the name isn't bypassing translation)."],"exampleFix":"// before\nfunctions create --name MyFunction ...\n// after\nfunctions create --name my-function ...","handlingStrategy":"validation","validationCode":"String jobName = tenant + \"-\" + namespace + \"-\" + functionName;\nif (!jobName.equals(jobName.toLowerCase())) {\n    throw new IllegalArgumentException(\"Function/job name must be lowercase for Kubernetes: \" + jobName);\n}","typeGuard":"static boolean isValidK8sName(String name) {\n    return name != null && name.equals(name.toLowerCase());\n}","tryCatchPattern":"try {\n    functions.create(request);\n} catch (RuntimeException e) {\n    if (e.getMessage().contains(\"upper case jobNames\")) {\n        log.error(\"Rename function to lowercase: {}\", e.getMessage());\n    }\n    throw e;\n}","preventionTips":["Use lowercase-only function, tenant, and namespace names","Avoid CamelCase in function metadata","If overrides are used, ensure the overridden job name is lowercase","Validate names client-side before submitting functions"],"tags":["kubernetes","functions-runtime","naming"],"backgroundTag":"invalid-kubernetes-resource-name","analyzedSha":"820761864ed8e2a7d2e52dd9763ad2ae117c1395","analyzedAt":"2026-09-06T00:14:20.138Z","contentChangedAt":"2026-09-06T00:14:20.138Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}