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 = ® 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 }