diff --git a/changelog/pending/20221117--sdk-nodejs--attempt-to-select-stack-then-create-as-fallback-on-createorselect.yaml b/changelog/pending/20221117--sdk-nodejs--attempt-to-select-stack-then-create-as-fallback-on-createorselect.yaml new file mode 100644 index 000000000000..f379efe02e5f --- /dev/null +++ b/changelog/pending/20221117--sdk-nodejs--attempt-to-select-stack-then-create-as-fallback-on-createorselect.yaml @@ -0,0 +1,4 @@ +changes: +- type: fix + scope: sdk/nodejs,go,dotnet + description: Attempt to select stack then create as fallback on 'createOrSelect' diff --git a/sdk/dotnet/Pulumi.Automation/WorkspaceStack.cs b/sdk/dotnet/Pulumi.Automation/WorkspaceStack.cs index b77a1371af0e..4351dcacb208 100644 --- a/sdk/dotnet/Pulumi.Automation/WorkspaceStack.cs +++ b/sdk/dotnet/Pulumi.Automation/WorkspaceStack.cs @@ -130,11 +130,11 @@ public sealed class WorkspaceStack : IDisposable { try { - await workspace.CreateStackAsync(name, cancellationToken).ConfigureAwait(false); + await workspace.SelectStackAsync(name, cancellationToken).ConfigureAwait(false); } - catch (StackAlreadyExistsException) + catch (StackNotFoundException) { - await workspace.SelectStackAsync(name, cancellationToken).ConfigureAwait(false); + await workspace.CreateStackAsync(name, cancellationToken).ConfigureAwait(false); } }), _ => throw new InvalidOperationException($"Unexpected Stack creation mode: {mode}") diff --git a/sdk/go/auto/stack.go b/sdk/go/auto/stack.go index 5584f6fe8a5e..ea38e7cab6e6 100644 --- a/sdk/go/auto/stack.go +++ b/sdk/go/auto/stack.go @@ -184,19 +184,18 @@ func SelectStack(ctx context.Context, stackName string, ws Workspace) (Stack, er return s, nil } -// UpsertStack tries to create a new stack using the given workspace and -// stack name if the stack does not already exist, -// or falls back to selecting the existing stack. If the stack does not exist, -// it will be created and selected. +// UpsertStack tries to select a stack using the given workspace and +// stack name, or falls back to trying to create the stack if +// it does not exist. func UpsertStack(ctx context.Context, stackName string, ws Workspace) (Stack, error) { - s, err := NewStack(ctx, stackName, ws) - // error for all failures except if the stack already exists, as we'll - // just select the stack if it exists. - if err != nil && !IsCreateStack409Error(err) { + s, err := SelectStack(ctx, stackName, ws) + // error for all failures except if the stack is not found, as we'll + // attempt to create it. + if err != nil && !IsSelectStack404Error(err) { return s, err } - err = ws.SelectStack(ctx, stackName) + s, err = NewStack(ctx, stackName, ws) if err != nil { return s, err } diff --git a/sdk/nodejs/automation/stack.ts b/sdk/nodejs/automation/stack.ts index 9dbd021d6f01..de91d8cc6bdc 100644 --- a/sdk/nodejs/automation/stack.ts +++ b/sdk/nodejs/automation/stack.ts @@ -24,7 +24,7 @@ import TailFile from "@logdna/tail-file"; import * as log from "../log"; import { CommandResult, runPulumiCmd } from "./cmd"; import { ConfigMap, ConfigValue } from "./config"; -import { StackAlreadyExistsError } from "./errors"; +import { StackNotFoundError } from "./errors"; import { EngineEvent, SummaryEvent } from "./events"; import { LanguageServer, maxRPCMessageSize } from "./server"; import { Deployment, PulumiFn, Workspace } from "./workspace"; @@ -105,12 +105,12 @@ export class Stack { this.ready = workspace.selectStack(name); return this; case "createOrSelect": - this.ready = workspace.createStack(name).catch((err) => { - if (err instanceof StackAlreadyExistsError) { - return workspace.selectStack(name); - } - throw err; - }); + this.ready = workspace.selectStack(name).catch((err) => { + if (err instanceof StackNotFoundError) { + return workspace.createStack(name); + } + throw err; + }) return this; default: throw new Error(`unexpected Stack creation mode: ${mode}`);