plugin

package
v1.11.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 29, 2026 License: MIT Imports: 12 Imported by: 0

Documentation

Index

Constants

View Source
const (
	PlacementResourceDetailActions = "resource.detail.actions"

	DirectionToSource = "source"
	DirectionToTarget = "target"

	RelationTypeDefault = "default"
	RelationTypeGroup   = "group"
	RelationTypeBelong  = "belong"
	RelationTypeRun     = "run"

	MappingOneToOne   = "one_to_one"
	MappingOneToMany  = "one_to_many"
	MappingManyToMany = "many_to_many"

	CardinalityOne  = "one"
	CardinalityMany = "many"
)
View Source
const (
	RuntimeModeBuiltin         = "builtin"
	RuntimeModeExternalService = "external-service"

	MetaDescription = "description"
	MetaRuntime     = "runtime"

	HeaderPluginID = "X-ECMDB-Plugin-ID"

	WellKnownPath = "/.well-known/ecmdb-plugin"

	DefinitionFetchTimeout = 3 * time.Second
)

Variables

This section is empty.

Functions

func CenterBindingUID

func CenterBindingUID(pluginUID string, modelUID string) string

func DecodeResource

func DecodeResource[T any](resource ResolvedResource) (T, error)

DecodeResource 将已解析资源按照 `plugin` tag 解码成强类型结构 T。

func DefinitionHandler

func DefinitionHandler(provider Provider) http.Handler

func DefinitionURL

func DefinitionURL(upstream string) (string, error)

func InputMany

func InputMany[T any](actionCtx ActionContext, name string) ([]T, error)

InputMany 从动作上下文中读取多个输入,并逐个解码成调用方声明的强类型结构 T。

func InputOne

func InputOne[T any](actionCtx ActionContext, name string) (T, error)

InputOne 从动作上下文中读取单个输入,并解码成调用方声明的强类型结构 T。

func InputRootOne

func InputRootOne[T any](actionCtx ActionContext) (T, error)

func MountWellKnown

func MountWellKnown(mux interface {
	Handle(pattern string, handler http.Handler)
}, provider Provider)

func MustRegisterBuiltin

func MustRegisterBuiltin(builtin Builtin)

func MutateBindingGraphPath

func MutateBindingGraphPath(
	graph *BindingGraph,
	path string,
	fn func(node *BindingGraphNode, edge *BindingGraphEdge),
) bool

func NormalizeModelUID

func NormalizeModelUID(modelUID string) (string, error)

func RegisterBuiltin

func RegisterBuiltin(builtin Builtin) error

func Relation

func Relation(sourceModelUID, relationTypeUID, targetModelUID string) *relationItem

func RootInputName

func RootInputName(actionCtx ActionContext) (string, error)

func ValidRelationType

func ValidRelationType(relationType string) bool

func ValidateResolveRequest

func ValidateResolveRequest(req ResolveRequest) error

func ValidateResourceID

func ValidateResourceID(resourceID int64) error

Types

type ActionContext

type ActionContext struct {
	Plugin     Plugin                   `json:"plugin"`
	Binding    Binding                  `json:"binding"`
	Action     ActionSpec               `json:"action"`
	ResourceID int64                    `json:"resource_id"`
	Inputs     map[string]ResolvedInput `json:"inputs"`
	Params     map[string]any           `json:"params,omitempty"`
}

type ActionOption

type ActionOption func(*ActionSpec)

func ActionRuntime

func ActionRuntime(value ActionRuntimeSpec) ActionOption

func Icon

func Icon(value string) ActionOption

func Meta

func Meta(key string, value any) ActionOption

func Permission

func Permission(value string) ActionOption

func Placement

func Placement(value string) ActionOption

func UseBinding

func UseBinding(uid string) ActionOption

type ActionRuntimeSpec

