2019-12-09 17:56:02 +00:00
|
|
|
package helm
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
2019-12-10 00:25:47 +00:00
|
|
|
"fmt"
|
2019-12-09 17:56:02 +00:00
|
|
|
"github.com/pelotech/drone-helm3/internal/run"
|
2019-12-10 00:25:47 +00:00
|
|
|
"os"
|
2019-12-09 17:56:02 +00:00
|
|
|
)
|
|
|
|
|
2019-12-09 18:52:41 +00:00
|
|
|
// A Step is one step in the plan.
|
2019-12-09 17:56:02 +00:00
|
|
|
type Step interface {
|
2019-12-10 00:25:47 +00:00
|
|
|
Prepare(run.Config) error
|
|
|
|
Execute() error
|
2019-12-09 17:56:02 +00:00
|
|
|
}
|
|
|
|
|
2019-12-09 18:52:41 +00:00
|
|
|
// A Plan is a series of steps to perform.
|
2019-12-09 17:56:02 +00:00
|
|
|
type Plan struct {
|
|
|
|
steps []Step
|
|
|
|
}
|
|
|
|
|
2019-12-09 18:52:41 +00:00
|
|
|
// NewPlan makes a plan for running a helm operation.
|
2019-12-09 17:56:02 +00:00
|
|
|
func NewPlan(cfg Config) (*Plan, error) {
|
2019-12-10 00:25:47 +00:00
|
|
|
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":
|
2019-12-10 00:25:47 +00:00
|
|
|
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":
|
2019-12-10 00:25:47 +00:00
|
|
|
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":
|
2019-12-10 00:25:47 +00:00
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2019-12-09 18:52:41 +00:00
|
|
|
// 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 {
|
2019-12-10 00:25:47 +00:00
|
|
|
if err := step.Execute(); err != nil {
|
2019-12-09 17:56:02 +00:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2019-12-10 00:25:47 +00:00
|
|
|
func upgrade(cfg Config, runCfg run.Config) ([]Step, error) {
|
2019-12-09 17:56:02 +00:00
|
|
|
steps := make([]Step, 0)
|
2019-12-10 00:25:47 +00:00
|
|
|
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
|
|
|
|
}
|
2019-12-10 00:25:47 +00:00
|
|
|
|
|
|
|
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
|
|
|
|
}
|