Add source namespace to create commands

Signed-off-by: Stefan Prodan <stefan.prodan@gmail.com>
pull/1173/head
Stefan Prodan 4 years ago
parent e5066c3712
commit b54fd2c6b3
No known key found for this signature in database
GPG Key ID: 3299AEB0E4085BAF

@ -121,7 +121,7 @@ jobs:
run: | run: |
/tmp/flux create hr podinfo-helm \ /tmp/flux create hr podinfo-helm \
--target-namespace=default \ --target-namespace=default \
--source=HelmRepository/podinfo \ --source=HelmRepository/podinfo.flux-system \
--chart=podinfo \ --chart=podinfo \
--chart-version=">4.0.0 <5.0.0" --chart-version=">4.0.0 <5.0.0"
- name: flux create helmrelease --source=GitRepository/podinfo - name: flux create helmrelease --source=GitRepository/podinfo

@ -91,6 +91,12 @@ var createHelmReleaseCmd = &cobra.Command{
--source=HelmRepository/podinfo \ --source=HelmRepository/podinfo \
--chart=podinfo --chart=podinfo
# Create a HelmRelease using a source from a different namespace
flux create hr podinfo \
--namespace=default \
--source=HelmRepository/podinfo.flux-system \
--chart=podinfo
# Create a HelmRelease definition on disk without applying it on the cluster # Create a HelmRelease definition on disk without applying it on the cluster
flux create hr podinfo \ flux create hr podinfo \
--source=HelmRepository/podinfo \ --source=HelmRepository/podinfo \
@ -164,8 +170,9 @@ func createHelmReleaseCmdRun(cmd *cobra.Command, args []string) error {
Chart: helmReleaseArgs.chart, Chart: helmReleaseArgs.chart,
Version: helmReleaseArgs.chartVersion, Version: helmReleaseArgs.chartVersion,
SourceRef: helmv2.CrossNamespaceObjectReference{ SourceRef: helmv2.CrossNamespaceObjectReference{
Kind: helmReleaseArgs.source.Kind, Kind: helmReleaseArgs.source.Kind,
Name: helmReleaseArgs.source.Name, Name: helmReleaseArgs.source.Name,
Namespace: helmReleaseArgs.source.Namespace,
}, },
}, },
}, },

