Skip to content

Commit cd38cb8

Browse files
authored
feat: Add template version warnings (#7483)
1 parent 8f768f8 commit cd38cb8

18 files changed

+373
-27
lines changed

coderd/apidoc/docs.go

+18
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/apidoc/swagger.json

+12
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/templateversions.go

+97-8
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,19 @@ func (api *API) templateVersion(rw http.ResponseWriter, r *http.Request) {
6262
return
6363
}
6464

65-
httpapi.Write(ctx, rw, http.StatusOK, convertTemplateVersion(templateVersion, convertProvisionerJob(job), user))
65+
schemas, err := api.Database.GetParameterSchemasByJobID(ctx, job.ID)
66+
if errors.Is(err, sql.ErrNoRows) {
67+
err = nil
68+
}
69+
if err != nil {
70+
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
71+
Message: "Internal error listing parameter schemas.",
72+
Detail: err.Error(),
73+
})
74+
return
75+
}
76+
77+
httpapi.Write(ctx, rw, http.StatusOK, convertTemplateVersion(templateVersion, convertProvisionerJob(job), user, schemas))
6678
}
6779

6880
// @Summary Patch template version by ID
@@ -156,7 +168,19 @@ func (api *API) patchTemplateVersion(rw http.ResponseWriter, r *http.Request) {
156168
return
157169
}
158170

159-
httpapi.Write(ctx, rw, http.StatusOK, convertTemplateVersion(updatedTemplateVersion, convertProvisionerJob(job), user))
171+
schemas, err := api.Database.GetParameterSchemasByJobID(ctx, job.ID)
172+
if errors.Is(err, sql.ErrNoRows) {
173+
err = nil
174+
}
175+
if err != nil {
176+
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
177+
Message: "Internal error listing parameter schemas.",
178+
Detail: err.Error(),
179+
})
180+
return
181+
}
182+
183+
httpapi.Write(ctx, rw, http.StatusOK, convertTemplateVersion(updatedTemplateVersion, convertProvisionerJob(job), user, schemas))
160184
}
161185

162186
// @Summary Cancel template version by ID
@@ -887,7 +911,18 @@ func (api *API) templateVersionsByTemplate(rw http.ResponseWriter, r *http.Reque
887911
})
888912
return err
889913
}
890-
apiVersions = append(apiVersions, convertTemplateVersion(version, convertProvisionerJob(job), user))
914+
schemas, err := store.GetParameterSchemasByJobID(ctx, job.ID)
915+
if errors.Is(err, sql.ErrNoRows) {
916+
err = nil
917+
}
918+
if err != nil {
919+
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
920+
Message: "Internal error listing parameter schemas.",
921+
Detail: err.Error(),
922+
})
923+
return err
924+
}
925+
apiVersions = append(apiVersions, convertTemplateVersion(version, convertProvisionerJob(job), user, schemas))
891926
}
892927

893928
return nil
@@ -951,7 +986,19 @@ func (api *API) templateVersionByName(rw http.ResponseWriter, r *http.Request) {
951986
return
952987
}
953988

954-
httpapi.Write(ctx, rw, http.StatusOK, convertTemplateVersion(templateVersion, convertProvisionerJob(job), user))
989+
schemas, err := api.Database.GetParameterSchemasByJobID(ctx, job.ID)
990+
if errors.Is(err, sql.ErrNoRows) {
991+
err = nil
992+
}
993+
if err != nil {
994+
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
995+
Message: "Internal error listing parameter schemas.",
996+
Detail: err.Error(),
997+
})
998+
return
999+
}
1000+
1001+
httpapi.Write(ctx, rw, http.StatusOK, convertTemplateVersion(templateVersion, convertProvisionerJob(job), user, schemas))
9551002
}
9561003

9571004
// @Summary Get template version by organization, template, and name
@@ -1025,7 +1072,19 @@ func (api *API) templateVersionByOrganizationTemplateAndName(rw http.ResponseWri
10251072
return
10261073
}
10271074

1028-
httpapi.Write(ctx, rw, http.StatusOK, convertTemplateVersion(templateVersion, convertProvisionerJob(job), user))
1075+
schemas, err := api.Database.GetParameterSchemasByJobID(ctx, job.ID)
1076+
if errors.Is(err, sql.ErrNoRows) {
1077+
err = nil
1078+
}
1079+
if err != nil {
1080+
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
1081+
Message: "Internal error listing parameter schemas.",
1082+
Detail: err.Error(),
1083+
})
1084+
return
1085+
}
1086+
1087+
httpapi.Write(ctx, rw, http.StatusOK, convertTemplateVersion(templateVersion, convertProvisionerJob(job), user, schemas))
10291088
}
10301089

