Skip to content

Commit 637f606

Browse files
committed
✨ scaffolding structure using builder pattern
1 parent f8dba2e commit 637f606

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+2323
-149
lines changed

Makefile

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#
2+
# Makefile with some common workflow for dev, build and test
3+
#
4+
5+
all: build test
6+
7+
.PHONY: build test
8+
9+
build:
10+
go build -o bin/kubebuilder ./cmd
11+
12+
test:
13+
go test -v ./cmd/... ./pkg/...
14+

cmd/webhook.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,11 @@ Scaffolds webhook handlers based on group, version, kind and other user inputs.
5353

5454
projectInfo, err := scaffold.LoadProjectFile("PROJECT")
5555
if err != nil {
56-
log.Fatal("failed to read the PROJECT file: %v", err)
56+
log.Fatalf("failed to read the PROJECT file: %v", err)
5757
}
5858

5959
if projectInfo.Version != project.Version1 {
60-
fmt.Println("webhook scaffolding is not supported for this project version: %s", projectInfo.Version)
60+
fmt.Printf("webhook scaffolding is not supported for this project version: %s \n", projectInfo.Version)
6161
os.Exit(0)
6262
}
6363

common.sh

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,18 +159,24 @@ function setup_envs {
159159
export TEST_DEP=$tmp_root/kubebuilder/init_project
160160
}
161161

