mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
feat: run a terraform plan before creating workspaces with the given template parameters (#1732)
This commit is contained in:
+16
-1
@@ -126,6 +126,14 @@ func (c *Client) dialWebsocket(ctx context.Context, path string) (*websocket.Con
|
||||
func readBodyAsError(res *http.Response) error {
|
||||
contentType := res.Header.Get("Content-Type")
|
||||
|
||||
var method, u string
|
||||
if res.Request != nil {
|
||||
method = res.Request.Method
|
||||
if res.Request.URL != nil {
|
||||
u = res.Request.URL.String()
|
||||
}
|
||||
}
|
||||
|
||||
var helper string
|
||||
if res.StatusCode == http.StatusUnauthorized {
|
||||
// 401 means the user is not logged in
|
||||
@@ -163,6 +171,8 @@ func readBodyAsError(res *http.Response) error {
|
||||
return &Error{
|
||||
Response: m,
|
||||
statusCode: res.StatusCode,
|
||||
method: method,
|
||||
url: u,
|
||||
Helper: helper,
|
||||
}
|
||||
}
|
||||
@@ -173,6 +183,8 @@ type Error struct {
|
||||
httpapi.Response
|
||||
|
||||
statusCode int
|
||||
method string
|
||||
url string
|
||||
|
||||
Helper string
|
||||
}
|
||||
@@ -183,7 +195,10 @@ func (e *Error) StatusCode() int {
|
||||
|
||||
func (e *Error) Error() string {
|
||||
var builder strings.Builder
|
||||
_, _ = fmt.Fprintf(&builder, "status code %d: %s", e.statusCode, e.Message)
|
||||
if e.method != "" && e.url != "" {
|
||||
_, _ = fmt.Fprintf(&builder, "%v %v: ", e.method, e.url)
|
||||
}
|
||||
_, _ = fmt.Fprintf(&builder, "unexpected status code %d: %s", e.statusCode, e.Message)
|
||||
if e.Helper != "" {
|
||||
_, _ = fmt.Fprintf(&builder, ": %s", e.Helper)
|
||||
}
|
||||
|
||||
@@ -12,13 +12,14 @@ import (
|
||||
|
||||
// TemplateVersion represents a single version of a template.
|
||||
type TemplateVersion struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
TemplateID *uuid.UUID `json:"template_id,omitempty"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
Name string `json:"name"`
|
||||
Job ProvisionerJob `json:"job"`
|
||||
Readme string `json:"readme"`
|
||||
ID uuid.UUID `json:"id"`
|
||||
TemplateID *uuid.UUID `json:"template_id,omitempty"`
|
||||
OrganizationID uuid.UUID `json:"organization_id,omitempty"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
Name string `json:"name"`
|
||||
Job ProvisionerJob `json:"job"`
|
||||
Readme string `json:"readme"`
|
||||
}
|
||||
|
||||
// TemplateVersionParameter represents a computed parameter value.
|
||||
@@ -114,3 +115,83 @@ func (c *Client) TemplateVersionLogsBefore(ctx context.Context, version uuid.UUI
|
||||
func (c *Client) TemplateVersionLogsAfter(ctx context.Context, version uuid.UUID, after time.Time) (<-chan ProvisionerJobLog, error) {
|
||||
return c.provisionerJobLogsAfter(ctx, fmt.Sprintf("/api/v2/templateversions/%s/logs", version), after)
|
||||
}
|
||||
|
||||
// CreateTemplateVersionDryRunRequest defines the request parameters for
|
||||
// CreateTemplateVersionDryRun.
|
||||
type CreateTemplateVersionDryRunRequest struct {
|
||||
WorkspaceName string
|
||||
ParameterValues []CreateParameterRequest
|
||||
}
|
||||
|
||||
// CreateTemplateVersionDryRun begins a dry-run provisioner job against the
|
||||
// given template version with the given parameter values.
|
||||
func (c *Client) CreateTemplateVersionDryRun(ctx context.Context, version uuid.UUID, req CreateTemplateVersionDryRunRequest) (ProvisionerJob, error) {
|
||||
res, err := c.Request(ctx, http.MethodPost, fmt.Sprintf("/api/v2/templateversions/%s/dry-run", version), req)
|
||||
if err != nil {
|
||||
return ProvisionerJob{}, err
|
||||
}
|
||||
defer res.Body.Close()
|
||||
if res.StatusCode != http.StatusCreated {
|
||||
return ProvisionerJob{}, readBodyAsError(res)
|
||||
}
|
||||
|
||||
var job ProvisionerJob
|
||||
return job, json.NewDecoder(res.Body).Decode(&job)
|
||||
}
|
||||
|
||||
// TemplateVersionDryRun returns the current state of a template version dry-run
|
||||
// job.
|
||||
func (c *Client) TemplateVersionDryRun(ctx context.Context, version, job uuid.UUID) (ProvisionerJob, error) {
|
||||
res, err := c.Request(ctx, http.MethodGet, fmt.Sprintf("/api/v2/templateversions/%s/dry-run/%s", version, job), nil)
|
||||
if err != nil {
|
||||
return ProvisionerJob{}, err
|
||||
}
|
||||
defer res.Body.Close()
|
||||
if res.StatusCode != http.StatusOK {
|
||||
return ProvisionerJob{}, readBodyAsError(res)
|
||||
}
|
||||
|
||||
var j ProvisionerJob
|
||||
return j, json.NewDecoder(res.Body).Decode(&j)
|
||||
}
|
||||
|
||||
// TemplateVersionDryRunResources returns the resources of a finished template
|
||||
// version dry-run job.
|
||||
func (c *Client) TemplateVersionDryRunResources(ctx context.Context, version, job uuid.UUID) ([]WorkspaceResource, error) {
|
||||
res, err := c.Request(ctx, http.MethodGet, fmt.Sprintf("/api/v2/templateversions/%s/dry-run/%s/resources", version, job), nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer res.Body.Close()
|
||||
if res.StatusCode != http.StatusOK {
|
||||
return nil, readBodyAsError(res)
|
||||
}
|
||||
|
||||
var resources []WorkspaceResource
|
||||
return resources, json.NewDecoder(res.Body).Decode(&resources)
|
||||
}
|
||||
|
||||
// TemplateVersionDryRunLogsBefore returns logs for a template version dry-run
|
||||
// that occurred before a specific time.
|
||||
func (c *Client) TemplateVersionDryRunLogsBefore(ctx context.Context, version, job uuid.UUID, before time.Time) ([]ProvisionerJobLog, error) {
|
||||
return c.provisionerJobLogsBefore(ctx, fmt.Sprintf("/api/v2/templateversions/%s/dry-run/%s/logs", version, job), before)
|
||||
}
|
||||
|
||||
// TemplateVersionDryRunLogsAfter streams logs for a template version dry-run
|
||||
// that occurred after a specific time.
|
||||
func (c *Client) TemplateVersionDryRunLogsAfter(ctx context.Context, version, job uuid.UUID, after time.Time) (<-chan ProvisionerJobLog, error) {
|
||||
return c.provisionerJobLogsAfter(ctx, fmt.Sprintf("/api/v2/templateversions/%s/dry-run/%s/logs", version, job), after)
|
||||
}
|
||||
|
||||
// CancelTemplateVersionDryRun marks a template version dry-run job as canceled.
|
||||
func (c *Client) CancelTemplateVersionDryRun(ctx context.Context, version, job uuid.UUID) error {
|
||||
res, err := c.Request(ctx, http.MethodPatch, fmt.Sprintf("/api/v2/templateversions/%s/dry-run/%s/cancel", version, job), nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer res.Body.Close()
|
||||
if res.StatusCode != http.StatusOK {
|
||||
return readBodyAsError(res)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user