From baa6ded3bc446cadbed72ce4da91df26740d5a29 Mon Sep 17 00:00:00 2001 From: Tingluo Huang Date: Thu, 9 Apr 2020 14:33:16 -0400 Subject: [PATCH] Better Kusto Tracing for self-hosted runner. (#405) --- src/Runner.Common/HostContext.cs | 17 ++++++-- src/Runner.Common/RunnerServer.cs | 6 +-- .../Configuration/ConfigurationManager.cs | 2 +- src/Runner.Listener/JobDispatcher.cs | 32 +++++++++++---- src/Runner.Listener/Runner.cs | 2 +- src/Runner.Sdk/Util/VssUtil.cs | 4 +- src/Runner.Worker/ActionManager.cs | 2 +- src/Runner.Worker/Worker.cs | 2 +- .../DTWebApi/WebApi/TaskAgentHttpClient.cs | 28 ++++++++++++- .../WebApi/Jwt/JsonWebTokenUtilities.cs | 2 +- src/Test/L0/Listener/JobDispatcherL0.cs | 40 +++++++++---------- src/Test/L0/TestHostContext.cs | 2 +- 12 files changed, 95 insertions(+), 44 deletions(-) diff --git a/src/Runner.Common/HostContext.cs b/src/Runner.Common/HostContext.cs index 99e152b1d..4da520913 100644 --- a/src/Runner.Common/HostContext.cs +++ b/src/Runner.Common/HostContext.cs @@ -24,7 +24,7 @@ namespace GitHub.Runner.Common CancellationToken RunnerShutdownToken { get; } ShutdownReason RunnerShutdownReason { get; } ISecretMasker SecretMasker { get; } - ProductInfoHeaderValue UserAgent { get; } + List UserAgents { get; } RunnerWebProxy WebProxy { get; } string GetDirectory(WellKnownDirectory directory); string GetConfigFile(WellKnownConfigFile configFile); @@ -54,7 +54,7 @@ namespace GitHub.Runner.Common private readonly ConcurrentDictionary _serviceInstances = new ConcurrentDictionary(); private readonly ConcurrentDictionary _serviceTypes = new ConcurrentDictionary(); private readonly ISecretMasker _secretMasker = new SecretMasker(); - private readonly ProductInfoHeaderValue _userAgent = new ProductInfoHeaderValue($"GitHubActionsRunner-{BuildConstants.RunnerPackage.PackageName}", BuildConstants.RunnerPackage.Version); + private readonly List _userAgents = new List() { new ProductInfoHeaderValue($"GitHubActionsRunner-{BuildConstants.RunnerPackage.PackageName}", BuildConstants.RunnerPackage.Version) }; private CancellationTokenSource _runnerShutdownTokenSource = new CancellationTokenSource(); private object _perfLock = new object(); private Tracing _trace; @@ -72,7 +72,7 @@ namespace GitHub.Runner.Common public CancellationToken RunnerShutdownToken => _runnerShutdownTokenSource.Token; public ShutdownReason RunnerShutdownReason { get; private set; } public ISecretMasker SecretMasker => _secretMasker; - public ProductInfoHeaderValue UserAgent => _userAgent; + public List UserAgents => _userAgents; public RunnerWebProxy WebProxy => _webProxy; public HostContext(string hostType, string logFile = null) { @@ -189,6 +189,17 @@ namespace GitHub.Runner.Common { _trace.Info($"No proxy settings were found based on environmental variables (http_proxy/https_proxy/HTTP_PROXY/HTTPS_PROXY)"); } + + var credFile = GetConfigFile(WellKnownConfigFile.Credentials); + if (File.Exists(credFile)) + { + var credData = IOUtil.LoadObject(credFile); + if (credData != null && + credData.Data.TryGetValue("clientId", out var clientId)) + { + _userAgents.Add(new ProductInfoHeaderValue($"RunnerId", clientId)); + } + } } public string GetDirectory(WellKnownDirectory directory) diff --git a/src/Runner.Common/RunnerServer.cs b/src/Runner.Common/RunnerServer.cs index 7b244db0e..cbdcb898c 100644 --- a/src/Runner.Common/RunnerServer.cs +++ b/src/Runner.Common/RunnerServer.cs @@ -41,7 +41,7 @@ namespace GitHub.Runner.Common // job request Task GetAgentRequestAsync(int poolId, long requestId, CancellationToken cancellationToken); - Task RenewAgentRequestAsync(int poolId, long requestId, Guid lockToken, CancellationToken cancellationToken); + Task RenewAgentRequestAsync(int poolId, long requestId, Guid lockToken, string orchestrationId, CancellationToken cancellationToken); Task FinishAgentRequestAsync(int poolId, long requestId, Guid lockToken, DateTime finishTime, TaskResult result, CancellationToken cancellationToken); // agent package @@ -300,10 +300,10 @@ namespace GitHub.Runner.Common // JobRequest //----------------------------------------------------------------- - public Task RenewAgentRequestAsync(int poolId, long requestId, Guid lockToken, CancellationToken cancellationToken = default(CancellationToken)) + public Task RenewAgentRequestAsync(int poolId, long requestId, Guid lockToken, string orchestrationId = null, CancellationToken cancellationToken = default(CancellationToken)) { CheckConnection(RunnerConnectionType.JobRequest); - return _requestTaskAgentClient.RenewAgentRequestAsync(poolId, requestId, lockToken, cancellationToken: cancellationToken); + return _requestTaskAgentClient.RenewAgentRequestAsync(poolId, requestId, lockToken, orchestrationId: orchestrationId, cancellationToken: cancellationToken); } public Task FinishAgentRequestAsync(int poolId, long requestId, Guid lockToken, DateTime finishTime, TaskResult result, CancellationToken cancellationToken = default(CancellationToken)) diff --git a/src/Runner.Listener/Configuration/ConfigurationManager.cs b/src/Runner.Listener/Configuration/ConfigurationManager.cs index e2b8ca31c..c2d4a60cd 100644 --- a/src/Runner.Listener/Configuration/ConfigurationManager.cs +++ b/src/Runner.Listener/Configuration/ConfigurationManager.cs @@ -511,7 +511,7 @@ namespace GitHub.Runner.Listener.Configuration using (var httpClient = new HttpClient(httpClientHandler)) { httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("RemoteAuth", githubToken); - httpClient.DefaultRequestHeaders.UserAgent.Add(HostContext.UserAgent); + httpClient.DefaultRequestHeaders.UserAgent.AddRange(HostContext.UserAgents); var bodyObject = new Dictionary() { diff --git a/src/Runner.Listener/JobDispatcher.cs b/src/Runner.Listener/JobDispatcher.cs index 00d31b116..706044c55 100644 --- a/src/Runner.Listener/JobDispatcher.cs +++ b/src/Runner.Listener/JobDispatcher.cs @@ -12,6 +12,7 @@ using System.Linq; using GitHub.Services.Common; using GitHub.Runner.Common; using GitHub.Runner.Sdk; +using GitHub.Services.WebApi.Jwt; namespace GitHub.Runner.Listener { @@ -86,15 +87,30 @@ namespace GitHub.Runner.Listener } } + var orchestrationId = string.Empty; + var systemConnection = jobRequestMessage.Resources.Endpoints.SingleOrDefault(x => string.Equals(x.Name, WellKnownServiceEndpointNames.SystemVssConnection, StringComparison.OrdinalIgnoreCase)); + if (systemConnection?.Authorization != null && + systemConnection.Authorization.Parameters.TryGetValue("AccessToken", out var accessToken) && + !string.IsNullOrEmpty(accessToken)) + { + var jwt = JsonWebToken.Create(accessToken); + var claims = jwt.ExtractClaims(); + orchestrationId = claims.FirstOrDefault(x => string.Equals(x.Type, "orchid", StringComparison.OrdinalIgnoreCase))?.Value; + if (!string.IsNullOrEmpty(orchestrationId)) + { + Trace.Info($"Pull OrchestrationId {orchestrationId} from JWT claims"); + } + } + WorkerDispatcher newDispatch = new WorkerDispatcher(jobRequestMessage.JobId, jobRequestMessage.RequestId); if (runOnce) { Trace.Info("Start dispatcher for one time used runner."); - newDispatch.WorkerDispatch = RunOnceAsync(jobRequestMessage, currentDispatch, newDispatch.WorkerCancellationTokenSource.Token, newDispatch.WorkerCancelTimeoutKillTokenSource.Token); + newDispatch.WorkerDispatch = RunOnceAsync(jobRequestMessage, orchestrationId, currentDispatch, newDispatch.WorkerCancellationTokenSource.Token, newDispatch.WorkerCancelTimeoutKillTokenSource.Token); } else { - newDispatch.WorkerDispatch = RunAsync(jobRequestMessage, currentDispatch, newDispatch.WorkerCancellationTokenSource.Token, newDispatch.WorkerCancelTimeoutKillTokenSource.Token); + newDispatch.WorkerDispatch = RunAsync(jobRequestMessage, orchestrationId, currentDispatch, newDispatch.WorkerCancellationTokenSource.Token, newDispatch.WorkerCancelTimeoutKillTokenSource.Token); } _jobInfos.TryAdd(newDispatch.JobId, newDispatch); @@ -284,11 +300,11 @@ namespace GitHub.Runner.Listener } } - private async Task RunOnceAsync(Pipelines.AgentJobRequestMessage message, WorkerDispatcher previousJobDispatch, CancellationToken jobRequestCancellationToken, CancellationToken workerCancelTimeoutKillToken) + private async Task RunOnceAsync(Pipelines.AgentJobRequestMessage message, string orchestrationId, WorkerDispatcher previousJobDispatch, CancellationToken jobRequestCancellationToken, CancellationToken workerCancelTimeoutKillToken) { try { - await RunAsync(message, previousJobDispatch, jobRequestCancellationToken, workerCancelTimeoutKillToken); + await RunAsync(message, orchestrationId, previousJobDispatch, jobRequestCancellationToken, workerCancelTimeoutKillToken); } finally { @@ -297,7 +313,7 @@ namespace GitHub.Runner.Listener } } - private async Task RunAsync(Pipelines.AgentJobRequestMessage message, WorkerDispatcher previousJobDispatch, CancellationToken jobRequestCancellationToken, CancellationToken workerCancelTimeoutKillToken) + private async Task RunAsync(Pipelines.AgentJobRequestMessage message, string orchestrationId, WorkerDispatcher previousJobDispatch, CancellationToken jobRequestCancellationToken, CancellationToken workerCancelTimeoutKillToken) { Busy = true; try @@ -328,7 +344,7 @@ namespace GitHub.Runner.Listener // start renew job request Trace.Info($"Start renew job request {requestId} for job {message.JobId}."); - Task renewJobRequest = RenewJobRequestAsync(_poolId, requestId, lockToken, firstJobRequestRenewed, lockRenewalTokenSource.Token); + Task renewJobRequest = RenewJobRequestAsync(_poolId, requestId, lockToken, orchestrationId, firstJobRequestRenewed, lockRenewalTokenSource.Token); // wait till first renew succeed or job request is canceled // not even start worker if the first renew fail @@ -607,7 +623,7 @@ namespace GitHub.Runner.Listener } } - public async Task RenewJobRequestAsync(int poolId, long requestId, Guid lockToken, TaskCompletionSource firstJobRequestRenewed, CancellationToken token) + public async Task RenewJobRequestAsync(int poolId, long requestId, Guid lockToken, string orchestrationId, TaskCompletionSource firstJobRequestRenewed, CancellationToken token) { var runnerServer = HostContext.GetService(); TaskAgentJobRequest request = null; @@ -620,7 +636,7 @@ namespace GitHub.Runner.Listener { try { - request = await runnerServer.RenewAgentRequestAsync(poolId, requestId, lockToken, token); + request = await runnerServer.RenewAgentRequestAsync(poolId, requestId, lockToken, orchestrationId, token); Trace.Info($"Successfully renew job request {requestId}, job is valid till {request.LockedUntil.Value}"); diff --git a/src/Runner.Listener/Runner.cs b/src/Runner.Listener/Runner.cs index 5ca2ef21c..bcc982eda 100644 --- a/src/Runner.Listener/Runner.cs +++ b/src/Runner.Listener/Runner.cs @@ -37,7 +37,7 @@ namespace GitHub.Runner.Listener { try { - VssUtil.InitializeVssClientSettings(HostContext.UserAgent, HostContext.WebProxy); + VssUtil.InitializeVssClientSettings(HostContext.UserAgents, HostContext.WebProxy); _inConfigStage = true; _completedCommand.Reset(); diff --git a/src/Runner.Sdk/Util/VssUtil.cs b/src/Runner.Sdk/Util/VssUtil.cs index b5b6ce7b3..3b4e1b3ed 100644 --- a/src/Runner.Sdk/Util/VssUtil.cs +++ b/src/Runner.Sdk/Util/VssUtil.cs @@ -14,10 +14,10 @@ namespace GitHub.Runner.Sdk { public static class VssUtil { - public static void InitializeVssClientSettings(ProductInfoHeaderValue additionalUserAgent, IWebProxy proxy) + public static void InitializeVssClientSettings(List additionalUserAgents, IWebProxy proxy) { var headerValues = new List(); - headerValues.Add(additionalUserAgent); + headerValues.AddRange(additionalUserAgents); headerValues.Add(new ProductInfoHeaderValue($"({RuntimeInformation.OSDescription.Trim()})")); if (VssClientHttpRequestSettings.Default.UserAgent != null && VssClientHttpRequestSettings.Default.UserAgent.Count > 0) diff --git a/src/Runner.Worker/ActionManager.cs b/src/Runner.Worker/ActionManager.cs index e73aa17dd..4d01a7894 100644 --- a/src/Runner.Worker/ActionManager.cs +++ b/src/Runner.Worker/ActionManager.cs @@ -534,7 +534,7 @@ namespace GitHub.Runner.Worker // Intentionally empty. Temporary for GHES alpha release, download from dotcom unauthenticated. } - httpClient.DefaultRequestHeaders.UserAgent.Add(HostContext.UserAgent); + httpClient.DefaultRequestHeaders.UserAgent.AddRange(HostContext.UserAgents); using (var result = await httpClient.GetStreamAsync(archiveLink)) { await result.CopyToAsync(fs, _defaultCopyBufferSize, actionDownloadCancellation.Token); diff --git a/src/Runner.Worker/Worker.cs b/src/Runner.Worker/Worker.cs index 8db8424d2..1c83c4342 100644 --- a/src/Runner.Worker/Worker.cs +++ b/src/Runner.Worker/Worker.cs @@ -40,7 +40,7 @@ namespace GitHub.Runner.Worker // Validate args. ArgUtil.NotNullOrEmpty(pipeIn, nameof(pipeIn)); ArgUtil.NotNullOrEmpty(pipeOut, nameof(pipeOut)); - VssUtil.InitializeVssClientSettings(HostContext.UserAgent, HostContext.WebProxy); + VssUtil.InitializeVssClientSettings(HostContext.UserAgents, HostContext.WebProxy); var jobRunner = HostContext.CreateService(); using (var channel = HostContext.CreateService()) diff --git a/src/Sdk/DTWebApi/WebApi/TaskAgentHttpClient.cs b/src/Sdk/DTWebApi/WebApi/TaskAgentHttpClient.cs index 79d9bd481..c97fea0a4 100644 --- a/src/Sdk/DTWebApi/WebApi/TaskAgentHttpClient.cs +++ b/src/Sdk/DTWebApi/WebApi/TaskAgentHttpClient.cs @@ -95,6 +95,7 @@ namespace GitHub.DistributedTask.WebApi Int64 requestId, Guid lockToken, DateTime? expiresOn = null, + string orchestrationId = null, Object userState = null, CancellationToken cancellationToken = default(CancellationToken)) { @@ -104,7 +105,30 @@ namespace GitHub.DistributedTask.WebApi LockedUntil = expiresOn, }; - return UpdateAgentRequestAsync(poolId, requestId, lockToken, request, userState, cancellationToken); + var additionalHeaders = new Dictionary(); + if (!string.IsNullOrEmpty(orchestrationId)) + { + additionalHeaders["X-VSS-OrchestrationId"] = orchestrationId; + } + + HttpMethod httpMethod = new HttpMethod("PATCH"); + Guid locationId = new Guid("fc825784-c92a-4299-9221-998a02d1b54f"); + object routeValues = new { poolId = poolId, requestId = requestId }; + HttpContent content = new ObjectContent(request, new VssJsonMediaTypeFormatter(true)); + + List> queryParams = new List>(); + queryParams.Add("lockToken", lockToken.ToString()); + + return SendAsync( + httpMethod, + additionalHeaders, + locationId, + routeValues: routeValues, + version: new ApiResourceVersion(5.1, 1), + queryParameters: queryParams, + userState: userState, + cancellationToken: cancellationToken, + content: content); } public Task ReplaceAgentAsync( @@ -171,5 +195,5 @@ namespace GitHub.DistributedTask.WebApi } private readonly ApiResourceVersion m_currentApiVersion = new ApiResourceVersion(3.0, 1); - } + } } diff --git a/src/Sdk/WebApi/WebApi/Jwt/JsonWebTokenUtilities.cs b/src/Sdk/WebApi/WebApi/Jwt/JsonWebTokenUtilities.cs index d296666b7..5287dbf65 100644 --- a/src/Sdk/WebApi/WebApi/Jwt/JsonWebTokenUtilities.cs +++ b/src/Sdk/WebApi/WebApi/Jwt/JsonWebTokenUtilities.cs @@ -96,7 +96,7 @@ namespace GitHub.Services.WebApi.Jwt return ret; } - internal static IEnumerable ExtractClaims(this JsonWebToken token) + public static IEnumerable ExtractClaims(this JsonWebToken token) { ArgumentUtility.CheckForNull(token, nameof(token)); diff --git a/src/Test/L0/Listener/JobDispatcherL0.cs b/src/Test/L0/Listener/JobDispatcherL0.cs index 00a7b5155..a8062b206 100644 --- a/src/Test/L0/Listener/JobDispatcherL0.cs +++ b/src/Test/L0/Listener/JobDispatcherL0.cs @@ -73,7 +73,7 @@ namespace GitHub.Runner.Common.Tests.Listener Assert.NotNull(sessionIdProperty); sessionIdProperty.SetValue(request, DateTime.UtcNow.AddMinutes(5)); - _runnerServer.Setup(x => x.RenewAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Returns(Task.FromResult(request)); + _runnerServer.Setup(x => x.RenewAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Returns(Task.FromResult(request)); _runnerServer.Setup(x => x.FinishAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Returns(Task.FromResult(new TaskAgentJobRequest())); @@ -112,7 +112,7 @@ namespace GitHub.Runner.Common.Tests.Listener hc.SetSingleton(_runnerServer.Object); hc.SetSingleton(_configurationStore.Object); _configurationStore.Setup(x => x.GetSettings()).Returns(new RunnerSettings() { PoolId = 1 }); - _runnerServer.Setup(x => x.RenewAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + _runnerServer.Setup(x => x.RenewAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(() => { count++; @@ -139,10 +139,10 @@ namespace GitHub.Runner.Common.Tests.Listener var jobDispatcher = new JobDispatcher(); jobDispatcher.Initialize(hc); - await jobDispatcher.RenewJobRequestAsync(poolId, requestId, Guid.Empty, firstJobRequestRenewed, cancellationTokenSource.Token); + await jobDispatcher.RenewJobRequestAsync(poolId, requestId, Guid.Empty, Guid.NewGuid().ToString(), firstJobRequestRenewed, cancellationTokenSource.Token); Assert.True(firstJobRequestRenewed.Task.IsCompletedSuccessfully); - _runnerServer.Verify(x => x.RenewAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Exactly(5)); + _runnerServer.Verify(x => x.RenewAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Exactly(5)); } } @@ -170,7 +170,7 @@ namespace GitHub.Runner.Common.Tests.Listener hc.SetSingleton(_runnerServer.Object); hc.SetSingleton(_configurationStore.Object); _configurationStore.Setup(x => x.GetSettings()).Returns(new RunnerSettings() { PoolId = 1 }); - _runnerServer.Setup(x => x.RenewAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + _runnerServer.Setup(x => x.RenewAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(() => { count++; @@ -197,11 +197,11 @@ namespace GitHub.Runner.Common.Tests.Listener var jobDispatcher = new JobDispatcher(); jobDispatcher.Initialize(hc); - await jobDispatcher.RenewJobRequestAsync(poolId, requestId, Guid.Empty, firstJobRequestRenewed, cancellationTokenSource.Token); + await jobDispatcher.RenewJobRequestAsync(poolId, requestId, Guid.Empty, Guid.NewGuid().ToString(), firstJobRequestRenewed, cancellationTokenSource.Token); Assert.True(firstJobRequestRenewed.Task.IsCompletedSuccessfully, "First renew should succeed."); Assert.False(cancellationTokenSource.IsCancellationRequested); - _runnerServer.Verify(x => x.RenewAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Exactly(5)); + _runnerServer.Verify(x => x.RenewAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Exactly(5)); } } @@ -229,7 +229,7 @@ namespace GitHub.Runner.Common.Tests.Listener hc.SetSingleton(_runnerServer.Object); hc.SetSingleton(_configurationStore.Object); _configurationStore.Setup(x => x.GetSettings()).Returns(new RunnerSettings() { PoolId = 1 }); - _runnerServer.Setup(x => x.RenewAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + _runnerServer.Setup(x => x.RenewAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(() => { count++; @@ -256,11 +256,11 @@ namespace GitHub.Runner.Common.Tests.Listener var jobDispatcher = new JobDispatcher(); jobDispatcher.Initialize(hc); - await jobDispatcher.RenewJobRequestAsync(poolId, requestId, Guid.Empty, firstJobRequestRenewed, cancellationTokenSource.Token); + await jobDispatcher.RenewJobRequestAsync(poolId, requestId, Guid.Empty, Guid.NewGuid().ToString(), firstJobRequestRenewed, cancellationTokenSource.Token); Assert.True(firstJobRequestRenewed.Task.IsCompletedSuccessfully, "First renew should succeed."); Assert.False(cancellationTokenSource.IsCancellationRequested); - _runnerServer.Verify(x => x.RenewAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Exactly(5)); + _runnerServer.Verify(x => x.RenewAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Exactly(5)); } } @@ -288,7 +288,7 @@ namespace GitHub.Runner.Common.Tests.Listener hc.SetSingleton(_runnerServer.Object); hc.SetSingleton(_configurationStore.Object); _configurationStore.Setup(x => x.GetSettings()).Returns(new RunnerSettings() { PoolId = 1 }); - _runnerServer.Setup(x => x.RenewAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + _runnerServer.Setup(x => x.RenewAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(() => { count++; @@ -315,11 +315,11 @@ namespace GitHub.Runner.Common.Tests.Listener var jobDispatcher = new JobDispatcher(); jobDispatcher.Initialize(hc); - await jobDispatcher.RenewJobRequestAsync(poolId, requestId, Guid.Empty, firstJobRequestRenewed, cancellationTokenSource.Token); + await jobDispatcher.RenewJobRequestAsync(poolId, requestId, Guid.Empty, Guid.NewGuid().ToString(), firstJobRequestRenewed, cancellationTokenSource.Token); Assert.True(firstJobRequestRenewed.Task.IsCompletedSuccessfully, "First renew should succeed."); Assert.True(cancellationTokenSource.IsCancellationRequested); - _runnerServer.Verify(x => x.RenewAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Exactly(8)); + _runnerServer.Verify(x => x.RenewAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Exactly(8)); _runnerServer.Verify(x => x.RefreshConnectionAsync(RunnerConnectionType.JobRequest, It.IsAny()), Times.Exactly(3)); _runnerServer.Verify(x => x.SetConnectionTimeout(RunnerConnectionType.JobRequest, It.IsAny()), Times.Once); } @@ -349,7 +349,7 @@ namespace GitHub.Runner.Common.Tests.Listener hc.SetSingleton(_runnerServer.Object); hc.SetSingleton(_configurationStore.Object); _configurationStore.Setup(x => x.GetSettings()).Returns(new RunnerSettings() { PoolId = 1 }); - _runnerServer.Setup(x => x.RenewAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + _runnerServer.Setup(x => x.RenewAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(() => { count++; @@ -372,11 +372,11 @@ namespace GitHub.Runner.Common.Tests.Listener var jobDispatcher = new JobDispatcher(); jobDispatcher.Initialize(hc); - await jobDispatcher.RenewJobRequestAsync(poolId, requestId, Guid.Empty, firstJobRequestRenewed, cancellationTokenSource.Token); + await jobDispatcher.RenewJobRequestAsync(poolId, requestId, Guid.Empty, Guid.NewGuid().ToString(), firstJobRequestRenewed, cancellationTokenSource.Token); Assert.False(firstJobRequestRenewed.Task.IsCompletedSuccessfully, "First renew should failed."); Assert.False(cancellationTokenSource.IsCancellationRequested); - _runnerServer.Verify(x => x.RenewAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Exactly(6)); + _runnerServer.Verify(x => x.RenewAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Exactly(6)); } } @@ -404,7 +404,7 @@ namespace GitHub.Runner.Common.Tests.Listener hc.SetSingleton(_runnerServer.Object); hc.SetSingleton(_configurationStore.Object); _configurationStore.Setup(x => x.GetSettings()).Returns(new RunnerSettings() { PoolId = 1 }); - _runnerServer.Setup(x => x.RenewAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + _runnerServer.Setup(x => x.RenewAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(() => { count++; @@ -436,11 +436,11 @@ namespace GitHub.Runner.Common.Tests.Listener var jobDispatcher = new JobDispatcher(); jobDispatcher.Initialize(hc); - await jobDispatcher.RenewJobRequestAsync(poolId, requestId, Guid.Empty, firstJobRequestRenewed, cancellationTokenSource.Token); + await jobDispatcher.RenewJobRequestAsync(poolId, requestId, Guid.Empty, Guid.NewGuid().ToString(), firstJobRequestRenewed, cancellationTokenSource.Token); Assert.True(firstJobRequestRenewed.Task.IsCompletedSuccessfully, "First renew should succeed."); Assert.False(cancellationTokenSource.IsCancellationRequested); - _runnerServer.Verify(x => x.RenewAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Exactly(5)); + _runnerServer.Verify(x => x.RenewAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Exactly(5)); _runnerServer.Verify(x => x.RefreshConnectionAsync(RunnerConnectionType.JobRequest, It.IsAny()), Times.Exactly(3)); _runnerServer.Verify(x => x.SetConnectionTimeout(RunnerConnectionType.JobRequest, It.IsAny()), Times.Never); } @@ -481,7 +481,7 @@ namespace GitHub.Runner.Common.Tests.Listener Assert.NotNull(sessionIdProperty); sessionIdProperty.SetValue(request, DateTime.UtcNow.AddMinutes(5)); - _runnerServer.Setup(x => x.RenewAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Returns(Task.FromResult(request)); + _runnerServer.Setup(x => x.RenewAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Returns(Task.FromResult(request)); _runnerServer.Setup(x => x.FinishAgentRequestAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Returns(Task.FromResult(new TaskAgentJobRequest())); diff --git a/src/Test/L0/TestHostContext.cs b/src/Test/L0/TestHostContext.cs index 3d3c99c73..546b3cc8e 100644 --- a/src/Test/L0/TestHostContext.cs +++ b/src/Test/L0/TestHostContext.cs @@ -86,7 +86,7 @@ namespace GitHub.Runner.Common.Tests } } - public ProductInfoHeaderValue UserAgent => new ProductInfoHeaderValue("L0Test", "0.0"); + public List UserAgents => new List() { new ProductInfoHeaderValue("L0Test", "0.0") }; public RunnerWebProxy WebProxy => new RunnerWebProxy();