type ActionRuntimeSpec struct {
	Layout  string              `json:"layout,omitempty" bson:"layout,omitempty"`
	Title   string              `json:"title,omitempty" bson:"title,omitempty"`
	Props   map[string]any      `json:"props,omitempty" bson:"props,omitempty"`
	Sidebar *RuntimeSidebarSpec `json:"sidebar,omitempty" bson:"sidebar,omitempty"`
}

type ActionSpec

type ActionSpec struct {
	Action     string             `json:"action" bson:"action"`
	Name       string             `json:"name" bson:"name"`
	Icon       string             `json:"icon" bson:"icon"`
	Placement  string             `json:"placement" bson:"placement"`
	Permission string             `json:"permission,omitempty" bson:"permission,omitempty"`
	BindingUID string             `json:"binding_uid,omitempty" bson:"binding_uid,omitempty"`
	Runtime    *ActionRuntimeSpec `json:"runtime,omitempty" bson:"runtime,omitempty"`
	Meta       map[string]any     `json:"meta,omitempty" bson:"meta,omitempty"`
}

type Attr

type Attr interface {
	Build() Attribute
}

type Attribute

type Attribute struct {
	UID      string `json:"uid"`
	Name     string `json:"name"`
	Type     string `json:"type"`
	Option   any    `json:"option,omitempty"`
	Required bool   `json:"required,omitempty"`
	Display  bool   `json:"display,omitempty"`
	Secure   bool   `json:"secure,omitempty"`
	Builtin  bool   `json:"builtin,omitempty"`
	Index    int64  `json:"index,omitempty"`
}

func Field

func Field(uid string, name string, fieldType string, opts ...AttributeOption) Attribute

type AttributeBuilder

type AttributeBuilder struct {
	// contains filtered or unexported fields
}

func List

func List(uid string, name string, option any, opts ...AttributeOption) *AttributeBuilder

func Multiline

func Multiline(uid string, name string, opts ...AttributeOption) *AttributeBuilder

func String

func String(uid string, name string, opts ...AttributeOption) *AttributeBuilder

func (*AttributeBuilder) Build

func (b *AttributeBuilder) Build() Attribute

func (*AttributeBuilder) Builtin

func (b *AttributeBuilder) Builtin(builtin bool) *AttributeBuilder

func (*AttributeBuilder) Display

func (b *AttributeBuilder) Display() *AttributeBuilder

func (*AttributeBuilder) Index

func (b *AttributeBuilder) Index(index int64) *AttributeBuilder

func (*AttributeBuilder) Options

func (b *AttributeBuilder) Options(option any) *AttributeBuilder

func (*AttributeBuilder) Required

func (b *AttributeBuilder) Required() *AttributeBuilder

func (*AttributeBuilder) Secure

func (b *AttributeBuilder) Secure() *AttributeBuilder

type AttributeGroup

type AttributeGroup struct {
	Name   string      `json:"name"`
	Index  int64       `json:"index,omitempty"`
	Fields []Attribute `json:"fields,omitempty"`
}

type AttributeOption

type AttributeOption func(*Attribute)

func AttributeBuiltin

func AttributeBuiltin(builtin bool) AttributeOption

type Binding

type Binding struct {
	ID       int64         `json:"id"`
	UID      string        `json:"uid"`
	PluginID string        `json:"plugin_id"`
	ModelUID string        `json:"model_uid"`
	Enabled  bool          `json:"enabled"`
	Graph    *BindingGraph `json:"graph,omitempty"`
	Ctime    int64         `json:"ctime,omitempty"`
	Utime    int64         `json:"utime,omitempty"`
}

func PrepareBinding

func PrepareBinding(binding Binding) (Binding, error)

func PrepareBindings

func PrepareBindings(pluginID string, bindings []Binding) ([]Binding, error)

func (Binding) Validate

func (b Binding) Validate() error

type BindingFactory

type BindingFactory func(pluginUID string) (Binding, error)

func Center

func Center[T any](modelUID string, opts ...BindingOption) BindingFactory

func CenterNamed

