Skip to content

Commit

Permalink
Implement get/export HelmRelease for Helm releases
Browse files Browse the repository at this point in the history
  • Loading branch information
stefanprodan committed Jul 21, 2020
1 parent 0a4fac6 commit 0b2bc7a
Show file tree
Hide file tree
Showing 8 changed files with 294 additions and 24 deletions.
24 changes: 0 additions & 24 deletions cmd/tk/create_helmrelease.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
118 changes: 118 additions & 0 deletions cmd/tk/export_helmrelease.go
Original file line number Diff line number Diff line change
@@ -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
}
90 changes: 90 additions & 0 deletions cmd/tk/get_helmrelease.go
Original file line number Diff line number Diff line change
@@ -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
}
1 change: 1 addition & 0 deletions docs/cmd/tk_export.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

43 changes: 43 additions & 0 deletions docs/cmd/tk_export_helmrelease.md
Original file line number Diff line number Diff line change
@@ -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

1 change: 1 addition & 0 deletions docs/cmd/tk_get.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

39 changes: 39 additions & 0 deletions docs/cmd/tk_get_helmreleases.md
Original file line number Diff line number Diff line change
@@ -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

2 changes: 2 additions & 0 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 0b2bc7a

Please sign in to comment.