162-
function cache_dep {
163-
header_text "caching inited projects"
162+
function restore_go_deps {
163+
header_text "restoring Go dependencies"
164+
tar -zxf ${go_workspace}/src/sigs.k8s.io/kubebuilder/test/vendor.v1.tgz
165+
}
166+
167+
function cache_project {
168+
header_text "caching initialized projects"
164169
if [ -d "$TEST_DEP" ]; then
165170
rm -rf "$TEST_DEP"
166171
fi
167172
mkdir -p "$TEST_DEP"
168173
cp -r $PWD/* $TEST_DEP
169174
}
170175

171-
function dump_cache {
172-
header_text "dump cached project and deps"
176+
function dump_project {
177+
header_text "restoring cached project"
173178
if [ -d "$TEST_DEP" ]; then
174179
cp -r $TEST_DEP/* .
180+
restore_go_deps
175181
fi
176182
}

generate_vendor.sh

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#!/usr/bin/env bash
2+
3+
# Copyright 2019 The Kubernetes Authors.
4+
#
5+
# Licensed under the Apache License, Version 2.0 (the "License");
6+
# you may not use this file except in compliance with the License.
7+
# You may obtain a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing, software
12+
# distributed under the License is distributed on an "AS IS" BASIS,
13+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
# See the License for the specific language governing permissions and
15+
# limitations under the License.
16+
17+
#
18+
# Script to generate vendor archive that contains vendor and Gopkg.toml for a
19+
# given project version
20+
#
21+
set -e
22+
23+
go_workspace=''
24+
for p in ${GOPATH//:/ }; do
25+
if [[ $PWD/ = $p/* ]]; then
26+
go_workspace=$p
27+
fi
28+
done
29+
30+
if [ -z $go_workspace ]; then
31+
echo 'Current directory is not in $GOPATH' >&2
32+
exit 1
33+
fi
34+
35+
build_kb() {
36+
rm -f /tmp/kb && \
37+
go build -o /tmp/kb sigs.k8s.io/kubebuilder/cmd
38+
}
39+
40+
41+
#
42+
# generate_vendor takes project version as input and creates vendor archive
43+
# containing Go dependencies for a Kubebuilder project along with the Gopkg.lock
44+
# file.
45+
#
46+
generate_vendor() {
47+
version=$1
48+
project_dir=${go_workspace}/src/sigs.k8s.io/kubebuilder-test
49+
mkdir -p ${project_dir}
50+
rm -rf ${project_dir}/*
51+
pushd .
52+
cd ${project_dir}
53+
/tmp/kb init --project-version $version --domain testproject.org --license apache2 --owner "The Kubernetes authors" --dep=true
54+
make
55+
tar -zcvf vendor.v$version.tgz vendor Gopkg.lock && \
56+
echo "vendor archieve vendor.v$version.tgz is ready."
57+
popd
58+
}
59+
60+
build_kb && \
61+
generate_vendor $1

generated_golden.sh

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ scaffold_test_project() {
3333
rm -rf ./test/$project/*
3434
pushd .
3535
cd test/$project
36-
ln -s ../../vendor vendor
36+
# untar Gopkg.lock and vendor directory for appropriate project version
37+
tar -zxf ../vendor.v$version.tgz
3738
../../bin/kubebuilder init --project-version $version --domain testproject.org --license apache2 --owner "The Kubernetes authors" --dep=false
3839
../../bin/kubebuilder create api --group crew --version v1 --kind FirstMate --controller=true --resource=true --make=false
3940
../../bin/kubebuilder alpha webhook --group crew --version v1 --kind FirstMate --type=mutating --operations=create,update --make=false
@@ -46,9 +47,12 @@ scaffold_test_project() {
4647
../../bin/kubebuilder alpha webhook --group core --version v1 --kind Namespace --type=mutating --operations=update --make=false
4748
../../bin/kubebuilder create api --group policy --version v1beta1 --kind HealthCheckPolicy --example=false --controller=true --resource=true --namespaced=false --make=false
4849
make
50+
rm -f Gopkg.lock
51+
rm -rf ./vendor
52+
rm -rf ./bin
4953
popd
5054
}
5155

5256
build_kb && \
53-
scaffold_test_project project 1
54-
# scaffold_test_project project_v2 2
57+
scaffold_test_project project 1 && \
58+
scaffold_test_project project_v2 2

pkg/scaffold/api.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,13 +192,19 @@ func (api *API) scaffoldV2() error {
192192
if api.DoController {
193193
fmt.Println(filepath.Join("controllers", fmt.Sprintf("%s_controller.go", strings.ToLower(r.Kind))))
194194

195+
ctrlScaffolder := &resourcev2.Controller{Resource: r}
195196
err := (&Scaffold{}).Execute(
196197
input.Options{},
197-
&resourcev2.Controller{Resource: r},
198+
ctrlScaffolder,
198199
)
199200
if err != nil {
200201
return fmt.Errorf("error scaffolding controller: %v", err)
201202
}
203+
204+
err = ctrlScaffolder.UpdateMain("main.go")
205+
if err != nil {
206+
return fmt.Errorf("error updating main.go with reconciler code: %v", err)
207+
}
202208
}
203209
//
204210
// if api.RunMake {

pkg/scaffold/project.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ func (p *Project) Scaffold() error {
6868
input.Options{ProjectPath: projectInput.Path, BoilerplatePath: bpInput.Path},
6969
&manager.Config{Image: imgName},
7070
&project.GitIgnore{},
71-
&project.GopkgToml{},
7271
&project.Kustomize{},
7372
&project.KustomizeRBAC{},
7473
&project.KustomizeManager{},
@@ -107,6 +106,7 @@ func (p *Project) scaffoldV1() error {
107106
return (&Scaffold{}).Execute(
108107
input.Options{ProjectPath: p.Info.Path, BoilerplatePath: p.Boilerplate.Path},
109108
&project.Makefile{Image: imgName},
109+
&project.GopkgToml{},
110110
&manager.Dockerfile{},
111111
&manager.APIs{},
112112
&manager.Controller{},
@@ -121,6 +121,7 @@ func (p *Project) scaffoldV2() error {
121121
return (&Scaffold{}).Execute(
122122
input.Options{ProjectPath: p.Info.Path, BoilerplatePath: p.Boilerplate.Path},
123123
&scaffoldv2.Main{},
124+
&scaffoldv2.GopkgToml{},
124125
&scaffoldv2.Doc{},
125126
&scaffoldv2.Makefile{Image: imgName},
126127
&scaffoldv2.Dockerfile{},

pkg/scaffold/project/project.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func (c *Project) GetInput() (input.Input, error) {
5252
c.Version = Version1
5353
}
5454
if c.Repo == "" {
55-
r, err := c.repoFromGopathAndWd(os.Getenv("GOPATH"), os.Getwd)
55+
r, err := c.RepoFromGopathAndWd(os.Getenv("GOPATH"), os.Getwd)
5656
if err != nil {
5757
return input.Input{}, err
5858
}
@@ -74,7 +74,7 @@ func (c *Project) GetInput() (input.Input, error) {
7474
}, nil
7575
}
7676

77-
func (Project) repoFromGopathAndWd(gopath string, getwd func() (string, error)) (string, error) {
77+
func (Project) RepoFromGopathAndWd(gopath string, getwd func() (string, error)) (string, error) {
7878
// Assume the working dir is the root of the repo
7979
wd, err := getwd()
8080
if err != nil {

0 commit comments

Comments
 (0)