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