plugincatalog

package
v0.2.28 Latest Latest
Warning

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

Go to latest
Published: Sep 9, 2026 License: MIT Imports: 5 Imported by: 0

Documentation

Overview

Package plugincatalog 是插件事实的只读、租户作用域视图。安装物视图来自 Edge 上报投影;实例视图由 InstanceViews 从 Server 的 desired + observed 投影构造,为 WebUI 与自动化提供稳定 API。

安全边界(docs/api.md 插件目录):视图只携带白名单字段,绝不返回安装本地绝对路径、 proof、env 或 config secret 值;desired 与 observed 严格分离,Host 未运行时 observed 为 unknown,绝不根据 desired_enabled 虚报 HEALTHY。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func APIInstanceView

func APIInstanceView(in ProjectionInstance) api.PluginInstanceView

APIInstanceView 是单实例的契约视图映射(纯函数,便于反向测试)。

func InstanceViews

func InstanceViews(src ProjectionSource, tenant string) ([]api.PluginInstanceView, error)

InstanceViews 构造契约视图(GET /api/plugin-instances 的载荷)。 desired 与 observed 永远分开呈现:无 observed 时 Observed 为 nil。

func SanitizeDetail

func SanitizeDetail(s string) string

SanitizeDetail 对 Edge 上报的错误摘要做防御性脱敏:截断长度、抹掉本机绝对路径 与疑似凭据值。Edge 侧本应已脱敏(control-plane-sync §2 不变量 6),这里是 Server 不信任下游输入的第二道闸:任何响应体都不得泄漏 secret 明文或本机路径。

Types

type ApplicationContributionView

type ApplicationContributionView struct {
	ID    string            `json:"id"`
	Title string            `json:"title,omitempty"`
	I18n  map[string]string `json:"i18n,omitempty"`
	UI    *api.PluginUIData `json:"ui,omitempty"`
}

ApplicationContributionView 是一个 Application 贡献。requirements 可能携带任意 载荷,为避免泄漏不暴露,仅保留 id/title。

type Catalog

type Catalog interface {
	Plugins(tenant string) ([]PluginView, error)
	Plugin(tenant, id string) (PluginView, bool, error)
}

Catalog is the read-only plugin-installation view consumed by the server. Instance views are built directly from ProjectionSource and are not part of this interface; the write API and instance read API must share that projection.

func NewProjectionCatalog

func NewProjectionCatalog(src ProjectionSource) Catalog

NewProjectionCatalog 用 Server 投影构造只读目录,替换任何 fake/静态来源。 src 为 nil 时返回空目录(永不 panic)。

type ConnectorContributionView

type ConnectorContributionView struct {
	ID        string            `json:"id"`
	Title     string            `json:"title,omitempty"`
	I18n      map[string]string `json:"i18n,omitempty"`
	Direction string            `json:"direction,omitempty"`
	Host      string            `json:"host,omitempty"`
}

ConnectorContributionView 是一个 Connector 贡献。

type ContributesView

type ContributesView struct {
	Drivers      []DriverContributionView      `json:"drivers,omitempty"`
	Applications []ApplicationContributionView `json:"applications,omitempty"`
	Connectors   []ConnectorContributionView   `json:"connectors,omitempty"`
}

ContributesView 是插件声明的贡献。路径类字段只保留相对引用,本地绝对路径被丢弃。

type DriverContributionView

type DriverContributionView struct {
	ID                string            `json:"id"`
	Title             string            `json:"title,omitempty"`
	I18n              map[string]string `json:"i18n,omitempty"`
	Descriptor        string            `json:"descriptor,omitempty"`
	ConfigSchema      string            `json:"configSchema,omitempty"`
	Discovery         string            `json:"discovery,omitempty"`
	CapabilityCatalog string            `json:"capabilityCatalog,omitempty"`
	UI                *api.PluginUIData `json:"ui,omitempty"`
}

DriverContributionView 是一个 Driver 贡献。

type PermissionsView

type PermissionsView struct {
	Hardware   []string `json:"hardware,omitempty"`
	Network    []string `json:"network,omitempty"`
	Filesystem []string `json:"filesystem,omitempty"`
	Secrets    []string `json:"secrets,omitempty"`
}

PermissionsView 是权限披露(请求的名字,非 secret 值)。

type PluginView

type PluginView struct {
	ID            string          `json:"id"`
	Kind          string          `json:"kind"`
	Version       string          `json:"version"`
	Source        string          `json:"source"`
	Digest        string          `json:"digest"`
	Verified      bool            `json:"verified"`
	Compatibility string          `json:"compatibility,omitempty"`
	Protocol      int             `json:"protocol"`
	Permissions   PermissionsView `json:"permissions"`
	Contributes   ContributesView `json:"contributes"`
}

PluginView 是单个已安装插件的脱敏事实视图。

type ProjectionInstance

type ProjectionInstance struct {
	TenantID   int64
	Tenant     string
	EdgeID     string
	InstanceID string
	PluginID   string
	Version    string
	Enabled    bool
	Isolation  string
	// Config 只含非敏感标量与 secret://<name> handle(写入时已拒绝明文凭据)。
	Config map[string]string
	// ConfigPresent 只表示「有非敏感配置」,绝不携带 secret 明文。
	ConfigPresent bool
	// SecretRefs 只含 secret://<name> handle 名。
	SecretRefs []string

	HasObserved bool
	// ObservedVersion 是 Edge 上报的实际版本,与 desired Version 分别承载:
	// 只有 observed 的实例(Server 无期望态)不得把上报值塞进 desired 子视图。
	ObservedVersion string
	State           string
	Health          string
	Detail          string
	RestartCount    int
	LastHealthy     int64
	ReportedAt      int64
	MessageRate     float64

	EdgeOnline      bool
	DesiredRevision uint64
	AppliedRevision uint64
	Drift           bool
	Stale           bool
	LastAckAt       int64
	UpdatedAt       int64
	RowRevision     uint64
}

ProjectionInstance 是 Server 侧「desired + observed」合成后的单实例事实。

不变量(docs/architecture/control-plane-sync.md §2):

  • HasObserved=false 表示 Edge 从未上报过该实例,Observed 必须为 null, 绝不把 desired enabled 渲染成 observed healthy;
  • Drift = desired_revision != applied_revision(期望已变但 Edge 未确认收敛);
  • Stale = 投影过期或所属 edge 离线(只标记,不改写 desired)。

type ProjectionSource

type ProjectionSource interface {
	// Installations 返回租户可见的已安装插件公开事实(Edge 上报投影)。
	Installations(tenant string) ([]api.PluginInstallationStatusData, error)
	// Instances 返回租户可见的插件实例合成事实(desired + observed)。
	Instances(tenant string) ([]ProjectionInstance, error)
}

ProjectionSource 是 Server 投影的只读源(由 internal/server 实现并注入)。 tenant 为租户 slug,与 Catalog 接口保持一致;空串表示全部租户(开发/全局形态)。

实现必须是真实投影:安装物只来自 Edge 上报,期望态只来自 Server 权威存储。 禁止用静态/内置样例数据填充。

Jump to

Keyboard shortcuts

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