@@ -234,6 +234,67 @@ func (c *MessageSessionClient) Session() RunnerScaleSetSession {
234234 return * c .session
235235}
236236
237+ // AcquireJobs acquires the given job request IDs from the runner scale set.
238+ // If the current session token is expired, it refreshes the session and tries one more time.
239+ func (c * MessageSessionClient ) AcquireJobs (ctx context.Context , requestIDs []int64 ) ([]int64 , error ) {
240+ c .mu .Lock ()
241+ defer c .mu .Unlock ()
242+
243+ ids , err := c .acquireJobs (ctx , requestIDs )
244+ if err == nil {
245+ return ids , nil
246+ }
247+
248+ if ! errors .Is (err , MessageQueueTokenExpiredError ) {
249+ return nil , fmt .Errorf ("failed to acquire jobs: %w" , err )
250+ }
251+
252+ if err := c .refreshMessageSession (ctx ); err != nil {
253+ return nil , fmt .Errorf ("failed to refresh message session: %w" , err )
254+ }
255+
256+ return c .acquireJobs (ctx , requestIDs )
257+ }
258+
259+ func (c * MessageSessionClient ) acquireJobs (ctx context.Context , requestIDs []int64 ) ([]int64 , error ) {
260+ body , err := json .Marshal (requestIDs )
261+ if err != nil {
262+ return nil , fmt .Errorf ("failed to marshal request ids: %w" , err )
263+ }
264+
265+ path := fmt .Sprintf ("/%s/%d/acquirejobs" , scaleSetEndpoint , c .scaleSetID )
266+
267+ c .innerClient .mu .Lock ()
268+ req , err := c .innerClient .newActionsServiceRequest (ctx , http .MethodPost , path , bytes .NewBuffer (body ))
269+ c .innerClient .mu .Unlock ()
270+ if err != nil {
271+ return nil , fmt .Errorf ("failed to create acquire jobs request: %w" , err )
272+ }
273+
274+ req .Header .Set ("Authorization" , fmt .Sprintf ("Bearer %s" , c .session .MessageQueueAccessToken ))
275+
276+ resp , err := c .commonClient .do (req )
277+ if err != nil {
278+ return nil , fmt .Errorf ("failed to issue acquire jobs request: %w" , err )
279+ }
280+ defer resp .Body .Close ()
281+
282+ if resp .StatusCode == http .StatusUnauthorized {
283+ return nil , newRequestResponseError (req , resp , MessageQueueTokenExpiredError )
284+ }
285+
286+ if resp .StatusCode != http .StatusOK {
287+ return nil , newRequestResponseError (req , resp , fmt .Errorf ("unexpected status code %s" , resp .Status ))
288+ }
289+
290+ var result acquireJobsResponse
291+ if err := json .NewDecoder (resp .Body ).Decode (& result ); err != nil {
292+ return nil , newRequestResponseError (req , resp , fmt .Errorf ("failed to decode acquire jobs response: %w" , err ))
293+ }
294+
295+ return result .Value , nil
296+ }
297+
237298func (c * MessageSessionClient ) doSessionRequest (ctx context.Context , method , path string , requestData io.Reader , expectedResponseStatusCode int , responseUnmarshalTarget any ) error {
238299 c .innerClient .mu .Lock ()
239300 defer c .innerClient .mu .Unlock ()
0 commit comments