func CenterNamed[T any](name string, modelUID string, opts ...BindingOption) BindingFactory

type BindingGraph

type BindingGraph struct {
	EntryNodeID string             `json:"entry_node_id"`
	Nodes       []BindingGraphNode `json:"nodes"`
	Edges       []BindingGraphEdge `json:"edges,omitempty"`
}

func BuildCenterGraph

func BuildCenterGraph[T any](name string, modelUID string) (*BindingGraph, error)

func GraphFromBindingSpecs

func GraphFromBindingSpecs(modelUID string, specs []ResourceSpec) (*BindingGraph, error)

type BindingGraphEdge

type BindingGraphEdge struct {
	From         string `json:"from"`
	To           string `json:"to"`
	RelationType string `json:"relation_type,omitempty"`
	Direction    string `json:"direction,omitempty"`
}

type BindingGraphNode

type BindingGraphNode struct {
	ID            string         `json:"id"`
	Name          string         `json:"name"`
	ModelUID      string         `json:"model_uid"`
	Cardinality   string         `json:"cardinality"`
	Required      bool           `json:"required"`
	FieldMappings []FieldMapping `json:"field_mappings,omitempty"`
	Filters       []Filter       `json:"filters,omitempty"`
}

func GraphEntryNode

func GraphEntryNode(graph *BindingGraph) (BindingGraphNode, bool)

type BindingOption

type BindingOption func(*Binding)

func At

func At(path string, opts ...SpecOption) BindingOption

func BindingEnabled

func BindingEnabled(value bool) BindingOption

func Node

func Node(path string, fn func(node *BindingGraphNode, edge *BindingGraphEdge)) BindingOption

func Spec

func Spec(path string, fn func(*ResourceSpec)) BindingOption

type Builtin

type Builtin interface {
	Definition() Definition
	SchemaForBindings(bindings []Binding) (Schema, error)
}

func Builtins

func Builtins() []Builtin

func FindBuiltin

func FindBuiltin(pluginID string) (Builtin, bool)

func StaticBuiltin

func StaticBuiltin(def Definition) Builtin

type Configurator

type Configurator struct {
	// contains filtered or unexported fields
}

Configurator 用于链式配置和修饰 ResourceSpec 节点树

func Configure

func Configure(specs []ResourceSpec) *Configurator

Configure 初始化配置器

func (*Configurator) Build

func (c *Configurator) Build() []ResourceSpec

Build 返回微调配置后的 specs 列表

func (*Configurator) ForPath

func (c *Configurator) ForPath(path string, fn func(spec *ResourceSpec)) *Configurator

ForPath 通过点路径(例如 "target.gateways.sub_gateways")定位具体的 ResourceSpec 节点进行微调

type ContextResolver

type ContextResolver interface {
	ResolveActionContext(ctx context.Context, req ResolveRequest) (ActionContext, error)
}

ContextResolver 描述 ECMDB Core 暴露给插件后端的资源上下文解析能力。

插件后端只传 plugin_id、action、resource_id 和必要参数,敏感字段由 ECMDB 后端解析, 避免 password/private_key 等内容经过浏览器。

type Definition

type Definition struct {
	Plugin   Plugin    `json:"plugin"`
	Schema   Schema    `json:"schema"`
	Bindings []Binding `json:"bindings"`
}

func FetchDefinition

func FetchDefinition(ctx context.Context, upstream string) (Definition, error)

func (Definition) Save

func (d Definition) Save(ctx context.Context, store Store) error

type FieldMapping

type FieldMapping struct {
	Input         string `json:"input"`
	ResourceField string `json:"resource_field"`
	Required      bool   `json:"required,omitempty"`
}

type Filter

type Filter struct {
	Field    string `json:"field"`
	Operator string `json:"operator"`
	Value    any    `json:"value"`
}

type ModelBuilder

type ModelBuilder struct {
	// contains filtered or unexported fields
}

func Model

func Model(uid string, name string, opts ...ModelOption) *ModelBuilder

