Skip to content
This repository was archived by the owner on Jul 30, 2024. It is now read-only.

Commit 88bd59d

Browse files
author
Christy Henriksson
authored
SQL auto-rotation: Gallery.Maintenance (#418)
1 parent 14121b5 commit 88bd59d

33 files changed

Lines changed: 138 additions & 196 deletions

File tree

src/ArchivePackages/ArchivePackages.Job.cs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
11
// Copyright (c) .NET Foundation. All rights reserved.
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

4-
using Dapper;
5-
using Microsoft.WindowsAzure.Storage;
6-
using Microsoft.WindowsAzure.Storage.Blob;
7-
using Newtonsoft.Json.Linq;
84
using System;
95
using System.Collections.Generic;
6+
using System.ComponentModel.Design;
107
using System.Data.SqlClient;
11-
using System.Diagnostics;
128
using System.Diagnostics.Tracing;
139
using System.Linq;
1410
using System.Threading.Tasks;
11+
using Dapper;
12+
using Microsoft.WindowsAzure.Storage;
13+
using Microsoft.WindowsAzure.Storage.Blob;
14+
using Newtonsoft.Json.Linq;
1515
using NuGet.Jobs;
16-
using Microsoft.Extensions.Logging;
1716

1817
namespace ArchivePackages
1918
{
@@ -64,7 +63,7 @@ public class Job : JobBase
6463

6564
public Job() : base(JobEventSource.Log) { }
6665

67-
public override void Init(IDictionary<string, string> jobArgsDictionary)
66+
public override void Init(IServiceContainer serviceContainer, IDictionary<string, string> jobArgsDictionary)
6867
{
6968
PackageDatabase = new SqlConnectionStringBuilder(
7069
JobConfigurationManager.GetArgument(jobArgsDictionary, JobArgumentNames.PackageDatabase));

src/CopyAzureContainer/CopyAzureContainerJob.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using System;
55
using System.Collections.Generic;
6+
using System.ComponentModel.Design;
67
using System.Diagnostics;
78
using System.IO;
89
using System.Linq;
@@ -25,7 +26,7 @@ class CopyAzureContainerJob : JobBase
2526

2627
private IEnumerable<AzureContainerInfo> _sourceContainers;
2728

28-
public override void Init(IDictionary<string, string> jobArgsDictionary)
29+
public override void Init(IServiceContainer serviceContainer, IDictionary<string, string> jobArgsDictionary)
2930
{
3031
_backupDays = JobConfigurationManager.TryGetIntArgument(jobArgsDictionary, ArgumentNames.CopyAzureContainer_BackupDays) ??
3132
DefaultBackupDays;

src/Gallery.CredentialExpiration/Job.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System;
55
using System.Collections.Concurrent;
66
using System.Collections.Generic;
7+
using System.ComponentModel.Design;
78
using System.Data.SqlClient;
89
using System.Linq;
910
using System.Net;
@@ -41,7 +42,7 @@ public class Job : JobBase
4142

4243
private Storage _storage;
4344

44-
public override void Init(IDictionary<string, string> jobArgsDictionary)
45+
public override void Init(IServiceContainer serviceContainer, IDictionary<string, string> jobArgsDictionary)
4546
{
4647
_whatIf = JobConfigurationManager.TryGetBoolArgument(jobArgsDictionary, JobArgumentNames.WhatIf);
4748

src/Gallery.Maintenance/App.config

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,30 @@
1-
<?xml version="1.0" encoding="utf-8"?>
1+
<?xml version="1.0" encoding="utf-8"?>
22
<configuration>
33
<startup>
4-
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
4+
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/>
55
</startup>
66
<runtime>
77
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
88
<dependentAssembly>
9-
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
10-
<bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
9+
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
10+
<bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0"/>
1111
</dependentAssembly>
1212
<dependentAssembly>
13-
<assemblyIdentity name="Microsoft.Data.Services.Client" publicKeyToken="31bf3856ad364e35" culture="neutral" />
14-
<bindingRedirect oldVersion="0.0.0.0-5.7.0.0" newVersion="5.7.0.0" />
13+
<assemblyIdentity name="Microsoft.Data.Services.Client" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
14+
<bindingRedirect oldVersion="0.0.0.0-5.7.0.0" newVersion="5.7.0.0"/>
1515
</dependentAssembly>
1616
<dependentAssembly>
17-
<assemblyIdentity name="Microsoft.Data.OData" publicKeyToken="31bf3856ad364e35" culture="neutral" />
18-
<bindingRedirect oldVersion="0.0.0.0-5.7.0.0" newVersion="5.7.0.0" />
17+
<assemblyIdentity name="Microsoft.Data.OData" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
18+
<bindingRedirect oldVersion="0.0.0.0-5.7.0.0" newVersion="5.7.0.0"/>
1919
</dependentAssembly>
2020
<dependentAssembly>
21-
<assemblyIdentity name="Microsoft.Data.Edm" publicKeyToken="31bf3856ad364e35" culture="neutral" />
22-
<bindingRedirect oldVersion="0.0.0.0-5.7.0.0" newVersion="5.7.0.0" />
21+
<assemblyIdentity name="Microsoft.Data.Edm" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
22+
<bindingRedirect oldVersion="0.0.0.0-5.7.0.0" newVersion="5.7.0.0"/>
2323
</dependentAssembly>
2424
<dependentAssembly>
25-
<assemblyIdentity name="Microsoft.ApplicationInsights" publicKeyToken="31bf3856ad364e35" culture="neutral" />
26-
<bindingRedirect oldVersion="0.0.0.0-2.1.0.0" newVersion="2.1.0.0" />
25+
<assemblyIdentity name="Microsoft.ApplicationInsights" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
26+
<bindingRedirect oldVersion="0.0.0.0-2.1.0.0" newVersion="2.1.0.0"/>
2727
</dependentAssembly>
2828
</assemblyBinding>
2929
</runtime>
30-
</configuration>
30+
</configuration>

src/Gallery.Maintenance/DeleteExpiredVerificationKeysTask.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public override async Task RunAsync(Job job)
3737
{
3838
IEnumerable<PackageVerificationKey> expiredKeys;
3939

40-
using (var connection = await job.GalleryDatabase.ConnectTo())
40+
using (var connection = await job.GalleryDatabase.CreateAsync())
4141
{
4242
expiredKeys = await connection.QueryWithRetryAsync<PackageVerificationKey>(
4343
SelectQuery,
@@ -59,7 +59,7 @@ public override async Task RunAsync(Job job)
5959

6060
if (expectedRowCount > 0)
6161
{
62-
using (var connection = await job.GalleryDatabase.ConnectTo())
62+
using (var connection = await job.GalleryDatabase.CreateAsync())
6363
{
6464
using (var transaction = connection.BeginTransaction())
6565
{

src/Gallery.Maintenance/Gallery.Maintenance.csproj

Lines changed: 14 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@
88
<OutputType>Exe</OutputType>
99
<RootNamespace>Gallery.Maintenance</RootNamespace>
1010
<AssemblyName>Gallery.Maintenance</AssemblyName>
11-
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
11+
<TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
1212
<FileAlignment>512</FileAlignment>
13+
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
14+
<TargetFrameworkProfile />
1315
</PropertyGroup>
1416
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
1517
<PlatformTarget>AnyCPU</PlatformTarget>
@@ -31,42 +33,6 @@
3133
<WarningLevel>4</WarningLevel>
3234
</PropertyGroup>
3335
<ItemGroup>
34-
<Reference Include="Microsoft.ApplicationInsights, Version=2.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
35-
<HintPath>..\..\packages\Microsoft.ApplicationInsights.2.1.0\lib\net45\Microsoft.ApplicationInsights.dll</HintPath>
36-
</Reference>
37-
<Reference Include="Microsoft.Extensions.DependencyInjection.Abstractions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
38-
<HintPath>..\..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.1.0.0\lib\netstandard1.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll</HintPath>
39-
</Reference>
40-
<Reference Include="Microsoft.Extensions.Logging, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
41-
<HintPath>..\..\packages\Microsoft.Extensions.Logging.1.0.0\lib\netstandard1.1\Microsoft.Extensions.Logging.dll</HintPath>
42-
</Reference>
43-
<Reference Include="Microsoft.Extensions.Logging.Abstractions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
44-
<HintPath>..\..\packages\Microsoft.Extensions.Logging.Abstractions.1.0.0\lib\netstandard1.1\Microsoft.Extensions.Logging.Abstractions.dll</HintPath>
45-
</Reference>
46-
<Reference Include="NuGet.Services.Logging, Version=2.1.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
47-
<HintPath>..\..\packages\NuGet.Services.Logging.2.1.1\lib\net452\NuGet.Services.Logging.dll</HintPath>
48-
</Reference>
49-
<Reference Include="Serilog, Version=2.0.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10, processorArchitecture=MSIL">
50-
<HintPath>..\..\packages\Serilog.2.0.0\lib\net45\Serilog.dll</HintPath>
51-
</Reference>
52-
<Reference Include="Serilog.Enrichers.Environment, Version=2.0.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10, processorArchitecture=MSIL">
53-
<HintPath>..\..\packages\Serilog.Enrichers.Environment.2.1.0\lib\net45\Serilog.Enrichers.Environment.dll</HintPath>
54-
</Reference>
55-
<Reference Include="Serilog.Enrichers.Process, Version=2.0.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10, processorArchitecture=MSIL">
56-
<HintPath>..\..\packages\Serilog.Enrichers.Process.2.0.0\lib\net45\Serilog.Enrichers.Process.dll</HintPath>
57-
</Reference>
58-
<Reference Include="Serilog.Extensions.Logging, Version=1.0.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10, processorArchitecture=MSIL">
59-
<HintPath>..\..\packages\Serilog.Extensions.Logging.1.2.0\lib\net45\Serilog.Extensions.Logging.dll</HintPath>
60-
</Reference>
61-
<Reference Include="Serilog.Sinks.ApplicationInsights, Version=2.2.1.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10, processorArchitecture=MSIL">
62-
<HintPath>..\..\packages\Serilog.Sinks.ApplicationInsights.2.2.1\lib\net45\Serilog.Sinks.ApplicationInsights.dll</HintPath>
63-
</Reference>
64-
<Reference Include="Serilog.Sinks.ColoredConsole, Version=2.0.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10, processorArchitecture=MSIL">
65-
<HintPath>..\..\packages\Serilog.Sinks.ColoredConsole.2.0.0\lib\net45\Serilog.Sinks.ColoredConsole.dll</HintPath>
66-
</Reference>
67-
<Reference Include="SerilogTraceListener, Version=2.0.0.0, Culture=neutral, PublicKeyToken=9398e41289d9b801, processorArchitecture=MSIL">
68-
<HintPath>..\..\packages\SerilogTraceListener.2.0.10027\lib\net45\SerilogTraceListener.dll</HintPath>
69-
</Reference>
7036
<Reference Include="System" />
7137
<Reference Include="System.Core" />
7238
<Reference Include="System.Xml.Linq" />
@@ -90,7 +56,6 @@
9056
<None Include="Gallery.Maintenance.nuspec">
9157
<SubType>Designer</SubType>
9258
</None>
93-
<None Include="project.json" />
9459
<None Include="Scripts\*" />
9560
</ItemGroup>
9661
<ItemGroup>
@@ -99,6 +64,17 @@
9964
<Name>NuGet.Jobs.Common</Name>
10065
</ProjectReference>
10166
</ItemGroup>
67+
<ItemGroup>
68+
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions">
69+
<Version>1.0.0</Version>
70+
</PackageReference>
71+
<PackageReference Include="Newtonsoft.Json">
72+
<Version>9.0.1</Version>
73+
</PackageReference>
74+
<PackageReference Include="NuGet.Services.Sql">
75+
<Version>2.25.0-master-30263</Version>
76+
</PackageReference>
77+
</ItemGroup>
10278
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
10379
<Import Project="..\..\build\sign.targets" Condition="Exists('..\..\build\sign.targets')" />
10480
</Project>

src/Gallery.Maintenance/Job.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33

44
using System;
55
using System.Collections.Generic;
6+
using System.ComponentModel.Design;
67
using System.Data;
7-
using System.Data.SqlClient;
88
using System.Linq;
99
using System.Threading.Tasks;
1010
using Microsoft.Extensions.Logging;
1111
using NuGet.Jobs;
12+
using NuGet.Services.KeyVault;
13+
using NuGet.Services.Sql;
1214

1315
namespace Gallery.Maintenance
1416
{
@@ -17,12 +19,15 @@ namespace Gallery.Maintenance
1719
/// </summary>
1820
public class Job : JobBase
1921
{
20-
public SqlConnectionStringBuilder GalleryDatabase { get; private set; }
2122

22-
public override void Init(IDictionary<string, string> jobArgsDictionary)
23+
public ISqlConnectionFactory GalleryDatabase { get; private set; }
24+
25+
public override void Init(IServiceContainer serviceContainer, IDictionary<string, string> jobArgsDictionary)
2326
{
27+
var secretInjector = (ISecretInjector)serviceContainer.GetService(typeof(ISecretInjector));
2428
var databaseConnectionString = JobConfigurationManager.GetArgument(jobArgsDictionary, JobArgumentNames.GalleryDatabase);
25-
GalleryDatabase = new SqlConnectionStringBuilder(databaseConnectionString);
29+
30+
GalleryDatabase = new AzureSqlConnectionFactory(databaseConnectionString, secretInjector);
2631
}
2732

2833
public override async Task Run()

src/Gallery.Maintenance/project.json

Lines changed: 0 additions & 12 deletions
This file was deleted.

src/NuGet.Jobs.Common/Configuration/JobConfigurationManager.cs

Lines changed: 10 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
using System;
55
using System.Collections.Generic;
6-
using System.Diagnostics;
6+
using System.ComponentModel.Design;
77
using System.Linq;
88
using Microsoft.Extensions.Logging;
99
using NuGet.Services.Configuration;
@@ -25,37 +25,16 @@ public static class JobConfigurationManager
2525
/// <param name="jobName">Jobname to be used to infer environment variable settings</param>
2626
/// <param name="secretReaderFactory">Creates a secret reader.</param>
2727
/// <returns>Returns a dictionary of arguments</returns>
28-
public static IDictionary<string, string> GetJobArgsDictionary(ILogger logger, string[] commandLineArgs, string jobName, ISecretReaderFactory secretReaderFactory)
28+
public static IDictionary<string, string> GetJobArgsDictionary(IServiceContainer serviceContainer, ILogger logger, string[] commandLineArgs, string jobName)
2929
{
30-
if (secretReaderFactory == null)
30+
if (serviceContainer == null)
3131
{
32-
throw new ArgumentNullException(nameof(secretReaderFactory));
32+
throw new ArgumentNullException(nameof(serviceContainer));
3333
}
3434

3535
Dictionary<string, string> argsDictionary = ReadCommandLineArguments(logger, commandLineArgs);
3636

37-
return InjectSecrets(secretReaderFactory, argsDictionary);
38-
}
39-
40-
/// <summary>
41-
/// Parses the string[] of <c>args</c> passed into the job into a dictionary of string, string.
42-
/// Expects the string[] to be set of pairs of argumentName and argumentValue, where, argumentName start with a hyphen
43-
/// </summary>
44-
/// <param name="logger">Logger to use for internal logging</param>
45-
/// <param name="commandLineArgs">Arguments passed to the job via commandline or environment variable settings</param>
46-
/// <param name="jobName">Jobname to be used to infer environment variable settings</param>
47-
/// <param name="secretReaderFactory">Creates a secret reader.</param>
48-
/// <returns>Returns a dictionary of arguments</returns>
49-
public static IDictionary<string, string> GetJobArgsDictionary(ILogger logger, string[] commandLineArgs, string jobName, NuGet.Services.KeyVault.ISecretReaderFactory secretReaderFactory)
50-
{
51-
if (secretReaderFactory == null)
52-
{
53-
throw new ArgumentNullException(nameof(secretReaderFactory));
54-
}
55-
56-
Dictionary<string, string> argsDictionary = ReadCommandLineArguments(logger, commandLineArgs);
57-
58-
return InjectSecrets(secretReaderFactory, argsDictionary);
37+
return InjectSecrets(serviceContainer, argsDictionary);
5938
}
6039

6140
/// <summary>
@@ -209,8 +188,10 @@ private static Dictionary<string, string> ReadCommandLineArguments(ILogger logge
209188
return argsDictionary;
210189
}
211190

212-
private static IDictionary<string, string> InjectSecrets(ISecretReaderFactory secretReaderFactory, Dictionary<string, string> argsDictionary)
191+
private static IDictionary<string, string> InjectSecrets(IServiceContainer serviceContainer, Dictionary<string, string> argsDictionary)
213192
{
193+
var secretReaderFactory = (ISecretReaderFactory)serviceContainer.GetService(typeof(ISecretReaderFactory));
194+
214195
var secretReader = secretReaderFactory.CreateSecretReader(argsDictionary);
215196
if (secretReader == null)
216197
{
@@ -219,6 +200,8 @@ private static IDictionary<string, string> InjectSecrets(ISecretReaderFactory se
219200

220201
var secretInjector = secretReaderFactory.CreateSecretInjector(secretReader);
221202

203+
serviceContainer.AddService(typeof(ISecretInjector), secretInjector);
204+
222205
return InjectSecrets(secretInjector, argsDictionary);
223206
}
224207

src/NuGet.Jobs.Common/JobBase.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

44
using System.Collections.Generic;
5+
using System.ComponentModel.Design;
56
using System.Diagnostics.Tracing;
67
using System.Threading.Tasks;
78
using Microsoft.Extensions.Logging;
@@ -35,7 +36,7 @@ public void SetLogger(ILoggerFactory loggerFactory, ILogger logger)
3536
Logger = logger;
3637
}
3738

38-
public abstract void Init(IDictionary<string, string> jobArgsDictionary);
39+
public abstract void Init(IServiceContainer serviceContainer, IDictionary<string, string> jobArgsDictionary);
3940

4041
public abstract Task Run();
4142
}

0 commit comments

Comments
 (0)