Skip to content

Commit a2811b6

Browse files
committed
Move constant values to static class
1 parent 64d0e4d commit a2811b6

File tree

5 files changed

+52
-51
lines changed

5 files changed

+52
-51
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace Azure.Sdk.Tools.Cli.Configuration;
2+
3+
public static class Constants
4+
{
5+
public const string AZURE_DEVOPS_TOKEN_SCOPE = "499b84ac-1321-427f-aa17-267ca6975798/.default";
6+
public const string MICROSOFT_CORP_TENANT = "72f988bf-86f1-41af-91ab-2d7cd011db47";
7+
8+
public const string AZURE_SDK_DEVOPS_BASE_URL = "https://dev.azure.com/azure-sdk";
9+
public const string AZURE_SDK_DEVOPS_PUBLIC_PROJECT = "public";
10+
public const string AZURE_SDK_DEVOPS_INTERNAL_PROJECT = "internal";
11+
public const string AZURE_SDK_DEVOPS_RELEASE_PROJECT = "release";
12+
}

tools/azsdk-cli/Azure.Sdk.Tools.Cli/Services/DevOpsService.cs

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using System.Text;
1313
using System.Text.Json;
1414
using System.Text.RegularExpressions;
15+
using Azure.Sdk.Tools.Cli.Configuration;
1516
using Azure.Sdk.Tools.Cli.Models;
1617
using Azure.Sdk.Tools.Cli.Models.Responses;
1718

@@ -30,7 +31,6 @@ public class DevOpsConnection : IDevOpsConnection
3031
private WorkItemTrackingHttpClient _workItemClient;
3132
private ProjectHttpClient _projectClient;
3233
private AccessToken? _token;
33-
private static readonly string DEVOPS_SCOPE = "499b84ac-1321-427f-aa17-267ca6975798/.default";
3434

