mirror of https://github.com/helm/helm.git
82 lines
3.0 KiB
Go
82 lines
3.0 KiB
Go
/*
|
||
Copyright The Helm 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 "helm.sh/helm/v4/internal/plugin"
|
||
|
||
import (
|
||
"context"
|
||
"io"
|
||
"regexp"
|
||
)
|
||
|
||
const PluginFileName = "plugin.yaml"
|
||
|
||
// Plugin defines a plugin instance. The client (Helm codebase) facing type that can be used to introspect and invoke a plugin
|
||
type Plugin interface {
|
||
// Dir return the plugin directory (as an absolute path) on the filesystem
|
||
Dir() string
|
||
|
||
// Metadata describes the plugin's type, version, etc.
|
||
// (This metadata type is the converted and plugin version independented in-memory representation of the plugin.yaml file)
|
||
Metadata() Metadata
|
||
|
||
// Invoke takes the given input, and dispatches the contents to plugin instance
|
||
// The input is expected to be a JSON-serializable object, which the plugin will interpret according to its type
|
||
// The plugin is expected to return a JSON-serializable object, which the invoker
|
||
// will interpret according to the plugin's type
|
||
//
|
||
// Invoke can be thought of as a request/response mechanism. Similar to e.g. http.RoundTripper
|
||
//
|
||
// If plugin's execution fails with a non-zero "return code" (this is plugin runtime implementation specific)
|
||
// an InvokeExecError is returned
|
||
Invoke(ctx context.Context, input *Input) (*Output, error)
|
||
}
|
||
|
||
// PluginHook allows plugins to implement hooks that are invoked on plugin management events (install, upgrade, etc)
|
||
type PluginHook interface { //nolint:revive
|
||
InvokeHook(event string) error
|
||
}
|
||
|
||
// Input defines the input message and parameters to be passed to the plugin
|
||
type Input struct {
|
||
// Message represents the type-elided value to be passed to the plugin.
|
||
// The plugin is expected to interpret the message according to its type
|
||
// The message object must be JSON-serializable
|
||
Message any
|
||
|
||
// Optional: Reader to be consumed plugin's "stdin"
|
||
Stdin io.Reader
|
||
|
||
// Optional: Writers to consume the plugin's "stdout" and "stderr"
|
||
Stdout, Stderr io.Writer
|
||
|
||
// Optional: Env represents the environment as a list of "key=value" strings
|
||
// see os.Environ
|
||
Env []string
|
||
}
|
||
|
||
// Output defines the output message and parameters the passed from the plugin
|
||
type Output struct {
|
||
// Message represents the type-elided value returned from the plugin
|
||
// The invoker is expected to interpret the message according to the plugin's type
|
||
// The message object must be JSON-serializable
|
||
Message any
|
||
}
|
||
|
||
// validPluginName is a regular expression that validates plugin names.
|
||
//
|
||
// Plugin names can only contain the ASCII characters a-z, A-Z, 0-9, _ and -.
|
||
var validPluginName = regexp.MustCompile("^[A-Za-z0-9_-]+$")
|