github.com/qiniu/go-sdk/v7@v7.27.0/sandbox/template.go (about) 1 package sandbox 2 3 import ( 4 "context" 5 "fmt" 6 "time" 7 ) 8 9 // ListDefaultTemplates 列出所有默认模板。 10 func (c *Client) ListDefaultTemplates(ctx context.Context) ([]Template, error) { 11 resp, err := c.api.ListDefaultTemplatesWithResponse(ctx) 12 if err != nil { 13 return nil, err 14 } 15 if resp.JSON200 == nil { 16 return nil, newAPIError(resp.HTTPResponse, resp.Body) 17 } 18 return templatesFromAPI(*resp.JSON200), nil 19 } 20 21 // ListTemplates 列出所有模板。 22 func (c *Client) ListTemplates(ctx context.Context, params *ListTemplatesParams) ([]Template, error) { 23 resp, err := c.api.ListTemplatesWithResponse(ctx, params.toAPI()) 24 if err != nil { 25 return nil, err 26 } 27 if resp.JSON200 == nil { 28 return nil, newAPIError(resp.HTTPResponse, resp.Body) 29 } 30 return templatesFromAPI(*resp.JSON200), nil 31 } 32 33 // CreateTemplate 创建一个新模板(v3 API)。 34 func (c *Client) CreateTemplate(ctx context.Context, body CreateTemplateParams) (*TemplateCreateResponse, error) { 35 resp, err := c.api.CreateTemplateV3WithResponse(ctx, body.toAPI()) 36 if err != nil { 37 return nil, err 38 } 39 if resp.JSON202 == nil { 40 return nil, newAPIError(resp.HTTPResponse, resp.Body) 41 } 42 return templateCreateResponseFromAPI(resp.JSON202), nil 43 } 44 45 // GetTemplate 返回模板详情及其构建记录。 46 func (c *Client) GetTemplate(ctx context.Context, templateID string, params *GetTemplateParams) (*TemplateWithBuilds, error) { 47 resp, err := c.api.GetTemplateWithResponse(ctx, templateID, params.toAPI()) 48 if err != nil { 49 return nil, err 50 } 51 if resp.JSON200 == nil { 52 return nil, newAPIError(resp.HTTPResponse, resp.Body) 53 } 54 return templateWithBuildsFromAPI(resp.JSON200), nil 55 } 56 57 // DeleteTemplate 删除一个模板。 58 func (c *Client) DeleteTemplate(ctx context.Context, templateID string) error { 59 resp, err := c.api.DeleteTemplateWithResponse(ctx, templateID) 60 if err != nil { 61 return err 62 } 63 sc := resp.HTTPResponse.StatusCode 64 if sc != 200 && sc != 204 { 65 return newAPIError(resp.HTTPResponse, resp.Body) 66 } 67 return nil 68 } 69 70 // UpdateTemplate 更新一个模板。 71 func (c *Client) UpdateTemplate(ctx context.Context, templateID string, body UpdateTemplateParams) error { 72 resp, err := c.api.UpdateTemplateWithResponse(ctx, templateID, body.toAPI()) 73 if err != nil { 74 return err 75 } 76 if resp.HTTPResponse.StatusCode != 200 { 77 return newAPIError(resp.HTTPResponse, resp.Body) 78 } 79 return nil 80 } 81 82 // GetTemplateBuildStatus 返回模板的构建状态。 83 func (c *Client) GetTemplateBuildStatus(ctx context.Context, templateID, buildID string, params *GetBuildStatusParams) (*TemplateBuildInfo, error) { 84 resp, err := c.api.GetTemplateBuildStatusWithResponse(ctx, templateID, buildID, params.toAPI()) 85 if err != nil { 86 return nil, err 87 } 88 if resp.JSON200 == nil { 89 return nil, newAPIError(resp.HTTPResponse, resp.Body) 90 } 91 return templateBuildInfoFromAPI(resp.JSON200), nil 92 } 93 94 // GetTemplateBuildLogs 返回模板的构建日志。 95 func (c *Client) GetTemplateBuildLogs(ctx context.Context, templateID, buildID string, params *GetBuildLogsParams) (*TemplateBuildLogs, error) { 96 resp, err := c.api.GetTemplateBuildLogsWithResponse(ctx, templateID, buildID, params.toAPI()) 97 if err != nil { 98 return nil, err 99 } 100 if resp.JSON200 == nil { 101 return nil, newAPIError(resp.HTTPResponse, resp.Body) 102 } 103 return templateBuildLogsFromAPI(resp.JSON200), nil 104 } 105 106 // StartTemplateBuild 启动模板构建(v2 API)。 107 func (c *Client) StartTemplateBuild(ctx context.Context, templateID, buildID string, body StartTemplateBuildParams) error { 108 apiBody, err := body.toAPI() 109 if err != nil { 110 return err 111 } 112 resp, err := c.api.StartTemplateBuildV2WithResponse(ctx, templateID, buildID, apiBody) 113 if err != nil { 114 return err 115 } 116 if resp.HTTPResponse.StatusCode != 202 { 117 return newAPIError(resp.HTTPResponse, resp.Body) 118 } 119 return nil 120 } 121 122 // RebuildTemplate 在已有模板上创建一个新的 waiting build(对应 POST /templates/{templateID})。 123 // 返回新 build 的标识(含 BuildID),调用方需随后调用 StartTemplateBuild 触发该 build。 124 // 典型流程:RebuildTemplate → StartTemplateBuild → WaitForBuild。 125 func (c *Client) RebuildTemplate(ctx context.Context, templateID string, body RebuildTemplateParams) (*TemplateCreateResponse, error) { 126 resp, err := c.api.RebuildTemplateWithResponse(ctx, templateID, body.toAPI()) 127 if err != nil { 128 return nil, err 129 } 130 if resp.JSON202 == nil { 131 return nil, newAPIError(resp.HTTPResponse, resp.Body) 132 } 133 return templateCreateResponseFromLegacyAPI(resp.JSON202), nil 134 } 135 136 // GetTemplateFiles 返回模板构建文件的上传链接。 137 func (c *Client) GetTemplateFiles(ctx context.Context, templateID, hash string) (*TemplateBuildFileUpload, error) { 138 resp, err := c.api.GetTemplateFilesWithResponse(ctx, templateID, hash) 139 if err != nil { 140 return nil, err 141 } 142 if resp.JSON201 == nil { 143 return nil, newAPIError(resp.HTTPResponse, resp.Body) 144 } 145 return templateBuildFileUploadFromAPI(resp.JSON201), nil 146 } 147 148 // GetTemplateByAlias 检查指定别名的模板是否存在。 149 func (c *Client) GetTemplateByAlias(ctx context.Context, alias string) (*TemplateAliasResponse, error) { 150 resp, err := c.api.GetTemplateByAliasWithResponse(ctx, alias) 151 if err != nil { 152 return nil, err 153 } 154 if resp.JSON200 == nil { 155 return nil, newAPIError(resp.HTTPResponse, resp.Body) 156 } 157 return templateAliasResponseFromAPI(resp.JSON200), nil 158 } 159 160 // AssignTemplateTags 为模板构建分配标签。 161 func (c *Client) AssignTemplateTags(ctx context.Context, body ManageTagsParams) (*AssignedTemplateTags, error) { 162 resp, err := c.api.AssignTemplateTagsWithResponse(ctx, body.toAPI()) 163 if err != nil { 164 return nil, err 165 } 166 if resp.JSON201 == nil { 167 return nil, newAPIError(resp.HTTPResponse, resp.Body) 168 } 169 return assignedTemplateTagsFromAPI(resp.JSON201), nil 170 } 171 172 // DeleteTemplateTags 删除模板的标签。 173 func (c *Client) DeleteTemplateTags(ctx context.Context, body DeleteTagsParams) error { 174 resp, err := c.api.DeleteTemplateTagsWithResponse(ctx, body.toAPI()) 175 if err != nil { 176 return err 177 } 178 if resp.HTTPResponse.StatusCode != 204 { 179 return newAPIError(resp.HTTPResponse, resp.Body) 180 } 181 return nil 182 } 183 184 // WaitForBuild 轮询 GetTemplateBuildStatus 直到构建达到终态("ready" 或 "error")。 185 // 默认轮询间隔为 2 秒,可通过 WithPollInterval 等选项自定义。 186 func (c *Client) WaitForBuild(ctx context.Context, templateID, buildID string, opts ...PollOption) (*TemplateBuildInfo, error) { 187 o := defaultPollOpts(2 * time.Second) 188 for _, fn := range opts { 189 fn(o) 190 } 191 192 return pollLoop(ctx, o, func() (bool, *TemplateBuildInfo, error) { 193 info, err := c.GetTemplateBuildStatus(ctx, templateID, buildID, nil) 194 if err != nil { 195 return false, nil, fmt.Errorf("get build status %s/%s: %w", templateID, buildID, err) 196 } 197 switch info.Status { 198 case BuildStatusReady: 199 return true, info, nil 200 case BuildStatusError: 201 return true, info, fmt.Errorf("build %s/%s failed", templateID, buildID) 202 } 203 return false, nil, nil 204 }) 205 }