-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Export and cleanup scaffolding machinery
- Export scaffolding machinery - Reorganize scaffolding machinery that was in model - Remove experimental pattern code (old plugin system) Signed-off-by: Adrian Orive <[email protected]>
- Loading branch information
Showing
136 changed files
with
2,165 additions
and
3,548 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,145 @@ | ||
/* | ||
Copyright 2020 The Kubernetes Authors. | ||
Licensed under the Apache License, Version 2.0 (the "License"); | ||
you may not use this file except in compliance with the License. | ||
You may obtain a copy of the License at | ||
http://www.apache.org/licenses/LICENSE-2.0 | ||
Unless required by applicable law or agreed to in writing, software | ||
distributed under the License is distributed on an "AS IS" BASIS, | ||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
See the License for the specific language governing permissions and | ||
limitations under the License. | ||
*/ | ||
|
||
package machinery | ||
|
||
import ( | ||
"fmt" | ||
) | ||
|
||
// This file contains the errors returned by the scaffolding machinery | ||
// They are exported to be able to check which kind of error was returned | ||
|
||
// ValidateError is a wrapper error that will be used for errors returned by RequiresValidation.Validate | ||
type ValidateError struct { | ||
error | ||
} | ||
|
||
// Unwrap implements Wrapper interface | ||
func (e ValidateError) Unwrap() error { | ||
return e.error | ||
} | ||
|
||
// SetTemplateDefaultsError is a wrapper error that will be used for errors returned by Template.SetTemplateDefaults | ||
type SetTemplateDefaultsError struct { | ||
error | ||
} | ||
|
||
// Unwrap implements Wrapper interface | ||
func (e SetTemplateDefaultsError) Unwrap() error { | ||
return e.error | ||
} | ||
|
||
// ExistsFileError is a wrapper error that will be used for errors when checking for a file existence | ||
type ExistsFileError struct { | ||
error | ||
} | ||
|
||
// Unwrap implements Wrapper interface | ||
func (e ExistsFileError) Unwrap() error { | ||
return e.error | ||
} | ||
|
||
// OpenFileError is a wrapper error that will be used for errors when opening a file | ||
type OpenFileError struct { | ||
error | ||
} | ||
|
||
// Unwrap implements Wrapper interface | ||
func (e OpenFileError) Unwrap() error { | ||
return e.error | ||
} | ||
|
||
// CreateDirectoryError is a wrapper error that will be used for errors when creating a directory | ||
type CreateDirectoryError struct { | ||
error | ||
} | ||
|
||
// Unwrap implements Wrapper interface | ||
func (e CreateDirectoryError) Unwrap() error { | ||
return e.error | ||
} | ||
|
||
// CreateFileError is a wrapper error that will be used for errors when creating a file | ||
type CreateFileError struct { | ||
error | ||
} | ||
|
||
// Unwrap implements Wrapper interface | ||
func (e CreateFileError) Unwrap() error { | ||
return e.error | ||
} | ||
|
||
// ReadFileError is a wrapper error that will be used for errors when reading a file | ||
type ReadFileError struct { | ||
error | ||
} | ||
|
||
// Unwrap implements Wrapper interface | ||
func (e ReadFileError) Unwrap() error { | ||
return e.error | ||
} | ||
|
||
// WriteFileError is a wrapper error that will be used for errors when writing a file | ||
type WriteFileError struct { | ||
error | ||
} | ||
|
||
// Unwrap implements Wrapper interface | ||
func (e WriteFileError) Unwrap() error { | ||
return e.error | ||
} | ||
|
||
// CloseFileError is a wrapper error that will be used for errors when closing a file | ||
type CloseFileError struct { | ||
error | ||
} | ||
|
||
// Unwrap implements Wrapper interface | ||
func (e CloseFileError) Unwrap() error { | ||
return e.error | ||
} | ||
|
||
// ModelAlreadyExistsError is returned if the file is expected not to exist but a previous model does | ||
type ModelAlreadyExistsError struct { | ||
path string | ||
} | ||
|
||
// Error implements error interface | ||
func (e ModelAlreadyExistsError) Error() string { | ||
return fmt.Sprintf("failed to create %s: model already exists", e.path) | ||
} | ||
|
||
// UnknownIfExistsActionError is returned if the if-exists-action is unknown | ||
type UnknownIfExistsActionError struct { | ||
path string | ||
ifExistsAction IfExistsAction | ||
} | ||
|
||
// Error implements error interface | ||
func (e UnknownIfExistsActionError) Error() string { | ||
return fmt.Sprintf("unknown behavior if file exists (%d) for %s", e.ifExistsAction, e.path) | ||
} | ||
|
||
// FileAlreadyExistsError is returned if the file is expected not to exist but it does | ||
type FileAlreadyExistsError struct { | ||
path string | ||
} | ||
|
||
// Error implements error interface | ||
func (e FileAlreadyExistsError) Error() string { | ||
return fmt.Sprintf("failed to create %s: file already exists", e.path) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
/* | ||
Copyright 2020 The Kubernetes Authors. | ||
Licensed under the Apache License, Version 2.0 (the "License"); | ||
you may not use this file except in compliance with the License. | ||
You may obtain a copy of the License at | ||
http://www.apache.org/licenses/LICENSE-2.0 | ||
Unless required by applicable law or agreed to in writing, software | ||
distributed under the License is distributed on an "AS IS" BASIS, | ||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
See the License for the specific language governing permissions and | ||
limitations under the License. | ||
*/ | ||
|
||
package machinery | ||
|
||
import ( | ||
"errors" | ||
"path/filepath" | ||
|
||
. "github.com/onsi/ginkgo" | ||
. "github.com/onsi/ginkgo/extensions/table" | ||
. "github.com/onsi/gomega" | ||
) | ||
|
||
var _ = Describe("Errors", func() { | ||
var ( | ||
path = filepath.Join("path", "to", "file") | ||
testErr = errors.New("test error") | ||
) | ||
|
||
DescribeTable("should contain the wrapped error", | ||
func(err error) { | ||
Expect(errors.Is(err, testErr)).To(BeTrue()) | ||
}, | ||
Entry("for validate errors", ValidateError{testErr}), | ||
Entry("for set template defaults errors", SetTemplateDefaultsError{testErr}), | ||
Entry("for file existence errors", ExistsFileError{testErr}), | ||
Entry("for file opening errors", OpenFileError{testErr}), | ||
Entry("for directory creation errors", CreateDirectoryError{testErr}), | ||
Entry("for file creation errors", CreateFileError{testErr}), | ||
Entry("for file reading errors", ReadFileError{testErr}), | ||
Entry("for file writing errors", WriteFileError{testErr}), | ||
Entry("for file closing errors", CloseFileError{testErr}), | ||
) | ||
|
||
// NOTE: the following test increases coverage | ||
It("should print a descriptive error message", func() { | ||
Expect(ModelAlreadyExistsError{path}.Error()).To(ContainSubstring("model already exists")) | ||
Expect(UnknownIfExistsActionError{path, -1}.Error()).To(ContainSubstring("unknown behavior if file exists")) | ||
Expect(FileAlreadyExistsError{path}.Error()).To(ContainSubstring("file already exists")) | ||
}) | ||
}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
/* | ||
Copyright 2021 The Kubernetes Authors. | ||
Licensed under the Apache License, Version 2.0 (the "License"); | ||
you may not use this file except in compliance with the License. | ||
You may obtain a copy of the License at | ||
http://www.apache.org/licenses/LICENSE-2.0 | ||
Unless required by applicable law or agreed to in writing, software | ||
distributed under the License is distributed on an "AS IS" BASIS, | ||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
See the License for the specific language governing permissions and | ||
limitations under the License. | ||
*/ | ||
|
||
package machinery | ||
|
||
import ( | ||
"sigs.k8s.io/kubebuilder/v3/pkg/config" | ||
"sigs.k8s.io/kubebuilder/v3/pkg/model/resource" | ||
) | ||
|
||
// injector is used to inject certain fields to file templates. | ||
type injector struct { | ||
// config stores the project configuration. | ||
config config.Config | ||
|
||
// boilerplate is the copyright comment added at the top of scaffolded files. | ||
boilerplate string | ||
|
||
// resource contains the information of the API that is being scaffolded. | ||
resource *resource.Resource | ||
} | ||
|
||
// injectInto injects fields from the universe into the builder | ||
func (i injector) injectInto(builder Builder) { | ||
// Inject project configuration | ||
if i.config != nil { | ||
if builderWithDomain, hasDomain := builder.(HasDomain); hasDomain { | ||
builderWithDomain.InjectDomain(i.config.GetDomain()) | ||
} | ||
if builderWithRepository, hasRepository := builder.(HasRepository); hasRepository { | ||
builderWithRepository.InjectRepository(i.config.GetRepository()) | ||
} | ||
if builderWithProjectName, hasProjectName := builder.(HasProjectName); hasProjectName { | ||
builderWithProjectName.InjectProjectName(i.config.GetProjectName()) | ||
} | ||
if builderWithMultiGroup, hasMultiGroup := builder.(HasMultiGroup); hasMultiGroup { | ||
builderWithMultiGroup.InjectMultiGroup(i.config.IsMultiGroup()) | ||
} | ||
if builderWithComponentConfig, hasComponentConfig := builder.(HasComponentConfig); hasComponentConfig { | ||
builderWithComponentConfig.InjectComponentConfig(i.config.IsComponentConfig()) | ||
} | ||
} | ||
// Inject boilerplate | ||
if builderWithBoilerplate, hasBoilerplate := builder.(HasBoilerplate); hasBoilerplate { | ||
builderWithBoilerplate.InjectBoilerplate(i.boilerplate) | ||
} | ||
// Inject resource | ||
if i.resource != nil { | ||
if builderWithResource, hasResource := builder.(HasResource); hasResource { | ||
builderWithResource.InjectResource(i.resource) | ||
} | ||
} | ||
} |
Oops, something went wrong.