Documentation
¶
Index ¶
- func CleanupDevInfo(pluginID string) error
- func ClientPluginContextInterceptor(ctx context.Context, method string, req, reply any, cc *grpc.ClientConn, ...) error
- func GRPCDialOptions() []grpc.DialOption
- func GRPCServerFactory(opts []grpc.ServerOption) *grpc.Server
- func NewClientDiscoveryProvider[DiscoveryClientT any](createClient func(*pkgtypes.PluginContext) (*DiscoveryClientT, error), ...) types.DiscoveryProvider
- func RegisterResourcePlugin[ClientT any](p *Plugin, opts ResourcePluginOpts[ClientT])
- func UseClientPluginContext(ctx context.Context) (context.Context, error)
- func WriteDevInfo(pluginID, version, handshakeLine string, vitePort int) error
- func WriteDevInfoFromAddr(pluginID, version string, addr net.Addr, vitePort int) error
- type ConnectionEvent
- type ConnectionManager
- type DevInfo
- type Plugin
- type PluginOpts
- type ResourcePluginOpts
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func CleanupDevInfo ¶
CleanupDevInfo removes the .devinfo file for the given plugin ID. This should be called when the plugin process is shutting down.
func ClientPluginContextInterceptor ¶
func ClientPluginContextInterceptor( ctx context.Context, method string, req, reply any, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption, ) error
func GRPCDialOptions ¶
func GRPCDialOptions() []grpc.DialOption
func GRPCServerFactory ¶
func GRPCServerFactory(opts []grpc.ServerOption) *grpc.Server
func NewClientDiscoveryProvider ¶
func NewClientDiscoveryProvider[DiscoveryClientT any]( createClient func(*pkgtypes.PluginContext) (*DiscoveryClientT, error), stopClient func(*pkgtypes.PluginContext, *DiscoveryClientT) error, syncer func(*pkgtypes.PluginContext, *DiscoveryClientT) ([]types.ResourceMeta, error), ) types.DiscoveryProvider
NewClientDiscoveryProvider creates a DiscoveryProvider from client lifecycle functions and a syncer. createClient is required. stopClient is optional (nil = no-op).
func RegisterResourcePlugin ¶
func RegisterResourcePlugin[ClientT any]( p *Plugin, opts ResourcePluginOpts[ClientT], )
RegisterResourcePlugin registers a resource plugin with the given options. Resource plugins are plugins that manage resources, such as clouds, Kubernetes clusters, etc.
func UseClientPluginContext ¶
UseClientPluginContext serializes the plugin context from the context and injects it into the gRPC metadata.
func WriteDevInfo ¶
WriteDevInfo writes a .devinfo file for the running plugin process. It parses the go-plugin handshake line from stdout to extract the network address, then writes the file atomically.
The handshake line format is:
CORE-PROTOCOL-VERSION|APP-PROTOCOL-VERSION|NETWORK-TYPE|NETWORK-ADDR|PROTOCOL
Example: 1|1|tcp|127.0.0.1:42367|grpc
Types ¶
type ConnectionEvent ¶
type ConnectionEvent struct {
// Type is the type of change that happened to the connection data
// TODO: change to enum
Type string // 'SYNC', 'CREATE', 'DELETE'
// Data is the series of connection data associated with the update event
Data []pkgtypes.Connection
}
ConnectionEvent is a change of some kind to a connection. This could be the result of a new credential being added, an existing one updating, or possibly getting deleted.
It is recommended that if it is impractical to distinguish events for individual connections (such as a new connection being created not being able to be detected), a 'SYNC' event with all of the connections available should be sent to provided a minimum amount of feedback.
type ConnectionManager ¶
type ConnectionManager interface {
// ListConnections should list all of the connections available from the plugin
ListConnections(ctx pkgtypes.PluginContext) ([]pkgtypes.Connection, error)
// GetConnection should take a unique ID and return the connection data for that connection
GetConnection(ctx pkgtypes.PluginContext, id string) (pkgtypes.Connection, error)
// UpdateConnections should take a map of change data, with the keys being unique IDs of connetion and the values being new connection
// data, and return the map of new, full data
UpdateConnections(
ctx pkgtypes.PluginContext,
data map[string]pkgtypes.Connection,
) (map[string]pkgtypes.Connection, error)
// DeleteConnections should take an array of connection ID's to delete, and return a map of connection ID to states.
DeleteConnections(ctx pkgtypes.PluginContext, ids []string) map[string]error
// SubscribeConnections should stream changes to underlying connection data so that the IDE can respond in real time to changes
// to connections. This function should initiate any watchers (such as a inotify watcher on credential files) to submit to the passed
// in channel.
SubscribeConnections(ctx pkgtypes.PluginContext, reciever chan []ConnectionEvent) error
}
ConnectionManager is the interface the plugin must satisfy in order to provide connection information back to the IDE.
TODO: figure out how we want to manage creating connections themselves.
type DevInfo ¶
type DevInfo struct {
PID int `json:"pid"`
Protocol string `json:"protocol"`
ProtocolVersion int `json:"protocolVersion"`
Addr string `json:"addr"`
VitePort int `json:"vitePort,omitempty"`
PluginID string `json:"pluginId"`
Version string `json:"version"`
StartedAt time.Time `json:"startedAt"`
}
DevInfo represents the contents of a .devinfo file that advertises a running plugin process to the IDE.
func ReadDevInfo ¶
ReadDevInfo reads and parses a .devinfo file.
type Plugin ¶
type Plugin struct {
// settingsProvider is the settings provider for the plugin.
SettingsProvider pkgsettings.Provider
Logger *zap.SugaredLogger
HCLLogger hclog.Logger
// contains filtered or unexported fields
}
func NewPlugin ¶
func NewPlugin(opts PluginOpts) *Plugin
NewPlugin creates a new plugin with the given configuration. This should be instantiated within your main function for your plugin and passed to the Register* functions to add capabilities to the plugin.
func (*Plugin) GetMeta ¶
func (p *Plugin) GetMeta() config.PluginMeta
func (*Plugin) GetPluginID ¶
func (*Plugin) GetPluginMap ¶
GetPluginMap returns the plugin map for the plugin based on the capabilities that have been registered.
func (*Plugin) RegisterCapability ¶
registerCapability registers a plugin capability with the plugin system.
func (*Plugin) Serve ¶
func (p *Plugin) Serve()
Serve begins serving the plugin over the given RPC server. This should be called after all capabilities have been registered.
When the OMNIVIEW_DEV environment variable is set to "1", the function will:
- Intercept the go-plugin handshake line from stdout to capture the listen address
- Write a .devinfo file so the IDE can connect via ReattachConfig
- Register a signal handler to clean up .devinfo on graceful shutdown
type PluginOpts ¶
type PluginOpts struct {
// ID is the unique identifier for the plugin
ID string
// Settings is a list of settings to be used by the plugin
Settings []pkgsettings.Setting
// Debug is the debug mode for the plugin
Debug bool
}
PluginOpts is the options for creating a new plugin.
type ResourcePluginOpts ¶
type ResourcePluginOpts[ClientT any] struct { // LoadConnectionFunc is a function that will be called to load the possible connections // for the resource plugin. LoadConnectionFunc func(*pkgtypes.PluginContext) ([]pkgtypes.Connection, error) LoadConnectionNamespacesFunc func(*pkgtypes.PluginContext, *ClientT) ([]string, error) CheckConnectionFunc func(*pkgtypes.PluginContext, *pkgtypes.Connection, *ClientT) (pkgtypes.ConnectionStatus, error) WatchConnectionsFunc func(*pkgtypes.PluginContext) (chan []pkgtypes.Connection, error) // CreateClient creates a new client for a connection. Required. CreateClient func(*pkgtypes.PluginContext) (*ClientT, error) // RefreshClient refreshes an existing client (e.g., rotate credentials). Optional; if nil, not called. RefreshClient func(*pkgtypes.PluginContext, *ClientT) error // StartClient is called when a connection starts. Optional; if nil, no-op. StartClient func(*pkgtypes.PluginContext, *ClientT) error // StopClient is called when a connection stops. Optional; if nil, no-op. StopClient func(*pkgtypes.PluginContext, *ClientT) error // DiscoveryProvider handles dynamic resource type discovery. If nil, a static type manager is used. DiscoveryProvider types.DiscoveryProvider // Resourcers is a map of resource metadata to resourcers that the plugin will manage. Resourcers map[types.ResourceMeta]types.Resourcer[ClientT] // PatternResourcers is a map of pattern resourcers to use as fallbacks when a registered resourcer is not available. PatternResourcers map[string]types.Resourcer[ClientT] // ResourceGroups is an optional array of resource groups to provide more details about the groups. ResourceGroups []types.ResourceGroup // ResourceDefinitions is a map of resource names to their definitions. ResourceDefinitions map[string]types.ResourceDefinition // DefaultResourceDefinition is the default resource definition to use for resources that do not have // a specific definition. DefaultResourceDefinition types.ResourceDefinition // SyncPolicies maps resource keys to their sync policy. // Resources not in this map default to SyncOnConnect. SyncPolicies map[string]types.InformerSyncPolicy // CreateInformerFunc creates an InformerHandle for a given connection client. If nil, informers are disabled. CreateInformerFunc types.CreateInformerHandleFunc[ClientT] // SchemaFunc is an optional connection-level schema provider. When set, it is called // with the connection client to return editor schemas (e.g., OpenAPI specs from a K8s cluster). // These are merged with any per-resourcer schemas from SchemaResourcer implementations. SchemaFunc func(*pkgtypes.PluginContext, *ClientT) ([]types.EditorSchema, error) // ErrorClassifier is an optional function that classifies raw errors from // resource operations into structured ResourceOperationError values. // When set, the gRPC server calls it before falling back to a generic INTERNAL error. ErrorClassifier func(error) error // LayoutOpts allows for customizing the layout within the UI LayoutOpts *types.LayoutOpts }
ResourcePluginOpts is a set of options for configuring a resource plugin.