mirror of
https://github.com/fluxcd/flux2.git
synced 2026-02-21 15:11:47 +00:00
Merge pull request #270 from fluxcd/hr-ks-bucket-source
Add support for Bucket sources to Kustomizations/HRs
This commit is contained in:
commit
267440142e
11 changed files with 81 additions and 49 deletions
|
|
@ -20,7 +20,6 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
|
|
@ -55,6 +54,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 \
|
||||||
|
|
@ -113,14 +118,13 @@ func createHelmReleaseCmdRun(cmd *cobra.Command, args []string) error {
|
||||||
if hrSource == "" {
|
if hrSource == "" {
|
||||||
return fmt.Errorf("source is required")
|
return fmt.Errorf("source is required")
|
||||||
}
|
}
|
||||||
hrSourceElements := strings.Split(hrSource, "/")
|
sourceKind, sourceName := utils.parseObjectKindName(hrSource)
|
||||||
if len(hrSourceElements) != 2 {
|
if sourceKind == "" {
|
||||||
return fmt.Errorf("invalid source '%s', must be in format <kind>/<name>", hrSource)
|
return fmt.Errorf("invalid source '%s', must be in format <kind>/<name>", hrSource)
|
||||||
}
|
}
|
||||||
hrSourceKind, hrSourceName := hrSourceElements[0], hrSourceElements[1]
|
if !utils.containsItemString(supportedHelmChartSourceKinds, sourceKind) {
|
||||||
if !utils.containsItemString(supportedHelmChartSourceKinds, hrSourceKind) {
|
|
||||||
return fmt.Errorf("source kind %s is not supported, can be %v",
|
return fmt.Errorf("source kind %s is not supported, can be %v",
|
||||||
hrSourceKind, supportedHelmChartSourceKinds)
|
sourceKind, supportedHelmChartSourceKinds)
|
||||||
}
|
}
|
||||||
if hrChart == "" {
|
if hrChart == "" {
|
||||||
return fmt.Errorf("chart name or path is required")
|
return fmt.Errorf("chart name or path is required")
|
||||||
|
|
@ -153,8 +157,8 @@ func createHelmReleaseCmdRun(cmd *cobra.Command, args []string) error {
|
||||||
Chart: hrChart,
|
Chart: hrChart,
|
||||||
Version: hrChartVersion,
|
Version: hrChartVersion,
|
||||||
SourceRef: helmv2.CrossNamespaceObjectReference{
|
SourceRef: helmv2.CrossNamespaceObjectReference{
|
||||||
Kind: hrSourceKind,
|
Kind: sourceKind,
|
||||||
Name: hrSourceName,
|
Name: sourceName,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ var createKsCmd = &cobra.Command{
|
||||||
Use: "kustomization [name]",
|
Use: "kustomization [name]",
|
||||||
Aliases: []string{"ks"},
|
Aliases: []string{"ks"},
|
||||||
Short: "Create or update a Kustomization resource",
|
Short: "Create or update a Kustomization resource",
|
||||||
Long: "The kustomization source create command generates a Kustomize resource for a given GitRepository source.",
|
Long: "The kustomization source create command generates a Kustomize resource for a given source.",
|
||||||
Example: ` # Create a Kustomization resource from a source at a given path
|
Example: ` # Create a Kustomization resource from a source at a given path
|
||||||
gotk create kustomization contour \
|
gotk create kustomization contour \
|
||||||
--source=contour \
|
--source=contour \
|
||||||
|
|
@ -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 in the 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,16 @@ func createKsCmdRun(cmd *cobra.Command, args []string) error {
|
||||||
if ksSource == "" {
|
if ksSource == "" {
|
||||||
return fmt.Errorf("source is required")
|
return fmt.Errorf("source is required")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sourceKind, sourceName := utils.parseObjectKindName(ksSource)
|
||||||
|
if sourceKind == "" {
|
||||||
|
sourceKind = sourcev1.GitRepositoryKind
|
||||||
|
}
|
||||||
|
if !utils.containsItemString(supportedKustomizationSourceKinds, sourceKind) {
|
||||||
|
return fmt.Errorf("source kind %s is not supported, can be %v",
|
||||||
|
sourceKind, supportedKustomizationSourceKinds)
|
||||||
|
}
|
||||||
|
|
||||||
if ksPath == "" {
|
if ksPath == "" {
|
||||||
return fmt.Errorf("path is required")
|
return fmt.Errorf("path is required")
|
||||||
}
|
}
|
||||||
|
|
@ -141,8 +148,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: sourceKind,
|
||||||
Name: ksSource,
|
Name: sourceName,
|
||||||
},
|
},
|
||||||
Suspend: false,
|
Suspend: false,
|
||||||
Validation: ksValidation,
|
Validation: ksValidation,
|
||||||
|
|
|
||||||
|
|
@ -106,15 +106,16 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
defaultComponents = []string{"source-controller", "kustomize-controller", "helm-controller", "notification-controller"}
|
defaultComponents = []string{"source-controller", "kustomize-controller", "helm-controller", "notification-controller"}
|
||||||
defaultVersion = "latest"
|
defaultVersion = "latest"
|
||||||
defaultNamespace = "gitops-system"
|
defaultNamespace = "gitops-system"
|
||||||
defaultNotification = "notification-controller"
|
defaultNotification = "notification-controller"
|
||||||
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}
|
||||||
supportedSourceBucketProviders = []string{sourcev1.GenericBucketProvider, sourcev1.AmazonBucketProvider}
|
supportedHelmChartSourceKinds = []string{sourcev1.HelmRepositoryKind, sourcev1.GitRepositoryKind, sourcev1.BucketKind}
|
||||||
|
supportedSourceBucketProviders = []string{sourcev1.GenericBucketProvider, sourcev1.AmazonBucketProvider}
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -180,6 +180,17 @@ func (*Utils) containsItemString(s []string, e string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (*Utils) parseObjectKindName(input string) (string, string) {
|
||||||
|
kind := ""
|
||||||
|
name := input
|
||||||
|
parts := strings.Split(input, "/")
|
||||||
|
if len(parts) == 2 {
|
||||||
|
kind, name = parts[0], parts[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
return kind, name
|
||||||
|
}
|
||||||
|
|
||||||
func (*Utils) makeDependsOn(deps []string) []dependency.CrossNamespaceDependencyReference {
|
func (*Utils) makeDependsOn(deps []string) []dependency.CrossNamespaceDependencyReference {
|
||||||
refs := []dependency.CrossNamespaceDependencyReference{}
|
refs := []dependency.CrossNamespaceDependencyReference{}
|
||||||
for _, dep := range deps {
|
for _, dep := range deps {
|
||||||
|
|
|
||||||
|
|
@ -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 \
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ Create or update a Kustomization resource
|
||||||
|
|
||||||
### Synopsis
|
### Synopsis
|
||||||
|
|
||||||
The kustomization source create command generates a Kustomize resource for a given GitRepository source.
|
The kustomization source create command generates a Kustomize resource for a given source.
|
||||||
|
|
||||||
```
|
```
|
||||||
gotk create kustomization [name] [flags]
|
gotk create kustomization [name] [flags]
|
||||||
|
|
@ -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 in the 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…
Reference in a new issue