Skip to content

Commit f0bd258

Browse files
authored
feat: move proxy settings page to deployment options (#8246)
* feat: Move workspace proxy page to deployment options Workspace proxy settings page is now an admin feature * WorkspaceProxy response extends region
1 parent 1e8cc2c commit f0bd258

39 files changed

+644
-341
lines changed

cli/cliui/table.go

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -188,32 +188,39 @@ func DisplayTable(out any, sort string, filterColumns []string) (string, error)
188188
// returned. If the table tag is malformed, an error is returned.
189189
//
190190
// The returned name is transformed from "snake_case" to "normal text".
191-
func parseTableStructTag(field reflect.StructField) (name string, defaultSort, recursive bool, err error) {
191+
func parseTableStructTag(field reflect.StructField) (name string, defaultSort, recursive bool, skipParentName bool, err error) {
192192
tags, err := structtag.Parse(string(field.Tag))
193193
if err != nil {
194-
return "", false, false, xerrors.Errorf("parse struct field tag %q: %w", string(field.Tag), err)
194+
return "", false, false, false, xerrors.Errorf("parse struct field tag %q: %w", string(field.Tag), err)
195195
}
196196

197197
tag, err := tags.Get("table")
198198
if err != nil || tag.Name == "-" {
199199
// tags.Get only returns an error if the tag is not found.
200-
return "", false, false, nil
200+
return "", false, false, false, nil
201201
}
202202

203203
defaultSortOpt := false
204204
recursiveOpt := false
205+
skipParentNameOpt := false
205206
for _, opt := range tag.Options {
206207
switch opt {
207208
case "default_sort":
208209
defaultSortOpt = true
209210
case "recursive":
210211
recursiveOpt = true
212+
case "recursive_inline":
213+
// recursive_inline is a helper to make recursive tables look nicer.
214+
// It skips prefixing the parent name to the child name. If you do this,
215+
// make sure the child name is unique across all nested structs in the parent.
216+
recursiveOpt = true
217+
skipParentNameOpt = true
211218
default:
212-
return "", false, false, xerrors.Errorf("unknown option %q in struct field tag", opt)
219+
return "", false, false, false, xerrors.Errorf("unknown option %q in struct field tag", opt)
213220
}
214221
}
215222

216-
return strings.ReplaceAll(tag.Name, "_", " "), defaultSortOpt, recursiveOpt, nil
223+
return strings.ReplaceAll(tag.Name, "_", " "), defaultSortOpt, recursiveOpt, skipParentNameOpt, nil
217224
}
218225

219226
func isStructOrStructPointer(t reflect.Type) bool {
@@ -235,7 +242,7 @@ func typeToTableHeaders(t reflect.Type) ([]string, string, error) {
235242
defaultSortName := ""
236243
for i := 0; i < t.NumField(); i++ {
237244
field := t.Field(i)
238-
name, defaultSort, recursive, err := parseTableStructTag(field)
245+
name, defaultSort, recursive, skip, err := parseTableStructTag(field)
239246
if err != nil {
240247
return nil, "", xerrors.Errorf("parse struct tags for field %q in type %q: %w", field.Name, t.String(), err)
241248
}
@@ -260,7 +267,11 @@ func typeToTableHeaders(t reflect.Type) ([]string, string, error) {
260267
return nil, "", xerrors.Errorf("get child field header names for field %q in type %q: %w", field.Name, fieldType.String(), err)
261268
}
262269
for _, childName := range childNames {
263-
headers = append(headers, fmt.Sprintf("%s %s", name, childName))
270+
fullName := fmt.Sprintf("%s %s", name, childName)
271+
if skip {
272+
fullName = childName
273+
}
274+
headers = append(headers, fullName)
264275
}
265276
continue
266277
}
@@ -296,7 +307,7 @@ func valueToTableMap(val reflect.Value) (map[string]any, error) {
296307
for i := 0; i < val.NumField(); i++ {
297308
field := val.Type().Field(i)
298309
fieldVal := val.Field(i)
299-
name, _, recursive, err := parseTableStructTag(field)
310+
name, _, recursive, skip, err := parseTableStructTag(field)
300311
if err != nil {
301312
return nil, xerrors.Errorf("parse struct tags for field %q in type %T: %w", field.Name, val, err)
302313
}
@@ -318,7 +329,11 @@ func valueToTableMap(val reflect.Value) (map[string]any, error) {
318329
return nil, xerrors.Errorf("get child field values for field %q in type %q: %w", field.Name, fieldType.String(), err)
319330
}
320331
for childName, childValue := range childMap {
321-
row[fmt.Sprintf("%s %s", name, childName)] = childValue
332+
fullName := fmt.Sprintf("%s %s", name, childName)
333+
if skip {
334+
fullName = childName
335+
}
336+
row[fullName] = childValue
322337
}
323338
continue
324339
}

cli/cliui/table_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ type tableTest3 struct {
4949
Sub tableTest2 `table:"inner,recursive,default_sort"`
5050
}
5151

52+
type tableTest4 struct {
53+
Inline tableTest2 `table:"ignored,recursive_inline"`
54+
SortField string `table:"sort_field,default_sort"`
55+
}
56+
5257
func Test_DisplayTable(t *testing.T) {
5358
t.Parallel()
5459

@@ -188,6 +193,31 @@ foo foo1 foo3 2022-08-02T15:49:10Z
188193
compareTables(t, expected, out)
189194
})
190195

196+
t.Run("Inline", func(t *testing.T) {
197+
t.Parallel()
198+
199+
expected := `
200+
NAME AGE
201+
Alice 25
202+
`
203+
204+
inlineIn := []tableTest4{
205+
{
206+
Inline: tableTest2{
207+
Name: stringWrapper{
208+
str: "Alice",
209+
},
210+
Age: 25,
211+
NotIncluded: "IgnoreMe",
212+
},
213+
},
214+
}
215+
out, err := cliui.DisplayTable(inlineIn, "", []string{"name", "age"})
216+
log.Println("rendered table:\n" + out)
217+
require.NoError(t, err)
218+
compareTables(t, expected, out)
219+
})
220+
191221
// This test ensures that safeties against invalid use of `table` tags
192222
// causes errors (even without data).
193223
t.Run("Errors", func(t *testing.T) {

coderd/apidoc/docs.go

Lines changed: 23 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/apidoc/swagger.json

Lines changed: 23 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/workspaceproxies.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ func (api *API) PrimaryWorkspaceProxy(ctx context.Context) (database.WorkspacePr
7272
// @Security CoderSessionToken
7373
// @Produce json
7474
// @Tags WorkspaceProxies
75-
// @Success 200 {object} codersdk.RegionsResponse
75+
// @Success 200 {object} codersdk.RegionsResponse[codersdk.Region]
7676
// @Router /regions [get]
7777
func (api *API) regions(rw http.ResponseWriter, r *http.Request) {
7878
ctx := r.Context()
@@ -87,7 +87,7 @@ func (api *API) regions(rw http.ResponseWriter, r *http.Request) {
8787
return
8888
}
8989

90-
httpapi.Write(ctx, rw, http.StatusOK, codersdk.RegionsResponse{
90+
httpapi.Write(ctx, rw, http.StatusOK, codersdk.RegionsResponse[codersdk.Region]{
9191
Regions: []codersdk.Region{region},
9292
})
9393
}

0 commit comments

Comments
 (0)