pulumi/pulumi · error

creating environment draft: %w

Error message

creating environment draft: %w

What it means

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.

Source

Thrown at pkg/cmd/esc/cli/env.go:473

func (esc *escCommand) updateEnvironment(
	ctx context.Context,
	ref environmentRef,
	draft string,
	yaml []byte,
	tag string,
	envUpdateSuccessMessage string,
) ([]client.EnvironmentDiagnostic, error) {
	if draft == "new" {
		changeRequestID, diags, err := esc.client.CreateEnvironmentDraft(
			ctx,
			ref.orgName,
			ref.projectName,
			ref.envName,
			yaml,
			tag,
		)
		if err != nil {
			return nil, fmt.Errorf("creating environment draft: %w", err)
		}
		if !client.DiagnosticsHaveErrors(diags) {
			fmt.Fprintf(esc.stdout, "Change request created: %v\n", changeRequestID)
			fmt.Fprintf(esc.stdout, "Change request URL: %v\n", esc.changeRequestURL(ref, changeRequestID))

			err = esc.client.SubmitChangeRequest(ctx, ref.orgName, changeRequestID, nil)
			if err != nil {
				return nil, fmt.Errorf("submitting change request: %w", err)
			}
			fmt.Fprintln(esc.stdout, "Change request submitted")
		}
		return diags, nil
	} else if draft != "" {
		changeRequestID := draft
		diags, err := esc.client.UpdateEnvironmentDraft(ctx, ref.orgName, ref.projectName, ref.envName, changeRequestID, yaml, tag) //nolint:lll
		if err != nil {
			return nil, fmt.Errorf("updating environment draft: %w", err)
		}

View on GitHub (pinned to 793f7b2e16)

Solutions

  1. Check the wrapped inner error for the root cause (permissions, 404, network)
  2. Verify you have write/change-request permissions on the target org/project
  3. Confirm the org, project, and environment names are correct
  4. Retry if the cause was transient (network/429)

Example fix

// before
esc env set my-org/proj/env key value --change
// after (verify name/permissions first)
esc env ls my-org/proj
esc env set my-org/proj/env key value --change
Defensive patterns

Strategy: try-catch

Validate before calling

// Go: pre-check access and target existence
_, err := client.GetEnvironment(ctx, ref.orgName, ref.projectName, ref.envName)
if err != nil {
    return fmt.Errorf("cannot access %s/%s/%s before creating draft: %w", ref.orgName, ref.projectName, ref.envName, err)
}

Try / catch

// Go
_, err := updateEnvironment(ctx, ref, yaml, tag)
if err != nil {
    var wrapped *fmt.wrapError
    if errors.As(err, &wrapped) && strings.Contains(err.Error(), "creating environment draft") {
        return fmt.Errorf("draft creation failed; check permissions and names: %w", err)
    }
    return err
}

Prevention

When it happens

Trigger: 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.

Common situations: User lacks permission to create drafts in the org/project; environment name/project typo; API outage or rate limiting during draft creation.

Related errors


AI-assisted analysis of pulumi/pulumi@793f7b2e16 (2026-08-31). Data as JSON: /api/errors/1b25827188c2ca4d. Report an issue: GitHub.