/
cli.go
131 lines (118 loc) · 3.61 KB
/
cli.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package cli
import (
"io/ioutil"
"os"
"path/filepath"
"github.com/spf13/cobra"
core "k8s.io/api/core/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/util/homedir"
meta_util "kmodules.xyz/client-go/meta"
"kmodules.xyz/client-go/tools/clientcmd"
cs "stash.appscode.dev/stash/client/clientset/versioned"
"stash.appscode.dev/stash/pkg/cmds/docker"
docker_image "stash.appscode.dev/stash/pkg/docker"
"stash.appscode.dev/stash/pkg/restic"
)
const (
secretDirName = "secret"
configDirName = "config"
)
type stashCLIController struct {
clientConfig *rest.Config
kubeClient kubernetes.Interface
stashClient cs.Interface
}
type cliLocalDirectories struct {
secretDir string // temp dir
configDir string // temp dir
downloadDir string // user provided or, current working dir
}
var (
image = docker_image.Docker{
Registry: docker_image.ACRegistry,
Image: docker_image.ImageStash,
Tag: "latest", // TODO: update default release tag
}
)
func NewCLICmd() *cobra.Command {
var cmd = &cobra.Command{
Use: "cli",
Short: `Stash CLI`,
Long: `Kubectl plugin for Stash`,
DisableAutoGenTag: true,
RunE: func(cmd *cobra.Command, args []string) error {
return nil
},
}
cmd.AddCommand(NewCopyRepositoryCmd())
cmd.AddCommand(NewUnlockRepositoryCmd())
cmd.AddCommand(NewUnlockLocalRepositoryCmd())
cmd.AddCommand(NewTriggerBackupCmd())
cmd.AddCommand(NewBackupPVCmd())
cmd.AddCommand(NewDownloadCmd())
cmd.AddCommand(NewDeleteSnapshotCmd())
return cmd
}
func newStashCLIController(kubeConfig string) (*stashCLIController, error) {
var (
controller = &stashCLIController{}
err error
)
if kubeConfig == "" && !meta_util.PossiblyInCluster() {
kubeConfig = filepath.Join(homedir.HomeDir(), "/.kube/config")
}
if controller.clientConfig, err = clientcmd.BuildConfigFromContext(kubeConfig, ""); err != nil {
return nil, err
}
if controller.kubeClient, err = kubernetes.NewForConfig(controller.clientConfig); err != nil {
return nil, err
}
if controller.stashClient, err = cs.NewForConfig(controller.clientConfig); err != nil {
return nil, err
}
return controller, nil
}
func (localDirs *cliLocalDirectories) prepareSecretDir(tempDir string, secret *core.Secret) error {
// write repository secrets in a sub-dir insider tempDir
localDirs.secretDir = filepath.Join(tempDir, secretDirName)
if err := os.MkdirAll(localDirs.secretDir, 0755); err != nil {
return err
}
for key, value := range secret.Data {
if err := ioutil.WriteFile(filepath.Join(localDirs.secretDir, key), value, 0755); err != nil {
return err
}
}
return nil
}
func (localDirs *cliLocalDirectories) prepareConfigDir(tempDir string, setupOpt *restic.SetupOptions, restoreOpt *restic.RestoreOptions) error {
// write restic options in a sub-dir insider tempDir
localDirs.configDir = filepath.Join(tempDir, configDirName)
if err := os.MkdirAll(localDirs.secretDir, 0755); err != nil {
return err
}
if setupOpt != nil {
err := docker.WriteSetupOptionToFile(setupOpt, filepath.Join(localDirs.configDir, docker.SetupOptionsFile))
if err != nil {
return err
}
}
if restoreOpt != nil {
err := docker.WriteRestoreOptionToFile(restoreOpt, filepath.Join(localDirs.configDir, docker.RestoreOptionsFile))
if err != nil {
return err
}
}
return nil
}
func (localDirs *cliLocalDirectories) prepareDownloadDir() (err error) {
// if destination flag is not specified, restore in current directory
if localDirs.downloadDir == "" {
if localDirs.downloadDir, err = os.Getwd(); err != nil {
return err
}
}
return os.MkdirAll(localDirs.downloadDir, 0755)
}