woodpecker-helm3/internal/helm/plan.go

114 lines
2.4 KiB
Go
Raw Normal View History

2019-12-09 17:56:02 +00:00
package helm
import (
"errors"
"fmt"
2019-12-09 17:56:02 +00:00
"github.com/pelotech/drone-helm3/internal/run"
"os"
2019-12-09 17:56:02 +00:00
)
// A Step is one step in the plan.
2019-12-09 17:56:02 +00:00
type Step interface {
Prepare(run.Config) error
Execute() error
2019-12-09 17:56:02 +00:00
}
// A Plan is a series of steps to perform.
2019-12-09 17:56:02 +00:00
type Plan struct {
steps []Step
}
// NewPlan makes a plan for running a helm operation.
2019-12-09 17:56:02 +00:00
func NewPlan(cfg Config) (*Plan, error) {
runCfg := run.Config{
Debug: cfg.Debug,
KubeConfig: cfg.KubeConfig,
Values: cfg.Values,
StringValues: cfg.StringValues,
ValuesFiles: cfg.ValuesFiles,
Namespace: cfg.Namespace,
Token: cfg.Token,
SkipTLSVerify: cfg.SkipTLSVerify,
Certificate: cfg.Certificate,
APIServer: cfg.APIServer,
ServiceAccount: cfg.ServiceAccount,
Stdout: os.Stdout,
Stderr: os.Stderr,
}
2019-12-09 17:56:02 +00:00
p := Plan{}
switch cfg.Command {
case "upgrade":
steps, err := upgrade(cfg, runCfg)
2019-12-09 17:56:02 +00:00
if err != nil {
return nil, err
}
p.steps = steps
case "delete":
return nil, errors.New("not implemented")
case "lint":
return nil, errors.New("not implemented")
case "help":
steps, err := help(cfg, runCfg)
if err != nil {
return nil, err
}
p.steps = steps
2019-12-09 17:56:02 +00:00
default:
switch cfg.DroneEvent {
case "push", "tag", "deployment", "pull_request", "promote", "rollback":
steps, err := upgrade(cfg, runCfg)
2019-12-09 17:56:02 +00:00
if err != nil {
return nil, err
}
p.steps = steps
default:
return nil, errors.New("not implemented")
}
}
return &p, nil
}
// Execute runs each step in the plan, aborting and reporting on error
2019-12-09 17:56:02 +00:00
func (p *Plan) Execute() error {
for _, step := range p.steps {
if err := step.Execute(); err != nil {
2019-12-09 17:56:02 +00:00
return err
}
}
return nil
}
func upgrade(cfg Config, runCfg run.Config) ([]Step, error) {
2019-12-09 17:56:02 +00:00
steps := make([]Step, 0)
upgrade := &run.Upgrade{
Chart: cfg.Chart,
Release: cfg.Release,
ChartVersion: cfg.ChartVersion,
Wait: cfg.Wait,
ReuseValues: cfg.ReuseValues,
Timeout: cfg.Timeout,
Force: cfg.Force,
}
if err := upgrade.Prepare(runCfg); err != nil {
err = fmt.Errorf("while preparing upgrade step: %w", err)
return steps, err
}
steps = append(steps, upgrade)
2019-12-09 17:56:02 +00:00
return steps, nil
}
func help(cfg Config, runCfg run.Config) ([]Step, error) {
help := &run.Help{}
if err := help.Prepare(runCfg); err != nil {
err = fmt.Errorf("while preparing help step: %w", err)
return []Step{}, err
}
return []Step{help}, nil
}