Skip to content

Commit 8e39417

Browse files
authored
Merge pull request #85 from wunderio/feature/helm-library
Use official helm library
2 parents 3ac15a5 + 51898f0 commit 8e39417

File tree

11 files changed

+160
-360
lines changed

11 files changed

+160
-360
lines changed

cmd/ciReleaseCleanfailed.go

Lines changed: 1 addition & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,8 @@
11
package cmd
22

33
import (
4-
"context"
5-
"fmt"
6-
"log"
7-
"os"
8-
9-
helmclient "github.com/mittwald/go-helm-client"
104
"github.com/spf13/cobra"
115
"github.com/wunderio/silta-cli/internal/common"
12-
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
13-
"k8s.io/client-go/kubernetes"
14-
"k8s.io/client-go/tools/clientcmd"
156
)
167

178
var ciReleaseCleanfailedCmd = &cobra.Command{
@@ -21,85 +12,7 @@ var ciReleaseCleanfailedCmd = &cobra.Command{
2112
releaseName, _ := cmd.Flags().GetString("release-name")
2213
namespace, _ := cmd.Flags().GetString("namespace")
2314

24-
// Try reading KUBECONFIG from environment variable first
25-
kubeConfigPath := os.Getenv("KUBECONFIG")
26-
if kubeConfigPath == "" {
27-
// If not set, use the default kube config path
28-
homeDir, err := os.UserHomeDir()
29-
if err != nil {
30-
log.Fatalf("cannot read user home dir")
31-
}
32-
kubeConfigPath = homeDir + "/.kube/config"
33-
34-
}
35-
36-
// Read kubeConfig from file
37-
if _, err := os.Stat(kubeConfigPath); os.IsNotExist(err) {
38-
log.Fatalf("kubeConfig file does not exist at path: %s", kubeConfigPath)
39-
}
40-
41-
// Read kubeConfig file
42-
kubeConfig, err := os.ReadFile(kubeConfigPath)
43-
if err != nil {
44-
log.Fatalf("cannot read kubeConfig from path: %s", kubeConfigPath)
45-
}
46-
47-
//k8s go client init logic
48-
config, err := clientcmd.BuildConfigFromFlags("", kubeConfigPath)
49-
if err != nil {
50-
log.Fatalf("cannot read kubeConfig from path: %s", err)
51-
}
52-
clientset, err := kubernetes.NewForConfig(config)
53-
if err != nil {
54-
log.Fatalf("cannot initialize k8s client: %s", err)
55-
}
56-
57-
//Helm client init logic
58-
opt := &helmclient.KubeConfClientOptions{
59-
Options: &helmclient.Options{
60-
Namespace: namespace,
61-
RepositoryCache: "/tmp/.helmcache",
62-
RepositoryConfig: "/tmp/.helmrepo",
63-
Debug: false,
64-
Linting: false, // Change this to false if you don't want linting.
65-
},
66-
KubeContext: "",
67-
KubeConfig: kubeConfig,
68-
}
69-
70-
helmClient, err := helmclient.NewClientFromKubeConf(opt)
71-
if err != nil {
72-
log.Fatalf("Cannot create client from kubeConfig")
73-
}
74-
75-
// Get release info
76-
release, err := helmClient.GetRelease(releaseName)
77-
if err != nil {
78-
return // Release not found or there was an error
79-
}
80-
81-
// Check if there's only one revision and it's failed
82-
if release.Version == 1 && release.Info.Status == "failed" {
83-
84-
fmt.Println("Removing failed first release.")
85-
86-
// Remove release
87-
common.UninstallHelmRelease(clientset, helmClient, releaseName, namespace, true)
88-
}
89-
90-
// Workaround for previous Helm release stuck in pending state
91-
// This is a workaround for a known issue with Helm where a release can get stuck in a pending-upgrade state
92-
// and the secret is not deleted. This is a workaround to delete the secret if it exists.
93-
if release.Info.Status == "pending-upgrade" {
94-
secretName := fmt.Sprintf("%s.%s.v%d", releaseName, namespace, release.Version)
95-
if err == nil {
96-
fmt.Printf("Deleting secret %s\n", secretName)
97-
err := clientset.CoreV1().Secrets(namespace).Delete(context.TODO(), secretName, v1.DeleteOptions{})
98-
if err != nil {
99-
log.Printf("Error deleting secret %s: %s", secretName, err)
100-
}
101-
}
102-
}
15+
common.FailedReleaseCleanup(releaseName, namespace)
10316
},
10417
}
10518

