Skip to content

Commit a15689d

Browse files
authored
Various bug fixes (#118)
1 parent d8a5771 commit a15689d

File tree

2 files changed

+93
-21
lines changed

2 files changed

+93
-21
lines changed

schedule.go

Lines changed: 88 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,25 @@ import (
99
rcs "github.com/appscode/stash/client/clientset"
1010
"github.com/appscode/stash/pkg/analytics"
1111
"github.com/appscode/stash/pkg/scheduler"
12+
"github.com/appscode/stash/pkg/util"
1213
"github.com/spf13/cobra"
14+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1315
clientset "k8s.io/client-go/kubernetes"
16+
apps "k8s.io/client-go/pkg/apis/apps/v1beta1"
1417
"k8s.io/client-go/tools/clientcmd"
1518
)
1619

1720
func NewCmdSchedule(version string) *cobra.Command {
1821
var (
1922
masterURL string
2023
kubeconfigPath string
24+
workload string
2125
opt scheduler.Options = scheduler.Options{
22-
ResourceNamespace: "",
23-
ResourceName: "",
24-
PrefixHostname: true,
25-
ScratchDir: "/tmp",
26-
PushgatewayURL: "http://stash-operator.kube-system.svc:56789",
27-
PodLabelsPath: "/etc/labels",
26+
Namespace: namespace(),
27+
ResticName: "",
28+
ScratchDir: "/tmp",
29+
PushgatewayURL: "http://stash-operator.kube-system.svc:56789",
30+
PodLabelsPath: "/etc/labels",
2831
}
2932
enableAnalytics bool = true
3033
)
@@ -49,6 +52,70 @@ func NewCmdSchedule(version string) *cobra.Command {
4952
kubeClient = clientset.NewForConfigOrDie(config)
5053
stashClient = rcs.NewForConfigOrDie(config)
5154

55+
opt.NodeName = os.Getenv("NODE_NAME")
56+
if opt.NodeName == "" {
57+
log.Fatalln(`Missing ENV var "NODE_NAME"`)
58+
}
59+
opt.PodName = os.Getenv("POD_NAME")
60+
if opt.PodName == "" {
61+
log.Fatalln(`Missing ENV var "POD_NAME"`)
62+
}
63+
64+
app := strings.SplitN(workload, "/", 2)
65+
if len(app) != 2 {
66+
log.Fatalf(`--workload flag must be in the format "Kind/Name", but found %v`, workload)
67+
}
68+
opt.AppName = app[1]
69+
switch app[0] {
70+
case "Deployments", "Deployment", "deployments", "deployment":
71+
opt.AppKind = "Deployment"
72+
opt.SmartPrefix = ""
73+
if util.IsPreferredAPIResource(kubeClient, apps.GroupName, opt.AppKind) {
74+
_, err := kubeClient.AppsV1beta1().Deployments(opt.Namespace).Get(opt.AppName, metav1.GetOptions{})
75+
if err != nil {
76+
_, err := kubeClient.ExtensionsV1beta1().Deployments(opt.Namespace).Get(opt.AppName, metav1.GetOptions{})
77+
if err != nil {
78+
log.Fatalf(`Unknown Deployment %s@%s`, opt.AppName, opt.Namespace)
79+
}
80+
}
81+
} else {
82+
_, err := kubeClient.ExtensionsV1beta1().Deployments(opt.Namespace).Get(opt.AppName, metav1.GetOptions{})
83+
if err != nil {
84+
log.Fatalf(`Unknown Deployment %s@%s`, opt.AppName, opt.Namespace)
85+
}
86+
}
87+
case "ReplicaSets", "ReplicaSet", "replicasets", "replicaset", "rs":
88+
opt.AppKind = "ReplicaSet"
89+
opt.SmartPrefix = ""
90+
_, err := kubeClient.ExtensionsV1beta1().ReplicaSets(opt.Namespace).Get(opt.AppName, metav1.GetOptions{})
91+
if err != nil {
92+
log.Fatalf(`Unknown ReplicaSet %s@%s`, opt.AppName, opt.Namespace)
93+
}
94+
case "ReplicationControllers", "ReplicationController", "replicationcontrollers", "replicationcontroller", "rc":
95+
opt.AppKind = "ReplicationController"
96+
opt.SmartPrefix = ""
97+
_, err := kubeClient.CoreV1().ReplicationControllers(opt.Namespace).Get(opt.AppName, metav1.GetOptions{})
98+
if err != nil {
99+
log.Fatalf(`Unknown ReplicationController %s@%s`, opt.AppName, opt.Namespace)
100+
}
101+
case "StatefulSets", "StatefulSet", "ss":
102+
opt.AppKind = "StatefulSet"
103+
opt.SmartPrefix = opt.PodName
104+
_, err := kubeClient.AppsV1beta1().StatefulSets(opt.Namespace).Get(opt.AppName, metav1.GetOptions{})
105+
if err != nil {
106+
log.Fatalf(`Unknown StatefulSet %s@%s`, opt.AppName, opt.Namespace)
107+
}
108+
case "DaemonSets", "DaemonSet", "daemonsets", "daemonset":
109+
opt.AppKind = "DaemonSet"
110+
opt.SmartPrefix = opt.NodeName
111+
_, err := kubeClient.ExtensionsV1beta1().DaemonSets(opt.Namespace).Get(opt.AppName, metav1.GetOptions{})
112+
if err != nil {
113+
log.Fatalf(`Unknown DaemonSet %s@%s`, opt.AppName, opt.Namespace)
114+
}
115+
default:
116+
log.Fatalf(`Unrecognized workload "Kind" %v`, opt.AppKind)
117+
}
118+
52119
opt.ScratchDir = strings.TrimSuffix(opt.ScratchDir, "/")
53120
err = os.MkdirAll(opt.ScratchDir, 0755)
54121
if err != nil {
@@ -59,10 +126,7 @@ func NewCmdSchedule(version string) *cobra.Command {
59126
log.Fatalf("No write access in scratch dir: %s", err)
60127
}
61128

62-
ctrl, err := scheduler.New(kubeClient, stashClient, opt)
63-
if err != nil {
64-
log.Fatalf("Failed to create scheduler: %s", err)
65-
}
129+
ctrl := scheduler.New(kubeClient, stashClient, opt)
66130
err = ctrl.Setup()
67131
if err != nil {
68132
log.Fatalf("Failed to setup scheduler: %s", err)
@@ -72,15 +136,24 @@ func NewCmdSchedule(version string) *cobra.Command {
72136
}
73137
cmd.Flags().StringVar(&masterURL, "master", masterURL, "The address of the Kubernetes API server (overrides any value in kubeconfig)")
74138
cmd.Flags().StringVar(&kubeconfigPath, "kubeconfig", kubeconfigPath, "Path to kubeconfig file with authorization information (the master location is set by the master flag).")
75-
cmd.Flags().StringVar(&opt.App, "app", opt.App, "Name of app where sidecar pod is added")
76-
cmd.Flags().StringVar(&opt.ResourceNamespace, "namespace", opt.ResourceNamespace, "The address of the Kubernetes API server (overrides any value in kubeconfig)")
77-
cmd.Flags().StringVar(&opt.ResourceName, "name", opt.ResourceName, "Path to kubeconfig file with authorization information (the master location is set by the master flag).")
78-
cmd.Flags().BoolVar(&opt.PrefixHostname, "prefix-hostname", opt.PrefixHostname, "If set, adds Hostname as prefix to repository. This should be true for StatefulSets & DaemonSets. This should be false in all other cases.")
139+
cmd.Flags().StringVar(&workload, "workload", workload, `"Kind/Name" of workload where sidecar pod is added (eg, Deployment/apiserver)`)
140+
cmd.Flags().StringVar(&opt.ResticName, "restic-name", opt.ResticName, "Path to kubeconfig file with authorization information (the master location is set by the master flag).")
79141
cmd.Flags().StringVar(&opt.ScratchDir, "scratch-dir", opt.ScratchDir, "Directory used to store temporary files. Use an `emptyDir` in Kubernetes.")
80142
cmd.Flags().StringVar(&opt.PushgatewayURL, "pushgateway-url", opt.PushgatewayURL, "URL of Prometheus pushgateway used to cache backup metrics")
81-
cmd.Flags().StringVar(&opt.PodLabelsPath, "pod-labels-path", opt.PodLabelsPath, "Path to pod labels file mounted via Kubernetes Downward api")
82143

83144
// Analytics flags
84145
cmd.Flags().BoolVar(&enableAnalytics, "analytics", enableAnalytics, "Send analytical events to Google Analytics")
85146
return cmd
86147
}
148+
149+
func namespace() string {
150+
if ns := os.Getenv("OPERATOR_NAMESPACE"); ns != "" {
151+
return ns
152+
}
153+
if data, err := ioutil.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/namespace"); err == nil {
154+
if ns := strings.TrimSpace(string(data)); len(ns) > 0 {
155+
return ns
156+
}
157+
}
158+
return metav1.NamespaceDefault
159+
}

snapshot_handler.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ import (
1414
)
1515

1616
const (
17-
PathParamNamespace = ":namespace"
18-
PathParamName = ":name"
19-
QueryParamHostname = "hostname"
17+
PathParamNamespace = ":namespace"
18+
PathParamName = ":name"
19+
QueryParamAutoPrefix = "autoPrefix"
2020
)
2121

2222
func ExportSnapshots(w http.ResponseWriter, r *http.Request) {
@@ -35,8 +35,7 @@ func ExportSnapshots(w http.ResponseWriter, r *http.Request) {
3535
http.Error(w, "Missing parameter:"+PathParamName, http.StatusBadRequest)
3636
return
3737
}
38-
hostname := r.URL.Query().Get(QueryParamHostname)
39-
resticCLI := cli.New(scratchDir, hostname)
38+
resticCLI := cli.New(scratchDir)
4039

4140
var resource *sapi.Restic
4241
resource, err := stashClient.Restics(namespace).Get(name)
@@ -61,7 +60,7 @@ func ExportSnapshots(w http.ResponseWriter, r *http.Request) {
6160
http.Error(w, err.Error(), http.StatusInternalServerError)
6261
return
6362
}
64-
err = resticCLI.SetupEnv(resource, secret)
63+
err = resticCLI.SetupEnv(resource, secret, r.URL.Query().Get(QueryParamAutoPrefix))
6564
if err != nil {
6665
http.Error(w, err.Error(), http.StatusInternalServerError)
6766
return

0 commit comments

Comments
 (0)