...

Source file src/github.com/kvaps/dnsmasq-controller/main.go

Documentation: github.com/kvaps/dnsmasq-controller

     1  /*
     2  
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    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  	// +kubebuilder:scaffold:imports
    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  	// +kubebuilder:scaffold:scheme
    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  	// +kubebuilder:scaffold:builder
   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