Skip to content

simplifies k8s client creation with singleton pattern #84

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .golangci.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
version: 1

linters:
disable-all: true
enable:
Expand Down
40 changes: 23 additions & 17 deletions cmd/cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,13 @@ var ListOssCmd = &cobra.Command{
log.Fatalf("Failed to prompt for kubernetes context: %v", err)
}

k8sClient, err := common.CreateK8sClient()
if err != nil {
log.Fatalf("Error creating k8s client %v", err)
}

// Read the installer data from the ConfigMap
entries, err := common.ReadInstallerConfigMap()
entries, err := common.ReadInstallerConfigMap(k8sClient)
if err != nil {
log.Fatalf("Failed to list servers: %v", err)
}
Expand Down Expand Up @@ -90,8 +95,13 @@ var ShowValuesCmd = &cobra.Command{
log.Fatalf("Failed to prompt for Kubernetes context: %v", err)
}

k8sClient, err := common.CreateK8sClient()
if err != nil {
log.Fatalf("Error creating k8s client %v", err)
}

// Read the installer data from the ConfigMap
entries, err := common.ReadInstallerConfigMap()
entries, err := common.ReadInstallerConfigMap(k8sClient)
if err != nil {
log.Fatalf("Failed to list OSS servers: %v", err)
}
Expand Down Expand Up @@ -139,8 +149,13 @@ var UninstallOssCmd = &cobra.Command{
log.Fatalf("Failed to prompt for Kubernetes context: %v", err)
}

k8sClient, err := common.CreateK8sClient()
if err != nil {
log.Fatalf("Error creating k8s client %v", err)
}

// Read the installer data from the ConfigMap
entries, err := common.ReadInstallerConfigMap()
entries, err := common.ReadInstallerConfigMap(k8sClient)
if err != nil {
log.Fatalf("Failed to fetch OSS servers: %v", err)
}
Expand Down Expand Up @@ -176,12 +191,12 @@ var UninstallOssCmd = &cobra.Command{
}

// Remove entry from ConfigMap
if err := common.RemoveInstallerEntry(selectedCluster.Name); err != nil {
if err := common.RemoveInstallerEntry(selectedCluster.Name, k8sClient); err != nil {
log.Fatalf("Failed to remove entry from ConfigMap: %v", err)
}

// Delete secret
if err := deleteSecret(selectedCluster.Namespace, "parseable-env-secret"); err != nil {
if err := deleteSecret(selectedCluster.Namespace, "parseable-env-secret", k8sClient); err != nil {
log.Printf("Warning: Failed to delete secret 'parseable-env-secret': %v", err)
} else {
fmt.Println(common.Green + "Secret 'parseable-env-secret' deleted successfully." + common.Reset)
Expand Down Expand Up @@ -217,18 +232,9 @@ func uninstallCluster(entry common.InstallerEntry) error {
return nil
}

func deleteSecret(namespace, secretName string) error {
config, err := common.LoadKubeConfig()
if err != nil {
return fmt.Errorf("failed to create Kubernetes client: %v", err)
}

clientset, err := kubernetes.NewForConfig(config)
if err != nil {
return fmt.Errorf("failed to create Kubernetes client: %w", err)
}

err = clientset.CoreV1().Secrets(namespace).Delete(context.TODO(), "parseable-env-secret", metav1.DeleteOptions{})
func deleteSecret(namespace, secretName string, k8sClient *kubernetes.Clientset) error {
// Delete the secrets
err := k8sClient.CoreV1().Secrets(namespace).Delete(context.TODO(), "parseable-env-secret", metav1.DeleteOptions{})
if err != nil {
return fmt.Errorf("failed to delete secret '%s': %v", secretName, err)
}
Expand Down
47 changes: 19 additions & 28 deletions pkg/common/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,21 +56,9 @@ type InstallerEntry struct {
}

// ReadInstallerConfigMap fetches and parses installer data from a ConfigMap
func ReadInstallerConfigMap() ([]InstallerEntry, error) {

// Load kubeconfig and create a Kubernetes client
config, err := LoadKubeConfig()
if err != nil {
return nil, fmt.Errorf("failed to load kubeconfig: %w", err)
}

clientset, err := kubernetes.NewForConfig(config)
if err != nil {
return nil, fmt.Errorf("failed to create Kubernetes client: %w", err)
}

func ReadInstallerConfigMap(k8sclient *kubernetes.Clientset) ([]InstallerEntry, error) {
// Get the ConfigMap
cm, err := clientset.CoreV1().ConfigMaps(namespace).Get(context.TODO(), configMapName, metav1.GetOptions{})
cm, err := k8sclient.CoreV1().ConfigMaps(namespace).Get(context.TODO(), configMapName, metav1.GetOptions{})
if err != nil {
if apiErrors.IsNotFound(err) {
fmt.Println(Yellow + "\nNo existing Parseable OSS clusters found.\n" + Reset)
Expand Down Expand Up @@ -102,6 +90,20 @@ func LoadKubeConfig() (*rest.Config, error) {
return clientcmd.BuildConfigFromFlags("", kubeconfig)
}

func CreateK8sClient() (*kubernetes.Clientset, error) {
// Load kubeconfig and create a Kubernetes client
config, err := LoadKubeConfig()
if err != nil {
return nil, fmt.Errorf("failed to load kubeconfig: %w", err)
}

clientset, err := kubernetes.NewForConfig(config)
if err != nil {
return nil, fmt.Errorf("failed to create Kubernetes client: %w", err)
}
return clientset, nil
}

// PromptK8sContext retrieves Kubernetes contexts from kubeconfig.
func PromptK8sContext() (clusterName string, err error) {
kubeconfigPath := os.Getenv("KUBECONFIG")
Expand Down Expand Up @@ -220,20 +222,9 @@ func CreateDeploymentSpinner(infoMsg string) *spinner.Spinner {

return s
}
func RemoveInstallerEntry(name string) error {
// Load kubeconfig and create a Kubernetes client
config, err := LoadKubeConfig()
if err != nil {
return fmt.Errorf("failed to load kubeconfig: %w", err)
}

clientset, err := kubernetes.NewForConfig(config)
if err != nil {
return fmt.Errorf("failed to create Kubernetes client: %w", err)
}

func RemoveInstallerEntry(name string, k8sclient *kubernetes.Clientset) error {
// Fetch the ConfigMap
configMap, err := clientset.CoreV1().ConfigMaps(namespace).Get(context.TODO(), configMapName, metav1.GetOptions{})
configMap, err := k8sclient.CoreV1().ConfigMaps(namespace).Get(context.TODO(), configMapName, metav1.GetOptions{})
if err != nil {
return fmt.Errorf("failed to fetch ConfigMap: %v", err)
}
Expand Down Expand Up @@ -271,7 +262,7 @@ func RemoveInstallerEntry(name string) error {
configMap.Data["installer-data"] = string(updatedData)

// Update the ConfigMap in Kubernetes
_, err = clientset.CoreV1().ConfigMaps(namespace).Update(context.TODO(), configMap, metav1.UpdateOptions{})
_, err = k8sclient.CoreV1().ConfigMaps(namespace).Update(context.TODO(), configMap, metav1.UpdateOptions{})
if err != nil {
return fmt.Errorf("failed to update ConfigMap: %v", err)
}
Expand Down
Loading