Implement document plugin loader
Loader associated with Unknown type of a transformer kustomize plugin and considered 'builtin'. Kustomize plugin system executes Config and Transform method of builtin plugins. Therefore appropriate methods of the document plugin loaders are executed as well. Main goal for airship document plugin loaded is to determine desired aitship plugin based on Kind field and execute its Config or Transform methods Change-Id: Ic26a880570491ac3a59f2357ed455a2a7362387b
This commit is contained in:
parent
34cca34796
commit
b1361e05f8
@ -16,10 +16,17 @@ import (
|
|||||||
"sigs.k8s.io/kustomize/v3/pkg/target"
|
"sigs.k8s.io/kustomize/v3/pkg/target"
|
||||||
"sigs.k8s.io/kustomize/v3/pkg/types"
|
"sigs.k8s.io/kustomize/v3/pkg/types"
|
||||||
|
|
||||||
|
docplugins "opendev.org/airship/airshipctl/pkg/document/plugins"
|
||||||
"opendev.org/airship/airshipctl/pkg/log"
|
"opendev.org/airship/airshipctl/pkg/log"
|
||||||
utilyaml "opendev.org/airship/airshipctl/pkg/util/yaml"
|
utilyaml "opendev.org/airship/airshipctl/pkg/util/yaml"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
// NOTE (dukov) This is sort of a hack but it's the only way to add an
|
||||||
|
// external 'builtin' plugin to Kustomize
|
||||||
|
plugins.TransformerFactories[plugins.Unknown] = docplugins.NewTransformerLoader
|
||||||
|
}
|
||||||
|
|
||||||
// KustomizeBuildOptions contain the options for running a Kustomize build on a bundle
|
// KustomizeBuildOptions contain the options for running a Kustomize build on a bundle
|
||||||
type KustomizeBuildOptions struct {
|
type KustomizeBuildOptions struct {
|
||||||
KustomizationPath string
|
KustomizationPath string
|
||||||
|
28
pkg/document/plugins/errors.go
Normal file
28
pkg/document/plugins/errors.go
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2014 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 plugins
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
// ErrUnknownPlugin raised for unregistered plugins
|
||||||
|
type ErrUnknownPlugin struct {
|
||||||
|
Kind string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e ErrUnknownPlugin) Error() string {
|
||||||
|
return fmt.Sprintf("Unknown airship plugin with Kind: %s", e.Kind)
|
||||||
|
}
|
60
pkg/document/plugins/loader.go
Normal file
60
pkg/document/plugins/loader.go
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2014 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 plugins
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sigs.k8s.io/kustomize/v3/pkg/ifc"
|
||||||
|
"sigs.k8s.io/kustomize/v3/pkg/resid"
|
||||||
|
"sigs.k8s.io/kustomize/v3/pkg/resmap"
|
||||||
|
"sigs.k8s.io/yaml"
|
||||||
|
)
|
||||||
|
|
||||||
|
// PluginRegistry map of plugin kinds to plugin instance
|
||||||
|
var PluginRegistry = make(map[string]resmap.TransformerPlugin)
|
||||||
|
|
||||||
|
// TransformerLoader airship document plugin loader. Loads external
|
||||||
|
// Kustomize plugins as builtin
|
||||||
|
type TransformerLoader struct {
|
||||||
|
resid.ResId
|
||||||
|
}
|
||||||
|
|
||||||
|
// Config reads plugin configuration structure
|
||||||
|
func (l *TransformerLoader) Config(
|
||||||
|
ldr ifc.Loader, rf *resmap.Factory, c []byte) error {
|
||||||
|
if err := yaml.Unmarshal(c, l); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
airshipPlugin, found := PluginRegistry[l.Kind]
|
||||||
|
if !found {
|
||||||
|
return ErrUnknownPlugin{Kind: l.Kind}
|
||||||
|
}
|
||||||
|
return airshipPlugin.Config(ldr, rf, c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transform executes Transform method of an external plugin
|
||||||
|
func (l *TransformerLoader) Transform(m resmap.ResMap) error {
|
||||||
|
airshipPlugin, found := PluginRegistry[l.Kind]
|
||||||
|
if !found {
|
||||||
|
return ErrUnknownPlugin{Kind: l.Kind}
|
||||||
|
}
|
||||||
|
return airshipPlugin.Transform(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewTransformerLoader returns plugin loader instance
|
||||||
|
func NewTransformerLoader() resmap.TransformerPlugin {
|
||||||
|
return &TransformerLoader{}
|
||||||
|
}
|
33
pkg/document/plugins/loader_test.go
Normal file
33
pkg/document/plugins/loader_test.go
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2014 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 plugins_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
||||||
|
"opendev.org/airship/airshipctl/pkg/document"
|
||||||
|
"opendev.org/airship/airshipctl/testutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestLoaderConfig(t *testing.T) {
|
||||||
|
t.Run("Try load non-existent plugin", func(t *testing.T) {
|
||||||
|
_, err := document.NewBundle(testutil.SetupTestFs(t, "testdata/unknownplugin"), "/", "/")
|
||||||
|
assert.Error(t, err)
|
||||||
|
})
|
||||||
|
}
|
4
pkg/document/plugins/testdata/unknownplugin/dummyplugin.yaml
vendored
Normal file
4
pkg/document/plugins/testdata/unknownplugin/dummyplugin.yaml
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
apiVersion: builtin
|
||||||
|
kind: SomeKind
|
||||||
|
metadata:
|
||||||
|
name: notImportantHere
|
2
pkg/document/plugins/testdata/unknownplugin/kustomization.yaml
vendored
Normal file
2
pkg/document/plugins/testdata/unknownplugin/kustomization.yaml
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
transformers:
|
||||||
|
- dummyplugin.yaml
|
Loading…
Reference in New Issue
Block a user