-
Notifications
You must be signed in to change notification settings - Fork 5.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #36348 from dotnet/main
- Loading branch information
Showing
46 changed files
with
1,323 additions
and
289 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,84 +1,37 @@ | ||
# This is a basic workflow to help you get started with Actions | ||
|
||
name: "target supported version" | ||
|
||
# Controls when the action will run. | ||
on: | ||
# Triggers the workflow on push or pull request events but only for the default branch | ||
schedule: | ||
- cron: "0 0 1 * *" | ||
workflow_dispatch: | ||
inputs: | ||
reason: | ||
description: "The reason for running the workflow" | ||
required: true | ||
default: "Manual run" | ||
support: | ||
description: "The support level to target (STS, LTS, or Preview)." | ||
required: true | ||
default: "STS" | ||
# Triggers the workflow on push or pull request events but only for the default branch | ||
schedule: | ||
- cron: "0 0 1 * *" | ||
workflow_dispatch: | ||
inputs: | ||
reason: | ||
description: "The reason for running the workflow" | ||
required: true | ||
default: "Manual run" | ||
support: | ||
description: "The support level to target (STS, LTS, or Preview)." | ||
required: true | ||
default: "STS" | ||
|
||
# A workflow run is made up of one or more jobs that can run sequentially or in parallel | ||
jobs: | ||
# This workflow contains a single job called "build" | ||
version-sweep: | ||
# The type of runner that the job will run on | ||
runs-on: ubuntu-latest | ||
permissions: | ||
issues: write | ||
pull-requests: write | ||
|
||
# Steps represent a sequence of tasks that will be executed as part of the job | ||
steps: | ||
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it | ||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 | ||
|
||
# Runs a single command using the runners shell | ||
- name: "Print manual run reason" | ||
if: ${{ github.event_name == 'workflow_dispatch' }} | ||
run: | | ||
echo 'Reason: ${{ github.event.inputs.reason }}' | ||
# Start the .NET version sweeper, scan projects/slns for non-LTS (or currrent) versions | ||
- name: .NET version sweeper | ||
id: dotnet-version-sweeper | ||
uses: dotnet/versionsweeper@main | ||
env: | ||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
with: | ||
owner: ${{ github.repository_owner }} | ||
name: ${{ github.repository }} | ||
branch: ${{ github.ref }} | ||
|
||
- name: Create pull requests | ||
if: steps.dotnet-version-sweeper.outputs.has-remaining-work == 'true' | ||
run: | | ||
upgradeProjects: ${{ steps.dotnet-version-sweeper.outputs.upgradeProjects }} | ||
# Install .NET Upgrade Assistant global tool | ||
dotnet tool install --global upgrade-assistant | ||
# Iterate all upgrade projects | ||
for projectDir in "${upgradeProjects[@]}"; do | ||
echo "Project Directory: $projectDir" | ||
# Create a new branch | ||
git checkout -b upgrade/$projectDir | ||
# Perform the upgrade using upgrade-assistant | ||
upgrade-assistant upgrade "$projectDir" --non-interactive -t ${{ inputs.support }} | ||
# Commit the changes | ||
git add . | ||
git commit -m ".NET Version Sweeper: Upgraded $projectDir" | ||
# Push the branch to the repository | ||
git push origin upgrade/$projectDir | ||
# Create a pull request | ||
gh pr create \ | ||
--base main \ | ||
--head upgrade/$projectDir \ | ||
--title "Upgraded $projectDir" \ | ||
--body "Proposed upgrade for $projectDir" | ||
done | ||
# This workflow contains a single job called "build" | ||
version-sweep: | ||
# The type of runner that the job will run on | ||
runs-on: ubuntu-latest | ||
permissions: | ||
issues: write | ||
pull-requests: write | ||
|
||
# Steps represent a sequence of tasks that will be executed as part of the job | ||
steps: | ||
|
||
# Start the .NET version updater action | ||
# A composite of the .NET Version Sweeper and the .NET Upgrade Assistant | ||
- name: .NET version updater | ||
id: dotnet-version-updater | ||
uses: dotnet/docs-tools/actions/dotnet-version-updater@main | ||
with: | ||
support: ${{ github.event.inputs.support }} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
29 changes: 29 additions & 0 deletions
29
docs/azure/sdk/snippets/unit-testing/AboutToExpireSecretsFinder.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
using Azure.Security.KeyVault.Secrets; | ||
|
||
public class AboutToExpireSecretFinder | ||
{ | ||
private readonly TimeSpan _threshold; | ||
private readonly SecretClient _client; | ||
|
||
public AboutToExpireSecretFinder(TimeSpan threshold, SecretClient client) | ||
{ | ||
_threshold = threshold; | ||
_client = client; | ||
} | ||
|
||
public async Task<string[]> GetAboutToExpireSecretsAsync() | ||
{ | ||
List<string> secretsAboutToExpire = new(); | ||
|
||
await foreach (var secret in _client.GetPropertiesOfSecretsAsync()) | ||
{ | ||
if (secret.ExpiresOn.HasValue && | ||
secret.ExpiresOn.Value - DateTimeOffset.Now <= _threshold) | ||
{ | ||
secretsAboutToExpire.Add(secret.Name); | ||
} | ||
} | ||
|
||
return secretsAboutToExpire.ToArray(); | ||
} | ||
} |
71 changes: 71 additions & 0 deletions
71
docs/azure/sdk/snippets/unit-testing/Moq/AboutToExpireSecretsFinderTests_Moq.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
using Azure; | ||
using Azure.Security.KeyVault.Secrets; | ||
using Moq; | ||
|
||
namespace UnitTestingSampleApp.Moq; | ||
|
||
public class AboutToExpireSecretFinderTests_Moq | ||
{ | ||
[Fact] | ||
public async Task DoesNotReturnNonExpiringSecrets() | ||
{ | ||
// Arrange | ||
// Create a page of enumeration results | ||
Page<SecretProperties> page = Page<SecretProperties>.FromValues(new[] | ||
{ | ||
new SecretProperties("secret1") { ExpiresOn = null }, | ||
new SecretProperties("secret2") { ExpiresOn = null } | ||
}, null, Mock.Of<Response>()); | ||
|
||
// Create a pageable that consists of a single page | ||
AsyncPageable<SecretProperties> pageable = | ||
AsyncPageable<SecretProperties>.FromPages(new[] { page }); | ||
|
||
// Setup a client mock object to return the pageable | ||
var clientMock = new Mock<SecretClient>(); | ||
clientMock.Setup(c => c.GetPropertiesOfSecretsAsync(It.IsAny<CancellationToken>())) | ||
.Returns(pageable); | ||
|
||
// Create an instance of a class to test passing in the mock client | ||
var finder = new AboutToExpireSecretFinder(TimeSpan.FromDays(2), clientMock.Object); | ||
|
||
// Act | ||
string[] soonToExpire = await finder.GetAboutToExpireSecretsAsync(); | ||
|
||
// Assert | ||
Assert.Empty(soonToExpire); | ||
} | ||
|
||
[Fact] | ||
public async Task ReturnsSecretsThatExpireSoon() | ||
{ | ||
// Arrange | ||
|
||
// Create a page of enumeration results | ||
DateTimeOffset now = DateTimeOffset.Now; | ||
Page<SecretProperties> page = Page<SecretProperties>.FromValues(new[] | ||
{ | ||
new SecretProperties("secret1") { ExpiresOn = now.AddDays(1) }, | ||
new SecretProperties("secret2") { ExpiresOn = now.AddDays(2) }, | ||
new SecretProperties("secret3") { ExpiresOn = now.AddDays(3) } | ||
}, null, Mock.Of<Response>()); | ||
|
||
// Create a pageable that consists of a single page | ||
AsyncPageable<SecretProperties> pageable = | ||
AsyncPageable<SecretProperties>.FromPages(new[] { page }); | ||
|
||
// Setup a client mock object to return the pageable | ||
var clientMock = new Mock<SecretClient>(); | ||
clientMock.Setup(c => c.GetPropertiesOfSecretsAsync(It.IsAny<CancellationToken>())) | ||
.Returns(pageable); | ||
|
||
// Create an instance of a class to test passing in the mock client | ||
var finder = new AboutToExpireSecretFinder(TimeSpan.FromDays(2), clientMock.Object); | ||
|
||
// Act | ||
string[] soonToExpire = await finder.GetAboutToExpireSecretsAsync(); | ||
|
||
// Assert | ||
Assert.Equal(new[] { "secret1", "secret2" }, soonToExpire); | ||
} | ||
} |
Oops, something went wrong.