Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Attempt to select stack then create as fallback #11402

Merged
merged 1 commit into from Nov 18, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
@@ -0,0 +1,4 @@
changes:
- type: fix
scope: sdk/nodejs,go,dotnet
description: Attempt to select stack then create as fallback on 'createOrSelect'
6 changes: 3 additions & 3 deletions sdk/dotnet/Pulumi.Automation/WorkspaceStack.cs
Expand Up @@ -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}")
Expand Down
24 changes: 8 additions & 16 deletions sdk/go/auto/stack.go
Expand Up @@ -184,24 +184,16 @@ 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) {
return s, err
s, err := SelectStack(ctx, stackName, ws)
// If the stack is not found, attempt to create it.
if err != nil && IsSelectStack404Error(err) {
return NewStack(ctx, stackName, ws)
}

err = ws.SelectStack(ctx, stackName)
if err != nil {
return s, err
}

return s, nil
return s, err
}

// Name returns the stack name
Expand Down
8 changes: 4 additions & 4 deletions sdk/nodejs/automation/stack.ts
Expand Up @@ -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";
Expand Down Expand Up @@ -105,9 +105,9 @@ 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);
this.ready = workspace.selectStack(name).catch((err) => {
if (err instanceof StackNotFoundError) {
return workspace.createStack(name);
}
throw err;
});
Expand Down