Documentation
¶
Overview ¶
Package v1 实现导出文件格式 v1(exportcodec.VersionV1)的 Codec 策略。
v1 的格式约定:
- script.json = version + script_id + script + container_template_specs
- container_template_definitions + container_images;
- workflow.json = version + workflow_id + workflow + scripts + container_template_specs
- container_template_definitions + container_images; (三个容器资产列表均按主键去重:绑定行通过 spec_id 引用运行配置、通过 image_id 引用镜像, 绑定行主键就是脚本 container_template_id 引用的值)
- workflow 目录同时把引用的脚本目录快照到 <workflowDir>/script/<scriptID>, 且排除脚本目录自身的 .git(否则会把脚本仓库塞进 workflow 仓库)。
本包同时负责落盘后的 git 提交:WriteCommitXxxFiles 写完文件(以及 workflow 的脚本快照)后 调 utils.CommitDirChanges 把目录改动提交为一个 commit,提交身份由装配时注入; WriteXxxFiles 只落盘(不提交),供 SaveScript / SaveWorkflow 保持导出文件与数据库一致。 Codec 自身无状态(只持有无状态的 service 依赖与不变的提交身份),可并发使用。
Index ¶
- Constants
- func ScriptIDFromExportScript(item map[string]any) string
- func ScriptSnapshotDir(workflowDir, scriptID string) string
- type Codec
- func (c *Codec) DecodeScript(raw []byte) (*types.ScriptJSONExportResponse, error)
- func (c *Codec) DecodeWorkflow(raw []byte) (*types.WorkflowJSONExportResponse, error)
- func (c *Codec) InstallScript(ctx context.Context, req exportcodec.ScriptInstallRequest) (*exportcodec.ScriptInstallResult, error)
- func (c *Codec) InstallWorkflow(ctx context.Context, req exportcodec.WorkflowInstallRequest) (*exportcodec.WorkflowInstallResult, error)
- func (c *Codec) ScriptIDFromExportScript(item map[string]any) string
- func (c *Codec) ScriptSnapshotDir(workflowDir, scriptID string) string
- func (c *Codec) Version() string
- func (c *Codec) WriteCommitScriptFiles(ctx context.Context, req exportcodec.ScriptWriteRequest) (*types.ScriptJSONExportResponse, error)
- func (c *Codec) WriteCommitWorkflowFiles(ctx context.Context, req exportcodec.WorkflowWriteRequest) (*types.WorkflowJSONExportResponse, error)
- func (c *Codec) WriteScriptFiles(ctx context.Context, req exportcodec.ScriptWriteRequest) (*types.ScriptJSONExportResponse, error)
- func (c *Codec) WriteWorkflowFiles(ctx context.Context, req exportcodec.WorkflowWriteRequest) (*types.WorkflowJSONExportResponse, error)
Constants ¶
const ScriptSnapshotDirName = "script"
ScriptSnapshotDirName 是 v1 布局下 workflow 目录内快照脚本的子目录名: <workflowDir>/script/<scriptID>。安装侧(InstallWorkflow)从同一位置还原脚本目录, 因此两边必须用本常量而不是各自写字面量。
Variables ¶
This section is empty.
Functions ¶
func ScriptIDFromExportScript ¶
ScriptIDFromExportScript 从导出 payload 的脚本条目里取脚本 ID。
v1 落库列是 component_id(types.Script.ScriptID 的 JSON tag), 同时兼容 script_id 是为了让后续格式演进时读侧不必立刻改。
func ScriptSnapshotDir ¶
ScriptSnapshotDir 返回 v1 布局下 workflow 目录内承载某个脚本快照的目录。
Types ¶
type Codec ¶
type Codec struct {
// contains filtered or unexported fields
}
Codec 是 v1 格式的策略实现。
直接持有 WorkflowService:写侧用它按主键生成导出 payload,安装侧用它 upsert workflow / script 行(读侧的 DecodeXxx 不会用到)。 containerService 只在安装侧使用:按主键 upsert 容器镜像 / 运行配置 / 绑定行。 gitIdentity 是落盘后提交使用的身份,装配时由 config.ResolveGitIdentity 解析后注入。
func NewCodec ¶
func NewCodec(workflowService interfaces.WorkflowService, containerService interfaces.ContainerService, gitIdentity utils.GitIdentity) *Codec
NewCodec 构造 v1 Codec。gitIdentity 用于 WriteCommitXxxFiles 落盘后的 git 提交; containerService 用于 InstallXxx 落库容器资产(不需要时可为 nil)。
func (*Codec) DecodeScript ¶
func (c *Codec) DecodeScript(raw []byte) (*types.ScriptJSONExportResponse, error)
DecodeScript 解析 v1 格式的 script.json。
func (*Codec) DecodeWorkflow ¶
func (c *Codec) DecodeWorkflow(raw []byte) (*types.WorkflowJSONExportResponse, error)
DecodeWorkflow 解析 v1 格式的 workflow.json。
v1 在此把 workflow.dag_definition 从对象规整成字符串:导出侧会把它展开成对象, 而落库列是字符串,直接反序列化到 types.Workflow 会失败。
func (*Codec) InstallScript ¶
func (c *Codec) InstallScript(ctx context.Context, req exportcodec.ScriptInstallRequest) (*exportcodec.ScriptInstallResult, error)
InstallScript 解析 req.Raw(内部调用 DecodeScript)并把导出内容持久化到数据库。
迁移自 handler.InstallScript 的落库部分,职责边界与 DecodeScript 一致: DecodeScript 只解析,本方法负责安装特有的校验(script_id 非空)与 upsert。 返回的 payload 只用于取字段,不再回传给调用方做二次解析。
func (*Codec) InstallWorkflow ¶
func (c *Codec) InstallWorkflow(ctx context.Context, req exportcodec.WorkflowInstallRequest) (*exportcodec.WorkflowInstallResult, error)
InstallWorkflow 解析 req.Raw(内部调用 DecodeWorkflow)并把导出内容持久化到数据库与文件系统。
迁移自 handler.InstallWorkflow 的落库与脚本还原部分:
- 先按主键 upsert 容器资产(镜像 → 运行配置 → 绑定行,见 installContainerAssets);
- upsert workflow 行;
- 逐条 upsert workflow.json 里的 script 行;
- 把 workflow 目录内的脚本快照还原到本地脚本目录。
workflow_id 缺失(导出文件损坏)返回 ErrWorkflowIDRequired,由调用方转 400。
func (*Codec) ScriptIDFromExportScript ¶
ScriptIDFromExportScript 让 v1 的脚本条目字段含义可以通过 Codec 接口访问。
func (*Codec) ScriptSnapshotDir ¶
ScriptSnapshotDir 让 v1 的目录布局可以通过 Codec 接口访问 (安装侧从 Registry 取到 Codec 后据此还原脚本目录)。
func (*Codec) WriteCommitScriptFiles ¶ added in v0.1.5
func (c *Codec) WriteCommitScriptFiles(ctx context.Context, req exportcodec.ScriptWriteRequest) (*types.ScriptJSONExportResponse, error)
WriteCommitScriptFiles 在 WriteScriptFiles 的基础上,把脚本目录改动提交为一个 commit。
func (*Codec) WriteCommitWorkflowFiles ¶ added in v0.1.5
func (c *Codec) WriteCommitWorkflowFiles(ctx context.Context, req exportcodec.WorkflowWriteRequest) (*types.WorkflowJSONExportResponse, error)
WriteCommitWorkflowFiles 在 WriteWorkflowFiles 的基础上,把 workflow 目录改动提交为一个 commit。
func (*Codec) WriteScriptFiles ¶
func (c *Codec) WriteScriptFiles(ctx context.Context, req exportcodec.ScriptWriteRequest) (*types.ScriptJSONExportResponse, error)
WriteScriptFiles 生成 v1 格式的 script.json 落盘到 req.ScriptDir(只落盘、不提交 git)。
func (*Codec) WriteWorkflowFiles ¶
func (c *Codec) WriteWorkflowFiles(ctx context.Context, req exportcodec.WorkflowWriteRequest) (*types.WorkflowJSONExportResponse, error)
WriteWorkflowFiles 生成 v1 格式的 workflow.json 落盘到 req.WorkflowDir, 把 workflow 引用的脚本目录快照到 <workflowDir>/script/<scriptID>(排除脚本自身的 .git)。 只落盘、不提交 git。