Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 1726ead

Browse files
committed
Fix querying
1 parent 7979681 commit 1726ead

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+3532
-2745
lines changed

cli/projects.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func projects() *cobra.Command {
4040
return cmd
4141
}
4242

43-
func displayProjectImportInfo(cmd *cobra.Command, parameterSchemas []coderd.ParameterSchema, parameterValues []coderd.ComputedParameterValue, resources []coderd.ProvisionerJobResource) error {
43+
func displayProjectImportInfo(cmd *cobra.Command, parameterSchemas []coderd.ParameterSchema, parameterValues []coderd.ComputedParameterValue, resources []coderd.WorkspaceResource) error {
4444
schemaByID := map[string]coderd.ParameterSchema{}
4545
for _, schema := range parameterSchemas {
4646
schemaByID[schema.ID.String()] = schema

cli/workspacecreate.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ func workspaceCreate() *cobra.Command {
108108
return err
109109
}
110110

111-
logs, err := client.WorkspaceProvisionJobLogsAfter(cmd.Context(), organization.Name, history.ProvisionJobID, time.Time{})
111+
logs, err := client.WorkspaceBuildJobLogsAfter(cmd.Context(), organization.Name, history.ProvisionJobID, time.Time{})
112112
if err != nil {
113113
return err
114114
}

coderd/coderd.go

+57-31
Original file line numberDiff line numberDiff line change
@@ -51,28 +51,35 @@ func New(options *Options) (http.Handler, func()) {
5151
httpmw.ExtractAPIKey(options.Database, nil),
5252
httpmw.ExtractOrganizationParam(options.Database),
5353
)
54+
r.Get("/", api.organization)
5455
r.Get("/provisionerdaemons", api.provisionerDaemonsByOrganization)
5556
r.Post("/projectversions", api.postProjectVersionsByOrganization)
5657
r.Route("/projects", func(r chi.Router) {
5758
r.Post("/", api.postProjectsByOrganization)
5859
r.Get("/", api.projectsByOrganization)
5960
r.Get("/{projectname}", api.projectByOrganizationAndName)
6061
})
62+
r.Get("/parameters", nil)
63+
r.Post("/parameters", nil)
64+
r.Patch("/parameters/{name}", nil)
65+
r.Delete("/parameters/{name}", nil)
6166
})
6267
r.Route("/projects/{project}", func(r chi.Router) {
6368
r.Use(
6469
httpmw.ExtractAPIKey(options.Database, nil),
6570
httpmw.ExtractProjectParam(options.Database),
6671
httpmw.ExtractOrganizationParam(options.Database),
6772
)
68-
r.Get("/", api.projectByOrganization)
69-
r.Delete("/", nil)
70-
r.Get("/workspaces", api.workspacesByProject)
73+
r.Get("/", api.project)
7174
r.Get("/parameters", api.parametersByProject)
7275
r.Post("/parameters", api.postParametersByProject)
73-
r.Get("/versions", api.projectVersionsByOrganization)
74-
r.Get("/versions/latest", nil)
75-
r.Patch("/versions", nil)
76+
r.Patch("/parameters/{name}", nil)
77+
r.Delete("/parameters/{name}", nil)
78+
r.Route("/versions", func(r chi.Router) {
79+
r.Get("/", api.projectVersionsByProject)
80+
r.Patch("/versions", nil)
81+
r.Get("/{projectversionname}", api.projectVersionByName)
82+
})
7683
})
7784
r.Route("/projectversions/{projectversion}", func(r chi.Router) {
7885
r.Use(
@@ -81,65 +88,84 @@ func New(options *Options) (http.Handler, func()) {
8188
httpmw.ExtractOrganizationParam(options.Database),
8289
)
8390

84-
r.Get("/", nil)
85-
r.Get("/schema", nil)
86-
r.Get("/parameters", nil)
87-
r.Get("/logs", nil)
88-
r.Get("/resources", nil)
91+
r.Get("/", api.projectVersion)
92+
r.Get("/schema", api.projectVersionSchema)
93+
r.Get("/parameters", api.projectVersionParameters)
94+
r.Get("/resources", api.projectVersionResources)
95+
r.Get("/logs", api.projectVersionLogs)
8996
})
9097
r.Route("/provisionerdaemons", func(r chi.Router) {
9198
r.Route("/me", func(r chi.Router) {
92-
r.Get("/listen", api.provisionerDaemonsServe)
99+
r.Get("/listen", api.provisionerDaemonsListen)
93100
})
94101
})
95102
r.Route("/users", func(r chi.Router) {
96-
r.Post("/login", api.postLogin)
97-
r.Post("/logout", api.postLogout)
98103
r.Get("/first", api.firstUser)
99104
r.Post("/first", api.postFirstUser)
105+
r.Post("/login", api.postLogin)
106+
r.Post("/logout", api.postLogout)
100107
r.Group(func(r chi.Router) {
101108
r.Use(httpmw.ExtractAPIKey(options.Database, nil))
102-
r.Post("/", nil)
109+
r.Post("/", api.postUsers)
103110
r.Route("/{user}", func(r chi.Router) {
104111
r.Use(httpmw.ExtractUserParam(options.Database))
105112
r.Get("/", api.userByName)
106113
r.Get("/organizations", api.organizationsByUser)
107-
r.Post("/keys", api.postKeyForUser)
114+
r.Post("/organizations", api.postOrganizationsByUser)
115+
r.Post("/keys", api.postAPIKey)
116+
r.Route("/organizations", func(r chi.Router) {
117+
r.Post("/", api.postOrganizationsByUser)
118+
r.Get("/", api.organizationsByUser)
119+
r.Get("/{organizationname}", api.organizationByUserAndName)
120+
})
121+
r.Route("/workspaces", func(r chi.Router) {
122+
r.Post("/", api.postWorkspacesByUser)
123+
r.Get("/", api.workspacesByUser)
124+
r.Get("/{workspacename}", api.workspaceByUserAndName)
125+
})
108126
})
109127
})
110128
})
111-
r.Route("/workspaceagents", func(r chi.Router) {
129+
r.Route("/workspaceresources", func(r chi.Router) {
112130
r.Route("/auth", func(r chi.Router) {
113-
r.Post("/google-instance-identity", api.postAuthenticateWorkspaceAgentUsingGoogleInstanceIdentity)
131+
r.Post("/google-instance-identity", api.postWorkspaceAuthGoogleInstanceIdentity)
114132
})
115-
r.Route("/me", func(r chi.Router) {
133+
r.Route("/agent", func(r chi.Router) {
116134
r.Use(httpmw.ExtractWorkspaceAgent(options.Database))
117-
r.Get("/listen", nil)
135+
r.Get("/", api.workspaceAgentListen)
136+
})
137+
r.Route("/{workspaceresource}", func(r chi.Router) {
138+
r.Use(
139+
httpmw.ExtractAPIKey(options.Database, nil),
140+
httpmw.ExtractWorkspaceResourceParam(options.Database),
141+
httpmw.ExtractWorkspaceParam(options.Database),
142+
)
143+
r.Get("/", api.workspaceResource)
144+
r.Get("/dial", api.workspaceResourceDial)
118145
})
119146
})
120147
r.Route("/workspaces/{workspace}", func(r chi.Router) {
121148
r.Use(
122149
httpmw.ExtractAPIKey(options.Database, nil),
123150
httpmw.ExtractWorkspaceParam(options.Database),
124-
httpmw.ExtractUserParam(options.Database),
125151
)
126-
r.Get("/", nil)
127-
r.Get("/builds", nil)
128-
r.Post("/builds", nil)
152+
r.Get("/", api.workspace)
153+
r.Route("/builds", func(r chi.Router) {
154+
r.Get("/", api.workspaceBuilds)
155+
r.Post("/", api.postWorkspaceBuilds)
156+
r.Get("/latest", api.workspaceBuildLatest)
157+
r.Get("/{workspacebuildname}", api.workspaceBuildByName)
158+
})
129159
})
130160
r.Route("/workspacebuilds/{workspacebuild}", func(r chi.Router) {
131161
r.Use(
132162
httpmw.ExtractAPIKey(options.Database, nil),
133163
httpmw.ExtractWorkspaceBuildParam(options.Database),
134164
httpmw.ExtractWorkspaceParam(options.Database),
135165
)
136-
r.Get("/logs", nil)
137-
r.Get("/resources", nil)
138-
r.Route("/resources/{workspaceresource}", func(r chi.Router) {
139-
r.Use(httpmw.ExtractWorkspaceResourceParam(options.Database))
140-
r.Get("/", nil)
141-
r.Get("/dial", nil)
142-
})
166+
r.Get("/", api.workspaceBuild)
167+
r.Get("/logs", api.workspaceBuildLogs)
168+
r.Get("/resources", api.workspaceBuildResources)
143169
})
144170
})
145171
r.NotFound(site.Handler(options.Logger).ServeHTTP)

coderd/coderdtest/coderdtest.go

+59-17
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,8 @@ func NewProvisionerDaemon(t *testing.T, client *codersdk.Client) io.Closer {
142142

143143
// CreateFirstUser creates a user with preset credentials and authenticates
144144
// with the passed in codersdk client.
145-
func CreateFirstUser(t *testing.T, client *codersdk.Client) coderd.CreateUserResponse {
146-
req := coderd.CreateUserRequest{
145+
func CreateFirstUser(t *testing.T, client *codersdk.Client) coderd.CreateFirstUserResponse {
146+
req := coderd.CreateFirstUserRequest{
147147
148148
Username: "testuser",
149149
Password: "testpass",
@@ -161,6 +161,28 @@ func CreateFirstUser(t *testing.T, client *codersdk.Client) coderd.CreateUserRes
161161
return resp
162162
}
163163

164+
// CreateAnotherUser creates and authenticates a new user.
165+
func CreateAnotherUser(t *testing.T, client *codersdk.Client, organization string) *codersdk.Client {
166+
req := coderd.CreateUserRequest{
167+
Email: namesgenerator.GetRandomName(1) + "@coder.com",
168+
Username: randomUsername(),
169+
Password: "testpass",
170+
OrganizationID: organization,
171+
}
172+
_, err := client.CreateUser(context.Background(), req)
173+
require.NoError(t, err)
174+
175+
login, err := client.LoginWithPassword(context.Background(), coderd.LoginWithPasswordRequest{
176+
Email: req.Email,
177+
Password: req.Password,
178+
})
179+
require.NoError(t, err)
180+
181+
other := codersdk.New(client.URL)
182+
other.SessionToken = login.SessionToken
183+
return other
184+
}
185+
164186
// CreateProjectVersion creates a project import provisioner job
165187
// with the responses provided. It uses the "echo" provisioner for compatibility
166188
// with testing.
@@ -190,27 +212,47 @@ func CreateProject(t *testing.T, client *codersdk.Client, organization string, v
190212
}
191213

192214
// AwaitProjectImportJob awaits for an import job to reach completed status.
193-
func AwaitProjectImportJob(t *testing.T, client *codersdk.Client, organization string, job uuid.UUID) coderd.ProvisionerJob {
194-
var provisionerJob coderd.ProvisionerJob
195-
// require.Eventually(t, func() bool {
196-
// var err error
197-
// provisionerJob, err = client.ProjectImportJob(context.Background(), organization, job)
198-
// require.NoError(t, err)
199-
// return provisionerJob.Status.Completed()
200-
// }, 5*time.Second, 25*time.Millisecond)
201-
return provisionerJob
215+
func AwaitProjectVersionJob(t *testing.T, client *codersdk.Client, version uuid.UUID) coderd.ProjectVersion {
216+
var projectVersion coderd.ProjectVersion
217+
require.Eventually(t, func() bool {
218+
var err error
219+
projectVersion, err = client.ProjectVersion(context.Background(), version)
220+
require.NoError(t, err)
221+
return projectVersion.Job.CompletedAt != nil
222+
}, 5*time.Second, 25*time.Millisecond)
223+
return projectVersion
224+
}
225+
226+
// AwaitWorkspaceBuildJob waits for a workspace provision job to reach completed status.
227+
func AwaitWorkspaceBuildJob(t *testing.T, client *codersdk.Client, build uuid.UUID) coderd.WorkspaceBuild {
228+
var workspaceBuild coderd.WorkspaceBuild
229+
require.Eventually(t, func() bool {
230+
var err error
231+
workspaceBuild, err = client.WorkspaceBuild(context.Background(), build)
232+
require.NoError(t, err)
233+
return workspaceBuild.Job.CompletedAt != nil
234+
}, 5*time.Second, 25*time.Millisecond)
235+
return workspaceBuild
202236
}
203237

204-
// AwaitWorkspaceProvisionJob awaits for a workspace provision job to reach completed status.
205-
func AwaitWorkspaceProvisionJob(t *testing.T, client *codersdk.Client, organization string, job uuid.UUID) coderd.ProvisionerJob {
206-
var provisionerJob coderd.ProvisionerJob
238+
// AwaitWorkspaceAgents waits for all resources with agents to be connected.
239+
func AwaitWorkspaceAgents(t *testing.T, client *codersdk.Client, build uuid.UUID) []coderd.WorkspaceResource {
240+
var resources []coderd.WorkspaceResource
207241
require.Eventually(t, func() bool {
208242
var err error
209-
provisionerJob, err = client.WorkspaceProvisionJob(context.Background(), organization, job)
243+
resources, err = client.WorkspaceResourcesByBuild(context.Background(), build)
210244
require.NoError(t, err)
211-
return provisionerJob.Status.Completed()
245+
for _, resource := range resources {
246+
if resource.Agent == nil {
247+
continue
248+
}
249+
if resource.Agent.UpdatedAt.IsZero() {
250+
return false
251+
}
252+
}
253+
return true
212254
}, 5*time.Second, 25*time.Millisecond)
213-
return provisionerJob
255+
return resources
214256
}
215257

216258
// CreateWorkspace creates a workspace for the user and project provided.

coderd/coderdtest/coderdtest_test.go

+6-5
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,16 @@ func TestNew(t *testing.T) {
2222
client := coderdtest.New(t, nil)
2323
user := coderdtest.CreateFirstUser(t, client)
2424
closer := coderdtest.NewProvisionerDaemon(t, client)
25-
job := coderdtest.CreateProjectVersion(t, client, user.OrganizationID, nil)
26-
coderdtest.AwaitProjectImportJob(t, client, user.OrganizationID, job.ID)
27-
project := coderdtest.CreateProject(t, client, user.OrganizationID, job.ID)
25+
version := coderdtest.CreateProjectVersion(t, client, user.OrganizationID, nil)
26+
coderdtest.AwaitProjectVersionJob(t, client, version.ID)
27+
project := coderdtest.CreateProject(t, client, user.OrganizationID, version.ID)
2828
workspace := coderdtest.CreateWorkspace(t, client, "me", project.ID)
29-
history, err := client.CreateWorkspaceBuild(context.Background(), "me", workspace.Name, coderd.CreateWorkspaceBuildRequest{
29+
build, err := client.CreateWorkspaceBuild(context.Background(), workspace.ID, coderd.CreateWorkspaceBuildRequest{
3030
ProjectVersionID: project.ActiveVersionID,
3131
Transition: database.WorkspaceTransitionStart,
3232
})
3333
require.NoError(t, err)
34-
coderdtest.AwaitWorkspaceProvisionJob(t, client, user.OrganizationID, history.ProvisionJobID)
34+
coderdtest.AwaitWorkspaceBuildJob(t, client, build.ID)
35+
coderdtest.AwaitWorkspaceAgents(t, client, build.ID)
3536
closer.Close()
3637
}

coderd/organizations.go

+13-11
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,12 @@ type CreateProjectRequest struct {
5252
VersionID uuid.UUID `json:"project_version_id" validate:"required"`
5353
}
5454

55+
func (api *api) organization(rw http.ResponseWriter, r *http.Request) {
56+
organization := httpmw.OrganizationParam(r)
57+
render.Status(r, http.StatusOK)
58+
render.JSON(rw, r, convertOrganization(organization))
59+
}
60+
5561
func (api *api) provisionerDaemonsByOrganization(rw http.ResponseWriter, r *http.Request) {
5662
daemons, err := api.Database.GetProvisionerDaemons(r.Context())
5763
if errors.Is(err, sql.ErrNoRows) {
@@ -109,6 +115,7 @@ func (api *api) postProjectVersionsByOrganization(rw http.ResponseWriter, r *htt
109115
}
110116

111117
var projectVersion database.ProjectVersion
118+
var provisionerJob database.ProvisionerJob
112119
err = api.Database.InTx(func(db database.Store) error {
113120
jobID := uuid.New()
114121
for _, parameterValue := range req.ParameterValues {
@@ -128,7 +135,7 @@ func (api *api) postProjectVersionsByOrganization(rw http.ResponseWriter, r *htt
128135
}
129136
}
130137

131-
job, err := api.Database.InsertProvisionerJob(r.Context(), database.InsertProvisionerJobParams{
138+
provisionerJob, err = api.Database.InsertProvisionerJob(r.Context(), database.InsertProvisionerJobParams{
132139
ID: jobID,
133140
CreatedAt: database.Now(),
134141
UpdatedAt: database.Now(),
@@ -160,7 +167,7 @@ func (api *api) postProjectVersionsByOrganization(rw http.ResponseWriter, r *htt
160167
UpdatedAt: database.Now(),
161168
Name: namesgenerator.GetRandomName(1),
162169
Description: "",
163-
JobID: job.ID,
170+
JobID: provisionerJob.ID,
164171
})
165172
if err != nil {
166173
return xerrors.Errorf("insert project version: %w", err)
@@ -175,7 +182,7 @@ func (api *api) postProjectVersionsByOrganization(rw http.ResponseWriter, r *htt
175182
}
176183

177184
render.Status(r, http.StatusCreated)
178-
render.JSON(rw, r, convertProjectVersion(projectVersion))
185+
render.JSON(rw, r, convertProjectVersion(projectVersion, convertProvisionerJob(provisionerJob)))
179186
}
180187

181188
// Create a new project in an organization.
@@ -227,29 +234,24 @@ func (api *api) postProjectsByOrganization(rw http.ResponseWriter, r *http.Reque
227234

228235
var project Project
229236
err = api.Database.InTx(func(db database.Store) error {
230-
projectVersionID := uuid.New()
231237
dbProject, err := db.InsertProject(r.Context(), database.InsertProjectParams{
232238
ID: uuid.New(),
233239
CreatedAt: database.Now(),
234240
UpdatedAt: database.Now(),
235241
OrganizationID: organization.ID,
236242
Name: createProject.Name,
237243
Provisioner: importJob.Provisioner,
238-
ActiveVersionID: projectVersionID,
244+
ActiveVersionID: projectVersion.ID,
239245
})
240246
if err != nil {
241247
return xerrors.Errorf("insert project: %s", err)
242248
}
243-
_, err = db.InsertProjectVersion(r.Context(), database.InsertProjectVersionParams{
244-
ID: projectVersionID,
249+
err = db.UpdateProjectVersionByID(r.Context(), database.UpdateProjectVersionByIDParams{
250+
ID: projectVersion.ID,
245251
ProjectID: uuid.NullUUID{
246252
UUID: dbProject.ID,
247253
Valid: true,
248254
},
249-
CreatedAt: database.Now(),
250-
UpdatedAt: database.Now(),
251-
Name: namesgenerator.GetRandomName(1),
252-
JobID: importJob.ID,
253255
})
254256
if err != nil {
255257
return xerrors.Errorf("insert project version: %s", err)

coderd/organizations_test.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,14 @@ import (
55
"net/http"
66
"testing"
77

8+
"github.com/google/uuid"
9+
"github.com/stretchr/testify/require"
10+
811
"github.com/coder/coder/coderd"
912
"github.com/coder/coder/coderd/coderdtest"
1013
"github.com/coder/coder/codersdk"
1114
"github.com/coder/coder/database"
1215
"github.com/coder/coder/provisioner/echo"
13-
"github.com/google/uuid"
14-
"github.com/stretchr/testify/require"
1516
)
1617

1718
func TestProvisionerDaemonsByOrganization(t *testing.T) {

0 commit comments

Comments
 (0)