gc-infra/iac/cluster/utils/ansible-configuration.go

61 lines
1.7 KiB
Go

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
}