@@ -87,13 +87,15 @@ func New(address string, opts ...ClientOpt) (*Client, error) {
8787 if copts .timeout == 0 {
8888 copts .timeout = 10 * time .Second
8989 }
90- rt := fmt .Sprintf ("%s.%s" , plugin .RuntimePlugin , runtime .GOOS )
90+
91+ c := & Client {}
92+
9193 if copts .defaultRuntime != "" {
92- rt = copts .defaultRuntime
93- }
94- c := & Client {
95- runtime : rt ,
94+ c .runtime = copts .defaultRuntime
95+ } else {
96+ c .runtime = fmt .Sprintf ("%s.%s" , plugin .RuntimePlugin , runtime .GOOS )
9697 }
98+
9799 if copts .services != nil {
98100 c .services = * copts .services
99101 }
@@ -140,14 +142,11 @@ func New(address string, opts ...ClientOpt) (*Client, error) {
140142
141143 // check namespace labels for default runtime
142144 if copts .defaultRuntime == "" && copts .defaultns != "" {
143- namespaces := c .NamespaceService ()
144- ctx := context .Background ()
145- if labels , err := namespaces .Labels (ctx , copts .defaultns ); err == nil {
146- if defaultRuntime , ok := labels [defaults .DefaultRuntimeNSLabel ]; ok {
147- c .runtime = defaultRuntime
148- }
149- } else {
145+ ctx := namespaces .WithNamespace (context .Background (), copts .defaultns )
146+ if label , err := c .GetLabel (ctx , defaults .DefaultRuntimeNSLabel ); err != nil {
150147 return nil , err
148+ } else if label != "" {
149+ c .runtime = label
151150 }
152151 }
153152
@@ -170,14 +169,11 @@ func NewWithConn(conn *grpc.ClientConn, opts ...ClientOpt) (*Client, error) {
170169
171170 // check namespace labels for default runtime
172171 if copts .defaultRuntime == "" && copts .defaultns != "" {
173- namespaces := c .NamespaceService ()
174- ctx := context .Background ()
175- if labels , err := namespaces .Labels (ctx , copts .defaultns ); err == nil {
176- if defaultRuntime , ok := labels [defaults .DefaultRuntimeNSLabel ]; ok {
177- c .runtime = defaultRuntime
178- }
179- } else {
172+ ctx := namespaces .WithNamespace (context .Background (), copts .defaultns )
173+ if label , err := c .GetLabel (ctx , defaults .DefaultRuntimeNSLabel ); err != nil {
180174 return nil , err
175+ } else if label != "" {
176+ c .runtime = label
181177 }
182178 }
183179
@@ -340,7 +336,6 @@ func defaultRemoteContext() *RemoteContext {
340336 Resolver : docker .NewResolver (docker.ResolverOptions {
341337 Client : http .DefaultClient ,
342338 }),
343- Snapshotter : DefaultSnapshotter ,
344339 }
345340}
346341
@@ -491,6 +486,24 @@ func writeIndex(ctx context.Context, index *ocispec.Index, client *Client, ref s
491486 return writeContent (ctx , client .ContentStore (), ocispec .MediaTypeImageIndex , ref , bytes .NewReader (data ), content .WithLabels (labels ))
492487}
493488
489+ // GetLabel gets a label value from namespace store
490+ // If there is no default label, an empty string returned with nil error
491+ func (c * Client ) GetLabel (ctx context.Context , label string ) (string , error ) {
492+ ns , err := namespaces .NamespaceRequired (ctx )
493+ if err != nil {
494+ return "" , err
495+ }
496+
497+ srv := c .NamespaceService ()
498+ labels , err := srv .Labels (ctx , ns )
499+ if err != nil {
500+ return "" , err
501+ }
502+
503+ value := labels [label ]
504+ return value , nil
505+ }
506+
494507// Subscribe to events that match one or more of the provided filters.
495508//
496509// Callers should listen on both the envelope and errs channels. If the errs
@@ -656,11 +669,34 @@ func (c *Client) Version(ctx context.Context) (Version, error) {
656669 }, nil
657670}
658671
659- func (c * Client ) getSnapshotter (name string ) (snapshots.Snapshotter , error ) {
672+ func (c * Client ) resolveSnapshotterName (ctx context.Context , name string ) (string , error ) {
673+ if name == "" {
674+ label , err := c .GetLabel (ctx , defaults .DefaultSnapshotterNSLabel )
675+ if err != nil {
676+ return "" , err
677+ }
678+
679+ if label != "" {
680+ name = label
681+ } else {
682+ name = DefaultSnapshotter
683+ }
684+ }
685+
686+ return name , nil
687+ }
688+
689+ func (c * Client ) getSnapshotter (ctx context.Context , name string ) (snapshots.Snapshotter , error ) {
690+ name , err := c .resolveSnapshotterName (ctx , name )
691+ if err != nil {
692+ return nil , err
693+ }
694+
660695 s := c .SnapshotService (name )
661696 if s == nil {
662697 return nil , errors .Wrapf (errdefs .ErrNotFound , "snapshotter %s was not found" , name )
663698 }
699+
664700 return s , nil
665701}
666702
0 commit comments