diff --git a/stack.go b/stack.go index c7f14bf4d..d122a10b7 100644 --- a/stack.go +++ b/stack.go @@ -29,6 +29,9 @@ type Stacks interface { // Delete deletes a stack. Delete(ctx context.Context, stackID string) error + // Delete deletes a stack. + ForceDelete(ctx context.Context, stackID string) error + // UpdateConfiguration updates the configuration of a stack, triggering stack preparation. UpdateConfiguration(ctx context.Context, stackID string) (*Stack, error) } @@ -297,6 +300,16 @@ func (s stacks) Delete(ctx context.Context, stackID string) error { return req.Do(ctx, nil) } +// Force Delete deletes a stack that . +func (s stacks) ForceDelete(ctx context.Context, stackID string) error { + req, err := s.client.NewRequest("POST", fmt.Sprintf("stacks/%s/force-delete", url.PathEscape(stackID)), nil) + if err != nil { + return err + } + + return req.Do(ctx, nil) +} + func (s *StackListOptions) valid() error { return nil } diff --git a/stack_integration_test.go b/stack_integration_test.go index e2eb4b631..437120103 100644 --- a/stack_integration_test.go +++ b/stack_integration_test.go @@ -186,6 +186,63 @@ func TestStackReadUpdateDelete(t *testing.T) { require.Nil(t, stackReadAfterDelete) } +func TestStackReadUpdateForceDelete(t *testing.T) { + skipUnlessBeta(t) + + client := testClient(t) + ctx := context.Background() + + orgTest, orgTestCleanup := createOrganization(t, client) + t.Cleanup(orgTestCleanup) + + oauthClient, cleanup := createOAuthClient(t, client, orgTest, nil) + t.Cleanup(cleanup) + + stack, err := client.Stacks.Create(ctx, StackCreateOptions{ + Name: "test-stack", + VCSRepo: &StackVCSRepo{ + Identifier: "brandonc/pet-nulls-stack", + OAuthTokenID: oauthClient.OAuthTokens[0].ID, + Branch: "main", + }, + Project: &Project{ + ID: orgTest.DefaultProject.ID, + }, + }) + + require.NoError(t, err) + require.NotNil(t, stack) + require.NotEmpty(t, stack.VCSRepo.Identifier) + require.NotEmpty(t, stack.VCSRepo.OAuthTokenID) + require.NotEmpty(t, stack.VCSRepo.Branch) + + stackRead, err := client.Stacks.Read(ctx, stack.ID, nil) + require.NoError(t, err) + require.Equal(t, stack.VCSRepo.Identifier, stackRead.VCSRepo.Identifier) + require.Equal(t, stack.VCSRepo.OAuthTokenID, stackRead.VCSRepo.OAuthTokenID) + require.Equal(t, stack.VCSRepo.Branch, stackRead.VCSRepo.Branch) + + assert.Equal(t, stack, stackRead) + + stackUpdated, err := client.Stacks.Update(ctx, stack.ID, StackUpdateOptions{ + Description: String("updated description"), + }) + + require.NoError(t, err) + require.Equal(t, "updated description", stackUpdated.Description) + + stackUpdatedConfig, err := client.Stacks.UpdateConfiguration(ctx, stack.ID) + require.NoError(t, err) + require.Equal(t, stack.Name, stackUpdatedConfig.Name) + + err = client.Stacks.ForceDelete(ctx, stack.ID) + require.NoError(t, err) + + stackReadAfterDelete, err := client.Stacks.Read(ctx, stack.ID, nil) + require.ErrorIs(t, err, ErrResourceNotFound) + require.Nil(t, stackReadAfterDelete) +} + func pollStackDeployments(t *testing.T, ctx context.Context, client *Client, stackID string) (stack *Stack) { t.Helper()