Skip to content

Commit 13dd9d2

Browse files
committed
removed test file
1 parent b4b83c4 commit 13dd9d2

File tree

1 file changed

+178
-0
lines changed

1 file changed

+178
-0
lines changed
Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
/*
2+
Copyright 2022 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 scaffolds
18+
19+
import (
20+
"errors"
21+
"fmt"
22+
"strings"
23+
24+
"sigs.k8s.io/kubebuilder/v4/pkg/plugins/golang/v4/scaffolds/internal/templates/api"
25+
26+
log "github.com/sirupsen/logrus"
27+
"github.com/spf13/afero"
28+
29+
"sigs.k8s.io/kubebuilder/v4/pkg/config"
30+
"sigs.k8s.io/kubebuilder/v4/pkg/machinery"
31+
"sigs.k8s.io/kubebuilder/v4/pkg/model/resource"
32+
pluginutil "sigs.k8s.io/kubebuilder/v4/pkg/plugin/util"
33+
"sigs.k8s.io/kubebuilder/v4/pkg/plugins"
34+
"sigs.k8s.io/kubebuilder/v4/pkg/plugins/golang/v4/scaffolds/internal/templates/cmd"
35+
"sigs.k8s.io/kubebuilder/v4/pkg/plugins/golang/v4/scaffolds/internal/templates/hack"
36+
"sigs.k8s.io/kubebuilder/v4/pkg/plugins/golang/v4/scaffolds/internal/templates/test/e2e"
37+
"sigs.k8s.io/kubebuilder/v4/pkg/plugins/golang/v4/scaffolds/internal/templates/webhooks"
38+
)
39+
40+
var _ plugins.Scaffolder = &webhookScaffolder{}
41+
42+
type webhookScaffolder struct {
43+
config config.Config
44+
resource resource.Resource
45+
46+
// fs is the filesystem that will be used by the scaffolder
47+
fs machinery.Filesystem
48+
49+
// force indicates whether to scaffold controller files even if it exists or not
50+
force bool
51+
52+
// Deprecated - TODO: remove it for go/v5
53+
// isLegacy indicates that the resource should be created in the legacy path under the api
54+
isLegacy bool
55+
}
56+
57+
// NewWebhookScaffolder returns a new Scaffolder for v2 webhook creation operations
58+
func NewWebhookScaffolder(config config.Config, resource resource.Resource,
59+
force bool, isLegacy bool) plugins.Scaffolder {
60+
return &webhookScaffolder{
61+
config: config,
62+
resource: resource,
63+
force: force,
64+
isLegacy: isLegacy,
65+
}
66+
}
67+
68+
// InjectFS implements cmdutil.Scaffolder
69+
func (s *webhookScaffolder) InjectFS(fs machinery.Filesystem) {
70+
s.fs = fs
71+
}
72+
73+
// Scaffold implements cmdutil.Scaffolder
74+
func (s *webhookScaffolder) Scaffold() error {
75+
log.Println("Writing scaffold for you to edit...")
76+
77+
// Load the boilerplate
78+
boilerplate, err := afero.ReadFile(s.fs.FS, hack.DefaultBoilerplatePath)
79+
if err != nil {
80+
if errors.Is(err, afero.ErrFileNotFound) {
81+
log.Warnf("Unable to find %s : %s .\n"+
82+
"This file is used to generate the license header in the project.\n"+
83+
"Note that controller-gen will also use this. Therefore, ensure that you "+
84+
"add the license file or configure your project accordingly.",
85+
hack.DefaultBoilerplatePath, err)
86+
boilerplate = []byte("")
87+
} else {
88+
return fmt.Errorf("error scaffolding webhook: unable to load boilerplate: %w", err)
89+
}
90+
}
91+
92+
// Initialize the machinery.Scaffold that will write the files to disk
93+
scaffold := machinery.NewScaffold(s.fs,
94+
machinery.WithConfig(s.config),
95+
machinery.WithBoilerplate(string(boilerplate)),
96+
machinery.WithResource(&s.resource),
97+
)
98+
99+
// Keep track of these values before the update
100+
doDefaulting := s.resource.HasDefaultingWebhook()
101+
doValidation := s.resource.HasValidationWebhook()
102+
doConversion := s.resource.HasConversionWebhook()
103+
104+
if err := s.config.UpdateResource(s.resource); err != nil {
105+
return fmt.Errorf("error updating resource: %w", err)
106+
}
107+
108+
if err := scaffold.Execute(
109+
&webhooks.Webhook{Force: s.force, IsLegacyPath: s.isLegacy},
110+
&e2e.WebhookTestUpdater{WireWebhook: true},
111+
&cmd.MainUpdater{WireWebhook: true, IsLegacyPath: s.isLegacy},
112+
&webhooks.WebhookTest{Force: s.force, IsLegacyPath: s.isLegacy},
113+
); err != nil {
114+
return err
115+
}
116+
117+
if doConversion {
118+
resourceFilePath := fmt.Sprintf("api/%s/%s_types.go",
119+
s.resource.Version, strings.ToLower(s.resource.Kind))
120+
if s.config.IsMultiGroup() {
121+
resourceFilePath = fmt.Sprintf("api/%s/%s/%s_types.go",
122+
s.resource.Group, s.resource.Version,
123+
strings.ToLower(s.resource.Kind))
124+
}
125+
126+
err = pluginutil.InsertCodeIfNotExist(resourceFilePath,
127+
"// +kubebuilder:object:root=true",
128+
"\n// +kubebuilder:storageversion\n// +kubebuilder:conversion:hub")
129+
if err != nil {
130+
log.Errorf("Unable to insert storage version marker "+
131+
"(// +kubebuilder:storageversion) and the hub conversion (// +kubebuilder:conversion:hub) "+
132+
"in file %s: %v", resourceFilePath, err)
133+
}
134+
135+
if err := scaffold.Execute(
136+
&api.Hub{Force: s.force},
137+
); err != nil {
138+
return err
139+
}
140+
141+
for _, spoke := range s.resource.Webhooks.Spoke {
142+
log.Printf("Scaffolding for spoke version: %s\n", spoke)
143+
if err := scaffold.Execute(
144+
&api.Spoke{Force: s.force, SpokeVersion: spoke},
145+
); err != nil {
146+
return fmt.Errorf("failed to scaffold spoke %s: %w", spoke, err)
147+
}
148+
}
149+
150+
log.Println(`Webhook server has been set up for you.
151+
You need to implement the conversion.Hub and conversion.Convertible interfaces for your CRD types.`)
152+
}
153+
154+
// TODO: Add test suite for conversion webhook after #1664 has been merged & conversion tests supported in envtest.
155+
if doDefaulting || doValidation {
156+
if err := scaffold.Execute(
157+
&webhooks.WebhookSuite{IsLegacyPath: s.isLegacy},
158+
); err != nil {
159+
return err
160+
}
161+
}
162+
163+
// TODO: remove for go/v5
164+
if !s.isLegacy {
165+
if hasInternalController, err := pluginutil.HasFileContentWith("Dockerfile", "internal/controller"); err != nil {
166+
log.Error("Unable to read Dockerfile to check if webhook(s) will be properly copied: ", err)
167+
} else if hasInternalController {
168+
log.Warning("Dockerfile is copying internal/controller. To allow copying webhooks, " +
169+
"it will be edited, and `internal/controller` will be replaced by `internal/`.")
170+
171+
if err := pluginutil.ReplaceInFile("Dockerfile", "internal/controller", "internal/"); err != nil {
172+
log.Error("Unable to replace \"internal/controller\" with \"internal/\" in the Dockerfile: ", err)
173+
}
174+
}
175+
}
176+
177+
return nil
178+
}

0 commit comments

Comments
 (0)