@@ -15,72 +15,66 @@ import (
1515 "github.com/silenium-dev/docker-wrapper/pkg/client/pull"
1616 "github.com/silenium-dev/docker-wrapper/pkg/client/pull/events"
1717 "github.com/silenium-dev/docker-wrapper/pkg/client/pull/state"
18+ "go.uber.org/zap"
1819)
1920
20- func (c * Client ) ImagePullWithEvents (ctx context.Context , ref reference.Named , options image.PullOptions ) (chan events.PullEvent , error ) {
21+ func (c * Client ) ImagePullWithEvents (ctx context.Context , ref reference.Named , options image.PullOptions ) (v1.Hash , * v1.Manifest , chan events.PullEvent , error ) {
22+ if options .RegistryAuth != "" || options .PrivilegeFunc != nil {
23+ c .logger .WithOptions (zap .AddStacktrace (zap .DPanicLevel )).Warnf ("privilege function and registry auth in options are not supported, please use auth provider instead" )
24+ options .RegistryAuth = ""
25+ options .PrivilegeFunc = nil
26+ }
2127 var encodedAuth string
2228 var err error
2329 if c .authProvider != nil {
2430 c .logger .Debugf ("using configured auth provider" )
2531 encodedAuth , err = registry .EncodeAuthConfig (c .authProvider .AuthConfig (ref ))
2632 if err != nil {
27- return nil , err
33+ return v1. Hash {}, nil , nil , err
2834 }
2935 }
3036 options .RegistryAuth = encodedAuth
31- reader , err := c .Client .ImagePull (ctx , ref .String (), options )
37+
38+ imageId , manifest , err := c .getManifest (ctx , ref , options )
3239 if err != nil {
33- return nil , err
40+ return v1. Hash {}, nil , nil , err
3441 }
35- return pull .ParseStream (ctx , reader ), nil
36- }
3742
38- func (c * Client ) ImagePullWithState (ctx context.Context , ref reference.Named , options image.PullOptions ) (chan state.Pull , error ) {
39- var platform * v1.Platform
40- var err error
41- if options .Platform != "" {
42- platform , err = v1 .ParsePlatform (options .Platform )
43- if err != nil {
44- return nil , err
45- }
46- }
47- manifest , err := c .ImageGetManifest (ctx , ref , platform )
43+ reader , err := c .Client .ImagePull (ctx , ref .String (), options )
4844 if err != nil {
49- return nil , err
45+ return v1. Hash {}, nil , nil , err
5046 }
51- eventChan , err := c .ImagePullWithEvents (ctx , ref , options )
47+
48+ return imageId , manifest , pull .ParseStream (ctx , reader ), nil
49+ }
50+
51+ func (c * Client ) ImagePullWithState (ctx context.Context , ref reference.Named , options image.PullOptions ) (v1.Hash , * v1.Manifest , chan state.Pull , error ) {
52+ id , manifest , eventChan , err := c .ImagePullWithEvents (ctx , ref , options )
5253 if err != nil {
53- return nil , err
54+ return v1. Hash {}, nil , nil , err
5455 }
55- return pull .StateFromStream (ctx , ref , eventChan , manifest ), nil
56+
57+ return id , manifest , pull .StateFromStream (ctx , ref , eventChan , manifest , id ), nil
5658}
5759
5860func (c * Client ) ImagePull (ctx context.Context , ref reference.Named , options image.PullOptions ) (digest.Digest , error ) {
59- eventChan , err := c .ImagePullWithEvents (ctx , ref , options )
61+ dig , _ , eventChan , err := c .ImagePullWithEvents (ctx , ref , options )
6062 if err != nil {
6163 return "" , err
6264 }
6365
64- var digestEvent * events.Digest
65- for event := range eventChan {
66- if ev , ok := event .(* events.Digest ); digestEvent == nil && ok {
67- c .logger .Debugf ("received digest event: %s" , ev .String ())
68- digestEvent = ev
69- }
70- }
71- if digestEvent == nil {
72- return "" , fmt .Errorf ("no digest event received" )
66+ for range eventChan {
7367 }
7468
75- return digestEvent .Digest , nil
69+ return digest .Digest ( dig . String ()) , nil
7670}
7771
78- func (c * Client ) ImageGetManifest (ctx context.Context , ref reference.Named , platform * v1.Platform ) (* v1.Manifest , error ) {
72+ func (c * Client ) ImageGetManifest (ctx context.Context , ref reference.Named , platform * v1.Platform ) (v1. Hash , * v1.Manifest , error ) {
7973 var err error
8074 if platform == nil {
8175 platform , err = c .ImageDefaultPlatform (ctx )
8276 if err != nil {
83- return nil , err
77+ return v1. Hash {}, nil , err
8478 }
8579 }
8680 opts := []remote.Option {
@@ -91,14 +85,23 @@ func (c *Client) ImageGetManifest(ctx context.Context, ref reference.Named, plat
9185
9286 nameRef , err := name .ParseReference (ref .String ())
9387 if err != nil {
94- return nil , err
88+ return v1. Hash {}, nil , err
9589 }
9690
9791 img , err := remote .Image (nameRef , opts ... )
9892 if err != nil {
99- return nil , fmt .Errorf ("failed to get image manifest: %w" , err )
93+ return v1. Hash {}, nil , fmt .Errorf ("failed to get image manifest: %w" , err )
10094 }
101- return img .Manifest ()
95+ manifest , err := img .Manifest ()
96+ if err != nil {
97+ return v1.Hash {}, nil , err
98+ }
99+ id , err := img .ConfigName ()
100+ if err != nil {
101+ return v1.Hash {}, nil , err
102+ }
103+
104+ return id , manifest , nil
102105}
103106
104107func (c * Client ) ImageDefaultPlatform (ctx context.Context ) (* v1.Platform , error ) {
@@ -119,3 +122,15 @@ func (c *Client) ImageDefaultPlatform(ctx context.Context) (*v1.Platform, error)
119122 OSFeatures : normalized .OSFeatures ,
120123 }, nil
121124}
125+
126+ func (c * Client ) getManifest (ctx context.Context , ref reference.Named , options image.PullOptions ) (v1.Hash , * v1.Manifest , error ) {
127+ var platform * v1.Platform
128+ var err error
129+ if options .Platform != "" {
130+ platform , err = v1 .ParsePlatform (options .Platform )
131+ if err != nil {
132+ return v1.Hash {}, nil , err
133+ }
134+ }
135+ return c .ImageGetManifest (ctx , ref , platform )
136+ }
0 commit comments