@@ -17,9 +17,12 @@ limitations under the License.
1717package main
1818
1919import (
20- "flag"
2120 "os"
2221
22+ "github.com/go-logr/logr"
23+ "github.com/spf13/pflag"
24+ "go.uber.org/zap/zapcore"
25+
2326 // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.)
2427 // to ensure that exec-entrypoint and run can make use of them.
2528 _ "k8s.io/client-go/plugin/pkg/client/auth"
@@ -31,8 +34,12 @@ import (
3134 "sigs.k8s.io/controller-runtime/pkg/healthz"
3235 "sigs.k8s.io/controller-runtime/pkg/log/zap"
3336
34- networkingv1alpha1 "github.com/aws/amazon-network-policy-controller-k8s/api/v1alpha1"
35- "github.com/aws/amazon-network-policy-controller-k8s/internal/controller"
37+ policyinfo "github.com/aws/amazon-network-policy-controller-k8s/api/v1alpha1"
38+ "github.com/aws/amazon-network-policy-controller-k8s/internal/controllers"
39+ "github.com/aws/amazon-network-policy-controller-k8s/pkg/config"
40+ "github.com/aws/amazon-network-policy-controller-k8s/pkg/k8s"
41+ "github.com/aws/amazon-network-policy-controller-k8s/pkg/policyendpoints"
42+ "github.com/aws/amazon-network-policy-controller-k8s/version"
3643 //+kubebuilder:scaffold:imports
3744)
3845
@@ -44,58 +51,52 @@ var (
4451func init () {
4552 utilruntime .Must (clientgoscheme .AddToScheme (scheme ))
4653
47- utilruntime .Must (networkingv1alpha1 .AddToScheme (scheme ))
54+ utilruntime .Must (policyinfo .AddToScheme (scheme ))
4855 //+kubebuilder:scaffold:scheme
4956}
5057
5158func main () {
52- var metricsAddr string
53- var enableLeaderElection bool
54- var probeAddr string
55- flag . StringVar ( & metricsAddr , "metrics-bind-address " , ":8080" , "The address the metric endpoint binds to." )
56- flag . StringVar ( & probeAddr , "health-probe-bind-address " , ":8081" , "The address the probe endpoint binds to." )
57- flag . BoolVar ( & enableLeaderElection , "leader-elect" , false ,
58- "Enable leader election for controller manager. " +
59- "Enabling this will ensure there is only one active controller manager." )
60- opts := zap. Options {
61- Development : true ,
59+ infoLogger := getLoggerWithLogLevel ( "info" )
60+ infoLogger . Info ( "version" ,
61+ "GitVersion" , version . GitVersion ,
62+ "GitCommit " , version . GitCommit ,
63+ "BuildDate " , version . BuildDate ,
64+ )
65+ controllerCFG , err := loadControllerConfig ()
66+ if err != nil {
67+ infoLogger . Error ( err , "unable to load controller config" )
68+ os . Exit ( 1 )
6269 }
63- opts .BindFlags (flag .CommandLine )
64- flag .Parse ()
65-
66- ctrl .SetLogger (zap .New (zap .UseFlagOptions (& opts )))
67-
68- mgr , err := ctrl .NewManager (ctrl .GetConfigOrDie (), ctrl.Options {
69- Scheme : scheme ,
70- MetricsBindAddress : metricsAddr ,
71- Port : 9443 ,
72- HealthProbeBindAddress : probeAddr ,
73- LeaderElection : enableLeaderElection ,
74- LeaderElectionID : "9d29aaa6.k8s.aws" ,
75- // LeaderElectionReleaseOnCancel defines if the leader should step down voluntarily
76- // when the Manager ends. This requires the binary to immediately end when the
77- // Manager is stopped, otherwise, this setting is unsafe. Setting this significantly
78- // speeds up voluntary leader transitions as the new leader don't have to wait
79- // LeaseDuration time first.
80- //
81- // In the default scaffold provided, the program ends immediately after
82- // the manager stops, so would be fine to enable this option. However,
83- // if you are doing or is intended to do any operation such as perform cleanups
84- // after the manager stops then its usage might be unsafe.
85- // LeaderElectionReleaseOnCancel: true,
86- })
70+ ctrlLogger := getLoggerWithLogLevel (controllerCFG .LogLevel )
71+ ctrl .SetLogger (ctrlLogger )
72+
73+ restCFG , err := config .BuildRestConfig (controllerCFG .RuntimeConfig )
8774 if err != nil {
88- setupLog .Error (err , "unable to start manager " )
75+ setupLog .Error (err , "unable to build REST config " )
8976 os .Exit (1 )
9077 }
78+ rtOpts := config .BuildRuntimeOptions (controllerCFG .RuntimeConfig , scheme )
9179
92- if err = (& controller.PolicyEndpointReconciler {
93- Client : mgr .GetClient (),
94- Scheme : mgr .GetScheme (),
95- }).SetupWithManager (mgr ); err != nil {
96- setupLog .Error (err , "unable to create controller" , "controller" , "PolicyEndpoint" )
80+ mgr , err := ctrl .NewManager (restCFG , rtOpts )
81+ if err != nil {
82+ setupLog .Error (err , "unable to create controller manager" )
9783 os .Exit (1 )
9884 }
85+ ctx := ctrl .SetupSignalHandler ()
86+ enablePolicyController := true
87+ policyEndpointsManager := policyendpoints .NewPolicyEndpointsManager (mgr .GetClient (),
88+ controllerCFG .EndpointChunkSize , ctrl .Log .WithName ("endpoints-manager" ))
89+ finalizerManager := k8s .NewDefaultFinalizerManager (mgr .GetClient (), ctrl .Log .WithName ("finalizer-manager" ))
90+ policyController := controllers .NewPolicyReconciler (mgr .GetClient (), policyEndpointsManager ,
91+ controllerCFG , finalizerManager , ctrl .Log .WithName ("controllers" ).WithName ("policy" ))
92+ if enablePolicyController {
93+ setupLog .Info ("Network Policy controller is enabled, starting watches" )
94+ if err := policyController .SetupWithManager (ctx , mgr ); err != nil {
95+ setupLog .Error (err , "unable to create controller" , "controller" , "policy" )
96+ os .Exit (1 )
97+ }
98+ }
99+
99100 //+kubebuilder:scaffold:builder
100101
101102 if err := mgr .AddHealthzCheck ("healthz" , healthz .Ping ); err != nil {
@@ -106,10 +107,41 @@ func main() {
106107 setupLog .Error (err , "unable to set up ready check" )
107108 os .Exit (1 )
108109 }
109-
110- setupLog .Info ("starting manager" )
111- if err := mgr .Start (ctrl .SetupSignalHandler ()); err != nil {
112- setupLog .Error (err , "problem running manager" )
110+ setupLog .Info ("starting controller manager" )
111+ if err := mgr .Start (ctx ); err != nil {
112+ setupLog .Error (err , "problem running controller manager" )
113113 os .Exit (1 )
114114 }
115+ setupLog .Info ("controller manager stopped" )
116+
117+ }
118+
119+ // loadControllerConfig loads the controller configuration
120+ func loadControllerConfig () (config.ControllerConfig , error ) {
121+ controllerConfig := config.ControllerConfig {}
122+ fs := pflag .NewFlagSet ("" , pflag .ExitOnError )
123+ controllerConfig .BindFlags (fs )
124+
125+ if err := fs .Parse (os .Args ); err != nil {
126+ return controllerConfig , err
127+ }
128+
129+ return controllerConfig , nil
130+ }
131+
132+ // getLoggerWithLogLevel returns logger with specific log level.
133+ func getLoggerWithLogLevel (logLevel string ) logr.Logger {
134+ var zapLevel zapcore.Level
135+ switch logLevel {
136+ case "info" :
137+ zapLevel = zapcore .InfoLevel
138+ case "debug" :
139+ zapLevel = zapcore .DebugLevel
140+ default :
141+ zapLevel = zapcore .InfoLevel
142+ }
143+ return zap .New (zap .UseDevMode (false ),
144+ zap .Level (zapLevel ),
145+ zap .StacktraceLevel (zapcore .FatalLevel ),
146+ )
115147}
0 commit comments