Skip to content

Commit 7d221ef

Browse files
Alirexaaradicaleerhardtdavidfowl
authored
Add Password To Redis (dotnet#4642)
* add password to redis * add xml docs,fix public api text files * Update src/Aspire.Hosting.Redis/RedisBuilderExtensions.cs Co-authored-by: Ankit Jain <[email protected]> * Update src/Aspire.Hosting.Redis/RedisBuilderExtensions.cs Co-authored-by: Ankit Jain <[email protected]> * Update src/Aspire.Hosting.Redis/RedisBuilderExtensions.cs Co-authored-by: Ankit Jain <[email protected]> * Apply suggestions from code review Co-authored-by: Ankit Jain <[email protected]> * apply suggested changes * add more tests * add password to redis commander REDIS_HOSTS env variable * Minor PR feedback * fix failing test * add test for redis commander shuold works when password provided * PR feedback - Update for latest code. - Always generate a password parameter, like the other resources. - Handle persistence and password command line annotation conflicts by having a single commandline callback annotation, and combine them both together. - Update tests * Remove playground build files. * Remove explicit dashboard reference. * fix test * Fix up merge for the latest code * Fix Redis Insights with a Redis connection with a password. This needs to work around redis/RedisInsight#3452, which requires the agreements encryption property to be initialized. * - Fix tests - Update manifests * Fix new test. --------- Co-authored-by: Ankit Jain <[email protected]> Co-authored-by: Eric Erhardt <[email protected]> Co-authored-by: David Fowler <[email protected]>
1 parent e6d4999 commit 7d221ef

File tree

16 files changed

+504
-81
lines changed

16 files changed

+504
-81
lines changed

playground/AzureContainerApps/AzureContainerApps.AppHost/api.module.bicep

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ param api_containerport string
55

66
param storage_outputs_blobendpoint string
77

8+
@secure()
9+
param cache_password_value string
10+
811
param account_outputs_connectionstring string
912

1013
@secure()
@@ -30,6 +33,10 @@ resource api 'Microsoft.App/containerApps@2024-03-01' = {
3033
properties: {
3134
configuration: {
3235
secrets: [
36+
{
37+
name: 'connectionstrings--cache'
38+
value: 'cache:6379,password=${cache_password_value}'
39+
}
3340
{
3441
name: 'value'
3542
value: secretparam_value
@@ -88,7 +95,7 @@ resource api 'Microsoft.App/containerApps@2024-03-01' = {
8895
}
8996
{
9097
name: 'ConnectionStrings__cache'
91-
value: 'cache:6379'
98+
secretRef: 'connectionstrings--cache'
9299
}
93100
{
94101
name: 'ConnectionStrings__account'

playground/AzureContainerApps/AzureContainerApps.AppHost/aspire-manifest.json

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
},
3232
"cache": {
3333
"type": "container.v1",
34-
"connectionString": "{cache.bindings.tcp.host}:{cache.bindings.tcp.port}",
34+
"connectionString": "{cache.bindings.tcp.host}:{cache.bindings.tcp.port},password={cache-password.value}",
3535
"image": "docker.io/library/redis:7.4",
3636
"deployment": {
3737
"type": "azure.bicep.v0",
@@ -40,10 +40,13 @@
4040
"cache_volumes_0_storage": "{cache.volumes.0.storage}",
4141
"outputs_azure_container_registry_managed_identity_id": "{.outputs.AZURE_CONTAINER_REGISTRY_MANAGED_IDENTITY_ID}",
4242
"outputs_managed_identity_client_id": "{.outputs.MANAGED_IDENTITY_CLIENT_ID}",
43+
"cache_password_value": "{cache-password.value}",
4344
"outputs_azure_container_apps_environment_id": "{.outputs.AZURE_CONTAINER_APPS_ENVIRONMENT_ID}"
4445
}
4546
},
4647
"args": [
48+
"--requirepass",
49+
"{cache-password.value}",
4750
"--save",
4851
"60",
4952
"1"
@@ -112,6 +115,7 @@
112115
"params": {
113116
"api_containerport": "{api.containerPort}",
114117
"storage_outputs_blobendpoint": "{storage.outputs.blobEndpoint}",
118+
"cache_password_value": "{cache-password.value}",
115119
"account_outputs_connectionstring": "{account.outputs.connectionString}",
116120
"secretparam_value": "{secretparam.value}",
117121
"outputs_azure_container_registry_managed_identity_id": "{.outputs.AZURE_CONTAINER_REGISTRY_MANAGED_IDENTITY_ID}",
@@ -148,6 +152,21 @@
148152
"external": true
149153
}
150154
}
155+
},
156+
"cache-password": {
157+
"type": "parameter.v0",
158+
"value": "{cache-password.inputs.value}",
159+
"inputs": {
160+
"value": {
161+
"type": "string",
162+
"secret": true,
163+
"default": {
164+
"generate": {
165+
"minLength": 22
166+
}
167+
}
168+
}
169+
}
151170
}
152171
}
153172
}

playground/AzureContainerApps/AzureContainerApps.AppHost/cache.module.bicep

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ param outputs_azure_container_registry_managed_identity_id string
77

88
param outputs_managed_identity_client_id string
99

10+
@secure()
11+
param cache_password_value string
12+
1013
param outputs_azure_container_apps_environment_id string
1114

1215
resource cache 'Microsoft.App/containerApps@2024-03-01' = {
@@ -28,6 +31,8 @@ resource cache 'Microsoft.App/containerApps@2024-03-01' = {
2831
image: 'docker.io/library/redis:7.4'
2932
name: 'cache'
3033
args: [
34+
'--requirepass'
35+
cache_password_value
3136
'--save'
3237
'60'
3338
'1'

playground/ProxylessEndToEnd/ProxylessEndToEnd.AppHost/aspire-manifest.json

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,12 @@
33
"resources": {
44
"redis": {
55
"type": "container.v0",
6-
"connectionString": "{redis.bindings.tcp.host}:{redis.bindings.tcp.port}",
6+
"connectionString": "{redis.bindings.tcp.host}:{redis.bindings.tcp.port},password={redis-password.value}",
77
"image": "docker.io/library/redis:7.4",
8+
"args": [
9+
"--requirepass",
10+
"{redis-password.value}"
11+
],
812
"bindings": {
913
"tcp": {
1014
"scheme": "tcp",
@@ -59,6 +63,21 @@
5963
"port": 13456
6064
}
6165
}
66+
},
67+
"redis-password": {
68+
"type": "parameter.v0",
69+
"value": "{redis-password.inputs.value}",
70+
"inputs": {
71+
"value": {
72+
"type": "string",
73+
"secret": true,
74+
"default": {
75+
"generate": {
76+
"minLength": 22
77+
}
78+
}
79+
}
80+
}
6281
}
6382
}
6483
}

playground/Redis/Redis.AppHost/Redis.AppHost.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
<ImplicitUsings>enable</ImplicitUsings>
77
<Nullable>enable</Nullable>
88
<IsAspireHost>true</IsAspireHost>
9+
<UserSecretsId>dfbd0a65-25cf-4318-b377-813f4f6efeea</UserSecretsId>
910
</PropertyGroup>
1011

1112
<ItemGroup>

playground/Redis/Redis.AppHost/aspire-manifest.json

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,18 @@
33
"resources": {
44
"redis": {
55
"type": "container.v0",
6-
"connectionString": "{redis.bindings.tcp.host}:{redis.bindings.tcp.port}",
6+
"connectionString": "{redis.bindings.tcp.host}:{redis.bindings.tcp.port},password={redis-password.value}",
77
"image": "docker.io/library/redis:7.4",
88
"args": [
9+
"--requirepass",
10+
"{redis-password.value}",
911
"--save",
1012
"60",
1113
"1"
1214
],
1315
"volumes": [
1416
{
15-
"name": "redis.apphost-468a945e22-redis-data",
17+
"name": "redis.apphost-7855b85e05-redis-data",
1618
"target": "/data",
1719
"readOnly": false
1820
}
@@ -40,7 +42,7 @@
4042
],
4143
"volumes": [
4244
{
43-
"name": "redis.apphost-468a945e22-garnet-data",
45+
"name": "redis.apphost-7855b85e05-garnet-data",
4446
"target": "/data",
4547
"readOnly": false
4648
}
@@ -104,6 +106,21 @@
104106
"transport": "http"
105107
}
106108
}
109+
},
110+
"redis-password": {
111+
"type": "parameter.v0",
112+
"value": "{redis-password.inputs.value}",
113+
"inputs": {
114+
"value": {
115+
"type": "string",
116+
"secret": true,
117+
"default": {
118+
"generate": {
119+
"minLength": 22
120+
}
121+
}
122+
}
123+
}
107124
}
108125
}
109126
}

playground/TestShop/TestShop.AppHost/aspire-manifest.json

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
"postgres": {
55
"type": "container.v0",
66
"connectionString": "Host={postgres.bindings.tcp.host};Port={postgres.bindings.tcp.port};Username=postgres;Password={postgres-password.value}",
7-
"image": "docker.io/library/postgres:17.0",
7+
"image": "docker.io/library/postgres:17.2",
88
"volumes": [
99
{
10-
"name": "testshop.apphost-a23213a1a9-postgres-data",
10+
"name": "testshop.apphost-48e1ce2b9b-postgres-data",
1111
"target": "/var/lib/postgresql/data",
1212
"readOnly": false
1313
}
@@ -33,16 +33,18 @@
3333
},
3434
"basketcache": {
3535
"type": "container.v0",
36-
"connectionString": "{basketcache.bindings.tcp.host}:{basketcache.bindings.tcp.port}",
36+
"connectionString": "{basketcache.bindings.tcp.host}:{basketcache.bindings.tcp.port},password={basketcache-password.value}",
3737
"image": "docker.io/library/redis:7.4",
3838
"args": [
39+
"--requirepass",
40+
"{basketcache-password.value}",
3941
"--save",
4042
"60",
4143
"1"
4244
],
4345
"volumes": [
4446
{
45-
"name": "testshop.apphost-a23213a1a9-basketcache-data",
47+
"name": "testshop.apphost-48e1ce2b9b-basketcache-data",
4648
"target": "/data",
4749
"readOnly": false
4850
}
@@ -110,7 +112,7 @@
110112
"image": "docker.io/library/rabbitmq:4.0-management",
111113
"volumes": [
112114
{
113-
"name": "testshop.apphost-a23213a1a9-messaging-data",
115+
"name": "testshop.apphost-48e1ce2b9b-messaging-data",
114116
"target": "/var/lib/rabbitmq",
115117
"readOnly": false
116118
}
@@ -240,6 +242,21 @@
240242
}
241243
}
242244
},
245+
"basketcache-password": {
246+
"type": "parameter.v0",
247+
"value": "{basketcache-password.inputs.value}",
248+
"inputs": {
249+
"value": {
250+
"type": "string",
251+
"secret": true,
252+
"default": {
253+
"generate": {
254+
"minLength": 22
255+
}
256+
}
257+
}
258+
}
259+
},
243260
"messaging-password": {
244261
"type": "parameter.v0",
245262
"value": "{messaging-password.inputs.value}",
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
#nullable enable
2+
Aspire.Hosting.ApplicationModel.RedisResource.PasswordParameter.get -> Aspire.Hosting.ApplicationModel.ParameterResource?
3+
Aspire.Hosting.ApplicationModel.RedisResource.RedisResource(string! name, Aspire.Hosting.ApplicationModel.ParameterResource! password) -> void
24
Aspire.Hosting.Redis.RedisInsightResource
35
Aspire.Hosting.Redis.RedisInsightResource.PrimaryEndpoint.get -> Aspire.Hosting.ApplicationModel.EndpointReference!
46
Aspire.Hosting.Redis.RedisInsightResource.RedisInsightResource(string! name) -> void
7+
static Aspire.Hosting.RedisBuilderExtensions.AddRedis(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, int? port = null, Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.ParameterResource!>? password = null) -> Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.RedisResource!>!
8+
static Aspire.Hosting.RedisBuilderExtensions.AddRedis(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, int? port) -> Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.RedisResource!>!
59
static Aspire.Hosting.RedisBuilderExtensions.WithDataBindMount(this Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.Redis.RedisInsightResource!>! builder, string! source) -> Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.Redis.RedisInsightResource!>!
610
static Aspire.Hosting.RedisBuilderExtensions.WithDataVolume(this Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.Redis.RedisInsightResource!>! builder, string? name = null) -> Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.Redis.RedisInsightResource!>!
711
static Aspire.Hosting.RedisBuilderExtensions.WithHostPort(this Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.Redis.RedisInsightResource!>! builder, int? port) -> Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.Redis.RedisInsightResource!>!
812
static Aspire.Hosting.RedisBuilderExtensions.WithRedisInsight(this Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.RedisResource!>! builder, System.Action<Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.Redis.RedisInsightResource!>!>? configureContainer = null, string? containerName = null) -> Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.RedisResource!>!
13+
*REMOVED*static Aspire.Hosting.RedisBuilderExtensions.AddRedis(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, int? port = null) -> Aspire.Hosting.ApplicationModel.IResourceBuilder<Aspire.Hosting.ApplicationModel.RedisResource!>!

0 commit comments

Comments
 (0)