@@ -6,10 +6,15 @@ import (
6
6
"testing"
7
7
"time"
8
8
9
+ "cdr.dev/slog/sloggers/slogtest"
10
+ "github.com/google/uuid"
9
11
"github.com/stretchr/testify/require"
10
12
13
+ "github.com/coder/coder/agent"
11
14
"github.com/coder/coder/coderd/coderdtest"
15
+ "github.com/coder/coder/coderd/database"
12
16
"github.com/coder/coder/codersdk"
17
+ "github.com/coder/coder/peer"
13
18
"github.com/coder/coder/provisioner/echo"
14
19
"github.com/coder/coder/provisionersdk/proto"
15
20
)
@@ -115,6 +120,56 @@ func TestWorkspaceBuildResources(t *testing.T) {
115
120
require .Equal (t , "example" , resources [0 ].Type )
116
121
require .Len (t , resources [0 ].Agents , 1 )
117
122
})
123
+ t .Run ("MultipleBuilds" , func (t * testing.T ) {
124
+ // This ensures that the latest agent can connect through multiple builds.
125
+ // Agents won't always have new authentication tokens on rebuild, because
126
+ // infrastructure as code won't always recreate the resource.
127
+ t .Parallel ()
128
+ client := coderdtest .New (t , nil )
129
+ user := coderdtest .CreateFirstUser (t , client )
130
+ coderdtest .NewProvisionerDaemon (t , client )
131
+ authToken := uuid .NewString ()
132
+ version := coderdtest .CreateTemplateVersion (t , client , user .OrganizationID , & echo.Responses {
133
+ Parse : echo .ParseComplete ,
134
+ Provision : []* proto.Provision_Response {{
135
+ Type : & proto.Provision_Response_Complete {
136
+ Complete : & proto.Provision_Complete {
137
+ Resources : []* proto.Resource {{
138
+ Name : "some" ,
139
+ Type : "example" ,
140
+ Agents : []* proto.Agent {{
141
+ Id : "something" ,
142
+ Auth : & proto.Agent_Token {
143
+ Token : authToken ,
144
+ },
145
+ }},
146
+ }},
147
+ },
148
+ },
149
+ }},
150
+ })
151
+ coderdtest .AwaitTemplateVersionJob (t , client , version .ID )
152
+ template := coderdtest .CreateTemplate (t , client , user .OrganizationID , version .ID )
153
+ workspace := coderdtest .CreateWorkspace (t , client , codersdk .Me , template .ID )
154
+ coderdtest .AwaitWorkspaceBuildJob (t , client , workspace .LatestBuild .ID )
155
+ build , err := client .CreateWorkspaceBuild (context .Background (), workspace .ID , codersdk.CreateWorkspaceBuildRequest {
156
+ TemplateVersionID : template .ActiveVersionID ,
157
+ Transition : database .WorkspaceTransitionStart ,
158
+ DryRun : false ,
159
+ })
160
+ require .NoError (t , err )
161
+ coderdtest .AwaitWorkspaceBuildJob (t , client , build .ID )
162
+
163
+ agentClient := codersdk .New (client .URL )
164
+ agentClient .SessionToken = authToken
165
+ agentCloser := agent .New (agentClient .ListenWorkspaceAgent , & peer.ConnOptions {
166
+ Logger : slogtest .Make (t , nil ),
167
+ })
168
+ t .Cleanup (func () {
169
+ _ = agentCloser .Close ()
170
+ })
171
+ coderdtest .AwaitWorkspaceAgents (t , client , build .ID )
172
+ })
118
173
}
119
174
120
175
func TestWorkspaceBuildLogs (t * testing.T ) {
0 commit comments