/
main.go
113 lines (92 loc) · 3.38 KB
/
main.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
/*
Copyright 2021 The Cockroach Authors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package main
import (
"flag"
"fmt"
"os"
"github.com/cockroachdb/cockroach-operator/pkg/utilfeature"
"sigs.k8s.io/controller-runtime/pkg/log/zap"
"github.com/cockroachdb/cockroach-operator/pkg/controller"
crdbv1alpha1 "github.com/cockroachdb/cockroach-operator/apis/v1alpha1"
"k8s.io/apimachinery/pkg/runtime"
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
ctrl "sigs.k8s.io/controller-runtime"
)
const WatchNamespaceEnvVar = "WATCH_NAMESPACE"
var (
scheme = runtime.NewScheme()
setupLog = ctrl.Log.WithName("setup")
)
func init() {
_ = clientgoscheme.AddToScheme(scheme)
_ = crdbv1alpha1.AddToScheme(scheme)
}
func main() {
var metricsAddr, featureGatesString string
var enableLeaderElection bool
// use zap logging cli options
opts := zap.Options{}
opts.BindFlags(flag.CommandLine)
flag.StringVar(&metricsAddr, "metrics-addr", ":8080", "The address the metric endpoint binds to.")
flag.StringVar(&featureGatesString, "feature-gates", "", "Feature gate to enable, format is a command separated list enabling features, for instance RunAsNonRoot=false")
flag.BoolVar(&enableLeaderElection, "enable-leader-election", false,
"Enable leader election for controller manager. Enabling this will ensure there is only one active controller manager.")
flag.Parse()
// create logger using zap cli options
// for instance --zap-log-level=debug
logger := zap.New(zap.UseFlagOptions(&opts))
ctrl.SetLogger(logger)
// If features gates are passed to the command line, use it (otherwise use featureGates from configuration)
if featureGatesString != "" {
if err := utilfeature.DefaultMutableFeatureGate.Set(featureGatesString); err != nil {
setupLog.Error(err, "unable to parse feature-gates flag")
os.Exit(1)
}
}
namespace, err := GetWatchNamespace()
if err != nil {
setupLog.Error(err, "unable to get watch namespace")
os.Exit(1)
}
mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
Scheme: scheme,
Namespace: namespace,
MetricsBindAddress: metricsAddr,
LeaderElection: enableLeaderElection,
Port: 9443,
})
if err != nil {
setupLog.Error(err, "unable to start manager")
os.Exit(1)
}
reconciler := controller.InitClusterReconciler()
if err = reconciler(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "CrdbCluster")
os.Exit(1)
}
setupLog.Info("starting manager")
if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
setupLog.Error(err, "problem running manager")
os.Exit(1)
}
}
// GetWatchNamespace returns the namespace the operation should be watching for changes
func GetWatchNamespace() (string, error) {
ns, found := os.LookupEnv(WatchNamespaceEnvVar)
if !found {
return "", fmt.Errorf("%s must be set", WatchNamespaceEnvVar)
}
return ns, nil
}