github.com/qiniu/go-sdk/v7@v7.27.0/sandbox/types_template.go (about)

     1  package sandbox
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"time"
     7  
     8  	"github.com/qiniu/go-sdk/v7/sandbox/internal/apis"
     9  )
    10  
    11  // ---------------------------------------------------------------------------
    12  // SDK 自有类型 — 模板相关
    13  // ---------------------------------------------------------------------------
    14  
    15  // TemplateBuildStatus 模板构建状态。
    16  type TemplateBuildStatus string
    17  
    18  // 模板构建状态常量。
    19  const (
    20  	BuildStatusReady    TemplateBuildStatus = "ready"
    21  	BuildStatusError    TemplateBuildStatus = "error"
    22  	BuildStatusBuilding TemplateBuildStatus = "building"
    23  	BuildStatusWaiting  TemplateBuildStatus = "waiting"
    24  	BuildStatusUploaded TemplateBuildStatus = "uploaded"
    25  )
    26  
    27  // LogLevel 日志级别。
    28  type LogLevel string
    29  
    30  // 日志级别常量。
    31  const (
    32  	LogLevelDebug LogLevel = "debug"
    33  	LogLevelError LogLevel = "error"
    34  	LogLevelInfo  LogLevel = "info"
    35  	LogLevelWarn  LogLevel = "warn"
    36  )
    37  
    38  // LogsDirection 日志方向。
    39  type LogsDirection string
    40  
    41  // 日志方向常量。
    42  const (
    43  	LogsDirectionBackward LogsDirection = "backward"
    44  	LogsDirectionForward  LogsDirection = "forward"
    45  )
    46  
    47  // LogsSource 日志来源。
    48  type LogsSource string
    49  
    50  // 日志来源常量。
    51  const (
    52  	LogsSourcePersistent LogsSource = "persistent"
    53  	LogsSourceTemporary  LogsSource = "temporary"
    54  )
    55  
    56  // TemplateStep 模板构建步骤。
    57  type TemplateStep struct {
    58  	// Args 步骤参数。
    59  	Args *[]string
    60  
    61  	// FilesHash 步骤中使用文件的哈希值。
    62  	FilesHash *string
    63  
    64  	// Force 是否强制执行(忽略缓存)。
    65  	Force *bool
    66  
    67  	// Type 步骤类型。
    68  	Type string
    69  }
    70  
    71  func templateStepsToAPI(steps *[]TemplateStep) *[]apis.TemplateStep {
    72  	if steps == nil {
    73  		return nil
    74  	}
    75  	result := make([]apis.TemplateStep, len(*steps))
    76  	for i, s := range *steps {
    77  		result[i] = apis.TemplateStep{
    78  			Args:      s.Args,
    79  			FilesHash: s.FilesHash,
    80  			Force:     s.Force,
    81  			Type:      s.Type,
    82  		}
    83  	}
    84  	return &result
    85  }
    86  
    87  // FromImageRegistry 镜像仓库认证配置(union 类型,支持 AWS/GCP/General 三种 registry)。
    88  // 使用 json.RawMessage 保留原始 JSON 格式,由服务端解析具体类型。
    89  type FromImageRegistry = json.RawMessage
    90  
    91  // CreateTemplateParams 创建模板的请求参数。
    92  type CreateTemplateParams struct {
    93  	// Alias 模板别名(已废弃,请使用 Name)。
    94  	Alias *string
    95  
    96  	// CPUCount 沙箱 CPU 核数。
    97  	CPUCount *int32
    98  
    99  	// MemoryMB 沙箱内存大小(MiB)。
   100  	MemoryMB *int32
   101  
   102  	// Name 模板名称,可包含标签(如 "my-template" 或 "my-template:v1")。
   103  	Name *string
   104  
   105  	// Tags 分配给模板构建的标签列表。
   106  	Tags *[]string
   107  
   108  	// TeamID 团队 ID(已废弃)。
   109  	TeamID *string
   110  }
   111  
   112  func (p *CreateTemplateParams) toAPI() apis.CreateTemplateV3JSONRequestBody {
   113  	return apis.CreateTemplateV3JSONRequestBody{
   114  		Alias:    p.Alias,
   115  		CPUCount: p.CPUCount,
   116  		MemoryMB: p.MemoryMB,
   117  		Name:     p.Name,
   118  		Tags:     p.Tags,
   119  		TeamID:   p.TeamID,
   120  	}
   121  }
   122  
   123  // UpdateTemplateParams 更新模板的请求参数。
   124  type UpdateTemplateParams struct {
   125  	// Public 模板是否公开。
   126  	Public *bool
   127  }
   128  
   129  func (p *UpdateTemplateParams) toAPI() apis.UpdateTemplateJSONRequestBody {
   130  	return apis.UpdateTemplateJSONRequestBody{
   131  		Public: p.Public,
   132  	}
   133  }
   134  
   135  // RebuildTemplateParams 重新构建已有模板的请求参数。
   136  // 对应 POST /templates/{templateID}:在已存在的模板上创建一个新的 waiting build,
   137  // 返回新的 buildID,后续可通过 StartTemplateBuild 驱动该 build。
   138  type RebuildTemplateParams struct {
   139  	// Dockerfile 必填,模板使用的 Dockerfile 内容。
   140  	Dockerfile string
   141  
   142  	// Alias 模板别名。
   143  	Alias *string
   144  
   145  	// CPUCount 沙箱 CPU 核数。
   146  	CPUCount *int32
   147  
   148  	// MemoryMB 沙箱内存大小(MiB)。
   149  	MemoryMB *int32
   150  
   151  	// StartCmd 构建完成后执行的启动命令。
   152  	StartCmd *string
   153  
   154  	// ReadyCmd 就绪检查命令。
   155  	ReadyCmd *string
   156  
   157  	// TeamID 团队 ID(已废弃)。
   158  	TeamID *string
   159  }
   160  
   161  func (p *RebuildTemplateParams) toAPI() apis.RebuildTemplateJSONRequestBody {
   162  	return apis.RebuildTemplateJSONRequestBody{
   163  		Alias:      p.Alias,
   164  		CPUCount:   p.CPUCount,
   165  		Dockerfile: p.Dockerfile,
   166  		MemoryMB:   p.MemoryMB,
   167  		ReadyCmd:   p.ReadyCmd,
   168  		StartCmd:   p.StartCmd,
   169  		TeamID:     p.TeamID,
   170  	}
   171  }
   172  
   173  // StartTemplateBuildParams 启动模板构建的请求参数。
   174  type StartTemplateBuildParams struct {
   175  	// Force 是否强制完整构建(忽略缓存)。
   176  	Force *bool
   177  
   178  	// FromImage 用作模板构建基础的镜像。
   179  	FromImage *string
   180  
   181  	// FromImageRegistry 镜像仓库认证配置。
   182  	FromImageRegistry *FromImageRegistry
   183  
   184  	// FromTemplate 用作模板构建基础的模板。
   185  	FromTemplate *string
   186  
   187  	// ReadyCmd 构建完成后执行的就绪检查命令。
   188  	ReadyCmd *string
   189  
   190  	// StartCmd 构建完成后执行的启动命令。
   191  	StartCmd *string
   192  
   193  	// Steps 模板构建步骤列表。
   194  	Steps *[]TemplateStep
   195  }
   196  
   197  func (p *StartTemplateBuildParams) toAPI() (apis.StartTemplateBuildV2JSONRequestBody, error) {
   198  	body := apis.StartTemplateBuildV2JSONRequestBody{
   199  		Force:        p.Force,
   200  		FromImage:    p.FromImage,
   201  		FromTemplate: p.FromTemplate,
   202  		ReadyCmd:     p.ReadyCmd,
   203  		StartCmd:     p.StartCmd,
   204  		Steps:        templateStepsToAPI(p.Steps),
   205  	}
   206  	if p.FromImageRegistry != nil {
   207  		reg := apis.FromImageRegistry{}
   208  		if err := reg.UnmarshalJSON(*p.FromImageRegistry); err != nil {
   209  			return body, fmt.Errorf("unmarshal from_image_registry: %w", err)
   210  		}
   211  		body.FromImageRegistry = &reg
   212  	}
   213  	return body, nil
   214  }
   215  
   216  // ListTemplatesParams 列出模板的查询参数。
   217  type ListTemplatesParams struct {
   218  	// TeamID 团队 ID。
   219  	TeamID *string
   220  }
   221  
   222  func (p *ListTemplatesParams) toAPI() *apis.ListTemplatesParams {
   223  	if p == nil {
   224  		return nil
   225  	}
   226  	return &apis.ListTemplatesParams{
   227  		TeamID: p.TeamID,
   228  	}
   229  }
   230  
   231  // GetTemplateParams 获取模板详情的查询参数。
   232  type GetTemplateParams struct {
   233  	// NextToken 分页游标。
   234  	NextToken *string
   235  
   236  	// Limit 每页最大返回数。
   237  	Limit *int32
   238  }
   239  
   240  func (p *GetTemplateParams) toAPI() *apis.GetTemplateParams {
   241  	if p == nil {
   242  		return nil
   243  	}
   244  	return &apis.GetTemplateParams{
   245  		NextToken: p.NextToken,
   246  		Limit:     p.Limit,
   247  	}
   248  }
   249  
   250  // GetBuildStatusParams 获取构建状态的查询参数。
   251  type GetBuildStatusParams struct {
   252  	// LogsOffset 起始构建日志的索引。
   253  	LogsOffset *int32
   254  
   255  	// Limit 返回的最大日志条数。
   256  	Limit *int32
   257  
   258  	// Level 日志级别过滤。
   259  	Level *LogLevel
   260  }
   261  
   262  func (p *GetBuildStatusParams) toAPI() *apis.GetTemplateBuildStatusParams {
   263  	if p == nil {
   264  		return nil
   265  	}
   266  	params := &apis.GetTemplateBuildStatusParams{
   267  		LogsOffset: p.LogsOffset,
   268  		Limit:      p.Limit,
   269  	}
   270  	if p.Level != nil {
   271  		level := apis.LogLevel(*p.Level)
   272  		params.Level = &level
   273  	}
   274  	return params
   275  }
   276  
   277  // GetBuildLogsParams 获取构建日志的查询参数。
   278  type GetBuildLogsParams struct {
   279  	// Cursor 起始时间戳(毫秒)。
   280  	Cursor *int64
   281  
   282  	// Limit 返回的最大日志条数。
   283  	Limit *int32
   284  
   285  	// Direction 日志方向。
   286  	Direction *LogsDirection
   287  
   288  	// Level 日志级别过滤。
   289  	Level *LogLevel
   290  
   291  	// Source 日志来源过滤。
   292  	Source *LogsSource
   293  }
   294  
   295  func (p *GetBuildLogsParams) toAPI() *apis.GetTemplateBuildLogsParams {
   296  	if p == nil {
   297  		return nil
   298  	}
   299  	params := &apis.GetTemplateBuildLogsParams{
   300  		Cursor: p.Cursor,
   301  		Limit:  p.Limit,
   302  	}
   303  	if p.Direction != nil {
   304  		dir := apis.LogsDirection(*p.Direction)
   305  		params.Direction = &dir
   306  	}
   307  	if p.Level != nil {
   308  		level := apis.LogLevel(*p.Level)
   309  		params.Level = &level
   310  	}
   311  	if p.Source != nil {
   312  		src := apis.LogsSource(*p.Source)
   313  		params.Source = &src
   314  	}
   315  	return params
   316  }
   317  
   318  // ManageTagsParams 管理模板标签的请求参数。
   319  type ManageTagsParams struct {
   320  	// Tags 要分配给模板的标签列表。
   321  	Tags []string
   322  
   323  	// Target 目标模板(格式:"name:tag")。
   324  	Target string
   325  }
   326  
   327  func (p *ManageTagsParams) toAPI() apis.AssignTemplateTagsJSONRequestBody {
   328  	return apis.AssignTemplateTagsJSONRequestBody{
   329  		Tags:   p.Tags,
   330  		Target: p.Target,
   331  	}
   332  }
   333  
   334  // DeleteTagsParams 删除模板标签的请求参数。
   335  type DeleteTagsParams struct {
   336  	// Name 模板名称。
   337  	Name string
   338  
   339  	// Tags 要删除的标签列表。
   340  	Tags []string
   341  }
   342  
   343  func (p *DeleteTagsParams) toAPI() apis.DeleteTemplateTagsJSONRequestBody {
   344  	return apis.DeleteTemplateTagsJSONRequestBody{
   345  		Name: p.Name,
   346  		Tags: p.Tags,
   347  	}
   348  }
   349  
   350  // Template 模板信息。
   351  type Template struct {
   352  	TemplateID string
   353  	// Aliases 模板别名(已弃用,请使用 Names)。
   354  	// Deprecated: 使用 Names。
   355  	Aliases []string
   356  	// Names 模板名称,使用命名空间/别名格式。
   357  	Names         []string
   358  	BuildID       string
   359  	BuildStatus   TemplateBuildStatus
   360  	BuildCount    int32
   361  	CPUCount      int32
   362  	MemoryMB      int32
   363  	DiskSizeMB    int32
   364  	EnvdVersion   string
   365  	Public        bool
   366  	SpawnCount    int64
   367  	CreatedAt     time.Time
   368  	UpdatedAt     time.Time
   369  	LastSpawnedAt *time.Time
   370  }
   371  
   372  // TemplateBuild 模板构建记录。
   373  type TemplateBuild struct {
   374  	BuildID     string
   375  	Status      TemplateBuildStatus
   376  	CPUCount    int32
   377  	MemoryMB    int32
   378  	DiskSizeMB  *int32
   379  	EnvdVersion *string
   380  	CreatedAt   time.Time
   381  	UpdatedAt   time.Time
   382  	FinishedAt  *time.Time
   383  }
   384  
   385  // TemplateWithBuilds 模板及其构建记录。
   386  type TemplateWithBuilds struct {
   387  	TemplateID string
   388  	// Aliases 模板别名(已弃用,请使用 Names)。
   389  	// Deprecated: 使用 Names。
   390  	Aliases []string
   391  	// Names 模板名称,使用命名空间/别名格式。
   392  	Names []string
   393  	// IsOwner 表示模板是否归当前请求团队所有。
   394  	IsOwner       bool
   395  	Public        bool
   396  	SpawnCount    int64
   397  	CreatedAt     time.Time
   398  	UpdatedAt     time.Time
   399  	LastSpawnedAt *time.Time
   400  	Builds        []TemplateBuild
   401  }
   402  
   403  // TemplateBuildInfo 模板构建状态信息。
   404  type TemplateBuildInfo struct {
   405  	TemplateID string
   406  	BuildID    string
   407  	Status     TemplateBuildStatus
   408  	Logs       []string
   409  }
   410  
   411  // TemplateBuildLogs 模板构建日志。
   412  type TemplateBuildLogs struct {
   413  	Logs []BuildLogEntry
   414  }
   415  
   416  // BuildLogEntry 构建日志条目。
   417  type BuildLogEntry struct {
   418  	Level     LogLevel
   419  	Message   string
   420  	Step      *string
   421  	Timestamp time.Time
   422  }
   423  
   424  // TemplateCreateResponse 创建模板的响应。
   425  type TemplateCreateResponse struct {
   426  	TemplateID string
   427  	BuildID    string
   428  	Aliases    []string
   429  	Names      []string
   430  	Tags       []string
   431  	Public     bool
   432  }
   433  
   434  // TemplateBuildFileUpload 模板构建文件上传信息。
   435  type TemplateBuildFileUpload struct {
   436  	// Present 文件是否已存在。
   437  	Present bool
   438  	// URL 上传地址。
   439  	URL *string
   440  }
   441  
   442  // TemplateAliasResponse 模板别名查询响应。
   443  type TemplateAliasResponse struct {
   444  	TemplateID string
   445  	Public     bool
   446  }
   447  
   448  // AssignedTemplateTags 分配的模板标签。
   449  type AssignedTemplateTags struct {
   450  	BuildID string
   451  	Tags    []string
   452  }
   453  
   454  // ---------------------------------------------------------------------------
   455  // 转换函数 — apis → SDK
   456  // ---------------------------------------------------------------------------
   457  
   458  func templateFromAPI(a apis.Template) Template {
   459  	return Template{
   460  		TemplateID:    a.TemplateID,
   461  		Aliases:       a.Aliases,
   462  		Names:         a.Names,
   463  		BuildID:       a.BuildID,
   464  		BuildStatus:   TemplateBuildStatus(a.BuildStatus),
   465  		BuildCount:    a.BuildCount,
   466  		CPUCount:      a.CPUCount,
   467  		MemoryMB:      a.MemoryMB,
   468  		DiskSizeMB:    a.DiskSizeMB,
   469  		EnvdVersion:   a.EnvdVersion,
   470  		Public:        a.Public,
   471  		SpawnCount:    a.SpawnCount,
   472  		CreatedAt:     a.CreatedAt,
   473  		UpdatedAt:     a.UpdatedAt,
   474  		LastSpawnedAt: a.LastSpawnedAt,
   475  	}
   476  }
   477  
   478  func templatesFromAPI(a []apis.Template) []Template {
   479  	if a == nil {
   480  		return nil
   481  	}
   482  	result := make([]Template, len(a))
   483  	for i, t := range a {
   484  		result[i] = templateFromAPI(t)
   485  	}
   486  	return result
   487  }
   488  
   489  func templateBuildFromAPI(a apis.TemplateBuild) TemplateBuild {
   490  	return TemplateBuild{
   491  		BuildID:     a.BuildID.String(),
   492  		Status:      TemplateBuildStatus(a.Status),
   493  		CPUCount:    a.CPUCount,
   494  		MemoryMB:    a.MemoryMB,
   495  		DiskSizeMB:  a.DiskSizeMB,
   496  		EnvdVersion: a.EnvdVersion,
   497  		CreatedAt:   a.CreatedAt,
   498  		UpdatedAt:   a.UpdatedAt,
   499  		FinishedAt:  a.FinishedAt,
   500  	}
   501  }
   502  
   503  func templateWithBuildsFromAPI(a *apis.TemplateWithBuilds) *TemplateWithBuilds {
   504  	if a == nil {
   505  		return nil
   506  	}
   507  	result := &TemplateWithBuilds{
   508  		TemplateID:    a.TemplateID,
   509  		Aliases:       a.Aliases,
   510  		Names:         a.Names,
   511  		IsOwner:       a.IsOwner,
   512  		Public:        a.Public,
   513  		SpawnCount:    a.SpawnCount,
   514  		CreatedAt:     a.CreatedAt,
   515  		UpdatedAt:     a.UpdatedAt,
   516  		LastSpawnedAt: a.LastSpawnedAt,
   517  		Builds:        make([]TemplateBuild, 0, len(a.Builds)),
   518  	}
   519  	for _, b := range a.Builds {
   520  		result.Builds = append(result.Builds, templateBuildFromAPI(b))
   521  	}
   522  	return result
   523  }
   524  
   525  func templateBuildInfoFromAPI(a *apis.TemplateBuildInfo) *TemplateBuildInfo {
   526  	if a == nil {
   527  		return nil
   528  	}
   529  	return &TemplateBuildInfo{
   530  		TemplateID: a.TemplateID,
   531  		BuildID:    a.BuildID,
   532  		Status:     TemplateBuildStatus(a.Status),
   533  		Logs:       a.Logs,
   534  	}
   535  }
   536  
   537  func templateBuildLogsFromAPI(a *apis.TemplateBuildLogsResponse) *TemplateBuildLogs {
   538  	if a == nil {
   539  		return nil
   540  	}
   541  	result := &TemplateBuildLogs{Logs: make([]BuildLogEntry, 0, len(a.Logs))}
   542  	for _, e := range a.Logs {
   543  		result.Logs = append(result.Logs, BuildLogEntry{
   544  			Level:     LogLevel(e.Level),
   545  			Message:   e.Message,
   546  			Step:      e.Step,
   547  			Timestamp: e.Timestamp,
   548  		})
   549  	}
   550  	return result
   551  }
   552  
   553  func templateCreateResponseFromAPI(a *apis.TemplateRequestResponseV3) *TemplateCreateResponse {
   554  	if a == nil {
   555  		return nil
   556  	}
   557  	return &TemplateCreateResponse{
   558  		TemplateID: a.TemplateID,
   559  		BuildID:    a.BuildID,
   560  		Aliases:    a.Aliases,
   561  		Names:      a.Names,
   562  		Tags:       a.Tags,
   563  		Public:     a.Public,
   564  	}
   565  }
   566  
   567  func templateCreateResponseFromLegacyAPI(a *apis.TemplateLegacy) *TemplateCreateResponse {
   568  	if a == nil {
   569  		return nil
   570  	}
   571  	return &TemplateCreateResponse{
   572  		TemplateID: a.TemplateID,
   573  		BuildID:    a.BuildID,
   574  		Aliases:    a.Aliases,
   575  		Public:     a.Public,
   576  	}
   577  }
   578  
   579  func templateBuildFileUploadFromAPI(a *apis.TemplateBuildFileUpload) *TemplateBuildFileUpload {
   580  	if a == nil {
   581  		return nil
   582  	}
   583  	return &TemplateBuildFileUpload{
   584  		Present: a.Present,
   585  		URL:     a.URL,
   586  	}
   587  }
   588  
   589  func templateAliasResponseFromAPI(a *apis.TemplateAliasResponse) *TemplateAliasResponse {
   590  	if a == nil {
   591  		return nil
   592  	}
   593  	return &TemplateAliasResponse{
   594  		TemplateID: a.TemplateID,
   595  		Public:     a.Public,
   596  	}
   597  }
   598  
   599  func assignedTemplateTagsFromAPI(a *apis.AssignedTemplateTags) *AssignedTemplateTags {
   600  	if a == nil {
   601  		return nil
   602  	}
   603  	return &AssignedTemplateTags{
   604  		BuildID: a.BuildID.String(),
   605  		Tags:    a.Tags,
   606  	}
   607  }