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  }