@@ -27,11 +27,13 @@ import (
2727 "github.com/jaypipes/envutil"
2828 flag "github.com/spf13/pflag"
2929 "go.uber.org/zap/zapcore"
30+ "k8s.io/apimachinery/pkg/runtime/schema"
3031 ctrlrt "sigs.k8s.io/controller-runtime"
3132 "sigs.k8s.io/controller-runtime/pkg/log/zap"
3233
3334 ackv1alpha1 "github.com/aws-controllers-k8s/runtime/apis/core/v1alpha1"
3435 acktags "github.com/aws-controllers-k8s/runtime/pkg/tags"
36+ ackutil "github.com/aws-controllers-k8s/runtime/pkg/util"
3537)
3638
3739const (
@@ -211,7 +213,15 @@ func (cfg *Config) SetAWSAccountID() error {
211213}
212214
213215// Validate ensures the options are valid
214- func (cfg * Config ) Validate () error {
216+ func (cfg * Config ) Validate (options ... Option ) error {
217+ merged := mergeOptions (options )
218+ if len (merged .gvks ) > 0 {
219+ err := cfg .validateReconcileConfigResources (merged .gvks )
220+ if err != nil {
221+ return fmt .Errorf ("invalid value for flag '%s': %v" , flagReconcileResourceResyncSeconds , err )
222+ }
223+ }
224+
215225 if cfg .Region == "" {
216226 return errors .New ("unable to start service controller as AWS region is missing. Please pass --aws-region flag or set AWS_REGION environment variable" )
217227 }
@@ -257,12 +267,6 @@ func (cfg *Config) Validate() error {
257267 if cfg .ReconcileDefaultResyncSeconds < 0 {
258268 return fmt .Errorf ("invalid value for flag '%s': resync seconds default must be greater than 0" , flagReconcileDefaultResyncSeconds )
259269 }
260-
261- _ , err := cfg .ParseReconcileResourceResyncSeconds ()
262- if err != nil {
263- return fmt .Errorf ("invalid value for flag '%s': %v" , flagReconcileResourceResyncSeconds , err )
264- }
265-
266270 return nil
267271}
268272
@@ -275,6 +279,28 @@ func (cfg *Config) checkUnsafeEndpoint(endpoint *url.URL) error {
275279 return nil
276280}
277281
282+ // validateReconcileConfigResources validates the --reconcile-resource-resync-seconds flag
283+ // by checking the resource names and their corresponding duration.
284+ func (cfg * Config ) validateReconcileConfigResources (supportedGVKs []schema.GroupVersionKind ) error {
285+ validResourceNames := []string {}
286+ for _ , gvk := range supportedGVKs {
287+ validResourceNames = append (validResourceNames , gvk .Kind )
288+ }
289+ for _ , resourceResyncSecondsFlag := range cfg .ReconcileResourceResyncSeconds {
290+ resourceName , _ , err := parseReconcileFlagArgument (resourceResyncSecondsFlag )
291+ if err != nil {
292+ return fmt .Errorf ("error parsing flag argument '%v': %v. Expected format: resource=seconds" , resourceResyncSecondsFlag , err )
293+ }
294+ if ! ackutil .InStrings (resourceName , validResourceNames ) {
295+ return fmt .Errorf (
296+ "error parsing flag argument '%v': resource '%v' is not managed by this controller. Expected one of %v" ,
297+ resourceResyncSecondsFlag , resourceName , strings .Join (validResourceNames , ", " ),
298+ )
299+ }
300+ }
301+ return nil
302+ }
303+
278304// ParseReconcileResourceResyncSeconds parses the values of the --reconcile-resource-resync-seconds
279305// flag and returns a map that maps resource names to resync periods.
280306// The flag arguments are expected to have the format "resource=seconds", where "resource" is the
@@ -284,10 +310,7 @@ func (cfg *Config) ParseReconcileResourceResyncSeconds() (map[string]time.Durati
284310 resourceResyncPeriods := make (map [string ]time.Duration , len (cfg .ReconcileResourceResyncSeconds ))
285311 for _ , resourceResyncSecondsFlag := range cfg .ReconcileResourceResyncSeconds {
286312 // Parse the resource name and resync period from the flag argument
287- resourceName , resyncSeconds , err := parseReconcileFlagArgument (resourceResyncSecondsFlag )
288- if err != nil {
289- return nil , fmt .Errorf ("error parsing flag argument '%v': %v. Expected format: resource=seconds" , resourceResyncSecondsFlag , err )
290- }
313+ resourceName , resyncSeconds , _ := parseReconcileFlagArgument (resourceResyncSecondsFlag )
291314 resourceResyncPeriods [strings .ToLower (resourceName )] = time .Duration (resyncSeconds )
292315 }
293316 return resourceResyncPeriods , nil
0 commit comments