Skip to content

Commit ad5031b

Browse files
CopilotdavidfowlCopiloteerhardt
authored
Add WithPassword method to MySQL hosting extensions (#11007)
* Initial plan * Add WithPassword method to MySQL hosting extensions Co-authored-by: davidfowl <95136+davidfowl@users.noreply.github.com> * Update src/Aspire.Hosting.MySql/MySqlBuilderExtensions.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/Aspire.Hosting.MySql/MySqlServerResource.cs --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: davidfowl <95136+davidfowl@users.noreply.github.com> Co-authored-by: David Fowler <davidfowl@gmail.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com>
1 parent 1d96ac2 commit ad5031b

File tree

4 files changed

+60
-2
lines changed

4 files changed

+60
-2
lines changed

src/Aspire.Hosting.MySql/MySqlBuilderExtensions.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,21 @@ public static IResourceBuilder<MySqlDatabaseResource> WithCreationScript(this IR
188188
return builder;
189189
}
190190

191+
/// <summary>
192+
/// Configures the password that the MySQL resource uses.
193+
/// </summary>
194+
/// <param name="builder">The resource builder.</param>
195+
/// <param name="password">The parameter used to provide the password for the MySQL resource.</param>
196+
/// <returns>The <see cref="IResourceBuilder{T}"/>.</returns>
197+
public static IResourceBuilder<MySqlServerResource> WithPassword(this IResourceBuilder<MySqlServerResource> builder, IResourceBuilder<ParameterResource> password)
198+
{
199+
ArgumentNullException.ThrowIfNull(builder);
200+
ArgumentNullException.ThrowIfNull(password);
201+
202+
builder.Resource.PasswordParameter = password.Resource;
203+
return builder;
204+
}
205+
191206
/// <summary>
192207
/// Adds a phpMyAdmin administration and development platform for MySql to the application model.
193208
/// </summary>

src/Aspire.Hosting.MySql/MySqlServerResource.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ public MySqlServerResource(string name, ParameterResource password) : base(name)
3232
public EndpointReference PrimaryEndpoint { get; }
3333

3434
/// <summary>
35-
/// Gets the parameter that contains the MySQL server password.
35+
/// Gets or sets the parameter that contains the MySQL server password.
3636
/// </summary>
37-
public ParameterResource PasswordParameter { get; }
37+
public ParameterResource PasswordParameter { get; set; }
3838

3939
/// <summary>
4040
/// Gets the connection string expression for the MySQL server.

tests/Aspire.Hosting.MySql.Tests/AddMySqlTests.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,4 +347,22 @@ public void CanAddDatabasesWithTheSameNameOnMultipleServers()
347347
Assert.Equal("{mysql1.connectionString};Database=imports", db1.Resource.ConnectionStringExpression.ValueExpression);
348348
Assert.Equal("{mysql2.connectionString};Database=imports", db2.Resource.ConnectionStringExpression.ValueExpression);
349349
}
350+
351+
[Fact]
352+
public async Task VerifyMySqlServerResourceWithPassword()
353+
{
354+
var builder = DistributedApplication.CreateBuilder();
355+
var password = "p@ssw0rd1";
356+
var pass = builder.AddParameter("pass", password);
357+
var mysql = builder.AddMySql("mysql")
358+
.WithPassword(pass)
359+
.WithEndpoint("tcp", e => e.AllocatedEndpoint = new AllocatedEndpoint(e, "localhost", 2000));
360+
361+
using var app = builder.Build();
362+
363+
var appModel = app.Services.GetRequiredService<DistributedApplicationModel>();
364+
var connectionStringResource = Assert.Single(appModel.Resources.OfType<MySqlServerResource>());
365+
var connectionString = await connectionStringResource.ConnectionStringExpression.GetValueAsync(default);
366+
Assert.Equal("Server=localhost;Port=2000;User ID=root;Password=p@ssw0rd1", connectionString);
367+
}
350368
}

tests/Aspire.Hosting.MySql.Tests/MySqlPublicApiTests.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,4 +292,29 @@ public void CtorPhpMyAdminContainerResourceShouldThrowWhenNameIsNullOrEmpty(bool
292292
: Assert.Throws<ArgumentException>(action);
293293
Assert.Equal(nameof(name), exception.ParamName);
294294
}
295+
296+
[Fact]
297+
public void WithPasswordShouldThrowWhenBuilderIsNull()
298+
{
299+
IResourceBuilder<MySqlServerResource> builder = null!;
300+
var password = TestDistributedApplicationBuilder.Create().AddParameter("password");
301+
302+
var action = () => builder.WithPassword(password);
303+
304+
var exception = Assert.Throws<ArgumentNullException>(action);
305+
Assert.Equal(nameof(builder), exception.ParamName);
306+
}
307+
308+
[Fact]
309+
public void WithPasswordShouldThrowWhenPasswordIsNull()
310+
{
311+
var builder = TestDistributedApplicationBuilder.Create()
312+
.AddMySql("MySql");
313+
IResourceBuilder<ParameterResource> password = null!;
314+
315+
var action = () => builder.WithPassword(password);
316+
317+
var exception = Assert.Throws<ArgumentNullException>(action);
318+
Assert.Equal(nameof(password), exception.ParamName);
319+
}
295320
}

0 commit comments

Comments
 (0)