Skip to content

Commit 883ca64

Browse files
committed
drop support for legacy (v0) projects
This is a first in the series of PRs for cleaning up the technical debt.
1 parent 4edfc1f commit 883ca64

File tree

4 files changed

+117
-257
lines changed

4 files changed

+117
-257
lines changed

.travis.yml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ install:
2222
-
2323

2424
script:
25-
- TRACE=1 ./testv0.sh
26-
- ./test_existing_projects.sh
2725
- TRACE=1 ./testv1.sh
2826

2927
# TBD. Suppressing for now.

cmd/kubebuilder/initproject/init.go

Lines changed: 111 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -17,52 +17,51 @@ limitations under the License.
1717
package initproject
1818

1919
import (
20+
"bufio"
2021
"fmt"
2122
"log"
2223
"os"
2324
"os/exec"
2425
"path/filepath"
25-
"strconv"
2626
"strings"
2727

2828
"github.com/Masterminds/semver"
2929
"github.com/kubernetes-sigs/kubebuilder/cmd/kubebuilder/util"
3030
"github.com/spf13/cobra"
31+
flag "github.com/spf13/pflag"
32+
"sigs.k8s.io/controller-tools/pkg/scaffold"
33+
"sigs.k8s.io/controller-tools/pkg/scaffold/input"
3134
"sigs.k8s.io/controller-tools/pkg/scaffold/manager"
3235
"sigs.k8s.io/controller-tools/pkg/scaffold/project"
3336
)
3437

