1
+ /*
2
+ Copyright 2018 The Kubernetes Authors.
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 controller
18
+
19
+ import (
20
+ "fmt"
21
+ "log"
22
+ "os"
23
+
24
+ createutil "github.com/kubernetes-sigs/kubebuilder/cmd/kubebuilder/create/util"
25
+ generatecmd "github.com/kubernetes-sigs/kubebuilder/cmd/kubebuilder/generate"
26
+ "github.com/kubernetes-sigs/kubebuilder/cmd/kubebuilder/util"
27
+ "github.com/markbates/inflect"
28
+ "github.com/spf13/cobra"
29
+ "strings"
30
+ )
31
+
32
+ var nonNamespacedKind bool
33
+ var generate bool
34
+ var CoreType bool
35
+
36
+ var createControllerCmd = & cobra.Command {
37
+ Use : "controller" ,
38
+ Short : "Creates a controller for an API group, version and resource" ,
39
+ Long : `Creates a controller for an API group, version and resource.
40
+
41
+ Also creates:
42
+ - controller reconcile function
43
+ - tests for the controller
44
+ ` ,
45
+ Example : `# Create a controller for resource "Bee" in the "insect" group with version "v1beta"
46
+ kubebuilder create controller --group insect --version v1beta1 --kind Bee
47
+
48
+ # Create a controller for k8s core type "Deployment" in the "apps" group with version "v1beta2"
49
+ kubebuilder create controller --group apps --version v1beta2 --kind Deployment --core-type
50
+ ` ,
51
+ Run : RunCreateController ,
52
+ }
53
+
54
+ func AddCreateController (cmd * cobra.Command ) {
55
+ createutil .RegisterResourceFlags (createControllerCmd )
56
+ createControllerCmd .Flags ().BoolVar (& nonNamespacedKind , "non-namespaced" , false , "if set, the API kind will be non namespaced" )
57
+ createControllerCmd .Flags ().BoolVar (& generate , "generate" , true , "generate controller code" )
58
+ createControllerCmd .Flags ().BoolVar (& CoreType , "core-type" , false , "generate controller for core type" )
59
+ cmd .AddCommand (createControllerCmd )
60
+ }
61
+
62
+ func RunCreateController (cmd * cobra.Command , args []string ) {
63
+ if _ , err := os .Stat ("pkg" ); err != nil {
64
+ log .Fatalf ("could not find 'pkg' directory. must run kubebuilder init before creating controller" )
65
+ }
66
+
67
+ util .GetDomain ()
68
+ createutil .ValidateResourceFlags ()
69
+
70
+ cr := util .GetCopyright (createutil .Copyright )
71
+
72
+ fmt .Printf ("Creating controller ...\n " )
73
+ CreateController (cr )
74
+ if generate {
75
+ fmt .Printf ("Generating code for new controller... " +
76
+ "Regenerate after editing controller files by running `kubebuilder generate clean; kubebuilder generate`.\n " )
77
+ generatecmd .RunGenerate (cmd , args )
78
+ }
79
+ fmt .Printf ("Next: Run the controller and create an instance with:\n " +
80
+ "$ GOBIN=${PWD}/bin go install ${PWD#$GOPATH/src/}/cmd/controller-manager\n " +
81
+ "$ bin/controller-manager --kubeconfig ~/.kube/config\n " +
82
+ "$ kubectl apply -f hack/sample/" + strings .ToLower (createutil .KindName ) + ".yaml\n " )
83
+ }
84
+
85
+ func CreateController (boilerplate string ) {
86
+ args := controllerTemplateArgs {
87
+ boilerplate ,
88
+ util .Domain ,
89
+ createutil .GroupName ,
90
+ createutil .VersionName ,
91
+ createutil .KindName ,
92
+ createutil .ResourceName ,
93
+ util .Repo ,
94
+ inflect .NewDefaultRuleset ().Pluralize (createutil .KindName ),
95
+ nonNamespacedKind ,
96
+ CoreType ,
97
+ }
98
+
99
+ dir , err := os .Getwd ()
100
+ if err != nil {
101
+ log .Fatal (err )
102
+ }
103
+ fmt .Printf ("Edit your controller function...\n " )
104
+ doController (dir , args )
105
+ doControllerTest (dir , args )
106
+ }
0 commit comments