func (*ModelBuilder) AttrGroup

func (b *ModelBuilder) AttrGroup(name string, index int64, attrs ...Attr) *ModelBuilder

func (*ModelBuilder) Build

func (b *ModelBuilder) Build() ModelSpec

type ModelGroupSpec

type ModelGroupSpec struct {
	Name string `json:"name"`
}

type ModelOption

type ModelOption func(*ModelSpec)

func ModelBuiltin

func ModelBuiltin(builtin bool) ModelOption

func ModelGroupName

func ModelGroupName(groupName string) ModelOption

func ModelIcon

func ModelIcon(icon string) ModelOption

type ModelRelation

type ModelRelation struct {
	SourceModelUID  string `json:"source_model_uid"`
	TargetModelUID  string `json:"target_model_uid"`
	RelationTypeUID string `json:"relation_type_uid"`
	Mapping         string `json:"mapping"`
}

type ModelSpec

type ModelSpec struct {
	UID             string           `json:"uid"`
	Name            string           `json:"name"`
	Icon            string           `json:"icon,omitempty"`
	GroupName       string           `json:"group_name,omitempty"`
	Builtin         bool             `json:"builtin"`
	AttributeGroups []AttributeGroup `json:"attribute_groups,omitempty"`
}

type Option

type Option func(*Plugin)

func BuiltinRuntime

func BuiltinRuntime() Option

func Description

func Description(value string) Option

func ExternalServiceRuntime

func ExternalServiceRuntime(upstream string, opts ...RuntimeOption) Option

func Runtime

func Runtime(spec RuntimeSpec) Option

func Type

func Type(value string) Option

func Version

func Version(value string) Option

type Plugin

type Plugin struct {
	ID      int64          `json:"id" bson:"id"`
	UID     string         `json:"uid" bson:"uid"`
	Name    string         `json:"name" bson:"name"`
	Type    string         `json:"type" bson:"type"`
	Version string         `json:"version" bson:"version"`
	Actions []ActionSpec   `json:"actions" bson:"actions"`
	Meta    map[string]any `json:"meta,omitempty" bson:"meta,omitempty"`
	Ctime   int64          `json:"ctime,omitempty" bson:"ctime,omitempty"`
	Utime   int64          `json:"utime,omitempty" bson:"utime,omitempty"`
}

func (Plugin) FindAction

func (p Plugin) FindAction(name string) (ActionSpec, bool)

func (Plugin) ResourceActions

func (p Plugin) ResourceActions() []ResourceAction

func (Plugin) Runtime

func (p Plugin) Runtime() (RuntimeSpec, bool)

func (*Plugin) SetRuntime

func (p *Plugin) SetRuntime(spec RuntimeSpec)

func (Plugin) Validate

func (p Plugin) Validate() error

type Provider

type Provider interface {
	Definition() (Definition, error)
}

Provider 是插件实现方需要提供的最小契约。

type ProviderFunc

type ProviderFunc func() (Definition, error)

func (ProviderFunc) Definition

func (fn ProviderFunc) Definition() (Definition, error)

type Registry

type Registry struct {
	// contains filtered or unexported fields
}

func NewRegistry

func NewRegistry(uid string, name string, opts ...Option) *Registry

func (*Registry) Action

func (r *Registry) Action(action string, name string, opts ...ActionOption) *Registry

func (*Registry) Bind

func (r *Registry) Bind(factory BindingFactory) *Registry

func (*Registry) Definition

func (r *Registry) Definition() (Definition, error)

func (*Registry) MustDefinition

func (r *Registry) MustDefinition() Definition

func (*Registry) Setup

func (r *Registry) Setup(items ...SetupItem) *Registry

type RelationType

type RelationType struct {
	UID            string `json:"uid"`
	Name           string `json:"name"`
	SourceDescribe string `json:"source_describe,omitempty"`
	TargetDescribe string `json:"target_describe,omitempty"`
}

func BasicRelationTypes

