@@ -21,112 +21,74 @@ import (
21
21
"fmt"
22
22
"log"
23
23
"os"
24
- "os/exec"
25
- "path/filepath"
26
- "strings"
27
24
28
25
"github.com/spf13/cobra"
29
26
flag "github.com/spf13/pflag"
30
27
31
28
"sigs.k8s.io/kubebuilder/cmd/util"
32
29
"sigs.k8s.io/kubebuilder/pkg/scaffold"
33
- "sigs.k8s.io/kubebuilder/pkg/scaffold/controller"
34
- "sigs.k8s.io/kubebuilder/pkg/scaffold/input"
35
- "sigs.k8s.io/kubebuilder/pkg/scaffold/resource"
30
+ "sigs.k8s.io/kubebuilder/pkg/scaffold/v1/resource"
36
31
)
37
32
38
33
type apiOptions struct {
39
- r * resource.Resource
40
- resourceFlag , controllerFlag * flag.Flag
41
- doResource , doController , doMake bool
34
+ apiScaffolder scaffold.API
35
+ resourceFlag , controllerFlag * flag.Flag
42
36
}
43
37
44
- // APICmd represents the resource command
38
+ func (o * apiOptions ) bindCmdFlags (cmd * cobra.Command ) {
39
+ cmd .Flags ().BoolVar (& o .apiScaffolder .RunMake , "make" , true ,
40
+ "if true, run make after generating files" )
41
+ cmd .Flags ().BoolVar (& o .apiScaffolder .DoResource , "resource" , true ,
42
+ "if set, generate the resource without prompting the user" )
43
+ o .resourceFlag = cmd .Flag ("resource" )
44
+ cmd .Flags ().BoolVar (& o .apiScaffolder .DoController , "controller" , true ,
45
+ "if set, generate the controller without prompting the user" )
46
+ o .controllerFlag = cmd .Flag ("controller" )
47
+ o .apiScaffolder .Resource = resourceForFlags (cmd .Flags ())
48
+ }
49
+
50
+ // resourceForFlags registers flags for Resource fields and returns the Resource
51
+ func resourceForFlags (f * flag.FlagSet ) * resource.Resource {
52
+ r := & resource.Resource {}
53
+ f .StringVar (& r .Kind , "kind" , "" , "resource Kind" )
54
+ f .StringVar (& r .Group , "group" , "" , "resource Group" )
55
+ f .StringVar (& r .Version , "version" , "" , "resource Version" )
56
+ f .BoolVar (& r .Namespaced , "namespaced" , true , "resource is namespaced" )
57
+ f .BoolVar (& r .CreateExampleReconcileBody , "example" , true ,
58
+ "if true an example reconcile body should be written while scaffolding a resource." )
59
+ return r
60
+ }
45
61
62
+ // APICmd represents the resource command
46
63
func (o * apiOptions ) runAddAPI () {
47
64
dieIfNoProject ()
48
65
49
66
reader := bufio .NewReader (os .Stdin )
50
67
if ! o .resourceFlag .Changed {
51
68
fmt .Println ("Create Resource under pkg/apis [y/n]?" )
52
- o .doResource = util .Yesno (reader )
69
+ o .apiScaffolder . DoResource = util .Yesno (reader )
53
70
}
54
71
55
72
if ! o .controllerFlag .Changed {
56
73
fmt .Println ("Create Controller under pkg/controller [y/n]?" )
57
- o .doController = util .Yesno (reader )
74
+ o .apiScaffolder . DoController = util .Yesno (reader )
58
75
}
59
76
60
- if o .r .Group == "" {
61
- log .Fatalf ("Must specify --group" )
62
- }
63
- if o .r .Version == "" {
64
- log .Fatalf ("Must specify --version" )
65
- }
66
- if o .r .Kind == "" {
67
- log .Fatalf ("Must specify --kind" )
77
+ if err := o .apiScaffolder .Validate (); err != nil {
78
+ log .Fatalln (err )
68
79
}
69
80
70
81
fmt .Println ("Writing scaffold for you to edit..." )
71
82
72
- r := o .r
73
- if o .doResource {
74
- fmt .Println (filepath .Join ("pkg" , "apis" , r .Group , r .Version ,
75
- fmt .Sprintf ("%s_types.go" , strings .ToLower (r .Kind ))))
76
- fmt .Println (filepath .Join ("pkg" , "apis" , r .Group , r .Version ,
77
- fmt .Sprintf ("%s_types_test.go" , strings .ToLower (r .Kind ))))
78
-
79
- err := (& scaffold.Scaffold {}).Execute (input.Options {},
80
- & resource.Register {Resource : r },
81
- & resource.Types {Resource : r },
82
- & resource.VersionSuiteTest {Resource : r },
83
- & resource.TypesTest {Resource : r },
84
- & resource.Doc {Resource : r },
85
- & resource.Group {Resource : r },
86
- & resource.AddToScheme {Resource : r },
87
- & resource.CRDSample {Resource : r },
88
- )
89
- if err != nil {
90
- log .Fatal (err )
91
- }
92
- } else {
93
- // disable generation of example reconcile body if not scaffolding resource
94
- // because this could result in a fork-bomb of k8s resources where watching a
95
- // deployment, replicaset etc. results in generating deployment which
96
- // end up generating replicaset, pod etc recursively.
97
- r .CreateExampleReconcileBody = false
98
- }
99
-
100
- if o .doController {
101
- fmt .Println (filepath .Join ("pkg" , "controller" , strings .ToLower (r .Kind ),
102
- fmt .Sprintf ("%s_controller.go" , strings .ToLower (r .Kind ))))
103
- fmt .Println (filepath .Join ("pkg" , "controller" , strings .ToLower (r .Kind ),
104
- fmt .Sprintf ("%s_controller_test.go" , strings .ToLower (r .Kind ))))
105
-
106
- err := (& scaffold.Scaffold {}).Execute (input.Options {},
107
- & controller.Controller {Resource : r },
108
- & controller.AddController {Resource : r },
109
- & controller.Test {Resource : r },
110
- & controller.SuiteTest {Resource : r },
111
- )
112
- if err != nil {
113
- log .Fatal (err )
114
- }
115
- }
116
-
117
- if o .doMake {
118
- fmt .Println ("Running make..." )
119
- cm := exec .Command ("make" ) // #nosec
120
- cm .Stderr = os .Stderr
121
- cm .Stdout = os .Stdout
122
- if err := cm .Run (); err != nil {
123
- log .Fatal (err )
124
- }
83
+ if err := o .apiScaffolder .Scaffold (); err != nil {
84
+ log .Fatal (err )
125
85
}
126
86
}
127
87
128
88
func newAPICommand () * cobra.Command {
129
- o := apiOptions {}
89
+ options := apiOptions {
90
+ apiScaffolder : scaffold.API {},
91
+ }
130
92
131
93
apiCmd := & cobra.Command {
132
94
Use : "create api" ,
@@ -158,19 +120,11 @@ After the scaffold is written, api will run make on the project.
158
120
make run
159
121
` ,
160
122
Run : func (cmd * cobra.Command , args []string ) {
161
- o .runAddAPI ()
123
+ options .runAddAPI ()
162
124
},
163
125
}
164
126
165
- apiCmd .Flags ().BoolVar (& o .doMake , "make" , true ,
166
- "if true, run make after generating files" )
167
- apiCmd .Flags ().BoolVar (& o .doResource , "resource" , true ,
168
- "if set, generate the resource without prompting the user" )
169
- o .resourceFlag = apiCmd .Flag ("resource" )
170
- apiCmd .Flags ().BoolVar (& o .doController , "controller" , true ,
171
- "if set, generate the controller without prompting the user" )
172
- o .controllerFlag = apiCmd .Flag ("controller" )
173
- o .r = ResourceForFlags (apiCmd .Flags ())
127
+ options .bindCmdFlags (apiCmd )
174
128
175
129
return apiCmd
176
130
}
@@ -181,15 +135,3 @@ func dieIfNoProject() {
181
135
log .Fatalf ("Command must be run from a directory containing %s" , "PROJECT" )
182
136
}
183
137
}
184
-
185
- // ResourceForFlags registers flags for Resource fields and returns the Resource
186
- func ResourceForFlags (f * flag.FlagSet ) * resource.Resource {
187
- r := & resource.Resource {}
188
- f .StringVar (& r .Kind , "kind" , "" , "resource Kind" )
189
- f .StringVar (& r .Group , "group" , "" , "resource Group" )
190
- f .StringVar (& r .Version , "version" , "" , "resource Version" )
191
- f .BoolVar (& r .Namespaced , "namespaced" , true , "resource is namespaced" )
192
- f .BoolVar (& r .CreateExampleReconcileBody , "example" , true ,
193
- "if true an example reconcile body should be written while scaffolding a resource." )
194
- return r
195
- }
0 commit comments