diff --git a/cmd/tk/create_helmrelease.go b/cmd/tk/create_helmrelease.go index 076d5cc0..8b96cd3a 100644 --- a/cmd/tk/create_helmrelease.go +++ b/cmd/tk/create_helmrelease.go @@ -226,30 +226,6 @@ func upsertHelmRelease(ctx context.Context, kubeClient client.Client, helmReleas return nil } -func exportHelmRelease(helmRelease helmv2.HelmRelease) error { - gvk := helmv2.GroupVersion.WithKind(helmv2.HelmReleaseKind) - export := helmv2.HelmRelease{ - TypeMeta: metav1.TypeMeta{ - Kind: gvk.Kind, - APIVersion: gvk.GroupVersion().String(), - }, - ObjectMeta: metav1.ObjectMeta{ - Name: helmRelease.Name, - Namespace: helmRelease.Namespace, - }, - Spec: helmRelease.Spec, - } - - data, err := yaml.Marshal(export) - if err != nil { - return err - } - - fmt.Println("---") - fmt.Println(string(data)) - return nil -} - func isHelmChartReady(ctx context.Context, kubeClient client.Client, name, namespace string) wait.ConditionFunc { return func() (bool, error) { var helmChart sourcev1.HelmChart diff --git a/cmd/tk/export_helmrelease.go b/cmd/tk/export_helmrelease.go new file mode 100644 index 00000000..4d7c08be --- /dev/null +++ b/cmd/tk/export_helmrelease.go @@ -0,0 +1,118 @@ +/* +Copyright 2020 The Flux CD contributors. + +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" + "fmt" + + "github.com/spf13/cobra" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/yaml" + + helmv2 "github.com/fluxcd/helm-controller/api/v2alpha1" +) + +var exportHelmReleaseCmd = &cobra.Command{ + Use: "helmrelease [name]", + Aliases: []string{"hr"}, + Short: "Export HelmRelease resources in YAML format", + Long: "The export helmrelease command exports one or all HelmRelease resources in YAML format.", + Example: ` # Export all HelmRelease resources + tk export helmrelease --all > kustomizations.yaml + + # Export a HelmRelease + tk export hr my-app > app-release.yaml +`, + RunE: exportHelmReleaseCmdRun, +} + +func init() { + exportCmd.AddCommand(exportHelmReleaseCmd) +} + +func exportHelmReleaseCmdRun(cmd *cobra.Command, args []string) error { + if !exportAll && len(args) < 1 { + return fmt.Errorf("name is required") + } + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + kubeClient, err := utils.kubeClient(kubeconfig) + if err != nil { + return err + } + + if exportAll { + var list helmv2.HelmReleaseList + err = kubeClient.List(ctx, &list, client.InNamespace(namespace)) + if err != nil { + return err + } + + if len(list.Items) == 0 { + logger.Failuref("no kustomizations found in %s namespace", namespace) + return nil + } + + for _, helmRelease := range list.Items { + if err := exportHelmRelease(helmRelease); err != nil { + return err + } + } + } else { + name := args[0] + namespacedName := types.NamespacedName{ + Namespace: namespace, + Name: name, + } + var helmRelease helmv2.HelmRelease + err = kubeClient.Get(ctx, namespacedName, &helmRelease) + if err != nil { + return err + } + return exportHelmRelease(helmRelease) + } + return nil +} + +func exportHelmRelease(helmRelease helmv2.HelmRelease) error { + gvk := helmv2.GroupVersion.WithKind(helmv2.HelmReleaseKind) + export := helmv2.HelmRelease{ + TypeMeta: metav1.TypeMeta{ + Kind: gvk.Kind, + APIVersion: gvk.GroupVersion().String(), + }, + ObjectMeta: metav1.ObjectMeta{ + Name: helmRelease.Name, + Namespace: helmRelease.Namespace, + }, + Spec: helmRelease.Spec, + } + + data, err := yaml.Marshal(export) + if err != nil { + return err + } + + fmt.Println("---") + fmt.Println(string(data)) + return nil +} diff --git a/cmd/tk/get_helmrelease.go b/cmd/tk/get_helmrelease.go new file mode 100644 index 00000000..585d0518 --- /dev/null +++ b/cmd/tk/get_helmrelease.go @@ -0,0 +1,90 @@ +/* +Copyright 2020 The Flux CD contributors. + +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" + + "github.com/spf13/cobra" + corev1 "k8s.io/api/core/v1" + "sigs.k8s.io/controller-runtime/pkg/client" + + helmv2 "github.com/fluxcd/helm-controller/api/v2alpha1" +) + +var getHelmReleaseCmd = &cobra.Command{ + Use: "helmreleases", + Aliases: []string{"hr"}, + Short: "Get HelmRelease statuses", + Long: "The get helmreleases command prints the statuses of the resources.", + Example: ` # List all Helm releases and their status + tk get helmreleases +`, + RunE: getHelmReleaseCmdRun, +} + +func init() { + getCmd.AddCommand(getHelmReleaseCmd) +} + +func getHelmReleaseCmdRun(cmd *cobra.Command, args []string) error { + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + kubeClient, err := utils.kubeClient(kubeconfig) + if err != nil { + return err + } + + var list helmv2.HelmReleaseList + err = kubeClient.List(ctx, &list, client.InNamespace(namespace)) + if err != nil { + return err + } + + if len(list.Items) == 0 { + logger.Failuref("no releases found in %s namespace", namespace) + return nil + } + + for _, helmRelease := range list.Items { + if helmRelease.Spec.Suspend { + logger.Successf("%s is suspended", helmRelease.GetName()) + continue + } + isInitialized := false + for _, condition := range helmRelease.Status.Conditions { + if condition.Type == helmv2.ReadyCondition { + if condition.Status != corev1.ConditionFalse { + if helmRelease.Status.LastAppliedRevision != "" { + logger.Successf("%s last applied revision %s", helmRelease.GetName(), helmRelease.Status.LastAppliedRevision) + } else { + logger.Successf("%s reconciling", helmRelease.GetName()) + } + } else { + logger.Failuref("%s %s", helmRelease.GetName(), condition.Message) + } + isInitialized = true + break + } + } + if !isInitialized { + logger.Failuref("%s is not ready", helmRelease.GetName()) + } + } + return nil +} diff --git a/docs/cmd/tk_export.md b/docs/cmd/tk_export.md index 1f461339..917de19c 100644 --- a/docs/cmd/tk_export.md +++ b/docs/cmd/tk_export.md @@ -25,6 +25,7 @@ The export sub-commands export resources in YAML format. ### SEE ALSO * [tk](tk.md) - Command line utility for assembling Kubernetes CD pipelines +* [tk export helmrelease](tk_export_helmrelease.md) - Export HelmRelease resources in YAML format * [tk export kustomization](tk_export_kustomization.md) - Export Kustomization resources in YAML format * [tk export source](tk_export_source.md) - Export sources diff --git a/docs/cmd/tk_export_helmrelease.md b/docs/cmd/tk_export_helmrelease.md new file mode 100644 index 00000000..308fb6f7 --- /dev/null +++ b/docs/cmd/tk_export_helmrelease.md @@ -0,0 +1,43 @@ +## tk export helmrelease + +Export HelmRelease resources in YAML format + +### Synopsis + +The export helmrelease command exports one or all HelmRelease resources in YAML format. + +``` +tk export helmrelease [name] [flags] +``` + +### Examples + +``` + # Export all HelmRelease resources + tk export helmrelease --all > kustomizations.yaml + + # Export a HelmRelease + tk export hr my-app > app-release.yaml + +``` + +### Options + +``` + -h, --help help for helmrelease +``` + +### Options inherited from parent commands + +``` + --all select all resources + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + --namespace string the namespace scope for this operation (default "gitops-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [tk export](tk_export.md) - Export resources in YAML format + diff --git a/docs/cmd/tk_get.md b/docs/cmd/tk_get.md index fa42a9f4..d1844453 100644 --- a/docs/cmd/tk_get.md +++ b/docs/cmd/tk_get.md @@ -24,6 +24,7 @@ The get sub-commands print the statuses of sources and resources. ### SEE ALSO * [tk](tk.md) - Command line utility for assembling Kubernetes CD pipelines +* [tk get helmreleases](tk_get_helmreleases.md) - Get HelmRelease statuses * [tk get kustomizations](tk_get_kustomizations.md) - Get Kustomization statuses * [tk get sources](tk_get_sources.md) - Get source statuses diff --git a/docs/cmd/tk_get_helmreleases.md b/docs/cmd/tk_get_helmreleases.md new file mode 100644 index 00000000..f5d0695a --- /dev/null +++ b/docs/cmd/tk_get_helmreleases.md @@ -0,0 +1,39 @@ +## tk get helmreleases + +Get HelmRelease statuses + +### Synopsis + +The get helmreleases command prints the statuses of the resources. + +``` +tk get helmreleases [flags] +``` + +### Examples + +``` + # List all Helm releases and their status + tk get helmreleases + +``` + +### Options + +``` + -h, --help help for helmreleases +``` + +### Options inherited from parent commands + +``` + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + --namespace string the namespace scope for this operation (default "gitops-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [tk get](tk_get.md) - Get sources and resources + diff --git a/mkdocs.yml b/mkdocs.yml index 4eedc776..7aa0e67d 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -85,11 +85,13 @@ nav: - Delete source helm: cmd/tk_delete_source_helm.md - Export: cmd/tk_export.md - Export kustomization: cmd/tk_export_kustomization.md + - Export helmrelease: cmd/tk_export_helmrelease.md - Export source: cmd/tk_export_source.md - Export source git: cmd/tk_export_source_git.md - Export source helm: cmd/tk_export_source_helm.md - Get: cmd/tk_get.md - Get kustomizations: cmd/tk_get_kustomizations.md + - Get helmreleases: cmd/tk_get_helmreleases.md - Get sources: cmd/tk_get_sources.md - Get sources git: cmd/tk_get_sources_git.md - Get sources helm: cmd/tk_get_sources_helm.md