@@ -233,6 +233,167 @@ func TestServiceConvertFromGRPCIsolation(t *testing.T) {
233
233
}
234
234
}
235
235
236
+ func TestServiceConvertToGRPCCredentialSpec (t * testing.T ) {
237
+ cases := []struct {
238
+ name string
239
+ from swarmtypes.CredentialSpec
240
+ to swarmapi.Privileges_CredentialSpec
241
+ expectedErr string
242
+ }{
243
+ {
244
+ name : "empty credential spec" ,
245
+ from : swarmtypes.CredentialSpec {},
246
+ to : swarmapi.Privileges_CredentialSpec {},
247
+ expectedErr : `invalid CredentialSpec: must either provide "file", "registry", or "config" for credential spec` ,
248
+ },
249
+ {
250
+ name : "config and file credential spec" ,
251
+ from : swarmtypes.CredentialSpec {
252
+ Config : "0bt9dmxjvjiqermk6xrop3ekq" ,
253
+ File : "spec.json" ,
254
+ },
255
+ to : swarmapi.Privileges_CredentialSpec {},
256
+ expectedErr : `invalid CredentialSpec: cannot specify both "config" and "file" credential specs` ,
257
+ },
258
+ {
259
+ name : "config and registry credential spec" ,
260
+ from : swarmtypes.CredentialSpec {
261
+ Config : "0bt9dmxjvjiqermk6xrop3ekq" ,
262
+ Registry : "testing" ,
263
+ },
264
+ to : swarmapi.Privileges_CredentialSpec {},
265
+ expectedErr : `invalid CredentialSpec: cannot specify both "config" and "registry" credential specs` ,
266
+ },
267
+ {
268
+ name : "file and registry credential spec" ,
269
+ from : swarmtypes.CredentialSpec {
270
+ File : "spec.json" ,
271
+ Registry : "testing" ,
272
+ },
273
+ to : swarmapi.Privileges_CredentialSpec {},
274
+ expectedErr : `invalid CredentialSpec: cannot specify both "file" and "registry" credential specs` ,
275
+ },
276
+ {
277
+ name : "config and file and registry credential spec" ,
278
+ from : swarmtypes.CredentialSpec {
279
+ Config : "0bt9dmxjvjiqermk6xrop3ekq" ,
280
+ File : "spec.json" ,
281
+ Registry : "testing" ,
282
+ },
283
+ to : swarmapi.Privileges_CredentialSpec {},
284
+ expectedErr : `invalid CredentialSpec: cannot specify both "config", "file", and "registry" credential specs` ,
285
+ },
286
+ {
287
+ name : "config credential spec" ,
288
+ from : swarmtypes.CredentialSpec {Config : "0bt9dmxjvjiqermk6xrop3ekq" },
289
+ to : swarmapi.Privileges_CredentialSpec {
290
+ Source : & swarmapi.Privileges_CredentialSpec_Config {Config : "0bt9dmxjvjiqermk6xrop3ekq" },
291
+ },
292
+ },
293
+ {
294
+ name : "file credential spec" ,
295
+ from : swarmtypes.CredentialSpec {File : "foo.json" },
296
+ to : swarmapi.Privileges_CredentialSpec {
297
+ Source : & swarmapi.Privileges_CredentialSpec_File {File : "foo.json" },
298
+ },
299
+ },
300
+ {
301
+ name : "registry credential spec" ,
302
+ from : swarmtypes.CredentialSpec {Registry : "testing" },
303
+ to : swarmapi.Privileges_CredentialSpec {
304
+ Source : & swarmapi.Privileges_CredentialSpec_Registry {Registry : "testing" },
305
+ },
306
+ },
307
+ }
308
+
309
+ for _ , c := range cases {
310
+ c := c
311
+ t .Run (c .name , func (t * testing.T ) {
312
+ s := swarmtypes.ServiceSpec {
313
+ TaskTemplate : swarmtypes.TaskSpec {
314
+ ContainerSpec : & swarmtypes.ContainerSpec {
315
+ Privileges : & swarmtypes.Privileges {
316
+ CredentialSpec : & c .from ,
317
+ },
318
+ },
319
+ },
320
+ }
321
+
322
+ res , err := ServiceSpecToGRPC (s )
323
+ if c .expectedErr != "" {
324
+ assert .Error (t , err , c .expectedErr )
325
+ return
326
+ }
327
+
328
+ assert .NilError (t , err )
329
+ v , ok := res .Task .Runtime .(* swarmapi.TaskSpec_Container )
330
+ if ! ok {
331
+ t .Fatal ("expected type swarmapi.TaskSpec_Container" )
332
+ }
333
+ assert .DeepEqual (t , c .to , * v .Container .Privileges .CredentialSpec )
334
+ })
335
+ }
336
+ }
337
+
338
+ func TestServiceConvertFromGRPCCredentialSpec (t * testing.T ) {
339
+ cases := []struct {
340
+ name string
341
+ from swarmapi.Privileges_CredentialSpec
342
+ to * swarmtypes.CredentialSpec
343
+ }{
344
+ {
345
+ name : "empty credential spec" ,
346
+ from : swarmapi.Privileges_CredentialSpec {},
347
+ to : & swarmtypes.CredentialSpec {},
348
+ },
349
+ {
350
+ name : "config credential spec" ,
351
+ from : swarmapi.Privileges_CredentialSpec {
352
+ Source : & swarmapi.Privileges_CredentialSpec_Config {Config : "0bt9dmxjvjiqermk6xrop3ekq" },
353
+ },
354
+ to : & swarmtypes.CredentialSpec {Config : "0bt9dmxjvjiqermk6xrop3ekq" },
355
+ },
356
+ {
357
+ name : "file credential spec" ,
358
+ from : swarmapi.Privileges_CredentialSpec {
359
+ Source : & swarmapi.Privileges_CredentialSpec_File {File : "foo.json" },
360
+ },
361
+ to : & swarmtypes.CredentialSpec {File : "foo.json" },
362
+ },
363
+ {
364
+ name : "registry credential spec" ,
365
+ from : swarmapi.Privileges_CredentialSpec {
366
+ Source : & swarmapi.Privileges_CredentialSpec_Registry {Registry : "testing" },
367
+ },
368
+ to : & swarmtypes.CredentialSpec {Registry : "testing" },
369
+ },
370
+ }
371
+
372
+ for _ , tc := range cases {
373
+ tc := tc
374
+
375
+ t .Run (tc .name , func (t * testing.T ) {
376
+ gs := swarmapi.Service {
377
+ Spec : swarmapi.ServiceSpec {
378
+ Task : swarmapi.TaskSpec {
379
+ Runtime : & swarmapi.TaskSpec_Container {
380
+ Container : & swarmapi.ContainerSpec {
381
+ Privileges : & swarmapi.Privileges {
382
+ CredentialSpec : & tc .from ,
383
+ },
384
+ },
385
+ },
386
+ },
387
+ },
388
+ }
389
+
390
+ svc , err := ServiceFromGRPC (gs )
391
+ assert .NilError (t , err )
392
+ assert .DeepEqual (t , svc .Spec .TaskTemplate .ContainerSpec .Privileges .CredentialSpec , tc .to )
393
+ })
394
+ }
395
+ }
396
+
236
397
func TestServiceConvertToGRPCNetworkAtachmentRuntime (t * testing.T ) {
237
398
someid := "asfjkl"
238
399
s := swarmtypes.ServiceSpec {
0 commit comments