10311090
// @Summary Get previous template version by organization, template, and name
@@ -1120,7 +1179,19 @@ func (api *API) previousTemplateVersionByOrganizationTemplateAndName(rw http.Res
11201179
return
11211180
}
11221181

1123-
httpapi.Write(ctx, rw, http.StatusOK, convertTemplateVersion(previousTemplateVersion, convertProvisionerJob(job), user))
1182+
schemas, err := api.Database.GetParameterSchemasByJobID(ctx, job.ID)
1183+
if errors.Is(err, sql.ErrNoRows) {
1184+
err = nil
1185+
}
1186+
if err != nil {
1187+
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
1188+
Message: "Internal error listing parameter schemas.",
1189+
Detail: err.Error(),
1190+
})
1191+
return
1192+
}
1193+
1194+
httpapi.Write(ctx, rw, http.StatusOK, convertTemplateVersion(previousTemplateVersion, convertProvisionerJob(job), user, schemas))
11241195
}
11251196

11261197
// @Summary Update active template version by template ID
@@ -1494,7 +1565,19 @@ func (api *API) postTemplateVersionsByOrganization(rw http.ResponseWriter, r *ht
14941565
return
14951566
}
14961567

1497-
httpapi.Write(ctx, rw, http.StatusCreated, convertTemplateVersion(templateVersion, convertProvisionerJob(provisionerJob), user))
1568+
schemas, err := api.Database.GetParameterSchemasByJobID(ctx, provisionerJob.ID)
1569+
if errors.Is(err, sql.ErrNoRows) {
1570+
err = nil
1571+
}
1572+
if err != nil {
1573+
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
1574+
Message: "Internal error listing parameter schemas.",
1575+
Detail: err.Error(),
1576+
})
1577+
return
1578+
}
1579+
1580+
httpapi.Write(ctx, rw, http.StatusCreated, convertTemplateVersion(templateVersion, convertProvisionerJob(provisionerJob), user, schemas))
14981581
}
14991582

15001583
// templateVersionResources returns the workspace agent resources associated
@@ -1561,7 +1644,7 @@ func (api *API) templateVersionLogs(rw http.ResponseWriter, r *http.Request) {
15611644
api.provisionerJobLogs(rw, r, job)
15621645
}
15631646

1564-
func convertTemplateVersion(version database.TemplateVersion, job codersdk.ProvisionerJob, user database.User) codersdk.TemplateVersion {
1647+
func convertTemplateVersion(version database.TemplateVersion, job codersdk.ProvisionerJob, user database.User, schemas []database.ParameterSchema) codersdk.TemplateVersion {
15651648
createdBy := codersdk.User{
15661649
ID: user.ID,
15671650
Username: user.Username,
@@ -1572,6 +1655,11 @@ func convertTemplateVersion(version database.TemplateVersion, job codersdk.Provi
15721655
AvatarURL: user.AvatarURL.String,
15731656
}
15741657

1658+
var warnings []codersdk.TemplateVersionWarning
1659+
if len(schemas) > 0 {
1660+
warnings = append(warnings, codersdk.TemplateVersionWarningDeprecatedParameters)
1661+
}
1662+
15751663
return codersdk.TemplateVersion{
15761664
ID: version.ID,
15771665
TemplateID: &version.TemplateID.UUID,
@@ -1582,6 +1670,7 @@ func convertTemplateVersion(version database.TemplateVersion, job codersdk.Provi
15821670
Job: job,
15831671
Readme: version.Readme,
15841672
CreatedBy: createdBy,
1673+
Warnings: warnings,
15851674
}
15861675
}
15871676

coderd/templateversions_test.go

+43
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ func TestPostTemplateVersionsByOrganization(t *testing.T) {
138138
require.Len(t, auditor.AuditLogs(), 2)
139139
assert.Equal(t, database.AuditActionCreate, auditor.AuditLogs()[1].Action)
140140
})
141+
141142
t.Run("Example", func(t *testing.T) {
142143
t.Parallel()
143144
client := coderdtest.New(t, nil)
@@ -1453,3 +1454,45 @@ func TestTemplateVersionPatch(t *testing.T) {
14531454
require.Error(t, err)
14541455
})
14551456
}
1457+
1458+
func TestTemplateVersionWarnings(t *testing.T) {
1459+
t.Parallel()
1460+
1461+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
1462+
user := coderdtest.CreateFirstUser(t, client)
1463+
1464+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
1465+
defer cancel()
1466+
1467+
templateVersion := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{
1468+
Parse: []*proto.Parse_Response{{
1469+
Type: &proto.Parse_Response_Complete{
1470+
Complete: &proto.Parse_Complete{
1471+
ParameterSchemas: []*proto.ParameterSchema{
1472+
{
1473+
AllowOverrideSource: true,
1474+
Name: "example",
1475+
Description: "description 1",
1476+
DefaultSource: &proto.ParameterSource{
1477+
Scheme: proto.ParameterSource_DATA,
1478+
Value: "tomato",
1479+
},
1480+
DefaultDestination: &proto.ParameterDestination{
1481+
Scheme: proto.ParameterDestination_PROVISIONER_VARIABLE,
1482+
},
1483+
},
1484+
},
1485+
},
1486+
},
1487+
}},
1488+
ProvisionApply: echo.ProvisionComplete,
1489+
ProvisionPlan: echo.ProvisionComplete,
1490+
})
1491+
coderdtest.AwaitTemplateVersionJob(t, client, templateVersion.ID)
1492+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, templateVersion.ID)
1493+
1494+
templateVersion, err := client.TemplateVersion(ctx, template.ActiveVersionID)
1495+
require.NoError(t, err)
1496+
1497+
require.Contains(t, templateVersion.Warnings, codersdk.TemplateVersionWarningDeprecatedParameters)
1498+
}