func BasicRelationTypes() []RelationType

type ResolveRequest

type ResolveRequest struct {
	PluginID   string         `json:"plugin_id"`
	Action     string         `json:"action"`
	ResourceID int64          `json:"resource_id"`
	Params     map[string]any `json:"params,omitempty"`
}

type ResolveResult

type ResolveResult struct {
	PluginID      string                   `json:"plugin_id"`
	PluginName    string                   `json:"plugin_name"`
	PluginVersion string                   `json:"plugin_version,omitempty"`
	ActionName    string                   `json:"action_name"`
	Action        string                   `json:"action"`
	Permission    string                   `json:"permission,omitempty"`
	BindingUID    string                   `json:"binding_uid,omitempty"`
	ModelUID      string                   `json:"model_uid,omitempty"`
	ResourceID    int64                    `json:"resource_id"`
	Inputs        map[string]ResolvedInput `json:"inputs"`
	Params        map[string]any           `json:"params,omitempty"`
	Runtime       *ActionRuntimeSpec       `json:"runtime,omitempty"`
	Meta          map[string]any           `json:"meta,omitempty"`
}

type ResolvedInput

type ResolvedInput struct {
	Name        string             `json:"name"`
	Cardinality string             `json:"cardinality"`
	Resources   []ResolvedResource `json:"resources"`
}

type ResolvedResource

type ResolvedResource struct {
	ResourceID int64                    `json:"resource_id,omitempty"`
	ModelUID   string                   `json:"model_uid,omitempty"`
	Fields     map[string]any           `json:"fields"`
	Children   map[string]ResolvedInput `json:"children,omitempty"`
}

type ResourceAction

type ResourceAction struct {
	PluginID   string             `json:"plugin_id"`
	Action     string             `json:"action"`
	Name       string             `json:"name"`
	Icon       string             `json:"icon"`
	Placement  string             `json:"placement"`
	Permission string             `json:"permission,omitempty"`
	BindingUID string             `json:"binding_uid,omitempty"`
	Runtime    *ActionRuntimeSpec `json:"runtime,omitempty"`
	Meta       map[string]any     `json:"meta,omitempty"`
}

type ResourceActions

type ResourceActions struct {
	ResourceID int64            `json:"resource_id"`
	Actions    []ResourceAction `json:"actions"`
}

type ResourceSpec

type ResourceSpec struct {
	Name           string            `json:"name"`                      // 资源名称 (Go struct 中的字段名)
	ModelUID       string            `json:"model_uid"`                 // CMDB 模型 UID
	RelationType   string            `json:"relation_type,omitempty"`   // 关联类型 UID
	Direction      string            `json:"direction,omitempty"`       // 关联查询方向:auto / source / target
	Cardinality    string            `json:"cardinality"`               // 数量基数:one / many
	Required       bool              `json:"required"`                  // 是否必填/必存在
	Fields         map[string]string `json:"fields"`                    // 字段映射 [Go 属性字段名]CMDB 属性字段 UID
	RequiredFields []string          `json:"required_fields,omitempty"` // 必填/非空属性字段列表
	Filters        []Filter          `json:"filters,omitempty"`         // 过滤条件
	Children       []ResourceSpec    `json:"children,omitempty"`        // 子级关联资源列表
}

ResourceSpec 描述插件依赖的 CMDB 资源拓扑树节点定义

func BuildCenterSpec

func BuildCenterSpec[T any](name string, modelUID string) (ResourceSpec, error)

func BuildSpecs

func BuildSpecs[T any]() ([]ResourceSpec, error)

BuildSpecs 基于顶层输入容器 T 反射解析出 plugin.ResourceSpec 列表。

func CompileBindingGraph

func CompileBindingGraph(graph *BindingGraph) ([]ResourceSpec, error)

type RuntimeOption

type RuntimeOption func(*RuntimeSpec)

func RuntimeHealthPath

func RuntimeHealthPath(path string) RuntimeOption

