|
1 | 1 | package cmds
|
2 | 2 |
|
3 | 3 | import (
|
4 |
| - "fmt" |
5 |
| - "net/http" |
6 |
| - "time" |
| 4 | + "io" |
7 | 5 |
|
8 | 6 | "github.com/appscode/go/log"
|
9 |
| - stringz "github.com/appscode/go/strings" |
10 | 7 | v "github.com/appscode/go/version"
|
11 |
| - "github.com/appscode/kutil/discovery" |
12 |
| - "github.com/appscode/pat" |
13 |
| - api "github.com/appscode/stash/apis/stash" |
14 |
| - cs "github.com/appscode/stash/client" |
15 |
| - "github.com/appscode/stash/pkg/controller" |
16 |
| - "github.com/appscode/stash/pkg/docker" |
17 |
| - "github.com/prometheus/client_golang/prometheus/promhttp" |
| 8 | + "github.com/appscode/stash/pkg/cmds/server" |
18 | 9 | "github.com/spf13/cobra"
|
19 |
| - crd_cs "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1" |
20 |
| - "k8s.io/client-go/kubernetes" |
21 |
| - "k8s.io/client-go/tools/clientcmd" |
22 | 10 | )
|
23 | 11 |
|
24 |
| -func NewCmdRun() *cobra.Command { |
25 |
| - var ( |
26 |
| - masterURL string |
27 |
| - kubeconfigPath string |
28 |
| - address = ":56790" |
29 |
| - opts = controller.Options{ |
30 |
| - DockerRegistry: docker.ACRegistry, |
31 |
| - StashImageTag: stringz.Val(v.Version.Version, "canary"), |
32 |
| - ResyncPeriod: 10 * time.Minute, |
33 |
| - MaxNumRequeues: 5, |
34 |
| - NumThreads: 2, |
35 |
| - } |
36 |
| - scratchDir = "/tmp" |
37 |
| - ) |
| 12 | +func NewCmdRun(out, errOut io.Writer, stopCh <-chan struct{}) *cobra.Command { |
| 13 | + o := server.NewStashOptions(out, errOut) |
38 | 14 |
|
39 | 15 | cmd := &cobra.Command{
|
40 | 16 | Use: "run",
|
41 |
| - Short: "Run Stash operator", |
| 17 | + Short: "Launch Stash Controller", |
| 18 | + Long: "Launch Stash Controller", |
42 | 19 | DisableAutoGenTag: true,
|
43 |
| - Run: func(cmd *cobra.Command, args []string) { |
44 |
| - config, err := clientcmd.BuildConfigFromFlags(masterURL, kubeconfigPath) |
45 |
| - if err != nil { |
46 |
| - log.Fatalln(err) |
47 |
| - } |
48 |
| - kubeClient := kubernetes.NewForConfigOrDie(config) |
49 |
| - stashClient := cs.NewForConfigOrDie(config) |
50 |
| - crdClient := crd_cs.NewForConfigOrDie(config) |
| 20 | + RunE: func(cmd *cobra.Command, args []string) error { |
| 21 | + log.Infof("Starting operator version %s+%s ...", v.Version.Version, v.Version.CommitHash) |
51 | 22 |
|
52 |
| - // get kube api server version |
53 |
| - opts.KubectlImageTag, err = discovery.GetBaseVersion(kubeClient.Discovery()) |
54 |
| - if err != nil { |
55 |
| - log.Fatalf("Failed to detect server version, reason: %s\n", err) |
| 23 | + if err := o.Complete(); err != nil { |
| 24 | + return err |
56 | 25 | }
|
57 |
| - |
58 |
| - ctrl := controller.New(kubeClient, crdClient, stashClient, opts) |
59 |
| - err = ctrl.Setup() |
60 |
| - if err != nil { |
61 |
| - log.Fatalln(err) |
| 26 | + if err := o.Validate(args); err != nil { |
| 27 | + return err |
62 | 28 | }
|
63 |
| - |
64 |
| - log.Infof("Starting operator version %s+%s ...", v.Version.Version, v.Version.CommitHash) |
65 |
| - // Now let's start the controller |
66 |
| - stop := make(chan struct{}) |
67 |
| - defer close(stop) |
68 |
| - go ctrl.Run(stop) |
69 |
| - |
70 |
| - m := pat.New() |
71 |
| - m.Get("/metrics", promhttp.Handler()) |
72 |
| - |
73 |
| - pattern := fmt.Sprintf("/%s/v1beta1/namespaces/%s/restics/%s/metrics", api.GroupName, PathParamNamespace, PathParamName) |
74 |
| - log.Infof("URL pattern: %s", pattern) |
75 |
| - exporter := &PrometheusExporter{ |
76 |
| - kubeClient: kubeClient, |
77 |
| - stashClient: stashClient.StashV1alpha1(), |
78 |
| - scratchDir: scratchDir, |
| 29 | + if err := o.Run(stopCh); err != nil { |
| 30 | + return err |
79 | 31 | }
|
80 |
| - m.Get(pattern, exporter) |
81 |
| - |
82 |
| - http.Handle("/", m) |
83 |
| - log.Infoln("Listening on", address) |
84 |
| - log.Fatal(http.ListenAndServe(address, nil)) |
| 32 | + return nil |
85 | 33 | },
|
86 | 34 | }
|
87 |
| - cmd.Flags().StringVar(&masterURL, "master", masterURL, "The address of the Kubernetes API server (overrides any value in kubeconfig)") |
88 |
| - cmd.Flags().StringVar(&kubeconfigPath, "kubeconfig", kubeconfigPath, "Path to kubeconfig file with authorization information (the master location is set by the master flag).") |
89 |
| - cmd.Flags().StringVar(&address, "address", address, "Address to listen on for web interface and telemetry.") |
90 |
| - cmd.Flags().BoolVar(&opts.EnableRBAC, "rbac", opts.EnableRBAC, "Enable RBAC for operator") |
91 |
| - cmd.Flags().StringVar(&scratchDir, "scratch-dir", scratchDir, "Directory used to store temporary files. Use an `emptyDir` in Kubernetes.") |
92 |
| - cmd.Flags().DurationVar(&opts.ResyncPeriod, "resync-period", opts.ResyncPeriod, "If non-zero, will re-list this often. Otherwise, re-list will be delayed aslong as possible (until the upstream source closes the watch or times out.") |
93 |
| - cmd.Flags().StringVar(&opts.StashImageTag, "image-tag", opts.StashImageTag, "Image tag for sidecar, init-container, check-job and recovery-job") |
94 |
| - cmd.Flags().StringVar(&opts.DockerRegistry, "docker-registry", opts.DockerRegistry, "Docker image registry for sidecar, init-container, check-job, recovery-job and kubectl-job") |
| 35 | + |
| 36 | + o.AddFlags(cmd.Flags()) |
95 | 37 |
|
96 | 38 | return cmd
|
97 | 39 | }
|
0 commit comments