Skip to content

Commit 67644cc

Browse files
committed
remove need to constantly send owner id
1 parent f651edc commit 67644cc

File tree

3 files changed

+26
-18
lines changed

3 files changed

+26
-18
lines changed

coderd/dynamicparameters/render.go

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ func (r *Loader) Load(ctx context.Context, db database.Store) error {
105105
return nil
106106
}
107107

108-
func (r *Loader) loaded() bool {
108+
func (r *Loader) isReady() bool {
109109
return r.templateVersion != nil && r.job != nil && r.terraformValues != nil
110110
}
111111

@@ -117,7 +117,7 @@ func (r *Loader) loaded() bool {
117117
// do not have the database state to support dynamic parameters. A constant
118118
// warning will be displayed for these template versions.
119119
func (r *Loader) Renderer(ctx context.Context, db database.Store, cache *files.Cache) (Renderer, error) {
120-
if !r.loaded() {
120+
if !r.isReady() {
121121
return nil, xerrors.New("Load() must be called before Renderer()")
122122
}
123123

@@ -154,11 +154,11 @@ func (r *Loader) dynamicRenderer(ctx context.Context, db database.Store, cache *
154154
}
155155

156156
return &DynamicRenderer{
157-
data: r,
158-
templateFS: templateFS,
159-
db: db,
160-
plan: plan,
161-
failedOwners: make(map[uuid.UUID]error),
157+
data: r,
158+
templateFS: templateFS,
159+
db: db,
160+
plan: plan,
161+
ownerErrors: make(map[uuid.UUID]error),
162162
close: func() {
163163
cache.Release(r.job.FileID)
164164
if moduleFilesFS != nil {
@@ -174,22 +174,23 @@ type DynamicRenderer struct {
174174
templateFS fs.FS
175175
plan json.RawMessage
176176

177-
failedOwners map[uuid.UUID]error
178-
currentOwner *previewtypes.WorkspaceOwner
177+
ownerErrors map[uuid.UUID]error
178+
currentOwner *previewtypes.WorkspaceOwner
179+
currentOwnerID uuid.UUID
179180

180181
once sync.Once
181182
close func()
182183
}
183184

184185
func (r *DynamicRenderer) Render(ctx context.Context, ownerID uuid.UUID, values map[string]string) (*preview.Output, hcl.Diagnostics) {
185186
// Always start with the cached error, if we have one.
186-
ownerErr := r.failedOwners[ownerID]
187+
ownerErr := r.ownerErrors[ownerID]
187188
if ownerErr == nil {
188189
ownerErr = r.getWorkspaceOwnerData(ctx, ownerID)
189190
}
190191

191192
if ownerErr != nil || r.currentOwner == nil {
192-
r.failedOwners[ownerID] = ownerErr
193+
r.ownerErrors[ownerID] = ownerErr
193194
return nil, hcl.Diagnostics{
194195
{
195196
Severity: hcl.DiagError,

coderd/parameters.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ func (api *API) handleParameterWebsocket(rw http.ResponseWriter, r *http.Request
168168
// As the user types into the form, reprocess the state using their input,
169169
// and respond with updates.
170170
updates := stream.Chan()
171+
ownerID := initial.OwnerID
171172
for {
172173
select {
173174
case <-ctx.Done():
@@ -179,6 +180,14 @@ func (api *API) handleParameterWebsocket(rw http.ResponseWriter, r *http.Request
179180
return
180181
}
181182

183+
// Take a nil uuid to mean the previous owner ID.
184+
// This just removes the need to constantly send who you are.
185+
if update.OwnerID == uuid.Nil {
186+
update.OwnerID = ownerID
187+
}
188+
189+
ownerID = update.OwnerID
190+
182191
result, diagnostics := render.Render(ctx, update.OwnerID, update.Inputs)
183192
response := codersdk.DynamicParametersResponse{
184193
ID: update.ID,

enterprise/coderd/parameters_test.go

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func TestDynamicParametersOwnerGroups(t *testing.T) {
3131
Options: &coderdtest.Options{IncludeProvisionerDaemon: true},
3232
},
3333
)
34-
templateAdmin, templateAdminUser := coderdtest.CreateAnotherUser(t, ownerClient, owner.OrganizationID, rbac.RoleTemplateAdmin())
34+
templateAdmin, templateAdminUser := coderdtest.CreateAnotherUser(t, ownerClient, owner.OrganizationID, rbac.ScopedRoleOrgTemplateAdmin(owner.OrganizationID))
3535
_, noGroupUser := coderdtest.CreateAnotherUser(t, ownerClient, owner.OrganizationID)
3636

3737
// Create the group to be asserted
@@ -79,36 +79,34 @@ func TestDynamicParametersOwnerGroups(t *testing.T) {
7979
require.NoError(t, err)
8080
defer stream.Close(websocket.StatusGoingAway)
8181

82-
previews := stream.Chan()
82+
previews, pop := coderdtest.SynchronousStream(stream)
8383

8484
// Should automatically send a form state with all defaulted/empty values
85-
preview := testutil.RequireReceive(ctx, t, previews)
85+
preview := pop()
8686
require.Equal(t, -1, preview.ID)
8787
require.Empty(t, preview.Diagnostics)
8888
require.Equal(t, "group", preview.Parameters[0].Name)
8989
require.True(t, preview.Parameters[0].Value.Valid)
9090
require.Equal(t, database.EveryoneGroup, preview.Parameters[0].Value.Value)
9191

9292
// Send a new value, and see it reflected
93-
err = stream.Send(codersdk.DynamicParametersRequest{
93+
preview, err = previews(codersdk.DynamicParametersRequest{
9494
ID: 1,
9595
Inputs: map[string]string{"group": group.Name},
9696
})
9797
require.NoError(t, err)
98-
preview = testutil.RequireReceive(ctx, t, previews)
9998
require.Equal(t, 1, preview.ID)
10099
require.Empty(t, preview.Diagnostics)
101100
require.Equal(t, "group", preview.Parameters[0].Name)
102101
require.True(t, preview.Parameters[0].Value.Valid)
103102
require.Equal(t, group.Name, preview.Parameters[0].Value.Value)
104103

105104
// Back to default
106-
err = stream.Send(codersdk.DynamicParametersRequest{
105+
preview, err = previews(codersdk.DynamicParametersRequest{
107106
ID: 3,
108107
Inputs: map[string]string{},
109108
})
110109
require.NoError(t, err)
111-
preview = testutil.RequireReceive(ctx, t, previews)
112110
require.Equal(t, 3, preview.ID)
113111
require.Empty(t, preview.Diagnostics)
114112
require.Equal(t, "group", preview.Parameters[0].Name)

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy