Skip to content

Commit

Permalink
Merge pull request #2 from WoodProgrammer/backup-only-mode
Browse files Browse the repository at this point in the history
Backup only mode
  • Loading branch information
WoodProgrammer committed May 26, 2023
2 parents 52e5999 + 2e52aa1 commit 852838b
Show file tree
Hide file tree
Showing 6 changed files with 112 additions and 26 deletions.
8 changes: 4 additions & 4 deletions src/backup.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ func getBackup(namespace string, clientset *kubernetes.Clientset) []HelmRelease
for _, item := range secrets.Items {

r := HelmRelease{
status: item.ObjectMeta.Labels["status"],
version: item.ObjectMeta.Labels["version"],
content: string(item.Data["release"]),
name: item.ObjectMeta.Labels["name"],
Status: item.ObjectMeta.Labels["status"],
Version: item.ObjectMeta.Labels["version"],
Content: string(item.Data["release"]),
Name: item.ObjectMeta.Labels["name"],
}
releaseMap = append(releaseMap, r)
}
Expand Down
60 changes: 60 additions & 0 deletions src/binary.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package main

import (
"bufio"
"bytes"
"encoding/gob"
"fmt"
"log"
"os"
)

func dump(filename string, value []HelmRelease) {
file, _ := os.Create(filename)

enc := gob.NewEncoder(file)

if err := enc.Encode(value); err != nil {
log.Fatal(err)
}
}

func encodedBackup(filename string) []byte {
file, err := os.Open(filename)

if err != nil {
fmt.Println(err)
}
defer file.Close()

stats, statsErr := file.Stat()
if statsErr != nil {
fmt.Println(statsErr)
}

var size int64 = stats.Size()
bytes := make([]byte, size)

bufr := bufio.NewReader(file)
_, err = bufr.Read(bytes)

return bytes
}

func decodeFromBackup(filename string) error {

data := encodedBackup(filename)

buf := bytes.NewBuffer(data)
dec := gob.NewDecoder(buf)

m := []HelmRelease{}

if err := dec.Decode(&m); err != nil {
log.Fatal(err)
return err
}

return nil

}
30 changes: 25 additions & 5 deletions src/cli.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package main

import (
"fmt"
"os"
"time"

"github.com/spf13/cobra"
)
Expand All @@ -25,23 +27,39 @@ var mode = &cobra.Command{
targetCluster, _ := cmd.Flags().GetString("targetcluster")
sourceCluster, _ := cmd.Flags().GetString("sourcecluster")
targetNs, _ := cmd.Flags().GetString("ns")
rollback, _ := cmd.Flags().GetBool("rollback")
kubeconfig, _ := cmd.Flags().GetString("kubeconfig")

WarningLogger.Println("Source cluster is :: ", sourceCluster)
WarningLogger.Println("Target cluster is ::", targetCluster)
WarningLogger.Println("Source namespace is ::", targetNs)
sourceClusterclientset := configHandler(sourceCluster, kubeconfig)

if args[0] == "backup" {
WarningLogger.Println("Running only backup mode.. Extracting files under this directory...")
backup := getBackup(targetNs, sourceClusterclientset)
currentTime := time.Now()

backupFile := fmt.Sprintf("%d-%d-%d-%d-%d-%d-helm.backup",
currentTime.Year(),
currentTime.Month(),
currentTime.Day(),
currentTime.Hour(),
currentTime.Hour(),
currentTime.Second())

// TODO backup only mode
} else if args[0] == "restore" {
dump(backupFile, backup)

} else if args[0] == "full" {
WarningLogger.Println("This option provides both backup and restore functionality...")
sourceClusterclientset := configHandler(sourceCluster)
targetClusterclientset := configHandler(targetCluster)
sourceClusterclientset := configHandler(sourceCluster, kubeconfig)
targetClusterclientset := configHandler(targetCluster, kubeconfig)
backup := getBackup(targetNs, sourceClusterclientset)

restoreBackup(targetNs, targetClusterclientset, backup)

if rollback == true {
WarningLogger.Println("Rollback option is enabled ")
}
}
},
}
Expand All @@ -52,6 +70,8 @@ func Execute() {
mode.PersistentFlags().String("ns", "", "The target namespace to fetch helm release and restore")
mode.PersistentFlags().String("targetcluster", "", "Source of the backup of helm releases")
mode.PersistentFlags().String("sourcecluster", "", "Target cluster address of helm restore operation")
mode.PersistentFlags().String("rollback", "", "This option provides rollback option enabled whether or not")
mode.PersistentFlags().String("kubeconfig", "", "This path of the kubeconfig")

if err := rootCmd.Execute(); err != nil {
ErrorLogger.Println(os.Stderr, "Whoops. There was an error while executing your CLI '%s'", err)
Expand Down
22 changes: 14 additions & 8 deletions src/config.go
Original file line number Diff line number Diff line change
@@ -1,22 +1,28 @@
package main

import (
"fmt"
"os"

"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
)

func configHandler(contextToUse string) *kubernetes.Clientset {
/*var kubeconfig *string
func configHandler(contextToUse string, kubeconfig string) *kubernetes.Clientset {
var filename string
var kubeconfigPath string
dirname, err := os.UserHomeDir()

if kubeconfig == "" {
filename = ".kube/config"
kubeconfigPath = fmt.Sprintf("%s/%s", dirname, filename)

if home := homedir.HomeDir(); home != "" {
kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
} else {
kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
}
flag.Parse()*/

WarningLogger.Println("The obtained kubeconfig path is %s", kubeconfigPath)

config, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(
&clientcmd.ClientConfigLoadingRules{ExplicitPath: "/Users/user/.kube/config"},
&clientcmd.ClientConfigLoadingRules{ExplicitPath: kubeconfigPath},
&clientcmd.ConfigOverrides{
CurrentContext: contextToUse,
}).ClientConfig()
Expand Down
10 changes: 5 additions & 5 deletions src/restore.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import (

func restoreBackup(namespace string, clientset *kubernetes.Clientset, releaseMap []HelmRelease) {
for _, release := range releaseMap {
secretName := fmt.Sprintf("sh.helm.release.v1.%s.v%s", release.name, release.version)
secretName := fmt.Sprintf("sh.helm.release.v1.%s.v%s", release.Name, release.Version)

secret := corev1.Secret{
TypeMeta: metav1.TypeMeta{
Expand All @@ -26,12 +26,12 @@ func restoreBackup(namespace string, clientset *kubernetes.Clientset, releaseMap
Namespace: namespace,
Labels: map[string]string{
"owner": "helm",
"name": release.name,
"status": release.status,
"version": release.version,
"name": release.Name,
"status": release.Status,
"version": release.Version,
},
},
Data: map[string][]byte{"release": []byte(release.content)},
Data: map[string][]byte{"release": []byte(release.Content)},
}
_, err := clientset.CoreV1().Secrets(namespace).Create(context.TODO(), &secret, metav1.CreateOptions{})

Expand Down
8 changes: 4 additions & 4 deletions src/types.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package main

type HelmRelease struct {
name string
version string
status string
content string
Name string
Version string
Status string
Content string
}

0 comments on commit 852838b

Please sign in to comment.