Skip to content

Commit

Permalink
Restore latest apps versions from k3sup
Browse files Browse the repository at this point in the history
The original version of arkade was based upon k3sup 0.8.10
which missed some changes from the community.

Signed-off-by: Alex Ellis (OpenFaaS Ltd) <[email protected]>
  • Loading branch information
alexellis committed Feb 26, 2020
1 parent 09b64e3 commit 24e7bf3
Show file tree
Hide file tree
Showing 16 changed files with 115 additions and 63 deletions.
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# arkade - get Kubernetes apps, the easy way

Gone are the days of contending with dozens of README files just to get the right version of [helm](https://helm.sh) and to install a chart with sane defaults. arkade (ark for short) provides a clean CLI with strongly-typed flags to install charts and apps to your cluster in one command.
Gone are the days of contending with dozens of README files just to get the right version of [helm](https://helm.sh) and to install a chart with sane defaults.

arkade (ark for short) provides a clean CLI with strongly-typed flags to install charts and apps to your cluster in one command.

[![Build
Status](https://travis-ci.com/alexellis/arkade.svg?branch=master)](https://travis-ci.com/alexellis/arkade)
Expand Down Expand Up @@ -81,7 +83,7 @@ ark install openfaas --set=faasIdler.dryRun=false
After installation, an info message will be printed with help for usage, you can get back to this at any time via:
```bash
arkade app info <NAME>
arkade info <NAME>
```
### Get a self-hosted TLS registry with authentication
Expand Down
9 changes: 6 additions & 3 deletions cmd/apps/certmanager_app.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ func MakeInstallCertManager() *cobra.Command {
certManager.Flags().Bool("helm3", true, "Use helm3, if set to false uses helm2")

certManager.RunE = func(command *cobra.Command, args []string) error {
wait, _ := command.Flags().GetBool("wait")
const certManagerVersion = "v0.12.0"
kubeConfigPath := getDefaultKubeconfig()

if command.Flags().Changed("kubeconfig") {
Expand Down Expand Up @@ -88,7 +90,7 @@ func MakeInstallCertManager() *cobra.Command {

chartPath := path.Join(os.TempDir(), "charts")

err = fetchChart(chartPath, "jetstack/cert-manager", helm3)
err = fetchChart(chartPath, "jetstack/cert-manager", certManagerVersion, helm3)
if err != nil {
return err
}
Expand All @@ -114,13 +116,14 @@ func MakeInstallCertManager() *cobra.Command {
err := helm3Upgrade(outputPath, "jetstack/cert-manager", namespace,
"values.yaml",
"v0.12.0",
overrides)
overrides,
wait)

if err != nil {
return err
}
} else {
err = templateChart(chartPath, "cert-manager", namespace, outputPath, "values.yaml", "v0.12.0", nil)
err = templateChart(chartPath, "cert-manager", namespace, outputPath, "values.yaml", nil)
if err != nil {
return err
}
Expand Down
6 changes: 4 additions & 2 deletions cmd/apps/chart_app.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ import (
"github.com/spf13/cobra"
)

const defaultVersion = "" // If we don't set version then we get latest

func MakeInstallChart() *cobra.Command {
var chartCmd = &cobra.Command{
Use: "chart",
Expand Down Expand Up @@ -109,7 +111,7 @@ before using the generic helm chart installer command.`,

chartPath := path.Join(os.TempDir(), "charts")

err = fetchChart(chartPath, chartRepoName, false)
err = fetchChart(chartPath, chartRepoName, defaultVersion, false)
if err != nil {
return err
}
Expand All @@ -130,7 +132,7 @@ before using the generic helm chart installer command.`,
}
}

err = templateChart(chartPath, chartName, namespace, outputPath, "values.yaml", "", setMap)
err = templateChart(chartPath, chartName, namespace, outputPath, "values.yaml", setMap)
if err != nil {
return err
}
Expand Down
3 changes: 1 addition & 2 deletions cmd/apps/cronconnector_app.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ func MakeInstallCronConnector() *cobra.Command {
}

chartPath := path.Join(os.TempDir(), "charts")
err = fetchChart(chartPath, "openfaas/cron-connector", false)
err = fetchChart(chartPath, "openfaas/cron-connector", defaultVersion, false)

if err != nil {
return err
Expand Down Expand Up @@ -105,7 +105,6 @@ func MakeInstallCronConnector() *cobra.Command {
ns,
outputPath,
"values.yaml",
"",
overrides)

if err != nil {
Expand Down
7 changes: 4 additions & 3 deletions cmd/apps/crossplane_app.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ schedule workloads to any Kubernetes cluster`,
crossplane.Flags().Bool("helm3", true, "Use helm3, if set to false uses helm2")

crossplane.RunE = func(command *cobra.Command, args []string) error {
wait, _ := command.Flags().GetBool("wait")
kubeConfigPath := getDefaultKubeconfig()

if command.Flags().Changed("kubeconfig") {
Expand Down Expand Up @@ -88,7 +89,7 @@ schedule workloads to any Kubernetes cluster`,

chartPath := path.Join(os.TempDir(), "charts")

err = fetchChart(chartPath, "crossplane-alpha/crossplane", helm3)
err = fetchChart(chartPath, "crossplane-alpha/crossplane", defaultVersion, helm3)
if err != nil {
return err
}
Expand All @@ -103,14 +104,14 @@ schedule workloads to any Kubernetes cluster`,
}

err := helm3Upgrade(outputPath, "crossplane-alpha/crossplane",
namespace, "values.yaml", "", map[string]string{})
namespace, "values.yaml", "", map[string]string{}, wait)
if err != nil {
return err
}

} else {
outputPath := path.Join(chartPath, "crossplane-alpha/crossplane")
err = templateChart(chartPath, "crossplane", namespace, outputPath, "values.yaml", "", map[string]string{})
err = templateChart(chartPath, "crossplane", namespace, outputPath, "values.yaml", map[string]string{})
if err != nil {
return err
}
Expand Down
49 changes: 40 additions & 9 deletions cmd/apps/inletsoperator_app.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ func MakeInstallInletsOperator() *cobra.Command {
inletsOperator.Flags().StringP("region", "r", "lon1", "The default region to provision the exit node (DigitalOcean, Packet and Scaleway")
inletsOperator.Flags().String("organization-id", "", "The organization id (Scaleway")
inletsOperator.Flags().StringP("token-file", "t", "", "Text file containing token or a service account JSON file")
inletsOperator.Flags().StringP("secret-key-file", "s", "", "Text file containing secret key, used for providers like ec2")
inletsOperator.Flags().Bool("update-repo", true, "Update the helm repo")

inletsOperator.Flags().String("pro-client-image", "", "Docker image for inlets-pro's client")
Expand All @@ -40,6 +41,7 @@ func MakeInstallInletsOperator() *cobra.Command {
inletsOperator.RunE = func(command *cobra.Command, args []string) error {
kubeConfigPath := getDefaultKubeconfig()

wait, _ := command.Flags().GetBool("wait")
if command.Flags().Changed("kubeconfig") {
kubeConfigPath, _ = command.Flags().GetString("kubeconfig")
}
Expand Down Expand Up @@ -95,7 +97,7 @@ func MakeInstallInletsOperator() *cobra.Command {

chartPath := path.Join(os.TempDir(), "charts")

err = fetchChart(chartPath, "inlets/inlets-operator", helm3)
err = fetchChart(chartPath, "inlets/inlets-operator", defaultVersion, helm3)
if err != nil {
return err
}
Expand All @@ -110,15 +112,15 @@ func MakeInstallInletsOperator() *cobra.Command {
return err
}

secretFileName, _ := command.Flags().GetString("token-file")
tokenFileName, _ := command.Flags().GetString("token-file")

if len(secretFileName) == 0 {
if len(tokenFileName) == 0 {
return fmt.Errorf(`--token-file is a required field for your cloud API token or service account JSON file`)
}

res, err := kubectlTask("create", "secret", "generic",
"inlets-access-key",
"--from-file", "inlets-access-key="+secretFileName)
"--from-file", "inlets-access-key="+tokenFileName)

if len(res.Stderr) > 0 && strings.Contains(res.Stderr, "AlreadyExists") {
fmt.Println("[Warning] secret inlets-access-key already exists and will be used.")
Expand All @@ -128,6 +130,21 @@ func MakeInstallInletsOperator() *cobra.Command {
return err
}

secretKeyFile, _ := command.Flags().GetString("secret-key-file")

if len(secretKeyFile) > 0 {
res, err := kubectlTask("create", "secret", "generic",
"inlets-secret-key",
"--from-file", "inlets-secret-key="+secretKeyFile)
if len(res.Stderr) > 0 && strings.Contains(res.Stderr, "AlreadyExists") {
fmt.Println("[Warning] secret inlets-access-key already exists and will be used.")
} else if len(res.Stderr) > 0 {
return fmt.Errorf("error from kubectl\n%q", res.Stderr)
} else if err != nil {
return err
}
}

customFlags, _ := command.Flags().GetStringArray("set")

if err := mergeFlags(overrides, customFlags); err != nil {
Expand All @@ -149,14 +166,14 @@ func MakeInstallInletsOperator() *cobra.Command {
outputPath := path.Join(chartPath, "inlets-operator")

err := helm3Upgrade(outputPath, "inlets/inlets-operator",
namespace, "values.yaml", "", overrides)
namespace, "values.yaml", "", overrides, wait)
if err != nil {
return err
}

} else {
outputPath := path.Join(chartPath, "inlets-operator/rendered")
err = templateChart(chartPath, "inlets-operator", namespace, outputPath, "values.yaml", "", overrides)
err = templateChart(chartPath, "inlets-operator", namespace, outputPath, "values.yaml", overrides)
if err != nil {
return err
}
Expand All @@ -183,6 +200,12 @@ func getInletsOperatorOverrides(command *cobra.Command) (map[string]string, erro
provider, _ := command.Flags().GetString("provider")
overrides["provider"] = strings.ToLower(provider)

secretKeyFile, _ := command.Flags().GetString("secret-key-file")

if len(secretKeyFile) > 0 {
overrides["secretKeyFile"] = "/var/secrets/inlets/secret/inlets-secret-key"
}

providers := []string{
"digitalocean", "packet", "ec2", "scaleway", "gce",
}
Expand All @@ -201,7 +224,7 @@ func getInletsOperatorOverrides(command *cobra.Command) (map[string]string, erro
if err != nil {
return overrides, err
}
overrides["gceProjectId"] = gceProjectID
overrides["projectID"] = gceProjectID

zone, err := command.Flags().GetString("zone")
if err != nil {
Expand All @@ -221,7 +244,7 @@ func getInletsOperatorOverrides(command *cobra.Command) (map[string]string, erro
if err != nil {
return overrides, err
}
overrides["packetProjectId"] = packetProjectID
overrides["projectID"] = packetProjectID

if len(packetProjectID) == 0 {
return overrides, fmt.Errorf("project-id is required for provider %s", provider)
Expand All @@ -232,11 +255,19 @@ func getInletsOperatorOverrides(command *cobra.Command) (map[string]string, erro
if err != nil {
return overrides, err
}
overrides["organization-id"] = orgID
overrides["organizationID"] = orgID

if len(secretKeyFile) == 0 {
return overrides, fmt.Errorf("secret-key-file is required for provider %s", provider)
}

if len(orgID) == 0 {
return overrides, fmt.Errorf("organization-id is required for provider %s", provider)
}
} else if provider == "ec2" {
if len(secretKeyFile) == 0 {
return overrides, fmt.Errorf("secret-key-file is required for provider %s", provider)
}
}

return overrides, nil
Expand Down
7 changes: 4 additions & 3 deletions cmd/apps/istio_app.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ func MakeInstallIstio() *cobra.Command {

istio.RunE = func(command *cobra.Command, args []string) error {
kubeConfigPath := getDefaultKubeconfig()
wait, _ := command.Flags().GetBool("wait")

if command.Flags().Changed("kubeconfig") {
kubeConfigPath, _ = command.Flags().GetString("kubeconfig")
Expand Down Expand Up @@ -97,7 +98,7 @@ func MakeInstallIstio() *cobra.Command {

chartPath := path.Join(os.TempDir(), "charts")

err = fetchChart(chartPath, "istio/istio", helm3)
err = fetchChart(chartPath, "istio/istio", defaultVersion, helm3)

if err != nil {
return fmt.Errorf("unable fetch chart %s", err)
Expand All @@ -113,7 +114,7 @@ func MakeInstallIstio() *cobra.Command {
outputPath := path.Join(chartPath, "istio")

if initIstio, _ := command.Flags().GetBool("init"); initIstio {
err = helm3Upgrade(outputPath, "istio/istio-init", namespace, "", "", overrides)
err = helm3Upgrade(outputPath, "istio/istio-init", namespace, "", defaultVersion, overrides, wait)
if err != nil {
return fmt.Errorf("unable to istio-init install chart with helm %s", err)
}
Expand All @@ -129,7 +130,7 @@ func MakeInstallIstio() *cobra.Command {
return err
}

err = helm3Upgrade(outputPath, "istio/istio", namespace, valuesFile, "", overrides)
err = helm3Upgrade(outputPath, "istio/istio", namespace, valuesFile, defaultVersion, overrides, wait)
if err != nil {
return fmt.Errorf("unable to istio install chart with helm %s", err)
}
Expand Down
3 changes: 1 addition & 2 deletions cmd/apps/kafkaconnector_app.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ func MakeInstallKafkaConnector() *cobra.Command {
}

chartPath := path.Join(os.TempDir(), "charts")
err = fetchChart(chartPath, "openfaas/kafka-connector", false)
err = fetchChart(chartPath, "openfaas/kafka-connector", defaultVersion, false)

if err != nil {
return err
Expand Down Expand Up @@ -122,7 +122,6 @@ func MakeInstallKafkaConnector() *cobra.Command {
ns,
outputPath,
"values.yaml",
"",
overrides)

if err != nil {
Expand Down
27 changes: 16 additions & 11 deletions cmd/apps/kubernetes_exec.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,14 @@ import (
execute "github.com/alexellis/go-execute/pkg/v1"
)

func fetchChart(path, chart string, helm3 bool) error {
func fetchChart(path, chart, version string, helm3 bool) error {
versionStr := ""

if len(version) > 0 {
// Issue in helm where adding a space to the command makes it think that it's another chart of " " we want to template,
// So we add the space before version here rather than on the command
versionStr = " --version " + version
}
subdir := ""
if helm3 {
subdir = "helm3"
Expand All @@ -25,7 +31,7 @@ func fetchChart(path, chart string, helm3 bool) error {
}

task := execute.ExecTask{
Command: fmt.Sprintf("%s fetch %s --untar --untardir %s", env.LocalBinary("helm", subdir), chart, path),
Command: fmt.Sprintf("%s fetch %s --untar=true --untardir %s%s", env.LocalBinary("helm", subdir), chart, path, versionStr),
Env: os.Environ(),
StreamStdio: true,
}
Expand All @@ -49,7 +55,7 @@ func getNodeArchitecture() string {
return arch
}

func helm3Upgrade(basePath, chart, namespace, values, version string, overrides map[string]string) error {
func helm3Upgrade(basePath, chart, namespace, values, version string, overrides map[string]string, wait bool) error {

chartName := chart
if index := strings.Index(chartName, "/"); index > -1 {
Expand All @@ -63,6 +69,10 @@ func helm3Upgrade(basePath, chart, namespace, values, version string, overrides
args = append(args, "--version", version)
}

if wait {
args = append(args, "--wait")
}

fmt.Println("VALUES", values)
if len(values) > 0 {
args = append(args, "--values")
Expand Down Expand Up @@ -104,7 +114,7 @@ func helm3Upgrade(basePath, chart, namespace, values, version string, overrides
return nil
}

func templateChart(basePath, chart, namespace, outputPath, values, version string, overrides map[string]string) error {
func templateChart(basePath, chart, namespace, outputPath, values string, overrides map[string]string) error {

rmErr := os.RemoveAll(outputPath)

Expand All @@ -129,14 +139,9 @@ func templateChart(basePath, chart, namespace, outputPath, values, version strin
valuesStr = "--values " + path.Join(chartRoot, values)
}

versionStr := ""
if len(version) > 0 {
versionStr = "--version " + version
}

task := execute.ExecTask{
Command: fmt.Sprintf("%s template %s --name %s --namespace %s --output-dir %s %s %s %s",
env.LocalBinary("helm", ""), chart, chart, namespace, outputPath, valuesStr, overridesStr, versionStr),
Command: fmt.Sprintf("%s template %s --name %s --namespace %s --output-dir %s %s %s",
env.LocalBinary("helm", ""), chart, chart, namespace, outputPath, valuesStr, overridesStr),
Env: os.Environ(),
Cwd: basePath,
StreamStdio: true,
Expand Down
Loading

0 comments on commit 24e7bf3

Please sign in to comment.