1
16
17 package main
18
19 import (
20 "flag"
21 "os"
22
23 "go.uber.org/zap"
24 "k8s.io/apimachinery/pkg/runtime"
25 clientgoscheme "k8s.io/client-go/kubernetes/scheme"
26 _ "k8s.io/client-go/plugin/pkg/client/auth"
27 "k8s.io/client-go/tools/clientcmd"
28 ctrl "sigs.k8s.io/controller-runtime"
29 logrzap "sigs.k8s.io/controller-runtime/pkg/log/zap"
30
31 dnsmasqv1beta1 "github.com/kvaps/dnsmasq-controller/api/v1beta1"
32 "github.com/kvaps/dnsmasq-controller/controllers"
33 "github.com/kvaps/dnsmasq-controller/pkg/conf"
34 "github.com/kvaps/dnsmasq-controller/pkg/server"
35
36 )
37
38 var (
39 scheme = runtime.NewScheme()
40 setupLog = ctrl.Log.WithName("setup")
41 )
42
43 func init() {
44 _ = clientgoscheme.AddToScheme(scheme)
45
46 _ = dnsmasqv1beta1.AddToScheme(scheme)
47
48 }
49
50 func main() {
51 config := conf.GetConfig()
52 flag.StringVar(&config.WatchNamespace, "watch-namespace", "", "Namespace the controller watches for updates to Kubernetes objects."+
53 " All namespaces are watched if this parameter is left empty.")
54 flag.StringVar(&config.ControllerName, "controller", "", "Name of the controller this controller satisfies.")
55 flag.StringVar(&config.MetricsAddr, "metrics-addr", ":8080", "The address the metric endpoint binds to.")
56 flag.BoolVar(&config.EnableDNS, "dns", false, "Enable DNS Service and configuration discovery.")
57 flag.BoolVar(&config.EnableDHCP, "dhcp", false, "Enable DHCP Service and configuration discovery.")
58 flag.BoolVar(&config.EnableLeaderElection, "enable-leader-election", false,
59 "Enable leader election for controller manager. "+
60 "Enabling this will ensure there is only one active controller manager.")
61 flag.IntVar(&config.SyncDelay, "sync-delay", 1, "Time in seconds to syncronise dnsmasq configuration.")
62 flag.StringVar(&config.DnsmasqConfDir, "conf-dir", "/etc/dnsmasq.d", "Dnsmasq config directory for write configuration to.")
63 flag.StringVar(&config.LogLevel, "log-level", "info", "The log level used by the operator.")
64 flag.BoolVar(&config.Development, "development", false, "Run the controller in development mode.")
65 flag.BoolVar(&config.CleanupDir, "cleanup", false, "Cleanup dnsmasq config directory before start.")
66
67 flag.Parse()
68 config.DnsmasqOptions = flag.Args()
69
70 ctrl.SetLogger(logrzap.New(func(o *logrzap.Options) {
71 o.Development = config.Development
72
73 if o.Development == false {
74 lev := zap.NewAtomicLevel()
75 (&lev).UnmarshalText([]byte(config.LogLevel))
76 o.Level = &lev
77 }
78 }))
79
80 kubeconfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(
81 clientcmd.NewDefaultClientConfigLoadingRules(),
82 &clientcmd.ConfigOverrides{},
83 )
84
85 var err error
86 config.MyNamespace, _, err = kubeconfig.Namespace()
87 if err != nil {
88 setupLog.Error(err, "Failed to get watch namespace")
89 os.Exit(1)
90 }
91
92 if config.ControllerName == "" {
93 config.LeaderElectionID = "dnsmasq-controller-leader"
94 } else {
95 config.LeaderElectionID = config.ControllerName + "-dnsmasq-controller-leader"
96 }
97
98 server.Start()
99
100 mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
101 Scheme: scheme,
102 Namespace: config.WatchNamespace,
103 MetricsBindAddress: config.MetricsAddr,
104 Port: 9443,
105 LeaderElection: config.EnableLeaderElection,
106 LeaderElectionID: config.LeaderElectionID,
107 LeaderElectionNamespace: config.MyNamespace,
108 })
109 if err != nil {
110 setupLog.Error(err, "unable to start manager")
111 os.Exit(1)
112 }
113
114 if err = (&controllers.DnsmasqOptionsReconciler{
115 Client: mgr.GetClient(),
116 Log: ctrl.Log.WithName("controllers").WithName("DnsmasqOptions"),
117 Scheme: mgr.GetScheme(),
118 }).SetupWithManager(mgr); err != nil {
119 setupLog.Error(err, "unable to create controller", "controller", "DnsmasqOptions")
120 os.Exit(1)
121 }
122 if config.EnableDNS {
123 if err = (&controllers.DnsHostsReconciler{
124 Client: mgr.GetClient(),
125 Log: ctrl.Log.WithName("controllers").WithName("DnsHosts"),
126 Scheme: mgr.GetScheme(),
127 }).SetupWithManager(mgr); err != nil {
128 setupLog.Error(err, "unable to create controller", "controller", "DnsHosts")
129 os.Exit(1)
130 }
131 }
132 if config.EnableDHCP {
133 if err = (&controllers.DhcpHostsReconciler{
134 Client: mgr.GetClient(),
135 Log: ctrl.Log.WithName("controllers").WithName("DhcpHosts"),
136 Scheme: mgr.GetScheme(),
137 }).SetupWithManager(mgr); err != nil {
138 setupLog.Error(err, "unable to create controller", "controller", "DhcpHosts")
139 os.Exit(1)
140 }
141 if err = (&controllers.DhcpOptionsReconciler{
142 Client: mgr.GetClient(),
143 Log: ctrl.Log.WithName("controllers").WithName("DhcpOptions"),
144 Scheme: mgr.GetScheme(),
145 }).SetupWithManager(mgr); err != nil {
146 setupLog.Error(err, "unable to create controller", "controller", "DhcpOptions")
147 os.Exit(1)
148 }
149 }
150
151
152
153 setupLog.Info("starting manager")
154 if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
155 setupLog.Error(err, "problem running manager")
156 os.Exit(1)
157 }
158 }
159
View as plain text