Skip to content

Commit

Permalink
Export scaffolding machinery
Browse files Browse the repository at this point in the history
Signed-off-by: Adrian Orive <adrian.orive.oneca@gmail.com>
  • Loading branch information
Adirio committed Mar 10, 2021
1 parent 287b5ee commit f1eb924
Show file tree
Hide file tree
Showing 25 changed files with 1,018 additions and 2,295 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ test-unit: ## Run the unit tests
.PHONY: test-coverage
test-coverage: ## Run unit tests creating the output to report coverage
- rm -rf *.out # Remove all coverage files if exists
go test -race -failfast -tags=integration -coverprofile=coverage-all.out -coverpkg="./pkg/cli/...,./pkg/config/...,./pkg/internal/...,./pkg/model/...,./pkg/plugin/...,./pkg/plugins/golang,./pkg/plugins/internal/..." ./pkg/...
go test -race -failfast -tags=integration -coverprofile=coverage-all.out -coverpkg="./pkg/cli/...,./pkg/config/...,./pkg/internal/...,./pkg/machinery/...,./pkg/model/...,./pkg/plugin/...,./pkg/plugins/golang" ./pkg/...

.PHONY: test-integration
test-integration: ## Run the integration tests
Expand Down
157 changes: 157 additions & 0 deletions pkg/machinery/errors.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
/*
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"

"sigs.k8s.io/kubebuilder/v3/pkg/model/file"
)

// 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
}

// PluginError is a wrapper error that will be used for errors returned by model.Plugin.Pipe
type PluginError struct {
error
}

// Unwrap implements Wrapper interface
func (e PluginError) 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 file.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)
}
56 changes: 56 additions & 0 deletions pkg/machinery/errors_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/*
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 plugin errors", PluginError{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"))
})
})
File renamed without changes.
Loading

0 comments on commit f1eb924

Please sign in to comment.