@ -46,7 +46,7 @@ var createKsCmd = &cobra.Command{
Long: "The kustomization source create command generates a Kustomize resource for a given 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
flux create kustomization contour \ flux create kustomization contour \
--source=contour \ --source=GitRepository/contour \
--path="./examples/contour/" \ --path="./examples/contour/" \
--prune=true \ --prune=true \
--interval=10m \ --interval=10m \
@ -58,7 +58,16 @@ var createKsCmd = &cobra.Command{
# Create a Kustomization resource that depends on the previous one # Create a Kustomization resource that depends on the previous one
flux create kustomization webapp \ flux create kustomization webapp \
--depends-on=contour \ --depends-on=contour \
--source=webapp \ --source=GitRepository/webapp \
--path="./deploy/overlays/dev" \
--prune=true \
--interval=5m \
--validation=client
# Create a Kustomization using a source from a different namespace
flux create kustomization podinfo \
--namespace=default \
--source=GitRepository/podinfo.flux-system \
--path="./deploy/overlays/dev" \ --path="./deploy/overlays/dev" \
--prune=true \ --prune=true \
--interval=5m \ --interval=5m \
@ -145,8 +154,9 @@ func createKsCmdRun(cmd *cobra.Command, args []string) error {
Path: filepath.ToSlash(kustomizationArgs.path.String()), Path: filepath.ToSlash(kustomizationArgs.path.String()),
Prune: kustomizationArgs.prune, Prune: kustomizationArgs.prune,
SourceRef: kustomizev1.CrossNamespaceSourceReference{ SourceRef: kustomizev1.CrossNamespaceSourceReference{
Kind: kustomizationArgs.source.Kind, Kind: kustomizationArgs.source.Kind,
Name: kustomizationArgs.source.Name, Name: kustomizationArgs.source.Name,
Namespace: kustomizationArgs.source.Namespace,
}, },
Suspend: false, Suspend: false,
Validation: kustomizationArgs.validation, Validation: kustomizationArgs.validation,

@ -62,6 +62,12 @@ flux create helmrelease [name] [flags]
--source=HelmRepository/podinfo \ --source=HelmRepository/podinfo \
--chart=podinfo --chart=podinfo
# Create a HelmRelease using a source from a different namespace
flux create hr podinfo \
--namespace=default \
--source=HelmRepository/podinfo.flux-system \
--chart=podinfo
# Create a HelmRelease definition on disk without applying it on the cluster # Create a HelmRelease definition on disk without applying it on the cluster
flux create hr podinfo \ flux create hr podinfo \
--source=HelmRepository/podinfo \ --source=HelmRepository/podinfo \
@ -79,7 +85,7 @@ flux create helmrelease [name] [flags]
-h, --help help for helmrelease -h, --help help for helmrelease
--release-name string name used for the Helm release, defaults to a composition of '[<target-namespace>-]<HelmRelease-name>' --release-name string name used for the Helm release, defaults to a composition of '[<target-namespace>-]<HelmRelease-name>'
--service-account string the name of the service account to impersonate when reconciling this HelmRelease --service-account string the name of the service account to impersonate when reconciling this HelmRelease
--source helmChartSource source that contains the chart in the format '<kind>/<name>', where kind must be one of: (HelmRepository, GitRepository, Bucket) --source helmChartSource source that contains the chart in the format '<kind>/<name>.<namespace>', where kind must be one of: (HelmRepository, GitRepository, Bucket)
--target-namespace string namespace to install this release, defaults to the HelmRelease namespace --target-namespace string namespace to install this release, defaults to the HelmRelease namespace
--values stringArray local path to values.yaml files --values stringArray local path to values.yaml files
--values-from helmReleaseValuesFrom Kubernetes object reference that contains the values.yaml data key in the format '<kind>/<name>', where kind must be one of: (Secret, ConfigMap) --values-from helmReleaseValuesFrom Kubernetes object reference that contains the values.yaml data key in the format '<kind>/<name>', where kind must be one of: (Secret, ConfigMap)

@ -18,7 +18,7 @@ flux create kustomization [name] [flags]
``` ```
# Create a Kustomization resource from a source at a given path # Create a Kustomization resource from a source at a given path
flux create kustomization contour \ flux create kustomization contour \
--source=contour \ --source=GitRepository/contour \
--path="./examples/contour/" \ --path="./examples/contour/" \
--prune=true \ --prune=true \
--interval=10m \ --interval=10m \
@ -30,7 +30,16 @@ flux create kustomization [name] [flags]
# Create a Kustomization resource that depends on the previous one # Create a Kustomization resource that depends on the previous one
flux create kustomization webapp \ flux create kustomization webapp \
--depends-on=contour \ --depends-on=contour \
--source=webapp \ --source=GitRepository/webapp \
--path="./deploy/overlays/dev" \
--prune=true \
--interval=5m \
--validation=client
# Create a Kustomization using a source from a different namespace
flux create kustomization podinfo \
--namespace=default \
--source=GitRepository/podinfo.flux-system \
--path="./deploy/overlays/dev" \ --path="./deploy/overlays/dev" \
--prune=true \ --prune=true \
--interval=5m \ --interval=5m \
@ -55,7 +64,7 @@ flux create kustomization [name] [flags]
--path safeRelativePath path to the directory containing a kustomization.yaml file (default ./) --path safeRelativePath path to the directory containing a kustomization.yaml file (default ./)
--prune enable garbage collection --prune enable garbage collection
--service-account string the name of the service account to impersonate when reconciling this Kustomization --service-account string the name of the service account to impersonate when reconciling this Kustomization
--source kustomizationSource source that contains the Kubernetes manifests in the format '[<kind>/]<name>', where kind must be one of: (GitRepository, Bucket), if kind is not specified it defaults to GitRepository --source kustomizationSource source that contains the Kubernetes manifests in the format '[<kind>/]<name>.<namespace>', where kind must be one of: (GitRepository, Bucket), if kind is not specified it defaults to GitRepository
--target-namespace string overrides the namespace of all Kustomization objects reconciled by this Kustomization --target-namespace string overrides the namespace of all Kustomization objects reconciled by this Kustomization
--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'
``` ```

@ -28,8 +28,9 @@ import (
var supportedHelmChartSourceKinds = []string{sourcev1.HelmRepositoryKind, sourcev1.GitRepositoryKind, sourcev1.BucketKind} var supportedHelmChartSourceKinds = []string{sourcev1.HelmRepositoryKind, sourcev1.GitRepositoryKind, sourcev1.BucketKind}
type HelmChartSource struct { type HelmChartSource struct {
Kind string Kind string
Name string Name string
Namespace string
} }
func (s *HelmChartSource) String() string { func (s *HelmChartSource) String() string {
@ -45,7 +46,7 @@ func (s *HelmChartSource) Set(str string) error {
s.Description()) s.Description())
} }
sourceKind, sourceName := utils.ParseObjectKindName(str) sourceKind, sourceName, sourceNamespace := utils.ParseObjectKindNameNamespace(str)
if sourceKind == "" || sourceName == "" { if sourceKind == "" || sourceName == "" {
return fmt.Errorf("invalid helm chart source '%s', must be in format <kind>/<name>", str) return fmt.Errorf("invalid helm chart source '%s', must be in format <kind>/<name>", str)
} }
@ -55,8 +56,9 @@ func (s *HelmChartSource) Set(str string) error {
sourceKind, strings.Join(supportedHelmChartSourceKinds, ", ")) sourceKind, strings.Join(supportedHelmChartSourceKinds, ", "))
} }
s.Name = sourceName
s.Kind = cleanSourceKind s.Kind = cleanSourceKind
s.Name = sourceName
s.Namespace = sourceNamespace
return nil return nil
} }
@ -67,7 +69,7 @@ func (s *HelmChartSource) Type() string {
func (s *HelmChartSource) Description() string { func (s *HelmChartSource) Description() string {
return fmt.Sprintf( return fmt.Sprintf(
"source that contains the chart in the format '<kind>/<name>', "+ "source that contains the chart in the format '<kind>/<name>.<namespace>', "+
"where kind must be one of: (%s)", "where kind must be one of: (%s)",
strings.Join(supportedHelmChartSourceKinds, ", "), strings.Join(supportedHelmChartSourceKinds, ", "),
) )

@ -28,8 +28,9 @@ import (
var supportedKustomizationSourceKinds = []string{sourcev1.GitRepositoryKind, sourcev1.BucketKind} var supportedKustomizationSourceKinds = []string{sourcev1.GitRepositoryKind, sourcev1.BucketKind}
type KustomizationSource struct { type KustomizationSource struct {
Kind string Kind string
Name string Name string
Namespace string
} }
func (s *KustomizationSource) String() string { func (s *KustomizationSource) String() string {
@ -45,7 +46,7 @@ func (s *KustomizationSource) Set(str string) error {
s.Description()) s.Description())
} }
sourceKind, sourceName := utils.ParseObjectKindName(str) sourceKind, sourceName, sourceNamespace := utils.ParseObjectKindNameNamespace(str)
if sourceName == "" { if sourceName == "" {
return fmt.Errorf("no name given for source of kind '%s'", sourceKind) return fmt.Errorf("no name given for source of kind '%s'", sourceKind)
} }
@ -61,8 +62,9 @@ func (s *KustomizationSource) Set(str string) error {
sourceKind, strings.Join(supportedKustomizationSourceKinds, ", ")) sourceKind, strings.Join(supportedKustomizationSourceKinds, ", "))
} }
s.Name = sourceName
s.Kind = cleanSourceKind s.Kind = cleanSourceKind
s.Name = sourceName
s.Namespace = sourceNamespace
return nil return nil
} }
@ -73,7 +75,7 @@ func (s *KustomizationSource) Type() string {
func (s *KustomizationSource) Description() string { func (s *KustomizationSource) Description() string {
return fmt.Sprintf( return fmt.Sprintf(
"source that contains the Kubernetes manifests in the format '[<kind>/]<name>', "+ "source that contains the Kubernetes manifests in the format '[<kind>/]<name>.<namespace>', "+
"where kind must be one of: (%s), if kind is not specified it defaults to GitRepository", "where kind must be one of: (%s), if kind is not specified it defaults to GitRepository",
strings.Join(supportedKustomizationSourceKinds, ", "), strings.Join(supportedKustomizationSourceKinds, ", "),
) )

@ -216,9 +216,10 @@ func ContainsEqualFoldItemString(s []string, e string) (string, bool) {
return "", false return "", false
} }
func ParseObjectKindName(input string) (string, string) { // ParseObjectKindName extracts the kind and name of a resource
kind := "" // based on the '<kind>/<name>' format
name := input func ParseObjectKindName(input string) (kind, name string) {
name = input
parts := strings.Split(input, "/") parts := strings.Split(input, "/")
if len(parts) == 2 { if len(parts) == 2 {
kind, name = parts[0], parts[1] kind, name = parts[0], parts[1]
@ -226,6 +227,23 @@ func ParseObjectKindName(input string) (string, string) {
return kind, name return kind, name
} }
// ParseObjectKindNameNamespace extracts the kind, name and namespace of a resource
// based on the '<kind>/<name>.<namespace>' format
func ParseObjectKindNameNamespace(input string) (kind, name, namespace string) {
name = input
parts := strings.Split(input, "/")
if len(parts) == 2 {
kind, name = parts[0], parts[1]
}
if nn := strings.Split(name, "."); len(nn) > 1 {
name = strings.Join(nn[:len(nn)-1], ".")
namespace = nn[len(nn)-1]
}
return kind, name, namespace
}
func MakeDependsOn(deps []string) []dependency.CrossNamespaceDependencyReference { func MakeDependsOn(deps []string) []dependency.CrossNamespaceDependencyReference {
refs := []dependency.CrossNamespaceDependencyReference{} refs := []dependency.CrossNamespaceDependencyReference{}
for _, dep := range deps { for _, dep := range deps {

Loading…
Cancel
Save