package utils import ( "fmt" "regexp" "strings" "github.com/pulumi/pulumi-command/sdk/go/command/remote" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" ) type SwarmJoinTokens struct { ManagerToken string WorkerToken string } func InstallAnsibleDependencies(ctx *pulumi.Context, connArgs remote.ConnectionArgs, uniqueness string) error { _, err := remote.NewCommand(ctx, strings.Join([]string{uniqueness, "Install Ansible Dependencies"}, ": "), &remote.CommandArgs{ Connection: connArgs, Create: pulumi.String("apt-get update && apt-get install -y python3-pip python3-jsondiff"), }) if err != nil { return err } return nil } func InitDockerSwarm(ctx *pulumi.Context, connArgs remote.ConnectionArgs, advertiseAddr pulumi.StringOutput) (pulumi.StringOutput, error) { var tokens SwarmJoinTokens fullCommand := advertiseAddr.ApplyT(func(addr string) *string { initCommand := fmt.Sprintf("docker swarm init --advertise-addr %s", addr) fullCommand := strings.Join([]string{initCommand, "echo \"Manager Token: $(docker swarm join-token -q manager)\"", "echo \"Worker Token: $(docker swarm join-token -q worker)\""}, " && ") return &fullCommand }).(pulumi.StringPtrOutput) out, err := remote.NewCommand(ctx, "Init docker swarm", &remote.CommandArgs{ Connection: connArgs, Create: fullCommand, }) if err != nil { return pulumi.StringOutput{}, err } return out.Stdout.ApplyT(func(output string) string { searchWorker := "Worker Token: " pattern := regexp.MustCompile(searchWorker + `(\S+)`) matches := pattern.FindStringSubmatch(output) if len(matches) > 1 { extracted := matches[1] tokens.WorkerToken = extracted return extracted } fmt.Println(tokens.WorkerToken) return "" }).(pulumi.StringOutput), nil }