1
2
3 package ecr
4
5 import (
6 "context"
7 "errors"
8 "fmt"
9 "github.com/aws/aws-sdk-go-v2/aws"
10 awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware"
11 "github.com/aws/aws-sdk-go-v2/aws/signer/v4"
12 internalauth "github.com/aws/aws-sdk-go-v2/internal/auth"
13 "github.com/aws/aws-sdk-go-v2/service/ecr/types"
14 smithyendpoints "github.com/aws/smithy-go/endpoints"
15 "github.com/aws/smithy-go/middleware"
16 smithyhttp "github.com/aws/smithy-go/transport/http"
17 )
18
19
20
21
22
23
24 func (c *Client) DescribeImages(ctx context.Context, params *DescribeImagesInput, optFns ...func(*Options)) (*DescribeImagesOutput, error) {
25 if params == nil {
26 params = &DescribeImagesInput{}
27 }
28
29 result, metadata, err := c.invokeOperation(ctx, "DescribeImages", params, optFns, c.addOperationDescribeImagesMiddlewares)
30 if err != nil {
31 return nil, err
32 }
33
34 out := result.(*DescribeImagesOutput)
35 out.ResultMetadata = metadata
36 return out, nil
37 }
38
39 type DescribeImagesInput struct {
40
41
42
43
44 RepositoryName *string
45
46
47 Filter *types.DescribeImagesFilter
48
49
50 ImageIds []types.ImageIdentifier
51
52
53
54
55
56
57
58
59
60 MaxResults *int32
61
62
63
64
65
66
67 NextToken *string
68
69
70
71
72 RegistryId *string
73
74 noSmithyDocumentSerde
75 }
76
77 type DescribeImagesOutput struct {
78
79
80 ImageDetails []types.ImageDetail
81
82
83
84
85
86 NextToken *string
87
88
89 ResultMetadata middleware.Metadata
90
91 noSmithyDocumentSerde
92 }
93
94 func (c *Client) addOperationDescribeImagesMiddlewares(stack *middleware.Stack, options Options) (err error) {
95 err = stack.Serialize.Add(&awsAwsjson11_serializeOpDescribeImages{}, middleware.After)
96 if err != nil {
97 return err
98 }
99 err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDescribeImages{}, middleware.After)
100 if err != nil {
101 return err
102 }
103 if err = addlegacyEndpointContextSetter(stack, options); err != nil {
104 return err
105 }
106 if err = addSetLoggerMiddleware(stack, options); err != nil {
107 return err
108 }
109 if err = awsmiddleware.AddClientRequestIDMiddleware(stack); err != nil {
110 return err
111 }
112 if err = smithyhttp.AddComputeContentLengthMiddleware(stack); err != nil {
113 return err
114 }
115 if err = addResolveEndpointMiddleware(stack, options); err != nil {
116 return err
117 }
118 if err = v4.AddComputePayloadSHA256Middleware(stack); err != nil {
119 return err
120 }
121 if err = addRetryMiddlewares(stack, options); err != nil {
122 return err
123 }
124 if err = addHTTPSignerV4Middleware(stack, options); err != nil {
125 return err
126 }
127 if err = awsmiddleware.AddRawResponseToMetadata(stack); err != nil {
128 return err
129 }
130 if err = awsmiddleware.AddRecordResponseTiming(stack); err != nil {
131 return err
132 }
133 if err = addClientUserAgent(stack, options); err != nil {
134 return err
135 }
136 if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {
137 return err
138 }
139 if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {
140 return err
141 }
142 if err = addDescribeImagesResolveEndpointMiddleware(stack, options); err != nil {
143 return err
144 }
145 if err = addOpDescribeImagesValidationMiddleware(stack); err != nil {
146 return err
147 }
148 if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeImages(options.Region), middleware.Before); err != nil {
149 return err
150 }
151 if err = awsmiddleware.AddRecursionDetection(stack); err != nil {
152 return err
153 }
154 if err = addRequestIDRetrieverMiddleware(stack); err != nil {
155 return err
156 }
157 if err = addResponseErrorMiddleware(stack); err != nil {
158 return err
159 }
160 if err = addRequestResponseLogging(stack, options); err != nil {
161 return err
162 }
163 if err = addendpointDisableHTTPSMiddleware(stack, options); err != nil {
164 return err
165 }
166 return nil
167 }
168
169
170
171 type DescribeImagesAPIClient interface {
172 DescribeImages(context.Context, *DescribeImagesInput, ...func(*Options)) (*DescribeImagesOutput, error)
173 }
174
175 var _ DescribeImagesAPIClient = (*Client)(nil)
176
177
178 type DescribeImagesPaginatorOptions struct {
179
180
181
182
183
184
185
186
187 Limit int32
188
189
190
191 StopOnDuplicateToken bool
192 }
193
194
195 type DescribeImagesPaginator struct {
196 options DescribeImagesPaginatorOptions
197 client DescribeImagesAPIClient
198 params *DescribeImagesInput
199 nextToken *string
200 firstPage bool
201 }
202
203
204 func NewDescribeImagesPaginator(client DescribeImagesAPIClient, params *DescribeImagesInput, optFns ...func(*DescribeImagesPaginatorOptions)) *DescribeImagesPaginator {
205 if params == nil {
206 params = &DescribeImagesInput{}
207 }
208
209 options := DescribeImagesPaginatorOptions{}
210 if params.MaxResults != nil {
211 options.Limit = *params.MaxResults
212 }
213
214 for _, fn := range optFns {
215 fn(&options)
216 }
217
218 return &DescribeImagesPaginator{
219 options: options,
220 client: client,
221 params: params,
222 firstPage: true,
223 nextToken: params.NextToken,
224 }
225 }
226
227
228 func (p *DescribeImagesPaginator) HasMorePages() bool {
229 return p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0)
230 }
231
232
233 func (p *DescribeImagesPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*DescribeImagesOutput, error) {
234 if !p.HasMorePages() {
235 return nil, fmt.Errorf("no more pages available")
236 }
237
238 params := *p.params
239 params.NextToken = p.nextToken
240
241 var limit *int32
242 if p.options.Limit > 0 {
243 limit = &p.options.Limit
244 }
245 params.MaxResults = limit
246
247 result, err := p.client.DescribeImages(ctx, ¶ms, optFns...)
248 if err != nil {
249 return nil, err
250 }
251 p.firstPage = false
252
253 prevToken := p.nextToken
254 p.nextToken = result.NextToken
255
256 if p.options.StopOnDuplicateToken &&
257 prevToken != nil &&
258 p.nextToken != nil &&
259 *prevToken == *p.nextToken {
260 p.nextToken = nil
261 }
262
263 return result, nil
264 }
265
266 func newServiceMetadataMiddleware_opDescribeImages(region string) *awsmiddleware.RegisterServiceMetadata {
267 return &awsmiddleware.RegisterServiceMetadata{
268 Region: region,
269 ServiceID: ServiceID,
270 SigningName: "ecr",
271 OperationName: "DescribeImages",
272 }
273 }
274
275 type opDescribeImagesResolveEndpointMiddleware struct {
276 EndpointResolver EndpointResolverV2
277 BuiltInResolver builtInParameterResolver
278 }
279
280 func (*opDescribeImagesResolveEndpointMiddleware) ID() string {
281 return "ResolveEndpointV2"
282 }
283
284 func (m *opDescribeImagesResolveEndpointMiddleware) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (
285 out middleware.SerializeOutput, metadata middleware.Metadata, err error,
286 ) {
287 if awsmiddleware.GetRequiresLegacyEndpoints(ctx) {
288 return next.HandleSerialize(ctx, in)
289 }
290
291 req, ok := in.Request.(*smithyhttp.Request)
292 if !ok {
293 return out, metadata, fmt.Errorf("unknown transport type %T", in.Request)
294 }
295
296 if m.EndpointResolver == nil {
297 return out, metadata, fmt.Errorf("expected endpoint resolver to not be nil")
298 }
299
300 params := EndpointParameters{}
301
302 m.BuiltInResolver.ResolveBuiltIns(¶ms)
303
304 var resolvedEndpoint smithyendpoints.Endpoint
305 resolvedEndpoint, err = m.EndpointResolver.ResolveEndpoint(ctx, params)
306 if err != nil {
307 return out, metadata, fmt.Errorf("failed to resolve service endpoint, %w", err)
308 }
309
310 req.URL = &resolvedEndpoint.URI
311
312 for k := range resolvedEndpoint.Headers {
313 req.Header.Set(
314 k,
315 resolvedEndpoint.Headers.Get(k),
316 )
317 }
318
319 authSchemes, err := internalauth.GetAuthenticationSchemes(&resolvedEndpoint.Properties)
320 if err != nil {
321 var nfe *internalauth.NoAuthenticationSchemesFoundError
322 if errors.As(err, &nfe) {
323
324 signingName := "ecr"
325 signingRegion := m.BuiltInResolver.(*builtInResolver).Region
326 ctx = awsmiddleware.SetSigningName(ctx, signingName)
327 ctx = awsmiddleware.SetSigningRegion(ctx, signingRegion)
328
329 }
330 var ue *internalauth.UnSupportedAuthenticationSchemeSpecifiedError
331 if errors.As(err, &ue) {
332 return out, metadata, fmt.Errorf(
333 "This operation requests signer version(s) %v but the client only supports %v",
334 ue.UnsupportedSchemes,
335 internalauth.SupportedSchemes,
336 )
337 }
338 }
339
340 for _, authScheme := range authSchemes {
341 switch authScheme.(type) {
342 case *internalauth.AuthenticationSchemeV4:
343 v4Scheme, _ := authScheme.(*internalauth.AuthenticationSchemeV4)
344 var signingName, signingRegion string
345 if v4Scheme.SigningName == nil {
346 signingName = "ecr"
347 } else {
348 signingName = *v4Scheme.SigningName
349 }
350 if v4Scheme.SigningRegion == nil {
351 signingRegion = m.BuiltInResolver.(*builtInResolver).Region
352 } else {
353 signingRegion = *v4Scheme.SigningRegion
354 }
355 if v4Scheme.DisableDoubleEncoding != nil {
356
357
358
359 ctx = internalauth.SetDisableDoubleEncoding(ctx, *v4Scheme.DisableDoubleEncoding)
360 }
361 ctx = awsmiddleware.SetSigningName(ctx, signingName)
362 ctx = awsmiddleware.SetSigningRegion(ctx, signingRegion)
363 break
364 case *internalauth.AuthenticationSchemeV4A:
365 v4aScheme, _ := authScheme.(*internalauth.AuthenticationSchemeV4A)
366 if v4aScheme.SigningName == nil {
367 v4aScheme.SigningName = aws.String("ecr")
368 }
369 if v4aScheme.DisableDoubleEncoding != nil {
370
371
372
373 ctx = internalauth.SetDisableDoubleEncoding(ctx, *v4aScheme.DisableDoubleEncoding)
374 }
375 ctx = awsmiddleware.SetSigningName(ctx, *v4aScheme.SigningName)
376 ctx = awsmiddleware.SetSigningRegion(ctx, v4aScheme.SigningRegionSet[0])
377 break
378 case *internalauth.AuthenticationSchemeNone:
379 break
380 }
381 }
382
383 return next.HandleSerialize(ctx, in)
384 }
385
386 func addDescribeImagesResolveEndpointMiddleware(stack *middleware.Stack, options Options) error {
387 return stack.Serialize.Insert(&opDescribeImagesResolveEndpointMiddleware{
388 EndpointResolver: options.EndpointResolverV2,
389 BuiltInResolver: &builtInResolver{
390 Region: options.Region,
391 UseDualStack: options.EndpointOptions.UseDualStackEndpoint,
392 UseFIPS: options.EndpointOptions.UseFIPSEndpoint,
393 Endpoint: options.BaseEndpoint,
394 },
395 }, "ResolveEndpoint", middleware.After)
396 }
397
View as plain text