@@ -51,30 +51,184 @@ public async Task StorageGetsCreatedAndUsable()
51
51
52
52
var minioClient = host . Services . GetRequiredService < IMinioClient > ( ) ;
53
53
54
- var bucketName = "somebucket" ;
54
+ await TestApi ( minioClient ) ;
55
+ }
56
+
57
+ [ Theory ]
58
+ [ InlineData ( true ) ]
59
+ [ InlineData ( false ) ]
60
+ public async Task WithDataShouldPersistStateBetweenUsages ( bool useVolume )
61
+ {
62
+ string ? volumeName = null ;
63
+ string ? bindMountPath = null ;
64
+
65
+ try
66
+ {
67
+ using var builder1 = TestDistributedApplicationBuilder . Create ( testOutputHelper ) ;
68
+
69
+ var rootUser = "minioadmin" ;
70
+ var port = 9000 ;
71
+
72
+ var passwordParameter = ParameterResourceBuilderExtensions . CreateDefaultPasswordParameter ( builder1 ,
73
+ $ "rootPassword") ;
74
+ builder1 . Configuration [ "Parameters:rootPassword" ] = passwordParameter . Value ;
75
+ var rootPasswordParameter = builder1 . AddParameter ( passwordParameter . Name ) ;
76
+
77
+ var minio = builder1 . AddMinioContainer ( "minio" ,
78
+ builder1 . AddParameter ( "username" , rootUser ) ,
79
+ rootPasswordParameter ,
80
+ minioPort : port ) ;
81
+
82
+ if ( useVolume )
83
+ {
84
+ // Use a deterministic volume name to prevent them from exhausting the machines if deletion fails
85
+ volumeName = VolumeNameGenerator . Generate ( minio , nameof ( WithDataShouldPersistStateBetweenUsages ) ) ;
86
+
87
+ // if the volume already exists (because of a crashing previous run), delete it
88
+ DockerUtils . AttemptDeleteDockerVolume ( volumeName , throwOnFailure : true ) ;
89
+ minio . WithDataVolume ( volumeName ) ;
90
+ }
91
+ else
92
+ {
93
+ bindMountPath = Directory . CreateTempSubdirectory ( ) . FullName ;
94
+ minio . WithDataBindMount ( bindMountPath ) ;
95
+ }
96
+
97
+ using ( var app = builder1 . Build ( ) )
98
+ {
99
+ await app . StartAsync ( ) ;
100
+
101
+ var rns = app . Services . GetRequiredService < ResourceNotificationService > ( ) ;
102
+
103
+ await rns . WaitForResourceHealthyAsync ( minio . Resource . Name ) ;
104
+
105
+ try
106
+ {
107
+ var webApplicationBuilder = Host . CreateApplicationBuilder ( ) ;
55
108
56
- var mbArgs = new MakeBucketArgs ( )
57
- . WithBucket ( bucketName ) ;
58
- await minioClient . MakeBucketAsync ( mbArgs ) ;
109
+ webApplicationBuilder . Services . AddMinio ( configureClient => configureClient
110
+ . WithEndpoint ( "localhost" , port )
111
+ . WithCredentials ( rootUser , passwordParameter . Value )
112
+ . WithSSL ( false )
113
+ . Build ( ) ) ;
114
+
115
+ using var host = webApplicationBuilder . Build ( ) ;
116
+
117
+ await host . StartAsync ( ) ;
118
+
119
+ var minioClient = host . Services . GetRequiredService < IMinioClient > ( ) ;
120
+ await TestApi ( minioClient ) ;
121
+ }
122
+ finally
123
+ {
124
+ // Stops the container, or the Volume would still be in use
125
+ await app . StopAsync ( ) ;
126
+ }
127
+ }
128
+
129
+ using var builder2 = TestDistributedApplicationBuilder . Create ( testOutputHelper ) ;
130
+ builder2 . Configuration [ "Parameters:rootPassword" ] = passwordParameter . Value ;
131
+ var rootPasswordParameter2 = builder2 . AddParameter ( passwordParameter . Name ) ;
132
+
133
+
134
+ var minio2 = builder2 . AddMinioContainer ( "minio" ,
135
+ builder2 . AddParameter ( "username" , rootUser ) ,
136
+ rootPasswordParameter2 ,
137
+ minioPort : port ) ;
59
138
60
- var res = await minioClient . ListBucketsAsync ( ) ;
139
+ if ( useVolume )
140
+ {
141
+ minio2 . WithDataVolume ( volumeName ) ;
142
+ }
143
+ else
144
+ {
145
+ minio2 . WithDataBindMount ( bindMountPath ! ) ;
146
+ }
61
147
62
- Assert . NotEmpty ( res . Buckets ) ;
148
+ using ( var app = builder2 . Build ( ) )
149
+ {
150
+ await app . StartAsync ( ) ;
63
151
64
- var bytearr = "Hey, I'm using minio client! It's awesome!"u8 . ToArray ( ) ;
65
- var stream = new MemoryStream ( bytearr ) ;
152
+ var rns = app . Services . GetRequiredService < ResourceNotificationService > ( ) ;
66
153
67
- var objectName = "someobj" ;
68
- var contentType = "text/plain" ;
154
+ await rns . WaitForResourceHealthyAsync ( minio . Resource . Name ) ;
155
+
156
+
157
+ try
158
+ {
159
+ var webApplicationBuilder = Host . CreateApplicationBuilder ( ) ;
69
160
70
- var putObjectArgs = new PutObjectArgs ( )
71
- . WithBucket ( bucketName )
72
- . WithObject ( objectName )
73
- . WithStreamData ( stream )
74
- . WithObjectSize ( stream . Length )
75
- . WithContentType ( contentType ) ;
161
+ webApplicationBuilder . Services . AddMinio ( configureClient => configureClient
162
+ . WithEndpoint ( "localhost" , port )
163
+ . WithCredentials ( rootUser , passwordParameter . Value )
164
+ . WithSSL ( false )
165
+ . Build ( ) ) ;
166
+
167
+ using var host = webApplicationBuilder . Build ( ) ;
168
+
169
+ await host . StartAsync ( ) ;
170
+
171
+ var minioClient = host . Services . GetRequiredService < IMinioClient > ( ) ;
172
+ await TestApi ( minioClient , isDataPreGenerated : false ) ;
173
+ }
174
+ finally
175
+ {
176
+ // Stops the container, or the Volume would still be in use
177
+ await app . StopAsync ( ) ;
178
+ }
179
+ }
180
+
181
+ }
182
+ finally
183
+ {
184
+ if ( volumeName is not null )
185
+ {
186
+ DockerUtils . AttemptDeleteDockerVolume ( volumeName ) ;
187
+ }
188
+
189
+ if ( bindMountPath is not null )
190
+ {
191
+ try
192
+ {
193
+ Directory . Delete ( bindMountPath , recursive : true ) ;
194
+ }
195
+ catch
196
+ {
197
+ // Don't fail test if we can't clean the temporary folder
198
+ }
199
+ }
200
+ }
201
+ }
202
+
203
+ private static async Task TestApi ( IMinioClient minioClient , bool isDataPreGenerated = true )
204
+ {
205
+ const string bucketName = "somebucket" ;
206
+
207
+ const string objectName = "someobj" ;
208
+ const string contentType = "text/plain" ;
209
+
210
+ if ( isDataPreGenerated )
211
+ {
212
+ var mbArgs = new MakeBucketArgs ( )
213
+ . WithBucket ( bucketName ) ;
214
+ await minioClient . MakeBucketAsync ( mbArgs ) ;
215
+
216
+ var res = await minioClient . ListBucketsAsync ( ) ;
217
+
218
+ Assert . NotEmpty ( res . Buckets ) ;
219
+
220
+ var bytearr = "Hey, I'm using minio client! It's awesome!"u8 . ToArray ( ) ;
221
+ var stream = new MemoryStream ( bytearr ) ;
222
+
223
+ var putObjectArgs = new PutObjectArgs ( )
224
+ . WithBucket ( bucketName )
225
+ . WithObject ( objectName )
226
+ . WithStreamData ( stream )
227
+ . WithObjectSize ( stream . Length )
228
+ . WithContentType ( contentType ) ;
76
229
77
- await minioClient . PutObjectAsync ( putObjectArgs ) ;
230
+ await minioClient . PutObjectAsync ( putObjectArgs ) ;
231
+ }
78
232
79
233
var statObject = new StatObjectArgs ( )
80
234
. WithBucket ( bucketName )
0 commit comments