Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7c033a8b0a | ||
|
|
e482a144c1 | ||
|
|
8dba329407 | ||
|
|
4462307983 | ||
|
|
cfc59a46ef | ||
|
|
5b4e3ab2ea | ||
|
|
0e58dde591 | ||
|
|
1809d7b133 | ||
|
|
70b2a2d0b4 | ||
|
|
03b066bfd7 | ||
|
|
fe0c874815 | ||
|
|
91d4506b37 | ||
|
|
0ab0a7fee4 | ||
|
|
0b17d929a7 | ||
|
|
3fea592040 | ||
|
|
d7a9eccb13 | ||
|
|
9e3a424a36 | ||
|
|
774bbb74db |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -4,6 +4,7 @@
|
|||||||
*.dll
|
*.dll
|
||||||
*.so
|
*.so
|
||||||
*.dylib
|
*.dylib
|
||||||
|
*.swp
|
||||||
|
|
||||||
.idea
|
.idea
|
||||||
|
|
||||||
@@ -17,3 +18,5 @@
|
|||||||
# vendor/
|
# vendor/
|
||||||
.env
|
.env
|
||||||
.secrets
|
.secrets
|
||||||
|
|
||||||
|
build/*
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
FROM alpine/helm:3.1.1
|
FROM alpine/helm:3.6.2
|
||||||
MAINTAINER Erin Call <erin@liffft.com>
|
MAINTAINER Erin Call <erin@liffft.com>
|
||||||
|
|
||||||
COPY build/drone-helm /bin/drone-helm
|
COPY build/drone-helm /bin/drone-helm
|
||||||
|
|||||||
@@ -31,12 +31,14 @@ Installations are triggered when the `mode` setting is "upgrade." They can also
|
|||||||
|------------------------|----------------|----------|------------------------|---------|
|
|------------------------|----------------|----------|------------------------|---------|
|
||||||
| chart | string | yes | | The chart to use for this installation. |
|
| chart | string | yes | | The chart to use for this installation. |
|
||||||
| release | string | yes | | The release name for helm to use. |
|
| release | string | yes | | The release name for helm to use. |
|
||||||
| kube_api_server | string | yes | api_server | API endpoint for the Kubernetes cluster. |
|
| skip_kubeconfig | boolean | | | Whether to skip kubeconfig file creation. |
|
||||||
| kube_token | string | yes | kubernetes_token | Token for authenticating to Kubernetes. |
|
| kube_api_server | string | yes | api_server | API endpoint for the Kubernetes cluster. This is ignored if `skip_kubeconfig` is `true`. |
|
||||||
| kube_service_account | string | | service_account | Service account for authenticating to Kubernetes. Default is `helm`. |
|
| kube_token | string | yes | kubernetes_token | Token for authenticating to Kubernetes. This is ignored if `skip_kubeconfig` is `true`. |
|
||||||
| kube_certificate | string | | kubernetes_certificate | Base64 encoded TLS certificate used by the Kubernetes cluster's certificate authority. |
|
| kube_service_account | string | | service_account | Service account for authenticating to Kubernetes. Default is `helm`. This is ignored if `skip_kubeconfig` is `true`. |
|
||||||
|
| kube_certificate | string | | kubernetes_certificate | Base64 encoded TLS certificate used by the Kubernetes cluster's certificate authority. This is ignored if `skip_kubeconfig` is `true`. |
|
||||||
| chart_version | string | | | Specific chart version to install. |
|
| chart_version | string | | | Specific chart version to install. |
|
||||||
| dry_run | boolean | | | Pass `--dry-run` to `helm upgrade`. |
|
| dry_run | boolean | | | Pass `--dry-run` to `helm upgrade`. |
|
||||||
|
| dependencies_action | string | | | Calls `helm dependency build` OR `helm dependency update` before running the main command. Possible values: `build`, `update`. |
|
||||||
| wait_for_upgrade | boolean | | wait | Wait until kubernetes resources are in a ready state before marking the installation successful. |
|
| wait_for_upgrade | boolean | | wait | Wait until kubernetes resources are in a ready state before marking the installation successful. |
|
||||||
| timeout | duration | | | Timeout for any *individual* Kubernetes operation. The installation's full runtime may exceed this duration. |
|
| timeout | duration | | | Timeout for any *individual* Kubernetes operation. The installation's full runtime may exceed this duration. |
|
||||||
| force_upgrade | boolean | | force | Pass `--force` to `helm upgrade`. |
|
| force_upgrade | boolean | | force | Pass `--force` to `helm upgrade`. |
|
||||||
@@ -46,7 +48,9 @@ Installations are triggered when the `mode` setting is "upgrade." They can also
|
|||||||
| string_values | list\<string\> | | | Chart values to use as the `--set-string` argument to `helm upgrade`. |
|
| string_values | list\<string\> | | | Chart values to use as the `--set-string` argument to `helm upgrade`. |
|
||||||
| values_files | list\<string\> | | | Values to use as `--values` arguments to `helm upgrade`. |
|
| values_files | list\<string\> | | | Values to use as `--values` arguments to `helm upgrade`. |
|
||||||
| reuse_values | boolean | | | Reuse the values from a previous release. |
|
| reuse_values | boolean | | | Reuse the values from a previous release. |
|
||||||
| skip_tls_verify | boolean | | | Connect to the Kubernetes cluster without checking for a valid TLS certificate. Not recommended in production. |
|
| skip_tls_verify | boolean | | | Connect to the Kubernetes cluster without checking for a valid TLS certificate. Not recommended in production. This is ignored if `skip_kubeconfig` is `true`. |
|
||||||
|
| create_namespace | boolean | | | Pass --create-namespace to `helm upgrade`. |
|
||||||
|
| skip_crds | boolean | | | Pass --skip-crds to `helm upgrade`. |
|
||||||
|
|
||||||
## Uninstallation
|
## Uninstallation
|
||||||
|
|
||||||
@@ -55,14 +59,15 @@ Uninstallations are triggered when the `mode` setting is "uninstall" or "delete.
|
|||||||
| Param name | Type | Required | Alias | Purpose |
|
| Param name | Type | Required | Alias | Purpose |
|
||||||
|------------------------|----------|----------|------------------------|---------|
|
|------------------------|----------|----------|------------------------|---------|
|
||||||
| release | string | yes | | The release name for helm to use. |
|
| release | string | yes | | The release name for helm to use. |
|
||||||
| kube_api_server | string | yes | api_server | API endpoint for the Kubernetes cluster. |
|
| skip_kubeconfig | boolean | | | Whether to skip kubeconfig file creation. |
|
||||||
| kube_token | string | yes | kubernetes_token | Token for authenticating to Kubernetes. |
|
| kube_api_server | string | yes | api_server | API endpoint for the Kubernetes cluster. This is ignored if `skip_kubeconfig` is `true`. |
|
||||||
| kube_service_account | string | | service_account | Service account for authenticating to Kubernetes. Default is `helm`. |
|
| kube_token | string | yes | kubernetes_token | Token for authenticating to Kubernetes. This is ignored if `skip_kubeconfig` is `true`. |
|
||||||
| kube_certificate | string | | kubernetes_certificate | Base64 encoded TLS certificate used by the Kubernetes cluster's certificate authority. |
|
| kube_service_account | string | | service_account | Service account for authenticating to Kubernetes. Default is `helm`. This is ignored if `skip_kubeconfig` is `true`. |
|
||||||
|
| kube_certificate | string | | kubernetes_certificate | Base64 encoded TLS certificate used by the Kubernetes cluster's certificate authority. This is ignored if `skip_kubeconfig` is `true`. |
|
||||||
| keep_history | boolean | | | Pass `--keep-history` to `helm uninstall`, to retain the release history. |
|
| keep_history | boolean | | | Pass `--keep-history` to `helm uninstall`, to retain the release history. |
|
||||||
| dry_run | boolean | | | Pass `--dry-run` to `helm uninstall`. |
|
| dry_run | boolean | | | Pass `--dry-run` to `helm uninstall`. |
|
||||||
| timeout | duration | | | Timeout for any *individual* Kubernetes operation. The uninstallation's full runtime may exceed this duration. |
|
| timeout | duration | | | Timeout for any *individual* Kubernetes operation. The uninstallation's full runtime may exceed this duration. |
|
||||||
| skip_tls_verify | boolean | | | Connect to the Kubernetes cluster without checking for a valid TLS certificate. Not recommended in production. |
|
| skip_tls_verify | boolean | | | Connect to the Kubernetes cluster without checking for a valid TLS certificate. Not recommended in production. This is ignored if `skip_kubeconfig` is `true`. |
|
||||||
| chart | string | | | Required when the global `update_dependencies` parameter is true. No effect otherwise. |
|
| chart | string | | | Required when the global `update_dependencies` parameter is true. No effect otherwise. |
|
||||||
|
|
||||||
### Where to put settings
|
### Where to put settings
|
||||||
|
|||||||
16
internal/env/config.go
vendored
16
internal/env/config.go
vendored
@@ -23,7 +23,8 @@ type Config struct {
|
|||||||
// Configuration for drone-helm itself
|
// Configuration for drone-helm itself
|
||||||
Command string `envconfig:"mode"` // Helm command to run
|
Command string `envconfig:"mode"` // Helm command to run
|
||||||
DroneEvent string `envconfig:"drone_build_event"` // Drone event that invoked this plugin.
|
DroneEvent string `envconfig:"drone_build_event"` // Drone event that invoked this plugin.
|
||||||
UpdateDependencies bool `split_words:"true"` // Call `helm dependency update` before the main command
|
UpdateDependencies bool `split_words:"true"` // [Deprecated] Call `helm dependency update` before the main command (deprecated, use dependencies_action: update instead)
|
||||||
|
DependenciesAction string `split_words:"true"` // Call `helm dependency build` or `helm dependency update` before the main command
|
||||||
AddRepos []string `split_words:"true"` // Call `helm repo add` before the main command
|
AddRepos []string `split_words:"true"` // Call `helm repo add` before the main command
|
||||||
RepoCertificate string `envconfig:"repo_certificate"` // The Helm chart repository's self-signed certificate (must be base64-encoded)
|
RepoCertificate string `envconfig:"repo_certificate"` // The Helm chart repository's self-signed certificate (must be base64-encoded)
|
||||||
RepoCACertificate string `envconfig:"repo_ca_certificate"` // The Helm chart repository CA's self-signed certificate (must be base64-encoded)
|
RepoCACertificate string `envconfig:"repo_ca_certificate"` // The Helm chart repository CA's self-signed certificate (must be base64-encoded)
|
||||||
@@ -32,7 +33,9 @@ type Config struct {
|
|||||||
StringValues string `split_words:"true"` // Argument to pass to --set-string in applicable helm commands
|
StringValues string `split_words:"true"` // Argument to pass to --set-string in applicable helm commands
|
||||||
ValuesFiles []string `split_words:"true"` // Arguments to pass to --values in applicable helm commands
|
ValuesFiles []string `split_words:"true"` // Arguments to pass to --values in applicable helm commands
|
||||||
Namespace string `` // Kubernetes namespace for all helm commands
|
Namespace string `` // Kubernetes namespace for all helm commands
|
||||||
|
CreateNamespace bool `split_words:"true"` // Pass --create-namespace to `helm upgrade`
|
||||||
KubeToken string `split_words:"true"` // Kubernetes authentication token to put in .kube/config
|
KubeToken string `split_words:"true"` // Kubernetes authentication token to put in .kube/config
|
||||||
|
SkipKubeconfig bool `envconfig:"skip_kubeconfig"` // Skip kubeconfig creation
|
||||||
SkipTLSVerify bool `envconfig:"skip_tls_verify"` // Put insecure-skip-tls-verify in .kube/config
|
SkipTLSVerify bool `envconfig:"skip_tls_verify"` // Put insecure-skip-tls-verify in .kube/config
|
||||||
Certificate string `envconfig:"kube_certificate"` // The Kubernetes cluster CA's self-signed certificate (must be base64-encoded)
|
Certificate string `envconfig:"kube_certificate"` // The Kubernetes cluster CA's self-signed certificate (must be base64-encoded)
|
||||||
APIServer string `envconfig:"kube_api_server"` // The Kubernetes cluster's API endpoint
|
APIServer string `envconfig:"kube_api_server"` // The Kubernetes cluster's API endpoint
|
||||||
@@ -49,6 +52,7 @@ type Config struct {
|
|||||||
AtomicUpgrade bool `split_words:"true"` // Pass --atomic to `helm upgrade`
|
AtomicUpgrade bool `split_words:"true"` // Pass --atomic to `helm upgrade`
|
||||||
CleanupOnFail bool `envconfig:"cleanup_failed_upgrade"` // Pass --cleanup-on-fail to `helm upgrade`
|
CleanupOnFail bool `envconfig:"cleanup_failed_upgrade"` // Pass --cleanup-on-fail to `helm upgrade`
|
||||||
LintStrictly bool `split_words:"true"` // Pass --strict to `helm lint`
|
LintStrictly bool `split_words:"true"` // Pass --strict to `helm lint`
|
||||||
|
SkipCrds bool `split_words:"true"` // Pass --skip-crds to `helm upgrade`
|
||||||
|
|
||||||
Stdout io.Writer `ignored:"true"`
|
Stdout io.Writer `ignored:"true"`
|
||||||
Stderr io.Writer `ignored:"true"`
|
Stderr io.Writer `ignored:"true"`
|
||||||
@@ -86,6 +90,12 @@ func NewConfig(stdout, stderr io.Writer) (*Config, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if cfg.SkipKubeconfig {
|
||||||
|
if cfg.KubeToken != "" || cfg.Certificate != "" || cfg.APIServer != "" || cfg.ServiceAccount != "" || cfg.SkipTLSVerify {
|
||||||
|
fmt.Fprintf(cfg.Stderr, "Warning: skip_kubeconfig is set. The following kubeconfig-related settings will be ignored: kube_config, kube_certificate, kube_api_server, kube_service_account, skip_tls_verify.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if justNumbers.MatchString(cfg.Timeout) {
|
if justNumbers.MatchString(cfg.Timeout) {
|
||||||
cfg.Timeout = fmt.Sprintf("%ss", cfg.Timeout)
|
cfg.Timeout = fmt.Sprintf("%ss", cfg.Timeout)
|
||||||
}
|
}
|
||||||
@@ -143,6 +153,10 @@ func (cfg *Config) deprecationWarn() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// settingAliases provides alternate environment variable names for certain settings, either because
|
||||||
|
// they were renamed during drone-helm3's lifetime or for backward-compatibility with the original
|
||||||
|
// drone-helm. Most config options don't need to be included here; adding them to the main Config
|
||||||
|
// struct is sufficient.
|
||||||
type settingAliases struct {
|
type settingAliases struct {
|
||||||
Command string `envconfig:"helm_command"`
|
Command string `envconfig:"helm_command"`
|
||||||
AddRepos []string `envconfig:"helm_repos"`
|
AddRepos []string `envconfig:"helm_repos"`
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package helm
|
package helm
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/pelotech/drone-helm3/internal/env"
|
"github.com/pelotech/drone-helm3/internal/env"
|
||||||
"github.com/pelotech/drone-helm3/internal/run"
|
"github.com/pelotech/drone-helm3/internal/run"
|
||||||
@@ -30,6 +31,10 @@ func NewPlan(cfg env.Config) (*Plan, error) {
|
|||||||
cfg: cfg,
|
cfg: cfg,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if cfg.UpdateDependencies && cfg.DependenciesAction != "" {
|
||||||
|
return nil, errors.New("update_dependencies is deprecated and cannot be provided together with dependencies_action")
|
||||||
|
}
|
||||||
|
|
||||||
p.steps = (*determineSteps(cfg))(cfg)
|
p.steps = (*determineSteps(cfg))(cfg)
|
||||||
|
|
||||||
for i, step := range p.steps {
|
for i, step := range p.steps {
|
||||||
@@ -87,13 +92,21 @@ func (p *Plan) Execute() error {
|
|||||||
|
|
||||||
var upgrade = func(cfg env.Config) []Step {
|
var upgrade = func(cfg env.Config) []Step {
|
||||||
var steps []Step
|
var steps []Step
|
||||||
steps = append(steps, run.NewInitKube(cfg, kubeConfigTemplate, kubeConfigFile))
|
if !cfg.SkipKubeconfig {
|
||||||
|
steps = append(steps, run.NewInitKube(cfg, kubeConfigTemplate, kubeConfigFile))
|
||||||
|
}
|
||||||
for _, repo := range cfg.AddRepos {
|
for _, repo := range cfg.AddRepos {
|
||||||
steps = append(steps, run.NewAddRepo(cfg, repo))
|
steps = append(steps, run.NewAddRepo(cfg, repo))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if cfg.DependenciesAction != "" {
|
||||||
|
steps = append(steps, run.NewDepAction(cfg))
|
||||||
|
}
|
||||||
|
|
||||||
if cfg.UpdateDependencies {
|
if cfg.UpdateDependencies {
|
||||||
steps = append(steps, run.NewDepUpdate(cfg))
|
steps = append(steps, run.NewDepUpdate(cfg))
|
||||||
}
|
}
|
||||||
|
|
||||||
steps = append(steps, run.NewUpgrade(cfg))
|
steps = append(steps, run.NewUpgrade(cfg))
|
||||||
|
|
||||||
return steps
|
return steps
|
||||||
@@ -101,7 +114,9 @@ var upgrade = func(cfg env.Config) []Step {
|
|||||||
|
|
||||||
var uninstall = func(cfg env.Config) []Step {
|
var uninstall = func(cfg env.Config) []Step {
|
||||||
var steps []Step
|
var steps []Step
|
||||||
steps = append(steps, run.NewInitKube(cfg, kubeConfigTemplate, kubeConfigFile))
|
if !cfg.SkipKubeconfig {
|
||||||
|
steps = append(steps, run.NewInitKube(cfg, kubeConfigTemplate, kubeConfigFile))
|
||||||
|
}
|
||||||
if cfg.UpdateDependencies {
|
if cfg.UpdateDependencies {
|
||||||
steps = append(steps, run.NewDepUpdate(cfg))
|
steps = append(steps, run.NewDepUpdate(cfg))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -122,6 +122,12 @@ func (suite *PlanTestSuite) TestUpgrade() {
|
|||||||
suite.IsType(&run.Upgrade{}, steps[1])
|
suite.IsType(&run.Upgrade{}, steps[1])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (suite *PlanTestSuite) TestUpgradeWithSkipKubeconfig() {
|
||||||
|
steps := upgrade(env.Config{SkipKubeconfig: true})
|
||||||
|
suite.Require().Equal(1, len(steps), "upgrade should return 1 step")
|
||||||
|
suite.IsType(&run.Upgrade{}, steps[0])
|
||||||
|
}
|
||||||
|
|
||||||
func (suite *PlanTestSuite) TestUpgradeWithUpdateDependencies() {
|
func (suite *PlanTestSuite) TestUpgradeWithUpdateDependencies() {
|
||||||
cfg := env.Config{
|
cfg := env.Config{
|
||||||
UpdateDependencies: true,
|
UpdateDependencies: true,
|
||||||
|
|||||||
59
internal/run/depaction.go
Normal file
59
internal/run/depaction.go
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
package run
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"github.com/pelotech/drone-helm3/internal/env"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
actionBuild = "build"
|
||||||
|
actionUpdate = "update"
|
||||||
|
)
|
||||||
|
|
||||||
|
// DepAction is an execution step that calls `helm dependency update` or `helm dependency build` when executed.
|
||||||
|
type DepAction struct {
|
||||||
|
*config
|
||||||
|
chart string
|
||||||
|
cmd cmd
|
||||||
|
action string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewDepAction creates a DepAction using fields from the given Config. No validation is performed at this time.
|
||||||
|
func NewDepAction(cfg env.Config) *DepAction {
|
||||||
|
return &DepAction{
|
||||||
|
config: newConfig(cfg),
|
||||||
|
chart: cfg.Chart,
|
||||||
|
action: cfg.DependenciesAction,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Execute executes the `helm upgrade` command.
|
||||||
|
func (d *DepAction) Execute() error {
|
||||||
|
return d.cmd.Run()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prepare gets the DepAction ready to execute.
|
||||||
|
func (d *DepAction) Prepare() error {
|
||||||
|
if d.chart == "" {
|
||||||
|
return fmt.Errorf("chart is required")
|
||||||
|
}
|
||||||
|
|
||||||
|
args := d.globalFlags()
|
||||||
|
|
||||||
|
if d.action != actionBuild && d.action != actionUpdate {
|
||||||
|
return errors.New("unknown dependency_action: " + d.action)
|
||||||
|
}
|
||||||
|
|
||||||
|
args = append(args, "dependency", d.action, d.chart)
|
||||||
|
|
||||||
|
d.cmd = command(helmBin, args...)
|
||||||
|
d.cmd.Stdout(d.stdout)
|
||||||
|
d.cmd.Stderr(d.stderr)
|
||||||
|
|
||||||
|
if d.debug {
|
||||||
|
fmt.Fprintf(d.stderr, "Generated command: '%s'\n", d.cmd.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
131
internal/run/depaction_test.go
Normal file
131
internal/run/depaction_test.go
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
package run
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"github.com/golang/mock/gomock"
|
||||||
|
"github.com/pelotech/drone-helm3/internal/env"
|
||||||
|
"github.com/stretchr/testify/suite"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
type DepActionTestSuite struct {
|
||||||
|
suite.Suite
|
||||||
|
ctrl *gomock.Controller
|
||||||
|
mockCmd *Mockcmd
|
||||||
|
originalCommand func(string, ...string) cmd
|
||||||
|
}
|
||||||
|
|
||||||
|
func (suite *DepActionTestSuite) BeforeTest(_, _ string) {
|
||||||
|
suite.ctrl = gomock.NewController(suite.T())
|
||||||
|
suite.mockCmd = NewMockcmd(suite.ctrl)
|
||||||
|
|
||||||
|
suite.originalCommand = command
|
||||||
|
command = func(path string, args ...string) cmd { return suite.mockCmd }
|
||||||
|
}
|
||||||
|
|
||||||
|
func (suite *DepActionTestSuite) AfterTest(_, _ string) {
|
||||||
|
command = suite.originalCommand
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDepActionTestSuite(t *testing.T) {
|
||||||
|
suite.Run(t, new(DepActionTestSuite))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (suite *DepActionTestSuite) TestNewDepAction() {
|
||||||
|
cfg := env.Config{
|
||||||
|
Chart: "scatterplot",
|
||||||
|
}
|
||||||
|
d := NewDepAction(cfg)
|
||||||
|
suite.Equal("scatterplot", d.chart)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (suite *DepActionTestSuite) TestPrepareAndExecuteBuild() {
|
||||||
|
defer suite.ctrl.Finish()
|
||||||
|
|
||||||
|
stdout := strings.Builder{}
|
||||||
|
stderr := strings.Builder{}
|
||||||
|
cfg := env.Config{
|
||||||
|
Chart: "your_top_songs_2019",
|
||||||
|
Stdout: &stdout,
|
||||||
|
Stderr: &stderr,
|
||||||
|
DependenciesAction: "build",
|
||||||
|
}
|
||||||
|
|
||||||
|
command = func(path string, args ...string) cmd {
|
||||||
|
suite.Equal(helmBin, path)
|
||||||
|
suite.Equal([]string{"dependency", "build", "your_top_songs_2019"}, args)
|
||||||
|
|
||||||
|
return suite.mockCmd
|
||||||
|
}
|
||||||
|
suite.mockCmd.EXPECT().
|
||||||
|
Stdout(&stdout)
|
||||||
|
suite.mockCmd.EXPECT().
|
||||||
|
Stderr(&stderr)
|
||||||
|
suite.mockCmd.EXPECT().
|
||||||
|
Run().
|
||||||
|
Times(1)
|
||||||
|
|
||||||
|
d := NewDepAction(cfg)
|
||||||
|
|
||||||
|
suite.Require().NoError(d.Prepare())
|
||||||
|
suite.NoError(d.Execute())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (suite *DepActionTestSuite) TestPrepareAndExecuteUpdate() {
|
||||||
|
defer suite.ctrl.Finish()
|
||||||
|
|
||||||
|
stdout := strings.Builder{}
|
||||||
|
stderr := strings.Builder{}
|
||||||
|
cfg := env.Config{
|
||||||
|
Chart: "your_top_songs_2019",
|
||||||
|
Stdout: &stdout,
|
||||||
|
Stderr: &stderr,
|
||||||
|
DependenciesAction: "update",
|
||||||
|
}
|
||||||
|
|
||||||
|
command = func(path string, args ...string) cmd {
|
||||||
|
suite.Equal(helmBin, path)
|
||||||
|
suite.Equal([]string{"dependency", "update", "your_top_songs_2019"}, args)
|
||||||
|
|
||||||
|
return suite.mockCmd
|
||||||
|
}
|
||||||
|
suite.mockCmd.EXPECT().
|
||||||
|
Stdout(&stdout)
|
||||||
|
suite.mockCmd.EXPECT().
|
||||||
|
Stderr(&stderr)
|
||||||
|
suite.mockCmd.EXPECT().
|
||||||
|
Run().
|
||||||
|
Times(1)
|
||||||
|
|
||||||
|
d := NewDepAction(cfg)
|
||||||
|
|
||||||
|
suite.Require().NoError(d.Prepare())
|
||||||
|
suite.NoError(d.Execute())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (suite *DepActionTestSuite) TestPrepareAndExecuteUnknown() {
|
||||||
|
defer suite.ctrl.Finish()
|
||||||
|
|
||||||
|
stdout := strings.Builder{}
|
||||||
|
stderr := strings.Builder{}
|
||||||
|
cfg := env.Config{
|
||||||
|
Chart: "your_top_songs_2019",
|
||||||
|
Stdout: &stdout,
|
||||||
|
Stderr: &stderr,
|
||||||
|
DependenciesAction: "downgrade",
|
||||||
|
}
|
||||||
|
|
||||||
|
d := NewDepAction(cfg)
|
||||||
|
suite.Require().Equal(errors.New("unknown dependency_action: downgrade"), d.Prepare())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (suite *DepActionTestSuite) TestPrepareChartRequired() {
|
||||||
|
d := NewDepAction(env.Config{})
|
||||||
|
|
||||||
|
suite.mockCmd.EXPECT().Stdout(gomock.Any()).AnyTimes()
|
||||||
|
suite.mockCmd.EXPECT().Stderr(gomock.Any()).AnyTimes()
|
||||||
|
|
||||||
|
err := d.Prepare()
|
||||||
|
suite.EqualError(err, "chart is required")
|
||||||
|
}
|
||||||
@@ -11,18 +11,20 @@ type Upgrade struct {
|
|||||||
chart string
|
chart string
|
||||||
release string
|
release string
|
||||||
|
|
||||||
chartVersion string
|
chartVersion string
|
||||||
dryRun bool
|
dryRun bool
|
||||||
wait bool
|
wait bool
|
||||||
values string
|
values string
|
||||||
stringValues string
|
stringValues string
|
||||||
valuesFiles []string
|
valuesFiles []string
|
||||||
reuseValues bool
|
reuseValues bool
|
||||||
timeout string
|
timeout string
|
||||||
force bool
|
force bool
|
||||||
atomic bool
|
atomic bool
|
||||||
cleanupOnFail bool
|
cleanupOnFail bool
|
||||||
certs *repoCerts
|
certs *repoCerts
|
||||||
|
createNamespace bool
|
||||||
|
skipCrds bool
|
||||||
|
|
||||||
cmd cmd
|
cmd cmd
|
||||||
}
|
}
|
||||||
@@ -30,21 +32,23 @@ type Upgrade struct {
|
|||||||
// NewUpgrade creates an Upgrade using fields from the given Config. No validation is performed at this time.
|
// NewUpgrade creates an Upgrade using fields from the given Config. No validation is performed at this time.
|
||||||
func NewUpgrade(cfg env.Config) *Upgrade {
|
func NewUpgrade(cfg env.Config) *Upgrade {
|
||||||
return &Upgrade{
|
return &Upgrade{
|
||||||
config: newConfig(cfg),
|
config: newConfig(cfg),
|
||||||
chart: cfg.Chart,
|
chart: cfg.Chart,
|
||||||
release: cfg.Release,
|
release: cfg.Release,
|
||||||
chartVersion: cfg.ChartVersion,
|
chartVersion: cfg.ChartVersion,
|
||||||
dryRun: cfg.DryRun,
|
dryRun: cfg.DryRun,
|
||||||
wait: cfg.Wait,
|
wait: cfg.Wait,
|
||||||
values: cfg.Values,
|
values: cfg.Values,
|
||||||
stringValues: cfg.StringValues,
|
stringValues: cfg.StringValues,
|
||||||
valuesFiles: cfg.ValuesFiles,
|
valuesFiles: cfg.ValuesFiles,
|
||||||
reuseValues: cfg.ReuseValues,
|
reuseValues: cfg.ReuseValues,
|
||||||
timeout: cfg.Timeout,
|
timeout: cfg.Timeout,
|
||||||
force: cfg.Force,
|
force: cfg.Force,
|
||||||
atomic: cfg.AtomicUpgrade,
|
atomic: cfg.AtomicUpgrade,
|
||||||
cleanupOnFail: cfg.CleanupOnFail,
|
cleanupOnFail: cfg.CleanupOnFail,
|
||||||
certs: newRepoCerts(cfg),
|
certs: newRepoCerts(cfg),
|
||||||
|
createNamespace: cfg.CreateNamespace,
|
||||||
|
skipCrds: cfg.SkipCrds,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,6 +99,12 @@ func (u *Upgrade) Prepare() error {
|
|||||||
if u.stringValues != "" {
|
if u.stringValues != "" {
|
||||||
args = append(args, "--set-string", u.stringValues)
|
args = append(args, "--set-string", u.stringValues)
|
||||||
}
|
}
|
||||||
|
if u.createNamespace {
|
||||||
|
args = append(args, "--create-namespace")
|
||||||
|
}
|
||||||
|
if u.skipCrds {
|
||||||
|
args = append(args, "--skip-crds")
|
||||||
|
}
|
||||||
for _, vFile := range u.valuesFiles {
|
for _, vFile := range u.valuesFiles {
|
||||||
args = append(args, "--values", vFile)
|
args = append(args, "--values", vFile)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -220,3 +220,27 @@ func (suite *UpgradeTestSuite) TestPrepareDebugFlag() {
|
|||||||
suite.Equal(want, stderr.String())
|
suite.Equal(want, stderr.String())
|
||||||
suite.Equal("", stdout.String())
|
suite.Equal("", stdout.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (suite *UpgradeTestSuite) TestPrepareSkipCrdsFlag() {
|
||||||
|
defer suite.ctrl.Finish()
|
||||||
|
|
||||||
|
cfg := env.Config{
|
||||||
|
Chart: "at40",
|
||||||
|
Release: "cabbages_smell_great",
|
||||||
|
SkipCrds: true,
|
||||||
|
}
|
||||||
|
u := NewUpgrade(cfg)
|
||||||
|
|
||||||
|
command = func(path string, args ...string) cmd {
|
||||||
|
suite.Equal(helmBin, path)
|
||||||
|
suite.Equal([]string{"upgrade", "--install", "--skip-crds", "cabbages_smell_great", "at40"}, args)
|
||||||
|
|
||||||
|
return suite.mockCmd
|
||||||
|
}
|
||||||
|
|
||||||
|
suite.mockCmd.EXPECT().Stdout(gomock.Any())
|
||||||
|
suite.mockCmd.EXPECT().Stderr(gomock.Any())
|
||||||
|
|
||||||
|
err := u.Prepare()
|
||||||
|
suite.Require().Nil(err)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user