35-
type initOptions struct {
36-
domain string
37-
copyright string
38-
bazel bool
39-
controllerOnly bool
40-
projectVersion string
41-
projectOptions
42-
}
43-
4438
func AddInit(cmd *cobra.Command) {
45-
o := initOptions{}
39+
o := projectOptions{}
4640

4741
initCmd := &cobra.Command{
4842
Use: "init",
4943
Short: "Initialize a new project",
50-
Long: `Initialize a new project including vendor/ directory and Go package directories.`,
51-
Example: `# Initialize project structure
52-
kubebuilder init --domain mydomain
44+
Long: `Initialize a new project including vendor/ directory and Go package directories.
45+
46+
Writes the following files:
47+
- a boilerplate license file
48+
- a PROJECT file with the domain and repo
49+
- a Makefile to build the project
50+
- a Gopkg.toml with project dependencies
51+
- a Kustomization.yaml for customizating manifests
52+
- a Patch file for customizing image for manager manifests
53+
- a cmd/manager/main.go to run
54+
55+
project will prompt the user to run 'dep ensure' after writing the project files.
56+
`,
57+
Example: `# Scaffold a project using the apache2 license with "The Kubernetes authors" as owners
58+
kubebuilder init --domain example.org --license apache2 --owner "The Kubernetes authors"
5359
`,
5460
Run: func(cmd *cobra.Command, args []string) {
55-
o.runInitRepo()
61+
o.RunInit()
5662
},
5763
}
5864

59-
v0comment := "Works only with project-version v0, "
60-
initCmd.Flags().StringVar(&o.domain, "domain", "", "domain for the API groups")
61-
initCmd.Flags().StringVar(&o.copyright, "copyright", filepath.Join("hack", "boilerplate.go.txt"), v0comment+"Location of copyright boilerplate file.")
62-
initCmd.Flags().BoolVar(&o.bazel, "bazel", false, v0comment+"if true, setup Bazel workspace artifacts")
63-
initCmd.Flags().BoolVar(&o.controllerOnly, "controller-only", false, v0comment+"if true, setup controller only")
64-
initCmd.Flags().StringVar(&o.projectVersion, "project-version", "v1", "if set to v0, init project with kubebuilder legacy version")
65-
6665
initCmd.Flags().BoolVar(
6766
&o.dep, "dep", true, "if specified, determines whether dep will be used.")
6867
o.depFlag = initCmd.Flag("dep")
@@ -76,56 +75,114 @@ kubebuilder init --domain mydomain
7675
cmd.AddCommand(initCmd)
7776
}
7877

79-
func (o *initOptions) runInitRepo() {
78+
type projectOptions struct {
79+
prj *project.Project
80+
bp *project.Boilerplate
81+
gopkg *project.GopkgToml
82+
mgr *manager.Cmd
83+
dkr *manager.Dockerfile
84+
dep bool
85+
depFlag *flag.Flag
86+
}
87+
88+
func (o *projectOptions) RunInit() {
8089
checkGoVersion()
8190

8291
if !depExists() {
8392
log.Fatalf("Dep is not installed. Follow steps at: https://golang.github.io/dep/docs/installation.html")
8493
}
8594

86-
if o.projectVersion == "v1" {
87-
if len(o.domain) != 0 {
88-
o.prj.Domain = o.domain
89-
}
90-
o.RunInit()
95+
if util.ProjectExist() {
96+
fmt.Println("Failed to initialize project bacause project is already initialized")
9197
return
9298
}
99+
// project and boilerplate must come before main so the boilerplate exists
100+
s := &scaffold.Scaffold{
101+
BoilerplateOptional: true,
102+
ProjectOptional: true,
103+
}
93104

94-
if len(o.domain) == 0 {
95-
log.Fatal("Must specify --domain")
105+
p, err := o.prj.GetInput()
106+
if err != nil {
107+
log.Fatal(err)
96108
}
97-
cr := util.GetCopyright(o.copyright)
98109

99-
fmt.Printf("Initializing project structure...\n")
100-
if o.bazel {
101-
createBazelWorkspace()
110+
b, err := o.bp.GetInput()
111+
if err != nil {
112+
log.Fatal(err)
102113
}
103-
createControllerManager(cr)
104-
//createInstaller(cr)
105-
createAPIs(cr, o.domain)
106-
//runCreateApiserver(cr)
107-
108-
pkgs := []string{
109-
filepath.Join("hack"),
110-
filepath.Join("pkg"),
111-
filepath.Join("pkg", "controller"),
112-
filepath.Join("pkg", "inject"),
113-
//filepath.Join("pkg", "openapi"),
114+
115+
err = s.Execute(input.Options{ProjectPath: p.Path, BoilerplatePath: b.Path}, o.prj, o.bp)
116+
if err != nil {
117+
log.Fatal(err)
114118
}
115119

116-
fmt.Printf("\t%s/\n", filepath.Join("pkg", "controller"))
117-
for _, p := range pkgs {
118-
createPackage(cr, p)
120+
// default controller manager image name
121+
imgName := "controller:latest"
122+
123+
s = &scaffold.Scaffold{}
124+
err = s.Execute(input.Options{ProjectPath: p.Path, BoilerplatePath: b.Path},
125+
o.gopkg,
126+
o.mgr,
127+
&project.Makefile{Image: imgName},
128+
o.dkr,
129+
&manager.APIs{},
130+
&manager.Controller{},
131+
&manager.Config{Image: imgName},
132+
&project.GitIgnore{},
133+
&project.Kustomize{},
134+
&project.KustomizeImagePatch{})
135+
if err != nil {
136+
log.Fatal(err)
137+
}
138+
139+
if !o.depFlag.Changed {
140+
reader := bufio.NewReader(os.Stdin)
141+
fmt.Println("Run `dep ensure` to fetch dependencies (Recommended) [y/n]?")
142+
o.dep = util.Yesno(reader)
143+
}
144+
if o.dep {
145+
c := exec.Command("dep", "ensure") // #nosec
146+
c.Stderr = os.Stderr
147+
c.Stdout = os.Stdout
148+
fmt.Println(strings.Join(c.Args, " "))
149+
if err := c.Run(); err != nil {
150+
log.Fatal(err)
151+
}
152+
153+
fmt.Println("Running make...")
154+
c = exec.Command("make") // #nosec
155+
c.Stderr = os.Stderr
156+
c.Stdout = os.Stdout
157+
fmt.Println(strings.Join(c.Args, " "))
158+
if err := c.Run(); err != nil {
159+
log.Fatal(err)
160+
}
161+
} else {
162+
fmt.Println("Skipping `dep ensure`. Dependencies will not be fetched.")
119163
}
120-
doDockerfile()
121-
doInject(cr)
122-
doArgs(cr, o.controllerOnly)
123-
RunVendorInstall(nil, []string{o.copyright})
124-
createBoilerplate()
125164
fmt.Printf("Next: Define a resource with:\n" +
126-
"$ kubebuilder create resource\n")
165+
"$ kubebuilder create api\n")
166+
}
167+
168+
// projectForFlags registers flags for Project fields and returns the Project
169+
func projectForFlags(f *flag.FlagSet) *project.Project {
170+
p := &project.Project{}
171+
f.StringVar(&p.Repo, "repo", "", "name of the github repo. "+
172+
"defaults to the go package of the current working directory.")
173+
f.StringVar(&p.Domain, "domain", "k8s.io", "domain for groups")
174+
f.StringVar(&p.Version, "project-version", "1", "project version")
175+
return p
127176
}
128177

178+
// boilerplateForFlags registers flags for Boilerplate fields and returns the Boilerplate
179+
func boilerplateForFlags(f *flag.FlagSet) *project.Boilerplate {
180+
b := &project.Boilerplate{}
181+
f.StringVar(&b.Path, "path", "", "path for boilerplate")
182+
f.StringVar(&b.License, "license", "apache2", "license to use to boilerplate. Maybe one of apache2,none")
183+
f.StringVar(&b.Owner, "owner", "", "Owner to add to the copyright")
184+
return b
185+
}
129186
func checkGoVersion() {
130187
cmd := exec.Command("go", "version")
131188
out, err := cmd.Output()
@@ -165,29 +222,3 @@ type templateArgs struct {
165222
Repo string
166223
ControllerOnly bool
167224
}
168-
169-
func versionCmp(v1 string, v2 string) int {
170-
v1s := strings.Split(strings.Replace(v1, "go", "", 1), ".")
171-
v2s := strings.Split(strings.Replace(v2, "go", "", 1), ".")
172-
for i := 0; i < len(v1s) && i < len(v2s); i++ {
173-
mv1, err1 := strconv.Atoi(v1s[i])
174-
mv2, err2 := strconv.Atoi(v2s[i])
175-
if err1 == nil && err2 == nil {
176-
cmp := mv1 - mv2
177-
if cmp > 0 {
178-
return 1
179-
} else if cmp < 0 {
180-
return -1
181-
}
182-
} else {
183-
log.Fatalf("Unexpected error comparing %v with %v", v1, v2)
184-
}
185-
}
186-
if len(v1s) == len(v2s) {
187-
return 0
188-
} else if len(v1s) > len(v2s) {
189-
return 1
190-
} else {
191-
return -1
192-
}
193-
}

0 commit comments

Comments
 (0)