mirror of
https://github.com/kubernetes-sigs/kustomize.git
synced 2026-07-02 02:30:43 +00:00
95 lines
2.1 KiB
Go
95 lines
2.1 KiB
Go
/*
|
|
Copyright 2019 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 plugin
|
|
|
|
import (
|
|
"fmt"
|
|
"path/filepath"
|
|
"plugin"
|
|
|
|
"sigs.k8s.io/kustomize/pkg/types"
|
|
)
|
|
|
|
var _ Factory = &goFactory{}
|
|
|
|
const (
|
|
kvSourcesDir = "kvSources"
|
|
EnableGoPluginsFlagName = "enable_alpha_goplugins_accept_panic_risk"
|
|
EnableGoPluginsFlagHelp = `The main program may panic and exit on an attempt
|
|
to use a goplugin that was compiled under conditions
|
|
differing from the those in effect when main was
|
|
compiled. It's safest to use this flag in the
|
|
context of a container image holding both the main
|
|
and the goplugins it needs, all built on the same
|
|
machine, with the same transitive libs and the same
|
|
compiler version.`
|
|
errorFmt = `
|
|
enable go plugins by specifying flag
|
|
--%s
|
|
Place .so files in
|
|
%s
|
|
%s`
|
|
)
|
|
|
|
func newGoFactory(c *types.PluginConfig) *goFactory {
|
|
return &goFactory{
|
|
config: c,
|
|
plugins: make(map[string]KVSource),
|
|
}
|
|
}
|
|
|
|
type goFactory struct {
|
|
config *types.PluginConfig
|
|
plugins map[string]KVSource
|
|
}
|
|
|
|
func (p *goFactory) load(name string) (KVSource, error) {
|
|
if plug, ok := p.plugins[name]; ok {
|
|
return plug, nil
|
|
}
|
|
|
|
dir := filepath.Join(
|
|
p.config.DirectoryPath,
|
|
kvSourcesDir)
|
|
if !p.config.GoEnabled {
|
|
return nil, fmt.Errorf(
|
|
errorFmt,
|
|
EnableGoPluginsFlagName,
|
|
dir,
|
|
EnableGoPluginsFlagHelp)
|
|
}
|
|
|
|
goPlugin, err := plugin.Open(
|
|
filepath.Join(dir, name+".so"))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
symbol, err := goPlugin.Lookup("KVSource")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
plug, ok := symbol.(KVSource)
|
|
if !ok {
|
|
return nil, fmt.Errorf("plugin %s not found", name)
|
|
}
|
|
|
|
p.plugins[name] = plug
|
|
return plug, nil
|
|
}
|