Files
2025-08-22 23:42:12 +02:00

76 lines
2.3 KiB
Go

//revive:disable:package-comments,exported
package main
import (
"context"
"github.com/pulumi/pulumi/sdk/v3/go/auto"
"github.com/pulumi/pulumi/sdk/v3/go/auto/debug"
"github.com/pulumi/pulumi/sdk/v3/go/auto/optpreview"
"github.com/pulumi/pulumi/sdk/v3/go/auto/optup"
)
// Stack defines the interface for Pulumi stack operations.
// This abstraction allows for mocking in unit tests.
type Stack interface {
SetAllConfig(ctx context.Context, config auto.ConfigMap) error
Refresh(ctx context.Context) (string, error)
Preview(ctx context.Context) (string, error)
Up(ctx context.Context) (auto.UpResult, error)
Destroy(ctx context.Context) error
SetEnvVars(envVars map[string]string) error
}
// pulumiStack is a real implementation of the Stack interface, wrapping the Pulumi Automation API.
type pulumiStack struct {
stack *auto.Stack
}
// NewPulumiStack creates or selects a Pulumi stack and returns it wrapped in the Stack interface.
func NewPulumiStack(ctx context.Context, stackName, workDir string) (Stack, error) {
s, err := auto.UpsertStackLocalSource(ctx, stackName, workDir)
if err != nil {
return nil, err
}
return &pulumiStack{stack: &s}, nil
}
// SetAllConfig sets all configuration values for the stack.
func (ps *pulumiStack) SetAllConfig(ctx context.Context, config auto.ConfigMap) error {
return ps.stack.SetAllConfig(ctx, config)
}
// Refresh refreshes the stack's state.
func (ps *pulumiStack) Refresh(ctx context.Context) (string, error) {
res, err := ps.stack.Refresh(ctx)
if err != nil {
return "", err
}
return res.StdOut, nil
}
// Preview previews the changes for a stack update.
func (ps *pulumiStack) Preview(ctx context.Context) (string, error) {
res, err := ps.stack.Preview(ctx, optpreview.DebugLogging(debug.LoggingOptions{Debug: true}))
if err != nil {
return "", err
}
return res.StdOut, nil
}
// Up performs a stack update.
func (ps *pulumiStack) Up(ctx context.Context) (auto.UpResult, error) {
return ps.stack.Up(ctx, optup.DebugLogging(debug.LoggingOptions{Debug: true}))
}
// Destroy destroys all resources in the stack.
func (ps *pulumiStack) Destroy(ctx context.Context) error {
_, err := ps.stack.Destroy(ctx)
return err
}
// SetEnvVars sets environment variables for the workspace.
func (ps *pulumiStack) SetEnvVars(envVars map[string]string) error {
return ps.stack.Workspace().SetEnvVars(envVars)
}