{"record":{"id":"1b25827188c2ca4d","repo":"pulumi/pulumi","slug":"creating-environment-draft-w","errorCode":null,"errorMessage":"creating environment draft: %w","messagePattern":"creating environment draft: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/cmd/esc/cli/env.go","lineNumber":473,"sourceCode":"func (esc *escCommand) updateEnvironment(\n\tctx context.Context,\n\tref environmentRef,\n\tdraft string,\n\tyaml []byte,\n\ttag string,\n\tenvUpdateSuccessMessage string,\n) ([]client.EnvironmentDiagnostic, error) {\n\tif draft == \"new\" {\n\t\tchangeRequestID, diags, err := esc.client.CreateEnvironmentDraft(\n\t\t\tctx,\n\t\t\tref.orgName,\n\t\t\tref.projectName,\n\t\t\tref.envName,\n\t\t\tyaml,\n\t\t\ttag,\n\t\t)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"creating environment draft: %w\", err)\n\t\t}\n\t\tif !client.DiagnosticsHaveErrors(diags) {\n\t\t\tfmt.Fprintf(esc.stdout, \"Change request created: %v\\n\", changeRequestID)\n\t\t\tfmt.Fprintf(esc.stdout, \"Change request URL: %v\\n\", esc.changeRequestURL(ref, changeRequestID))\n\n\t\t\terr = esc.client.SubmitChangeRequest(ctx, ref.orgName, changeRequestID, nil)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"submitting change request: %w\", err)\n\t\t\t}\n\t\t\tfmt.Fprintln(esc.stdout, \"Change request submitted\")\n\t\t}\n\t\treturn diags, nil\n\t} else if draft != \"\" {\n\t\tchangeRequestID := draft\n\t\tdiags, err := esc.client.UpdateEnvironmentDraft(ctx, ref.orgName, ref.projectName, ref.envName, changeRequestID, yaml, tag) //nolint:lll\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"updating environment draft: %w\", err)\n\t\t}","sourceCodeStart":455,"sourceCodeEnd":491,"githubUrl":"https://github.com/pulumi/pulumi/blob/793f7b2e160db4321fb7fb6b0607461e01cb251e/pkg/cmd/esc/cli/env.go#L455-L491","documentation":"updateEnvironment wraps errors from client.CreateEnvironmentDraft with this message when a change-request flow is used (a draft must be created before proposing changes). The inner error comes from the ESC cloud API failing to create the draft.","triggerScenarios":"Calling `esc env set`-style updates when a change request is required (or requested), and the client.CreateEnvironmentDraft call returns an error — e.g. the environment/org doesn't exist, permission denied, or network failure.","commonSituations":"User lacks permission to create drafts in the org/project; environment name/project typo; API outage or rate limiting during draft creation.","solutions":["Check the wrapped inner error for the root cause (permissions, 404, network)","Verify you have write/change-request permissions on the target org/project","Confirm the org, project, and environment names are correct","Retry if the cause was transient (network/429)"],"exampleFix":"// before\nesc env set my-org/proj/env key value --change\n// after (verify name/permissions first)\nesc env ls my-org/proj\nesc env set my-org/proj/env key value --change","handlingStrategy":"try-catch","validationCode":"// Go: pre-check access and target existence\n_, err := client.GetEnvironment(ctx, ref.orgName, ref.projectName, ref.envName)\nif err != nil {\n    return fmt.Errorf(\"cannot access %s/%s/%s before creating draft: %w\", ref.orgName, ref.projectName, ref.envName, err)\n}","typeGuard":null,"tryCatchPattern":"// Go\n_, err := updateEnvironment(ctx, ref, yaml, tag)\nif err != nil {\n    var wrapped *fmt.wrapError\n    if errors.As(err, &wrapped) && strings.Contains(err.Error(), \"creating environment draft\") {\n        return fmt.Errorf(\"draft creation failed; check permissions and names: %w\", err)\n    }\n    return err\n}","preventionTips":["Confirm change-request permissions in the target org","Verify org/project/env names before updating","Retry on transient network or 429 errors"],"tags":["cli","change-request","api"],"backgroundTag":"api-call-failed","analyzedSha":"793f7b2e160db4321fb7fb6b0607461e01cb251e","analyzedAt":"2026-08-31T09:36:43.099Z","schemaVersion":2},"datasetVersion":"2026-09-01T08:17:40.651Z"}