{"record":{"id":"067e4c47e9d9dc5c","repo":"elastic/elasticsearch","slug":"invalid-deploymenttarget-expected-one-of","errorCode":null,"errorMessage":"invalid deploymentTarget '{}', expected one of {}","messagePattern":"invalid deploymentTarget '(.+?)', expected one of (.+?)","errorType":"validation","errorClass":"InvalidUserDataException","httpStatus":null,"severity":"error","filePath":"build-tools/src/main/java/org/elasticsearch/gradle/plugin/GeneratePluginPropertiesTask.java","lineNumber":135,"sourceCode":"        }\n\n        Map<String, Object> props = new HashMap<>();\n        props.put(\"name\", getPluginName().get());\n        props.put(\"description\", getPluginDescription().get());\n        props.put(\"version\", getPluginVersion().get());\n        props.put(\"elasticsearchVersion\", getElasticsearchVersion().get());\n        props.put(\"javaVersion\", getJavaVersion().get());\n        props.put(\"classname\", classname);\n        props.put(\"extendedPlugins\", String.join(\",\", getExtendedPlugins().get()));\n        props.put(\"hasNativeController\", getHasNativeController().get());\n        props.put(\"nativeControllerEnabledSettings\", String.join(\",\", getNativeControllerEnabledSettings().get()));\n        props.put(\"requiresKeystore\", getRequiresKeystore().get());\n        props.put(\"licensed\", getIsLicensed().get());\n        props.put(\"modulename\", findModuleName());\n\n        String deploymentTarget = getDeploymentTarget().getOrElse(\"ALL\");\n        if (DEPLOYMENT_TARGETS.contains(deploymentTarget) == false) {\n            throw new InvalidUserDataException(\n                \"invalid deploymentTarget '\" + deploymentTarget + \"', expected one of \" + DEPLOYMENT_TARGETS\n            );\n        }\n        props.put(\"deploymentTarget\", deploymentTarget);\n\n        SimpleTemplateEngine engine = new SimpleTemplateEngine();\n        Path outputFile = getOutputFile().get().getAsFile().toPath();\n        Files.createDirectories(outputFile.getParent());\n        try (\n            var inputStream = GeneratePluginPropertiesTask.class.getResourceAsStream(\"/\" + PROPERTIES_FILENAME);\n            var reader = new BufferedReader(new InputStreamReader(inputStream));\n            var writer = Files.newBufferedWriter(outputFile, StandardCharsets.UTF_8)\n        ) {\n            Template template = engine.createTemplate(reader);\n            template.make(props).writeTo(writer);\n        }\n    }\n","sourceCodeStart":117,"sourceCodeEnd":153,"githubUrl":"https://github.com/elastic/elasticsearch/blob/db6a809a667c081ca1dc7500389d26975573215f/build-tools/src/main/java/org/elasticsearch/gradle/plugin/GeneratePluginPropertiesTask.java#L117-L153","documentation":"Thrown when deploymentTarget on an esplugin is not one of ALL, STATELESS_ONLY, STATEFUL_ONLY (the DEPLOYMENT_TARGETS set). Defaults to \"ALL\" when unset, so this only fires when explicitly set to an invalid value. deploymentTarget controls whether the plugin is loaded by stateful clusters, stateless clusters, or both.","triggerScenarios":"esplugin { deploymentTarget = 'STATELESS' } (missing _ONLY suffix), or any typo / case variation. The guard runs late in generatePropertiesFile after getDeploymentTarget().getOrElse(\"ALL\").","commonSituations":"Migrating a plugin to support stateless mode and guessing the enum value, or using a value from an older/newer branch where the constant set differs.","solutions":["Set deploymentTarget to exactly one of: 'ALL', 'STATELESS_ONLY', 'STATEFUL_ONLY' (uppercase, with _ONLY suffix).","If unsure, omit deploymentTarget entirely — it defaults to 'ALL' and the plugin loads everywhere.","Re-check DEPLOYMENT_TARGETS in GeneratePluginPropertiesTask if you are on a fork that extended the set."],"exampleFix":"// before\nesplugin {\n  deploymentTarget = 'STATELESS'\n}\n\n// after\nesplugin {\n  deploymentTarget = 'STATELESS_ONLY'\n}","handlingStrategy":"validation","validationCode":"Set<String> allowed = Set.of(\"ALL\", \"STATELESS_ONLY\", \"STATEFUL_ONLY\");\nString target = deploymentTarget; // value to set\nif (!allowed.contains(target)) {\n    throw new IllegalArgumentException(\"deploymentTarget must be one of \" + allowed);\n}\nesplugin { deploymentTarget = target }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Source deploymentTarget from an enum or constant rather than a raw string.","Omit deploymentTarget when unsure — the default 'ALL' is safe.","Cross-check against DEPLOYMENT_TARGETS in GeneratePluginPropertiesTask on branch upgrades."],"tags":["build","plugin","configuration","stateless","validation"],"backgroundTag":null,"analyzedSha":"db6a809a667c081ca1dc7500389d26975573215f","analyzedAt":"2026-08-12T01:39:14.192Z","schemaVersion":2},"datasetVersion":"2026-08-12T12:31:55.035Z"}