Add support for Bucket sources to Kustomizations/HRs

pull/270/head
stefanprodan 5 years ago
parent 2806feb468
commit bd2994f9ab

@ -55,6 +55,12 @@ var createHelmReleaseCmd = &cobra.Command{
--source=GitRepository/podinfo \ --source=GitRepository/podinfo \
--chart=./charts/podinfo --chart=./charts/podinfo
# Create a HelmRelease with a chart from a Bucket source
gotk create hr podinfo \
--interval=10m \
--source=Bucket/podinfo \
--chart=./charts/podinfo
# Create a HelmRelease with values from a local YAML file # Create a HelmRelease with values from a local YAML file
gotk create hr podinfo \ gotk create hr podinfo \
--source=HelmRepository/podinfo \ --source=HelmRepository/podinfo \

@ -60,15 +60,11 @@ var createKsCmd = &cobra.Command{
--interval=5m \ --interval=5m \
--validation=client --validation=client
# Create a Kustomization resource that runs under a service account # Create a Kustomization resource that references a Bucket
gotk create kustomization webapp \ gotk create kustomization secrets \
--source=webapp \ --source=Bucket/secrets \
--path="./deploy/overlays/staging" \
--prune=true \ --prune=true \
--interval=5m \ --interval=5m
--validation=client \
--sa-name=reconclier \
--sa-namespace=staging
`, `,
RunE: createKsCmdRun, RunE: createKsCmdRun,
} }
@ -88,7 +84,8 @@ var (
) )
func init() { func init() {
createKsCmd.Flags().StringVar(&ksSource, "source", "", "GitRepository name") createKsCmd.Flags().StringVar(&ksSource, "source", "",
"source that contains the Kubernetes manifests, format '<kind>/<name>' where kind can be GitRepository or Bucket, if kind is not specified it defaults to GitRepository")
createKsCmd.Flags().StringVar(&ksPath, "path", "./", "path to the directory containing the Kustomization file") createKsCmd.Flags().StringVar(&ksPath, "path", "./", "path to the directory containing the Kustomization file")
createKsCmd.Flags().BoolVar(&ksPrune, "prune", false, "enable garbage collection") createKsCmd.Flags().BoolVar(&ksPrune, "prune", false, "enable garbage collection")
createKsCmd.Flags().StringArrayVar(&ksHealthCheck, "health-check", nil, "workload to be included in the health assessment, in the format '<kind>/<name>.<namespace>'") createKsCmd.Flags().StringArrayVar(&ksHealthCheck, "health-check", nil, "workload to be included in the health assessment, in the format '<kind>/<name>.<namespace>'")
@ -111,6 +108,18 @@ func createKsCmdRun(cmd *cobra.Command, args []string) error {
if ksSource == "" { if ksSource == "" {
return fmt.Errorf("source is required") return fmt.Errorf("source is required")
} }
ksSourceKind := sourcev1.GitRepositoryKind
ksSourceName := ksSource
ksSourceElements := strings.Split(ksSource, "/")
if len(ksSourceElements) == 2 {
ksSourceKind, ksSourceName = ksSourceElements[0], ksSourceElements[1]
if !utils.containsItemString(supportedKustomizationSourceKinds, ksSourceKind) {
return fmt.Errorf("source kind %s is not supported, can be %v",
ksSourceKind, supportedKustomizationSourceKinds)
}
}
if ksPath == "" { if ksPath == "" {
return fmt.Errorf("path is required") return fmt.Errorf("path is required")
} }
@ -141,8 +150,8 @@ func createKsCmdRun(cmd *cobra.Command, args []string) error {
Path: ksPath, Path: ksPath,
Prune: ksPrune, Prune: ksPrune,
SourceRef: kustomizev1.CrossNamespaceSourceReference{ SourceRef: kustomizev1.CrossNamespaceSourceReference{
Kind: sourcev1.GitRepositoryKind, Kind: ksSourceKind,
Name: ksSource, Name: ksSourceName,
}, },
Suspend: false, Suspend: false,
Validation: ksValidation, Validation: ksValidation,

@ -113,7 +113,8 @@ var (
supportedLogLevels = []string{"debug", "info", "error"} supportedLogLevels = []string{"debug", "info", "error"}
supportedArch = []string{"amd64", "arm", "arm64"} supportedArch = []string{"amd64", "arm", "arm64"}
supportedDecryptionProviders = []string{"sops"} supportedDecryptionProviders = []string{"sops"}
supportedHelmChartSourceKinds = []string{sourcev1.HelmRepositoryKind, sourcev1.GitRepositoryKind} supportedKustomizationSourceKinds = []string{sourcev1.GitRepositoryKind, sourcev1.BucketKind}
supportedHelmChartSourceKinds = []string{sourcev1.HelmRepositoryKind, sourcev1.GitRepositoryKind, sourcev1.BucketKind}
supportedSourceBucketProviders = []string{sourcev1.GenericBucketProvider, sourcev1.AmazonBucketProvider} supportedSourceBucketProviders = []string{sourcev1.GenericBucketProvider, sourcev1.AmazonBucketProvider}
) )

@ -85,9 +85,11 @@ func reconcileHrCmdRun(cmd *cobra.Command, args []string) error {
if syncHrWithSource { if syncHrWithSource {
switch helmRelease.Spec.Chart.Spec.SourceRef.Kind { switch helmRelease.Spec.Chart.Spec.SourceRef.Kind {
case sourcev1.HelmRepositoryKind: case sourcev1.HelmRepositoryKind:
err = syncSourceHelmCmdRun(nil, []string{helmRelease.Spec.Chart.Spec.SourceRef.Name}) err = reconcileSourceHelmCmdRun(nil, []string{helmRelease.Spec.Chart.Spec.SourceRef.Name})
case sourcev1.GitRepositoryKind: case sourcev1.GitRepositoryKind:
err = syncSourceGitCmdRun(nil, []string{helmRelease.Spec.Chart.Spec.SourceRef.Name}) err = reconcileSourceGitCmdRun(nil, []string{helmRelease.Spec.Chart.Spec.SourceRef.Name})
case sourcev1.BucketKind:
err = reconcileSourceBucketCmdRun(nil, []string{helmRelease.Spec.Chart.Spec.SourceRef.Name})
} }
if err != nil { if err != nil {
return err return err

@ -27,6 +27,7 @@ import (
kustomizev1 "github.com/fluxcd/kustomize-controller/api/v1alpha1" kustomizev1 "github.com/fluxcd/kustomize-controller/api/v1alpha1"
consts "github.com/fluxcd/pkg/runtime" consts "github.com/fluxcd/pkg/runtime"
sourcev1 "github.com/fluxcd/source-controller/api/v1alpha1"
) )
var reconcileKsCmd = &cobra.Command{ var reconcileKsCmd = &cobra.Command{
@ -80,7 +81,12 @@ func reconcileKsCmdRun(cmd *cobra.Command, args []string) error {
} }
if syncKsWithSource { if syncKsWithSource {
err := syncSourceGitCmdRun(nil, []string{kustomization.Spec.SourceRef.Name}) switch kustomization.Spec.SourceRef.Kind {
case sourcev1.GitRepositoryKind:
err = reconcileSourceGitCmdRun(nil, []string{kustomization.Spec.SourceRef.Name})
case sourcev1.BucketKind:
err = reconcileSourceBucketCmdRun(nil, []string{kustomization.Spec.SourceRef.Name})
}
if err != nil { if err != nil {
return err return err
} }

@ -38,14 +38,14 @@ var reconcileSourceBucketCmd = &cobra.Command{
Example: ` # Trigger a reconciliation for an existing source Example: ` # Trigger a reconciliation for an existing source
gotk reconcile source bucket podinfo gotk reconcile source bucket podinfo
`, `,
RunE: syncSourceBucketCmdRun, RunE: reconcileSourceBucketCmdRun,
} }
func init() { func init() {
reconcileSourceCmd.AddCommand(reconcileSourceBucketCmd) reconcileSourceCmd.AddCommand(reconcileSourceBucketCmd)
} }
func syncSourceBucketCmdRun(cmd *cobra.Command, args []string) error { func reconcileSourceBucketCmdRun(cmd *cobra.Command, args []string) error {
if len(args) < 1 { if len(args) < 1 {
return fmt.Errorf("source name is required") return fmt.Errorf("source name is required")
} }

@ -19,7 +19,6 @@ package main
import ( import (
"context" "context"
"fmt" "fmt"
"time" "time"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@ -37,14 +36,14 @@ var reconcileSourceGitCmd = &cobra.Command{
Example: ` # Trigger a git pull for an existing source Example: ` # Trigger a git pull for an existing source
gotk reconcile source git podinfo gotk reconcile source git podinfo
`, `,
RunE: syncSourceGitCmdRun, RunE: reconcileSourceGitCmdRun,
} }
func init() { func init() {
reconcileSourceCmd.AddCommand(reconcileSourceGitCmd) reconcileSourceCmd.AddCommand(reconcileSourceGitCmd)
} }
func syncSourceGitCmdRun(cmd *cobra.Command, args []string) error { func reconcileSourceGitCmdRun(cmd *cobra.Command, args []string) error {
if len(args) < 1 { if len(args) < 1 {
return fmt.Errorf("source name is required") return fmt.Errorf("source name is required")
} }

@ -38,14 +38,14 @@ var reconcileSourceHelmCmd = &cobra.Command{
Example: ` # Trigger a reconciliation for an existing source Example: ` # Trigger a reconciliation for an existing source
gotk reconcile source helm podinfo gotk reconcile source helm podinfo
`, `,
RunE: syncSourceHelmCmdRun, RunE: reconcileSourceHelmCmdRun,
} }
func init() { func init() {
reconcileSourceCmd.AddCommand(reconcileSourceHelmCmd) reconcileSourceCmd.AddCommand(reconcileSourceHelmCmd)
} }
func syncSourceHelmCmdRun(cmd *cobra.Command, args []string) error { func reconcileSourceHelmCmdRun(cmd *cobra.Command, args []string) error {
if len(args) < 1 { if len(args) < 1 {
return fmt.Errorf("source name is required") return fmt.Errorf("source name is required")
} }

@ -26,6 +26,12 @@ gotk create helmrelease [name] [flags]
--source=GitRepository/podinfo \ --source=GitRepository/podinfo \
--chart=./charts/podinfo --chart=./charts/podinfo
# Create a HelmRelease with a chart from a Bucket source
gotk create hr podinfo \
--interval=10m \
--source=Bucket/podinfo \
--chart=./charts/podinfo
# Create a HelmRelease with values from a local YAML file # Create a HelmRelease with values from a local YAML file
gotk create hr podinfo \ gotk create hr podinfo \
--source=HelmRepository/podinfo \ --source=HelmRepository/podinfo \

@ -33,15 +33,11 @@ gotk create kustomization [name] [flags]
--interval=5m \ --interval=5m \
--validation=client --validation=client
# Create a Kustomization resource that runs under a service account # Create a Kustomization resource that references a Bucket
gotk create kustomization webapp \ gotk create kustomization secrets \
--source=webapp \ --source=Bucket/secrets \
--path="./deploy/overlays/staging" \
--prune=true \ --prune=true \
--interval=5m \ --interval=5m
--validation=client \
--sa-name=reconclier \
--sa-namespace=staging
``` ```
@ -58,7 +54,7 @@ gotk create kustomization [name] [flags]
--prune enable garbage collection --prune enable garbage collection
--sa-name string service account name --sa-name string service account name
--sa-namespace string service account namespace --sa-namespace string service account namespace
--source string GitRepository name --source string source that contains the Kubernetes manifests, format '<kind>/<name>' where kind can be GitRepository or Bucket, if kind is not specified it defaults to GitRepository
--validation string validate the manifests before applying them on the cluster, can be 'client' or 'server' --validation string validate the manifests before applying them on the cluster, can be 'client' or 'server'
``` ```

Loading…
Cancel
Save