Skip to content

Commit 3449d5f

Browse files
Broker fixes for token refreshes and AccessDeniedException (actions#3161)
1 parent 6603bfb commit 3449d5f

File tree

3 files changed

+32
-4
lines changed

3 files changed

+32
-4
lines changed

src/Runner.Common/BrokerServer.cs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ public interface IBrokerServer : IRunnerService
2121
Task DeleteSessionAsync(CancellationToken cancellationToken);
2222

2323
Task<TaskAgentMessage> GetRunnerMessageAsync(Guid? sessionId, TaskAgentStatus status, string version, string os, string architecture, bool disableUpdate, CancellationToken token);
24+
25+
Task UpdateConnectionIfNeeded(Uri serverUri, VssCredentials credentials);
2426
}
2527

2628
public sealed class BrokerServer : RunnerService, IBrokerServer
@@ -59,7 +61,7 @@ public Task<TaskAgentMessage> GetRunnerMessageAsync(Guid? sessionId, TaskAgentSt
5961
{
6062
CheckConnection();
6163
var brokerSession = RetryRequest<TaskAgentMessage>(
62-
async () => await _brokerHttpClient.GetRunnerMessageAsync(sessionId, version, status, os, architecture, disableUpdate, cancellationToken), cancellationToken);
64+
async () => await _brokerHttpClient.GetRunnerMessageAsync(sessionId, version, status, os, architecture, disableUpdate, cancellationToken), cancellationToken, shouldRetry: ShouldRetryException);
6365

6466
return brokerSession;
6567
}
@@ -69,5 +71,25 @@ public async Task DeleteSessionAsync(CancellationToken cancellationToken)
6971
CheckConnection();
7072
await _brokerHttpClient.DeleteSessionAsync(cancellationToken);
7173
}
74+
75+
public Task UpdateConnectionIfNeeded(Uri serverUri, VssCredentials credentials)
76+
{
77+
if (_brokerUri != serverUri || !_hasConnection)
78+
{
79+
return ConnectAsync(serverUri, credentials);
80+
}
81+
82+
return Task.CompletedTask;
83+
}
84+
85+
public bool ShouldRetryException(Exception ex)
86+
{
87+
if (ex is AccessDeniedException ade && ade.ErrorCode == 1)
88+
{
89+
return false;
90+
}
91+
92+
return true;
93+
}
7294
}
7395
}

src/Runner.Listener/MessageListener.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,8 @@ public async Task<Boolean> CreateSessionAsync(CancellationToken token)
109109
if (_session.BrokerMigrationMessage != null)
110110
{
111111
Trace.Info("Runner session is in migration mode: Creating Broker session with BrokerBaseUrl: {0}", _session.BrokerMigrationMessage.BrokerBaseUrl);
112-
await _brokerServer.ConnectAsync(_session.BrokerMigrationMessage.BrokerBaseUrl, _creds);
112+
113+
await _brokerServer.UpdateConnectionIfNeeded(_session.BrokerMigrationMessage.BrokerBaseUrl, _creds);
113114
_session = await _brokerServer.CreateSessionAsync(taskAgentSession, token);
114115
_isBrokerSession = true;
115116
}
@@ -256,7 +257,7 @@ public async Task<TaskAgentMessage> GetNextMessageAsync(CancellationToken token)
256257

257258
var migrationMessage = JsonUtility.FromString<BrokerMigrationMessage>(message.Body);
258259

259-
await _brokerServer.ConnectAsync(migrationMessage.BrokerBaseUrl, _creds);
260+
await _brokerServer.UpdateConnectionIfNeeded(migrationMessage.BrokerBaseUrl, _creds);
260261
message = await _brokerServer.GetRunnerMessageAsync(_session.SessionId,
261262
runnerStatus,
262263
BuildConstants.RunnerPackage.Version,

src/Sdk/WebApi/WebApi/BrokerHttpClient.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,14 @@ public async Task<TaskAgentMessage> GetRunnerMessageAsync(
110110
return result.Value;
111111
}
112112

113+
// the only time we throw a `Forbidden` exception from Listener /messages is when the runner is
114+
// disable_update and is too old to poll
113115
if (result.StatusCode == HttpStatusCode.Forbidden)
114116
{
115-
throw new AccessDeniedException(result.Error);
117+
throw new AccessDeniedException($"{result.Error} Runner version v{runnerVersion} is deprecated and cannot receive messages.")
118+
{
119+
ErrorCode = 1
120+
};
116121
}
117122

118123
throw new Exception($"Failed to get job message: {result.Error}");

0 commit comments

Comments
 (0)