type RuntimeSidebarResourceSpec

type RuntimeSidebarResourceSpec struct {
	ModelUID      string   `json:"model_uid,omitempty" bson:"model_uid,omitempty"`
	TitleField    string   `json:"title_field,omitempty" bson:"title_field,omitempty"`
	SubtitleField string   `json:"subtitle_field,omitempty" bson:"subtitle_field,omitempty"`
	SearchFields  []string `json:"search_fields,omitempty" bson:"search_fields,omitempty"`
	Limit         int      `json:"limit,omitempty" bson:"limit,omitempty"`
}

type RuntimeSidebarSpec

type RuntimeSidebarSpec struct {
	Enabled           *bool                       `json:"enabled,omitempty" bson:"enabled,omitempty"`
	Mode              string                      `json:"mode,omitempty" bson:"mode,omitempty"`
	Title             string                      `json:"title,omitempty" bson:"title,omitempty"`
	SearchPlaceholder string                      `json:"search_placeholder,omitempty" bson:"search_placeholder,omitempty"`
	EmptyText         string                      `json:"empty_text,omitempty" bson:"empty_text,omitempty"`
	Collapsible       *bool                       `json:"collapsible,omitempty" bson:"collapsible,omitempty"`
	Resource          *RuntimeSidebarResourceSpec `json:"resource,omitempty" bson:"resource,omitempty"`
}

type RuntimeSpec

type RuntimeSpec struct {
	Mode       string `json:"mode"`
	Upstream   string `json:"upstream,omitempty"`
	HealthPath string `json:"health_path,omitempty"`
}

type Schema

type Schema struct {
	ModelGroups    []ModelGroupSpec `json:"model_groups,omitempty"`
	Models         []ModelSpec      `json:"models,omitempty"`
	RelationTypes  []RelationType   `json:"relation_types,omitempty"`
	ModelRelations []ModelRelation  `json:"model_relations,omitempty"`
}

type SchemaBuilder

type SchemaBuilder struct {
	// contains filtered or unexported fields
}

func (*SchemaBuilder) Build

func (b *SchemaBuilder) Build() Schema

func (*SchemaBuilder) Model

func (b *SchemaBuilder) Model(model ModelSpec) *SchemaBuilder

func (*SchemaBuilder) ModelGroup

func (b *SchemaBuilder) ModelGroup(name string) *SchemaBuilder

func (*SchemaBuilder) ModelGroups

func (b *SchemaBuilder) ModelGroups(groups ...ModelGroupSpec) *SchemaBuilder

func (*SchemaBuilder) Models

func (b *SchemaBuilder) Models(models ...ModelSpec) *SchemaBuilder

func (*SchemaBuilder) Relation

func (b *SchemaBuilder) Relation(sourceModelUID, relationTypeUID, targetModelUID, mapping string) *SchemaBuilder

func (*SchemaBuilder) RelationType

func (b *SchemaBuilder) RelationType(relationType RelationType) *SchemaBuilder

func (*SchemaBuilder) RelationTypes

func (b *SchemaBuilder) RelationTypes(relationTypes ...RelationType) *SchemaBuilder

func (*SchemaBuilder) Setup

func (b *SchemaBuilder) Setup(items ...SetupItem) *SchemaBuilder

type SetupItem

type SetupItem interface {
	// contains filtered or unexported methods
}

func ModelGroup

func ModelGroup(name string) SetupItem

func RelationTypes

func RelationTypes(relationTypes ...RelationType) SetupItem

type SpecOption

type SpecOption func(*BindingGraphNode, *BindingGraphEdge)

func In

func In(relationType string) SpecOption

func Out

func Out(relationType string) SpecOption

func Required

func Required(value bool) SpecOption

func Where

func Where(field string, operator string, value any) SpecOption

type Store

type Store interface {
	UpsertPlugin(ctx context.Context, p Plugin) error
	UpsertBinding(ctx context.Context, b Binding) error
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL