-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Expand file tree
/
Copy pathtemplatebuilder.go
More file actions
165 lines (148 loc) · 6.79 KB
/
Copy pathtemplatebuilder.go
File metadata and controls
165 lines (148 loc) · 6.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
package codersdk
import (
"context"
"encoding/json"
"io"
"net/http"
"net/url"
"github.com/google/uuid"
)
// TemplateBuilderVariableType enumerates the variable types
// supported by template builder module manifests.
type TemplateBuilderVariableType string
const (
TemplateBuilderVariableTypeString TemplateBuilderVariableType = "string"
TemplateBuilderVariableTypeNumber TemplateBuilderVariableType = "number"
TemplateBuilderVariableTypeBool TemplateBuilderVariableType = "bool"
)
type TemplateBuilderModuleVariable struct {
Name string `json:"name"`
Type TemplateBuilderVariableType `json:"type"`
Description string `json:"description"`
Default json.RawMessage `json:"default,omitempty"`
Required bool `json:"required"`
Sensitive bool `json:"sensitive"`
}
// TemplateBuilderModule is the API response type returned by
// GET /api/v2/templatebuilder/modules. The Version field is
// populated from the catalog manifest's PinnedVersion at serving time.
type TemplateBuilderModule struct {
ID string `json:"id"`
DisplayName string `json:"display_name"`
Description string `json:"description"`
Icon string `json:"icon"`
Category string `json:"category"`
Version string `json:"version"`
CompatibleOS []string `json:"compatible_os"`
ConflictsWith []string `json:"conflicts_with"`
Variables []TemplateBuilderModuleVariable `json:"variables"`
}
// TemplateBuilderModulesResponse is the response body for listing template builder modules.
type TemplateBuilderModulesResponse struct {
Modules []TemplateBuilderModule `json:"modules"`
}
// TemplateBuilderBase is the API response type for a base template
// returned by GET /api/v2/templatebuilder/bases.
type TemplateBuilderBase struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Icon string `json:"icon"`
OS string `json:"os"`
Variables []TemplateBuilderModuleVariable `json:"variables"`
}
// TemplateBuilderBasesResponse is the response body for listing template builder bases.
type TemplateBuilderBasesResponse struct {
Bases []TemplateBuilderBase `json:"bases"`
}
// TemplateBuilderBases returns the list of base templates available
// in the template builder.
func (c *Client) TemplateBuilderBases(ctx context.Context) (TemplateBuilderBasesResponse, error) {
res, err := c.Request(ctx, http.MethodGet, "/api/v2/templatebuilder/bases", nil)
if err != nil {
return TemplateBuilderBasesResponse{}, err
}
defer res.Body.Close()
if res.StatusCode != http.StatusOK {
return TemplateBuilderBasesResponse{}, ReadBodyAsError(res)
}
var resp TemplateBuilderBasesResponse
return resp, json.NewDecoder(res.Body).Decode(&resp)
}
// TemplateBuilderModules returns the list of modules available for a given
// base template. If base is empty, all modules are returned.
func (c *Client) TemplateBuilderModules(ctx context.Context, base string) (TemplateBuilderModulesResponse, error) {
path := "/api/v2/templatebuilder/modules"
if base != "" {
q := url.Values{"base": {base}}
path += "?" + q.Encode()
}
res, err := c.Request(ctx, http.MethodGet, path, nil)
if err != nil {
return TemplateBuilderModulesResponse{}, err
}
defer res.Body.Close()
if res.StatusCode != http.StatusOK {
return TemplateBuilderModulesResponse{}, ReadBodyAsError(res)
}
var resp TemplateBuilderModulesResponse
return resp, json.NewDecoder(res.Body).Decode(&resp)
}
// TemplateBuilderComposeRequest is the request body for
// POST /api/v2/templatebuilder/compose.
type TemplateBuilderComposeRequest struct {
BaseTemplateID string `json:"base_template_id"`
BaseVariableValues map[string]string `json:"base_variable_values,omitempty"`
Modules []TemplateBuilderComposeModule `json:"modules"`
}
// TemplateBuilderComposeModule identifies a module and its variable
// values for the compose request.
type TemplateBuilderComposeModule struct {
ID string `json:"id"`
Variables map[string]string `json:"variables,omitempty"`
}
// TemplateBuilderCompose renders a base template with the selected
// modules and returns the resulting tar archive bytes.
func (c *Client) TemplateBuilderCompose(ctx context.Context, req TemplateBuilderComposeRequest) ([]byte, error) {
res, err := c.Request(ctx, http.MethodPost, "/api/v2/templatebuilder/compose", req)
if err != nil {
return nil, err
}
defer res.Body.Close()
if res.StatusCode != http.StatusOK {
return nil, ReadBodyAsError(res)
}
return io.ReadAll(res.Body)
}
// TemplateBuilderCreateTemplateRequest is the request body for
// POST /api/v2/templatebuilder/compose/template.
type TemplateBuilderCreateTemplateRequest struct {
BaseTemplateID string `json:"base_template_id"`
BaseVariableValues map[string]string `json:"base_variable_values,omitempty"`
Modules []TemplateBuilderComposeModule `json:"modules"`
OrganizationID uuid.UUID `json:"organization_id" format:"uuid" validate:"required"`
Name string `json:"name" validate:"required,template_name"`
DisplayName string `json:"display_name,omitempty" validate:"template_display_name"`
Description string `json:"description,omitempty" validate:"lt=128"`
Icon string `json:"icon,omitempty"`
ProvisionerTags map[string]string `json:"provisioner_tags,omitempty"`
}
// TemplateBuilderCreateTemplateResponse is the response body for
// POST /api/v2/templatebuilder/compose/template.
type TemplateBuilderCreateTemplateResponse struct {
Template Template `json:"template"`
}
// TemplateBuilderCreateTemplate composes a template from a base and modules,
// validates it via a provisioner import job, and creates the template.
func (c *Client) TemplateBuilderCreateTemplate(ctx context.Context, req TemplateBuilderCreateTemplateRequest) (TemplateBuilderCreateTemplateResponse, error) {
res, err := c.Request(ctx, http.MethodPost, "/api/v2/templatebuilder/compose/template", req)
if err != nil {
return TemplateBuilderCreateTemplateResponse{}, err
}
defer res.Body.Close()
if res.StatusCode != http.StatusCreated {
return TemplateBuilderCreateTemplateResponse{}, ReadBodyAsError(res)
}
var resp TemplateBuilderCreateTemplateResponse
return resp, json.NewDecoder(res.Body).Decode(&resp)
}