From 435711193a6794a07c1bf959922a0a433da2d322 Mon Sep 17 00:00:00 2001 From: Dominik Przybyl Date: Fri, 23 Feb 2024 04:07:36 +0100 Subject: [PATCH 1/8] added check command --- examples/go/main.go | 4 +--- provider/provider.go | 10 +++++++++- sdk/go/aem/compose/instanceResourceModel.go | 16 ++++++---------- sdk/nodejs/compose/instanceResourceModel.ts | 9 +++------ tests/provider_test.go | 14 +++++++++----- 5 files changed, 28 insertions(+), 25 deletions(-) diff --git a/examples/go/main.go b/examples/go/main.go index 6a929a0..546a4ba 100644 --- a/examples/go/main.go +++ b/examples/go/main.go @@ -7,9 +7,7 @@ import ( func main() { pulumi.Run(func(ctx *pulumi.Context) error { - myModel, err := compose.NewInstanceResourceModel(ctx, "myModel", &compose.InstanceResourceModelArgs{ - Length: pulumi.Int(24), - }) + myModel, err := compose.NewInstanceResourceModel(ctx, "myModel", &compose.InstanceResourceModelArgs{}) if err != nil { return err } diff --git a/provider/provider.go b/provider/provider.go index 4511bb7..b67cb08 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -15,6 +15,7 @@ package provider import ( + "github.com/pulumi/pulumi/sdk/v3/go/common/resource" "math/rand" "time" @@ -58,7 +59,7 @@ type InstanceResourceModelArgs struct { // Fields projected into Pulumi must be public and hava a `pulumi:"..."` tag. // The pulumi tag doesn't need to match the field name, but it's generally a // good idea. - Length int `pulumi:"length"` + Length int `pulumi:"length,optional"` } // Each resource has a state, describing the fields that exist on the created resource. @@ -89,3 +90,10 @@ func determineResult(length int) string { } return string(result) } + +func (InstanceResourceModel) Check(ctx p.Context, name string, oldInputs, newInputs resource.PropertyMap) (InstanceResourceModelArgs, []p.CheckFailure, error) { + if _, ok := newInputs["length"]; !ok { + newInputs["length"] = resource.NewNumberProperty(12) + } + return infer.DefaultCheck[InstanceResourceModelArgs](newInputs) +} diff --git a/sdk/go/aem/compose/instanceResourceModel.go b/sdk/go/aem/compose/instanceResourceModel.go index 4abfe88..d5b7219 100644 --- a/sdk/go/aem/compose/instanceResourceModel.go +++ b/sdk/go/aem/compose/instanceResourceModel.go @@ -7,7 +7,6 @@ import ( "context" "reflect" - "errors" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" "github.com/wttech/pulumi-provider-aem/sdk/go/aem/internal" ) @@ -15,7 +14,7 @@ import ( type InstanceResourceModel struct { pulumi.CustomResourceState - Length pulumi.IntOutput `pulumi:"length"` + Length pulumi.IntPtrOutput `pulumi:"length"` Result pulumi.StringOutput `pulumi:"result"` } @@ -23,12 +22,9 @@ type InstanceResourceModel struct { func NewInstanceResourceModel(ctx *pulumi.Context, name string, args *InstanceResourceModelArgs, opts ...pulumi.ResourceOption) (*InstanceResourceModel, error) { if args == nil { - return nil, errors.New("missing one or more required arguments") + args = &InstanceResourceModelArgs{} } - if args.Length == nil { - return nil, errors.New("invalid value for required argument 'Length'") - } opts = internal.PkgResourceDefaultOpts(opts) var resource InstanceResourceModel err := ctx.RegisterResource("aem:compose:InstanceResourceModel", name, args, &resource, opts...) @@ -62,12 +58,12 @@ func (InstanceResourceModelState) ElementType() reflect.Type { } type instanceResourceModelArgs struct { - Length int `pulumi:"length"` + Length *int `pulumi:"length"` } // The set of arguments for constructing a InstanceResourceModel resource. type InstanceResourceModelArgs struct { - Length pulumi.IntInput + Length pulumi.IntPtrInput } func (InstanceResourceModelArgs) ElementType() reflect.Type { @@ -107,8 +103,8 @@ func (o InstanceResourceModelOutput) ToInstanceResourceModelOutputWithContext(ct return o } -func (o InstanceResourceModelOutput) Length() pulumi.IntOutput { - return o.ApplyT(func(v *InstanceResourceModel) pulumi.IntOutput { return v.Length }).(pulumi.IntOutput) +func (o InstanceResourceModelOutput) Length() pulumi.IntPtrOutput { + return o.ApplyT(func(v *InstanceResourceModel) pulumi.IntPtrOutput { return v.Length }).(pulumi.IntPtrOutput) } func (o InstanceResourceModelOutput) Result() pulumi.StringOutput { diff --git a/sdk/nodejs/compose/instanceResourceModel.ts b/sdk/nodejs/compose/instanceResourceModel.ts index 2077549..4045cbb 100644 --- a/sdk/nodejs/compose/instanceResourceModel.ts +++ b/sdk/nodejs/compose/instanceResourceModel.ts @@ -31,7 +31,7 @@ export class InstanceResourceModel extends pulumi.CustomResource { return obj['__pulumiType'] === InstanceResourceModel.__pulumiType; } - public readonly length!: pulumi.Output; + public readonly length!: pulumi.Output; public /*out*/ readonly result!: pulumi.Output; /** @@ -41,13 +41,10 @@ export class InstanceResourceModel extends pulumi.CustomResource { * @param args The arguments to use to populate this resource's properties. * @param opts A bag of options that control this resource's behavior. */ - constructor(name: string, args: InstanceResourceModelArgs, opts?: pulumi.CustomResourceOptions) { + constructor(name: string, args?: InstanceResourceModelArgs, opts?: pulumi.CustomResourceOptions) { let resourceInputs: pulumi.Inputs = {}; opts = opts || {}; if (!opts.id) { - if ((!args || args.length === undefined) && !opts.urn) { - throw new Error("Missing required property 'length'"); - } resourceInputs["length"] = args ? args.length : undefined; resourceInputs["result"] = undefined /*out*/; } else { @@ -63,5 +60,5 @@ export class InstanceResourceModel extends pulumi.CustomResource { * The set of arguments for constructing a InstanceResourceModel resource. */ export interface InstanceResourceModelArgs { - length: pulumi.Input; + length?: pulumi.Input; } diff --git a/tests/provider_test.go b/tests/provider_test.go index e51f4f0..57a2019 100644 --- a/tests/provider_test.go +++ b/tests/provider_test.go @@ -31,12 +31,16 @@ import ( func TestInstanceResourceModelCreate(t *testing.T) { prov := provider() + checkResponse, err := prov.Check(p.CheckRequest{ + Urn: urn("InstanceResourceModel"), + News: resource.PropertyMap{}, + }) + require.NoError(t, err) + response, err := prov.Create(p.CreateRequest{ - Urn: urn("InstanceResourceModel"), - Properties: resource.PropertyMap{ - "length": resource.NewNumberProperty(12), - }, - Preview: false, + Urn: urn("InstanceResourceModel"), + Properties: checkResponse.Inputs, + Preview: false, }) require.NoError(t, err) From 313af24be984ac829458a3c816bf69edacb79864 Mon Sep 17 00:00:00 2001 From: Dominik Przybyl Date: Fri, 23 Feb 2024 04:12:47 +0100 Subject: [PATCH 2/8] added client --- Makefile | 1 + provider/client/client.go | 250 +++++++ provider/client/client_manager.go | 57 ++ provider/client/connection.go | 10 + provider/client/connection_aws_ssm.go | 137 ++++ provider/client/connection_ssh.go | 119 ++++ provider/client_context.go | 12 + provider/description.md | 18 + provider/go.mod | 45 +- provider/go.sum | 114 ++- provider/instance/aem.yml | 258 +++++++ provider/instance/consts.go | 26 + provider/instance/description.md | 12 + provider/instance/systemd.conf | 20 + provider/instance_client.go | 288 ++++++++ provider/instance_resource.go | 143 ++++ provider/provider.go | 176 +++-- provider/utils/os.go | 17 + provider/utils/template.go | 18 + sdk/go/aem/compose/instanceResourceModel.go | 43 +- sdk/go/aem/compose/pulumiTypes.go | 737 ++++++++++++++++++++ sdk/nodejs/compose/instanceResourceModel.ts | 33 +- sdk/nodejs/index.ts | 2 + sdk/nodejs/tsconfig.json | 3 + sdk/nodejs/types/index.ts | 13 + sdk/nodejs/types/input.ts | 39 ++ sdk/nodejs/types/output.ts | 49 ++ tests/go.mod | 24 +- tests/go.sum | 56 +- tests/provider_test.go | 13 +- 30 files changed, 2580 insertions(+), 153 deletions(-) create mode 100644 provider/client/client.go create mode 100644 provider/client/client_manager.go create mode 100644 provider/client/connection.go create mode 100644 provider/client/connection_aws_ssm.go create mode 100644 provider/client/connection_ssh.go create mode 100644 provider/client_context.go create mode 100644 provider/description.md create mode 100644 provider/instance/aem.yml create mode 100644 provider/instance/consts.go create mode 100644 provider/instance/description.md create mode 100644 provider/instance/systemd.conf create mode 100644 provider/instance_client.go create mode 100644 provider/instance_resource.go create mode 100644 provider/utils/os.go create mode 100644 provider/utils/template.go create mode 100644 sdk/go/aem/compose/pulumiTypes.go create mode 100644 sdk/nodejs/types/index.ts create mode 100644 sdk/nodejs/types/input.ts create mode 100644 sdk/nodejs/types/output.ts diff --git a/Makefile b/Makefile index 5ee8a81..5adfa4a 100644 --- a/Makefile +++ b/Makefile @@ -47,6 +47,7 @@ go_sdk:: $(WORKING_DIR)/bin/$(PROVIDER) sed -e 's/"internal"/"github.com\/wttech\/pulumi-provider-aem\/sdk\/go\/aem\/internal"/g' sdk/go/$(PACK)/provider.go > sdk/go/$(PACK)/provider.go.tmp && mv sdk/go/$(PACK)/provider.go.tmp sdk/go/$(PACK)/provider.go sed -e 's/"internal"/"github.com\/wttech\/pulumi-provider-aem\/sdk\/go\/aem\/internal"/g' sdk/go/$(PACK)/$(MOD)/init.go > sdk/go/$(PACK)/$(MOD)/init.go.tmp && mv sdk/go/$(PACK)/$(MOD)/init.go.tmp sdk/go/$(PACK)/$(MOD)/init.go sed -e 's/"internal"/"github.com\/wttech\/pulumi-provider-aem\/sdk\/go\/aem\/internal"/g' sdk/go/$(PACK)/$(MOD)/instanceResourceModel.go > sdk/go/$(PACK)/$(MOD)/instanceResourceModel.go.tmp && mv sdk/go/$(PACK)/$(MOD)/instanceResourceModel.go.tmp sdk/go/$(PACK)/$(MOD)/instanceResourceModel.go + sed -e 's/"internal"/"github.com\/wttech\/pulumi-provider-aem\/sdk\/go\/aem\/internal"/g' sdk/go/$(PACK)/$(MOD)/pulumiTypes.go > sdk/go/$(PACK)/$(MOD)/pulumiTypes.go.tmp && mv sdk/go/$(PACK)/$(MOD)/pulumiTypes.go.tmp sdk/go/$(PACK)/$(MOD)/pulumiTypes.go sed -e 's/\/pulumi-aem\/sdk/\/pulumi-provider-aem\/sdk/g' sdk/go/$(PACK)/internal/pulumiUtilities.go > sdk/go/$(PACK)/internal/pulumiUtilities.go.tmp && mv sdk/go/$(PACK)/internal/pulumiUtilities.go.tmp sdk/go/$(PACK)/internal/pulumiUtilities.go nodejs_sdk:: VERSION := $(shell pulumictl get version --language javascript) diff --git a/provider/client/client.go b/provider/client/client.go new file mode 100644 index 0000000..6c338c9 --- /dev/null +++ b/provider/client/client.go @@ -0,0 +1,250 @@ +package client + +import ( + "context" + "fmt" + "github.com/wttech/pulumi-provider-aem/provider/utils" + "os" + "path/filepath" + "strings" + "time" +) + +type Client struct { + typeName string + settings map[string]string + connection Connection + + Env map[string]string + WorkDir string + Sudo bool +} + +func (c Client) TypeName() string { + return c.typeName +} + +func (c Client) Use(callback func(c Client) error) error { + if err := c.Connect(); err != nil { + return err + } + if err := callback(c); err != nil { + return err + } + if err := c.Disconnect(); err != nil { + return err + } + return nil +} + +func (c Client) Connect() error { + return c.connection.Connect() +} + +func (c Client) ConnectWithRetry(timeout time.Duration, callback func()) error { + ctx, cancel := context.WithTimeout(context.Background(), timeout) + var err error + defer cancel() + for { + select { + case <-ctx.Done(): + return fmt.Errorf("cannot connect - awaiting timeout reached '%s': %w", timeout, err) + default: + if err = c.Connect(); err == nil { + return nil + } + time.Sleep(3 * time.Second) + callback() + } + } +} + +func (c Client) Disconnect() error { + return c.connection.Disconnect() +} + +func (c Client) Connection() Connection { + return c.connection +} + +func (c Client) Command(cmdLine []string) ([]byte, error) { + return c.connection.Command(cmdLine) +} + +func (c Client) SetupEnv() error { + if err := c.FileWrite(c.envScriptPath(), c.envScriptString()); err != nil { + return fmt.Errorf("cannot setup environment script: %w", err) + } + return nil +} + +func (c Client) envScriptPath() string { + return fmt.Sprintf("%s/env.sh", c.WorkDir) +} + +func (c Client) envScriptString() string { + return utils.EnvToScript(c.Env) +} + +func (c Client) RunShellScript(cmdName string, cmdScript string, dir string) ([]byte, error) { + remotePath := fmt.Sprintf("%s/%s.sh", c.WorkDir, cmdName) + if err := c.FileWrite(remotePath, cmdScript); err != nil { + return nil, fmt.Errorf("cannot write temporary script at remote path '%s': %w", remotePath, err) + } + defer func() { _ = c.PathDelete(remotePath) }() + return c.RunShellCommand(fmt.Sprintf("sh %s", remotePath), dir) +} + +func (c Client) RunShellCommand(cmd string, dir string) ([]byte, error) { + if dir == "" || dir == "." { + return c.RunShellPurely(fmt.Sprintf("source %s && %s", c.envScriptPath(), cmd)) + } + return c.RunShellPurely(fmt.Sprintf("source %s && cd %s && %s", c.envScriptPath(), dir, cmd)) +} + +func (c Client) RunShellPurely(cmd string) ([]byte, error) { + var cmdLine []string + if c.Sudo { + cmdLine = []string{"sudo", "sh", "-c", "\"" + cmd + "\""} + } else { + cmdLine = []string{"sh", "-c", "\"" + cmd + "\""} + } + out, err := c.connection.Command(cmdLine) + if err != nil { + return nil, fmt.Errorf("cannot create command '%s': %w", cmd, err) + } + return out, nil +} + +func (c Client) DirEnsure(path string) error { + _, err := c.RunShellPurely(fmt.Sprintf("mkdir -p %s", path)) + if err != nil { + return fmt.Errorf("cannot ensure directory '%s': %w", path, err) + } + return nil +} + +func (c Client) FileExists(path string) (bool, error) { + out, err := c.RunShellPurely(fmt.Sprintf("test -f %s && echo '0' || echo '1'", path)) + if err != nil { + return false, fmt.Errorf("cannot check if file exists '%s': %w", path, err) + } + return strings.TrimSpace(string(out)) == "0", nil +} + +func (c Client) FileMove(oldPath string, newPath string) error { + if err := c.DirEnsure(filepath.Dir(newPath)); err != nil { + return err + } + if _, err := c.RunShellPurely(fmt.Sprintf("mv %s %s", oldPath, newPath)); err != nil { + return fmt.Errorf("cannot move file '%s' to '%s': %w", oldPath, newPath, err) + } + return nil +} + +func (c Client) FileMakeExecutable(path string) error { + _, err := c.RunShellPurely(fmt.Sprintf("chmod +x %s", path)) + if err != nil { + return fmt.Errorf("cannot make file executable '%s': %w", path, err) + } + return nil +} + +func (c Client) DirExists(path string) (bool, error) { + out, err := c.RunShellPurely(fmt.Sprintf("test -d %s && echo '0' || echo '1'", path)) + if err != nil { + return false, fmt.Errorf("cannot check if directory exists '%s': %w", path, err) + } + return strings.TrimSpace(string(out)) == "0", nil +} + +func (c Client) DirCopy(localPath string, remotePath string, override bool) error { + if err := c.DirEnsure(remotePath); err != nil { + return err + } + dir, err := os.ReadDir(localPath) + if err != nil { + return fmt.Errorf("cannot list files to copy in directory '%s': %w", localPath, err) + } + for _, file := range dir { + localSubPath := filepath.Join(localPath, file.Name()) + remoteSubPath := filepath.Join(remotePath, file.Name()) + if file.IsDir() { + if err := c.DirCopy(localSubPath, remoteSubPath, override); err != nil { + return err + } + } else { + if err := c.FileCopy(localSubPath, remoteSubPath, override); err != nil { + return err + } + } + } + return nil +} + +func (c Client) FileCopy(localPath string, remotePath string, override bool) error { + if !override { + exists, err := c.FileExists(remotePath) + if err != nil { + return err + } + if exists { + return nil + } + } + if err := c.DirEnsure(filepath.Dir(remotePath)); err != nil { + return err + } + var remoteTmpPath string + if c.Sudo { // assume that work dir is writable without sudo for uploading time + remoteTmpPath = fmt.Sprintf("%s/%s.tmp", c.WorkDir, filepath.Base(remotePath)) + } else { + remoteTmpPath = fmt.Sprintf("%s.tmp", remotePath) + } + err := c.PathDelete(remoteTmpPath) + if err != nil { + return err + } + defer func() { _ = c.PathDelete(remoteTmpPath) }() + if err := c.connection.CopyFile(localPath, remoteTmpPath); err != nil { + return err + } + if err := c.FileMove(remoteTmpPath, remotePath); err != nil { + return err + } + return nil +} + +func (c Client) PathCopy(localPath string, remotePath string, override bool) error { + stat, err := os.Stat(localPath) + if err != nil { + return fmt.Errorf("cannot stat path '%s': %w", localPath, err) + } + if stat.IsDir() { + return c.DirCopy(localPath, remotePath, override) + } + return c.FileCopy(localPath, remotePath, override) +} + +func (c Client) PathDelete(path string) error { + if _, err := c.RunShellPurely(fmt.Sprintf("rm -rf %s", path)); err != nil { + return fmt.Errorf("cannot delete file '%s': %w", path, err) + } + return nil +} + +func (c Client) FileWrite(remotePath string, text string) error { + file, err := os.CreateTemp(os.TempDir(), "tf-provider-aem-*.tmp") + path := file.Name() + defer func() { _ = file.Close(); _ = os.Remove(path) }() + if err != nil { + return fmt.Errorf("cannot create local writable temporary file to be copied to remote path '%s': %w", remotePath, err) + } + if _, err := file.WriteString(text); err != nil { + return fmt.Errorf("cannot write text to local temporary file to be copied to remote path '%s': %w", remotePath, err) + } + if err := c.FileCopy(path, remotePath, true); err != nil { + return err + } + return nil +} diff --git a/provider/client/client_manager.go b/provider/client/client_manager.go new file mode 100644 index 0000000..8f37b5d --- /dev/null +++ b/provider/client/client_manager.go @@ -0,0 +1,57 @@ +package client + +import ( + "context" + "fmt" + "github.com/spf13/cast" +) + +func (c ClientManager) Make(typeName string, settings map[string]string) (*Client, error) { + connection, err := c.connection(typeName, settings) + if err != nil { + return nil, err + } + return &Client{ + typeName: typeName, + settings: settings, + connection: connection, + + Env: map[string]string{}, + }, nil +} + +func (c ClientManager) Use(typeName string, settings map[string]string, callback func(c Client) error) error { + client, err := c.Make(typeName, settings) + if err != nil { + return err + } + return client.Use(callback) +} + +func (c ClientManager) connection(typeName string, settings map[string]string) (Connection, error) { + switch typeName { + case "ssh": + return &SSHConnection{ + host: settings["host"], + user: settings["user"], + privateKey: settings["private_key"], + privateKeyPassphrase: settings["private_key_passphrase"], + port: cast.ToInt(settings["port"]), + secure: cast.ToBool(settings["secure"]), + }, nil + case "aws-ssm": + return &AWSSSMConnection{ + instanceID: settings["instance_id"], + region: settings["region"], + context: context.Background(), + commandOutputTimeout: cast.ToDuration(settings["command_output_timeout"]), + commandWaitMin: cast.ToDuration(settings["command_wait_min"]), + commandWaitMax: cast.ToDuration(settings["command_wait_max"]), + }, nil + } + return nil, fmt.Errorf("unknown AEM client type: %s", typeName) +} + +type ClientManager struct{} + +var ClientManagerDefault = &ClientManager{} diff --git a/provider/client/connection.go b/provider/client/connection.go new file mode 100644 index 0000000..7b1f772 --- /dev/null +++ b/provider/client/connection.go @@ -0,0 +1,10 @@ +package client + +type Connection interface { + Info() string + User() string + Connect() error + Disconnect() error + Command(cmdLine []string) ([]byte, error) + CopyFile(localPath string, remotePath string) error +} diff --git a/provider/client/connection_aws_ssm.go b/provider/client/connection_aws_ssm.go new file mode 100644 index 0000000..e2a5608 --- /dev/null +++ b/provider/client/connection_aws_ssm.go @@ -0,0 +1,137 @@ +package client + +import ( + "context" + "encoding/base64" + "fmt" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/service/ssm" + "os" + "strings" + "time" +) + +type AWSSSMConnection struct { + instanceID string + region string + client *ssm.Client + sessionId *string + context context.Context + commandOutputTimeout time.Duration + commandWaitMax time.Duration + commandWaitMin time.Duration +} + +func (a *AWSSSMConnection) Info() string { + region := a.region + if region == "" { + region = "" + } + return fmt.Sprintf("ssm: instance_id='%s', region='%s'", a.instanceID, region) +} + +func (a *AWSSSMConnection) User() string { + out, err := a.Command([]string{"whoami"}) + if err != nil { + panic(fmt.Sprintf("ssm: cannot determine connected user: %s", err)) + } + return strings.TrimSpace(string(out)) +} + +func (a *AWSSSMConnection) Connect() error { + if a.commandOutputTimeout == 0 { + a.commandOutputTimeout = 5 * time.Hour + } + if a.commandWaitMin == 0 { + a.commandWaitMin = 5 * time.Millisecond + } + if a.commandWaitMax == 0 { + a.commandWaitMax = 5 * time.Second + } + + var optFns []func(*config.LoadOptions) error + if a.region != "" { + optFns = append(optFns, config.WithRegion(a.region)) + } + + cfg, err := config.LoadDefaultConfig(a.context, optFns...) + if err != nil { + return err + } + + client := ssm.NewFromConfig(cfg) + sessionIn := &ssm.StartSessionInput{Target: aws.String(a.instanceID)} + sessionOut, err := client.StartSession(a.context, sessionIn) + if err != nil { + return fmt.Errorf("ssm: error starting session: %v", err) + } + + a.client = client + a.sessionId = sessionOut.SessionId + + return nil +} + +func (a *AWSSSMConnection) Disconnect() error { + sessionIn := &ssm.TerminateSessionInput{SessionId: a.sessionId} + _, err := a.client.TerminateSession(a.context, sessionIn) + if err != nil { + return fmt.Errorf("ssm: error terminating session: %v", err) + } + + return nil +} + +func (a *AWSSSMConnection) Command(cmdLine []string) ([]byte, error) { + command := strings.Join(cmdLine, " ") + commandIn := &ssm.SendCommandInput{ + DocumentName: aws.String("AWS-RunShellScript"), + InstanceIds: []string{a.instanceID}, + Parameters: map[string][]string{ + "commands": {command}, + }, + } + runOut, err := a.client.SendCommand(a.context, commandIn) + if err != nil { + return nil, fmt.Errorf("ssm: error executing command: %v", err) + } + + commandId := runOut.Command.CommandId + invocationIn := &ssm.GetCommandInvocationInput{ + CommandId: commandId, + InstanceId: aws.String(a.instanceID), + } + var optFns []func(opt *ssm.CommandExecutedWaiterOptions) + if a.commandWaitMax > 0 && a.commandWaitMin > 0 { + optFns = []func(opt *ssm.CommandExecutedWaiterOptions){func(opt *ssm.CommandExecutedWaiterOptions) { + opt.MinDelay = a.commandWaitMin + opt.MaxDelay = a.commandWaitMax + }} + } + + waiter := ssm.NewCommandExecutedWaiter(a.client, optFns...) + invocationOut, err := waiter.WaitForOutput(a.context, invocationIn, a.commandOutputTimeout) + if err != nil { + invocationOut, err = a.client.GetCommandInvocation(a.context, invocationIn) + if invocationOut != nil { + return nil, fmt.Errorf("ssm: error executing command: %v", *invocationOut.StandardErrorContent) + } else if err != nil { + return nil, fmt.Errorf("ssm: error executing command: %v", err) + } + } + + return []byte(*invocationOut.StandardOutputContent), nil +} + +func (a *AWSSSMConnection) CopyFile(localPath string, remotePath string) error { + fileContent, err := os.ReadFile(localPath) + if err != nil { + return fmt.Errorf("ssm: error reading local file: %v", err) + } + encodedContent := base64.StdEncoding.EncodeToString(fileContent) + + cmd := fmt.Sprintf("echo -n %s | base64 -d > %s", encodedContent, remotePath) + _, err = a.Command([]string{cmd}) + return err +} diff --git a/provider/client/connection_ssh.go b/provider/client/connection_ssh.go new file mode 100644 index 0000000..cf57f95 --- /dev/null +++ b/provider/client/connection_ssh.go @@ -0,0 +1,119 @@ +package client + +import ( + "fmt" + "github.com/melbahja/goph" + "github.com/spf13/cast" + "golang.org/x/crypto/ssh" + "strings" +) + +type SSHConnection struct { + client *goph.Client + + host string + user string + passphrase string + privateKey string + privateKeyPassphrase string + port int + secure bool +} + +func (s *SSHConnection) Connect() error { + if s.host == "" { + return fmt.Errorf("ssh: host is required") + } + if s.user == "" { + return fmt.Errorf("ssh: user is required") + } + if s.privateKey == "" { + return fmt.Errorf("ssh: private key is required") + } + if s.port == 0 { + s.port = 22 + } + var ( + signer ssh.Signer + err error + ) + if s.passphrase != "" { + signer, err = ssh.ParsePrivateKeyWithPassphrase([]byte(s.privateKey), []byte(s.passphrase)) + if err != nil { + return fmt.Errorf("ssh: cannot parse private key with passphrase: %w", err) + } + } else { + signer, err = ssh.ParsePrivateKey([]byte(s.privateKey)) + if err != nil { + return fmt.Errorf("ssh: cannot parse private key: %w", err) + } + } + var callback ssh.HostKeyCallback + if s.secure { + callback = ssh.FixedHostKey(signer.PublicKey()) + } else { + callback = ssh.InsecureIgnoreHostKey() + } + client, err := goph.NewConn(&goph.Config{ + User: s.user, + Addr: s.host, + Port: cast.ToUint(s.port), + Auth: goph.Auth{ssh.PublicKeys(signer)}, + Timeout: goph.DefaultTimeout, + Callback: callback, + }) + if err != nil { + return fmt.Errorf("ssh: cannot connect to host '%s': %w", s.host, err) + } + s.client = client + return nil +} + +func (s *SSHConnection) Info() string { + return fmt.Sprintf("ssh: host='%s', user='%s', port='%d'", s.host, s.user, s.port) +} + +func (s *SSHConnection) User() string { + return s.user +} + +func (s *SSHConnection) Disconnect() error { + if s.client == nil { + return nil + } + if err := s.client.Close(); err != nil { + return fmt.Errorf("ssh: cannot disconnect from host '%s': %w", s.host, err) + } + return nil +} + +func (s *SSHConnection) Command(cmdLine []string) ([]byte, error) { + name, args := s.splitCommandLine(cmdLine) + cmd, err := s.client.Command(name, args...) + if err != nil { + return nil, fmt.Errorf("ssh: cannot create command '%s' for host '%s': %w", strings.Join(cmdLine, " "), s.host, err) + } + out, err := cmd.CombinedOutput() + if err != nil && len(out) > 0 { + return nil, fmt.Errorf("ssh: cannot run command '%s': %w\n\n%s", cmd, err, string(out)) + } else if err != nil { + return nil, fmt.Errorf("ssh: cannot run command '%s': %w", cmd, err) + } + return out, nil +} + +func (s *SSHConnection) splitCommandLine(cmdLine []string) (string, []string) { + name := cmdLine[0] + var args []string + if len(cmdLine) > 1 { + args = cmdLine[1:] + } + return name, args +} + +func (s *SSHConnection) CopyFile(localPath string, remotePath string) error { + if err := s.client.Upload(localPath, remotePath); err != nil { + return fmt.Errorf("ssh: cannot copy local file '%s' to remote path '%s' on host '%s': %w", localPath, remotePath, s.host, err) + } + return nil +} diff --git a/provider/client_context.go b/provider/client_context.go new file mode 100644 index 0000000..7098033 --- /dev/null +++ b/provider/client_context.go @@ -0,0 +1,12 @@ +package provider + +import ( + p "github.com/pulumi/pulumi-go-provider" + "github.com/wttech/pulumi-provider-aem/provider/client" +) + +type ClientContext[T interface{}] struct { + cl *client.Client + ctx p.Context + data T +} diff --git a/provider/description.md b/provider/description.md new file mode 100644 index 0000000..0b227c6 --- /dev/null +++ b/provider/description.md @@ -0,0 +1,18 @@ +This provider allows developers and development teams to easily set up [Adobe Experience Manager (AEM)](https://business.adobe.com/products/experience-manager/adobe-experience-manager.html) instances on virtual machines in the cloud (AWS, Azure, GCP, etc.) or bare metal machines. +It's based on the [AEM Compose](https://github.com/wttech/aemc) tool and aims to simplify the process of creating AEM environments without requiring deep DevOps knowledge. + +## Purpose + +The main purpose of this provider is to enable users to: + +- Set up as many AEM environments as needed with minimal effort +- Eliminate the need for deep DevOps knowledge +- Allow for seamless integration with popular cloud platforms such as AWS and Azure +- Provide a simple and efficient way to manage AEM instances + +## Features + +- Easy configuration and management of AEM instances +- Support for multiple cloud platforms and bare metal machines +- Seamless integration with Terraform for infrastructure provisioning +- Based on the powerful [AEM Compose](https://github.com/wttech/aemc) tool diff --git a/provider/go.mod b/provider/go.mod index 6e4bb6a..65efca4 100644 --- a/provider/go.mod +++ b/provider/go.mod @@ -3,8 +3,14 @@ module github.com/wttech/pulumi-provider-aem/provider go 1.21 require ( + github.com/aws/aws-sdk-go-v2 v1.25.1 + github.com/aws/aws-sdk-go-v2/config v1.26.6 + github.com/aws/aws-sdk-go-v2/service/ssm v1.49.0 + github.com/melbahja/goph v1.4.0 github.com/pulumi/pulumi-go-provider v0.14.0 github.com/pulumi/pulumi/sdk/v3 v3.104.2 + github.com/spf13/cast v1.6.0 + golang.org/x/crypto v0.18.0 ) require ( @@ -15,6 +21,17 @@ require ( github.com/agext/levenshtein v1.2.3 // indirect github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect github.com/atotto/clipboard v0.1.4 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.16.16 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.18.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 // indirect + github.com/aws/smithy-go v1.20.1 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/blang/semver v3.5.1+incompatible // indirect github.com/charmbracelet/bubbles v0.16.1 // indirect @@ -27,11 +44,12 @@ require ( github.com/djherbis/times v1.5.0 // indirect github.com/edsrzf/mmap-go v1.1.0 // indirect github.com/emirpasic/gods v1.18.1 // indirect + github.com/fatih/color v1.16.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.5.0 // indirect github.com/go-git/go-git/v5 v5.11.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/glog v1.1.0 // indirect + github.com/golang/glog v1.1.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 // indirect @@ -40,9 +58,12 @@ require ( github.com/hashicorp/hcl/v2 v2.17.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect + github.com/kr/fs v0.1.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-localereader v0.0.1 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect github.com/mitchellh/go-ps v1.0.0 // indirect @@ -58,6 +79,7 @@ require ( github.com/pgavlin/goldmark v1.1.33-0.20200616210433-b5eb04559386 // indirect github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/pkg/sftp v1.13.6 // indirect github.com/pkg/term v1.1.0 // indirect github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231 // indirect github.com/pulumi/esc v0.6.2 // indirect @@ -79,18 +101,17 @@ require ( github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/zclconf/go-cty v1.13.2 // indirect go.uber.org/atomic v1.10.0 // indirect - golang.org/x/crypto v0.17.0 // indirect - golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect + golang.org/x/exp v0.0.0-20240119083558-1b970713d09a // indirect golang.org/x/mod v0.14.0 // indirect - golang.org/x/net v0.19.0 // indirect - golang.org/x/sync v0.5.0 // indirect - golang.org/x/sys v0.15.0 // indirect - golang.org/x/term v0.15.0 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/term v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130 // indirect - google.golang.org/grpc v1.57.1 // indirect - google.golang.org/protobuf v1.31.0 // indirect + golang.org/x/tools v0.17.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe // indirect + google.golang.org/grpc v1.61.1 // indirect + google.golang.org/protobuf v1.32.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect lukechampine.com/frand v1.4.2 // indirect diff --git a/provider/go.sum b/provider/go.sum index 78dcda4..dc14be8 100644 --- a/provider/go.sum +++ b/provider/go.sum @@ -19,6 +19,34 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPd github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= +github.com/aws/aws-sdk-go-v2 v1.25.1 h1:P7hU6A5qEdmajGwvae/zDkOq+ULLC9tQBTwqqiwFGpI= +github.com/aws/aws-sdk-go-v2 v1.25.1/go.mod h1:Evoc5AsmtveRt1komDwIsjHFyrP5tDuF1D1U+6z6pNo= +github.com/aws/aws-sdk-go-v2/config v1.26.6 h1:Z/7w9bUqlRI0FFQpetVuFYEsjzE3h7fpU6HuGmfPL/o= +github.com/aws/aws-sdk-go-v2/config v1.26.6/go.mod h1:uKU6cnDmYCvJ+pxO9S4cWDb2yWWIH5hra+32hVh1MI4= +github.com/aws/aws-sdk-go-v2/credentials v1.16.16 h1:8q6Rliyv0aUFAVtzaldUEcS+T5gbadPbWdV1WcAddK8= +github.com/aws/aws-sdk-go-v2/credentials v1.16.16/go.mod h1:UHVZrdUsv63hPXFo1H7c5fEneoVo9UXiz36QG1GEPi0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 h1:c5I5iH+DZcH3xOIMlz3/tCKJDaHFwYEmxvlh2fAcFo8= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11/go.mod h1:cRrYDYAMUohBJUtUnOhydaMHtiK/1NZ0Otc9lIb6O0Y= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.1 h1:evvi7FbTAoFxdP/mixmP7LIYzQWAmzBcwNB/es9XPNc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.1/go.mod h1:rH61DT6FDdikhPghymripNUCsf+uVF4Cnk4c4DBKH64= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.1 h1:RAnaIrbxPtlXNVI/OIlh1sidTQ3e1qM6LRjs7N0bE0I= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.1/go.mod h1:nbgAGkH5lk0RZRMh6A4K/oG6Xj11eC/1CyDow+DUAFI= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3 h1:n3GDfwqF2tzEkXlv5cuy4iy7LpKDtqDMcNLfZDu9rls= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 h1:/b31bi3YVNlkzkBrm9LfpaKoaYZUxIAj4sHfOTmLfqw= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4/go.mod h1:2aGXHFmbInwgP9ZfpmdIfOELL79zhdNYNmReK8qDfdQ= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 h1:DBYTXwIGQSGs9w4jKm60F5dmCQ3EEruxdc0MFh+3EY4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10/go.mod h1:wohMUQiFdzo0NtxbBg0mSRGZ4vL3n0dKjLTINdcIino= +github.com/aws/aws-sdk-go-v2/service/ssm v1.49.0 h1:EtNvvxv0m6aP4cbTyo43vBRXeTpyt8juyNPmgKSTyYs= +github.com/aws/aws-sdk-go-v2/service/ssm v1.49.0/go.mod h1:wzPAvA+afHPFlAMkCf80sg7bm7GbCuFX1INetlm9DAk= +github.com/aws/aws-sdk-go-v2/service/sso v1.18.7 h1:eajuO3nykDPdYicLlP3AGgOyVN3MOlFmZv7WGTuJPow= +github.com/aws/aws-sdk-go-v2/service/sso v1.18.7/go.mod h1:+mJNDdF+qiUlNKNC3fxn74WWNN+sOiGOEImje+3ScPM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 h1:QPMJf+Jw8E1l7zqhZmMlFw6w1NmfkfiSK8mS4zOx3BA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7/go.mod h1:ykf3COxYI0UJmxcfcxcVuz7b6uADi1FkiUz6Eb7AgM8= +github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 h1:NzO4Vrau795RkUdSHKEwiR01FaGzGOH1EETJ+5QHnm0= +github.com/aws/aws-sdk-go-v2/service/sts v1.26.7/go.mod h1:6h2YuIoxaMSCFf5fi1EgZAwdfkGMgDY+DVfa61uLe4U= +github.com/aws/smithy-go v1.20.1 h1:4SZlSlMr36UEqC7XOyRVb27XMeZubNcBNN+9IgEPIQw= +github.com/aws/smithy-go v1.20.1/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= @@ -52,8 +80,10 @@ github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/El github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= @@ -69,8 +99,8 @@ github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRx github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= +github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= +github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= @@ -92,11 +122,17 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -107,18 +143,21 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/melbahja/goph v1.4.0 h1:z0PgDbBFe66lRYl3v5dGb9aFgPy0kotuQ37QOwSQFqs= +github.com/melbahja/goph v1.4.0/go.mod h1:uG+VfK2Dlhk+O32zFrRlc3kYKTlV6+BtvPWd/kK7U68= github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= @@ -148,6 +187,9 @@ github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.13.5/go.mod h1:wHDZ0IZX6JcBYRK1TH9bcVq8G7TLpVHYIGJRFnmPfxg= +github.com/pkg/sftp v1.13.6 h1:JFZT4XbOU7l77xGSpOdW+pwIMqP044IyjXX6FGyEKFo= +github.com/pkg/sftp v1.13.6/go.mod h1:tz1ryNURKu77RL+GuCzmoJYxQczL3wLNNpPWagdg4Qk= github.com/pkg/term v1.1.0 h1:xIAAdCMh3QIAy+5FrE8Ad8XoDhEU4ufwbaSozViP9kk= github.com/pkg/term v1.1.0/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -182,17 +224,23 @@ github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NF github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ= github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= +github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= +github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/texttheater/golang-levenshtein v1.0.1 h1:+cRNoVrfiwufQPhoMzB6N0Yf/Mqajr6t1lOv8GyGE2U= @@ -216,13 +264,16 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/exp v0.0.0-20240119083558-1b970713d09a h1:Q8/wZp0KX97QFTc2ywcOE0YRjZPVIx+MXInMzdvQqcA= +golang.org/x/exp v0.0.0-20240119083558-1b970713d09a/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -239,18 +290,19 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -264,23 +316,26 @@ golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211110154304-99a53858aa08/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -298,20 +353,20 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= -golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= +golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130 h1:2FZP5XuJY9zQyGM5N0rtovnoXjiMUEIUMvw0m9wlpLc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= -google.golang.org/grpc v1.57.1 h1:upNTNqv0ES+2ZOOqACwVtS3Il8M12/+Hz41RCPzAjQg= -google.golang.org/grpc v1.57.1/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe h1:bQnxqljG/wqi4NTXu2+DJ3n7APcEA882QZ1JvhQAq9o= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= +google.golang.org/grpc v1.61.1 h1:kLAiWrZs7YeDM6MumDe7m3y4aM6wacLzM1Y/wiLP9XY= +google.golang.org/grpc v1.61.1/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= @@ -319,6 +374,7 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/provider/instance/aem.yml b/provider/instance/aem.yml new file mode 100644 index 0000000..fc194f0 --- /dev/null +++ b/provider/instance/aem.yml @@ -0,0 +1,258 @@ +# AEM instances to work with +instance: + + # Full details of local or remote instances + config: + local_author: + active: true + http_url: http://127.0.0.1:4502 + user: admin + password: admin + run_modes: [local] + jvm_opts: + - -server + - -Djava.awt.headless=true + - -Djava.io.tmpdir=[[canonicalPath .Path "aem/home/tmp"]] + - -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:14502 + - -Duser.language=en + - -Duser.country=US + - -Duser.timezone=UTC + start_opts: [] + secret_vars: + - ACME_SECRET=value + env_vars: + - ACME_VAR=value + sling_props: [] + local_publish: + active: true + http_url: http://127.0.0.1:4503 + user: admin + password: admin + run_modes: [local] + jvm_opts: + - -server + - -Djava.awt.headless=true + - -Djava.io.tmpdir=[[canonicalPath .Path "aem/home/tmp"]] + - -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:14503 + - -Duser.language=en + - -Duser.country=US + - -Duser.timezone=UTC + start_opts: [] + secret_vars: + - ACME_SECRET=value + env_vars: + - ACME_VAR=value + sling_props: [] + + # Tuning performance & reliability + # 'auto' - for more than 1 local instances - 'serial', otherwise 'parallel' + # 'parallel' - for working with remote instances + # 'serial' - for working with local instances + processing_mode: auto + + # HTTP client settings + http: + timeout: 10m + debug: false + disable_warn: true + + # State checking + check: + # Time to wait before first state checking (to avoid false-positives) + warmup: 1s + # Time to wait for next state checking + interval: 6s + # Number of successful check attempts that indicates end of checking + done_threshold: 3 + # Wait only for those instances whose state has been changed internally (unaware of external changes) + await_strict: true + # Max time to wait for the instance to be healthy after executing the start script or e.g deploying a package + await_started: + timeout: 30m + # Max time to wait for the instance to be stopped after executing the stop script + await_stopped: + timeout: 10m + # Max time in which socket connection to instance should be established + reachable: + skip: false + timeout: 3s + # Bundle state tracking + bundle_stable: + skip: false + symbolic_names_ignored: [] + # OSGi events tracking + event_stable: + skip: false + # Topics indicating that instance is not stable + topics_unstable: + - "org/osgi/framework/ServiceEvent/*" + - "org/osgi/framework/FrameworkEvent/*" + - "org/osgi/framework/BundleEvent/*" + # Ignored service names to handle known issues + details_ignored: + - "*.*MBean" + - "org.osgi.service.component.runtime.ServiceComponentRuntime" + - "java.util.ResourceBundle" + received_max_age: 5s + # OSGi components state tracking + component_stable: + skip: false + pids: + include: ['com.day.crx.packaging.*', 'org.apache.sling.installer.*'] + exclude: ['org.apache.sling.installer.hc.*', 'org.apache.sling.installer.core.impl.console.*'] + match: + "disabled": [] + "no config": [] + "unsatisfied (reference)": [] + "satisfied": [] + # Sling Installer tracking + installer: + skip: false + # JMX state checking + state: true + # Pause Installation nodes checking + pause: true + # Specific endpoints / paths (like login page) + path_ready: + timeout: 10s + login_page: + skip: false + path: "/libs/granite/core/content/login.html" + status_code: 200 + contained_text: QUICKSTART_HOMEPAGE + + # Managed locally (set up automatically) + local: + # Current runtime dir (Sling launchpad, JCR repository) + unpack_dir: "aem/home/var/instance" + # Archived runtime dir (AEM backup files '*.aemb.zst') + backup_dir: "aem/home/var/backup" + + # Oak Run tool options (offline instance management) + oak_run: + download_url: "https://repo1.maven.org/maven2/org/apache/jackrabbit/oak-run/1.44.0/oak-run-1.44.0.jar" + store_path: "crx-quickstart/repository/segmentstore" + + # Source files + quickstart: + # AEM SDK ZIP or JAR + dist_file: 'aem/home/lib/{aem-sdk,cq-quickstart}-*.{zip,jar}' + # AEM License properties file + license_file: "aem/home/lib/license.properties" + + # Status discovery (timezone, AEM version, etc) + status: + timeout: 500ms + + # JCR Repository + repo: + property_change_ignored: + # AEM assigns them automatically + - "jcr:created" + - "cq:lastModified" + # AEM encrypts it right after changing by replication agent setup command + - "transportPassword" + + # CRX Package Manager + package: + # Force re-uploading/installing of snapshot AEM packages (just built / unreleased) + snapshot_patterns: [ "**/*-SNAPSHOT.zip" ] + snapshot_ignored: false + # Use checksums to avoid re-deployments when snapshot AEM packages are unchanged + snapshot_deploy_skipping: true + # Disable following workflow launchers for a package deployment time only + toggled_workflows: [/libs/settings/workflow/launcher/config/update_asset_*,/libs/settings/workflow/launcher/config/dam_*] + # Also sub-packages + install_recursive: true + # Use slower HTML endpoint for deployments but with better troubleshooting + install_html: + enabled: false + # Print HTML directly to console instead of writing to file + console: false + # Fail on case 'installed with errors' + strict: true + # Number of changes after which the commit to the repository is performed + install_save_threshold: 1024 + # Allows to relax dependency handling if needed + install_dependency_handling: required + # Controls how 'rep:policy' nodes are handled during import + install_ac_handling: '' + + # 'SSL By Default' + ssl: + setup_timeout: 30s + + # OSGi Framework + osgi: + shutdown_delay: 3s + + bundle: + install: + start: true + start_level: 20 + refresh_packages: true + + # Crypto Support + crypto: + key_bundle_symbolic_name: com.adobe.granite.crypto.file + + # Replication + replication: + bundle_symbolic_name: com.day.cq.cq-replication + + # Workflow Manager + workflow: + launcher: + lib_root: /libs/settings/workflow/launcher + config_root: /conf/global/settings/workflow/launcher + toggle_retry: + timeout: 10m + delay: 10s + +java: + # Require following versions before e.g running AEM instances + version_constraints: ">= 11, < 12" + + # Pre-installed local JDK dir + # a) keep it empty to download open source Java automatically for current OS and architecture + # b) set it to absolute path or to env var '[[.Env.JAVA_HOME]]' to indicate where closed source Java like Oracle is installed + home_dir: "" + + # Auto-installed JDK options + download: + # Source URL with template vars support + url: "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.18%2B10/OpenJDK11U-jdk_[[.Arch]]_[[.Os]]_hotspot_11.0.18_10.[[.ArchiveExt]]" + # Map source URL template vars to be compatible with Adoptium Java + replacements: + # Var 'Os' (GOOS) + "darwin": "mac" + # Var 'Arch' (GOARCH) + "x86_64": "x64" + "amd64": "x64" + "386": "x86-32" + # enforce non-ARM Java as some AEM features are not working on ARM (e.g Scene7) + "arm64": "x64" + "aarch64": "x64" + +base: + # Location of temporary files (downloaded AEM packages, etc) + tmp_dir: aem/home/tmp + # Location of supportive tools (downloaded Java, OakRun, unpacked AEM SDK) + tool_dir: aem/home/opt + +log: + level: info + timestamp_format: "2006-01-02 15:04:05" + full_timestamp: true + +input: + format: yml + file: STDIN + +output: + format: text + log: + # File path of logs written especially when output format is different than 'text' + file: aem/home/var/log/aem.log + # Controls where outputs and logs should be written to when format is 'text' (console|file|both) + mode: both diff --git a/provider/instance/consts.go b/provider/instance/consts.go new file mode 100644 index 0000000..9267133 --- /dev/null +++ b/provider/instance/consts.go @@ -0,0 +1,26 @@ +package instance + +import _ "embed" + +//go:embed description.md +var DescriptionMD string + +//go:embed aem.yml +var ConfigYML string + +//go:embed systemd.conf +var ServiceConf string + +var CreateScriptInline = []string{ + `sh aemw instance init`, + `sh aemw instance create`, +} + +var LaunchScriptInline = []string{ + `sh aemw osgi config save --pid 'org.apache.sling.jcr.davex.impl.servlets.SlingDavExServlet' --input-string 'alias: /crx/server'`, + `sh aemw repl agent setup -A --location 'author' --name 'publish' --input-string '{enabled: true, transportUri: "http://localhost:4503/bin/receive?sling:authRequestLogin=1", transportUser: admin, transportPassword: admin, userId: admin}'`, +} + +var DeleteScriptInline = []string{ + `sh aemw instance delete`, +} diff --git a/provider/instance/description.md b/provider/instance/description.md new file mode 100644 index 0000000..2d5ae85 --- /dev/null +++ b/provider/instance/description.md @@ -0,0 +1,12 @@ +The instance resource allows you to create and manage AEM instances. + +With this resource, you can set up one or many AEM instances on a single machine. + +If you need to set up multiple AEM instances on multiple machines, you can use this resource multiple times. However, remember to use different client settings and adapt the compose configuration accordingly. This is because the default configuration assumes that both AEM author and publish are set up on the same machine. + +## Example usages + +Consider reviewing the following examples to find the one that best suits your needs: + +1. [AWS EC2 instance with public IP](https://github.com/wttech/pulumi-provider-aem/tree/main/examples/go/ssh) +2. [AWS EC2 instance with private IP](https://github.com/wttech/pulumi-provider-aem/tree/main/examples/go/ssm) diff --git a/provider/instance/systemd.conf b/provider/instance/systemd.conf new file mode 100644 index 0000000..489215b --- /dev/null +++ b/provider/instance/systemd.conf @@ -0,0 +1,20 @@ +[Unit] +Description=AEM Instances +Requires=network.target +After=cloud-final.service + +[Service] +Type=forking +User=[[.USER]] + +ExecStart=sh -c ". /etc/profile && cd [[.DATA_DIR]] && sh aemw instance start" +ExecStop=sh -c ". /etc/profile && cd [[.DATA_DIR]] && sh aemw instance stop" +ExecReload=sh -c ". /etc/profile && cd [[.DATA_DIR]] && sh aemw instance restart" +KillMode=process +RemainAfterExit=yes +TimeoutStartSec=1810 +TimeoutStopSec=190 +LimitNOFILE=20000 + +[Install] +WantedBy=cloud-init.target diff --git a/provider/instance_client.go b/provider/instance_client.go new file mode 100644 index 0000000..71e9f24 --- /dev/null +++ b/provider/instance_client.go @@ -0,0 +1,288 @@ +package provider + +import ( + "fmt" + "github.com/pulumi/pulumi/sdk/v3/go/common/diag" + "github.com/wttech/pulumi-provider-aem/provider/utils" + "golang.org/x/exp/maps" + "gopkg.in/yaml.v3" + "time" +) + +const ( + ServiceName = "aem" +) + +type InstanceClient ClientContext[InstanceResourceModelArgs] + +func (ic *InstanceClient) Close() error { + return ic.cl.Disconnect() +} + +func (ic *InstanceClient) dataDir() string { + return ic.data.System.DataDir +} + +func (ic *InstanceClient) prepareWorkDir() error { + return ic.cl.DirEnsure(ic.cl.WorkDir) +} + +func (ic *InstanceClient) prepareDataDir() error { + return ic.cl.DirEnsure(ic.dataDir()) +} + +func (ic *InstanceClient) installComposeCLI() error { + if !ic.data.Compose.Download { + ic.ctx.Log(diag.Info, "Skipping AEM Compose CLI wrapper download. It is expected to be alternatively installed under the data directory.") + return nil + } + exists, err := ic.cl.FileExists(fmt.Sprintf("%s/aemw", ic.dataDir())) + if err != nil { + return fmt.Errorf("cannot check if AEM Compose CLI wrapper is installed: %w", err) + } + if !exists { + ic.ctx.Log(diag.Info, "Downloading AEM Compose CLI wrapper") + out, err := ic.cl.RunShellCommand("curl -s 'https://raw.githubusercontent.com/wttech/aemc/main/pkg/project/common/aemw' -o 'aemw'", ic.dataDir()) + ic.ctx.Log(diag.Info, string(out)) + if err != nil { + return fmt.Errorf("cannot download AEM Compose CLI wrapper: %w", err) + } + ic.ctx.Log(diag.Info, "Downloaded AEM Compose CLI wrapper") + } + return nil +} + +func (ic *InstanceClient) writeConfigFile() error { + configYAML := ic.data.Compose.Config + if err := ic.cl.FileWrite(fmt.Sprintf("%s/aem/default/etc/aem.yml", ic.dataDir()), configYAML); err != nil { + return fmt.Errorf("unable to copy AEM configuration file: %w", err) + } + return nil +} + +func (ic *InstanceClient) copyFiles() error { + filesMap := ic.data.Files + for localPath, remotePath := range filesMap { + if err := ic.cl.PathCopy(localPath, remotePath, true); err != nil { + return fmt.Errorf("unable to copy path '%s' to '%s': %w", localPath, remotePath, err) + } + } + return nil +} + +func (ic *InstanceClient) create() error { + return ic.doActionOnce("create", ic.dataDir(), func() error { + ic.ctx.Log(diag.Info, "Creating AEM instance(s)") + if err := ic.configureService(); err != nil { + return err + } + if err := ic.saveProfileScript(); err != nil { + return err + } + if err := ic.runScript("create", ic.data.Compose.Create, ic.dataDir()); err != nil { + return err + } + ic.ctx.Log(diag.Info, "Created AEM instance(s)") + return nil + }) +} + +func (ic *InstanceClient) saveProfileScript() error { + envFile := fmt.Sprintf("/etc/profile.d/%s.sh", ServiceName) + + systemEnvMap := ic.data.System.Env + + envMap := map[string]string{} + maps.Copy(envMap, ic.cl.Env) + maps.Copy(envMap, systemEnvMap) + + ic.cl.Sudo = true + defer func() { ic.cl.Sudo = false }() + + if err := ic.cl.FileWrite(envFile, utils.EnvToScript(envMap)); err != nil { + return fmt.Errorf("unable to write AEM environment variables file '%s': %w", envFile, err) + } + return nil +} + +func (ic *InstanceClient) configureService() error { + user := ic.data.System.User + if user == "" { + user = ic.cl.Connection().User() + } + vars := map[string]string{ + "DATA_DIR": ic.dataDir(), + "USER": user, + } + + ic.cl.Sudo = true + defer func() { ic.cl.Sudo = false }() + + serviceTemplated, err := utils.TemplateString(ic.data.System.ServiceConfig, vars) + if err != nil { + return fmt.Errorf("unable to template AEM system service definition: %w", err) + } + serviceFile := fmt.Sprintf("/etc/systemd/system/%s.service", ServiceName) + if err := ic.cl.FileWrite(serviceFile, serviceTemplated); err != nil { + return fmt.Errorf("unable to write AEM system service definition '%s': %w", serviceFile, err) + } + + if err := ic.runServiceAction("enable"); err != nil { + return err + } + return nil +} + +func (ic *InstanceClient) runServiceAction(action string) error { + ic.cl.Sudo = true + defer func() { ic.cl.Sudo = false }() + + outBytes, err := ic.cl.RunShellCommand(fmt.Sprintf("systemctl %s %s.service", action, ServiceName), ".") + if err != nil { + return fmt.Errorf("unable to perform AEM system service action '%s': %w", action, err) + } + outText := string(outBytes) + ic.ctx.Log(diag.Info, outText) + return nil +} + +func (ic *InstanceClient) launch() error { + ic.ctx.Log(diag.Info, "Launching AEM instance(s)") + if err := ic.runServiceAction("start"); err != nil { + return err + } + if err := ic.applyConfig(); err != nil { + return err + } + if err := ic.runScript("configure", ic.data.Compose.Configure, ic.dataDir()); err != nil { + return err + } + ic.ctx.Log(diag.Info, "Launched AEM instance(s)") + return nil +} + +func (ic *InstanceClient) applyConfig() error { + ic.ctx.Log(diag.Info, "Applying AEM instance configuration") + outBytes, err := ic.cl.RunShellCommand("sh aemw instance launch", ic.dataDir()) + if err != nil { + return fmt.Errorf("unable to apply AEM instance configuration: %w", err) + } + outText := string(outBytes) + ic.ctx.Log(diag.Info, outText) + ic.ctx.Log(diag.Info, "Applied AEM instance configuration") + return nil +} + +func (ic *InstanceClient) terminate() error { + ic.ctx.Log(diag.Info, "Terminating AEM instance(s)") + if err := ic.runServiceAction("stop"); err != nil { + return err + } + if err := ic.runScript("delete", ic.data.Compose.Delete, ic.dataDir()); err != nil { + return err + } + ic.ctx.Log(diag.Info, "Terminated AEM instance(s)") + return nil +} + +func (ic *InstanceClient) deleteDataDir() error { + if err := ic.cl.PathDelete(ic.dataDir()); err != nil { + return fmt.Errorf("cannot delete AEM data directory: %w", err) + } + return nil +} + +type InstanceStatus struct { + Data struct { + Instances []struct { + ID string `yaml:"id"` + URL string `yaml:"url"` + AemVersion string `yaml:"aem_version"` + Attributes []string `yaml:"attributes"` + RunModes []string `yaml:"run_modes"` + HealthChecks []string `yaml:"health_checks"` + Dir string `yaml:"dir"` + } `yaml:"instances"` + } +} + +func (ic *InstanceClient) ReadStatus() (InstanceStatus, error) { + var status InstanceStatus + yamlBytes, err := ic.cl.RunShellCommand("sh aemw instance status --output-format yaml", ic.dataDir()) + if err != nil { + return status, err + } + if err := yaml.Unmarshal(yamlBytes, &status); err != nil { + return status, fmt.Errorf("unable to parse AEM instance status: %w", err) + } + return status, nil +} + +func (ic *InstanceClient) bootstrap() error { + return ic.doActionOnce("bootstrap", ic.cl.WorkDir, func() error { + return ic.runScript("bootstrap", ic.data.System.Bootstrap, ".") + }) +} + +func (ic *InstanceClient) runScript(name string, script InstanceScript, dir string) error { + scriptCmd := script.Script + inlineCmds := script.Inline + + if scriptCmd != "" { + if err := ic.runScriptMultiline(name, scriptCmd, dir); err != nil { + return err + } + } + if len(inlineCmds) > 0 { + if err := ic.runScriptInline(name, inlineCmds, dir); err != nil { + return err + } + } + + return nil +} + +func (ic *InstanceClient) runScriptInline(name string, inlineCmds []string, dir string) error { + for i, cmd := range inlineCmds { + ic.ctx.Logf(diag.Info, "Executing command '%s' of script '%s' (%d/%d)", cmd, name, i+1, len(inlineCmds)) + textOut, err := ic.cl.RunShellScript(name, cmd, dir) + if err != nil { + return fmt.Errorf("unable to execute command '%s' of script '%s' properly: %w", cmd, name, err) + } + textStr := string(textOut) + ic.ctx.Logf(diag.Info, "Executed command '%s' of script '%s' (%d/%d)", cmd, name, i+1, len(inlineCmds)) + ic.ctx.Log(diag.Info, textStr) + } + return nil +} + +func (ic *InstanceClient) runScriptMultiline(name string, scriptCmd string, dir string) error { + ic.ctx.Logf(diag.Info, "Executing instance script '%s'", name) + textOut, err := ic.cl.RunShellScript(name, scriptCmd, dir) + if err != nil { + return fmt.Errorf("unable to execute script '%s' properly: %w", name, err) + } + textStr := string(textOut) + ic.ctx.Logf(diag.Info, "Executed instance script '%s'", name) + ic.ctx.Log(diag.Info, textStr) + return nil +} + +func (ic *InstanceClient) doActionOnce(name string, lockDir string, action func() error) error { + lock := fmt.Sprintf("%s/provider/%s.lock", lockDir, name) + exists, err := ic.cl.FileExists(lock) + if err != nil { + return fmt.Errorf("cannot read lock file '%s': %w", lock, err) + } + if exists { + ic.ctx.Logf(diag.Info, "Skipping AEM instance action '%s' (lock file already exists '%s')", name, lock) + return nil + } + if err := action(); err != nil { + return err + } + if err := ic.cl.FileWrite(lock, time.Now().String()); err != nil { + return fmt.Errorf("cannot save lock file '%s': %w", lock, err) + } + return nil +} diff --git a/provider/instance_resource.go b/provider/instance_resource.go new file mode 100644 index 0000000..b20e543 --- /dev/null +++ b/provider/instance_resource.go @@ -0,0 +1,143 @@ +package provider + +import ( + p "github.com/pulumi/pulumi-go-provider" + "github.com/pulumi/pulumi/sdk/v3/go/common/diag" + "github.com/spf13/cast" + "github.com/wttech/pulumi-provider-aem/provider/client" + "golang.org/x/exp/maps" + "time" +) + +func NewInstanceResource() *InstanceResource { + return &InstanceResource{ + clientManager: client.ClientManagerDefault, + } +} + +type InstanceResource struct { + clientManager *client.ClientManager +} + +func (r *InstanceResource) CreateOrUpdate(ctx p.Context, model InstanceResourceModelArgs) (*InstanceStatus, error) { + ctx.Log(diag.Info, "Started setting up AEM instance resource") + + ic, err := r.client(ctx, model, cast.ToDuration(model.Client.ActionTimeout)) + if err != nil { + ctx.Logf(diag.Error, "Unable to connect to AEM instance %s", err) + return nil, err + } + defer func(ic *InstanceClient) { + err := ic.Close() + if err != nil { + ctx.Logf(diag.Warning, "Unable to disconnect from AEM instance %s", err) + } + }(ic) + + if err := ic.bootstrap(); err != nil { + ctx.Logf(diag.Error, "Unable to bootstrap AEM instance machine %s", err) + return nil, err + } + if err := ic.copyFiles(); err != nil { + ctx.Logf(diag.Error, "Unable to copy AEM instance files %s", err) + return nil, err + } + if err := ic.prepareWorkDir(); err != nil { + ctx.Logf(diag.Error, "Unable to prepare AEM work directory %s", err) + return nil, err + } + if err := ic.prepareDataDir(); err != nil { + ctx.Logf(diag.Error, "Unable to prepare AEM data directory %s", err) + return nil, err + } + if err := ic.installComposeCLI(); err != nil { + ctx.Logf(diag.Error, "Unable to install AEM Compose CLI %s", err) + return nil, err + } + if err := ic.writeConfigFile(); err != nil { + ctx.Logf(diag.Error, "Unable to write AEM configuration file %s", err) + return nil, err + } + if err := ic.create(); err != nil { + ctx.Logf(diag.Error, "Unable to create AEM instance %s", err) + return nil, err + } + if err := ic.launch(); err != nil { + ctx.Logf(diag.Error, "Unable to launch AEM instance %s", err) + return nil, err + } + + ctx.Log(diag.Info, "Finished setting up AEM instance resource") + + status, err := ic.ReadStatus() + if err != nil { + ctx.Logf(diag.Error, "Unable to read AEM instance status %s", err) + return nil, err + } + + return &status, nil +} + +func (r *InstanceResource) Delete(ctx p.Context, model InstanceResourceModelArgs) error { + ctx.Log(diag.Info, "Started deleting AEM instance resource") + + ic, err := r.client(ctx, model, cast.ToDuration(model.Client.StateTimeout)) + if err != nil { + ctx.Logf(diag.Error, "Unable to connect to AEM instance %s", err) + return err + } + defer func(ic *InstanceClient) { + err := ic.Close() + if err != nil { + ctx.Logf(diag.Warning, "Unable to disconnect from AEM instance %s", err) + } + }(ic) + + if err := ic.terminate(); err != nil { + ctx.Logf(diag.Error, "Unable to terminate AEM instance %s", err) + return err + } + + if err := ic.deleteDataDir(); err != nil { + ctx.Logf(diag.Error, "Unable to delete AEM data directory %s", err) + return err + } + + ctx.Log(diag.Info, "Finished deleting AEM instance resource") + return nil +} + +func (r *InstanceResource) client(ctx p.Context, model InstanceResourceModelArgs, timeout time.Duration) (*InstanceClient, error) { + typeName := model.Client.Type + ctx.Logf(diag.Info, "Connecting to AEM instance machine using %s", typeName) + + cl, err := r.clientManager.Make(typeName, r.clientSettings(model)) + if err != nil { + return nil, err + } + + if err := cl.ConnectWithRetry(timeout, func() { ctx.Log(diag.Info, "Awaiting connection to AEM instance machine") }); err != nil { + return nil, err + } + + cl.Env["AEM_CLI_VERSION"] = model.Compose.Version + cl.Env["AEM_OUTPUT_LOG_MODE"] = "both" + cl.WorkDir = model.System.WorkDir + + if err := cl.SetupEnv(); err != nil { + return nil, err + } + + ctx.Logf(diag.Info, "Connected to AEM instance machine using %s", cl.Connection().Info()) + return &InstanceClient{cl, ctx, model}, nil +} + +func (r *InstanceResource) clientSettings(model InstanceResourceModelArgs) map[string]string { + settings := model.Client.Settings + credentials := model.Client.Credentials + + combined := map[string]string{} + maps.Copy(combined, credentials) + maps.Copy(combined, settings) + return combined +} diff --git a/provider/provider.go b/provider/provider.go index b67cb08..0d9ca77 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -1,37 +1,18 @@ -// Copyright 2016-2023, Pulumi Corporation. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - package provider import ( - "github.com/pulumi/pulumi/sdk/v3/go/common/resource" - "math/rand" - "time" - p "github.com/pulumi/pulumi-go-provider" "github.com/pulumi/pulumi-go-provider/infer" + "github.com/pulumi/pulumi/sdk/v3/go/common/resource" "github.com/pulumi/pulumi/sdk/v3/go/common/tokens" + "github.com/wttech/pulumi-provider-aem/provider/instance" ) -// Version is initialized by the Go linker to contain the semver of this build. var Version string const Name string = "aem" func Provider() p.Provider { - // We tell the provider what resources it needs to support. - // In this case, a single custom resource. return infer.Provider(infer.Options{ Resources: []infer.InferredResource{ infer.Resource[InstanceResourceModel, InstanceResourceModelArgs, InstanceResourceModelState](), @@ -42,58 +23,147 @@ func Provider() p.Provider { }) } -// Each resource has a controlling struct. -// Resource behavior is determined by implementing methods on the controlling struct. -// The `Create` method is mandatory, but other methods are optional. -// - Check: Remap inputs before they are typed. -// - Diff: Change how instances of a resource are compared. -// - Update: Mutate a resource in place. -// - Read: Get the state of a resource from the backing provider. -// - Delete: Custom logic when the resource is deleted. -// - Annotate: Describe fields and set defaults for a resource. -// - WireDependencies: Control how outputs and secrets flows through values. type InstanceResourceModel struct{} -// Each resource has an input struct, defining what arguments it accepts. type InstanceResourceModelArgs struct { - // Fields projected into Pulumi must be public and hava a `pulumi:"..."` tag. - // The pulumi tag doesn't need to match the field name, but it's generally a - // good idea. - Length int `pulumi:"length,optional"` + Client ClientModel `pulumi:"client"` + Files map[string]string `pulumi:"files,optional"` + System SystemModel `pulumi:"system,optional"` + Compose ComposeModel `pulumi:"compose,optional"` +} + +type ClientModel struct { + Type string `pulumi:"type"` + Settings map[string]string `pulumi:"settings"` + Credentials map[string]string `pulumi:"credentials,optional"` + ActionTimeout string `pulumi:"action_timeout,optional"` + StateTimeout string `pulumi:"state_timeout,optional"` +} + +type SystemModel struct { + DataDir string `pulumi:"data_dir,optional"` + WorkDir string `pulumi:"work_dir,optional"` + Env map[string]string `pulumi:"env,optional"` + ServiceConfig string `pulumi:"service_config,optional"` + User string `pulumi:"user,optional"` + Bootstrap InstanceScript `pulumi:"bootstrap,optional"` +} + +type ComposeModel struct { + Download bool `pulumi:"download,optional"` + Version string `pulumi:"version,optional"` + Config string `pulumi:"config,optional"` + Create InstanceScript `pulumi:"create,optional"` + Configure InstanceScript `pulumi:"configure,optional"` + Delete InstanceScript `pulumi:"delete,optional"` +} + +type InstanceScript struct { + Inline []string `pulumi:"inline,optional"` + Script string `pulumi:"script,optional"` +} + +type InstanceModel struct { + ID string `pulumi:"id"` + URL string `pulumi:"url"` + AemVersion string `pulumi:"aem_version"` + Dir string `pulumi:"dir"` + Attributes []string `pulumi:"attributes"` + RunModes []string `pulumi:"run_modes"` } -// Each resource has a state, describing the fields that exist on the created resource. type InstanceResourceModelState struct { - // It is generally a good idea to embed args in outputs, but it isn't strictly necessary. InstanceResourceModelArgs - // Here we define a required output called result. - Result string `pulumi:"result"` + Instances []InstanceModel `pulumi:"instances"` } -// All resources must implement Create at a minimum. func (InstanceResourceModel) Create(ctx p.Context, name string, input InstanceResourceModelArgs, preview bool) (string, InstanceResourceModelState, error) { state := InstanceResourceModelState{InstanceResourceModelArgs: input} if preview { return name, state, nil } - state.Result = determineResult(input.Length) + + instanceResource := NewInstanceResource() + status, err := instanceResource.CreateOrUpdate(ctx, input) + if err != nil { + return name, state, err + } + + var instances []InstanceModel + for _, item := range status.Data.Instances { + instances = append(instances, InstanceModel{ + ID: item.ID, + URL: item.URL, + AemVersion: item.AemVersion, + Dir: item.Dir, + Attributes: item.Attributes, + RunModes: item.RunModes, + }) + } + state.Instances = instances + return name, state, nil } -func determineResult(length int) string { - seededRand := rand.New(rand.NewSource(time.Now().UnixNano())) - charset := []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") - - result := make([]rune, length) - for i := range result { - result[i] = charset[seededRand.Intn(len(charset))] +func (InstanceResourceModel) Delete(ctx p.Context, id string, props InstanceResourceModelState) error { + instanceResource := NewInstanceResource() + if err := instanceResource.Delete(ctx, props.InstanceResourceModelArgs); err != nil { + return err } - return string(result) + + return nil } func (InstanceResourceModel) Check(ctx p.Context, name string, oldInputs, newInputs resource.PropertyMap) (InstanceResourceModelArgs, []p.CheckFailure, error) { - if _, ok := newInputs["length"]; !ok { - newInputs["length"] = resource.NewNumberProperty(12) - } + inputs := determineInputs(newInputs, "client") + setDefaultValue(inputs, "credentials", resource.NewObjectProperty(resource.PropertyMap{})) + setDefaultValue(inputs, "action_timeout", resource.NewStringProperty("10m")) + setDefaultValue(inputs, "state_timeout", resource.NewStringProperty("30s")) + + _ = determineInputs(newInputs, "files") + + inputs = determineInputs(newInputs, "system") + setDefaultInlineScripts(inputs, "bootstrap", []string{}) + setDefaultValue(inputs, "data_dir", resource.NewStringProperty("/mnt/aemc")) + setDefaultValue(inputs, "work_dir", resource.NewStringProperty("/tmp/aemc")) + setDefaultValue(inputs, "service_config", resource.NewStringProperty(instance.ServiceConf)) + setDefaultValue(inputs, "user", resource.NewStringProperty("")) + setDefaultValue(inputs, "env", resource.NewObjectProperty(resource.PropertyMap{})) + + inputs = determineInputs(newInputs, "compose") + setDefaultValue(inputs, "download", resource.NewBoolProperty(true)) + setDefaultValue(inputs, "version", resource.NewStringProperty("1.6.12")) + setDefaultValue(inputs, "config", resource.NewStringProperty(instance.ConfigYML)) + setDefaultInlineScripts(inputs, "create", instance.CreateScriptInline) + setDefaultInlineScripts(inputs, "configure", instance.LaunchScriptInline) + setDefaultInlineScripts(inputs, "delete", instance.DeleteScriptInline) + return infer.DefaultCheck[InstanceResourceModelArgs](newInputs) } + +func determineInputs(allInputs resource.PropertyMap, key resource.PropertyKey) resource.PropertyMap { + if inputs, ok := allInputs[key]; ok { + return inputs.V.(resource.PropertyMap) + } else { + inputs = resource.NewObjectProperty(resource.PropertyMap{}) + allInputs[key] = inputs + return inputs.V.(resource.PropertyMap) + } +} + +func setDefaultValue(inputs resource.PropertyMap, key resource.PropertyKey, value resource.PropertyValue) { + if _, ok := inputs[key]; !ok { + inputs[key] = value + } +} + +func setDefaultInlineScripts(allInputs resource.PropertyMap, key resource.PropertyKey, scripts []string) { + inputs := determineInputs(allInputs, key) + if !inputs.HasValue("inline") && !inputs.HasValue("script") { + var wrappedScripts []resource.PropertyValue + for _, script := range scripts { + wrappedScripts = append(wrappedScripts, resource.NewStringProperty(script)) + } + inputs["inline"] = resource.NewArrayProperty(wrappedScripts) + } +} diff --git a/provider/utils/os.go b/provider/utils/os.go new file mode 100644 index 0000000..cf7fe3d --- /dev/null +++ b/provider/utils/os.go @@ -0,0 +1,17 @@ +package utils + +import ( + "fmt" + "strings" +) + +func EnvToScript(env map[string]string) string { + var sb strings.Builder + sb.WriteString("#!/bin/sh\n") + for name, value := range env { + escapedValue := strings.ReplaceAll(value, "\"", "\\\"") + escapedValue = strings.ReplaceAll(escapedValue, "$", "\\$") + sb.WriteString(fmt.Sprintf("export %s=\"%s\"\n", name, escapedValue)) + } + return sb.String() +} diff --git a/provider/utils/template.go b/provider/utils/template.go new file mode 100644 index 0000000..91dd44b --- /dev/null +++ b/provider/utils/template.go @@ -0,0 +1,18 @@ +package utils + +import ( + "bytes" + "text/template" +) + +func TemplateString(tplContent string, data any) (string, error) { + tplParsed, err := template.New("string-template").Delims("[[", "]]").Parse(tplContent) + if err != nil { + return "", err + } + var tplOutput bytes.Buffer + if err := tplParsed.Execute(&tplOutput, data); err != nil { + return "", err + } + return tplOutput.String(), nil +} diff --git a/sdk/go/aem/compose/instanceResourceModel.go b/sdk/go/aem/compose/instanceResourceModel.go index d5b7219..3786761 100644 --- a/sdk/go/aem/compose/instanceResourceModel.go +++ b/sdk/go/aem/compose/instanceResourceModel.go @@ -7,6 +7,7 @@ import ( "context" "reflect" + "errors" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" "github.com/wttech/pulumi-provider-aem/sdk/go/aem/internal" ) @@ -14,17 +15,23 @@ import ( type InstanceResourceModel struct { pulumi.CustomResourceState - Length pulumi.IntPtrOutput `pulumi:"length"` - Result pulumi.StringOutput `pulumi:"result"` + Client ClientModelOutput `pulumi:"client"` + Compose ComposeModelPtrOutput `pulumi:"compose"` + Files pulumi.StringMapOutput `pulumi:"files"` + Instances InstanceModelArrayOutput `pulumi:"instances"` + System SystemModelPtrOutput `pulumi:"system"` } // NewInstanceResourceModel registers a new resource with the given unique name, arguments, and options. func NewInstanceResourceModel(ctx *pulumi.Context, name string, args *InstanceResourceModelArgs, opts ...pulumi.ResourceOption) (*InstanceResourceModel, error) { if args == nil { - args = &InstanceResourceModelArgs{} + return nil, errors.New("missing one or more required arguments") } + if args.Client == nil { + return nil, errors.New("invalid value for required argument 'Client'") + } opts = internal.PkgResourceDefaultOpts(opts) var resource InstanceResourceModel err := ctx.RegisterResource("aem:compose:InstanceResourceModel", name, args, &resource, opts...) @@ -58,12 +65,18 @@ func (InstanceResourceModelState) ElementType() reflect.Type { } type instanceResourceModelArgs struct { - Length *int `pulumi:"length"` + Client ClientModel `pulumi:"client"` + Compose *ComposeModel `pulumi:"compose"` + Files map[string]string `pulumi:"files"` + System *SystemModel `pulumi:"system"` } // The set of arguments for constructing a InstanceResourceModel resource. type InstanceResourceModelArgs struct { - Length pulumi.IntPtrInput + Client ClientModelInput + Compose ComposeModelPtrInput + Files pulumi.StringMapInput + System SystemModelPtrInput } func (InstanceResourceModelArgs) ElementType() reflect.Type { @@ -103,12 +116,24 @@ func (o InstanceResourceModelOutput) ToInstanceResourceModelOutputWithContext(ct return o } -func (o InstanceResourceModelOutput) Length() pulumi.IntPtrOutput { - return o.ApplyT(func(v *InstanceResourceModel) pulumi.IntPtrOutput { return v.Length }).(pulumi.IntPtrOutput) +func (o InstanceResourceModelOutput) Client() ClientModelOutput { + return o.ApplyT(func(v *InstanceResourceModel) ClientModelOutput { return v.Client }).(ClientModelOutput) +} + +func (o InstanceResourceModelOutput) Compose() ComposeModelPtrOutput { + return o.ApplyT(func(v *InstanceResourceModel) ComposeModelPtrOutput { return v.Compose }).(ComposeModelPtrOutput) +} + +func (o InstanceResourceModelOutput) Files() pulumi.StringMapOutput { + return o.ApplyT(func(v *InstanceResourceModel) pulumi.StringMapOutput { return v.Files }).(pulumi.StringMapOutput) +} + +func (o InstanceResourceModelOutput) Instances() InstanceModelArrayOutput { + return o.ApplyT(func(v *InstanceResourceModel) InstanceModelArrayOutput { return v.Instances }).(InstanceModelArrayOutput) } -func (o InstanceResourceModelOutput) Result() pulumi.StringOutput { - return o.ApplyT(func(v *InstanceResourceModel) pulumi.StringOutput { return v.Result }).(pulumi.StringOutput) +func (o InstanceResourceModelOutput) System() SystemModelPtrOutput { + return o.ApplyT(func(v *InstanceResourceModel) SystemModelPtrOutput { return v.System }).(SystemModelPtrOutput) } func init() { diff --git a/sdk/go/aem/compose/pulumiTypes.go b/sdk/go/aem/compose/pulumiTypes.go new file mode 100644 index 0000000..31b714d --- /dev/null +++ b/sdk/go/aem/compose/pulumiTypes.go @@ -0,0 +1,737 @@ +// Code generated by pulumi-language-go DO NOT EDIT. +// *** WARNING: Do not edit by hand unless you're certain you know what you are doing! *** + +package compose + +import ( + "context" + "reflect" + + "github.com/pulumi/pulumi/sdk/v3/go/pulumi" + "github.com/wttech/pulumi-provider-aem/sdk/go/aem/internal" +) + +var _ = internal.GetEnvOrDefault + +type ClientModel struct { + Action_timeout *string `pulumi:"action_timeout"` + Credentials map[string]string `pulumi:"credentials"` + Settings map[string]string `pulumi:"settings"` + State_timeout *string `pulumi:"state_timeout"` + Type string `pulumi:"type"` +} + +// ClientModelInput is an input type that accepts ClientModelArgs and ClientModelOutput values. +// You can construct a concrete instance of `ClientModelInput` via: +// +// ClientModelArgs{...} +type ClientModelInput interface { + pulumi.Input + + ToClientModelOutput() ClientModelOutput + ToClientModelOutputWithContext(context.Context) ClientModelOutput +} + +type ClientModelArgs struct { + Action_timeout pulumi.StringPtrInput `pulumi:"action_timeout"` + Credentials pulumi.StringMapInput `pulumi:"credentials"` + Settings pulumi.StringMapInput `pulumi:"settings"` + State_timeout pulumi.StringPtrInput `pulumi:"state_timeout"` + Type pulumi.StringInput `pulumi:"type"` +} + +func (ClientModelArgs) ElementType() reflect.Type { + return reflect.TypeOf((*ClientModel)(nil)).Elem() +} + +func (i ClientModelArgs) ToClientModelOutput() ClientModelOutput { + return i.ToClientModelOutputWithContext(context.Background()) +} + +func (i ClientModelArgs) ToClientModelOutputWithContext(ctx context.Context) ClientModelOutput { + return pulumi.ToOutputWithContext(ctx, i).(ClientModelOutput) +} + +type ClientModelOutput struct{ *pulumi.OutputState } + +func (ClientModelOutput) ElementType() reflect.Type { + return reflect.TypeOf((*ClientModel)(nil)).Elem() +} + +func (o ClientModelOutput) ToClientModelOutput() ClientModelOutput { + return o +} + +func (o ClientModelOutput) ToClientModelOutputWithContext(ctx context.Context) ClientModelOutput { + return o +} + +func (o ClientModelOutput) Action_timeout() pulumi.StringPtrOutput { + return o.ApplyT(func(v ClientModel) *string { return v.Action_timeout }).(pulumi.StringPtrOutput) +} + +func (o ClientModelOutput) Credentials() pulumi.StringMapOutput { + return o.ApplyT(func(v ClientModel) map[string]string { return v.Credentials }).(pulumi.StringMapOutput) +} + +func (o ClientModelOutput) Settings() pulumi.StringMapOutput { + return o.ApplyT(func(v ClientModel) map[string]string { return v.Settings }).(pulumi.StringMapOutput) +} + +func (o ClientModelOutput) State_timeout() pulumi.StringPtrOutput { + return o.ApplyT(func(v ClientModel) *string { return v.State_timeout }).(pulumi.StringPtrOutput) +} + +func (o ClientModelOutput) Type() pulumi.StringOutput { + return o.ApplyT(func(v ClientModel) string { return v.Type }).(pulumi.StringOutput) +} + +type ComposeModel struct { + Config *string `pulumi:"config"` + Configure *InstanceScript `pulumi:"configure"` + Create *InstanceScript `pulumi:"create"` + Delete *InstanceScript `pulumi:"delete"` + Download *bool `pulumi:"download"` + Version *string `pulumi:"version"` +} + +// ComposeModelInput is an input type that accepts ComposeModelArgs and ComposeModelOutput values. +// You can construct a concrete instance of `ComposeModelInput` via: +// +// ComposeModelArgs{...} +type ComposeModelInput interface { + pulumi.Input + + ToComposeModelOutput() ComposeModelOutput + ToComposeModelOutputWithContext(context.Context) ComposeModelOutput +} + +type ComposeModelArgs struct { + Config pulumi.StringPtrInput `pulumi:"config"` + Configure InstanceScriptPtrInput `pulumi:"configure"` + Create InstanceScriptPtrInput `pulumi:"create"` + Delete InstanceScriptPtrInput `pulumi:"delete"` + Download pulumi.BoolPtrInput `pulumi:"download"` + Version pulumi.StringPtrInput `pulumi:"version"` +} + +func (ComposeModelArgs) ElementType() reflect.Type { + return reflect.TypeOf((*ComposeModel)(nil)).Elem() +} + +func (i ComposeModelArgs) ToComposeModelOutput() ComposeModelOutput { + return i.ToComposeModelOutputWithContext(context.Background()) +} + +func (i ComposeModelArgs) ToComposeModelOutputWithContext(ctx context.Context) ComposeModelOutput { + return pulumi.ToOutputWithContext(ctx, i).(ComposeModelOutput) +} + +func (i ComposeModelArgs) ToComposeModelPtrOutput() ComposeModelPtrOutput { + return i.ToComposeModelPtrOutputWithContext(context.Background()) +} + +func (i ComposeModelArgs) ToComposeModelPtrOutputWithContext(ctx context.Context) ComposeModelPtrOutput { + return pulumi.ToOutputWithContext(ctx, i).(ComposeModelOutput).ToComposeModelPtrOutputWithContext(ctx) +} + +// ComposeModelPtrInput is an input type that accepts ComposeModelArgs, ComposeModelPtr and ComposeModelPtrOutput values. +// You can construct a concrete instance of `ComposeModelPtrInput` via: +// +// ComposeModelArgs{...} +// +// or: +// +// nil +type ComposeModelPtrInput interface { + pulumi.Input + + ToComposeModelPtrOutput() ComposeModelPtrOutput + ToComposeModelPtrOutputWithContext(context.Context) ComposeModelPtrOutput +} + +type composeModelPtrType ComposeModelArgs + +func ComposeModelPtr(v *ComposeModelArgs) ComposeModelPtrInput { + return (*composeModelPtrType)(v) +} + +func (*composeModelPtrType) ElementType() reflect.Type { + return reflect.TypeOf((**ComposeModel)(nil)).Elem() +} + +func (i *composeModelPtrType) ToComposeModelPtrOutput() ComposeModelPtrOutput { + return i.ToComposeModelPtrOutputWithContext(context.Background()) +} + +func (i *composeModelPtrType) ToComposeModelPtrOutputWithContext(ctx context.Context) ComposeModelPtrOutput { + return pulumi.ToOutputWithContext(ctx, i).(ComposeModelPtrOutput) +} + +type ComposeModelOutput struct{ *pulumi.OutputState } + +func (ComposeModelOutput) ElementType() reflect.Type { + return reflect.TypeOf((*ComposeModel)(nil)).Elem() +} + +func (o ComposeModelOutput) ToComposeModelOutput() ComposeModelOutput { + return o +} + +func (o ComposeModelOutput) ToComposeModelOutputWithContext(ctx context.Context) ComposeModelOutput { + return o +} + +func (o ComposeModelOutput) ToComposeModelPtrOutput() ComposeModelPtrOutput { + return o.ToComposeModelPtrOutputWithContext(context.Background()) +} + +func (o ComposeModelOutput) ToComposeModelPtrOutputWithContext(ctx context.Context) ComposeModelPtrOutput { + return o.ApplyTWithContext(ctx, func(_ context.Context, v ComposeModel) *ComposeModel { + return &v + }).(ComposeModelPtrOutput) +} + +func (o ComposeModelOutput) Config() pulumi.StringPtrOutput { + return o.ApplyT(func(v ComposeModel) *string { return v.Config }).(pulumi.StringPtrOutput) +} + +func (o ComposeModelOutput) Configure() InstanceScriptPtrOutput { + return o.ApplyT(func(v ComposeModel) *InstanceScript { return v.Configure }).(InstanceScriptPtrOutput) +} + +func (o ComposeModelOutput) Create() InstanceScriptPtrOutput { + return o.ApplyT(func(v ComposeModel) *InstanceScript { return v.Create }).(InstanceScriptPtrOutput) +} + +func (o ComposeModelOutput) Delete() InstanceScriptPtrOutput { + return o.ApplyT(func(v ComposeModel) *InstanceScript { return v.Delete }).(InstanceScriptPtrOutput) +} + +func (o ComposeModelOutput) Download() pulumi.BoolPtrOutput { + return o.ApplyT(func(v ComposeModel) *bool { return v.Download }).(pulumi.BoolPtrOutput) +} + +func (o ComposeModelOutput) Version() pulumi.StringPtrOutput { + return o.ApplyT(func(v ComposeModel) *string { return v.Version }).(pulumi.StringPtrOutput) +} + +type ComposeModelPtrOutput struct{ *pulumi.OutputState } + +func (ComposeModelPtrOutput) ElementType() reflect.Type { + return reflect.TypeOf((**ComposeModel)(nil)).Elem() +} + +func (o ComposeModelPtrOutput) ToComposeModelPtrOutput() ComposeModelPtrOutput { + return o +} + +func (o ComposeModelPtrOutput) ToComposeModelPtrOutputWithContext(ctx context.Context) ComposeModelPtrOutput { + return o +} + +func (o ComposeModelPtrOutput) Elem() ComposeModelOutput { + return o.ApplyT(func(v *ComposeModel) ComposeModel { + if v != nil { + return *v + } + var ret ComposeModel + return ret + }).(ComposeModelOutput) +} + +func (o ComposeModelPtrOutput) Config() pulumi.StringPtrOutput { + return o.ApplyT(func(v *ComposeModel) *string { + if v == nil { + return nil + } + return v.Config + }).(pulumi.StringPtrOutput) +} + +func (o ComposeModelPtrOutput) Configure() InstanceScriptPtrOutput { + return o.ApplyT(func(v *ComposeModel) *InstanceScript { + if v == nil { + return nil + } + return v.Configure + }).(InstanceScriptPtrOutput) +} + +func (o ComposeModelPtrOutput) Create() InstanceScriptPtrOutput { + return o.ApplyT(func(v *ComposeModel) *InstanceScript { + if v == nil { + return nil + } + return v.Create + }).(InstanceScriptPtrOutput) +} + +func (o ComposeModelPtrOutput) Delete() InstanceScriptPtrOutput { + return o.ApplyT(func(v *ComposeModel) *InstanceScript { + if v == nil { + return nil + } + return v.Delete + }).(InstanceScriptPtrOutput) +} + +func (o ComposeModelPtrOutput) Download() pulumi.BoolPtrOutput { + return o.ApplyT(func(v *ComposeModel) *bool { + if v == nil { + return nil + } + return v.Download + }).(pulumi.BoolPtrOutput) +} + +func (o ComposeModelPtrOutput) Version() pulumi.StringPtrOutput { + return o.ApplyT(func(v *ComposeModel) *string { + if v == nil { + return nil + } + return v.Version + }).(pulumi.StringPtrOutput) +} + +type InstanceModel struct { + Aem_version string `pulumi:"aem_version"` + Attributes []string `pulumi:"attributes"` + Dir string `pulumi:"dir"` + Id string `pulumi:"id"` + Run_modes []string `pulumi:"run_modes"` + Url string `pulumi:"url"` +} + +type InstanceModelOutput struct{ *pulumi.OutputState } + +func (InstanceModelOutput) ElementType() reflect.Type { + return reflect.TypeOf((*InstanceModel)(nil)).Elem() +} + +func (o InstanceModelOutput) ToInstanceModelOutput() InstanceModelOutput { + return o +} + +func (o InstanceModelOutput) ToInstanceModelOutputWithContext(ctx context.Context) InstanceModelOutput { + return o +} + +func (o InstanceModelOutput) Aem_version() pulumi.StringOutput { + return o.ApplyT(func(v InstanceModel) string { return v.Aem_version }).(pulumi.StringOutput) +} + +func (o InstanceModelOutput) Attributes() pulumi.StringArrayOutput { + return o.ApplyT(func(v InstanceModel) []string { return v.Attributes }).(pulumi.StringArrayOutput) +} + +func (o InstanceModelOutput) Dir() pulumi.StringOutput { + return o.ApplyT(func(v InstanceModel) string { return v.Dir }).(pulumi.StringOutput) +} + +func (o InstanceModelOutput) Id() pulumi.StringOutput { + return o.ApplyT(func(v InstanceModel) string { return v.Id }).(pulumi.StringOutput) +} + +func (o InstanceModelOutput) Run_modes() pulumi.StringArrayOutput { + return o.ApplyT(func(v InstanceModel) []string { return v.Run_modes }).(pulumi.StringArrayOutput) +} + +func (o InstanceModelOutput) Url() pulumi.StringOutput { + return o.ApplyT(func(v InstanceModel) string { return v.Url }).(pulumi.StringOutput) +} + +type InstanceModelArrayOutput struct{ *pulumi.OutputState } + +func (InstanceModelArrayOutput) ElementType() reflect.Type { + return reflect.TypeOf((*[]InstanceModel)(nil)).Elem() +} + +func (o InstanceModelArrayOutput) ToInstanceModelArrayOutput() InstanceModelArrayOutput { + return o +} + +func (o InstanceModelArrayOutput) ToInstanceModelArrayOutputWithContext(ctx context.Context) InstanceModelArrayOutput { + return o +} + +func (o InstanceModelArrayOutput) Index(i pulumi.IntInput) InstanceModelOutput { + return pulumi.All(o, i).ApplyT(func(vs []interface{}) InstanceModel { + return vs[0].([]InstanceModel)[vs[1].(int)] + }).(InstanceModelOutput) +} + +type InstanceScript struct { + Inline []string `pulumi:"inline"` + Script *string `pulumi:"script"` +} + +// InstanceScriptInput is an input type that accepts InstanceScriptArgs and InstanceScriptOutput values. +// You can construct a concrete instance of `InstanceScriptInput` via: +// +// InstanceScriptArgs{...} +type InstanceScriptInput interface { + pulumi.Input + + ToInstanceScriptOutput() InstanceScriptOutput + ToInstanceScriptOutputWithContext(context.Context) InstanceScriptOutput +} + +type InstanceScriptArgs struct { + Inline pulumi.StringArrayInput `pulumi:"inline"` + Script pulumi.StringPtrInput `pulumi:"script"` +} + +func (InstanceScriptArgs) ElementType() reflect.Type { + return reflect.TypeOf((*InstanceScript)(nil)).Elem() +} + +func (i InstanceScriptArgs) ToInstanceScriptOutput() InstanceScriptOutput { + return i.ToInstanceScriptOutputWithContext(context.Background()) +} + +func (i InstanceScriptArgs) ToInstanceScriptOutputWithContext(ctx context.Context) InstanceScriptOutput { + return pulumi.ToOutputWithContext(ctx, i).(InstanceScriptOutput) +} + +func (i InstanceScriptArgs) ToInstanceScriptPtrOutput() InstanceScriptPtrOutput { + return i.ToInstanceScriptPtrOutputWithContext(context.Background()) +} + +func (i InstanceScriptArgs) ToInstanceScriptPtrOutputWithContext(ctx context.Context) InstanceScriptPtrOutput { + return pulumi.ToOutputWithContext(ctx, i).(InstanceScriptOutput).ToInstanceScriptPtrOutputWithContext(ctx) +} + +// InstanceScriptPtrInput is an input type that accepts InstanceScriptArgs, InstanceScriptPtr and InstanceScriptPtrOutput values. +// You can construct a concrete instance of `InstanceScriptPtrInput` via: +// +// InstanceScriptArgs{...} +// +// or: +// +// nil +type InstanceScriptPtrInput interface { + pulumi.Input + + ToInstanceScriptPtrOutput() InstanceScriptPtrOutput + ToInstanceScriptPtrOutputWithContext(context.Context) InstanceScriptPtrOutput +} + +type instanceScriptPtrType InstanceScriptArgs + +func InstanceScriptPtr(v *InstanceScriptArgs) InstanceScriptPtrInput { + return (*instanceScriptPtrType)(v) +} + +func (*instanceScriptPtrType) ElementType() reflect.Type { + return reflect.TypeOf((**InstanceScript)(nil)).Elem() +} + +func (i *instanceScriptPtrType) ToInstanceScriptPtrOutput() InstanceScriptPtrOutput { + return i.ToInstanceScriptPtrOutputWithContext(context.Background()) +} + +func (i *instanceScriptPtrType) ToInstanceScriptPtrOutputWithContext(ctx context.Context) InstanceScriptPtrOutput { + return pulumi.ToOutputWithContext(ctx, i).(InstanceScriptPtrOutput) +} + +type InstanceScriptOutput struct{ *pulumi.OutputState } + +func (InstanceScriptOutput) ElementType() reflect.Type { + return reflect.TypeOf((*InstanceScript)(nil)).Elem() +} + +func (o InstanceScriptOutput) ToInstanceScriptOutput() InstanceScriptOutput { + return o +} + +func (o InstanceScriptOutput) ToInstanceScriptOutputWithContext(ctx context.Context) InstanceScriptOutput { + return o +} + +func (o InstanceScriptOutput) ToInstanceScriptPtrOutput() InstanceScriptPtrOutput { + return o.ToInstanceScriptPtrOutputWithContext(context.Background()) +} + +func (o InstanceScriptOutput) ToInstanceScriptPtrOutputWithContext(ctx context.Context) InstanceScriptPtrOutput { + return o.ApplyTWithContext(ctx, func(_ context.Context, v InstanceScript) *InstanceScript { + return &v + }).(InstanceScriptPtrOutput) +} + +func (o InstanceScriptOutput) Inline() pulumi.StringArrayOutput { + return o.ApplyT(func(v InstanceScript) []string { return v.Inline }).(pulumi.StringArrayOutput) +} + +func (o InstanceScriptOutput) Script() pulumi.StringPtrOutput { + return o.ApplyT(func(v InstanceScript) *string { return v.Script }).(pulumi.StringPtrOutput) +} + +type InstanceScriptPtrOutput struct{ *pulumi.OutputState } + +func (InstanceScriptPtrOutput) ElementType() reflect.Type { + return reflect.TypeOf((**InstanceScript)(nil)).Elem() +} + +func (o InstanceScriptPtrOutput) ToInstanceScriptPtrOutput() InstanceScriptPtrOutput { + return o +} + +func (o InstanceScriptPtrOutput) ToInstanceScriptPtrOutputWithContext(ctx context.Context) InstanceScriptPtrOutput { + return o +} + +func (o InstanceScriptPtrOutput) Elem() InstanceScriptOutput { + return o.ApplyT(func(v *InstanceScript) InstanceScript { + if v != nil { + return *v + } + var ret InstanceScript + return ret + }).(InstanceScriptOutput) +} + +func (o InstanceScriptPtrOutput) Inline() pulumi.StringArrayOutput { + return o.ApplyT(func(v *InstanceScript) []string { + if v == nil { + return nil + } + return v.Inline + }).(pulumi.StringArrayOutput) +} + +func (o InstanceScriptPtrOutput) Script() pulumi.StringPtrOutput { + return o.ApplyT(func(v *InstanceScript) *string { + if v == nil { + return nil + } + return v.Script + }).(pulumi.StringPtrOutput) +} + +type SystemModel struct { + Bootstrap *InstanceScript `pulumi:"bootstrap"` + Data_dir *string `pulumi:"data_dir"` + Env map[string]string `pulumi:"env"` + Service_config *string `pulumi:"service_config"` + User *string `pulumi:"user"` + Work_dir *string `pulumi:"work_dir"` +} + +// SystemModelInput is an input type that accepts SystemModelArgs and SystemModelOutput values. +// You can construct a concrete instance of `SystemModelInput` via: +// +// SystemModelArgs{...} +type SystemModelInput interface { + pulumi.Input + + ToSystemModelOutput() SystemModelOutput + ToSystemModelOutputWithContext(context.Context) SystemModelOutput +} + +type SystemModelArgs struct { + Bootstrap InstanceScriptPtrInput `pulumi:"bootstrap"` + Data_dir pulumi.StringPtrInput `pulumi:"data_dir"` + Env pulumi.StringMapInput `pulumi:"env"` + Service_config pulumi.StringPtrInput `pulumi:"service_config"` + User pulumi.StringPtrInput `pulumi:"user"` + Work_dir pulumi.StringPtrInput `pulumi:"work_dir"` +} + +func (SystemModelArgs) ElementType() reflect.Type { + return reflect.TypeOf((*SystemModel)(nil)).Elem() +} + +func (i SystemModelArgs) ToSystemModelOutput() SystemModelOutput { + return i.ToSystemModelOutputWithContext(context.Background()) +} + +func (i SystemModelArgs) ToSystemModelOutputWithContext(ctx context.Context) SystemModelOutput { + return pulumi.ToOutputWithContext(ctx, i).(SystemModelOutput) +} + +func (i SystemModelArgs) ToSystemModelPtrOutput() SystemModelPtrOutput { + return i.ToSystemModelPtrOutputWithContext(context.Background()) +} + +func (i SystemModelArgs) ToSystemModelPtrOutputWithContext(ctx context.Context) SystemModelPtrOutput { + return pulumi.ToOutputWithContext(ctx, i).(SystemModelOutput).ToSystemModelPtrOutputWithContext(ctx) +} + +// SystemModelPtrInput is an input type that accepts SystemModelArgs, SystemModelPtr and SystemModelPtrOutput values. +// You can construct a concrete instance of `SystemModelPtrInput` via: +// +// SystemModelArgs{...} +// +// or: +// +// nil +type SystemModelPtrInput interface { + pulumi.Input + + ToSystemModelPtrOutput() SystemModelPtrOutput + ToSystemModelPtrOutputWithContext(context.Context) SystemModelPtrOutput +} + +type systemModelPtrType SystemModelArgs + +func SystemModelPtr(v *SystemModelArgs) SystemModelPtrInput { + return (*systemModelPtrType)(v) +} + +func (*systemModelPtrType) ElementType() reflect.Type { + return reflect.TypeOf((**SystemModel)(nil)).Elem() +} + +func (i *systemModelPtrType) ToSystemModelPtrOutput() SystemModelPtrOutput { + return i.ToSystemModelPtrOutputWithContext(context.Background()) +} + +func (i *systemModelPtrType) ToSystemModelPtrOutputWithContext(ctx context.Context) SystemModelPtrOutput { + return pulumi.ToOutputWithContext(ctx, i).(SystemModelPtrOutput) +} + +type SystemModelOutput struct{ *pulumi.OutputState } + +func (SystemModelOutput) ElementType() reflect.Type { + return reflect.TypeOf((*SystemModel)(nil)).Elem() +} + +func (o SystemModelOutput) ToSystemModelOutput() SystemModelOutput { + return o +} + +func (o SystemModelOutput) ToSystemModelOutputWithContext(ctx context.Context) SystemModelOutput { + return o +} + +func (o SystemModelOutput) ToSystemModelPtrOutput() SystemModelPtrOutput { + return o.ToSystemModelPtrOutputWithContext(context.Background()) +} + +func (o SystemModelOutput) ToSystemModelPtrOutputWithContext(ctx context.Context) SystemModelPtrOutput { + return o.ApplyTWithContext(ctx, func(_ context.Context, v SystemModel) *SystemModel { + return &v + }).(SystemModelPtrOutput) +} + +func (o SystemModelOutput) Bootstrap() InstanceScriptPtrOutput { + return o.ApplyT(func(v SystemModel) *InstanceScript { return v.Bootstrap }).(InstanceScriptPtrOutput) +} + +func (o SystemModelOutput) Data_dir() pulumi.StringPtrOutput { + return o.ApplyT(func(v SystemModel) *string { return v.Data_dir }).(pulumi.StringPtrOutput) +} + +func (o SystemModelOutput) Env() pulumi.StringMapOutput { + return o.ApplyT(func(v SystemModel) map[string]string { return v.Env }).(pulumi.StringMapOutput) +} + +func (o SystemModelOutput) Service_config() pulumi.StringPtrOutput { + return o.ApplyT(func(v SystemModel) *string { return v.Service_config }).(pulumi.StringPtrOutput) +} + +func (o SystemModelOutput) User() pulumi.StringPtrOutput { + return o.ApplyT(func(v SystemModel) *string { return v.User }).(pulumi.StringPtrOutput) +} + +func (o SystemModelOutput) Work_dir() pulumi.StringPtrOutput { + return o.ApplyT(func(v SystemModel) *string { return v.Work_dir }).(pulumi.StringPtrOutput) +} + +type SystemModelPtrOutput struct{ *pulumi.OutputState } + +func (SystemModelPtrOutput) ElementType() reflect.Type { + return reflect.TypeOf((**SystemModel)(nil)).Elem() +} + +func (o SystemModelPtrOutput) ToSystemModelPtrOutput() SystemModelPtrOutput { + return o +} + +func (o SystemModelPtrOutput) ToSystemModelPtrOutputWithContext(ctx context.Context) SystemModelPtrOutput { + return o +} + +func (o SystemModelPtrOutput) Elem() SystemModelOutput { + return o.ApplyT(func(v *SystemModel) SystemModel { + if v != nil { + return *v + } + var ret SystemModel + return ret + }).(SystemModelOutput) +} + +func (o SystemModelPtrOutput) Bootstrap() InstanceScriptPtrOutput { + return o.ApplyT(func(v *SystemModel) *InstanceScript { + if v == nil { + return nil + } + return v.Bootstrap + }).(InstanceScriptPtrOutput) +} + +func (o SystemModelPtrOutput) Data_dir() pulumi.StringPtrOutput { + return o.ApplyT(func(v *SystemModel) *string { + if v == nil { + return nil + } + return v.Data_dir + }).(pulumi.StringPtrOutput) +} + +func (o SystemModelPtrOutput) Env() pulumi.StringMapOutput { + return o.ApplyT(func(v *SystemModel) map[string]string { + if v == nil { + return nil + } + return v.Env + }).(pulumi.StringMapOutput) +} + +func (o SystemModelPtrOutput) Service_config() pulumi.StringPtrOutput { + return o.ApplyT(func(v *SystemModel) *string { + if v == nil { + return nil + } + return v.Service_config + }).(pulumi.StringPtrOutput) +} + +func (o SystemModelPtrOutput) User() pulumi.StringPtrOutput { + return o.ApplyT(func(v *SystemModel) *string { + if v == nil { + return nil + } + return v.User + }).(pulumi.StringPtrOutput) +} + +func (o SystemModelPtrOutput) Work_dir() pulumi.StringPtrOutput { + return o.ApplyT(func(v *SystemModel) *string { + if v == nil { + return nil + } + return v.Work_dir + }).(pulumi.StringPtrOutput) +} + +func init() { + pulumi.RegisterInputType(reflect.TypeOf((*ClientModelInput)(nil)).Elem(), ClientModelArgs{}) + pulumi.RegisterInputType(reflect.TypeOf((*ComposeModelInput)(nil)).Elem(), ComposeModelArgs{}) + pulumi.RegisterInputType(reflect.TypeOf((*ComposeModelPtrInput)(nil)).Elem(), ComposeModelArgs{}) + pulumi.RegisterInputType(reflect.TypeOf((*InstanceScriptInput)(nil)).Elem(), InstanceScriptArgs{}) + pulumi.RegisterInputType(reflect.TypeOf((*InstanceScriptPtrInput)(nil)).Elem(), InstanceScriptArgs{}) + pulumi.RegisterInputType(reflect.TypeOf((*SystemModelInput)(nil)).Elem(), SystemModelArgs{}) + pulumi.RegisterInputType(reflect.TypeOf((*SystemModelPtrInput)(nil)).Elem(), SystemModelArgs{}) + pulumi.RegisterOutputType(ClientModelOutput{}) + pulumi.RegisterOutputType(ComposeModelOutput{}) + pulumi.RegisterOutputType(ComposeModelPtrOutput{}) + pulumi.RegisterOutputType(InstanceModelOutput{}) + pulumi.RegisterOutputType(InstanceModelArrayOutput{}) + pulumi.RegisterOutputType(InstanceScriptOutput{}) + pulumi.RegisterOutputType(InstanceScriptPtrOutput{}) + pulumi.RegisterOutputType(SystemModelOutput{}) + pulumi.RegisterOutputType(SystemModelPtrOutput{}) +} diff --git a/sdk/nodejs/compose/instanceResourceModel.ts b/sdk/nodejs/compose/instanceResourceModel.ts index 4045cbb..ea2e416 100644 --- a/sdk/nodejs/compose/instanceResourceModel.ts +++ b/sdk/nodejs/compose/instanceResourceModel.ts @@ -2,6 +2,8 @@ // *** Do not edit by hand unless you're certain you know what you are doing! *** import * as pulumi from "@pulumi/pulumi"; +import * as inputs from "../types/input"; +import * as outputs from "../types/output"; import * as utilities from "../utilities"; export class InstanceResourceModel extends pulumi.CustomResource { @@ -31,8 +33,11 @@ export class InstanceResourceModel extends pulumi.CustomResource { return obj['__pulumiType'] === InstanceResourceModel.__pulumiType; } - public readonly length!: pulumi.Output; - public /*out*/ readonly result!: pulumi.Output; + public readonly client!: pulumi.Output; + public readonly compose!: pulumi.Output; + public readonly files!: pulumi.Output<{[key: string]: string} | undefined>; + public /*out*/ readonly instances!: pulumi.Output; + public readonly system!: pulumi.Output; /** * Create a InstanceResourceModel resource with the given unique name, arguments, and options. @@ -41,15 +46,24 @@ export class InstanceResourceModel extends pulumi.CustomResource { * @param args The arguments to use to populate this resource's properties. * @param opts A bag of options that control this resource's behavior. */ - constructor(name: string, args?: InstanceResourceModelArgs, opts?: pulumi.CustomResourceOptions) { + constructor(name: string, args: InstanceResourceModelArgs, opts?: pulumi.CustomResourceOptions) { let resourceInputs: pulumi.Inputs = {}; opts = opts || {}; if (!opts.id) { - resourceInputs["length"] = args ? args.length : undefined; - resourceInputs["result"] = undefined /*out*/; + if ((!args || args.client === undefined) && !opts.urn) { + throw new Error("Missing required property 'client'"); + } + resourceInputs["client"] = args ? args.client : undefined; + resourceInputs["compose"] = args ? args.compose : undefined; + resourceInputs["files"] = args ? args.files : undefined; + resourceInputs["system"] = args ? args.system : undefined; + resourceInputs["instances"] = undefined /*out*/; } else { - resourceInputs["length"] = undefined /*out*/; - resourceInputs["result"] = undefined /*out*/; + resourceInputs["client"] = undefined /*out*/; + resourceInputs["compose"] = undefined /*out*/; + resourceInputs["files"] = undefined /*out*/; + resourceInputs["instances"] = undefined /*out*/; + resourceInputs["system"] = undefined /*out*/; } opts = pulumi.mergeOptions(utilities.resourceOptsDefaults(), opts); super(InstanceResourceModel.__pulumiType, name, resourceInputs, opts); @@ -60,5 +74,8 @@ export class InstanceResourceModel extends pulumi.CustomResource { * The set of arguments for constructing a InstanceResourceModel resource. */ export interface InstanceResourceModelArgs { - length?: pulumi.Input; + client: pulumi.Input; + compose?: pulumi.Input; + files?: pulumi.Input<{[key: string]: pulumi.Input}>; + system?: pulumi.Input; } diff --git a/sdk/nodejs/index.ts b/sdk/nodejs/index.ts index c07d929..3704928 100644 --- a/sdk/nodejs/index.ts +++ b/sdk/nodejs/index.ts @@ -13,9 +13,11 @@ utilities.lazyLoad(exports, ["Provider"], () => require("./provider")); // Export sub-modules: import * as compose from "./compose"; +import * as types from "./types"; export { compose, + types, }; pulumi.runtime.registerResourcePackage("aem", { version: utilities.getVersion(), diff --git a/sdk/nodejs/tsconfig.json b/sdk/nodejs/tsconfig.json index 21988a9..eec6e1d 100644 --- a/sdk/nodejs/tsconfig.json +++ b/sdk/nodejs/tsconfig.json @@ -17,6 +17,9 @@ "compose/instanceResourceModel.ts", "index.ts", "provider.ts", + "types/index.ts", + "types/input.ts", + "types/output.ts", "utilities.ts" ] } diff --git a/sdk/nodejs/types/index.ts b/sdk/nodejs/types/index.ts new file mode 100644 index 0000000..f0db274 --- /dev/null +++ b/sdk/nodejs/types/index.ts @@ -0,0 +1,13 @@ +// *** WARNING: this file was generated by pulumi-language-nodejs. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +import * as utilities from "../utilities"; + +// Export sub-modules: +import * as input from "./input"; +import * as output from "./output"; + +export { + input, + output, +}; diff --git a/sdk/nodejs/types/input.ts b/sdk/nodejs/types/input.ts new file mode 100644 index 0000000..f8a0f59 --- /dev/null +++ b/sdk/nodejs/types/input.ts @@ -0,0 +1,39 @@ +// *** WARNING: this file was generated by pulumi-language-nodejs. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +import * as pulumi from "@pulumi/pulumi"; +import * as inputs from "../types/input"; +import * as outputs from "../types/output"; + +export namespace compose { + export interface ClientModelArgs { + action_timeout?: pulumi.Input; + credentials?: pulumi.Input<{[key: string]: pulumi.Input}>; + settings: pulumi.Input<{[key: string]: pulumi.Input}>; + state_timeout?: pulumi.Input; + type: pulumi.Input; + } + + export interface ComposeModelArgs { + config?: pulumi.Input; + configure?: pulumi.Input; + create?: pulumi.Input; + delete?: pulumi.Input; + download?: pulumi.Input; + version?: pulumi.Input; + } + + export interface InstanceScriptArgs { + inline?: pulumi.Input[]>; + script?: pulumi.Input; + } + + export interface SystemModelArgs { + bootstrap?: pulumi.Input; + data_dir?: pulumi.Input; + env?: pulumi.Input<{[key: string]: pulumi.Input}>; + service_config?: pulumi.Input; + user?: pulumi.Input; + work_dir?: pulumi.Input; + } +} diff --git a/sdk/nodejs/types/output.ts b/sdk/nodejs/types/output.ts new file mode 100644 index 0000000..d97e209 --- /dev/null +++ b/sdk/nodejs/types/output.ts @@ -0,0 +1,49 @@ +// *** WARNING: this file was generated by pulumi-language-nodejs. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +import * as pulumi from "@pulumi/pulumi"; +import * as inputs from "../types/input"; +import * as outputs from "../types/output"; + +export namespace compose { + export interface ClientModel { + action_timeout?: string; + credentials?: {[key: string]: string}; + settings: {[key: string]: string}; + state_timeout?: string; + type: string; + } + + export interface ComposeModel { + config?: string; + configure?: outputs.compose.InstanceScript; + create?: outputs.compose.InstanceScript; + delete?: outputs.compose.InstanceScript; + download?: boolean; + version?: string; + } + + export interface InstanceModel { + aem_version: string; + attributes: string[]; + dir: string; + id: string; + run_modes: string[]; + url: string; + } + + export interface InstanceScript { + inline?: string[]; + script?: string; + } + + export interface SystemModel { + bootstrap?: outputs.compose.InstanceScript; + data_dir?: string; + env?: {[key: string]: string}; + service_config?: string; + user?: string; + work_dir?: string; + } + +} diff --git a/tests/go.mod b/tests/go.mod index e6b2334..3dc77d8 100644 --- a/tests/go.mod +++ b/tests/go.mod @@ -37,7 +37,7 @@ require ( github.com/go-git/go-billy/v5 v5.5.0 // indirect github.com/go-git/go-git/v5 v5.11.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/glog v1.1.0 // indirect + github.com/golang/glog v1.1.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 // indirect @@ -48,7 +48,7 @@ require ( github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-localereader v0.0.1 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect github.com/mitchellh/go-ps v1.0.0 // indirect @@ -86,18 +86,18 @@ require ( github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/zclconf/go-cty v1.13.2 // indirect go.uber.org/atomic v1.10.0 // indirect - golang.org/x/crypto v0.17.0 // indirect - golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect + golang.org/x/crypto v0.18.0 // indirect + golang.org/x/exp v0.0.0-20240119083558-1b970713d09a // indirect golang.org/x/mod v0.14.0 // indirect - golang.org/x/net v0.19.0 // indirect - golang.org/x/sync v0.5.0 // indirect - golang.org/x/sys v0.15.0 // indirect - golang.org/x/term v0.15.0 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/term v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130 // indirect - google.golang.org/grpc v1.57.1 // indirect - google.golang.org/protobuf v1.31.0 // indirect + golang.org/x/tools v0.17.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe // indirect + google.golang.org/grpc v1.61.1 // indirect + google.golang.org/protobuf v1.32.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect lukechampine.com/frand v1.4.2 // indirect diff --git a/tests/go.sum b/tests/go.sum index d48f22a..47161b0 100644 --- a/tests/go.sum +++ b/tests/go.sum @@ -52,8 +52,8 @@ github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/El github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= @@ -69,8 +69,8 @@ github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRx github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= +github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= +github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= @@ -107,12 +107,12 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= @@ -222,10 +222,10 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/exp v0.0.0-20240119083558-1b970713d09a h1:Q8/wZp0KX97QFTc2ywcOE0YRjZPVIx+MXInMzdvQqcA= +golang.org/x/exp v0.0.0-20240119083558-1b970713d09a/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -245,15 +245,15 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -275,15 +275,15 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -301,20 +301,20 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= -golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= +golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130 h1:2FZP5XuJY9zQyGM5N0rtovnoXjiMUEIUMvw0m9wlpLc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= -google.golang.org/grpc v1.57.1 h1:upNTNqv0ES+2ZOOqACwVtS3Il8M12/+Hz41RCPzAjQg= -google.golang.org/grpc v1.57.1/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe h1:bQnxqljG/wqi4NTXu2+DJ3n7APcEA882QZ1JvhQAq9o= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= +google.golang.org/grpc v1.61.1 h1:kLAiWrZs7YeDM6MumDe7m3y4aM6wacLzM1Y/wiLP9XY= +google.golang.org/grpc v1.61.1/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/tests/provider_test.go b/tests/provider_test.go index 57a2019..c29d833 100644 --- a/tests/provider_test.go +++ b/tests/provider_test.go @@ -32,8 +32,17 @@ func TestInstanceResourceModelCreate(t *testing.T) { prov := provider() checkResponse, err := prov.Check(p.CheckRequest{ - Urn: urn("InstanceResourceModel"), - News: resource.PropertyMap{}, + Urn: urn("InstanceResourceModel"), + News: resource.PropertyMap{ + "client": resource.NewObjectProperty(resource.PropertyMap{ + "type": resource.NewStringProperty("mock"), + "settings": resource.NewObjectProperty(resource.PropertyMap{ + "setting1": resource.NewStringProperty("value1"), + "setting2": resource.NewStringProperty("value2"), + "setting3": resource.NewStringProperty("value3"), + }), + }), + }, }) require.NoError(t, err) From f7f6887f2ecaf012842fbf9f9604a5971632d47e Mon Sep 17 00:00:00 2001 From: Dominik Przybyl Date: Fri, 23 Feb 2024 13:20:23 +0100 Subject: [PATCH 3/8] added ssh, ssm examples --- examples/go/go.mod | 2 +- examples/ssh/Pulumi.yaml | 6 + examples/ssh/aem.yml | 258 ++++++++++++++++++ examples/ssh/ec2-key.sh | 3 + examples/ssh/go.mod | 95 +++++++ examples/ssh/go.sum | 317 +++++++++++++++++++++++ examples/ssh/main.go | 168 ++++++++++++ examples/ssm/Pulumi.yaml | 6 + examples/ssm/go.mod | 95 +++++++ examples/ssm/go.sum | 317 +++++++++++++++++++++++ examples/ssm/main.go | 156 +++++++++++ provider/cmd/pulumi-resource-aem/main.go | 14 - provider/go.mod | 4 +- tests/go.mod | 19 ++ tests/go.sum | 54 ++++ tests/provider_test.go | 32 +-- 16 files changed, 1502 insertions(+), 44 deletions(-) create mode 100644 examples/ssh/Pulumi.yaml create mode 100644 examples/ssh/aem.yml create mode 100644 examples/ssh/ec2-key.sh create mode 100644 examples/ssh/go.mod create mode 100644 examples/ssh/go.sum create mode 100644 examples/ssh/main.go create mode 100644 examples/ssm/Pulumi.yaml create mode 100644 examples/ssm/go.mod create mode 100644 examples/ssm/go.sum create mode 100644 examples/ssm/main.go diff --git a/examples/go/go.mod b/examples/go/go.mod index 8882dc0..9026e68 100644 --- a/examples/go/go.mod +++ b/examples/go/go.mod @@ -1,4 +1,4 @@ -module github.com/wttech/pulumi-provider-aem/examples +module github.com/wttech/pulumi-provider-aem/examples/ssh go 1.21 diff --git a/examples/ssh/Pulumi.yaml b/examples/ssh/Pulumi.yaml new file mode 100644 index 0000000..af6150c --- /dev/null +++ b/examples/ssh/Pulumi.yaml @@ -0,0 +1,6 @@ +name: pulumi-provider-aem +runtime: go +plugins: + providers: + - name: aem + path: ../../bin diff --git a/examples/ssh/aem.yml b/examples/ssh/aem.yml new file mode 100644 index 0000000..fc194f0 --- /dev/null +++ b/examples/ssh/aem.yml @@ -0,0 +1,258 @@ +# AEM instances to work with +instance: + + # Full details of local or remote instances + config: + local_author: + active: true + http_url: http://127.0.0.1:4502 + user: admin + password: admin + run_modes: [local] + jvm_opts: + - -server + - -Djava.awt.headless=true + - -Djava.io.tmpdir=[[canonicalPath .Path "aem/home/tmp"]] + - -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:14502 + - -Duser.language=en + - -Duser.country=US + - -Duser.timezone=UTC + start_opts: [] + secret_vars: + - ACME_SECRET=value + env_vars: + - ACME_VAR=value + sling_props: [] + local_publish: + active: true + http_url: http://127.0.0.1:4503 + user: admin + password: admin + run_modes: [local] + jvm_opts: + - -server + - -Djava.awt.headless=true + - -Djava.io.tmpdir=[[canonicalPath .Path "aem/home/tmp"]] + - -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:14503 + - -Duser.language=en + - -Duser.country=US + - -Duser.timezone=UTC + start_opts: [] + secret_vars: + - ACME_SECRET=value + env_vars: + - ACME_VAR=value + sling_props: [] + + # Tuning performance & reliability + # 'auto' - for more than 1 local instances - 'serial', otherwise 'parallel' + # 'parallel' - for working with remote instances + # 'serial' - for working with local instances + processing_mode: auto + + # HTTP client settings + http: + timeout: 10m + debug: false + disable_warn: true + + # State checking + check: + # Time to wait before first state checking (to avoid false-positives) + warmup: 1s + # Time to wait for next state checking + interval: 6s + # Number of successful check attempts that indicates end of checking + done_threshold: 3 + # Wait only for those instances whose state has been changed internally (unaware of external changes) + await_strict: true + # Max time to wait for the instance to be healthy after executing the start script or e.g deploying a package + await_started: + timeout: 30m + # Max time to wait for the instance to be stopped after executing the stop script + await_stopped: + timeout: 10m + # Max time in which socket connection to instance should be established + reachable: + skip: false + timeout: 3s + # Bundle state tracking + bundle_stable: + skip: false + symbolic_names_ignored: [] + # OSGi events tracking + event_stable: + skip: false + # Topics indicating that instance is not stable + topics_unstable: + - "org/osgi/framework/ServiceEvent/*" + - "org/osgi/framework/FrameworkEvent/*" + - "org/osgi/framework/BundleEvent/*" + # Ignored service names to handle known issues + details_ignored: + - "*.*MBean" + - "org.osgi.service.component.runtime.ServiceComponentRuntime" + - "java.util.ResourceBundle" + received_max_age: 5s + # OSGi components state tracking + component_stable: + skip: false + pids: + include: ['com.day.crx.packaging.*', 'org.apache.sling.installer.*'] + exclude: ['org.apache.sling.installer.hc.*', 'org.apache.sling.installer.core.impl.console.*'] + match: + "disabled": [] + "no config": [] + "unsatisfied (reference)": [] + "satisfied": [] + # Sling Installer tracking + installer: + skip: false + # JMX state checking + state: true + # Pause Installation nodes checking + pause: true + # Specific endpoints / paths (like login page) + path_ready: + timeout: 10s + login_page: + skip: false + path: "/libs/granite/core/content/login.html" + status_code: 200 + contained_text: QUICKSTART_HOMEPAGE + + # Managed locally (set up automatically) + local: + # Current runtime dir (Sling launchpad, JCR repository) + unpack_dir: "aem/home/var/instance" + # Archived runtime dir (AEM backup files '*.aemb.zst') + backup_dir: "aem/home/var/backup" + + # Oak Run tool options (offline instance management) + oak_run: + download_url: "https://repo1.maven.org/maven2/org/apache/jackrabbit/oak-run/1.44.0/oak-run-1.44.0.jar" + store_path: "crx-quickstart/repository/segmentstore" + + # Source files + quickstart: + # AEM SDK ZIP or JAR + dist_file: 'aem/home/lib/{aem-sdk,cq-quickstart}-*.{zip,jar}' + # AEM License properties file + license_file: "aem/home/lib/license.properties" + + # Status discovery (timezone, AEM version, etc) + status: + timeout: 500ms + + # JCR Repository + repo: + property_change_ignored: + # AEM assigns them automatically + - "jcr:created" + - "cq:lastModified" + # AEM encrypts it right after changing by replication agent setup command + - "transportPassword" + + # CRX Package Manager + package: + # Force re-uploading/installing of snapshot AEM packages (just built / unreleased) + snapshot_patterns: [ "**/*-SNAPSHOT.zip" ] + snapshot_ignored: false + # Use checksums to avoid re-deployments when snapshot AEM packages are unchanged + snapshot_deploy_skipping: true + # Disable following workflow launchers for a package deployment time only + toggled_workflows: [/libs/settings/workflow/launcher/config/update_asset_*,/libs/settings/workflow/launcher/config/dam_*] + # Also sub-packages + install_recursive: true + # Use slower HTML endpoint for deployments but with better troubleshooting + install_html: + enabled: false + # Print HTML directly to console instead of writing to file + console: false + # Fail on case 'installed with errors' + strict: true + # Number of changes after which the commit to the repository is performed + install_save_threshold: 1024 + # Allows to relax dependency handling if needed + install_dependency_handling: required + # Controls how 'rep:policy' nodes are handled during import + install_ac_handling: '' + + # 'SSL By Default' + ssl: + setup_timeout: 30s + + # OSGi Framework + osgi: + shutdown_delay: 3s + + bundle: + install: + start: true + start_level: 20 + refresh_packages: true + + # Crypto Support + crypto: + key_bundle_symbolic_name: com.adobe.granite.crypto.file + + # Replication + replication: + bundle_symbolic_name: com.day.cq.cq-replication + + # Workflow Manager + workflow: + launcher: + lib_root: /libs/settings/workflow/launcher + config_root: /conf/global/settings/workflow/launcher + toggle_retry: + timeout: 10m + delay: 10s + +java: + # Require following versions before e.g running AEM instances + version_constraints: ">= 11, < 12" + + # Pre-installed local JDK dir + # a) keep it empty to download open source Java automatically for current OS and architecture + # b) set it to absolute path or to env var '[[.Env.JAVA_HOME]]' to indicate where closed source Java like Oracle is installed + home_dir: "" + + # Auto-installed JDK options + download: + # Source URL with template vars support + url: "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.18%2B10/OpenJDK11U-jdk_[[.Arch]]_[[.Os]]_hotspot_11.0.18_10.[[.ArchiveExt]]" + # Map source URL template vars to be compatible with Adoptium Java + replacements: + # Var 'Os' (GOOS) + "darwin": "mac" + # Var 'Arch' (GOARCH) + "x86_64": "x64" + "amd64": "x64" + "386": "x86-32" + # enforce non-ARM Java as some AEM features are not working on ARM (e.g Scene7) + "arm64": "x64" + "aarch64": "x64" + +base: + # Location of temporary files (downloaded AEM packages, etc) + tmp_dir: aem/home/tmp + # Location of supportive tools (downloaded Java, OakRun, unpacked AEM SDK) + tool_dir: aem/home/opt + +log: + level: info + timestamp_format: "2006-01-02 15:04:05" + full_timestamp: true + +input: + format: yml + file: STDIN + +output: + format: text + log: + # File path of logs written especially when output format is different than 'text' + file: aem/home/var/log/aem.log + # Controls where outputs and logs should be written to when format is 'text' (console|file|both) + mode: both diff --git a/examples/ssh/ec2-key.sh b/examples/ssh/ec2-key.sh new file mode 100644 index 0000000..9d323cf --- /dev/null +++ b/examples/ssh/ec2-key.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +ssh-keygen -P "" -t rsa -b 4096 -m pem -f ec2-key.cer diff --git a/examples/ssh/go.mod b/examples/ssh/go.mod new file mode 100644 index 0000000..d6e911d --- /dev/null +++ b/examples/ssh/go.mod @@ -0,0 +1,95 @@ +module github.com/dprzybyl/pulumi-provider-aem/examples + +go 1.21 + +replace github.com/dprzybyl/pulumi-provider-aem/sdk => ../../sdk + +require ( + github.com/dprzybyl/pulumi-provider-aem/sdk v0.0.0-20240207010449-6e972a29045f + github.com/pulumi/pulumi-aws/sdk/v6 v6.21.0 + github.com/pulumi/pulumi/sdk/v3 v3.104.2 +) + +require ( + dario.cat/mergo v1.0.0 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/ProtonMail/go-crypto v1.0.0 // indirect + github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect + github.com/agext/levenshtein v1.2.3 // indirect + github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect + github.com/atotto/clipboard v0.1.4 // indirect + github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect + github.com/blang/semver v3.5.1+incompatible // indirect + github.com/charmbracelet/bubbles v0.18.0 // indirect + github.com/charmbracelet/bubbletea v0.25.0 // indirect + github.com/charmbracelet/lipgloss v0.9.1 // indirect + github.com/cheggaaa/pb v1.0.29 // indirect + github.com/cloudflare/circl v1.3.7 // indirect + github.com/containerd/console v1.0.4 // indirect + github.com/cyphar/filepath-securejoin v0.2.4 // indirect + github.com/djherbis/times v1.6.0 // indirect + github.com/emirpasic/gods v1.18.1 // indirect + github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect + github.com/go-git/go-billy/v5 v5.5.0 // indirect + github.com/go-git/go-git/v5 v5.11.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/glog v1.2.0 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/hcl/v2 v2.19.1 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect + github.com/kevinburke/ssh_config v1.2.0 // indirect + github.com/lucasb-eyer/go-colorful v1.2.0 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-localereader v0.0.1 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/mitchellh/go-ps v1.0.0 // indirect + github.com/mitchellh/go-wordwrap v1.0.1 // indirect + github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect + github.com/muesli/cancelreader v0.2.2 // indirect + github.com/muesli/reflow v0.3.0 // indirect + github.com/muesli/termenv v0.15.2 // indirect + github.com/opentracing/basictracer-go v1.1.0 // indirect + github.com/opentracing/opentracing-go v1.2.0 // indirect + github.com/pgavlin/fx v0.1.6 // indirect + github.com/pjbgf/sha1cd v0.3.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pkg/term v1.1.0 // indirect + github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231 // indirect + github.com/pulumi/esc v0.8.0 // indirect + github.com/rivo/uniseg v0.4.6 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 // indirect + github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect + github.com/sergi/go-diff v1.3.1 // indirect + github.com/skeema/knownhosts v1.2.1 // indirect + github.com/spf13/cobra v1.8.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/stretchr/objx v0.2.0 // indirect + github.com/texttheater/golang-levenshtein v1.0.1 // indirect + github.com/tweekmonster/luser v0.0.0-20161003172636-3fa38070dbd7 // indirect + github.com/uber/jaeger-client-go v2.30.0+incompatible // indirect + github.com/uber/jaeger-lib v2.4.1+incompatible // indirect + github.com/xanzy/ssh-agent v0.3.3 // indirect + github.com/zclconf/go-cty v1.14.2 // indirect + go.uber.org/atomic v1.11.0 // indirect + golang.org/x/crypto v0.18.0 // indirect + golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3 // indirect + golang.org/x/mod v0.15.0 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/term v0.16.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/tools v0.17.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240205150955-31a09d347014 // indirect + google.golang.org/grpc v1.61.0 // indirect + google.golang.org/protobuf v1.32.0 // indirect + gopkg.in/warnings.v0 v0.1.2 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + lukechampine.com/frand v1.4.2 // indirect +) diff --git a/examples/ssh/go.sum b/examples/ssh/go.sum new file mode 100644 index 0000000..af003d1 --- /dev/null +++ b/examples/ssh/go.sum @@ -0,0 +1,317 @@ +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= +github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= +github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY= +github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA= +github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= +github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= +github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= +github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= +github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= +github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= +github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= +github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= +github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= +github.com/charmbracelet/bubbles v0.18.0 h1:PYv1A036luoBGroX6VWjQIE9Syf2Wby2oOl/39KLfy0= +github.com/charmbracelet/bubbles v0.18.0/go.mod h1:08qhZhtIwzgrtBjAcJnij1t1H0ZRjwHyGsy6AL11PSw= +github.com/charmbracelet/bubbletea v0.25.0 h1:bAfwk7jRz7FKFl9RzlIULPkStffg5k6pNt5dywy4TcM= +github.com/charmbracelet/bubbletea v0.25.0/go.mod h1:EN3QDR1T5ZdWmdfDzYcqOCAps45+QIJbLOBxmVNWNNg= +github.com/charmbracelet/lipgloss v0.9.1 h1:PNyd3jvaJbg4jRHKWXnCj1akQm4rh8dbEzN1p/u1KWg= +github.com/charmbracelet/lipgloss v0.9.1/go.mod h1:1mPmG4cxScwUQALAAnacHaigiiHB9Pmr+v1VEawJl6I= +github.com/cheggaaa/pb v1.0.29 h1:FckUN5ngEk2LpvuG0fw1GEFx6LtyY2pWI/Z2QgCnEYo= +github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= +github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= +github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= +github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= +github.com/containerd/console v1.0.4 h1:F2g4+oChYvBTsASRTz8NP6iIAi97J3TtSAsLbIFn4ro= +github.com/containerd/console v1.0.4/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= +github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/djherbis/times v1.6.0 h1:w2ctJ92J8fBvWPxugmXIv7Nz7Q3iDMKNx9v5ocVH20c= +github.com/djherbis/times v1.6.0/go.mod h1:gOHeRAz2h+VJNZ5Gmc/o7iD9k4wW7NMVqieYCY99oc0= +github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= +github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= +github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= +github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= +github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= +github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= +github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4= +github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= +github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 h1:MJG/KsmcqMwFAkh8mTnAwhyKoB+sTAnY4CACC110tbU= +github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/hcl/v2 v2.19.1 h1://i05Jqznmb2EXqa39Nsvyan2o5XyMowW5fnCKW5RPI= +github.com/hashicorp/hcl/v2 v2.19.1/go.mod h1:ThLC89FV4p9MPW804KVbe/cEXoQ8NZEh+JtMeeGErHE= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= +github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= +github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= +github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= +github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= +github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= +github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= +github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= +github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= +github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo= +github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/opentracing/basictracer-go v1.1.0 h1:Oa1fTSBvAl8pa3U+IJYqrKm0NALwH9OsgwOqDv4xJW0= +github.com/opentracing/basictracer-go v1.1.0/go.mod h1:V2HZueSJEp879yv285Aap1BS69fQMD+MNP1mRs6mBQc= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/pgavlin/fx v0.1.6 h1:r9jEg69DhNoCd3Xh0+5mIbdbS3PqWrVWujkY76MFRTU= +github.com/pgavlin/fx v0.1.6/go.mod h1:KWZJ6fqBBSh8GxHYqwYCf3rYE7Gp2p0N8tJp8xv9u9M= +github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= +github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/term v1.1.0 h1:xIAAdCMh3QIAy+5FrE8Ad8XoDhEU4ufwbaSozViP9kk= +github.com/pkg/term v1.1.0/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231 h1:vkHw5I/plNdTr435cARxCW6q9gc0S/Yxz7Mkd38pOb0= +github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231/go.mod h1:murToZ2N9hNJzewjHBgfFdXhZKjY3z5cYC1VXk+lbFE= +github.com/pulumi/esc v0.8.0 h1:srNfXvuJWGSfTfKiwK1+efY+w5LHZCbwzVv/yz9CQ44= +github.com/pulumi/esc v0.8.0/go.mod h1:v5VAPxYDa9DRwvubbzKt4ZYf5y0esWC2ccSp/AT923I= +github.com/pulumi/pulumi-aws/sdk/v6 v6.21.0 h1:Z93+WcEhiX8PQSid92x9TeJHOn7OCj1+F+DdYhMqrDQ= +github.com/pulumi/pulumi-aws/sdk/v6 v6.21.0/go.mod h1:+hNAJL5Ac1DBvMLnOYQnpmPp+S71kjPr6Hr2J5e7U4s= +github.com/pulumi/pulumi/sdk/v3 v3.104.2 h1:aOwUkrlsyEWrL1jlHqn2/36zMSPQrVUYUyZPqstrmjc= +github.com/pulumi/pulumi/sdk/v3 v3.104.2/go.mod h1:Ml3rpGfyZlI4zQCG7LN2XDSmH4XUNYdyBwJ3yEr/OpI= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.6 h1:Sovz9sDSwbOz9tgUy8JpT+KgCkPYJEN/oYzlJiYTNLg= +github.com/rivo/uniseg v0.4.6/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 h1:OkMGxebDjyw0ULyrTYWeN0UNCCkmCWfjPnIA2W6oviI= +github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06/go.mod h1:+ePHsJ1keEjQtpvf9HHw0f4ZeJ0TLRsxhunSI2hYJSs= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ= +github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/texttheater/golang-levenshtein v1.0.1 h1:+cRNoVrfiwufQPhoMzB6N0Yf/Mqajr6t1lOv8GyGE2U= +github.com/texttheater/golang-levenshtein v1.0.1/go.mod h1:PYAKrbF5sAiq9wd+H82hs7gNaen0CplQ9uvm6+enD/8= +github.com/tweekmonster/luser v0.0.0-20161003172636-3fa38070dbd7 h1:X9dsIWPuuEJlPX//UmRKophhOKCGXc46RVIGuttks68= +github.com/tweekmonster/luser v0.0.0-20161003172636-3fa38070dbd7/go.mod h1:UxoP3EypF8JfGEjAII8jx1q8rQyDnX8qdTCs/UQBVIE= +github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o= +github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= +github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= +github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zclconf/go-cty v1.14.2 h1:kTG7lqmBou0Zkx35r6HJHUQTvaRPr5bIAf3AoHS0izI= +github.com/zclconf/go-cty v1.14.2/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3 h1:/RIbNt/Zr7rVhIkQhooTxCxFcdWLGIKnZA4IXNFSrvo= +golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240205150955-31a09d347014 h1:FSL3lRCkhaPFxqi0s9o+V4UI2WTzAVOvkgbd4kVV4Wg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240205150955-31a09d347014/go.mod h1:SaPjaZGWb0lPqs6Ittu0spdfrOArqji4ZdeP5IC/9N4= +google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0= +google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +lukechampine.com/frand v1.4.2 h1:RzFIpOvkMXuPMBb9maa4ND4wjBn71E1Jpf8BzJHMaVw= +lukechampine.com/frand v1.4.2/go.mod h1:4S/TM2ZgrKejMcKMbeLjISpJMO+/eZ1zu3vYX9dtj3s= +pgregory.net/rapid v0.5.5 h1:jkgx1TjbQPD/feRoK+S/mXw9e1uj6WilpHrXJowi6oA= +pgregory.net/rapid v0.5.5/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= diff --git a/examples/ssh/main.go b/examples/ssh/main.go new file mode 100644 index 0000000..5e610d2 --- /dev/null +++ b/examples/ssh/main.go @@ -0,0 +1,168 @@ +package main + +import ( + "fmt" + "github.com/dprzybyl/pulumi-provider-aem/sdk/go/aem/compose" + "github.com/pulumi/pulumi-aws/sdk/v6/go/aws/ebs" + "github.com/pulumi/pulumi-aws/sdk/v6/go/aws/ec2" + "github.com/pulumi/pulumi-aws/sdk/v6/go/aws/iam" + "github.com/pulumi/pulumi/sdk/v3/go/pulumi" + "os" +) + +func file(path string) pulumi.String { + content, _ := os.ReadFile(path) + return pulumi.String(content) +} + +func main() { + workspace := "aemc" + env := "tf-minimal" + envType := "aem-single" + host := "aem-single" + dataDevice := "/dev/nvme1n1" + dataDir := "/data" + composeDir := fmt.Sprintf("%s/aemc", dataDir) + sshUser := "ec2-user" + privateKey := "ec2-key.cer" + publicKey := "ec2-key.cer.pub" + + tags := pulumi.StringMap{ + "Workspace": pulumi.String(workspace), + "Env": pulumi.String(env), + "EnvType": pulumi.String(envType), + "Host": pulumi.String(host), + "Name": pulumi.Sprintf("%s_%s_%s", workspace, envType, host), + } + + pulumi.Run(func(ctx *pulumi.Context) error { + role, err := iam.NewRole(ctx, "aem_ec2", &iam.RoleArgs{ + Name: pulumi.Sprintf("%s_aem_ec2", workspace), + AssumeRolePolicy: pulumi.String(`{ + "Version": "2012-10-17", + "Statement": { + "Effect": "Allow", + "Principal": {"Service": "ec2.amazonaws.com"}, + "Action": "sts:AssumeRole" + } +}`), + Tags: tags, + }) + if err != nil { + return err + } + + _, err = iam.NewRolePolicyAttachment(ctx, "ssm", &iam.RolePolicyAttachmentArgs{ + Role: role.Name, + PolicyArn: pulumi.String("arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"), + }) + if err != nil { + return err + } + + instanceProfile, err := iam.NewInstanceProfile(ctx, "aem_ec2", &iam.InstanceProfileArgs{ + Name: pulumi.Sprintf("%s_aem_ec2", workspace), + Role: role.Name, + Tags: tags, + }) + if err != nil { + return err + } + + keyPair, err := ec2.NewKeyPair(ctx, "aem_single", &ec2.KeyPairArgs{ + KeyName: pulumi.Sprintf("%s-example-tf", workspace), + PublicKey: file(publicKey), + Tags: tags, + }) + if err != nil { + return err + } + + instance, err := ec2.NewInstance(ctx, "aem_single", &ec2.InstanceArgs{ + Ami: pulumi.String("ami-043e06a423cbdca17"), // RHEL 8 + InstanceType: pulumi.String("m5.xlarge"), + AssociatePublicIpAddress: pulumi.Bool(true), + IamInstanceProfile: instanceProfile.Name, + KeyName: keyPair.KeyName, + Tags: tags, + }) + if err != nil { + return err + } + + volume, err := ebs.NewVolume(ctx, "aem_single_data", &ebs.VolumeArgs{ + AvailabilityZone: instance.AvailabilityZone, + Size: pulumi.Int(128), + Type: pulumi.String("gp2"), + Tags: tags, + }) + if err != nil { + return err + } + + volumeAttachment, err := ec2.NewVolumeAttachment(ctx, "aem_single_data", &ec2.VolumeAttachmentArgs{ + DeviceName: pulumi.String("/dev/xvdf"), + VolumeId: volume.ID(), + InstanceId: instance.ID(), + }) + if err != nil { + return err + } + + instanceResourceModel, err := compose.NewInstanceResourceModel(ctx, "aem_single", &compose.InstanceResourceModelArgs{ + Client: compose.ClientModelArgs{ + Type: pulumi.String("mock"), + Settings: pulumi.StringMap{ + "host": instance.PublicIp, + "port": pulumi.String("22"), + "user": pulumi.String(sshUser), + "secure": pulumi.String("false"), + }, + Credentials: pulumi.StringMap{ + "private_key": file(privateKey), + }, + }, + System: compose.SystemModelArgs{ + Data_dir: pulumi.String(dataDir), + Bootstrap: compose.InstanceScriptArgs{ + Inline: pulumi.StringArray{ + pulumi.Sprintf("sudo mkfs -t ext4 %s", dataDevice), + pulumi.Sprintf("sudo mkdir -p %s", dataDir), + pulumi.Sprintf("sudo mount %s %s", dataDevice, dataDir), + pulumi.Sprintf("sudo chown -R %s %s", sshUser, dataDir), + pulumi.Sprintf("echo '%s %s ext4 defaults 0 0' | sudo tee -a /etc/fstab", dataDevice, dataDir), + pulumi.String("sudo yum install -y unzip"), + pulumi.String("curl 'https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip' -o 'awscliv2.zip'"), + pulumi.String("unzip -q awscliv2.zip"), + pulumi.String("sudo ./aws/install --update"), + }, + }, + }, + Compose: compose.ComposeModelArgs{ + Config: file("aem.yml"), + Create: compose.InstanceScriptArgs{ + Inline: pulumi.StringArray{ + pulumi.Sprintf("mkdir -p '%s/aem/home/lib'", composeDir), + pulumi.Sprintf("aws s3 cp --recursive --no-progress 's3://aemc/instance/classic/' '%s/aem/home/lib'", composeDir), + pulumi.String("sh aemw instance init"), + pulumi.String("sh aemw instance create"), + }, + }, + Configure: compose.InstanceScriptArgs{ + Inline: pulumi.StringArray{ + pulumi.String("sh aemw osgi config save --pid 'org.apache.sling.jcr.davex.impl.servlets.SlingDavExServlet' --input-string 'alias: /crx/server'"), + pulumi.String("sh aemw repl agent setup -A --location 'author' --name 'publish' --input-string '{enabled: true, transportUri: \"http://localhost:4503/bin/receive?sling:authRequestLogin=1\", transportUser: admin, transportPassword: admin, userId: admin}'"), + pulumi.String("sh aemw package deploy --file 'aem/home/lib/aem-service-pkg-6.5.*.0.zip'"), + }, + }, + }, + }, pulumi.DependsOn([]pulumi.Resource{instance, volumeAttachment})) + if err != nil { + return err + } + + ctx.Export("instanceIp", instance.PublicIp) + ctx.Export("aemInstances", instanceResourceModel.Instances) + return nil + }) +} diff --git a/examples/ssm/Pulumi.yaml b/examples/ssm/Pulumi.yaml new file mode 100644 index 0000000..af6150c --- /dev/null +++ b/examples/ssm/Pulumi.yaml @@ -0,0 +1,6 @@ +name: pulumi-provider-aem +runtime: go +plugins: + providers: + - name: aem + path: ../../bin diff --git a/examples/ssm/go.mod b/examples/ssm/go.mod new file mode 100644 index 0000000..49a1616 --- /dev/null +++ b/examples/ssm/go.mod @@ -0,0 +1,95 @@ +module github.com/wttech/pulumi-provider-aem/examples/ssm + +go 1.21 + +replace github.com/dprzybyl/pulumi-provider-aem/sdk => ../../sdk + +require ( + github.com/dprzybyl/pulumi-provider-aem/sdk v0.0.0-00010101000000-000000000000 + github.com/pulumi/pulumi-aws/sdk/v6 v6.21.0 + github.com/pulumi/pulumi/sdk/v3 v3.104.2 +) + +require ( + dario.cat/mergo v1.0.0 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/ProtonMail/go-crypto v1.0.0 // indirect + github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect + github.com/agext/levenshtein v1.2.3 // indirect + github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect + github.com/atotto/clipboard v0.1.4 // indirect + github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect + github.com/blang/semver v3.5.1+incompatible // indirect + github.com/charmbracelet/bubbles v0.18.0 // indirect + github.com/charmbracelet/bubbletea v0.25.0 // indirect + github.com/charmbracelet/lipgloss v0.9.1 // indirect + github.com/cheggaaa/pb v1.0.29 // indirect + github.com/cloudflare/circl v1.3.7 // indirect + github.com/containerd/console v1.0.4 // indirect + github.com/cyphar/filepath-securejoin v0.2.4 // indirect + github.com/djherbis/times v1.6.0 // indirect + github.com/emirpasic/gods v1.18.1 // indirect + github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect + github.com/go-git/go-billy/v5 v5.5.0 // indirect + github.com/go-git/go-git/v5 v5.11.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/glog v1.2.0 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/hcl/v2 v2.19.1 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect + github.com/kevinburke/ssh_config v1.2.0 // indirect + github.com/lucasb-eyer/go-colorful v1.2.0 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-localereader v0.0.1 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/mitchellh/go-ps v1.0.0 // indirect + github.com/mitchellh/go-wordwrap v1.0.1 // indirect + github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect + github.com/muesli/cancelreader v0.2.2 // indirect + github.com/muesli/reflow v0.3.0 // indirect + github.com/muesli/termenv v0.15.2 // indirect + github.com/opentracing/basictracer-go v1.1.0 // indirect + github.com/opentracing/opentracing-go v1.2.0 // indirect + github.com/pgavlin/fx v0.1.6 // indirect + github.com/pjbgf/sha1cd v0.3.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pkg/term v1.1.0 // indirect + github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231 // indirect + github.com/pulumi/esc v0.8.0 // indirect + github.com/rivo/uniseg v0.4.6 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 // indirect + github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect + github.com/sergi/go-diff v1.3.1 // indirect + github.com/skeema/knownhosts v1.2.1 // indirect + github.com/spf13/cobra v1.8.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/stretchr/objx v0.2.0 // indirect + github.com/texttheater/golang-levenshtein v1.0.1 // indirect + github.com/tweekmonster/luser v0.0.0-20161003172636-3fa38070dbd7 // indirect + github.com/uber/jaeger-client-go v2.30.0+incompatible // indirect + github.com/uber/jaeger-lib v2.4.1+incompatible // indirect + github.com/xanzy/ssh-agent v0.3.3 // indirect + github.com/zclconf/go-cty v1.14.2 // indirect + go.uber.org/atomic v1.11.0 // indirect + golang.org/x/crypto v0.18.0 // indirect + golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3 // indirect + golang.org/x/mod v0.15.0 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/term v0.16.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/tools v0.17.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240205150955-31a09d347014 // indirect + google.golang.org/grpc v1.61.0 // indirect + google.golang.org/protobuf v1.32.0 // indirect + gopkg.in/warnings.v0 v0.1.2 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + lukechampine.com/frand v1.4.2 // indirect +) diff --git a/examples/ssm/go.sum b/examples/ssm/go.sum new file mode 100644 index 0000000..af003d1 --- /dev/null +++ b/examples/ssm/go.sum @@ -0,0 +1,317 @@ +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= +github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= +github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY= +github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA= +github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= +github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= +github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= +github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= +github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= +github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= +github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= +github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= +github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= +github.com/charmbracelet/bubbles v0.18.0 h1:PYv1A036luoBGroX6VWjQIE9Syf2Wby2oOl/39KLfy0= +github.com/charmbracelet/bubbles v0.18.0/go.mod h1:08qhZhtIwzgrtBjAcJnij1t1H0ZRjwHyGsy6AL11PSw= +github.com/charmbracelet/bubbletea v0.25.0 h1:bAfwk7jRz7FKFl9RzlIULPkStffg5k6pNt5dywy4TcM= +github.com/charmbracelet/bubbletea v0.25.0/go.mod h1:EN3QDR1T5ZdWmdfDzYcqOCAps45+QIJbLOBxmVNWNNg= +github.com/charmbracelet/lipgloss v0.9.1 h1:PNyd3jvaJbg4jRHKWXnCj1akQm4rh8dbEzN1p/u1KWg= +github.com/charmbracelet/lipgloss v0.9.1/go.mod h1:1mPmG4cxScwUQALAAnacHaigiiHB9Pmr+v1VEawJl6I= +github.com/cheggaaa/pb v1.0.29 h1:FckUN5ngEk2LpvuG0fw1GEFx6LtyY2pWI/Z2QgCnEYo= +github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= +github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= +github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= +github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= +github.com/containerd/console v1.0.4 h1:F2g4+oChYvBTsASRTz8NP6iIAi97J3TtSAsLbIFn4ro= +github.com/containerd/console v1.0.4/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= +github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/djherbis/times v1.6.0 h1:w2ctJ92J8fBvWPxugmXIv7Nz7Q3iDMKNx9v5ocVH20c= +github.com/djherbis/times v1.6.0/go.mod h1:gOHeRAz2h+VJNZ5Gmc/o7iD9k4wW7NMVqieYCY99oc0= +github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= +github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= +github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= +github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= +github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= +github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= +github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4= +github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= +github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 h1:MJG/KsmcqMwFAkh8mTnAwhyKoB+sTAnY4CACC110tbU= +github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/hcl/v2 v2.19.1 h1://i05Jqznmb2EXqa39Nsvyan2o5XyMowW5fnCKW5RPI= +github.com/hashicorp/hcl/v2 v2.19.1/go.mod h1:ThLC89FV4p9MPW804KVbe/cEXoQ8NZEh+JtMeeGErHE= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= +github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= +github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= +github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= +github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= +github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= +github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= +github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= +github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= +github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo= +github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/opentracing/basictracer-go v1.1.0 h1:Oa1fTSBvAl8pa3U+IJYqrKm0NALwH9OsgwOqDv4xJW0= +github.com/opentracing/basictracer-go v1.1.0/go.mod h1:V2HZueSJEp879yv285Aap1BS69fQMD+MNP1mRs6mBQc= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/pgavlin/fx v0.1.6 h1:r9jEg69DhNoCd3Xh0+5mIbdbS3PqWrVWujkY76MFRTU= +github.com/pgavlin/fx v0.1.6/go.mod h1:KWZJ6fqBBSh8GxHYqwYCf3rYE7Gp2p0N8tJp8xv9u9M= +github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= +github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/term v1.1.0 h1:xIAAdCMh3QIAy+5FrE8Ad8XoDhEU4ufwbaSozViP9kk= +github.com/pkg/term v1.1.0/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231 h1:vkHw5I/plNdTr435cARxCW6q9gc0S/Yxz7Mkd38pOb0= +github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231/go.mod h1:murToZ2N9hNJzewjHBgfFdXhZKjY3z5cYC1VXk+lbFE= +github.com/pulumi/esc v0.8.0 h1:srNfXvuJWGSfTfKiwK1+efY+w5LHZCbwzVv/yz9CQ44= +github.com/pulumi/esc v0.8.0/go.mod h1:v5VAPxYDa9DRwvubbzKt4ZYf5y0esWC2ccSp/AT923I= +github.com/pulumi/pulumi-aws/sdk/v6 v6.21.0 h1:Z93+WcEhiX8PQSid92x9TeJHOn7OCj1+F+DdYhMqrDQ= +github.com/pulumi/pulumi-aws/sdk/v6 v6.21.0/go.mod h1:+hNAJL5Ac1DBvMLnOYQnpmPp+S71kjPr6Hr2J5e7U4s= +github.com/pulumi/pulumi/sdk/v3 v3.104.2 h1:aOwUkrlsyEWrL1jlHqn2/36zMSPQrVUYUyZPqstrmjc= +github.com/pulumi/pulumi/sdk/v3 v3.104.2/go.mod h1:Ml3rpGfyZlI4zQCG7LN2XDSmH4XUNYdyBwJ3yEr/OpI= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.6 h1:Sovz9sDSwbOz9tgUy8JpT+KgCkPYJEN/oYzlJiYTNLg= +github.com/rivo/uniseg v0.4.6/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 h1:OkMGxebDjyw0ULyrTYWeN0UNCCkmCWfjPnIA2W6oviI= +github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06/go.mod h1:+ePHsJ1keEjQtpvf9HHw0f4ZeJ0TLRsxhunSI2hYJSs= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ= +github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/texttheater/golang-levenshtein v1.0.1 h1:+cRNoVrfiwufQPhoMzB6N0Yf/Mqajr6t1lOv8GyGE2U= +github.com/texttheater/golang-levenshtein v1.0.1/go.mod h1:PYAKrbF5sAiq9wd+H82hs7gNaen0CplQ9uvm6+enD/8= +github.com/tweekmonster/luser v0.0.0-20161003172636-3fa38070dbd7 h1:X9dsIWPuuEJlPX//UmRKophhOKCGXc46RVIGuttks68= +github.com/tweekmonster/luser v0.0.0-20161003172636-3fa38070dbd7/go.mod h1:UxoP3EypF8JfGEjAII8jx1q8rQyDnX8qdTCs/UQBVIE= +github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o= +github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= +github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= +github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zclconf/go-cty v1.14.2 h1:kTG7lqmBou0Zkx35r6HJHUQTvaRPr5bIAf3AoHS0izI= +github.com/zclconf/go-cty v1.14.2/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3 h1:/RIbNt/Zr7rVhIkQhooTxCxFcdWLGIKnZA4IXNFSrvo= +golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240205150955-31a09d347014 h1:FSL3lRCkhaPFxqi0s9o+V4UI2WTzAVOvkgbd4kVV4Wg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240205150955-31a09d347014/go.mod h1:SaPjaZGWb0lPqs6Ittu0spdfrOArqji4ZdeP5IC/9N4= +google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0= +google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +lukechampine.com/frand v1.4.2 h1:RzFIpOvkMXuPMBb9maa4ND4wjBn71E1Jpf8BzJHMaVw= +lukechampine.com/frand v1.4.2/go.mod h1:4S/TM2ZgrKejMcKMbeLjISpJMO+/eZ1zu3vYX9dtj3s= +pgregory.net/rapid v0.5.5 h1:jkgx1TjbQPD/feRoK+S/mXw9e1uj6WilpHrXJowi6oA= +pgregory.net/rapid v0.5.5/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= diff --git a/examples/ssm/main.go b/examples/ssm/main.go new file mode 100644 index 0000000..a0ae7fc --- /dev/null +++ b/examples/ssm/main.go @@ -0,0 +1,156 @@ +package main + +import ( + "fmt" + "github.com/dprzybyl/pulumi-provider-aem/sdk/go/aem/compose" + "github.com/pulumi/pulumi-aws/sdk/v6/go/aws/ebs" + "github.com/pulumi/pulumi-aws/sdk/v6/go/aws/ec2" + "github.com/pulumi/pulumi-aws/sdk/v6/go/aws/iam" + "github.com/pulumi/pulumi/sdk/v3/go/pulumi" + "os" +) + +func file(path string) pulumi.String { + content, _ := os.ReadFile(path) + return pulumi.String(content) +} + +func main() { + workspace := "aemc" + env := "tf-minimal" + envType := "aem-single" + host := "aem-single" + dataDevice := "/dev/nvme1n1" + dataDir := "/data" + composeDir := fmt.Sprintf("%s/aemc", dataDir) + + tags := pulumi.StringMap{ + "Workspace": pulumi.String(workspace), + "Env": pulumi.String(env), + "EnvType": pulumi.String(envType), + "Host": pulumi.String(host), + "Name": pulumi.Sprintf("%s_%s_%s", workspace, envType, host), + } + + pulumi.Run(func(ctx *pulumi.Context) error { + role, err := iam.NewRole(ctx, "aem_ec2", &iam.RoleArgs{ + Name: pulumi.Sprintf("%s_aem_ec2", workspace), + AssumeRolePolicy: pulumi.String(`{ + "Version": "2012-10-17", + "Statement": { + "Effect": "Allow", + "Principal": {"Service": "ec2.amazonaws.com"}, + "Action": "sts:AssumeRole" + } +}`), + Tags: tags, + }) + if err != nil { + return err + } + + _, err = iam.NewRolePolicyAttachment(ctx, "ssm", &iam.RolePolicyAttachmentArgs{ + Role: role.Name, + PolicyArn: pulumi.String("arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"), + }) + if err != nil { + return err + } + + _, err = iam.NewRolePolicyAttachment(ctx, "s3", &iam.RolePolicyAttachmentArgs{ + Role: role.Name, + PolicyArn: pulumi.String("arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess"), + }) + if err != nil { + return err + } + + instanceProfile, err := iam.NewInstanceProfile(ctx, "aem_ec2", &iam.InstanceProfileArgs{ + Name: pulumi.Sprintf("%s_aem_ec2", workspace), + Role: role.Name, + Tags: tags, + }) + if err != nil { + return err + } + + instance, err := ec2.NewInstance(ctx, "aem_single", &ec2.InstanceArgs{ + Ami: pulumi.String("ami-043e06a423cbdca17"), // RHEL 8 + InstanceType: pulumi.String("m5.xlarge"), + IamInstanceProfile: instanceProfile.Name, + Tags: tags, + UserData: pulumi.String(`#!/bin/bash +sudo dnf install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm`), + }) + if err != nil { + return err + } + + volume, err := ebs.NewVolume(ctx, "aem_single_data", &ebs.VolumeArgs{ + AvailabilityZone: instance.AvailabilityZone, + Size: pulumi.Int(128), + Type: pulumi.String("gp2"), + Tags: tags, + }) + if err != nil { + return err + } + + volumeAttachment, err := ec2.NewVolumeAttachment(ctx, "aem_single_data", &ec2.VolumeAttachmentArgs{ + DeviceName: pulumi.String("/dev/xvdf"), + VolumeId: volume.ID(), + InstanceId: instance.ID(), + }) + if err != nil { + return err + } + + instanceResourceModel, err := compose.NewInstanceResourceModel(ctx, "aem_single", &compose.InstanceResourceModelArgs{ + Client: compose.ClientModelArgs{ + Type: pulumi.String("aws-ssm"), + Settings: pulumi.StringMap{ + "instance_id": instance.ID(), + }, + }, + System: compose.SystemModelArgs{ + Data_dir: pulumi.String(dataDir), + Bootstrap: compose.InstanceScriptArgs{ + Inline: pulumi.StringArray{ + pulumi.Sprintf("sudo mkfs -t ext4 %s", dataDevice), + pulumi.Sprintf("sudo mkdir -p %s", dataDir), + pulumi.Sprintf("sudo mount %s %s", dataDevice, dataDir), + pulumi.Sprintf("echo '%s %s ext4 defaults 0 0' | sudo tee -a /etc/fstab", dataDevice, dataDir), + pulumi.String("sudo yum install -y unzip"), + pulumi.String("curl 'https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip' -o 'awscliv2.zip'"), + pulumi.String("unzip -q awscliv2.zip"), + pulumi.String("sudo ./aws/install --update"), + }, + }, + }, + Compose: compose.ComposeModelArgs{ + Create: compose.InstanceScriptArgs{ + Inline: pulumi.StringArray{ + pulumi.Sprintf("mkdir -p '%s/aem/home/lib'", composeDir), + pulumi.Sprintf("aws s3 cp --recursive --no-progress 's3://aemc/instance/classic/' '%s/aem/home/lib'", composeDir), + pulumi.String("sh aemw instance init"), + pulumi.String("sh aemw instance create"), + }, + }, + Configure: compose.InstanceScriptArgs{ + Inline: pulumi.StringArray{ + pulumi.String("sh aemw osgi config save --pid 'org.apache.sling.jcr.davex.impl.servlets.SlingDavExServlet' --input-string 'alias: /crx/server'"), + pulumi.String("sh aemw repl agent setup -A --location 'author' --name 'publish' --input-string '{enabled: true, transportUri: \"http://localhost:4503/bin/receive?sling:authRequestLogin=1\", transportUser: admin, transportPassword: admin, userId: admin}'"), + pulumi.String("sh aemw package deploy --file 'aem/home/lib/aem-service-pkg-6.5.*.0.zip'"), + }, + }, + }, + }, pulumi.DependsOn([]pulumi.Resource{instance, volumeAttachment})) + if err != nil { + return err + } + + ctx.Export("instanceIp", instance.PublicIp) + ctx.Export("aemInstances", instanceResourceModel.Instances) + return nil + }) +} diff --git a/provider/cmd/pulumi-resource-aem/main.go b/provider/cmd/pulumi-resource-aem/main.go index 07e76bf..764c587 100644 --- a/provider/cmd/pulumi-resource-aem/main.go +++ b/provider/cmd/pulumi-resource-aem/main.go @@ -1,17 +1,3 @@ -// Copyright 2016-2023, Pulumi Corporation. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - package main import ( diff --git a/provider/go.mod b/provider/go.mod index 65efca4..45e2e54 100644 --- a/provider/go.mod +++ b/provider/go.mod @@ -11,6 +11,8 @@ require ( github.com/pulumi/pulumi/sdk/v3 v3.104.2 github.com/spf13/cast v1.6.0 golang.org/x/crypto v0.18.0 + golang.org/x/exp v0.0.0-20240119083558-1b970713d09a + gopkg.in/yaml.v3 v3.0.1 ) require ( @@ -101,7 +103,6 @@ require ( github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/zclconf/go-cty v1.13.2 // indirect go.uber.org/atomic v1.10.0 // indirect - golang.org/x/exp v0.0.0-20240119083558-1b970713d09a // indirect golang.org/x/mod v0.14.0 // indirect golang.org/x/net v0.20.0 // indirect golang.org/x/sync v0.6.0 // indirect @@ -113,6 +114,5 @@ require ( google.golang.org/grpc v1.61.1 // indirect google.golang.org/protobuf v1.32.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect lukechampine.com/frand v1.4.2 // indirect ) diff --git a/tests/go.mod b/tests/go.mod index 3dc77d8..c5212c9 100644 --- a/tests/go.mod +++ b/tests/go.mod @@ -21,6 +21,20 @@ require ( github.com/agext/levenshtein v1.2.3 // indirect github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect github.com/atotto/clipboard v0.1.4 // indirect + github.com/aws/aws-sdk-go-v2 v1.25.1 // indirect + github.com/aws/aws-sdk-go-v2/config v1.26.6 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.16.16 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 // indirect + github.com/aws/aws-sdk-go-v2/service/ssm v1.49.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.18.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 // indirect + github.com/aws/smithy-go v1.20.1 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/charmbracelet/bubbles v0.16.1 // indirect github.com/charmbracelet/bubbletea v0.24.2 // indirect @@ -46,11 +60,14 @@ require ( github.com/hashicorp/hcl/v2 v2.17.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect + github.com/kr/fs v0.1.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-localereader v0.0.1 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/melbahja/goph v1.4.0 // indirect github.com/mitchellh/go-ps v1.0.0 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect @@ -64,6 +81,7 @@ require ( github.com/pgavlin/goldmark v1.1.33-0.20200616210433-b5eb04559386 // indirect github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/pkg/sftp v1.13.6 // indirect github.com/pkg/term v1.1.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231 // indirect @@ -77,6 +95,7 @@ require ( github.com/segmentio/encoding v0.3.5 // indirect github.com/sergi/go-diff v1.3.1 // indirect github.com/skeema/knownhosts v1.2.1 // indirect + github.com/spf13/cast v1.6.0 // indirect github.com/spf13/cobra v1.7.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/texttheater/golang-levenshtein v1.0.1 // indirect diff --git a/tests/go.sum b/tests/go.sum index 47161b0..5802d60 100644 --- a/tests/go.sum +++ b/tests/go.sum @@ -19,6 +19,34 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPd github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= +github.com/aws/aws-sdk-go-v2 v1.25.1 h1:P7hU6A5qEdmajGwvae/zDkOq+ULLC9tQBTwqqiwFGpI= +github.com/aws/aws-sdk-go-v2 v1.25.1/go.mod h1:Evoc5AsmtveRt1komDwIsjHFyrP5tDuF1D1U+6z6pNo= +github.com/aws/aws-sdk-go-v2/config v1.26.6 h1:Z/7w9bUqlRI0FFQpetVuFYEsjzE3h7fpU6HuGmfPL/o= +github.com/aws/aws-sdk-go-v2/config v1.26.6/go.mod h1:uKU6cnDmYCvJ+pxO9S4cWDb2yWWIH5hra+32hVh1MI4= +github.com/aws/aws-sdk-go-v2/credentials v1.16.16 h1:8q6Rliyv0aUFAVtzaldUEcS+T5gbadPbWdV1WcAddK8= +github.com/aws/aws-sdk-go-v2/credentials v1.16.16/go.mod h1:UHVZrdUsv63hPXFo1H7c5fEneoVo9UXiz36QG1GEPi0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 h1:c5I5iH+DZcH3xOIMlz3/tCKJDaHFwYEmxvlh2fAcFo8= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11/go.mod h1:cRrYDYAMUohBJUtUnOhydaMHtiK/1NZ0Otc9lIb6O0Y= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.1 h1:evvi7FbTAoFxdP/mixmP7LIYzQWAmzBcwNB/es9XPNc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.1/go.mod h1:rH61DT6FDdikhPghymripNUCsf+uVF4Cnk4c4DBKH64= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.1 h1:RAnaIrbxPtlXNVI/OIlh1sidTQ3e1qM6LRjs7N0bE0I= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.1/go.mod h1:nbgAGkH5lk0RZRMh6A4K/oG6Xj11eC/1CyDow+DUAFI= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3 h1:n3GDfwqF2tzEkXlv5cuy4iy7LpKDtqDMcNLfZDu9rls= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 h1:/b31bi3YVNlkzkBrm9LfpaKoaYZUxIAj4sHfOTmLfqw= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4/go.mod h1:2aGXHFmbInwgP9ZfpmdIfOELL79zhdNYNmReK8qDfdQ= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 h1:DBYTXwIGQSGs9w4jKm60F5dmCQ3EEruxdc0MFh+3EY4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10/go.mod h1:wohMUQiFdzo0NtxbBg0mSRGZ4vL3n0dKjLTINdcIino= +github.com/aws/aws-sdk-go-v2/service/ssm v1.49.0 h1:EtNvvxv0m6aP4cbTyo43vBRXeTpyt8juyNPmgKSTyYs= +github.com/aws/aws-sdk-go-v2/service/ssm v1.49.0/go.mod h1:wzPAvA+afHPFlAMkCf80sg7bm7GbCuFX1INetlm9DAk= +github.com/aws/aws-sdk-go-v2/service/sso v1.18.7 h1:eajuO3nykDPdYicLlP3AGgOyVN3MOlFmZv7WGTuJPow= +github.com/aws/aws-sdk-go-v2/service/sso v1.18.7/go.mod h1:+mJNDdF+qiUlNKNC3fxn74WWNN+sOiGOEImje+3ScPM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 h1:QPMJf+Jw8E1l7zqhZmMlFw6w1NmfkfiSK8mS4zOx3BA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7/go.mod h1:ykf3COxYI0UJmxcfcxcVuz7b6uADi1FkiUz6Eb7AgM8= +github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 h1:NzO4Vrau795RkUdSHKEwiR01FaGzGOH1EETJ+5QHnm0= +github.com/aws/aws-sdk-go-v2/service/sts v1.26.7/go.mod h1:6h2YuIoxaMSCFf5fi1EgZAwdfkGMgDY+DVfa61uLe4U= +github.com/aws/smithy-go v1.20.1 h1:4SZlSlMr36UEqC7XOyRVb27XMeZubNcBNN+9IgEPIQw= +github.com/aws/smithy-go v1.20.1/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= @@ -54,6 +82,8 @@ github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FM github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= @@ -92,11 +122,17 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -119,6 +155,8 @@ github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzp github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/melbahja/goph v1.4.0 h1:z0PgDbBFe66lRYl3v5dGb9aFgPy0kotuQ37QOwSQFqs= +github.com/melbahja/goph v1.4.0/go.mod h1:uG+VfK2Dlhk+O32zFrRlc3kYKTlV6+BtvPWd/kK7U68= github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= @@ -148,6 +186,9 @@ github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.13.5/go.mod h1:wHDZ0IZX6JcBYRK1TH9bcVq8G7TLpVHYIGJRFnmPfxg= +github.com/pkg/sftp v1.13.6 h1:JFZT4XbOU7l77xGSpOdW+pwIMqP044IyjXX6FGyEKFo= +github.com/pkg/sftp v1.13.6/go.mod h1:tz1ryNURKu77RL+GuCzmoJYxQczL3wLNNpPWagdg4Qk= github.com/pkg/term v1.1.0 h1:xIAAdCMh3QIAy+5FrE8Ad8XoDhEU4ufwbaSozViP9kk= github.com/pkg/term v1.1.0/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -184,11 +225,14 @@ github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NF github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ= github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= +github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= +github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -196,6 +240,9 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/texttheater/golang-levenshtein v1.0.1 h1:+cRNoVrfiwufQPhoMzB6N0Yf/Mqajr6t1lOv8GyGE2U= @@ -219,8 +266,11 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= @@ -242,6 +292,7 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= @@ -267,6 +318,7 @@ golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211110154304-99a53858aa08/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -279,6 +331,7 @@ golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= @@ -322,6 +375,7 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/tests/provider_test.go b/tests/provider_test.go index c29d833..5f3b04e 100644 --- a/tests/provider_test.go +++ b/tests/provider_test.go @@ -1,17 +1,3 @@ -// Copyright 2016-2023, Pulumi Corporation. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - package tests import ( @@ -28,10 +14,10 @@ import ( aem "github.com/wttech/pulumi-provider-aem/provider" ) -func TestInstanceResourceModelCreate(t *testing.T) { +func TestInstanceResourceModelCheck(t *testing.T) { prov := provider() - checkResponse, err := prov.Check(p.CheckRequest{ + response, err := prov.Check(p.CheckRequest{ Urn: urn("InstanceResourceModel"), News: resource.PropertyMap{ "client": resource.NewObjectProperty(resource.PropertyMap{ @@ -44,26 +30,18 @@ func TestInstanceResourceModelCreate(t *testing.T) { }), }, }) - require.NoError(t, err) - - response, err := prov.Create(p.CreateRequest{ - Urn: urn("InstanceResourceModel"), - Properties: checkResponse.Inputs, - Preview: false, - }) require.NoError(t, err) - result := response.Properties["result"].StringValue() - assert.Len(t, result, 12) + inputs := response.Inputs["system"].V.(resource.PropertyMap) + result := inputs["data_dir"].StringValue() + assert.Equal(t, result, "/mnt/aemc") } -// urn is a helper function to build an urn for running integration tests. func urn(typ string) resource.URN { return resource.NewURN("stack", "proj", "", tokens.Type("aem:compose:"+typ), "name") } -// Create a test server. func provider() integration.Server { return integration.NewServer(aem.Name, semver.MustParse("1.0.0"), aem.Provider()) } From 403b0bd0657a56f4f03687d5c666dd7bf70ca94a Mon Sep 17 00:00:00 2001 From: Dominik Przybyl Date: Fri, 23 Feb 2024 13:47:42 +0100 Subject: [PATCH 4/8] refactor --- examples/go/go.mod | 63 +++++++++++------------ examples/go/go.sum | 120 ++++++++++++++++++++++--------------------- examples/go/main.go | 89 ++++++++++++++++++++++++++++++-- examples/ssh/go.mod | 6 +-- examples/ssh/main.go | 24 +++++---- examples/ssm/go.mod | 4 +- examples/ssm/main.go | 8 +-- 7 files changed, 197 insertions(+), 117 deletions(-) diff --git a/examples/go/go.mod b/examples/go/go.mod index 9026e68..c479145 100644 --- a/examples/go/go.mod +++ b/examples/go/go.mod @@ -1,49 +1,47 @@ -module github.com/wttech/pulumi-provider-aem/examples/ssh +module github.com/wttech/pulumi-provider-aem/examples/go go 1.21 -replace github.com/wttech/pulumi-provider-aem/sdk => ../../sdk - require ( + github.com/pulumi/pulumi-aws/sdk/v6 v6.21.0 github.com/pulumi/pulumi/sdk/v3 v3.104.2 - github.com/wttech/pulumi-provider-aem/sdk v0.0.0-20240207010449-6e972a29045f ) require ( dario.cat/mergo v1.0.0 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect + github.com/ProtonMail/go-crypto v1.0.0 // indirect github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect github.com/agext/levenshtein v1.2.3 // indirect - github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect + github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect github.com/atotto/clipboard v0.1.4 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/blang/semver v3.5.1+incompatible // indirect - github.com/charmbracelet/bubbles v0.16.1 // indirect - github.com/charmbracelet/bubbletea v0.24.2 // indirect - github.com/charmbracelet/lipgloss v0.7.1 // indirect + github.com/charmbracelet/bubbles v0.18.0 // indirect + github.com/charmbracelet/bubbletea v0.25.0 // indirect + github.com/charmbracelet/lipgloss v0.9.1 // indirect github.com/cheggaaa/pb v1.0.29 // indirect github.com/cloudflare/circl v1.3.7 // indirect - github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 // indirect + github.com/containerd/console v1.0.4 // indirect github.com/cyphar/filepath-securejoin v0.2.4 // indirect - github.com/djherbis/times v1.5.0 // indirect + github.com/djherbis/times v1.6.0 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.5.0 // indirect github.com/go-git/go-git/v5 v5.11.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/glog v1.1.0 // indirect + github.com/golang/glog v1.2.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/hcl/v2 v2.17.0 // indirect + github.com/hashicorp/hcl/v2 v2.19.1 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-localereader v0.0.1 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect github.com/mitchellh/go-ps v1.0.0 // indirect @@ -59,34 +57,35 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/pkg/term v1.1.0 // indirect github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231 // indirect - github.com/pulumi/esc v0.6.2 // indirect - github.com/rivo/uniseg v0.4.4 // indirect - github.com/rogpeppe/go-internal v1.11.0 // indirect + github.com/pulumi/esc v0.8.0 // indirect + github.com/rivo/uniseg v0.4.6 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 // indirect - github.com/santhosh-tekuri/jsonschema/v5 v5.0.0 // indirect + github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect github.com/sergi/go-diff v1.3.1 // indirect github.com/skeema/knownhosts v1.2.1 // indirect - github.com/spf13/cobra v1.7.0 // indirect + github.com/spf13/cobra v1.8.0 // indirect github.com/spf13/pflag v1.0.5 // indirect + github.com/stretchr/objx v0.2.0 // indirect github.com/texttheater/golang-levenshtein v1.0.1 // indirect github.com/tweekmonster/luser v0.0.0-20161003172636-3fa38070dbd7 // indirect github.com/uber/jaeger-client-go v2.30.0+incompatible // indirect github.com/uber/jaeger-lib v2.4.1+incompatible // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect - github.com/zclconf/go-cty v1.13.2 // indirect - go.uber.org/atomic v1.9.0 // indirect - golang.org/x/crypto v0.17.0 // indirect - golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect - golang.org/x/mod v0.14.0 // indirect - golang.org/x/net v0.19.0 // indirect - golang.org/x/sync v0.5.0 // indirect - golang.org/x/sys v0.15.0 // indirect - golang.org/x/term v0.15.0 // indirect + github.com/zclconf/go-cty v1.14.2 // indirect + go.uber.org/atomic v1.11.0 // indirect + golang.org/x/crypto v0.18.0 // indirect + golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3 // indirect + golang.org/x/mod v0.15.0 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/term v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130 // indirect - google.golang.org/grpc v1.57.1 // indirect - google.golang.org/protobuf v1.31.0 // indirect + golang.org/x/tools v0.17.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240205150955-31a09d347014 // indirect + google.golang.org/grpc v1.61.0 // indirect + google.golang.org/protobuf v1.32.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect lukechampine.com/frand v1.4.2 // indirect diff --git a/examples/go/go.sum b/examples/go/go.sum index 103514f..af003d1 100644 --- a/examples/go/go.sum +++ b/examples/go/go.sum @@ -5,16 +5,16 @@ github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXY github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 h1:kkhsdkhsCvIsutKu5zLMgWtgh9YxGCNAw8Ad8hjwfYg= -github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= +github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY= github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA= github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= -github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw= -github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= +github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= +github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= @@ -24,27 +24,27 @@ github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= -github.com/charmbracelet/bubbles v0.16.1 h1:6uzpAAaT9ZqKssntbvZMlksWHruQLNxg49H5WdeuYSY= -github.com/charmbracelet/bubbles v0.16.1/go.mod h1:2QCp9LFlEsBQMvIYERr7Ww2H2bA7xen1idUDIzm/+Xc= -github.com/charmbracelet/bubbletea v0.24.2 h1:uaQIKx9Ai6Gdh5zpTbGiWpytMU+CfsPp06RaW2cx/SY= -github.com/charmbracelet/bubbletea v0.24.2/go.mod h1:XdrNrV4J8GiyshTtx3DNuYkR1FDaJmO3l2nejekbsgg= -github.com/charmbracelet/lipgloss v0.7.1 h1:17WMwi7N1b1rVWOjMT+rCh7sQkvDU75B2hbZpc5Kc1E= -github.com/charmbracelet/lipgloss v0.7.1/go.mod h1:yG0k3giv8Qj8edTCbbg6AlQ5e8KNWpFujkNawKNhE2c= +github.com/charmbracelet/bubbles v0.18.0 h1:PYv1A036luoBGroX6VWjQIE9Syf2Wby2oOl/39KLfy0= +github.com/charmbracelet/bubbles v0.18.0/go.mod h1:08qhZhtIwzgrtBjAcJnij1t1H0ZRjwHyGsy6AL11PSw= +github.com/charmbracelet/bubbletea v0.25.0 h1:bAfwk7jRz7FKFl9RzlIULPkStffg5k6pNt5dywy4TcM= +github.com/charmbracelet/bubbletea v0.25.0/go.mod h1:EN3QDR1T5ZdWmdfDzYcqOCAps45+QIJbLOBxmVNWNNg= +github.com/charmbracelet/lipgloss v0.9.1 h1:PNyd3jvaJbg4jRHKWXnCj1akQm4rh8dbEzN1p/u1KWg= +github.com/charmbracelet/lipgloss v0.9.1/go.mod h1:1mPmG4cxScwUQALAAnacHaigiiHB9Pmr+v1VEawJl6I= github.com/cheggaaa/pb v1.0.29 h1:FckUN5ngEk2LpvuG0fw1GEFx6LtyY2pWI/Z2QgCnEYo= github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= -github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 h1:q2hJAaP1k2wIvVRd/hEHD7lacgqrCPS+k8g1MndzfWY= -github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/containerd/console v1.0.4 h1:F2g4+oChYvBTsASRTz8NP6iIAi97J3TtSAsLbIFn4ro= +github.com/containerd/console v1.0.4/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/djherbis/times v1.5.0 h1:79myA211VwPhFTqUk8xehWrsEO+zcIZj0zT8mXPVARU= -github.com/djherbis/times v1.5.0/go.mod h1:5q7FDLvbNg1L/KaBmPcWlVR9NmoKo3+ucqUA3ijQhA0= +github.com/djherbis/times v1.6.0 h1:w2ctJ92J8fBvWPxugmXIv7Nz7Q3iDMKNx9v5ocVH20c= +github.com/djherbis/times v1.6.0/go.mod h1:gOHeRAz2h+VJNZ5Gmc/o7iD9k4wW7NMVqieYCY99oc0= github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= @@ -65,8 +65,8 @@ github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lK github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= +github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= +github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= @@ -82,8 +82,8 @@ github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/hcl/v2 v2.17.0 h1:z1XvSUyXd1HP10U4lrLg5e0JMVz6CPaJvAgxM0KNZVY= -github.com/hashicorp/hcl/v2 v2.17.0/go.mod h1:gJyW2PTShkJqQBKpAmPO3yxMxIuoXkOF2TpqXzrQyx4= +github.com/hashicorp/hcl/v2 v2.19.1 h1://i05Jqznmb2EXqa39Nsvyan2o5XyMowW5fnCKW5RPI= +github.com/hashicorp/hcl/v2 v2.19.1/go.mod h1:ThLC89FV4p9MPW804KVbe/cEXoQ8NZEh+JtMeeGErHE= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= @@ -107,8 +107,8 @@ github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZb github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= @@ -146,32 +146,35 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231 h1:vkHw5I/plNdTr435cARxCW6q9gc0S/Yxz7Mkd38pOb0= github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231/go.mod h1:murToZ2N9hNJzewjHBgfFdXhZKjY3z5cYC1VXk+lbFE= -github.com/pulumi/esc v0.6.2 h1:+z+l8cuwIauLSwXQS0uoI3rqB+YG4SzsZYtHfNoXBvw= -github.com/pulumi/esc v0.6.2/go.mod h1:jNnYNjzsOgVTjCp0LL24NsCk8ZJxq4IoLQdCT0X7l8k= +github.com/pulumi/esc v0.8.0 h1:srNfXvuJWGSfTfKiwK1+efY+w5LHZCbwzVv/yz9CQ44= +github.com/pulumi/esc v0.8.0/go.mod h1:v5VAPxYDa9DRwvubbzKt4ZYf5y0esWC2ccSp/AT923I= +github.com/pulumi/pulumi-aws/sdk/v6 v6.21.0 h1:Z93+WcEhiX8PQSid92x9TeJHOn7OCj1+F+DdYhMqrDQ= +github.com/pulumi/pulumi-aws/sdk/v6 v6.21.0/go.mod h1:+hNAJL5Ac1DBvMLnOYQnpmPp+S71kjPr6Hr2J5e7U4s= github.com/pulumi/pulumi/sdk/v3 v3.104.2 h1:aOwUkrlsyEWrL1jlHqn2/36zMSPQrVUYUyZPqstrmjc= github.com/pulumi/pulumi/sdk/v3 v3.104.2/go.mod h1:Ml3rpGfyZlI4zQCG7LN2XDSmH4XUNYdyBwJ3yEr/OpI= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= -github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rivo/uniseg v0.4.6 h1:Sovz9sDSwbOz9tgUy8JpT+KgCkPYJEN/oYzlJiYTNLg= +github.com/rivo/uniseg v0.4.6/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 h1:OkMGxebDjyw0ULyrTYWeN0UNCCkmCWfjPnIA2W6oviI= github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06/go.mod h1:+ePHsJ1keEjQtpvf9HHw0f4ZeJ0TLRsxhunSI2hYJSs= -github.com/santhosh-tekuri/jsonschema/v5 v5.0.0 h1:TToq11gyfNlrMFZiYujSekIsPd9AmsA2Bj/iv+s4JHE= -github.com/santhosh-tekuri/jsonschema/v5 v5.0.0/go.mod h1:FKdcjfQW6rpZSnxxUvEA5H/cDPdvJ/SZJQLWWXWGrZ0= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY= github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ= github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -192,10 +195,10 @@ github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zclconf/go-cty v1.13.2 h1:4GvrUxe/QUDYuJKAav4EYqdM47/kZa672LwmXFmEKT0= -github.com/zclconf/go-cty v1.13.2/go.mod h1:YKQzy/7pZ7iq2jNFzy5go57xdxdWoLLpaEp4u238AE0= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +github.com/zclconf/go-cty v1.14.2 h1:kTG7lqmBou0Zkx35r6HJHUQTvaRPr5bIAf3AoHS0izI= +github.com/zclconf/go-cty v1.14.2/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -203,18 +206,18 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3 h1:/RIbNt/Zr7rVhIkQhooTxCxFcdWLGIKnZA4IXNFSrvo= +golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -226,15 +229,15 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -248,6 +251,7 @@ golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -255,15 +259,15 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -281,20 +285,20 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= -golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= +golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130 h1:2FZP5XuJY9zQyGM5N0rtovnoXjiMUEIUMvw0m9wlpLc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= -google.golang.org/grpc v1.57.1 h1:upNTNqv0ES+2ZOOqACwVtS3Il8M12/+Hz41RCPzAjQg= -google.golang.org/grpc v1.57.1/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240205150955-31a09d347014 h1:FSL3lRCkhaPFxqi0s9o+V4UI2WTzAVOvkgbd4kVV4Wg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240205150955-31a09d347014/go.mod h1:SaPjaZGWb0lPqs6Ittu0spdfrOArqji4ZdeP5IC/9N4= +google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0= +google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/examples/go/main.go b/examples/go/main.go index 546a4ba..83ec412 100644 --- a/examples/go/main.go +++ b/examples/go/main.go @@ -1,19 +1,100 @@ package main import ( + "github.com/pulumi/pulumi-aws/sdk/v6/go/aws/ebs" + "github.com/pulumi/pulumi-aws/sdk/v6/go/aws/ec2" + "github.com/pulumi/pulumi-aws/sdk/v6/go/aws/iam" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" - "github.com/wttech/pulumi-provider-aem/sdk/go/aem/compose" ) func main() { + workspace := "aemc" + env := "tf-minimal" + envType := "aem-single" + host := "aem-single" + + tags := pulumi.StringMap{ + "Workspace": pulumi.String(workspace), + "Env": pulumi.String(env), + "EnvType": pulumi.String(envType), + "Host": pulumi.String(host), + "Name": pulumi.Sprintf("%s_%s_%s", workspace, envType, host), + } + pulumi.Run(func(ctx *pulumi.Context) error { - myModel, err := compose.NewInstanceResourceModel(ctx, "myModel", &compose.InstanceResourceModelArgs{}) + role, err := iam.NewRole(ctx, "aem_ec2", &iam.RoleArgs{ + Name: pulumi.Sprintf("%s_aem_ec2", workspace), + AssumeRolePolicy: pulumi.String(`{ + "Version": "2012-10-17", + "Statement": { + "Effect": "Allow", + "Principal": {"Service": "ec2.amazonaws.com"}, + "Action": "sts:AssumeRole" + } +}`), + Tags: tags, + }) if err != nil { return err } - ctx.Export("output", pulumi.StringMap{ - "value": myModel.Result, + + _, err = iam.NewRolePolicyAttachment(ctx, "ssm", &iam.RolePolicyAttachmentArgs{ + Role: role.Name, + PolicyArn: pulumi.String("arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"), + }) + if err != nil { + return err + } + + _, err = iam.NewRolePolicyAttachment(ctx, "s3", &iam.RolePolicyAttachmentArgs{ + Role: role.Name, + PolicyArn: pulumi.String("arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess"), }) + if err != nil { + return err + } + + instanceProfile, err := iam.NewInstanceProfile(ctx, "aem_ec2", &iam.InstanceProfileArgs{ + Name: pulumi.Sprintf("%s_aem_ec2", workspace), + Role: role.Name, + Tags: tags, + }) + if err != nil { + return err + } + + instance, err := ec2.NewInstance(ctx, "aem_single", &ec2.InstanceArgs{ + Ami: pulumi.String("ami-043e06a423cbdca17"), // RHEL 8 + InstanceType: pulumi.String("m5.xlarge"), + IamInstanceProfile: instanceProfile.Name, + Tags: tags, + UserData: pulumi.String(`#!/bin/bash +sudo dnf install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm`), + }) + if err != nil { + return err + } + + volume, err := ebs.NewVolume(ctx, "aem_single_data", &ebs.VolumeArgs{ + AvailabilityZone: instance.AvailabilityZone, + Size: pulumi.Int(128), + Type: pulumi.String("gp2"), + Tags: tags, + }) + if err != nil { + return err + } + + _, err = ec2.NewVolumeAttachment(ctx, "aem_single_data", &ec2.VolumeAttachmentArgs{ + DeviceName: pulumi.String("/dev/xvdf"), + VolumeId: volume.ID(), + InstanceId: instance.ID(), + }) + if err != nil { + return err + } + + ctx.Export("instanceIp", instance.PublicIp) return nil }) } diff --git a/examples/ssh/go.mod b/examples/ssh/go.mod index d6e911d..688d6e0 100644 --- a/examples/ssh/go.mod +++ b/examples/ssh/go.mod @@ -1,13 +1,13 @@ -module github.com/dprzybyl/pulumi-provider-aem/examples +module github.com/wttech/pulumi-provider-aem/examples go 1.21 -replace github.com/dprzybyl/pulumi-provider-aem/sdk => ../../sdk +replace github.com/wttech/pulumi-provider-aem/sdk => ../../sdk require ( - github.com/dprzybyl/pulumi-provider-aem/sdk v0.0.0-20240207010449-6e972a29045f github.com/pulumi/pulumi-aws/sdk/v6 v6.21.0 github.com/pulumi/pulumi/sdk/v3 v3.104.2 + github.com/wttech/pulumi-provider-aem/sdk v0.0.0-20240207010449-6e972a29045f ) require ( diff --git a/examples/ssh/main.go b/examples/ssh/main.go index 5e610d2..a424d58 100644 --- a/examples/ssh/main.go +++ b/examples/ssh/main.go @@ -1,19 +1,23 @@ package main import ( + _ "embed" "fmt" - "github.com/dprzybyl/pulumi-provider-aem/sdk/go/aem/compose" "github.com/pulumi/pulumi-aws/sdk/v6/go/aws/ebs" "github.com/pulumi/pulumi-aws/sdk/v6/go/aws/ec2" "github.com/pulumi/pulumi-aws/sdk/v6/go/aws/iam" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" - "os" + "github.com/wttech/pulumi-provider-aem/sdk/go/aem/compose" ) -func file(path string) pulumi.String { - content, _ := os.ReadFile(path) - return pulumi.String(content) -} +//go:embed aem.yml +var configYML string + +//go:embed ec2-key.cer.pub +var publicKey string + +//go:embed ec2-key.cer +var privateKey string func main() { workspace := "aemc" @@ -24,8 +28,6 @@ func main() { dataDir := "/data" composeDir := fmt.Sprintf("%s/aemc", dataDir) sshUser := "ec2-user" - privateKey := "ec2-key.cer" - publicKey := "ec2-key.cer.pub" tags := pulumi.StringMap{ "Workspace": pulumi.String(workspace), @@ -71,7 +73,7 @@ func main() { keyPair, err := ec2.NewKeyPair(ctx, "aem_single", &ec2.KeyPairArgs{ KeyName: pulumi.Sprintf("%s-example-tf", workspace), - PublicKey: file(publicKey), + PublicKey: pulumi.Sprintf(publicKey), Tags: tags, }) if err != nil { @@ -119,7 +121,7 @@ func main() { "secure": pulumi.String("false"), }, Credentials: pulumi.StringMap{ - "private_key": file(privateKey), + "private_key": pulumi.String(privateKey), }, }, System: compose.SystemModelArgs{ @@ -139,7 +141,7 @@ func main() { }, }, Compose: compose.ComposeModelArgs{ - Config: file("aem.yml"), + Config: pulumi.String(configYML), Create: compose.InstanceScriptArgs{ Inline: pulumi.StringArray{ pulumi.Sprintf("mkdir -p '%s/aem/home/lib'", composeDir), diff --git a/examples/ssm/go.mod b/examples/ssm/go.mod index 49a1616..387d683 100644 --- a/examples/ssm/go.mod +++ b/examples/ssm/go.mod @@ -2,12 +2,12 @@ module github.com/wttech/pulumi-provider-aem/examples/ssm go 1.21 -replace github.com/dprzybyl/pulumi-provider-aem/sdk => ../../sdk +replace github.com/wttech/pulumi-provider-aem/sdk => ../../sdk require ( - github.com/dprzybyl/pulumi-provider-aem/sdk v0.0.0-00010101000000-000000000000 github.com/pulumi/pulumi-aws/sdk/v6 v6.21.0 github.com/pulumi/pulumi/sdk/v3 v3.104.2 + github.com/wttech/pulumi-provider-aem/sdk v0.0.0-20240207010449-6e972a29045f ) require ( diff --git a/examples/ssm/main.go b/examples/ssm/main.go index a0ae7fc..1f4da1b 100644 --- a/examples/ssm/main.go +++ b/examples/ssm/main.go @@ -2,19 +2,13 @@ package main import ( "fmt" - "github.com/dprzybyl/pulumi-provider-aem/sdk/go/aem/compose" "github.com/pulumi/pulumi-aws/sdk/v6/go/aws/ebs" "github.com/pulumi/pulumi-aws/sdk/v6/go/aws/ec2" "github.com/pulumi/pulumi-aws/sdk/v6/go/aws/iam" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" - "os" + "github.com/wttech/pulumi-provider-aem/sdk/go/aem/compose" ) -func file(path string) pulumi.String { - content, _ := os.ReadFile(path) - return pulumi.String(content) -} - func main() { workspace := "aemc" env := "tf-minimal" From 659e84cfe2e0ccad6f6c959871dbef5d43dc0bab Mon Sep 17 00:00:00 2001 From: Dominik Przybyl Date: Fri, 23 Feb 2024 14:25:35 +0100 Subject: [PATCH 5/8] refactor --- .github/workflows/makefile.yaml | 8 -------- examples/yaml/Pulumi.yaml | 16 ---------------- examples/yaml/README.md | 15 --------------- 3 files changed, 39 deletions(-) delete mode 100644 examples/yaml/Pulumi.yaml delete mode 100644 examples/yaml/README.md diff --git a/.github/workflows/makefile.yaml b/.github/workflows/makefile.yaml index 98c1cf5..89829c7 100644 --- a/.github/workflows/makefile.yaml +++ b/.github/workflows/makefile.yaml @@ -46,14 +46,6 @@ jobs: run: | set -ex make install - - - name: PulumiUp - id: up - run: make up - - - name: PulumiDown - id: down - run: make down - name: Generate multi-language examples from yaml IaC program id: examples diff --git a/examples/yaml/Pulumi.yaml b/examples/yaml/Pulumi.yaml deleted file mode 100644 index 43cc523..0000000 --- a/examples/yaml/Pulumi.yaml +++ /dev/null @@ -1,16 +0,0 @@ -name: pulumi-provider-aem -runtime: yaml -plugins: - providers: - - name: aem - path: ../../bin - -resources: - myModel: - type: aem:compose:InstanceResourceModel - properties: - length: 24 - -outputs: - output: - value: ${myModel.result} diff --git a/examples/yaml/README.md b/examples/yaml/README.md deleted file mode 100644 index 99a99c1..0000000 --- a/examples/yaml/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# YAML Example Program - -Test Pulumi program written in YAML for testing this provider locally. - -Edit this yaml program to test features of your provider locally. You can run this program using the following command: - -```bash -pulumi login -pulumi stack init local -pulumi up -``` - -Note that unlike the rest of the auto-generated examples in the ./examples directory, this example is not automatically generated. It is intended to be a place for you to test your provider locally. - -The remaining examples are language specific examples derived from the `make gen_examples` command supported in this provider's Makefile. These examples are automatically generated and should not be edited directly. To regenerate these examples, run `make gen_examples` in the root of this provider's repository. From a688a0d3da152cca884aacafe7fde1a6d6f76e1b Mon Sep 17 00:00:00 2001 From: Dominik Przybyl Date: Fri, 23 Feb 2024 14:53:46 +0100 Subject: [PATCH 6/8] refactor --- .github/workflows/makefile.yaml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/makefile.yaml b/.github/workflows/makefile.yaml index 89829c7..b08348e 100644 --- a/.github/workflows/makefile.yaml +++ b/.github/workflows/makefile.yaml @@ -40,15 +40,14 @@ jobs: id: build run: | make build + - + name: Test + id: test + run: | + make test_provider - name: Install id: install run: | set -ex make install - - - name: Generate multi-language examples from yaml IaC program - id: examples - run: | - set -ex - make gen_examples From 6828cc1c817bbd24816ec48d09d011228649600a Mon Sep 17 00:00:00 2001 From: Dominik Przybyl Date: Mon, 26 Feb 2024 23:15:48 +0100 Subject: [PATCH 7/8] small fix --- examples/go/main.go | 1 + examples/ssh/main.go | 4 ++-- examples/ssm/main.go | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/examples/go/main.go b/examples/go/main.go index 83ec412..9634796 100644 --- a/examples/go/main.go +++ b/examples/go/main.go @@ -94,6 +94,7 @@ sudo dnf install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/late return err } + ctx.Export("instanceID", instance.ID()) ctx.Export("instanceIp", instance.PublicIp) return nil }) diff --git a/examples/ssh/main.go b/examples/ssh/main.go index a424d58..c98c1fb 100644 --- a/examples/ssh/main.go +++ b/examples/ssh/main.go @@ -113,7 +113,7 @@ func main() { instanceResourceModel, err := compose.NewInstanceResourceModel(ctx, "aem_single", &compose.InstanceResourceModelArgs{ Client: compose.ClientModelArgs{ - Type: pulumi.String("mock"), + Type: pulumi.String("ssh"), Settings: pulumi.StringMap{ "host": instance.PublicIp, "port": pulumi.String("22"), @@ -125,7 +125,7 @@ func main() { }, }, System: compose.SystemModelArgs{ - Data_dir: pulumi.String(dataDir), + Data_dir: pulumi.String(composeDir), Bootstrap: compose.InstanceScriptArgs{ Inline: pulumi.StringArray{ pulumi.Sprintf("sudo mkfs -t ext4 %s", dataDevice), diff --git a/examples/ssm/main.go b/examples/ssm/main.go index 1f4da1b..8c3d46f 100644 --- a/examples/ssm/main.go +++ b/examples/ssm/main.go @@ -107,7 +107,7 @@ sudo dnf install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/late }, }, System: compose.SystemModelArgs{ - Data_dir: pulumi.String(dataDir), + Data_dir: pulumi.String(composeDir), Bootstrap: compose.InstanceScriptArgs{ Inline: pulumi.StringArray{ pulumi.Sprintf("sudo mkfs -t ext4 %s", dataDevice), From d0454943515c62ca21d5e95c95512a209d96665a Mon Sep 17 00:00:00 2001 From: Dominik Przybyl Date: Tue, 27 Feb 2024 11:05:04 +0100 Subject: [PATCH 8/8] small fix --- examples/ssh/main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/ssh/main.go b/examples/ssh/main.go index c98c1fb..6ce4f81 100644 --- a/examples/ssh/main.go +++ b/examples/ssh/main.go @@ -54,9 +54,9 @@ func main() { return err } - _, err = iam.NewRolePolicyAttachment(ctx, "ssm", &iam.RolePolicyAttachmentArgs{ + _, err = iam.NewRolePolicyAttachment(ctx, "s3", &iam.RolePolicyAttachmentArgs{ Role: role.Name, - PolicyArn: pulumi.String("arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"), + PolicyArn: pulumi.String("arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess"), }) if err != nil { return err