diff --git a/cmd/flux/get_alert.go b/cmd/flux/get_alert.go index f3c9656f..63c6c8ff 100644 --- a/cmd/flux/get_alert.go +++ b/cmd/flux/get_alert.go @@ -70,7 +70,7 @@ func getAlertCmdRun(cmd *cobra.Command, args []string) error { return nil } - header := []string{"Name", "Suspended", "Ready", "Message"} + header := []string{"Name", "Ready", "Message", "Suspended"} if allNamespaces { header = append([]string{"Namespace"}, header...) } @@ -80,18 +80,16 @@ func getAlertCmdRun(cmd *cobra.Command, args []string) error { if c := apimeta.FindStatusCondition(alert.Status.Conditions, meta.ReadyCondition); c != nil { row = []string{ alert.GetName(), - //alert.Status.LastAppliedRevision, - strings.Title(strconv.FormatBool(alert.Spec.Suspend)), string(c.Status), c.Message, + strings.Title(strconv.FormatBool(alert.Spec.Suspend)), } } else { row = []string{ alert.GetName(), - //alert.Status.LastAppliedRevision, - strings.Title(strconv.FormatBool(alert.Spec.Suspend)), string(metav1.ConditionFalse), "waiting to be reconciled", + strings.Title(strconv.FormatBool(alert.Spec.Suspend)), } } if allNamespaces { diff --git a/cmd/flux/get_helmrelease.go b/cmd/flux/get_helmrelease.go index c7f7a980..ecf84db3 100644 --- a/cmd/flux/get_helmrelease.go +++ b/cmd/flux/get_helmrelease.go @@ -72,7 +72,7 @@ func getHelmReleaseCmdRun(cmd *cobra.Command, args []string) error { return nil } - header := []string{"Name", "Revision", "Suspended", "Ready", "Message"} + header := []string{"Name", "Ready", "Message", "Revision", "Suspended"} if allNamespaces { header = append([]string{"Namespace"}, header...) } @@ -82,18 +82,18 @@ func getHelmReleaseCmdRun(cmd *cobra.Command, args []string) error { if c := apimeta.FindStatusCondition(helmRelease.Status.Conditions, meta.ReadyCondition); c != nil { row = []string{ helmRelease.GetName(), - helmRelease.Status.LastAppliedRevision, - strings.Title(strconv.FormatBool(helmRelease.Spec.Suspend)), string(c.Status), c.Message, + helmRelease.Status.LastAppliedRevision, + strings.Title(strconv.FormatBool(helmRelease.Spec.Suspend)), } } else { row = []string{ helmRelease.GetName(), - helmRelease.Status.LastAppliedRevision, - strings.Title(strconv.FormatBool(helmRelease.Spec.Suspend)), string(metav1.ConditionFalse), "waiting to be reconciled", + helmRelease.Status.LastAppliedRevision, + strings.Title(strconv.FormatBool(helmRelease.Spec.Suspend)), } } if allNamespaces { diff --git a/cmd/flux/get_kustomization.go b/cmd/flux/get_kustomization.go index 2768e27f..4e4de5de 100644 --- a/cmd/flux/get_kustomization.go +++ b/cmd/flux/get_kustomization.go @@ -71,7 +71,7 @@ func getKsCmdRun(cmd *cobra.Command, args []string) error { return nil } - header := []string{"Name", "Revision", "Suspended", "Ready", "Message"} + header := []string{"Name", "Ready", "Message", "Revision", "Suspended"} if allNamespaces { header = append([]string{"Namespace"}, header...) } @@ -81,18 +81,18 @@ func getKsCmdRun(cmd *cobra.Command, args []string) error { if c := apimeta.FindStatusCondition(kustomization.Status.Conditions, meta.ReadyCondition); c != nil { row = []string{ kustomization.GetName(), - kustomization.Status.LastAppliedRevision, - strings.Title(strconv.FormatBool(kustomization.Spec.Suspend)), string(c.Status), c.Message, + kustomization.Status.LastAppliedRevision, + strings.Title(strconv.FormatBool(kustomization.Spec.Suspend)), } } else { row = []string{ kustomization.GetName(), - kustomization.Status.LastAppliedRevision, - strings.Title(strconv.FormatBool(kustomization.Spec.Suspend)), string(metav1.ConditionFalse), "waiting to be reconciled", + kustomization.Status.LastAppliedRevision, + strings.Title(strconv.FormatBool(kustomization.Spec.Suspend)), } } if allNamespaces { diff --git a/cmd/flux/get_receiver.go b/cmd/flux/get_receiver.go index 5b2ab086..b760b7d6 100644 --- a/cmd/flux/get_receiver.go +++ b/cmd/flux/get_receiver.go @@ -70,7 +70,7 @@ func getReceiverCmdRun(cmd *cobra.Command, args []string) error { return nil } - header := []string{"Name", "Suspended", "Ready", "Message"} + header := []string{"Name", "Ready", "Message", "Suspended"} if allNamespaces { header = append([]string{"Namespace"}, header...) } @@ -80,16 +80,16 @@ func getReceiverCmdRun(cmd *cobra.Command, args []string) error { if c := apimeta.FindStatusCondition(receiver.Status.Conditions, meta.ReadyCondition); c != nil { row = []string{ receiver.GetName(), - strings.Title(strconv.FormatBool(receiver.Spec.Suspend)), string(c.Status), c.Message, + strings.Title(strconv.FormatBool(receiver.Spec.Suspend)), } } else { row = []string{ receiver.GetName(), - strings.Title(strconv.FormatBool(receiver.Spec.Suspend)), string(metav1.ConditionFalse), "waiting to be reconciled", + strings.Title(strconv.FormatBool(receiver.Spec.Suspend)), } } rows = append(rows, row) diff --git a/cmd/flux/get_source_bucket.go b/cmd/flux/get_source_bucket.go index 7b347c28..0d9b698e 100644 --- a/cmd/flux/get_source_bucket.go +++ b/cmd/flux/get_source_bucket.go @@ -19,6 +19,8 @@ package main import ( "context" "os" + "strconv" + "strings" "github.com/fluxcd/flux2/internal/utils" "github.com/fluxcd/pkg/apis/meta" @@ -36,6 +38,9 @@ var getSourceBucketCmd = &cobra.Command{ Long: "The get sources bucket command prints the status of the Bucket sources.", Example: ` # List all Buckets and their status flux get sources bucket + + # List buckets from all namespaces + flux get sources helm --all-namespaces `, RunE: getSourceBucketCmdRun, } @@ -68,7 +73,7 @@ func getSourceBucketCmdRun(cmd *cobra.Command, args []string) error { return nil } - header := []string{"Name", "Revision", "Ready", "Message"} + header := []string{"Name", "Ready", "Message", "Revision", "Suspended"} if allNamespaces { header = append([]string{"Namespace"}, header...) } @@ -82,16 +87,18 @@ func getSourceBucketCmdRun(cmd *cobra.Command, args []string) error { if c := apimeta.FindStatusCondition(source.Status.Conditions, meta.ReadyCondition); c != nil { row = []string{ source.GetName(), - revision, string(c.Status), c.Message, + revision, + strings.Title(strconv.FormatBool(source.Spec.Suspend)), } } else { row = []string{ source.GetName(), - revision, string(metav1.ConditionFalse), "waiting to be reconciled", + revision, + strings.Title(strconv.FormatBool(source.Spec.Suspend)), } } if allNamespaces { diff --git a/cmd/flux/get_source_chart.go b/cmd/flux/get_source_chart.go new file mode 100644 index 00000000..db012061 --- /dev/null +++ b/cmd/flux/get_source_chart.go @@ -0,0 +1,111 @@ +/* +Copyright 2020 The Flux authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "context" + "os" + "strconv" + "strings" + + "github.com/fluxcd/flux2/internal/utils" + "github.com/fluxcd/pkg/apis/meta" + + sourcev1 "github.com/fluxcd/source-controller/api/v1beta1" + "github.com/spf13/cobra" + apimeta "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/controller-runtime/pkg/client" +) + +var getSourceHelmChartCmd = &cobra.Command{ + Use: "chart", + Short: "Get HelmChart statuses", + Long: "The get sources chart command prints the status of the HelmCharts.", + Example: ` # List all Helm charts and their status + flux get sources chart + + # List Helm charts from all namespaces + flux get sources chart --all-namespaces +`, + RunE: getSourceHelmChartCmdRun, +} + +func init() { + getSourceCmd.AddCommand(getSourceHelmChartCmd) +} + +func getSourceHelmChartCmdRun(cmd *cobra.Command, args []string) error { + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + kubeClient, err := utils.KubeClient(kubeconfig, kubecontext) + if err != nil { + return err + } + + var listOpts []client.ListOption + if !allNamespaces { + listOpts = append(listOpts, client.InNamespace(namespace)) + } + var list sourcev1.HelmChartList + err = kubeClient.List(ctx, &list, listOpts...) + if err != nil { + return err + } + + if len(list.Items) == 0 { + logger.Failuref("no chart sources found in %s namespace", namespace) + return nil + } + + header := []string{"Name", "Ready", "Message", "Revision", "Suspended"} + if allNamespaces { + header = append([]string{"Namespace"}, header...) + } + var rows [][]string + for _, source := range list.Items { + var row []string + var revision string + if source.GetArtifact() != nil { + revision = source.GetArtifact().Revision + } + if c := apimeta.FindStatusCondition(source.Status.Conditions, meta.ReadyCondition); c != nil { + row = []string{ + source.GetName(), + string(c.Status), + c.Message, + revision, + strings.Title(strconv.FormatBool(source.Spec.Suspend)), + } + } else { + row = []string{ + source.GetName(), + string(metav1.ConditionFalse), + "waiting to be reconciled", + revision, + strings.Title(strconv.FormatBool(source.Spec.Suspend)), + } + } + if allNamespaces { + row = append([]string{source.Namespace}, row...) + } + rows = append(rows, row) + } + utils.PrintTable(os.Stdout, header, rows) + return nil +} diff --git a/cmd/flux/get_source_git.go b/cmd/flux/get_source_git.go index 10cdfc52..8f8fb811 100644 --- a/cmd/flux/get_source_git.go +++ b/cmd/flux/get_source_git.go @@ -19,6 +19,8 @@ package main import ( "context" "os" + "strconv" + "strings" "github.com/fluxcd/flux2/internal/utils" "github.com/fluxcd/pkg/apis/meta" @@ -36,6 +38,9 @@ var getSourceGitCmd = &cobra.Command{ Long: "The get sources git command prints the status of the GitRepository sources.", Example: ` # List all Git repositories and their status flux get sources git + + # List Git repositories from all namespaces + flux get sources git --all-namespaces `, RunE: getSourceGitCmdRun, } @@ -68,7 +73,7 @@ func getSourceGitCmdRun(cmd *cobra.Command, args []string) error { return nil } - header := []string{"Name", "Revision", "Ready", "Message"} + header := []string{"Name", "Ready", "Message", "Revision", "Suspended"} if allNamespaces { header = append([]string{"Namespace"}, header...) } @@ -82,16 +87,18 @@ func getSourceGitCmdRun(cmd *cobra.Command, args []string) error { if c := apimeta.FindStatusCondition(source.Status.Conditions, meta.ReadyCondition); c != nil { row = []string{ source.GetName(), - revision, string(c.Status), c.Message, + revision, + strings.Title(strconv.FormatBool(source.Spec.Suspend)), } } else { row = []string{ source.GetName(), - revision, string(metav1.ConditionFalse), "waiting to be reconciled", + revision, + strings.Title(strconv.FormatBool(source.Spec.Suspend)), } } if allNamespaces { diff --git a/cmd/flux/get_source_helm.go b/cmd/flux/get_source_helm.go index a7528006..5f36cf5a 100644 --- a/cmd/flux/get_source_helm.go +++ b/cmd/flux/get_source_helm.go @@ -19,6 +19,8 @@ package main import ( "context" "os" + "strconv" + "strings" "github.com/fluxcd/flux2/internal/utils" "github.com/fluxcd/pkg/apis/meta" @@ -36,6 +38,9 @@ var getSourceHelmCmd = &cobra.Command{ Long: "The get sources helm command prints the status of the HelmRepository sources.", Example: ` # List all Helm repositories and their status flux get sources helm + + # List Helm repositories from all namespaces + flux get sources helm --all-namespaces `, RunE: getSourceHelmCmdRun, } @@ -68,7 +73,7 @@ func getSourceHelmCmdRun(cmd *cobra.Command, args []string) error { return nil } - header := []string{"Name", "Revision", "Ready", "Message"} + header := []string{"Name", "Ready", "Message", "Revision", "Suspended"} if allNamespaces { header = append([]string{"Namespace"}, header...) } @@ -82,16 +87,18 @@ func getSourceHelmCmdRun(cmd *cobra.Command, args []string) error { if c := apimeta.FindStatusCondition(source.Status.Conditions, meta.ReadyCondition); c != nil { row = []string{ source.GetName(), - revision, string(c.Status), c.Message, + revision, + strings.Title(strconv.FormatBool(source.Spec.Suspend)), } } else { row = []string{ source.GetName(), - revision, string(metav1.ConditionFalse), "waiting to be reconciled", + revision, + strings.Title(strconv.FormatBool(source.Spec.Suspend)), } } if allNamespaces { diff --git a/docs/cmd/flux_get_sources.md b/docs/cmd/flux_get_sources.md index 34f61be4..780cde02 100644 --- a/docs/cmd/flux_get_sources.md +++ b/docs/cmd/flux_get_sources.md @@ -27,6 +27,7 @@ The get source sub-commands print the statuses of the sources. * [flux get](flux_get.md) - Get sources and resources * [flux get sources bucket](flux_get_sources_bucket.md) - Get Bucket source statuses +* [flux get sources chart](flux_get_sources_chart.md) - Get HelmChart statuses * [flux get sources git](flux_get_sources_git.md) - Get GitRepository source statuses * [flux get sources helm](flux_get_sources_helm.md) - Get HelmRepository source statuses diff --git a/docs/cmd/flux_get_sources_bucket.md b/docs/cmd/flux_get_sources_bucket.md index 352bcc37..661004b6 100644 --- a/docs/cmd/flux_get_sources_bucket.md +++ b/docs/cmd/flux_get_sources_bucket.md @@ -16,6 +16,9 @@ flux get sources bucket [flags] # List all Buckets and their status flux get sources bucket + # List buckets from all namespaces + flux get sources helm --all-namespaces + ``` ### Options diff --git a/docs/cmd/flux_get_sources_chart.md b/docs/cmd/flux_get_sources_chart.md new file mode 100644 index 00000000..dd4f196a --- /dev/null +++ b/docs/cmd/flux_get_sources_chart.md @@ -0,0 +1,44 @@ +## flux get sources chart + +Get HelmChart statuses + +### Synopsis + +The get sources chart command prints the status of the HelmCharts. + +``` +flux get sources chart [flags] +``` + +### Examples + +``` + # List all Helm charts and their status + flux get sources chart + + # List Helm charts from all namespaces + flux get sources chart --all-namespaces + +``` + +### Options + +``` + -h, --help help for chart +``` + +### Options inherited from parent commands + +``` + -A, --all-namespaces list the requested object(s) across all namespaces + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux get sources](flux_get_sources.md) - Get source statuses + diff --git a/docs/cmd/flux_get_sources_git.md b/docs/cmd/flux_get_sources_git.md index ceb22ad3..55cf75dc 100644 --- a/docs/cmd/flux_get_sources_git.md +++ b/docs/cmd/flux_get_sources_git.md @@ -16,6 +16,9 @@ flux get sources git [flags] # List all Git repositories and their status flux get sources git + # List Git repositories from all namespaces + flux get sources git --all-namespaces + ``` ### Options diff --git a/docs/cmd/flux_get_sources_helm.md b/docs/cmd/flux_get_sources_helm.md index 69e5bbf4..294ad059 100644 --- a/docs/cmd/flux_get_sources_helm.md +++ b/docs/cmd/flux_get_sources_helm.md @@ -16,6 +16,9 @@ flux get sources helm [flags] # List all Helm repositories and their status flux get sources helm + # List Helm repositories from all namespaces + flux get sources helm --all-namespaces + ``` ### Options diff --git a/mkdocs.yml b/mkdocs.yml index 4e112dfb..574f0b48 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -119,6 +119,7 @@ nav: - Get sources: cmd/flux_get_sources.md - Get sources git: cmd/flux_get_sources_git.md - Get sources helm: cmd/flux_get_sources_helm.md + - Get sources chart: cmd/flux_get_sources_chart.md - Get sources bucket: cmd/flux_get_sources_bucket.md - Get alert provider: cmd/flux_get_alert-provider.md - Get alert: cmd/flux_get_alert.md