Skip to content

Commit 7cb52b2

Browse files
authored
Merge admission webhook and operator into one binary (#329)
1 parent 3306427 commit 7cb52b2

File tree

5 files changed

+188
-193
lines changed

5 files changed

+188
-193
lines changed

apiserver.go

Lines changed: 0 additions & 113 deletions
This file was deleted.

root.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,11 @@ func NewRootCmd() *cobra.Command {
5050
rootCmd.PersistentFlags().BoolVar(&util.EnableAnalytics, "analytics", util.EnableAnalytics, "Send analytical events to Google Analytics")
5151

5252
rootCmd.AddCommand(v.NewCmdVersion())
53-
rootCmd.AddCommand(NewCmdRun())
53+
stopCh := genericapiserver.SetupSignalHandler()
54+
rootCmd.AddCommand(NewCmdRun(os.Stdout, os.Stderr, stopCh))
5455
rootCmd.AddCommand(NewCmdBackup())
5556
rootCmd.AddCommand(NewCmdRecover())
5657
rootCmd.AddCommand(NewCmdCheck())
5758

58-
stopCh := genericapiserver.SetupSignalHandler()
59-
cmd := NewCommandStartAPIServer(os.Stdout, os.Stderr, stopCh)
60-
rootCmd.AddCommand(cmd)
61-
6259
return rootCmd
6360
}

run.go

Lines changed: 17 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,97 +1,39 @@
11
package cmds
22

33
import (
4-
"fmt"
5-
"net/http"
6-
"time"
4+
"io"
75

86
"github.com/appscode/go/log"
9-
stringz "github.com/appscode/go/strings"
107
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"
189
"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"
2210
)
2311

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)
3814

3915
cmd := &cobra.Command{
4016
Use: "run",
41-
Short: "Run Stash operator",
17+
Short: "Launch Stash Controller",
18+
Long: "Launch Stash Controller",
4219
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)
5122

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
5625
}
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
6228
}
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
7931
}
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
8533
},
8634
}
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())
9537

9638
return cmd
9739
}

server/options.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package server
2+
3+
import (
4+
"fmt"
5+
"time"
6+
7+
stringz "github.com/appscode/go/strings"
8+
v "github.com/appscode/go/version"
9+
"github.com/appscode/kutil/discovery"
10+
cs "github.com/appscode/stash/client"
11+
hookapi "github.com/appscode/stash/pkg/admission/api"
12+
"github.com/appscode/stash/pkg/admission/plugin"
13+
"github.com/appscode/stash/pkg/controller"
14+
"github.com/appscode/stash/pkg/docker"
15+
"github.com/spf13/pflag"
16+
crd_cs "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1"
17+
"k8s.io/client-go/kubernetes"
18+
)
19+
20+
type ControllerOptions struct {
21+
EnableRBAC bool
22+
StashImageTag string
23+
DockerRegistry string
24+
MaxNumRequeues int
25+
NumThreads int
26+
ScratchDir string
27+
OpsAddress string
28+
ResyncPeriod time.Duration
29+
}
30+
31+
func NewControllerOptions() *ControllerOptions {
32+
return &ControllerOptions{
33+
DockerRegistry: docker.ACRegistry,
34+
StashImageTag: stringz.Val(v.Version.Version, "canary"),
35+
MaxNumRequeues: 5,
36+
NumThreads: 2,
37+
ScratchDir: "/tmp",
38+
OpsAddress: ":56790",
39+
ResyncPeriod: 10 * time.Minute,
40+
}
41+
}
42+
43+
func (s *ControllerOptions) AddFlags(fs *pflag.FlagSet) {
44+
fs.StringVar(&s.OpsAddress, "ops-address", s.OpsAddress, "Address to listen on for web interface and telemetry.")
45+
fs.BoolVar(&s.EnableRBAC, "rbac", s.EnableRBAC, "Enable RBAC for operator")
46+
fs.StringVar(&s.ScratchDir, "scratch-dir", s.ScratchDir, "Directory used to store temporary files. Use an `emptyDir` in Kubernetes.")
47+
fs.StringVar(&s.StashImageTag, "image-tag", s.StashImageTag, "Image tag for sidecar, init-container, check-job and recovery-job")
48+
fs.StringVar(&s.DockerRegistry, "docker-registry", s.DockerRegistry, "Docker image registry for sidecar, init-container, check-job, recovery-job and kubectl-job")
49+
fs.DurationVar(&s.ResyncPeriod, "resync-period", s.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.")
50+
}
51+
52+
func (s *ControllerOptions) ApplyTo(cfg *controller.ControllerConfig) error {
53+
var err error
54+
55+
cfg.EnableRBAC = s.EnableRBAC
56+
cfg.StashImageTag = s.StashImageTag
57+
cfg.DockerRegistry = s.DockerRegistry
58+
cfg.MaxNumRequeues = s.MaxNumRequeues
59+
cfg.NumThreads = s.NumThreads
60+
cfg.OpsAddress = s.OpsAddress
61+
cfg.ResyncPeriod = s.ResyncPeriod
62+
63+
if cfg.KubeClient, err = kubernetes.NewForConfig(cfg.ClientConfig); err != nil {
64+
return err
65+
}
66+
if cfg.StashClient, err = cs.NewForConfig(cfg.ClientConfig); err != nil {
67+
return err
68+
}
69+
if cfg.CRDClient, err = crd_cs.NewForConfig(cfg.ClientConfig); err != nil {
70+
return err
71+
}
72+
cfg.AdmissionHooks = []hookapi.AdmissionHook{&plugin.CRDValidator{}}
73+
74+
// get kube api server version
75+
cfg.KubectlImageTag, err = discovery.GetBaseVersion(cfg.KubeClient.Discovery())
76+
if err != nil {
77+
return fmt.Errorf("failed to detect server version, reason: %s", err)
78+
}
79+
80+
return nil
81+
}

0 commit comments

Comments
 (0)