diff --git a/generate_testdata.sh b/generate_testdata.sh index 53bf8bd68ee..9b7b8d4436c 100755 --- a/generate_testdata.sh +++ b/generate_testdata.sh @@ -59,6 +59,7 @@ scaffold_test_project() { if [ $project == "project-v2" ] || [ $project == "project-v3" ]; then header_text 'Creating APIs ...' $kb create api --group crew --version v1 --kind Captain --controller=true --resource=true --make=false + $kb create api --group crew --version v1 --kind Captain --controller=true --resource=true --make=false --force $kb create webhook --group crew --version v1 --kind Captain --defaulting --programmatic-validation $kb create api --group crew --version v1 --kind FirstMate --controller=true --resource=true --make=false $kb create webhook --group crew --version v1 --kind FirstMate --conversion diff --git a/pkg/plugins/golang/v2/api.go b/pkg/plugins/golang/v2/api.go index 14c2e641c6f..a462883e037 100644 --- a/pkg/plugins/golang/v2/api.go +++ b/pkg/plugins/golang/v2/api.go @@ -177,7 +177,7 @@ func (p *createAPISubcommand) GetScaffolder() (cmdutil.Scaffolder, error) { // Create the actual resource from the resource options res := p.resource.NewResource(p.config, p.doResource) - return scaffolds.NewAPIScaffolder(p.config, string(bp), res, p.doResource, p.doController, plugins), nil + return scaffolds.NewAPIScaffolder(p.config, string(bp), res, p.doResource, p.doController, p.force, plugins), nil } func (p *createAPISubcommand) PostScaffold() error { diff --git a/pkg/plugins/golang/v2/scaffolds/api.go b/pkg/plugins/golang/v2/scaffolds/api.go index 7f3ce7c7955..503dff52139 100644 --- a/pkg/plugins/golang/v2/scaffolds/api.go +++ b/pkg/plugins/golang/v2/scaffolds/api.go @@ -51,6 +51,8 @@ type apiScaffolder struct { doResource bool // doController indicates whether to scaffold controller files or not doController bool + + force bool } // NewAPIScaffolder returns a new Scaffolder for API/controller creation operations @@ -58,7 +60,7 @@ func NewAPIScaffolder( config *config.Config, boilerplate string, res *resource.Resource, - doResource, doController bool, + doResource, doController, force bool, plugins []model.Plugin, ) cmdutil.Scaffolder { return &apiScaffolder{ @@ -68,6 +70,7 @@ func NewAPIScaffolder( plugins: plugins, doResource: doResource, doController: doController, + force: force, } } @@ -97,9 +100,9 @@ func (s *apiScaffolder) scaffold() error { if err := machinery.NewScaffold(s.plugins...).Execute( s.newUniverse(), - &api.Types{}, + &api.Types{Force: s.force}, &api.Group{}, - &samples.CRDSample{}, + &samples.CRDSample{Force: s.force}, &rbac.CRDEditorRole{}, &rbac.CRDViewerRole{}, &patches.EnableWebhookPatch{}, @@ -121,8 +124,8 @@ func (s *apiScaffolder) scaffold() error { if s.doController { if err := machinery.NewScaffold(s.plugins...).Execute( s.newUniverse(), - &controllers.SuiteTest{WireResource: s.doResource}, - &controllers.Controller{WireResource: s.doResource}, + &controllers.SuiteTest{WireResource: s.doResource, Force: s.force}, + &controllers.Controller{WireResource: s.doResource, Force: s.force}, ); err != nil { return fmt.Errorf("error scaffolding controller: %v", err) } diff --git a/pkg/plugins/golang/v2/scaffolds/internal/templates/api/types.go b/pkg/plugins/golang/v2/scaffolds/internal/templates/api/types.go index 50b0d1ae2b8..582a36331f1 100644 --- a/pkg/plugins/golang/v2/scaffolds/internal/templates/api/types.go +++ b/pkg/plugins/golang/v2/scaffolds/internal/templates/api/types.go @@ -26,11 +26,14 @@ import ( var _ file.Template = &Types{} // Types scaffolds the file that defines the schema for a CRD +// nolint:maligned type Types struct { file.TemplateMixin file.MultiGroupMixin file.BoilerplateMixin file.ResourceMixin + + Force bool } // SetTemplateDefaults implements file.Template @@ -47,7 +50,11 @@ func (f *Types) SetTemplateDefaults() error { f.TemplateBody = typesTemplate - f.IfExistsAction = file.Error + if f.Force { + f.IfExistsAction = file.Overwrite + } else { + f.IfExistsAction = file.Error + } return nil } diff --git a/pkg/plugins/golang/v2/scaffolds/internal/templates/config/samples/crd_sample.go b/pkg/plugins/golang/v2/scaffolds/internal/templates/config/samples/crd_sample.go index 6da355b4eff..0cb4f4f131d 100644 --- a/pkg/plugins/golang/v2/scaffolds/internal/templates/config/samples/crd_sample.go +++ b/pkg/plugins/golang/v2/scaffolds/internal/templates/config/samples/crd_sample.go @@ -28,6 +28,8 @@ var _ file.Template = &CRDSample{} type CRDSample struct { file.TemplateMixin file.ResourceMixin + + Force bool } // SetTemplateDefaults implements file.Template @@ -37,7 +39,11 @@ func (f *CRDSample) SetTemplateDefaults() error { } f.Path = f.Resource.Replacer().Replace(f.Path) - f.IfExistsAction = file.Error + if f.Force { + f.IfExistsAction = file.Overwrite + } else { + f.IfExistsAction = file.Error + } f.TemplateBody = crdSampleTemplate diff --git a/pkg/plugins/golang/v2/scaffolds/internal/templates/controllers/controller.go b/pkg/plugins/golang/v2/scaffolds/internal/templates/controllers/controller.go index 2ad47a1d6cc..9ed5d102375 100644 --- a/pkg/plugins/golang/v2/scaffolds/internal/templates/controllers/controller.go +++ b/pkg/plugins/golang/v2/scaffolds/internal/templates/controllers/controller.go @@ -35,6 +35,8 @@ type Controller struct { // WireResource defines the api resources are generated or not. WireResource bool + + Force bool } // SetTemplateDefaults implements file.Template @@ -51,7 +53,11 @@ func (f *Controller) SetTemplateDefaults() error { f.TemplateBody = controllerTemplate - f.IfExistsAction = file.Error + if f.Force { + f.IfExistsAction = file.Overwrite + } else { + f.IfExistsAction = file.Error + } return nil } diff --git a/pkg/plugins/golang/v2/scaffolds/internal/templates/controllers/controller_suitetest.go b/pkg/plugins/golang/v2/scaffolds/internal/templates/controllers/controller_suitetest.go index 35a289f6ecd..b60188ea1c3 100644 --- a/pkg/plugins/golang/v2/scaffolds/internal/templates/controllers/controller_suitetest.go +++ b/pkg/plugins/golang/v2/scaffolds/internal/templates/controllers/controller_suitetest.go @@ -39,6 +39,8 @@ type SuiteTest struct { // WireResource defines the api resources are generated or not. WireResource bool + + Force bool } // SetTemplateDefaults implements file.Template @@ -64,6 +66,10 @@ func (f *SuiteTest) SetTemplateDefaults() error { f.CRDDirectoryRelativePath = `"..", ".."` } + if f.Force { + f.IfExistsAction = file.Overwrite + } + return nil } diff --git a/pkg/plugins/golang/v3/api.go b/pkg/plugins/golang/v3/api.go index c444a9b54e0..f808ebbf49f 100644 --- a/pkg/plugins/golang/v3/api.go +++ b/pkg/plugins/golang/v3/api.go @@ -210,7 +210,7 @@ func (p *createAPISubcommand) GetScaffolder() (cmdutil.Scaffolder, error) { // Create the actual resource from the resource options res := p.resource.NewResource(p.config, p.doResource) - return scaffolds.NewAPIScaffolder(p.config, string(bp), res, p.doResource, p.doController, plugins), nil + return scaffolds.NewAPIScaffolder(p.config, string(bp), res, p.doResource, p.doController, p.force, plugins), nil } func (p *createAPISubcommand) PostScaffold() error { diff --git a/pkg/plugins/golang/v3/scaffolds/api.go b/pkg/plugins/golang/v3/scaffolds/api.go index 3120c06ec5f..3df0f549022 100644 --- a/pkg/plugins/golang/v3/scaffolds/api.go +++ b/pkg/plugins/golang/v3/scaffolds/api.go @@ -47,6 +47,8 @@ type apiScaffolder struct { doResource bool // doController indicates whether to scaffold controller files or not doController bool + // force indicates whether to scaffold controller files even if it exists or not + force bool } // NewAPIScaffolder returns a new Scaffolder for API/controller creation operations @@ -54,7 +56,7 @@ func NewAPIScaffolder( config *config.Config, boilerplate string, res *resource.Resource, - doResource, doController bool, + doResource, doController, force bool, plugins []model.Plugin, ) cmdutil.Scaffolder { return &apiScaffolder{ @@ -64,6 +66,7 @@ func NewAPIScaffolder( plugins: plugins, doResource: doResource, doController: doController, + force: force, } } @@ -89,9 +92,9 @@ func (s *apiScaffolder) scaffold() error { if err := machinery.NewScaffold(s.plugins...).Execute( s.newUniverse(), - &api.Types{}, + &api.Types{Force: s.force}, &api.Group{}, - &samples.CRDSample{}, + &samples.CRDSample{Force: s.force}, &rbac.CRDEditorRole{}, &rbac.CRDViewerRole{}, &patches.EnableWebhookPatch{CRDVersion: s.resource.CRDVersion}, @@ -113,8 +116,9 @@ func (s *apiScaffolder) scaffold() error { if s.doController { if err := machinery.NewScaffold(s.plugins...).Execute( s.newUniverse(), - &controllers.SuiteTest{WireResource: s.doResource}, - &controllers.Controller{ControllerRuntimeVersion: ControllerRuntimeVersion, WireResource: s.doResource}, + &controllers.SuiteTest{WireResource: s.doResource, Force: s.force}, + &controllers.Controller{ControllerRuntimeVersion: ControllerRuntimeVersion, WireResource: s.doResource, + Force: s.force}, ); err != nil { return fmt.Errorf("error scaffolding controller: %v", err) } diff --git a/pkg/plugins/golang/v3/scaffolds/internal/templates/api/types.go b/pkg/plugins/golang/v3/scaffolds/internal/templates/api/types.go index bcb7baaa408..403e2285dcb 100644 --- a/pkg/plugins/golang/v3/scaffolds/internal/templates/api/types.go +++ b/pkg/plugins/golang/v3/scaffolds/internal/templates/api/types.go @@ -26,11 +26,14 @@ import ( var _ file.Template = &Types{} // Types scaffolds the file that defines the schema for a CRD +// nolint:maligned type Types struct { file.TemplateMixin file.MultiGroupMixin file.BoilerplateMixin file.ResourceMixin + + Force bool } // SetTemplateDefaults implements file.Template @@ -51,7 +54,11 @@ func (f *Types) SetTemplateDefaults() error { f.TemplateBody = typesTemplate - f.IfExistsAction = file.Error + if f.Force { + f.IfExistsAction = file.Overwrite + } else { + f.IfExistsAction = file.Error + } return nil } diff --git a/pkg/plugins/golang/v3/scaffolds/internal/templates/config/samples/crd_sample.go b/pkg/plugins/golang/v3/scaffolds/internal/templates/config/samples/crd_sample.go index c80f04a3f01..0e967378981 100644 --- a/pkg/plugins/golang/v3/scaffolds/internal/templates/config/samples/crd_sample.go +++ b/pkg/plugins/golang/v3/scaffolds/internal/templates/config/samples/crd_sample.go @@ -28,6 +28,8 @@ var _ file.Template = &CRDSample{} type CRDSample struct { file.TemplateMixin file.ResourceMixin + + Force bool } // SetTemplateDefaults implements file.Template @@ -37,7 +39,11 @@ func (f *CRDSample) SetTemplateDefaults() error { } f.Path = f.Resource.Replacer().Replace(f.Path) - f.IfExistsAction = file.Error + if f.Force { + f.IfExistsAction = file.Overwrite + } else { + f.IfExistsAction = file.Error + } f.TemplateBody = crdSampleTemplate diff --git a/pkg/plugins/golang/v3/scaffolds/internal/templates/controllers/controller.go b/pkg/plugins/golang/v3/scaffolds/internal/templates/controllers/controller.go index 997042586f2..037ceaf921a 100644 --- a/pkg/plugins/golang/v3/scaffolds/internal/templates/controllers/controller.go +++ b/pkg/plugins/golang/v3/scaffolds/internal/templates/controllers/controller.go @@ -37,6 +37,8 @@ type Controller struct { // WireResource defines the api resources are generated or not. WireResource bool + + Force bool } // SetTemplateDefaults implements file.Template @@ -53,7 +55,11 @@ func (f *Controller) SetTemplateDefaults() error { f.TemplateBody = controllerTemplate - f.IfExistsAction = file.Error + if f.Force { + f.IfExistsAction = file.Overwrite + } else { + f.IfExistsAction = file.Error + } return nil } diff --git a/pkg/plugins/golang/v3/scaffolds/internal/templates/controllers/controller_suitetest.go b/pkg/plugins/golang/v3/scaffolds/internal/templates/controllers/controller_suitetest.go index 2ac30c809e3..48e64f0f973 100644 --- a/pkg/plugins/golang/v3/scaffolds/internal/templates/controllers/controller_suitetest.go +++ b/pkg/plugins/golang/v3/scaffolds/internal/templates/controllers/controller_suitetest.go @@ -39,6 +39,8 @@ type SuiteTest struct { // WireResource defines the api resources are generated or not. WireResource bool + + Force bool } // SetTemplateDefaults implements file.Template @@ -64,6 +66,10 @@ func (f *SuiteTest) SetTemplateDefaults() error { f.CRDDirectoryRelativePath = `"..", ".."` } + if f.Force { + f.IfExistsAction = file.Overwrite + } + return nil } diff --git a/testdata/project-v2/main.go b/testdata/project-v2/main.go index 221471f570d..ce9c0afb951 100644 --- a/testdata/project-v2/main.go +++ b/testdata/project-v2/main.go @@ -67,6 +67,14 @@ func main() { os.Exit(1) } + if err = (&controllers.CaptainReconciler{ + Client: mgr.GetClient(), + Log: ctrl.Log.WithName("controllers").WithName("Captain"), + Scheme: mgr.GetScheme(), + }).SetupWithManager(mgr); err != nil { + setupLog.Error(err, "unable to create controller", "controller", "Captain") + os.Exit(1) + } if err = (&controllers.CaptainReconciler{ Client: mgr.GetClient(), Log: ctrl.Log.WithName("controllers").WithName("Captain"), diff --git a/testdata/project-v3/main.go b/testdata/project-v3/main.go index 4488ab146e8..50efccfb5a6 100644 --- a/testdata/project-v3/main.go +++ b/testdata/project-v3/main.go @@ -75,6 +75,14 @@ func main() { os.Exit(1) } + if err = (&controllers.CaptainReconciler{ + Client: mgr.GetClient(), + Log: ctrl.Log.WithName("controllers").WithName("Captain"), + Scheme: mgr.GetScheme(), + }).SetupWithManager(mgr); err != nil { + setupLog.Error(err, "unable to create controller", "controller", "Captain") + os.Exit(1) + } if err = (&controllers.CaptainReconciler{ Client: mgr.GetClient(), Log: ctrl.Log.WithName("controllers").WithName("Captain"),