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

Skip to content

Commit 7d61519

Browse files
committed
has-agent:connecting, connected
1 parent ee6577d commit 7d61519

File tree

4 files changed

+130
-7
lines changed

4 files changed

+130
-7
lines changed

coderd/database/databasefake/databasefake.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -871,6 +871,48 @@ func (q *fakeQuerier) GetAuthorizedWorkspaces(ctx context.Context, arg database.
871871
}
872872
}
873873

874+
if arg.HasAgent != "" {
875+
build, err := q.GetLatestWorkspaceBuildByWorkspaceID(ctx, workspace.ID)
876+
if err != nil {
877+
return nil, xerrors.Errorf("get latest build: %w", err)
878+
}
879+
880+
job, err := q.GetProvisionerJobByID(ctx, build.JobID)
881+
if err != nil {
882+
return nil, xerrors.Errorf("get provisioner job: %w", err)
883+
}
884+
885+
workspaceResources, err := q.GetWorkspaceResourcesByJobID(ctx, job.ID)
886+
if err != nil {
887+
return nil, xerrors.Errorf("get workspace resources: %w", err)
888+
}
889+
890+
var workspaceResourceIDs []uuid.UUID
891+
for _, wr := range workspaceResources {
892+
workspaceResourceIDs = append(workspaceResourceIDs, wr.ID)
893+
}
894+
895+
workspaceAgents, err := q.GetWorkspaceAgentsByResourceIDs(ctx, workspaceResourceIDs)
896+
if err != nil {
897+
return nil, xerrors.Errorf("get workspace agents: %w", err)
898+
}
899+
900+
var hasAgentValid bool
901+
for _, wa := range workspaceAgents {
902+
switch arg.HasAgent {
903+
case "connected":
904+
hasAgentValid = wa.LastConnectedAt.Valid
905+
case "connecting":
906+
hasAgentValid = !wa.FirstConnectedAt.Valid
907+
}
908+
break // only 1 agent is expected
909+
}
910+
911+
if !hasAgentValid {
912+
continue
913+
}
914+
}
915+
874916
if len(arg.TemplateIds) > 0 {
875917
match := false
876918
for _, id := range arg.TemplateIds {

coderd/database/queries.sql.go

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

coderd/database/queries/workspaces.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ LEFT JOIN LATERAL (
6969
ON
7070
workspace_agents.resource_id = workspace_resources.id
7171
WHERE
72-
workspace_builds.workspace_id = '14260b33-a677-4399-8276-39ba287ec119'
72+
workspace_builds.workspace_id = workspace.id--'14260b33-a677-4399-8276-39ba287ec119'
7373
ORDER BY
7474
build_number DESC,
7575
workspace_agents.last_connected_at ASC,

coderd/workspaces_test.go

Lines changed: 82 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -826,22 +826,100 @@ func TestWorkspaceFilterManual(t *testing.T) {
826826
})
827827
t.Run("FilterQuery_HasAgent_Connecting", func(t *testing.T) {
828828
t.Parallel()
829-
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
829+
830+
client := coderdtest.New(t, &coderdtest.Options{
831+
IncludeProvisionerDaemon: true,
832+
})
830833
user := coderdtest.CreateFirstUser(t, client)
831-
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
834+
authToken := uuid.NewString()
835+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{
836+
Parse: echo.ParseComplete,
837+
ProvisionPlan: echo.ProvisionComplete,
838+
ProvisionApply: []*proto.Provision_Response{{
839+
Type: &proto.Provision_Response_Complete{
840+
Complete: &proto.Provision_Complete{
841+
Resources: []*proto.Resource{{
842+
Name: "example",
843+
Type: "aws_instance",
844+
Agents: []*proto.Agent{{
845+
Id: uuid.NewString(),
846+
Auth: &proto.Agent_Token{
847+
Token: authToken,
848+
},
849+
}},
850+
}},
851+
},
852+
},
853+
}},
854+
})
855+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
832856
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
857+
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID)
858+
coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
859+
860+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
861+
defer cancel()
862+
863+
res, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{
864+
FilterQuery: fmt.Sprintf("has-agent:%s", "connecting"),
865+
})
866+
require.NoError(t, err)
867+
require.Len(t, res.Workspaces, 1)
868+
require.Equal(t, workspace.ID, res.Workspaces[0].ID)
869+
})
870+
t.Run("FilterQuery_HasAgent_Connected", func(t *testing.T) {
871+
t.Parallel()
872+
873+
client := coderdtest.New(t, &coderdtest.Options{
874+
IncludeProvisionerDaemon: true,
875+
})
876+
user := coderdtest.CreateFirstUser(t, client)
877+
authToken := uuid.NewString()
878+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{
879+
Parse: echo.ParseComplete,
880+
ProvisionPlan: echo.ProvisionComplete,
881+
ProvisionApply: []*proto.Provision_Response{{
882+
Type: &proto.Provision_Response_Complete{
883+
Complete: &proto.Provision_Complete{
884+
Resources: []*proto.Resource{{
885+
Name: "example",
886+
Type: "aws_instance",
887+
Agents: []*proto.Agent{{
888+
Id: uuid.NewString(),
889+
Auth: &proto.Agent_Token{
890+
Token: authToken,
891+
},
892+
}},
893+
}},
894+
},
895+
},
896+
}},
897+
})
833898
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
899+
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
834900
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID)
901+
coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
902+
903+
agentClient := codersdk.New(client.URL)
904+
agentClient.SetSessionToken(authToken)
905+
agentCloser := agent.New(agent.Options{
906+
Client: agentClient,
907+
Logger: slogtest.Make(t, nil).Named("agent").Leveled(slog.LevelDebug),
908+
})
909+
defer func() {
910+
_ = agentCloser.Close()
911+
}()
912+
913+
coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID)
835914

836915
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
837916
defer cancel()
838917

839-
// single workspace
840918
res, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{
841919
FilterQuery: fmt.Sprintf("has-agent:%s", "connected"),
842920
})
843921
require.NoError(t, err)
844-
require.Len(t, res.Workspaces, 0)
922+
require.Len(t, res.Workspaces, 1)
845923
require.Equal(t, workspace.ID, res.Workspaces[0].ID)
846924
})
847925
}

0 commit comments

Comments
 (0)