{"record":{"id":"7e5bf56585d31808","repo":"apache/beam","slug":"secret-name-must-be-specified-in-secret-spec","errorCode":null,"errorMessage":"Secret name must be specified in secret spec.","messagePattern":"Secret name must be specified in secret spec\\.","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"sdks/java/extensions/google-cloud-platform-core/src/main/java/org/apache/beam/sdk/extensions/gcp/util/GcpSecret.java","lineNumber":82,"sourceCode":"      List<String> sortedInvalid = new ArrayList<>(invalidKeys);\n      Collections.sort(sortedInvalid);\n      throw new IllegalArgumentException(\n          \"Invalid secret parameter \" + String.join(\", \", sortedInvalid));\n    }\n    String versionName = parseVersionName(specMap);\n    return new GcpSecret(versionName);\n  }\n\n  /** Parses the version name from a specification dictionary. */\n  private static String parseVersionName(Map<String, String> specMap) {\n    String versionNameParam = specMap.get(\"version_name\");\n    if (!Strings.isNullOrEmpty(versionNameParam)) {\n      return Preconditions.checkNotNull(\n          versionNameParam, \"version_name must contain a valid value for versionName parameter\");\n    }\n    String secretId = specMap.get(\"name\");\n    if (Strings.isNullOrEmpty(secretId)) {\n      throw new IllegalArgumentException(\"Secret name must be specified in secret spec.\");\n    }\n    String projectId = resolveGcpProjectId(specMap.get(\"project\"), \"secret '\" + secretId + \"'\");\n    String versionId = specMap.getOrDefault(\"version\", \"latest\");\n    if (Strings.isNullOrEmpty(versionId)) {\n      versionId = \"latest\";\n    }\n    return String.format(\"projects/%s/secrets/%s/versions/%s\", projectId, secretId, versionId);\n  }\n\n  /**\n   * Resolves the GCP project ID from the provided value, environment variables, or Application\n   * Default Credentials.\n   */\n  static String resolveGcpProjectId(@Nullable String projectId, @Nullable String context) {\n    if (!Strings.isNullOrEmpty(projectId)) {\n      return Preconditions.checkNotNull(projectId);\n    }\n    String envProject = System.getenv(\"GOOGLE_CLOUD_PROJECT\");","sourceCodeStart":64,"sourceCodeEnd":100,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/extensions/google-cloud-platform-core/src/main/java/org/apache/beam/sdk/extensions/gcp/util/GcpSecret.java#L64-L100","documentation":"GcpSecret.parseVersionName builds a SecretVersionName from the spec. If no version_name is given and the 'name' key is missing or empty, it throws IllegalArgumentException 'Secret name must be specified in secret spec.' — a spec must identify either a full version name or a secret name to resolve.","triggerScenarios":"Calling GcpSecret.fromMap with an empty map, a spec with only 'project'/'version', or a spec whose 'name' value is empty string.","commonSituations":"Templated/config-driven specs where the name substitution failed and resolved to empty; hand-written specs omitting 'name'.","solutions":["Add \"name\": \"<secret-id>\" to the spec","Or provide \"version_name\": \"projects/P/secrets/S/versions/V\" instead","Check the templating/config source that produced an empty name"],"exampleFix":"// before\nMap<String,String> spec = Map.of(\"project\",\"p\");\n// after\nMap<String,String> spec = Map.of(\"project\",\"p\",\"name\",\"my-secret\");","handlingStrategy":"validation","validationCode":"if (!spec.containsKey(\"version_name\") && Strings.isNullOrEmpty(spec.get(\"name\"))) {\n  throw new IllegalArgumentException(\"secret spec needs either version_name or name\");\n}","typeGuard":null,"tryCatchPattern":"try { GcpSecret.fromMap(spec); } catch (IllegalArgumentException e) { fail(\"Secret spec incomplete: \" + e.getMessage()); }","preventionTips":["Fail fast when templated specs render with empty values","Require 'name' in your config schema for GCP secret specs","Log the full spec (redacted) on failure to spot empty substitutions"],"tags":["gcp","secret-manager","missing-argument","java"],"backgroundTag":"missing-required-argument","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}