codersdk/templateversions.go

+8
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@ import (
1111
"github.com/google/uuid"
1212
)
1313

14+
type TemplateVersionWarning string
15+
16+
const (
17+
TemplateVersionWarningDeprecatedParameters TemplateVersionWarning = "DEPRECATED_PARAMETERS"
18+
)
19+
1420
// TemplateVersion represents a single version of a template.
1521
type TemplateVersion struct {
1622
ID uuid.UUID `json:"id" format:"uuid"`
@@ -22,6 +28,8 @@ type TemplateVersion struct {
2228
Job ProvisionerJob `json:"job"`
2329
Readme string `json:"readme"`
2430
CreatedBy User `json:"created_by"`
31+
32+
Warnings []TemplateVersionWarning `json:"warnings,omitempty" enums:"DEPRECATED_PARAMETERS"`
2533
}
2634

2735
type TemplateVersionGitAuth struct {

docs/api/schemas.md

+28-12
Original file line numberDiff line numberDiff line change
@@ -4106,23 +4106,25 @@ Parameter represents a set value for the scope.
41064106
"organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6",
41074107
"readme": "string",
41084108
"template_id": "c6d67e98-83ea-49f0-8812-e4abae2b68bc",
4109-
"updated_at": "2019-08-24T14:15:22Z"
4109+
"updated_at": "2019-08-24T14:15:22Z",
4110+
"warnings": ["DEPRECATED_PARAMETERS"]
41104111
}
41114112
```
41124113

41134114
### Properties
41144115

4115-
| Name | Type | Required | Restrictions | Description |
4116-
| ----------------- | -------------------------------------------------- | -------- | ------------ | ----------- |
4117-
| `created_at` | string | false | | |
4118-
| `created_by` | [codersdk.User](#codersdkuser) | false | | |
4119-
| `id` | string | false | | |
4120-
| `job` | [codersdk.ProvisionerJob](#codersdkprovisionerjob) | false | | |
4121-
| `name` | string | false | | |
4122-
| `organization_id` | string | false | | |
4123-
| `readme` | string | false | | |
4124-
| `template_id` | string | false | | |
4125-
| `updated_at` | string | false | | |
4116+
| Name | Type | Required | Restrictions | Description |
4117+
| ----------------- | --------------------------------------------------------------------------- | -------- | ------------ | ----------- |
4118+
| `created_at` | string | false | | |
4119+
| `created_by` | [codersdk.User](#codersdkuser) | false | | |
4120+
| `id` | string | false | | |
4121+
| `job` | [codersdk.ProvisionerJob](#codersdkprovisionerjob) | false | | |
4122+
| `name` | string | false | | |
4123+
| `organization_id` | string | false | | |
4124+
| `readme` | string | false | | |
4125+
| `template_id` | string | false | | |
4126+
| `updated_at` | string | false | | |
4127+
| `warnings` | array of [codersdk.TemplateVersionWarning](#codersdktemplateversionwarning) | false | | |
41264128

41274129
## codersdk.TemplateVersionGitAuth
41284130

@@ -4260,6 +4262,20 @@ Parameter represents a set value for the scope.
42604262
| `type` | `number` |
42614263
| `type` | `bool` |
42624264

4265+
## codersdk.TemplateVersionWarning
4266+
4267+
```json
4268+
"DEPRECATED_PARAMETERS"
4269+
```
4270+
4271+
### Properties
4272+
4273+
#### Enumerated Values
4274+
4275+
| Value |
4276+
| ----------------------- |
4277+
| `DEPRECATED_PARAMETERS` |
4278+
42634279
## codersdk.TokenConfig
42644280

42654281
```json

0 commit comments

Comments
 (0)