3535
private void RefreshConnection()
3636
{
@@ -39,11 +39,11 @@ private void RefreshConnection()
3939

4040
try
4141
{
42-
_token = (new DefaultAzureCredential()).GetToken(new TokenRequestContext([DEVOPS_SCOPE]));
42+
_token = (new DefaultAzureCredential()).GetToken(new TokenRequestContext([Constants.AZURE_DEVOPS_TOKEN_SCOPE]));
4343
}
4444
catch
4545
{
46-
_token = (new InteractiveBrowserCredential()).GetToken(new TokenRequestContext([DEVOPS_SCOPE]));
46+
_token = (new InteractiveBrowserCredential()).GetToken(new TokenRequestContext([Constants.AZURE_DEVOPS_TOKEN_SCOPE]));
4747
}
4848

4949
if (_token == null)
@@ -52,7 +52,7 @@ private void RefreshConnection()
5252

5353
try
5454
{
55-
var connection = new VssConnection(new Uri(DevOpsService.DEVOPS_URL), new VssOAuthAccessTokenCredential(_token?.Token));
55+
var connection = new VssConnection(new Uri(Constants.AZURE_SDK_DEVOPS_BASE_URL), new VssOAuthAccessTokenCredential(_token?.Token));
5656
_buildClient = connection.GetClient<BuildHttpClient>();
5757
_workItemClient = connection.GetClient<WorkItemTrackingHttpClient>();
5858
_projectClient = connection.GetClient<ProjectHttpClient>();
@@ -103,13 +103,8 @@ public interface IDevOpsService
103103

104104
public partial class DevOpsService(ILogger<DevOpsService> logger, IDevOpsConnection connection) : IDevOpsService
105105
{
106-
public static readonly string DEVOPS_URL = "https://dev.azure.com/azure-sdk";
107-
public static readonly string RELEASE_PROJECT = "release";
108-
public static readonly string INTERNAL_PROJECT = "internal";
109106
private static readonly string RELEASE_PLANER_APP_TEST = "Release Planner App Test";
110107

111-
private const string PUBLIC_PROJECT = "public";
112-
113108
[GeneratedRegex("\\|\\s(Beta|Stable|GA)\\s\\|\\s([\\S]+)\\s\\|\\s([\\S]+)\\s\\|")]
114109
private static partial Regex SdkReleaseDetailsRegex();
115110

@@ -128,7 +123,7 @@ public async Task<ReleasePlan> GetReleasePlanForWorkItemAsync(int workItemId)
128123
public async Task<ReleasePlan> GetReleasePlanAsync(int releasePlanId)
129124
{
130125
// First find the API spec work item
131-
var query = $"SELECT [System.Id] FROM WorkItems WHERE [System.TeamProject] = '{RELEASE_PROJECT}' AND [Custom.ReleasePlanID] = '{releasePlanId}' AND [System.WorkItemType] = 'Release Plan' AND [System.State] NOT IN ('Closed','Duplicate','Abandoned')";
126+
var query = $"SELECT [System.Id] FROM WorkItems WHERE [System.TeamProject] = '{Constants.AZURE_SDK_DEVOPS_RELEASE_PROJECT}' AND [Custom.ReleasePlanID] = '{releasePlanId}' AND [System.WorkItemType] = 'Release Plan' AND [System.State] NOT IN ('Closed','Duplicate','Abandoned')";
132127
var releasePlanWorkItems = await FetchWorkItemsAsync(query);
133128
if (releasePlanWorkItems.Count == 0)
134129
{
@@ -209,7 +204,7 @@ public async Task<ReleasePlan> GetReleasePlanAsync(string pullRequestUrl)
209204
// First find the API spec work item
210205
try
211206
{
212-
var query = $"SELECT [System.Id] FROM WorkItems WHERE [System.TeamProject] = '{RELEASE_PROJECT}' AND [Custom.RESTAPIReviews] CONTAINS WORDS '{pullRequestUrl}' AND [System.WorkItemType] = 'API Spec' AND [System.State] NOT IN ('Closed','Duplicate','Abandoned')";
207+
var query = $"SELECT [System.Id] FROM WorkItems WHERE [System.TeamProject] = '{Constants.AZURE_SDK_DEVOPS_RELEASE_PROJECT}' AND [Custom.RESTAPIReviews] CONTAINS WORDS '{pullRequestUrl}' AND [System.WorkItemType] = 'API Spec' AND [System.State] NOT IN ('Closed','Duplicate','Abandoned')";
213208
var apiSpecWorkItems = await FetchWorkItemsAsync(query);
214209
if (apiSpecWorkItems.Count == 0)
215210
{
@@ -335,7 +330,7 @@ private async Task<WorkItem> CreateWorkItemAsync(ReleasePlan releasePlan, string
335330

336331
logger.LogInformation($"Creating {workItemType} work item");
337332
logger.LogInformation($"Request data to DeVops: {JsonSerializer.Serialize(specDocument)}");
338-
var workItem = await connection.GetWorkItemClient().CreateWorkItemAsync(specDocument, RELEASE_PROJECT, workItemType);
333+
var workItem = await connection.GetWorkItemClient().CreateWorkItemAsync(specDocument, Constants.AZURE_SDK_DEVOPS_RELEASE_PROJECT, workItemType);
339334
if (workItem == null)
340335
{
341336
throw new Exception("Failed to create Work Item");
@@ -536,8 +531,8 @@ public async Task<Build> RunPipelineAsync(int pipelineDefinitionId, Dictionary<s
536531

537532
var buildClient = connection.GetBuildClient();
538533
var projectClient = connection.GetProjectClient();
539-
var definition = await buildClient.GetDefinitionAsync(INTERNAL_PROJECT, pipelineDefinitionId);
540-
var project = await projectClient.GetProject(INTERNAL_PROJECT);
534+
var definition = await buildClient.GetDefinitionAsync(Constants.AZURE_SDK_DEVOPS_INTERNAL_PROJECT, pipelineDefinitionId);
535+
var project = await projectClient.GetProject(Constants.AZURE_SDK_DEVOPS_INTERNAL_PROJECT);
541536

542537
// Queue SDK generation pipeline
543538
logger.LogInformation($"Queueing pipeline [{definition.Name}].");
@@ -555,13 +550,13 @@ public async Task<Build> RunPipelineAsync(int pipelineDefinitionId, Dictionary<s
555550
public async Task<Build> GetPipelineRunAsync(int buildId)
556551
{
557552
var buildClient = connection.GetBuildClient();
558-
return await buildClient.GetBuildAsync(INTERNAL_PROJECT, buildId);
553+
return await buildClient.GetBuildAsync(Constants.AZURE_SDK_DEVOPS_INTERNAL_PROJECT, buildId);
559554
}
560555

561556
public async Task<string> GetSDKPullRequestFromPipelineRunAsync(int buildId, string language, int workItemId)
562557
{
563558
var buildClient = connection.GetBuildClient();
564-
var timeLine = await buildClient.GetBuildTimelineAsync(INTERNAL_PROJECT, buildId);
559+
var timeLine = await buildClient.GetBuildTimelineAsync(Constants.AZURE_SDK_DEVOPS_INTERNAL_PROJECT, buildId);
565560
var createPrJob = timeLine.Records.FirstOrDefault(r => r.Name == "Create pull request") ?? null;
566561
if (createPrJob == null)
567562
{
@@ -571,7 +566,7 @@ public async Task<string> GetSDKPullRequestFromPipelineRunAsync(int buildId, str
571566
// Get SDK pull request from create pull request job attachment
572567
if (createPrJob.Result == TaskResult.Succeeded)
573568
{
574-
var contentStream = await buildClient.GetAttachmentAsync(INTERNAL_PROJECT, buildId, timeLine.Id, createPrJob.Id, "Distributedtask.Core.Summary", "Pull Request Created");
569+
var contentStream = await buildClient.GetAttachmentAsync(Constants.AZURE_SDK_DEVOPS_INTERNAL_PROJECT, buildId, timeLine.Id, createPrJob.Id, "Distributedtask.Core.Summary", "Pull Request Created");
575570
if (contentStream != null)
576571
{
577572
var content = new StreamReader(contentStream);
@@ -599,7 +594,7 @@ public async Task<string> GetSDKPullRequestFromPipelineRunAsync(int buildId, str
599594

600595
public static string GetPipelineUrl(int buildId)
601596
{
602-
return $"https://dev.azure.com/azure-sdk/internal/_build/results?buildId={buildId}";
597+
return $"{Constants.AZURE_SDK_DEVOPS_BASE_URL}/internal/_build/results?buildId={buildId}";
603598
}
604599

605600
public static string ParseSDKPullRequestUrl(string sdkGenerationSummary)
@@ -847,7 +842,7 @@ public async Task<PackageResponse> GetPackageWorkItemAsync(string packageName, s
847842
throw new ArgumentException("Invalid data in one of the parameters.");
848843
}
849844

850-
var query = $"SELECT [System.Id] FROM WorkItems WHERE [System.TeamProject] = '{RELEASE_PROJECT}' AND [Custom.Package] = '{packageName}' AND [Custom.Language] = '{language}' AND [System.WorkItemType] = 'Package' AND [System.State] NOT IN ('Closed','Duplicate','Abandoned') AND [System.Tags] NOT CONTAINS '{RELEASE_PLANER_APP_TEST}'";
845+
var query = $"SELECT [System.Id] FROM WorkItems WHERE [System.TeamProject] = '{Constants.AZURE_SDK_DEVOPS_RELEASE_PROJECT}' AND [Custom.Package] = '{packageName}' AND [Custom.Language] = '{language}' AND [System.WorkItemType] = 'Package' AND [System.State] NOT IN ('Closed','Duplicate','Abandoned') AND [System.Tags] NOT CONTAINS '{RELEASE_PLANER_APP_TEST}'";
851846
if (!string.IsNullOrEmpty(packageVersion))
852847
{
853848
query += $" AND [Custom.PackageVersion] = '{packageVersion}'";
@@ -960,7 +955,7 @@ private async Task<Dictionary<string, List<string>>> GetLlmArtifactsUnauthentica
960955
{
961956
var result = new Dictionary<string, List<string>>();
962957
using var httpClient = new HttpClient();
963-
var artifactsUrl = $"https://dev.azure.com/azure-sdk/{project}/_apis/build/builds/{buildId}/artifacts?api-version=7.1-preview.5";
958+
var artifactsUrl = $"{Constants.AZURE_SDK_DEVOPS_BASE_URL}/{project}/_apis/build/builds/{buildId}/artifacts?api-version=7.1-preview.5";
964959
var artifactsResponse = await httpClient.GetAsync(artifactsUrl);
965960
artifactsResponse.EnsureSuccessStatusCode();
966961
var artifactsJson = await artifactsResponse.Content.ReadAsStringAsync();
@@ -1045,7 +1040,7 @@ await Task.Factory.StartNew(() =>
10451040

10461041
public async Task<Dictionary<string, List<string>>> GetPipelineLlmArtifacts(string project, int buildId)
10471042
{
1048-
if (project == PUBLIC_PROJECT)
1043+
if (project == Constants.AZURE_SDK_DEVOPS_PUBLIC_PROJECT)
10491044
{
10501045
return await GetLlmArtifactsUnauthenticated(project, buildId);
10511046
}

tools/azsdk-cli/Azure.Sdk.Tools.Cli/Tools/AzurePipelines/PipelineAnalysisTool.cs

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using System.Xml;
99
using Azure.Core;
1010
using Azure.Sdk.Tools.Cli.Commands;
11+
using Azure.Sdk.Tools.Cli.Configuration;
1112
using Azure.Sdk.Tools.Cli.Contract;
1213
using Azure.Sdk.Tools.Cli.Helpers;
1314
using Azure.Sdk.Tools.Cli.Models;
@@ -32,12 +33,6 @@ public class PipelineAnalysisTool : MCPTool
3233
private readonly IOutputService output;
3334
private readonly ILogger<PipelineAnalysisTool> logger;
3435

35-
private const string AZURE_DEVOPS_TOKEN_SCOPE = "499b84ac-1321-427f-aa17-267ca6975798/.default";
36-
private const string MICROSOFT_CORP_TENANT = "72f988bf-86f1-41af-91ab-2d7cd011db47";
37-
private const string AZURE_DEVOPS_BASE_URL = "https://dev.azure.com/azure-sdk";
38-
private const string PUBLIC_PROJECT = "public";
39-
private const string INTERNAL_PROJECT = "internal";
40-
4136
private IAzureAgentService azureAgentService;
4237
private TokenUsageHelper usage;
4338
private bool initialized = false;
@@ -142,17 +137,16 @@ private void Initialize(bool auth = true)
142137

143138
if (auth)
144139
{
145-
var tokenScope = new[] { AZURE_DEVOPS_TOKEN_SCOPE };
146-
var msftCorpTenant = MICROSOFT_CORP_TENANT;
147-
var token = azureService.GetCredential(msftCorpTenant).GetToken(new TokenRequestContext(tokenScope));
140+
var tokenScope = new[] { Constants.AZURE_DEVOPS_TOKEN_SCOPE };
141+
var token = azureService.GetCredential(Constants.MICROSOFT_CORP_TENANT).GetToken(new TokenRequestContext(tokenScope));
148142
var tokenCredential = new VssOAuthAccessTokenCredential(token.Token);
149-
var connection = new VssConnection(new Uri(AZURE_DEVOPS_BASE_URL), tokenCredential);
143+
var connection = new VssConnection(new Uri(Constants.AZURE_SDK_DEVOPS_BASE_URL), tokenCredential);
150144
_buildClient = connection.GetClient<BuildHttpClient>();
151145
_testClient = connection.GetClient<TestResultsHttpClient>();
152146
}
153147
else
154148
{
155-
var connection = new VssConnection(new Uri(AZURE_DEVOPS_BASE_URL), null);
149+
var connection = new VssConnection(new Uri(Constants.AZURE_SDK_DEVOPS_BASE_URL), null);
156150
_buildClient = connection.GetClient<BuildHttpClient>();
157151
_testClient = connection.GetClient<TestResultsHttpClient>();
158152
}
@@ -162,15 +156,15 @@ private void Initialize(bool auth = true)
162156

163157
private async Task<string> GetPipelineProject(int buildId, string? project = null)
164158
{
165-
if (project == PUBLIC_PROJECT || string.IsNullOrEmpty(project))
159+
if (project == Constants.AZURE_SDK_DEVOPS_PUBLIC_PROJECT || string.IsNullOrEmpty(project))
166160
{
167-
var pipelineUrl = $"{AZURE_DEVOPS_BASE_URL}/{PUBLIC_PROJECT}/_apis/build/builds/{buildId}?api-version=7.1";
161+
var pipelineUrl = $"{Constants.AZURE_SDK_DEVOPS_BASE_URL}/{Constants.AZURE_SDK_DEVOPS_PUBLIC_PROJECT}/_apis/build/builds/{buildId}?api-version=7.1";
168162
logger.LogDebug("Getting pipeline details from {url} via http", pipelineUrl);
169163
var response = await httpClient.GetAsync(pipelineUrl);
170164
// If project is not specified, try both public and internal projects
171165
if (string.IsNullOrEmpty(project) && !response.IsSuccessStatusCode)
172166
{
173-
return await GetPipelineProject(buildId, INTERNAL_PROJECT);
167+
return await GetPipelineProject(buildId, Constants.AZURE_SDK_DEVOPS_INTERNAL_PROJECT);
174168
}
175169
response.EnsureSuccessStatusCode();
176170
var json = await response.Content.ReadAsStringAsync();
@@ -183,7 +177,7 @@ private async Task<string> GetPipelineProject(int buildId, string? project = nul
183177
return projectName;
184178
}
185179

186-
var _pipelineUrl = $"{AZURE_DEVOPS_BASE_URL}/{project}/_apis/build/builds/{buildId}?api-version=7.1";
180+
var _pipelineUrl = $"{Constants.AZURE_SDK_DEVOPS_BASE_URL}/{project}/_apis/build/builds/{buildId}?api-version=7.1";
187181
logger.LogDebug("Getting pipeline details from {url} via sdk", _pipelineUrl);
188182
var build = await buildClient.GetBuildAsync(project, buildId);
189183
return build.Project.Name;
@@ -193,7 +187,7 @@ public async Task<List<int>> GetPipelineFailureLogIds(string project, int buildI
193187
{
194188
logger.LogDebug("Getting pipeline task failures for {project} {buildId}", project, buildId);
195189

196-
if (project != PUBLIC_PROJECT)
190+
if (project != Constants.AZURE_SDK_DEVOPS_PUBLIC_PROJECT)
197191
{
198192
var timeline = await buildClient.GetBuildTimelineAsync(project, buildId, cancellationToken: ct);
199193
var _failedTasks = timeline.Records.Where(
@@ -205,7 +199,7 @@ public async Task<List<int>> GetPipelineFailureLogIds(string project, int buildI
205199
return _failedTasks.Select(t => t.Log?.Id ?? 0).Where(id => id != 0).Distinct().ToList();
206200
}
207201

208-
var timelineUrl = $"{AZURE_DEVOPS_BASE_URL}/{project}/_apis/build/builds/{buildId}/timeline?api-version=7.1";
202+
var timelineUrl = $"{Constants.AZURE_SDK_DEVOPS_BASE_URL}/{project}/_apis/build/builds/{buildId}/timeline?api-version=7.1";
209203
logger.LogDebug("Getting timeline records from {url}", timelineUrl);
210204
var response = await httpClient.GetAsync(timelineUrl, ct);
211205
response.EnsureSuccessStatusCode();
@@ -309,7 +303,7 @@ public async Task<List<FailedTestRunResponse>> GetPipelineFailedTestResults(stri
309303

310304
public async Task<string> GetBuildLogLinesUnauthenticated(string project, int buildId, int logId, CancellationToken ct = default)
311305
{
312-
var logUrl = $"{AZURE_DEVOPS_BASE_URL}/{project}/_apis/build/builds/{buildId}/logs/{logId}?api-version=7.1";
306+
var logUrl = $"{Constants.AZURE_SDK_DEVOPS_BASE_URL}/{project}/_apis/build/builds/{buildId}/logs/{logId}?api-version=7.1";
313307
logger.LogDebug("Fetching log file from {url}", logUrl);
314308
var response = await httpClient.GetAsync(logUrl, ct);
315309
response.EnsureSuccessStatusCode();
@@ -321,7 +315,7 @@ public async Task<LogAnalysisResponse> AnalyzePipelineFailureLogs(string? projec
321315
{
322316
try
323317
{
324-
project ??= PUBLIC_PROJECT;
318+
project ??= Constants.AZURE_SDK_DEVOPS_PUBLIC_PROJECT;
325319
var session = $"{project}-{buildId}";
326320
List<string> logs = [];
327321

@@ -330,7 +324,7 @@ public async Task<LogAnalysisResponse> AnalyzePipelineFailureLogs(string? projec
330324
string logText;
331325
logger.LogDebug("Downloading pipeline failure log for {project} {buildId} {logId}", project, buildId, logId);
332326

333-
if (project == PUBLIC_PROJECT)
327+
if (project == Constants.AZURE_SDK_DEVOPS_PUBLIC_PROJECT)
334328
{
335329
logText = await GetBuildLogLinesUnauthenticated(project, buildId, logId, ct);
336330
}

tools/azsdk-cli/Azure.Sdk.Tools.Cli/Tools/AzurePipelines/PipelineDetailsTool.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.ComponentModel;
66
using Azure.Core;
77
using Azure.Sdk.Tools.Cli.Commands;
8+
using Azure.Sdk.Tools.Cli.Configuration;
89
using Azure.Sdk.Tools.Cli.Contract;
910
using Azure.Sdk.Tools.Cli.Models;
1011
using Azure.Sdk.Tools.Cli.Services;
@@ -73,10 +74,10 @@ private void Initialize()
7374
{
7475
return;
7576
}
76-
var tokenScope = new[] { "499b84ac-1321-427f-aa17-267ca6975798/.default" }; // Azure DevOps scope
77+
var tokenScope = new[] { Constants.AZURE_DEVOPS_TOKEN_SCOPE };
7778
var token = azureService.GetCredential().GetToken(new TokenRequestContext(tokenScope));
7879
var tokenCredential = new VssOAuthAccessTokenCredential(token.Token);
79-
var connection = new VssConnection(new Uri($"https://dev.azure.com/azure-sdk"), tokenCredential);
80+
var connection = new VssConnection(new Uri(Constants.AZURE_SDK_DEVOPS_BASE_URL), tokenCredential);
8081
buildClient = connection.GetClient<BuildHttpClient>();
8182
}
8283

@@ -103,12 +104,12 @@ public async Task<ObjectCommandResponse> GetPipelineRun(int buildId, string? pro
103104

104105
try
105106
{
106-
var build = await buildClient.GetBuildAsync("public", buildId);
107+
var build = await buildClient.GetBuildAsync(Constants.AZURE_SDK_DEVOPS_PUBLIC_PROJECT, buildId);
107108
return new ObjectCommandResponse { Result = build };
108109
}
109110
catch (Exception)
110111
{
111-
var build = await buildClient.GetBuildAsync("internal", buildId);
112+
var build = await buildClient.GetBuildAsync(Constants.AZURE_SDK_DEVOPS_INTERNAL_PROJECT, buildId);
112113
return new ObjectCommandResponse { Result = build };
113114
}
114115
}

0 commit comments

Comments
 (0)