1// Code generated by smithy-go-codegen DO NOT EDIT. 2 3package rekognition 4 5import ( 6 "context" 7 "fmt" 8 awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" 9 "github.com/aws/aws-sdk-go-v2/aws/signer/v4" 10 "github.com/aws/aws-sdk-go-v2/service/rekognition/types" 11 "github.com/aws/smithy-go/middleware" 12 smithytime "github.com/aws/smithy-go/time" 13 smithyhttp "github.com/aws/smithy-go/transport/http" 14 smithywaiter "github.com/aws/smithy-go/waiter" 15 "github.com/jmespath/go-jmespath" 16 "time" 17) 18 19// Lists and describes the models in an Amazon Rekognition Custom Labels project. 20// You can specify up to 10 model versions in ProjectVersionArns. If you don't 21// specify a value, descriptions for all models are returned. This operation 22// requires permissions to perform the rekognition:DescribeProjectVersions action. 23func (c *Client) DescribeProjectVersions(ctx context.Context, params *DescribeProjectVersionsInput, optFns ...func(*Options)) (*DescribeProjectVersionsOutput, error) { 24 if params == nil { 25 params = &DescribeProjectVersionsInput{} 26 } 27 28 result, metadata, err := c.invokeOperation(ctx, "DescribeProjectVersions", params, optFns, addOperationDescribeProjectVersionsMiddlewares) 29 if err != nil { 30 return nil, err 31 } 32 33 out := result.(*DescribeProjectVersionsOutput) 34 out.ResultMetadata = metadata 35 return out, nil 36} 37 38type DescribeProjectVersionsInput struct { 39 40 // The Amazon Resource Name (ARN) of the project that contains the models you want 41 // to describe. 42 // 43 // This member is required. 44 ProjectArn *string 45 46 // The maximum number of results to return per paginated call. The largest value 47 // you can specify is 100. If you specify a value greater than 100, a 48 // ValidationException error occurs. The default value is 100. 49 MaxResults *int32 50 51 // If the previous response was incomplete (because there is more results to 52 // retrieve), Amazon Rekognition Custom Labels returns a pagination token in the 53 // response. You can use this pagination token to retrieve the next set of results. 54 NextToken *string 55 56 // A list of model version names that you want to describe. You can add up to 10 57 // model version names to the list. If you don't specify a value, all model 58 // descriptions are returned. A version name is part of a model (ProjectVersion) 59 // ARN. For example, my-model.2020-01-21T09.10.15 is the version name in the 60 // following ARN. 61 // arn:aws:rekognition:us-east-1:123456789012:project/getting-started/version/my-model.2020-01-21T09.10.15/1234567890123. 62 VersionNames []string 63} 64 65type DescribeProjectVersionsOutput struct { 66 67 // If the previous response was incomplete (because there is more results to 68 // retrieve), Amazon Rekognition Custom Labels returns a pagination token in the 69 // response. You can use this pagination token to retrieve the next set of results. 70 NextToken *string 71 72 // A list of model descriptions. The list is sorted by the creation date and time 73 // of the model versions, latest to earliest. 74 ProjectVersionDescriptions []types.ProjectVersionDescription 75 76 // Metadata pertaining to the operation's result. 77 ResultMetadata middleware.Metadata 78} 79 80func addOperationDescribeProjectVersionsMiddlewares(stack *middleware.Stack, options Options) (err error) { 81 err = stack.Serialize.Add(&awsAwsjson11_serializeOpDescribeProjectVersions{}, middleware.After) 82 if err != nil { 83 return err 84 } 85 err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDescribeProjectVersions{}, middleware.After) 86 if err != nil { 87 return err 88 } 89 if err = addSetLoggerMiddleware(stack, options); err != nil { 90 return err 91 } 92 if err = awsmiddleware.AddClientRequestIDMiddleware(stack); err != nil { 93 return err 94 } 95 if err = smithyhttp.AddComputeContentLengthMiddleware(stack); err != nil { 96 return err 97 } 98 if err = addResolveEndpointMiddleware(stack, options); err != nil { 99 return err 100 } 101 if err = v4.AddComputePayloadSHA256Middleware(stack); err != nil { 102 return err 103 } 104 if err = addRetryMiddlewares(stack, options); err != nil { 105 return err 106 } 107 if err = addHTTPSignerV4Middleware(stack, options); err != nil { 108 return err 109 } 110 if err = awsmiddleware.AddRawResponseToMetadata(stack); err != nil { 111 return err 112 } 113 if err = awsmiddleware.AddRecordResponseTiming(stack); err != nil { 114 return err 115 } 116 if err = addClientUserAgent(stack); err != nil { 117 return err 118 } 119 if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { 120 return err 121 } 122 if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { 123 return err 124 } 125 if err = addOpDescribeProjectVersionsValidationMiddleware(stack); err != nil { 126 return err 127 } 128 if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeProjectVersions(options.Region), middleware.Before); err != nil { 129 return err 130 } 131 if err = addRequestIDRetrieverMiddleware(stack); err != nil { 132 return err 133 } 134 if err = addResponseErrorMiddleware(stack); err != nil { 135 return err 136 } 137 if err = addRequestResponseLogging(stack, options); err != nil { 138 return err 139 } 140 return nil 141} 142 143// DescribeProjectVersionsAPIClient is a client that implements the 144// DescribeProjectVersions operation. 145type DescribeProjectVersionsAPIClient interface { 146 DescribeProjectVersions(context.Context, *DescribeProjectVersionsInput, ...func(*Options)) (*DescribeProjectVersionsOutput, error) 147} 148 149var _ DescribeProjectVersionsAPIClient = (*Client)(nil) 150 151// DescribeProjectVersionsPaginatorOptions is the paginator options for 152// DescribeProjectVersions 153type DescribeProjectVersionsPaginatorOptions struct { 154 // The maximum number of results to return per paginated call. The largest value 155 // you can specify is 100. If you specify a value greater than 100, a 156 // ValidationException error occurs. The default value is 100. 157 Limit int32 158 159 // Set to true if pagination should stop if the service returns a pagination token 160 // that matches the most recent token provided to the service. 161 StopOnDuplicateToken bool 162} 163 164// DescribeProjectVersionsPaginator is a paginator for DescribeProjectVersions 165type DescribeProjectVersionsPaginator struct { 166 options DescribeProjectVersionsPaginatorOptions 167 client DescribeProjectVersionsAPIClient 168 params *DescribeProjectVersionsInput 169 nextToken *string 170 firstPage bool 171} 172 173// NewDescribeProjectVersionsPaginator returns a new 174// DescribeProjectVersionsPaginator 175func NewDescribeProjectVersionsPaginator(client DescribeProjectVersionsAPIClient, params *DescribeProjectVersionsInput, optFns ...func(*DescribeProjectVersionsPaginatorOptions)) *DescribeProjectVersionsPaginator { 176 if params == nil { 177 params = &DescribeProjectVersionsInput{} 178 } 179 180 options := DescribeProjectVersionsPaginatorOptions{} 181 if params.MaxResults != nil { 182 options.Limit = *params.MaxResults 183 } 184 185 for _, fn := range optFns { 186 fn(&options) 187 } 188 189 return &DescribeProjectVersionsPaginator{ 190 options: options, 191 client: client, 192 params: params, 193 firstPage: true, 194 } 195} 196 197// HasMorePages returns a boolean indicating whether more pages are available 198func (p *DescribeProjectVersionsPaginator) HasMorePages() bool { 199 return p.firstPage || p.nextToken != nil 200} 201 202// NextPage retrieves the next DescribeProjectVersions page. 203func (p *DescribeProjectVersionsPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*DescribeProjectVersionsOutput, error) { 204 if !p.HasMorePages() { 205 return nil, fmt.Errorf("no more pages available") 206 } 207 208 params := *p.params 209 params.NextToken = p.nextToken 210 211 var limit *int32 212 if p.options.Limit > 0 { 213 limit = &p.options.Limit 214 } 215 params.MaxResults = limit 216 217 result, err := p.client.DescribeProjectVersions(ctx, ¶ms, optFns...) 218 if err != nil { 219 return nil, err 220 } 221 p.firstPage = false 222 223 prevToken := p.nextToken 224 p.nextToken = result.NextToken 225 226 if p.options.StopOnDuplicateToken && prevToken != nil && p.nextToken != nil && *prevToken == *p.nextToken { 227 p.nextToken = nil 228 } 229 230 return result, nil 231} 232 233// ProjectVersionRunningWaiterOptions are waiter options for 234// ProjectVersionRunningWaiter 235type ProjectVersionRunningWaiterOptions struct { 236 237 // Set of options to modify how an operation is invoked. These apply to all 238 // operations invoked for this client. Use functional options on operation call to 239 // modify this list for per operation behavior. 240 APIOptions []func(*middleware.Stack) error 241 242 // MinDelay is the minimum amount of time to delay between retries. If unset, 243 // ProjectVersionRunningWaiter will use default minimum delay of 30 seconds. Note 244 // that MinDelay must resolve to a value lesser than or equal to the MaxDelay. 245 MinDelay time.Duration 246 247 // MaxDelay is the maximum amount of time to delay between retries. If unset or set 248 // to zero, ProjectVersionRunningWaiter will use default max delay of 120 seconds. 249 // Note that MaxDelay must resolve to value greater than or equal to the MinDelay. 250 MaxDelay time.Duration 251 252 // LogWaitAttempts is used to enable logging for waiter retry attempts 253 LogWaitAttempts bool 254 255 // Retryable is function that can be used to override the service defined 256 // waiter-behavior based on operation output, or returned error. This function is 257 // used by the waiter to decide if a state is retryable or a terminal state. By 258 // default service-modeled logic will populate this option. This option can thus be 259 // used to define a custom waiter state with fall-back to service-modeled waiter 260 // state mutators.The function returns an error in case of a failure state. In case 261 // of retry state, this function returns a bool value of true and nil error, while 262 // in case of success it returns a bool value of false and nil error. 263 Retryable func(context.Context, *DescribeProjectVersionsInput, *DescribeProjectVersionsOutput, error) (bool, error) 264} 265 266// ProjectVersionRunningWaiter defines the waiters for ProjectVersionRunning 267type ProjectVersionRunningWaiter struct { 268 client DescribeProjectVersionsAPIClient 269 270 options ProjectVersionRunningWaiterOptions 271} 272 273// NewProjectVersionRunningWaiter constructs a ProjectVersionRunningWaiter. 274func NewProjectVersionRunningWaiter(client DescribeProjectVersionsAPIClient, optFns ...func(*ProjectVersionRunningWaiterOptions)) *ProjectVersionRunningWaiter { 275 options := ProjectVersionRunningWaiterOptions{} 276 options.MinDelay = 30 * time.Second 277 options.MaxDelay = 120 * time.Second 278 options.Retryable = projectVersionRunningStateRetryable 279 280 for _, fn := range optFns { 281 fn(&options) 282 } 283 return &ProjectVersionRunningWaiter{ 284 client: client, 285 options: options, 286 } 287} 288 289// Wait calls the waiter function for ProjectVersionRunning waiter. The maxWaitDur 290// is the maximum wait duration the waiter will wait. The maxWaitDur is required 291// and must be greater than zero. 292func (w *ProjectVersionRunningWaiter) Wait(ctx context.Context, params *DescribeProjectVersionsInput, maxWaitDur time.Duration, optFns ...func(*ProjectVersionRunningWaiterOptions)) error { 293 if maxWaitDur <= 0 { 294 return fmt.Errorf("maximum wait time for waiter must be greater than zero") 295 } 296 297 options := w.options 298 for _, fn := range optFns { 299 fn(&options) 300 } 301 302 if options.MaxDelay <= 0 { 303 options.MaxDelay = 120 * time.Second 304 } 305 306 if options.MinDelay > options.MaxDelay { 307 return fmt.Errorf("minimum waiter delay %v must be lesser than or equal to maximum waiter delay of %v.", options.MinDelay, options.MaxDelay) 308 } 309 310 ctx, cancelFn := context.WithTimeout(ctx, maxWaitDur) 311 defer cancelFn() 312 313 logger := smithywaiter.Logger{} 314 remainingTime := maxWaitDur 315 316 var attempt int64 317 for { 318 319 attempt++ 320 apiOptions := options.APIOptions 321 start := time.Now() 322 323 if options.LogWaitAttempts { 324 logger.Attempt = attempt 325 apiOptions = append([]func(*middleware.Stack) error{}, options.APIOptions...) 326 apiOptions = append(apiOptions, logger.AddLogger) 327 } 328 329 out, err := w.client.DescribeProjectVersions(ctx, params, func(o *Options) { 330 o.APIOptions = append(o.APIOptions, apiOptions...) 331 }) 332 333 retryable, err := options.Retryable(ctx, params, out, err) 334 if err != nil { 335 return err 336 } 337 if !retryable { 338 return nil 339 } 340 341 remainingTime -= time.Since(start) 342 if remainingTime < options.MinDelay || remainingTime <= 0 { 343 break 344 } 345 346 // compute exponential backoff between waiter retries 347 delay, err := smithywaiter.ComputeDelay( 348 attempt, options.MinDelay, options.MaxDelay, remainingTime, 349 ) 350 if err != nil { 351 return fmt.Errorf("error computing waiter delay, %w", err) 352 } 353 354 remainingTime -= delay 355 // sleep for the delay amount before invoking a request 356 if err := smithytime.SleepWithContext(ctx, delay); err != nil { 357 return fmt.Errorf("request cancelled while waiting, %w", err) 358 } 359 } 360 return fmt.Errorf("exceeded max wait time for ProjectVersionRunning waiter") 361} 362 363func projectVersionRunningStateRetryable(ctx context.Context, input *DescribeProjectVersionsInput, output *DescribeProjectVersionsOutput, err error) (bool, error) { 364 365 if err == nil { 366 pathValue, err := jmespath.Search("ProjectVersionDescriptions[].Status", output) 367 if err != nil { 368 return false, fmt.Errorf("error evaluating waiter state: %w", err) 369 } 370 371 expectedValue := "RUNNING" 372 var match = true 373 listOfValues, ok := pathValue.([]interface{}) 374 if !ok { 375 return false, fmt.Errorf("waiter comparator expected list got %T", pathValue) 376 } 377 378 if len(listOfValues) == 0 { 379 match = false 380 } 381 for _, v := range listOfValues { 382 value, ok := v.(types.ProjectVersionStatus) 383 if !ok { 384 return false, fmt.Errorf("waiter comparator expected types.ProjectVersionStatus value, got %T", pathValue) 385 } 386 387 if string(value) != expectedValue { 388 match = false 389 } 390 } 391 392 if match { 393 return false, nil 394 } 395 } 396 397 if err == nil { 398 pathValue, err := jmespath.Search("ProjectVersionDescriptions[].Status", output) 399 if err != nil { 400 return false, fmt.Errorf("error evaluating waiter state: %w", err) 401 } 402 403 expectedValue := "FAILED" 404 listOfValues, ok := pathValue.([]interface{}) 405 if !ok { 406 return false, fmt.Errorf("waiter comparator expected list got %T", pathValue) 407 } 408 409 for _, v := range listOfValues { 410 value, ok := v.(types.ProjectVersionStatus) 411 if !ok { 412 return false, fmt.Errorf("waiter comparator expected types.ProjectVersionStatus value, got %T", pathValue) 413 } 414 415 if string(value) == expectedValue { 416 return false, fmt.Errorf("waiter state transitioned to Failure") 417 } 418 } 419 } 420 421 return true, nil 422} 423 424// ProjectVersionTrainingCompletedWaiterOptions are waiter options for 425// ProjectVersionTrainingCompletedWaiter 426type ProjectVersionTrainingCompletedWaiterOptions struct { 427 428 // Set of options to modify how an operation is invoked. These apply to all 429 // operations invoked for this client. Use functional options on operation call to 430 // modify this list for per operation behavior. 431 APIOptions []func(*middleware.Stack) error 432 433 // MinDelay is the minimum amount of time to delay between retries. If unset, 434 // ProjectVersionTrainingCompletedWaiter will use default minimum delay of 120 435 // seconds. Note that MinDelay must resolve to a value lesser than or equal to the 436 // MaxDelay. 437 MinDelay time.Duration 438 439 // MaxDelay is the maximum amount of time to delay between retries. If unset or set 440 // to zero, ProjectVersionTrainingCompletedWaiter will use default max delay of 120 441 // seconds. Note that MaxDelay must resolve to value greater than or equal to the 442 // MinDelay. 443 MaxDelay time.Duration 444 445 // LogWaitAttempts is used to enable logging for waiter retry attempts 446 LogWaitAttempts bool 447 448 // Retryable is function that can be used to override the service defined 449 // waiter-behavior based on operation output, or returned error. This function is 450 // used by the waiter to decide if a state is retryable or a terminal state. By 451 // default service-modeled logic will populate this option. This option can thus be 452 // used to define a custom waiter state with fall-back to service-modeled waiter 453 // state mutators.The function returns an error in case of a failure state. In case 454 // of retry state, this function returns a bool value of true and nil error, while 455 // in case of success it returns a bool value of false and nil error. 456 Retryable func(context.Context, *DescribeProjectVersionsInput, *DescribeProjectVersionsOutput, error) (bool, error) 457} 458 459// ProjectVersionTrainingCompletedWaiter defines the waiters for 460// ProjectVersionTrainingCompleted 461type ProjectVersionTrainingCompletedWaiter struct { 462 client DescribeProjectVersionsAPIClient 463 464 options ProjectVersionTrainingCompletedWaiterOptions 465} 466 467// NewProjectVersionTrainingCompletedWaiter constructs a 468// ProjectVersionTrainingCompletedWaiter. 469func NewProjectVersionTrainingCompletedWaiter(client DescribeProjectVersionsAPIClient, optFns ...func(*ProjectVersionTrainingCompletedWaiterOptions)) *ProjectVersionTrainingCompletedWaiter { 470 options := ProjectVersionTrainingCompletedWaiterOptions{} 471 options.MinDelay = 120 * time.Second 472 options.MaxDelay = 120 * time.Second 473 options.Retryable = projectVersionTrainingCompletedStateRetryable 474 475 for _, fn := range optFns { 476 fn(&options) 477 } 478 return &ProjectVersionTrainingCompletedWaiter{ 479 client: client, 480 options: options, 481 } 482} 483 484// Wait calls the waiter function for ProjectVersionTrainingCompleted waiter. The 485// maxWaitDur is the maximum wait duration the waiter will wait. The maxWaitDur is 486// required and must be greater than zero. 487func (w *ProjectVersionTrainingCompletedWaiter) Wait(ctx context.Context, params *DescribeProjectVersionsInput, maxWaitDur time.Duration, optFns ...func(*ProjectVersionTrainingCompletedWaiterOptions)) error { 488 if maxWaitDur <= 0 { 489 return fmt.Errorf("maximum wait time for waiter must be greater than zero") 490 } 491 492 options := w.options 493 for _, fn := range optFns { 494 fn(&options) 495 } 496 497 if options.MaxDelay <= 0 { 498 options.MaxDelay = 120 * time.Second 499 } 500 501 if options.MinDelay > options.MaxDelay { 502 return fmt.Errorf("minimum waiter delay %v must be lesser than or equal to maximum waiter delay of %v.", options.MinDelay, options.MaxDelay) 503 } 504 505 ctx, cancelFn := context.WithTimeout(ctx, maxWaitDur) 506 defer cancelFn() 507 508 logger := smithywaiter.Logger{} 509 remainingTime := maxWaitDur 510 511 var attempt int64 512 for { 513 514 attempt++ 515 apiOptions := options.APIOptions 516 start := time.Now() 517 518 if options.LogWaitAttempts { 519 logger.Attempt = attempt 520 apiOptions = append([]func(*middleware.Stack) error{}, options.APIOptions...) 521 apiOptions = append(apiOptions, logger.AddLogger) 522 } 523 524 out, err := w.client.DescribeProjectVersions(ctx, params, func(o *Options) { 525 o.APIOptions = append(o.APIOptions, apiOptions...) 526 }) 527 528 retryable, err := options.Retryable(ctx, params, out, err) 529 if err != nil { 530 return err 531 } 532 if !retryable { 533 return nil 534 } 535 536 remainingTime -= time.Since(start) 537 if remainingTime < options.MinDelay || remainingTime <= 0 { 538 break 539 } 540 541 // compute exponential backoff between waiter retries 542 delay, err := smithywaiter.ComputeDelay( 543 attempt, options.MinDelay, options.MaxDelay, remainingTime, 544 ) 545 if err != nil { 546 return fmt.Errorf("error computing waiter delay, %w", err) 547 } 548 549 remainingTime -= delay 550 // sleep for the delay amount before invoking a request 551 if err := smithytime.SleepWithContext(ctx, delay); err != nil { 552 return fmt.Errorf("request cancelled while waiting, %w", err) 553 } 554 } 555 return fmt.Errorf("exceeded max wait time for ProjectVersionTrainingCompleted waiter") 556} 557 558func projectVersionTrainingCompletedStateRetryable(ctx context.Context, input *DescribeProjectVersionsInput, output *DescribeProjectVersionsOutput, err error) (bool, error) { 559 560 if err == nil { 561 pathValue, err := jmespath.Search("ProjectVersionDescriptions[].Status", output) 562 if err != nil { 563 return false, fmt.Errorf("error evaluating waiter state: %w", err) 564 } 565 566 expectedValue := "TRAINING_COMPLETED" 567 var match = true 568 listOfValues, ok := pathValue.([]interface{}) 569 if !ok { 570 return false, fmt.Errorf("waiter comparator expected list got %T", pathValue) 571 } 572 573 if len(listOfValues) == 0 { 574 match = false 575 } 576 for _, v := range listOfValues { 577 value, ok := v.(types.ProjectVersionStatus) 578 if !ok { 579 return false, fmt.Errorf("waiter comparator expected types.ProjectVersionStatus value, got %T", pathValue) 580 } 581 582 if string(value) != expectedValue { 583 match = false 584 } 585 } 586 587 if match { 588 return false, nil 589 } 590 } 591 592 if err == nil { 593 pathValue, err := jmespath.Search("ProjectVersionDescriptions[].Status", output) 594 if err != nil { 595 return false, fmt.Errorf("error evaluating waiter state: %w", err) 596 } 597 598 expectedValue := "TRAINING_FAILED" 599 listOfValues, ok := pathValue.([]interface{}) 600 if !ok { 601 return false, fmt.Errorf("waiter comparator expected list got %T", pathValue) 602 } 603 604 for _, v := range listOfValues { 605 value, ok := v.(types.ProjectVersionStatus) 606 if !ok { 607 return false, fmt.Errorf("waiter comparator expected types.ProjectVersionStatus value, got %T", pathValue) 608 } 609 610 if string(value) == expectedValue { 611 return false, fmt.Errorf("waiter state transitioned to Failure") 612 } 613 } 614 } 615 616 return true, nil 617} 618 619func newServiceMetadataMiddleware_opDescribeProjectVersions(region string) *awsmiddleware.RegisterServiceMetadata { 620 return &awsmiddleware.RegisterServiceMetadata{ 621 Region: region, 622 ServiceID: ServiceID, 623 SigningName: "rekognition", 624 OperationName: "DescribeProjectVersions", 625 } 626} 627