cmd/ciReleaseDelete.go

Lines changed: 13 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ import (
44
"log"
55
"os"
66

7-
helmclient "github.com/mittwald/go-helm-client"
87
"github.com/spf13/cobra"
98
"github.com/wunderio/silta-cli/internal/common"
10-
"k8s.io/client-go/kubernetes"
119
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp" // gcp auth provider
12-
"k8s.io/client-go/tools/clientcmd"
10+
11+
helmAction "helm.sh/helm/v3/pkg/action"
12+
helmCli "helm.sh/helm/v3/pkg/cli"
1313
)
1414

1515
var ciReleaseDeleteCmd = &cobra.Command{
@@ -20,58 +20,22 @@ var ciReleaseDeleteCmd = &cobra.Command{
2020
namespace, _ := cmd.Flags().GetString("namespace")
2121
deletePVCs, _ := cmd.Flags().GetBool("delete-pvcs")
2222

23-
// Try reading KUBECONFIG from environment variable first
24-
kubeConfigPath := os.Getenv("KUBECONFIG")
25-
if kubeConfigPath == "" {
26-
// If not set, use the default kube config path
27-
homeDir, err := os.UserHomeDir()
28-
if err != nil {
29-
log.Fatalf("cannot read user home dir")
30-
}
31-
kubeConfigPath = homeDir + "/.kube/config"
32-
33-
}
34-
35-
// Read kubeConfig from file
36-
if _, err := os.Stat(kubeConfigPath); os.IsNotExist(err) {
37-
log.Fatalf("kubeConfig file does not exist at path: %s", kubeConfigPath)
38-
}
39-
40-
// Read kubeConfig file
41-
kubeConfig, err := os.ReadFile(kubeConfigPath)
23+
clientset, err := common.GetKubeClient()
4224
if err != nil {
43-
log.Fatalf("cannot read kubeConfig from path: %s", kubeConfigPath)
25+
log.Fatalf("failed to get kube client: %v", err)
4426
}
4527

46-
//k8s go client init logic
47-
config, err := clientcmd.BuildConfigFromFlags("", kubeConfigPath)
48-
if err != nil {
49-
log.Fatalf("cannot read kubeConfig from path: %s", err)
50-
}
51-
clientset, err := kubernetes.NewForConfig(config)
52-
if err != nil {
53-
log.Fatalf("cannot initialize k8s client: %s", err)
54-
}
28+
// Helm client init logic
29+
settings := helmCli.New()
30+
settings.SetNamespace(namespace) // Ensure Helm uses the correct namespace
5531

56-
//Helm client init logic
57-
opt := &helmclient.KubeConfClientOptions{
58-
Options: &helmclient.Options{
59-
Namespace: namespace,
60-
RepositoryCache: "/tmp/.helmcache",
61-
RepositoryConfig: "/tmp/.helmrepo",
62-
Debug: false,
63-
Linting: false, // Change this to false if you don't want linting.
64-
},
65-
KubeContext: "",
66-
KubeConfig: kubeConfig,
67-
}
68-
69-
helmClient, err := helmclient.NewClientFromKubeConf(opt)
70-
if err != nil {
71-
log.Fatalf("Cannot create client from kubeConfig")
32+
actionConfig := new(helmAction.Configuration)
33+
if err := actionConfig.Init(settings.RESTClientGetter(), namespace, os.Getenv("HELM_DRIVER"), log.Printf); err != nil {
34+
log.Printf("%+v", err)
35+
os.Exit(1)
7236
}
7337

74-
err = common.UninstallHelmRelease(clientset, helmClient, releaseName, namespace, deletePVCs)
38+
err = common.UninstallHelmRelease(clientset, actionConfig, namespace, releaseName, deletePVCs)
7539
if err != nil {
7640
log.Fatalf("Error removing a release: %s", err)
7741
}

cmd/ciReleaseDeploy.go

Lines changed: 5 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ import (
1313
"github.com/wunderio/silta-cli/internal/common"
1414
v1core "k8s.io/api/core/v1"
1515
v1meta "k8s.io/apimachinery/pkg/apis/meta/v1"
16-
"k8s.io/client-go/kubernetes"
17-
"k8s.io/client-go/tools/clientcmd"
1816
)
1917

2018
// ciReleaseDeployCmd represents the ciReleaseDeploy command
@@ -150,33 +148,10 @@ var ciReleaseDeployCmd = &cobra.Command{
150148
}
151149

152150
if !debug {
153-
154-
// Try reading KUBECONFIG from environment variable first
155-
kubeConfigPath := os.Getenv("KUBECONFIG")
156-
if kubeConfigPath == "" {
157-
// If not set, use the default kube config path
158-
homeDir, err := os.UserHomeDir()
159-
if err != nil {
160-
log.Fatalf("cannot read user home dir")
161-
}
162-
kubeConfigPath = homeDir + "/.kube/config"
163-
}
164-
165-
// Read kubeConfig from file
166-
if _, err := os.Stat(kubeConfigPath); os.IsNotExist(err) {
167-
log.Fatalf("kubeConfig file does not exist at path: %s", kubeConfigPath)
168-
}
169-
170-
//k8s go client init logic
171-
config, err := clientcmd.BuildConfigFromFlags("", kubeConfigPath)
151+
clientset, err := common.GetKubeClient()
172152
if err != nil {
173-
log.Fatalf("cannot read kubeConfig from path: %s", err)
153+
log.Fatalf("failed to get kube client: %v", err)
174154
}
175-
clientset, err := kubernetes.NewForConfig(config)
176-
if err != nil {
177-
log.Fatalf("cannot initialize k8s client: %s", err)
178-
}
179-
180155
// Create namespace if it doesn't exist
181156
// Describe namespace
182157
_, err = clientset.CoreV1().Namespaces().Get(context.TODO(), namespace, v1meta.GetOptions{})
@@ -488,62 +463,17 @@ var ciReleaseDeployCmd = &cobra.Command{
488463
pipedExec(command, "", "ERROR: ", debug)
489464

490465
// Clean up failed Helm releases
491-
// TODO: Rewrite
492-
command = fmt.Sprintf(`
493-
NAMESPACE='%s'
494-
RELEASE_NAME='%s'
495-
failed_revision=$(helm list -n "$NAMESPACE" --failed --pending --filter="(\s|^)($RELEASE_NAME)(\s|$)" | tail -1 | cut -f3)
496-
497-
if [[ "$failed_revision" -eq 1 ]]; then
498-
# Remove any existing post-release hook, since it's technically not part of the release.
499-
kubectl delete job -n "$NAMESPACE" "$RELEASE_NAME-post-release --ignore-not-found" 2> /dev/null || true
500-
501-
echo "Removing failed first release."
502-
helm delete -n "$NAMESPACE" "$RELEASE_NAME"
503-
504-
echo "Delete persistent volume claims left over from statefulsets."
505-
kubectl delete pvc -n "$NAMESPACE" -l release="$RELEASE_NAME"
506-
kubectl delete pvc -n "$NAMESPACE" -l app="$RELEASE_NAME-es"
507-
508-
echo "Waiting for volumes to be deleted."
509-
until [[ -z $(kubectl get pv | grep "$NAMESPACE/$RELEASE_NAME-") ]]
510-
do
511-
echo "."
512-
sleep 10
513-
done
514-
fi
515-
516-
# Workaround for previous Helm release stuck in pending state
517-
pending_release=$(helm list -n "$NAMESPACE" --pending --filter="(\s|^)($RELEASE_NAME)(\s|$)"| tail -1 | cut -f1)
518-
519-
if [[ "$pending_release" == "$RELEASE_NAME" ]]; then
520-
secret_to_delete=$(kubectl get secret -l owner=helm,status=pending-upgrade,name="$RELEASE_NAME" -n "$NAMESPACE" --no-headers | awk '{print $1}')
521-
kubectl delete secret -n "$NAMESPACE" "$secret_to_delete" || true
522-
fi
523-
`, namespace, releaseName)
524-
pipedExec(command, "", "ERROR: ", debug)
466+
common.FailedReleaseCleanup(releaseName, namespace)
525467

526468
// Chart value overrides
527469

528470
// Disable reference data if the required volume is not present.
529471
referenceDataOverride := ""
530472
if !debug {
531473

532-
// Connect to the cluster
533-
homeDir, err := os.UserHomeDir()
534-
if err != nil {
535-
log.Fatalf("cannot read user home dir")
536-
}
537-
kubeConfigPath := homeDir + "/.kube/config"
538-
539-
//k8s go client init logic
540-
config, err := clientcmd.BuildConfigFromFlags("", kubeConfigPath)
541-
if err != nil {
542-
log.Fatalf("cannot read kubeConfig from path: %s", err)
543-
}
544-
clientset, err := kubernetes.NewForConfig(config)
474+
clientset, err := common.GetKubeClient()
545475
if err != nil {
546-
log.Fatalf("cannot initialize k8s client: %s", err)
476+
log.Fatalf("failed to get kube client: %v", err)
547477
}
548478

549479
// PVC name can be either "*-reference-data" or "*-reference", so we need to check both

cmd/ciReleaseDiff.go

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ import (
1111
"github.com/spf13/cobra"
1212
"github.com/wunderio/silta-cli/internal/common"
1313
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14-
"k8s.io/client-go/kubernetes"
15-
"k8s.io/client-go/tools/clientcmd"
1614
)
1715

1816
// ciReleaseDiffCmd represents the ciReleaseDiff command
@@ -280,27 +278,9 @@ var ciReleaseDiffCmd = &cobra.Command{
280278
referenceDataOverride := ""
281279
if !debug {
282280

283-
// Try reading KUBECONFIG from environment variable first
284-
kubeConfigPath := os.Getenv("KUBECONFIG")
285-
if kubeConfigPath == "" {
286-
homeDir, err := os.UserHomeDir()
287-
if err != nil {
288-
log.Fatalf("cannot read user home dir")
289-
}
290-
kubeConfigPath = homeDir + "/.kube/config"
291-
}
292-
// Read kubeConfig from file
293-
if _, err := os.Stat(kubeConfigPath); os.IsNotExist(err) {
294-
log.Fatalf("kubeConfig file does not exist at path: %s", kubeConfigPath)
295-
}
296-
//k8s go client init logic
297-
config, err := clientcmd.BuildConfigFromFlags("", kubeConfigPath)
298-
if err != nil {
299-
log.Fatalf("cannot read kubeConfig from path: %s", err)
300-
}
301-
clientset, err := kubernetes.NewForConfig(config)
281+
clientset, err := common.GetKubeClient()
302282
if err != nil {
303-
log.Fatalf("cannot initialize k8s client: %s", err)
283+
log.Fatalf("failed to get kube client: %v", err)
304284
}
305285

306286
// PVC name can be either "*-reference-data" or "*-reference", so we need to check both

0 commit comments

Comments
 (0)