Implement the debug flag and help command
I'm vacillating about the choice to have separate Config structs in the `helm` and `run` packages. I can't tell whether it's "good separation of concerns" or "cumbersome and over-engineered." It seems appropriate at the moment, though.
This commit is contained in:
@@ -2,12 +2,15 @@ package helm
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/pelotech/drone-helm3/internal/run"
|
||||
"os"
|
||||
)
|
||||
|
||||
// A Step is one step in the plan.
|
||||
type Step interface {
|
||||
Run() error
|
||||
Prepare(run.Config) error
|
||||
Execute() error
|
||||
}
|
||||
|
||||
// A Plan is a series of steps to perform.
|
||||
@@ -17,10 +20,26 @@ type Plan struct {
|
||||
|
||||
// NewPlan makes a plan for running a helm operation.
|
||||
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,
|
||||
}
|
||||
|
||||
p := Plan{}
|
||||
switch cfg.Command {
|
||||
case "upgrade":
|
||||
steps, err := upgrade(cfg)
|
||||
steps, err := upgrade(cfg, runCfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -30,11 +49,15 @@ func NewPlan(cfg Config) (*Plan, error) {
|
||||
case "lint":
|
||||
return nil, errors.New("not implemented")
|
||||
case "help":
|
||||
return nil, errors.New("not implemented")
|
||||
steps, err := help(cfg, runCfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
p.steps = steps
|
||||
default:
|
||||
switch cfg.DroneEvent {
|
||||
case "push", "tag", "deployment", "pull_request", "promote", "rollback":
|
||||
steps, err := upgrade(cfg)
|
||||
steps, err := upgrade(cfg, runCfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -50,7 +73,7 @@ func NewPlan(cfg Config) (*Plan, error) {
|
||||
// Execute runs each step in the plan, aborting and reporting on error
|
||||
func (p *Plan) Execute() error {
|
||||
for _, step := range p.steps {
|
||||
if err := step.Run(); err != nil {
|
||||
if err := step.Execute(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
@@ -58,9 +81,33 @@ func (p *Plan) Execute() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func upgrade(cfg Config) ([]Step, error) {
|
||||
func upgrade(cfg Config, runCfg run.Config) ([]Step, error) {
|
||||
steps := make([]Step, 0)
|
||||
steps = append(steps, run.NewUpgrade(cfg.Release, cfg.Chart))
|
||||
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)
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
@@ -25,15 +25,13 @@ func (suite *PlanTestSuite) TestNewPlanUpgradeCommand() {
|
||||
|
||||
plan, err := NewPlan(cfg)
|
||||
suite.Require().Nil(err)
|
||||
suite.Equal(1, len(plan.steps))
|
||||
suite.Require().Equal(1, len(plan.steps))
|
||||
|
||||
switch step := plan.steps[0].(type) {
|
||||
case *run.Upgrade:
|
||||
suite.Equal("billboard_top_100", step.Chart)
|
||||
suite.Equal("post_malone_circles", step.Release)
|
||||
default:
|
||||
suite.Failf("Wrong type for step 1", "Expected Upgrade, got %T", step)
|
||||
}
|
||||
suite.Require().IsType(&run.Upgrade{}, plan.steps[0])
|
||||
step, _ := plan.steps[0].(*run.Upgrade)
|
||||
|
||||
suite.Equal("billboard_top_100", step.Chart)
|
||||
suite.Equal("post_malone_circles", step.Release)
|
||||
}
|
||||
|
||||
func (suite *PlanTestSuite) TestNewPlanUpgradeFromDroneEvent() {
|
||||
@@ -51,3 +49,15 @@ func (suite *PlanTestSuite) TestNewPlanUpgradeFromDroneEvent() {
|
||||
suite.IsType(&run.Upgrade{}, plan.steps[0], fmt.Sprintf("for event type '%s'", event))
|
||||
}
|
||||
}
|
||||
|
||||
func (suite *PlanTestSuite) TestNewPlanHelpCommand() {
|
||||
cfg := Config{
|
||||
Command: "help",
|
||||
}
|
||||
|
||||
plan, err := NewPlan(cfg)
|
||||
suite.Require().Nil(err)
|
||||
suite.Equal(1, len(plan.steps))
|
||||
|
||||
suite.Require().IsType(&run.Help{}, plan.steps[0])
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user