-
Notifications
You must be signed in to change notification settings - Fork 625
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement get/export HelmRelease for Helm releases
- Loading branch information
1 parent
0a4fac6
commit 0b2bc7a
Showing
8 changed files
with
294 additions
and
24 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters