@@ -101,7 +101,17 @@ func getCallingFunction() string {
101101 return fullName [strings .LastIndex (fullName , "." )+ 1 :]
102102}
103103
104- // All methods and functions which need to be overridden for dry run.
104+ // errDryRunForbidden refuses a mutating operation compose itself never
105+ // issues: delegating it would let future code mutate the engine under
106+ // --dry-run silently. The full classification of every APIClient method
107+ // (read-only delegated / faked / refused) is pinned by
108+ // TestDryRunClientClassifiesEveryMethod.
109+ func errDryRunForbidden (operation string ) error {
110+ return fmt .Errorf ("%s is not allowed in dry-run mode" , operation )
111+ }
112+
113+ // Methods below either fake the operation for dry-run or delegate the
114+ // read-only ones to the real client.
105115
106116func (d * DryRunClient ) ContainerAttach (ctx context.Context , container string , options client.ContainerAttachOptions ) (client.ContainerAttachResult , error ) {
107117 return client.ContainerAttachResult {}, errors .New ("interactive run is not supported in dry-run mode" )
@@ -330,19 +340,22 @@ func (d *DryRunClient) ConfigInspect(ctx context.Context, name string, options c
330340}
331341
332342func (d * DryRunClient ) ConfigCreate (ctx context.Context , options client.ConfigCreateOptions ) (client.ConfigCreateResult , error ) {
333- return d .apiClient .ConfigCreate (ctx , options )
343+ var zero client.ConfigCreateResult
344+ return zero , errDryRunForbidden ("ConfigCreate" )
334345}
335346
336347func (d * DryRunClient ) ConfigRemove (ctx context.Context , id string , options client.ConfigRemoveOptions ) (client.ConfigRemoveResult , error ) {
337- return d .apiClient .ConfigRemove (ctx , id , options )
348+ var zero client.ConfigRemoveResult
349+ return zero , errDryRunForbidden ("ConfigRemove" )
338350}
339351
340352func (d * DryRunClient ) ConfigUpdate (ctx context.Context , id string , options client.ConfigUpdateOptions ) (client.ConfigUpdateResult , error ) {
341- return d .apiClient .ConfigUpdate (ctx , id , options )
353+ var zero client.ConfigUpdateResult
354+ return zero , errDryRunForbidden ("ConfigUpdate" )
342355}
343356
344357func (d * DryRunClient ) ContainerCommit (ctx context.Context , container string , options client.ContainerCommitOptions ) (client.ContainerCommitResult , error ) {
345- return d . apiClient . ContainerCommit ( ctx , container , options )
358+ return client. ContainerCommitResult { ID : "dryRunId" }, nil
346359}
347360
348361func (d * DryRunClient ) ContainerDiff (ctx context.Context , container string , options client.ContainerDiffOptions ) (client.ContainerDiffResult , error ) {
@@ -358,7 +371,8 @@ func (d *DryRunClient) ExecInspect(ctx context.Context, execID string, options c
358371}
359372
360373func (d * DryRunClient ) ExecResize (ctx context.Context , execID string , options client.ExecResizeOptions ) (client.ExecResizeResult , error ) {
361- return d .apiClient .ExecResize (ctx , execID , options )
374+ var zero client.ExecResizeResult
375+ return zero , errDryRunForbidden ("ExecResize" )
362376}
363377
364378func (d * DryRunClient ) ContainerExport (ctx context.Context , container string , options client.ContainerExportOptions ) (client.ContainerExportResult , error ) {
@@ -370,7 +384,8 @@ func (d *DryRunClient) ContainerLogs(ctx context.Context, container string, opti
370384}
371385
372386func (d * DryRunClient ) ContainerResize (ctx context.Context , container string , options client.ContainerResizeOptions ) (client.ContainerResizeResult , error ) {
373- return d .apiClient .ContainerResize (ctx , container , options )
387+ var zero client.ContainerResizeResult
388+ return zero , errDryRunForbidden ("ContainerResize" )
374389}
375390
376391func (d * DryRunClient ) ContainerStatPath (ctx context.Context , container string , options client.ContainerStatPathOptions ) (client.ContainerStatPathResult , error ) {
@@ -386,27 +401,31 @@ func (d *DryRunClient) ContainerTop(ctx context.Context, container string, optio
386401}
387402
388403func (d * DryRunClient ) ContainerUpdate (ctx context.Context , container string , options client.ContainerUpdateOptions ) (client.ContainerUpdateResult , error ) {
389- return d .apiClient .ContainerUpdate (ctx , container , options )
404+ var zero client.ContainerUpdateResult
405+ return zero , errDryRunForbidden ("ContainerUpdate" )
390406}
391407
392408func (d * DryRunClient ) ContainerWait (ctx context.Context , container string , options client.ContainerWaitOptions ) client.ContainerWaitResult {
393409 return d .apiClient .ContainerWait (ctx , container , options )
394410}
395411
396412func (d * DryRunClient ) ContainerPrune (ctx context.Context , options client.ContainerPruneOptions ) (client.ContainerPruneResult , error ) {
397- return d .apiClient .ContainerPrune (ctx , options )
413+ var zero client.ContainerPruneResult
414+ return zero , errDryRunForbidden ("ContainerPrune" )
398415}
399416
400417func (d * DryRunClient ) DistributionInspect (ctx context.Context , imageName string , options client.DistributionInspectOptions ) (client.DistributionInspectResult , error ) {
401418 return d .apiClient .DistributionInspect (ctx , imageName , options )
402419}
403420
404421func (d * DryRunClient ) BuildCachePrune (ctx context.Context , opts client.BuildCachePruneOptions ) (client.BuildCachePruneResult , error ) {
405- return d .apiClient .BuildCachePrune (ctx , opts )
422+ var zero client.BuildCachePruneResult
423+ return zero , errDryRunForbidden ("BuildCachePrune" )
406424}
407425
408426func (d * DryRunClient ) BuildCancel (ctx context.Context , id string , opts client.BuildCancelOptions ) (client.BuildCancelResult , error ) {
409- return d .apiClient .BuildCancel (ctx , id , opts )
427+ var zero client.BuildCancelResult
428+ return zero , errDryRunForbidden ("BuildCancel" )
410429}
411430
412431func (d * DryRunClient ) ImageHistory (ctx context.Context , imageName string , options ... client.ImageHistoryOption ) (client.ImageHistoryResult , error ) {
@@ -418,15 +437,17 @@ func (d *DryRunClient) ImageAttestations(ctx context.Context, imageName string,
418437}
419438
420439func (d * DryRunClient ) ImageImport (ctx context.Context , source client.ImageImportSource , ref string , options client.ImageImportOptions ) (client.ImageImportResult , error ) {
421- return d .apiClient .ImageImport (ctx , source , ref , options )
440+ var zero client.ImageImportResult
441+ return zero , errDryRunForbidden ("ImageImport" )
422442}
423443
424444func (d * DryRunClient ) ImageList (ctx context.Context , options client.ImageListOptions ) (client.ImageListResult , error ) {
425445 return d .apiClient .ImageList (ctx , options )
426446}
427447
428448func (d * DryRunClient ) ImageLoad (ctx context.Context , input io.Reader , options ... client.ImageLoadOption ) (client.ImageLoadResult , error ) {
429- return d .apiClient .ImageLoad (ctx , input , options ... )
449+ var zero client.ImageLoadResult
450+ return zero , errDryRunForbidden ("ImageLoad" )
430451}
431452
432453func (d * DryRunClient ) ImageSearch (ctx context.Context , term string , options client.ImageSearchOptions ) (client.ImageSearchResult , error ) {
@@ -438,11 +459,13 @@ func (d *DryRunClient) ImageSave(ctx context.Context, images []string, options .
438459}
439460
440461func (d * DryRunClient ) ImageTag (ctx context.Context , options client.ImageTagOptions ) (client.ImageTagResult , error ) {
441- return d .apiClient .ImageTag (ctx , options )
462+ var zero client.ImageTagResult
463+ return zero , errDryRunForbidden ("ImageTag" )
442464}
443465
444466func (d * DryRunClient ) ImagePrune (ctx context.Context , options client.ImagePruneOptions ) (client.ImagePruneResult , error ) {
445- return d .apiClient .ImagePrune (ctx , options )
467+ var zero client.ImagePruneResult
468+ return zero , errDryRunForbidden ("ImagePrune" )
446469}
447470
448471func (d * DryRunClient ) NodeInspect (ctx context.Context , nodeID string , options client.NodeInspectOptions ) (client.NodeInspectResult , error ) {
@@ -454,11 +477,13 @@ func (d *DryRunClient) NodeList(ctx context.Context, options client.NodeListOpti
454477}
455478
456479func (d * DryRunClient ) NodeRemove (ctx context.Context , nodeID string , options client.NodeRemoveOptions ) (client.NodeRemoveResult , error ) {
457- return d .apiClient .NodeRemove (ctx , nodeID , options )
480+ var zero client.NodeRemoveResult
481+ return zero , errDryRunForbidden ("NodeRemove" )
458482}
459483
460484func (d * DryRunClient ) NodeUpdate (ctx context.Context , nodeID string , options client.NodeUpdateOptions ) (client.NodeUpdateResult , error ) {
461- return d .apiClient .NodeUpdate (ctx , nodeID , options )
485+ var zero client.NodeUpdateResult
486+ return zero , errDryRunForbidden ("NodeUpdate" )
462487}
463488
464489func (d * DryRunClient ) NetworkInspect (ctx context.Context , networkName string , options client.NetworkInspectOptions ) (client.NetworkInspectResult , error ) {
@@ -470,51 +495,61 @@ func (d *DryRunClient) NetworkList(ctx context.Context, options client.NetworkLi
470495}
471496
472497func (d * DryRunClient ) NetworkPrune (ctx context.Context , options client.NetworkPruneOptions ) (client.NetworkPruneResult , error ) {
473- return d .apiClient .NetworkPrune (ctx , options )
498+ var zero client.NetworkPruneResult
499+ return zero , errDryRunForbidden ("NetworkPrune" )
474500}
475501
476502func (d * DryRunClient ) PluginList (ctx context.Context , options client.PluginListOptions ) (client.PluginListResult , error ) {
477503 return d .apiClient .PluginList (ctx , options )
478504}
479505
480506func (d * DryRunClient ) PluginRemove (ctx context.Context , name string , options client.PluginRemoveOptions ) (client.PluginRemoveResult , error ) {
481- return d .apiClient .PluginRemove (ctx , name , options )
507+ var zero client.PluginRemoveResult
508+ return zero , errDryRunForbidden ("PluginRemove" )
482509}
483510
484511func (d * DryRunClient ) PluginEnable (ctx context.Context , name string , options client.PluginEnableOptions ) (client.PluginEnableResult , error ) {
485- return d .apiClient .PluginEnable (ctx , name , options )
512+ var zero client.PluginEnableResult
513+ return zero , errDryRunForbidden ("PluginEnable" )
486514}
487515
488516func (d * DryRunClient ) PluginDisable (ctx context.Context , name string , options client.PluginDisableOptions ) (client.PluginDisableResult , error ) {
489- return d .apiClient .PluginDisable (ctx , name , options )
517+ var zero client.PluginDisableResult
518+ return zero , errDryRunForbidden ("PluginDisable" )
490519}
491520
492521func (d * DryRunClient ) PluginInstall (ctx context.Context , name string , options client.PluginInstallOptions ) (client.PluginInstallResult , error ) {
493- return d .apiClient .PluginInstall (ctx , name , options )
522+ var zero client.PluginInstallResult
523+ return zero , errDryRunForbidden ("PluginInstall" )
494524}
495525
496526func (d * DryRunClient ) PluginUpgrade (ctx context.Context , name string , options client.PluginUpgradeOptions ) (client.PluginUpgradeResult , error ) {
497- return d .apiClient .PluginUpgrade (ctx , name , options )
527+ var zero client.PluginUpgradeResult
528+ return zero , errDryRunForbidden ("PluginUpgrade" )
498529}
499530
500531func (d * DryRunClient ) PluginPush (ctx context.Context , name string , options client.PluginPushOptions ) (client.PluginPushResult , error ) {
501- return d .apiClient .PluginPush (ctx , name , options )
532+ var zero client.PluginPushResult
533+ return zero , errDryRunForbidden ("PluginPush" )
502534}
503535
504536func (d * DryRunClient ) PluginSet (ctx context.Context , name string , options client.PluginSetOptions ) (client.PluginSetResult , error ) {
505- return d .apiClient .PluginSet (ctx , name , options )
537+ var zero client.PluginSetResult
538+ return zero , errDryRunForbidden ("PluginSet" )
506539}
507540
508541func (d * DryRunClient ) PluginInspect (ctx context.Context , name string , options client.PluginInspectOptions ) (client.PluginInspectResult , error ) {
509542 return d .apiClient .PluginInspect (ctx , name , options )
510543}
511544
512545func (d * DryRunClient ) PluginCreate (ctx context.Context , createContext io.Reader , options client.PluginCreateOptions ) (client.PluginCreateResult , error ) {
513- return d .apiClient .PluginCreate (ctx , createContext , options )
546+ var zero client.PluginCreateResult
547+ return zero , errDryRunForbidden ("PluginCreate" )
514548}
515549
516550func (d * DryRunClient ) ServiceCreate (ctx context.Context , options client.ServiceCreateOptions ) (client.ServiceCreateResult , error ) {
517- return d .apiClient .ServiceCreate (ctx , options )
551+ var zero client.ServiceCreateResult
552+ return zero , errDryRunForbidden ("ServiceCreate" )
518553}
519554
520555func (d * DryRunClient ) ServiceInspect (ctx context.Context , serviceID string , options client.ServiceInspectOptions ) (client.ServiceInspectResult , error ) {
@@ -526,11 +561,13 @@ func (d *DryRunClient) ServiceList(ctx context.Context, options client.ServiceLi
526561}
527562
528563func (d * DryRunClient ) ServiceRemove (ctx context.Context , serviceID string , options client.ServiceRemoveOptions ) (client.ServiceRemoveResult , error ) {
529- return d .apiClient .ServiceRemove (ctx , serviceID , options )
564+ var zero client.ServiceRemoveResult
565+ return zero , errDryRunForbidden ("ServiceRemove" )
530566}
531567
532568func (d * DryRunClient ) ServiceUpdate (ctx context.Context , serviceID string , options client.ServiceUpdateOptions ) (client.ServiceUpdateResult , error ) {
533- return d .apiClient .ServiceUpdate (ctx , serviceID , options )
569+ var zero client.ServiceUpdateResult
570+ return zero , errDryRunForbidden ("ServiceUpdate" )
534571}
535572
536573func (d * DryRunClient ) ServiceLogs (ctx context.Context , serviceID string , options client.ServiceLogsOptions ) (client.ServiceLogsResult , error ) {
@@ -550,51 +587,59 @@ func (d *DryRunClient) TaskList(ctx context.Context, options client.TaskListOpti
550587}
551588
552589func (d * DryRunClient ) SwarmInit (ctx context.Context , options client.SwarmInitOptions ) (client.SwarmInitResult , error ) {
553- return d .apiClient .SwarmInit (ctx , options )
590+ var zero client.SwarmInitResult
591+ return zero , errDryRunForbidden ("SwarmInit" )
554592}
555593
556594func (d * DryRunClient ) SwarmJoin (ctx context.Context , options client.SwarmJoinOptions ) (client.SwarmJoinResult , error ) {
557- return d .apiClient .SwarmJoin (ctx , options )
595+ var zero client.SwarmJoinResult
596+ return zero , errDryRunForbidden ("SwarmJoin" )
558597}
559598
560599func (d * DryRunClient ) SwarmGetUnlockKey (ctx context.Context ) (client.SwarmGetUnlockKeyResult , error ) {
561600 return d .apiClient .SwarmGetUnlockKey (ctx )
562601}
563602
564603func (d * DryRunClient ) SwarmUnlock (ctx context.Context , options client.SwarmUnlockOptions ) (client.SwarmUnlockResult , error ) {
565- return d .apiClient .SwarmUnlock (ctx , options )
604+ var zero client.SwarmUnlockResult
605+ return zero , errDryRunForbidden ("SwarmUnlock" )
566606}
567607
568608func (d * DryRunClient ) SwarmLeave (ctx context.Context , options client.SwarmLeaveOptions ) (client.SwarmLeaveResult , error ) {
569- return d .apiClient .SwarmLeave (ctx , options )
609+ var zero client.SwarmLeaveResult
610+ return zero , errDryRunForbidden ("SwarmLeave" )
570611}
571612
572613func (d * DryRunClient ) SwarmInspect (ctx context.Context , options client.SwarmInspectOptions ) (client.SwarmInspectResult , error ) {
573614 return d .apiClient .SwarmInspect (ctx , options )
574615}
575616
576617func (d * DryRunClient ) SwarmUpdate (ctx context.Context , options client.SwarmUpdateOptions ) (client.SwarmUpdateResult , error ) {
577- return d .apiClient .SwarmUpdate (ctx , options )
618+ var zero client.SwarmUpdateResult
619+ return zero , errDryRunForbidden ("SwarmUpdate" )
578620}
579621
580622func (d * DryRunClient ) SecretList (ctx context.Context , options client.SecretListOptions ) (client.SecretListResult , error ) {
581623 return d .apiClient .SecretList (ctx , options )
582624}
583625
584626func (d * DryRunClient ) SecretCreate (ctx context.Context , options client.SecretCreateOptions ) (client.SecretCreateResult , error ) {
585- return d .apiClient .SecretCreate (ctx , options )
627+ var zero client.SecretCreateResult
628+ return zero , errDryRunForbidden ("SecretCreate" )
586629}
587630
588631func (d * DryRunClient ) SecretRemove (ctx context.Context , id string , options client.SecretRemoveOptions ) (client.SecretRemoveResult , error ) {
589- return d .apiClient .SecretRemove (ctx , id , options )
632+ var zero client.SecretRemoveResult
633+ return zero , errDryRunForbidden ("SecretRemove" )
590634}
591635
592636func (d * DryRunClient ) SecretInspect (ctx context.Context , name string , options client.SecretInspectOptions ) (client.SecretInspectResult , error ) {
593637 return d .apiClient .SecretInspect (ctx , name , options )
594638}
595639
596640func (d * DryRunClient ) SecretUpdate (ctx context.Context , id string , options client.SecretUpdateOptions ) (client.SecretUpdateResult , error ) {
597- return d .apiClient .SecretUpdate (ctx , id , options )
641+ var zero client.SecretUpdateResult
642+ return zero , errDryRunForbidden ("SecretUpdate" )
598643}
599644
600645func (d * DryRunClient ) Events (ctx context.Context , options client.EventsListOptions ) client.EventsResult {
@@ -626,11 +671,13 @@ func (d *DryRunClient) VolumeList(ctx context.Context, opts client.VolumeListOpt
626671}
627672
628673func (d * DryRunClient ) VolumePrune (ctx context.Context , options client.VolumePruneOptions ) (client.VolumePruneResult , error ) {
629- return d .apiClient .VolumePrune (ctx , options )
674+ var zero client.VolumePruneResult
675+ return zero , errDryRunForbidden ("VolumePrune" )
630676}
631677
632678func (d * DryRunClient ) VolumeUpdate (ctx context.Context , volumeID string , options client.VolumeUpdateOptions ) (client.VolumeUpdateResult , error ) {
633- return d .apiClient .VolumeUpdate (ctx , volumeID , options )
679+ var zero client.VolumeUpdateResult
680+ return zero , errDryRunForbidden ("VolumeUpdate" )
634681}
635682
636683func (d * DryRunClient ) ClientVersion () string {
@@ -658,11 +705,13 @@ func (d *DryRunClient) Close() error {
658705}
659706
660707func (d * DryRunClient ) CheckpointCreate (ctx context.Context , container string , options client.CheckpointCreateOptions ) (client.CheckpointCreateResult , error ) {
661- return d .apiClient .CheckpointCreate (ctx , container , options )
708+ var zero client.CheckpointCreateResult
709+ return zero , errDryRunForbidden ("CheckpointCreate" )
662710}
663711
664712func (d * DryRunClient ) CheckpointRemove (ctx context.Context , container string , options client.CheckpointRemoveOptions ) (client.CheckpointRemoveResult , error ) {
665- return d .apiClient .CheckpointRemove (ctx , container , options )
713+ var zero client.CheckpointRemoveResult
714+ return zero , errDryRunForbidden ("CheckpointRemove" )
666715}
667716
668717func (d * DryRunClient ) CheckpointList (ctx context.Context , container string , options client.CheckpointListOptions ) (client.CheckpointListResult , error ) {
0 commit comments