Skip to content

Commit c401af8

Browse files
committed
Some fixes
1 parent 42ee05a commit c401af8

File tree

10 files changed

+84
-56
lines changed

10 files changed

+84
-56
lines changed

src/EdFi.AdminConsole.InstanceManagementWorker/Startup.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public static void ConfigureServices(IServiceCollection services, IConfiguration
5252
services.AddTransient<IMgrWorkerConfigConnectionStringsProvider, ConfigConnectionStringsProvider>();
5353
services.AddTransient<IDbConnectionStringBuilderAdapterFactory, DbConnectionStringBuilderAdapterFactory>();
5454
services.AddTransient<IDbConnectionStringBuilderAdapter, NpgsqlConnectionStringBuilderAdapter>();
55-
services.AddTransient<IDatabaseNameBuilder, InstanceDatabaseNameBuilder>();
55+
services.AddTransient<IMgrWorkerIDatabaseNameBuilder, InstanceDatabaseNameBuilder>();
5656

5757
var databaseEngine = config.GetValue("AppSettings:DatabaseEngine", "SqlServer");
5858

src/EdFi.AdminConsole.InstanceManagementWorker/appsettings.json

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,16 @@
55
"DefaultPageSizeOffset": 0,
66
"DefaultPageSizeLimit": 25,
77
"OverrideExistingDatabase": false,
8-
"IgnoresCertificateErrors": true
8+
"IgnoresCertificateErrors": true,
9+
"SqlServerBakFile": "/tmp/Ods_Minimal_Template.bak"
910
},
1011
"AdminApiSettings": {
11-
"AdminConsoleTenantsURL": "http://localhost:8282/adminapi/adminconsole/tenants",
12-
"AdminConsoleInstancesURL": "http://localhost:8282/adminapi/adminconsole/instances?status={0}",
13-
"AdminConsoleCompleteInstancesURL": "http://localhost:8282/adminapi/adminconsole/instances/{0}/completed",
14-
"AdminConsoleInstanceDeletedURL": "http://localhost:8282/adminapi/adminconsole/instances/{0}/deleted",
15-
"AdminConsoleInstanceDeleteFailedURL": "http://localhost:8282/adminapi/adminconsole/instances/{0}/deletefailed",
16-
"AccessTokenUrl": "http://localhost:28080/realms/edfi-admin-console/protocol/openid-connect/token",
12+
"AdminConsoleTenantsURL": "https://localhost/adminapi/adminconsole/tenants",
13+
"AdminConsoleInstancesURL": "https://localhost/adminapi/adminconsole/instances?status={0}",
14+
"AdminConsoleCompleteInstancesURL": "https://localhost/adminapi/adminconsole/instances/{0}/completed",
15+
"AdminConsoleInstanceDeletedURL": "https://localhost/adminapi/adminconsole/instances/{0}/deleted",
16+
"AdminConsoleInstanceDeleteFailedURL": "https://localhost/adminapi/adminconsole/instances/{0}/deletefailed",
17+
"AccessTokenUrl": "https://localhost/auth/realms/edfi-admin-console/protocol/openid-connect/token",
1718
"Username": "",
1819
"ClientId": "adminconsole-worker-client",
1920
"ClientSecret": "7tpYh5eZtL0ct99cmfCXUY3q5o2KxUTU",

src/EdFi.AdminConsole.InstanceMgrWorker.Provisioner/Provisioners/ConfigConnectionStringsProvider.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,14 @@ public IDictionary<string, string> ConnectionStringProviderByName
2525
get
2626
{
2727
#pragma warning disable CS8619 // Nullability of reference types in value doesn't match target type.
28-
return _config.GetSection($"Tenants:{_tenant}:ConnectionStrings")
29-
.GetChildren()
30-
.ToDictionary(k => k.Key, v => v.Value);
28+
if (!string.IsNullOrEmpty(_tenant) && !_tenant.Equals("default", StringComparison.OrdinalIgnoreCase))
29+
return _config.GetSection($"Tenants:{_tenant}:ConnectionStrings")
30+
.GetChildren()
31+
.ToDictionary(k => k.Key, v => v.Value);
32+
else
33+
return _config.GetSection("ConnectionStrings")
34+
.GetChildren()
35+
.ToDictionary(k => k.Key, v => v.Value);
3136
#pragma warning restore CS8619 // Nullability of reference types in value doesn't match target type.
3237
}
3338
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
// Licensed to the Ed-Fi Alliance under one or more agreements.
3+
// The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0.
4+
// See the LICENSE and NOTICES files in the project root for more information.
5+
6+
using EdFi.Admin.DataAccess.Utils;
7+
8+
namespace EdFi.AdminConsole.InstanceMgrWorker.Configuration.Provisioners;
9+
10+
public interface IMgrWorkerIDatabaseNameBuilder : IDatabaseNameBuilder
11+
{
12+
string OdsDatabaseName(string? tenant, string databaseName);
13+
}

src/EdFi.AdminConsole.InstanceMgrWorker.Provisioner/Provisioners/InstanceDatabaseNameBuilder.cs

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,18 @@
33
// The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0.
44
// See the LICENSE and NOTICES files in the project root for more information.
55

6-
using EdFi.Admin.DataAccess.Utils;
7-
using EdFi.Ods.Common.Configuration;
86
using EdFi.Ods.Common.Database;
97
using EdFi.Ods.Common.Extensions;
8+
using Microsoft.EntityFrameworkCore.Metadata.Internal;
109

1110
namespace EdFi.AdminConsole.InstanceMgrWorker.Configuration.Provisioners
1211
{
13-
public class InstanceDatabaseNameBuilder : IDatabaseNameBuilder
12+
public class InstanceDatabaseNameBuilder : IMgrWorkerIDatabaseNameBuilder
1413
{
1514
private const string TemplatePrefix = "Ods_";
16-
private const string SandboxPrefix = TemplatePrefix + "Sandbox_";
17-
18-
private const string TemplateEmptyDatabase = TemplatePrefix + "Empty_Template";
1915
private const string TemplateMinimalDatabase = TemplatePrefix + "Minimal_Template";
20-
private const string TemplateSampleDatabase = TemplatePrefix + "Populated_Template";
2116

17+
private string? _tenant { get; set; }
2218
private readonly Lazy<string> _databaseNameTemplate;
2319

2420
public InstanceDatabaseNameBuilder(IMgrWorkerConfigConnectionStringsProvider connectionStringsProvider,
@@ -27,6 +23,9 @@ public InstanceDatabaseNameBuilder(IMgrWorkerConfigConnectionStringsProvider con
2723
_databaseNameTemplate = new Lazy<string>(
2824
() =>
2925
{
26+
if (!string.IsNullOrEmpty(_tenant))
27+
connectionStringsProvider.SetTenant(_tenant);
28+
3029
if (!connectionStringsProvider.ConnectionStringProviderByName.ContainsKey("EdFi_Ods"))
3130
{
3231
return string.Empty;
@@ -45,31 +44,29 @@ public string DemoSandboxDatabase
4544
get => "EdFi_Ods";
4645
}
4746

48-
public string EmptyDatabase
49-
{
50-
get => DatabaseName(TemplateEmptyDatabase);
51-
}
47+
public string EmptyDatabase => throw new NotImplementedException();
5248

5349
public string MinimalDatabase
5450
{
55-
get => DatabaseName(TemplateMinimalDatabase);
51+
get => DatabaseName(_tenant, TemplateMinimalDatabase);
5652
}
5753

58-
public string SampleDatabase
59-
{
60-
get => DatabaseName(TemplateSampleDatabase);
61-
}
54+
public string SampleDatabase => throw new NotImplementedException();
55+
56+
public string SandboxNameForKey(string key) => throw new NotImplementedException();
6257

63-
public string SandboxNameForKey(string key) => DatabaseName(TemplatePrefix + key);
58+
public string KeyFromSandboxName(string sandboxName) => throw new NotImplementedException();
6459

65-
public string KeyFromSandboxName(string sandboxName) => sandboxName.Replace(DatabaseName(SandboxPrefix), string.Empty);
60+
public string TemplateSandboxNameForKey(string sandboxKey) => throw new NotImplementedException();
6661

67-
public string TemplateSandboxNameForKey(string sandboxKey) => SandboxPrefix + sandboxKey;
62+
public string OdsDatabaseName(string? tenant, string databaseName) => DatabaseName(tenant, TemplatePrefix + databaseName);
6863

69-
private string DatabaseName(string databaseName)
70-
=> _databaseNameTemplate.Value.IsFormatString()
64+
private string DatabaseName(string? tenant, string databaseName)
65+
{
66+
_tenant = tenant;
67+
return _databaseNameTemplate.Value.IsFormatString()
7168
? string.Format(_databaseNameTemplate.Value, databaseName)
7269
: _databaseNameTemplate.Value;
70+
}
7371
}
7472
}
75-

src/EdFi.AdminConsole.InstanceMgrWorker.Provisioner/Provisioners/InstanceProvisionerBase.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ namespace EdFi.AdminConsole.InstanceMgrWorker.Configuration.Provisioners
1212
{
1313
public abstract class InstanceProvisionerBase : IInstanceProvisioner
1414
{
15-
private string _tenant;
15+
protected string _tenant;
1616
protected readonly IConfiguration _configuration;
1717
protected readonly IMgrWorkerConfigConnectionStringsProvider _connectionStringsProvider;
18-
protected readonly IDatabaseNameBuilder _databaseNameBuilder;
18+
protected readonly IMgrWorkerIDatabaseNameBuilder _databaseNameBuilder;
1919

2020
protected InstanceProvisionerBase(IConfiguration configuration,
21-
IMgrWorkerConfigConnectionStringsProvider connectionStringsProvider, IDatabaseNameBuilder databaseNameBuilder)
21+
IMgrWorkerConfigConnectionStringsProvider connectionStringsProvider, IMgrWorkerIDatabaseNameBuilder databaseNameBuilder)
2222
{
2323
_tenant = string.Empty;
2424
_configuration = configuration;
@@ -67,7 +67,7 @@ public async Task AddDbInstanceAsync(string instanceName, DbInstanceType instanc
6767
}
6868
public async Task AddDbInstanceAsync(string instanceName, DbInstanceType instanceType, bool useSuffix)
6969
{
70-
var newInstanceName = _databaseNameBuilder.SandboxNameForKey(instanceName);
70+
var newInstanceName = _databaseNameBuilder.OdsDatabaseName(_tenant, instanceName);
7171
await DeleteDbInstancesAsync(newInstanceName).ConfigureAwait(false);
7272

7373
switch (instanceType)

src/EdFi.AdminConsole.InstanceMgrWorker.Provisioner/Provisioners/PostgresInstanceProvisioner.cs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
using System.Data.Common;
77
using Dapper;
88
using EdFi.Admin.DataAccess.Utils;
9-
using EdFi.Ods.Common.Configuration;
109
using Microsoft.Extensions.Configuration;
1110
using Npgsql;
1211

@@ -15,7 +14,7 @@ namespace EdFi.AdminConsole.InstanceMgrWorker.Configuration.Provisioners
1514
public class PostgresInstanceProvisioner : InstanceProvisionerBase
1615
{
1716
public PostgresInstanceProvisioner(IConfiguration configuration,
18-
IMgrWorkerConfigConnectionStringsProvider connectionStringsProvider, IDatabaseNameBuilder databaseNameBuilder)
17+
IMgrWorkerConfigConnectionStringsProvider connectionStringsProvider, IMgrWorkerIDatabaseNameBuilder databaseNameBuilder)
1918
: base(configuration, connectionStringsProvider, databaseNameBuilder) { }
2019

2120
public override async Task RenameDbInstancesAsync(string oldName, string newName)
@@ -41,10 +40,10 @@ public override async Task DeleteDbInstancesAsync(params string[] deletedClientK
4140
foreach (string key in deletedClientKeys)
4241
{
4342
await conn.ExecuteAsync(
44-
$@"SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname='{_databaseNameBuilder.SandboxNameForKey(key)}';");
43+
$@"SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname='{key}';");
4544

4645
await conn.ExecuteAsync(
47-
$@"DROP DATABASE IF EXISTS ""{_databaseNameBuilder.SandboxNameForKey(key)}"";",
46+
$@"DROP DATABASE IF EXISTS ""{key}"";",
4847
commandTimeout: CommandTimeout)
4948
.ConfigureAwait(false);
5049
}
@@ -70,7 +69,7 @@ public override async Task<InstanceStatus> GetDbInstanceStatusAsync(string clien
7069
using (var conn = CreateConnection())
7170
{
7271
var results = await conn.QueryAsync<InstanceStatus>(
73-
$"SELECT datname as Name, 0 as Code, 'ONLINE' Description FROM pg_database WHERE datname = \'{_databaseNameBuilder.SandboxNameForKey(clientKey)}\';",
72+
$"SELECT datname as Name, 0 as Code, 'ONLINE' Description FROM pg_database WHERE datname = \'{_databaseNameBuilder.OdsDatabaseName(_tenant, clientKey)}\';",
7473
commandTimeout: CommandTimeout)
7574
.ConfigureAwait(false);
7675

@@ -83,7 +82,7 @@ public override async Task<string[]> GetInstancesDatabasesAsync()
8382
using (var conn = CreateConnection())
8483
{
8584
var results = await conn.QueryAsync<string>(
86-
$"SELECT datname as name FROM pg_database WHERE datname like \'{_databaseNameBuilder.SandboxNameForKey("%")}\';",
85+
$"SELECT datname as name FROM pg_database WHERE datname like \'{_databaseNameBuilder.OdsDatabaseName(_tenant, "%")}\';",
8786
commandTimeout: CommandTimeout)
8887
.ConfigureAwait(false);
8988

@@ -96,7 +95,7 @@ public override async Task<bool> CheckDatabaseExists(string instanceName)
9695
using (var conn = CreateConnection())
9796
{
9897
var results = await conn.QueryAsync<string>(
99-
$"SELECT datname as name FROM pg_database WHERE datname like \'{instanceName}\';",
98+
$"SELECT datname as name FROM pg_database WHERE datname like \'{_databaseNameBuilder.OdsDatabaseName(_tenant, instanceName)}\';",
10099
commandTimeout: CommandTimeout)
101100
.ConfigureAwait(false);
102101

src/EdFi.AdminConsole.InstanceMgrWorker.Provisioner/Provisioners/SqlServerInstanceProvisioner.cs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
using System.Runtime.InteropServices;
88
using Dapper;
99
using EdFi.Admin.DataAccess.Utils;
10-
using EdFi.Ods.Common.Configuration;
1110
using log4net;
1211
using Microsoft.Data.SqlClient;
1312
using Microsoft.Extensions.Configuration;
@@ -21,7 +20,7 @@ public class SqlServerInstanceProvisioner : InstanceProvisionerBase
2120
private readonly string _sqlServerBakFile;
2221

2322
public SqlServerInstanceProvisioner(IConfiguration configuration,
24-
IMgrWorkerConfigConnectionStringsProvider connectionStringsProvider, IDatabaseNameBuilder databaseNameBuilder)
23+
IMgrWorkerConfigConnectionStringsProvider connectionStringsProvider, IMgrWorkerIDatabaseNameBuilder databaseNameBuilder)
2524
: base(configuration, connectionStringsProvider, databaseNameBuilder)
2625
{
2726
_sqlServerBakFile = configuration.GetSection("AppSettings:SqlServerBakFile").Value ?? string.Empty;
@@ -33,7 +32,7 @@ public override async Task<bool> CheckDatabaseExists(string instanceName)
3332
{
3433
var results = await conn.QueryAsync<string>(
3534
$"SELECT name FROM sys.databases WHERE name like @DbName;",
36-
new { DbName = _databaseNameBuilder.SandboxNameForKey(instanceName) }, commandTimeout: CommandTimeout)
35+
new { DbName = _databaseNameBuilder.OdsDatabaseName(_tenant, instanceName) }, commandTimeout: CommandTimeout)
3736
.ConfigureAwait(false);
3837

3938
return (results?.ToArray().Length ?? 0) > 0;
@@ -162,10 +161,10 @@ public override async Task DeleteDbInstancesAsync(params string[] deletedClientK
162161
foreach (string key in deletedClientKeys)
163162
{
164163
await conn.ExecuteAsync($@"
165-
IF EXISTS (SELECT name from sys.databases WHERE (name = '{_databaseNameBuilder.SandboxNameForKey(key)}'))
164+
IF EXISTS (SELECT name from sys.databases WHERE (name = '{key}'))
166165
BEGIN
167-
ALTER DATABASE [{_databaseNameBuilder.SandboxNameForKey(key)}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
168-
DROP DATABASE [{_databaseNameBuilder.SandboxNameForKey(key)}];
166+
ALTER DATABASE [{key}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
167+
DROP DATABASE [{key}];
169168
END;
170169
", commandTimeout: CommandTimeout)
171170
.ConfigureAwait(false);

src/InstanceMgrWorker.Core.UnitTests/Helpers/AdminApiConnectionDataValidatorTests.cs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ public void SetUp()
2828
_adminApiSettings.AdminConsoleCompleteInstancesURL = "http://www.myserver.com/adminconsole/complete";
2929
_adminApiSettings.Username = "test-username";
3030
_adminApiSettings.ClientId = "test-clientid";
31-
_adminApiSettings.Password = "test-password";
31+
_adminApiSettings.ClientSecret = "test-clientsecret";
32+
_adminApiSettings.Scope = "test-scope";
33+
_adminApiSettings.GrantType = "client_credentials";
3234
}
3335

3436
[TestFixture]
@@ -97,25 +99,35 @@ public void should_be_invalid()
9799
}
98100

99101
[TestFixture]
100-
public class When_it_does_not_have_Username : Given_AdminApiSettings_provided
102+
public class When_it_does_not_have_ClientSecret : Given_AdminApiSettings_provided
101103
{
102104
[Test]
103105
public void should_be_invalid()
104106
{
105-
_adminApiSettings.Username = string.Empty;
107+
_adminApiSettings.ClientSecret = string.Empty;
106108
AdminApiConnectionDataValidator.IsValid(_logger, _adminApiSettings).ShouldBeFalse();
107109
}
108110
}
109111

110112
[TestFixture]
111-
public class When_it_does_not_have_ClientSecret : Given_AdminApiSettings_provided
113+
public class When_it_does_not_have_Scope : Given_AdminApiSettings_provided
112114
{
113115
[Test]
114116
public void should_be_invalid()
115117
{
116-
_adminApiSettings.Password = string.Empty;
118+
_adminApiSettings.Scope = string.Empty;
117119
AdminApiConnectionDataValidator.IsValid(_logger, _adminApiSettings).ShouldBeFalse();
118120
}
119121
}
120122

123+
[TestFixture]
124+
public class When_it_does_not_have_GrantType : Given_AdminApiSettings_provided
125+
{
126+
[Test]
127+
public void should_be_invalid()
128+
{
129+
_adminApiSettings.GrantType = string.Empty;
130+
AdminApiConnectionDataValidator.IsValid(_logger, _adminApiSettings).ShouldBeFalse();
131+
}
132+
}
121133
}

src/InstanceMgrWorker.Core.UnitTests/Testing.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@ public static IOptions<AdminApiSettings> GetAdminApiSettings()
5858
adminApiSettings.AdminConsoleCompleteInstancesURL = "http://www.myserver.com/adminconsole/instances/{0}/completed";
5959
adminApiSettings.Username = "test-username";
6060
adminApiSettings.ClientId = "test-clientid";
61-
adminApiSettings.Password = "test-password";
61+
adminApiSettings.ClientSecret = "test-clientsecret";
62+
adminApiSettings.Scope = "test-scope";
63+
adminApiSettings.GrantType = "client_credentials";
6264
IOptions<AdminApiSettings> options = Options.Create(adminApiSettings);
6365
return options;
6466
}

0 commit comments

Comments
 (0)