pulumi/sdk/go/x/auto/up.go

102 lines
2.5 KiB
Go
Raw Normal View History

2020-07-07 23:25:11 +02:00
package auto
import (
"bytes"
"encoding/json"
"os/exec"
"github.com/pkg/errors"
)
func (s *Stack) Up() (UpResult, error) {
// TODO setup - merge pulumi.yaml, set config, etc.
var upResult UpResult
cmd := exec.Command("pulumi", "up", "--yes")
cmd.Dir = s.Project.SourcePath
var stdout bytes.Buffer
var stderr bytes.Buffer
cmd.Stdout = &stdout
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
return upResult, errors.Wrapf(err, "stderr: %s", stderr.String())
}
outs, secrets, err := s.getOutputs()
if err != nil {
return upResult, err
}
// TODO - last histroy item.
return UpResult{
StdOut: stdout.String(),
StdErr: stderr.String(),
Outputs: outs,
SecretOutputs: secrets,
}, nil
}
type UpResult struct {
StdOut string
StdErr string
Outputs map[string]string
SecretOutputs map[string]string
Summary map[string]interface{}
}
const secretSentinel = "[secret]"
//getOutputs returns a set of plain outputs, secret outputs, and an error
func (s *Stack) getOutputs() (map[string]string, map[string]string, error) {
// standard outputs
outCmd := exec.Command("pulumi", "stack", "output", "--json")
outCmd.Dir = s.Project.SourcePath
var outStdout bytes.Buffer
var outStderr bytes.Buffer
outCmd.Stdout = &outStdout
outCmd.Stderr = &outStderr
err := outCmd.Run()
if err != nil {
return nil, nil, errors.Wrapf(err, "could not get outputs: stderr: %s", outStderr.String())
}
// secret outputs
secretOutCmd := exec.Command("pulumi", "stack", "output", "--json", "--show-secrets")
secretOutCmd.Dir = s.Project.SourcePath
var secretStdout bytes.Buffer
var secretStderr bytes.Buffer
secretOutCmd.Stdout = &secretStdout
secretOutCmd.Stderr = &secretStderr
err = secretOutCmd.Run()
if err != nil {
return nil, nil, errors.Wrapf(err, "could not get secret outputs: stderr: %s", secretStderr.String())
}
var outputs map[string]string
var secrets map[string]string
if err = json.Unmarshal(outStdout.Bytes(), &outputs); err != nil {
return nil, nil, errors.Wrapf(err, "error unmarshalling outputs: %s", secretStderr.String())
}
if err = json.Unmarshal(secretStdout.Bytes(), &secrets); err != nil {
return nil, nil, errors.Wrapf(err, "error unmarshalling secret outputs: %s", secretStderr.String())
}
for k, v := range outputs {
if v == secretSentinel {
delete(outputs, k)
} else {
delete(secrets, k)
}
}
return outputs, secrets, nil
}
//summary - call history and get last item
// configure - write the pulumi.yaml, pulumi.<stack>.yaml, set config & secrets