From 37e92fd749d2afd1edea7012d7ee244723d7193f Mon Sep 17 00:00:00 2001 From: Oded Viner Date: Thu, 21 May 2026 15:09:00 +0300 Subject: [PATCH] object: remove AWS SDK v1 dependency Remove the AWS SDK v1 (github.com/aws/aws-sdk-go) dependency entirely. All S3 operations now use AWS SDK v2 exclusively. - Remove the v1 Client field from S3Agent struct and rename ClientV2 to Client - Remove v1 session/client initialization from NewS3Agent - Update all call sites referencing ClientV2 - Convert integration tests to use v2 API calling conventions (context parameter) and smithy error handling - Remove aws-sdk-go v1.55.8 from go.mod Signed-off-by: Oded Viner (cherry picked from commit 254965fff1852069cb8c4897ec06cc0e663c145f) # Conflicts: # go.mod # go.sum --- go.mod | 43 ++++---- go.sum | 100 +++++++----------- .../ceph/object/bucket/provisioner.go | 20 ++-- .../ceph/object/bucket/provisioner_test.go | 2 +- .../ceph/object/notification/provisioner.go | 8 +- .../ceph/object/notification/s3ext.go | 4 +- pkg/operator/ceph/object/policy.go | 10 +- pkg/operator/ceph/object/s3-handlers.go | 68 ++++-------- pkg/operator/ceph/object/s3-handlers_test.go | 77 ++++++-------- tests/framework/clients/bucket.go | 4 +- tests/integration/ceph_object_test.go | 64 +++++++---- 11 files changed, 179 insertions(+), 221 deletions(-) diff --git a/go.mod b/go.mod index 3fa170826..cc8301af9 100644 --- a/go.mod +++ b/go.mod @@ -13,14 +13,13 @@ replace ( ) require ( - github.com/IBM/keyprotect-go-client v0.15.1 - github.com/aws/aws-sdk-go v1.55.8 - github.com/aws/aws-sdk-go-v2 v1.41.5 - github.com/aws/aws-sdk-go-v2/config v1.32.14 - github.com/aws/aws-sdk-go-v2/credentials v1.19.14 - github.com/aws/aws-sdk-go-v2/service/s3 v1.99.0 - github.com/aws/aws-sdk-go-v2/service/sns v1.39.15 - github.com/aws/smithy-go v1.24.3 + github.com/IBM/keyprotect-go-client v0.16.0 + github.com/aws/aws-sdk-go-v2 v1.41.7 + github.com/aws/aws-sdk-go-v2/config v1.32.18 + github.com/aws/aws-sdk-go-v2/credentials v1.19.17 + github.com/aws/aws-sdk-go-v2/service/s3 v1.101.0 + github.com/aws/aws-sdk-go-v2/service/sns v1.39.17 + github.com/aws/smithy-go v1.25.1 github.com/banzaicloud/k8s-objectmatcher v1.8.0 github.com/ceph/ceph-csi-operator/api v0.0.0-20260527105556-70b2f7cfddf0 github.com/ceph/ceph-csi/api v0.0.0-20241216133622-88b7e0d6684f @@ -72,20 +71,19 @@ require ( github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2 // indirect github.com/ansel1/merry v1.8.1 // indirect github.com/ansel1/merry/v2 v2.2.2 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.21 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.22 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.13 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.0.9 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.30.15 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.19 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.41.10 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.23 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.23 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.15 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.23 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.0.11 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.30.17 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.42.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect @@ -134,7 +132,6 @@ require ( github.com/hashicorp/vault/api/auth/approle v0.8.0 // indirect github.com/hashicorp/vault/api/auth/kubernetes v0.8.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect diff --git a/go.sum b/go.sum index c49ab9e8b..997aa3aed 100644 --- a/go.sum +++ b/go.sum @@ -451,8 +451,8 @@ github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2/go.mod h1:wP83 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/IBM/keyprotect-go-client v0.5.1/go.mod h1:5TwDM/4FRJq1ZOlwQL1xFahLWQ3TveR88VmL1u3njyI= -github.com/IBM/keyprotect-go-client v0.15.1 h1:m4qzqF5zOumRxKZ8s7vtK7A/UV/D278L8xpRG+WgT0s= -github.com/IBM/keyprotect-go-client v0.15.1/go.mod h1:asXtHwL/4uCHA221Vd/7SkXEi2pcRHDzPyyksc1DthE= +github.com/IBM/keyprotect-go-client v0.16.0 h1:FAel9YYJvRym4fuj/SIwtpT3RkDBJo+bLkMNzFEeSpA= +github.com/IBM/keyprotect-go-client v0.16.0/go.mod h1:ya2yvOPBIgZUWiPDsHDgxeYrTy1pQk/70MY61k6Fdyw= github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= @@ -488,48 +488,44 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkY github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/aws/aws-sdk-go v1.44.164/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= -github.com/aws/aws-sdk-go v1.55.8 h1:JRmEUbU52aJQZ2AjX4q4Wu7t4uZjOu71uyNmaWlUkJQ= -github.com/aws/aws-sdk-go v1.55.8/go.mod h1:ZkViS9AqA6otK+JBBNH2++sx1sgxrPKcSzPPvQkUtXk= -github.com/aws/aws-sdk-go-v2 v1.41.5 h1:dj5kopbwUsVUVFgO4Fi5BIT3t4WyqIDjGKCangnV/yY= -github.com/aws/aws-sdk-go-v2 v1.41.5/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8 h1:eBMB84YGghSocM7PsjmmPffTa+1FBUeNvGvFou6V/4o= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8/go.mod h1:lyw7GFp3qENLh7kwzf7iMzAxDn+NzjXEAGjKS2UOKqI= -github.com/aws/aws-sdk-go-v2/config v1.32.14 h1:opVIRo/ZbbI8OIqSOKmpFaY7IwfFUOCCXBsUpJOwDdI= -github.com/aws/aws-sdk-go-v2/config v1.32.14/go.mod h1:U4/V0uKxh0Tl5sxmCBZ3AecYny4UNlVmObYjKuuaiOo= -github.com/aws/aws-sdk-go-v2/credentials v1.19.14 h1:n+UcGWAIZHkXzYt87uMFBv/l8THYELoX6gVcUvgl6fI= -github.com/aws/aws-sdk-go-v2/credentials v1.19.14/go.mod h1:cJKuyWB59Mqi0jM3nFYQRmnHVQIcgoxjEMAbLkpr62w= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.21 h1:NUS3K4BTDArQqNu2ih7yeDLaS3bmHD0YndtA6UP884g= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.21/go.mod h1:YWNWJQNjKigKY1RHVJCuupeWDrrHjRqHm0N9rdrWzYI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21 h1:Rgg6wvjjtX8bNHcvi9OnXWwcE0a2vGpbwmtICOsvcf4= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21/go.mod h1:A/kJFst/nm//cyqonihbdpQZwiUhhzpqTsdbhDdRF9c= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21 h1:PEgGVtPoB6NTpPrBgqSE5hE/o47Ij9qk/SEZFbUOe9A= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21/go.mod h1:p+hz+PRAYlY3zcpJhPwXlLC4C+kqn70WIHwnzAfs6ps= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.22 h1:rWyie/PxDRIdhNf4DzRk0lvjVOqFJuNnO8WwaIRVxzQ= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.22/go.mod h1:zd/JsJ4P7oGfUhXn1VyLqaRZwPmZwg44Jf2dS84Dm3Y= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.13 h1:JRaIgADQS/U6uXDqlPiefP32yXTda7Kqfx+LgspooZM= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.13/go.mod h1:CEuVn5WqOMilYl+tbccq8+N2ieCy0gVn3OtRb0vBNNM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21 h1:c31//R3xgIJMSC8S6hEVq+38DcvUlgFY0FM6mSI5oto= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21/go.mod h1:r6+pf23ouCB718FUxaqzZdbpYFyDtehyZcmP5KL9FkA= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21 h1:ZlvrNcHSFFWURB8avufQq9gFsheUgjVD9536obIknfM= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21/go.mod h1:cv3TNhVrssKR0O/xxLJVRfd2oazSnZnkUeTf6ctUwfQ= -github.com/aws/aws-sdk-go-v2/service/s3 v1.99.0 h1:hlSuz394kV0vhv9drL5lhuEFbEOEP1VyQpy15qWh1Pk= -github.com/aws/aws-sdk-go-v2/service/s3 v1.99.0/go.mod h1:uoA43SdFwacedBfSgfFSjjCvYe8aYBS7EnU5GZ/YKMM= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.9 h1:QKZH0S178gCmFEgst8hN0mCX1KxLgHBKKY/CLqwP8lg= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.9/go.mod h1:7yuQJoT+OoH8aqIxw9vwF+8KpvLZ8AWmvmUWHsGQZvI= -github.com/aws/aws-sdk-go-v2/service/sns v1.39.15 h1:rOWMUrXJPcTXnk75ja6Bxv1P+j83dPhIWjfJ2cujj34= -github.com/aws/aws-sdk-go-v2/service/sns v1.39.15/go.mod h1:4exx1wZR0pe+WcMbas8OZ2krRrBbW7IUUvLXCCQbjkg= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.15 h1:lFd1+ZSEYJZYvv9d6kXzhkZu07si3f+GQ1AaYwa2LUM= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.15/go.mod h1:WSvS1NLr7JaPunCXqpJnWk1Bjo7IxzZXrZi1QQCkuqM= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.19 h1:dzztQ1YmfPrxdrOiuZRMF6fuOwWlWpD2StNLTceKpys= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.19/go.mod h1:YO8TrYtFdl5w/4vmjL8zaBSsiNp3w0L1FfKVKenZT7w= -github.com/aws/aws-sdk-go-v2/service/sts v1.41.10 h1:p8ogvvLugcR/zLBXTXrTkj0RYBUdErbMnAFFp12Lm/U= -github.com/aws/aws-sdk-go-v2/service/sts v1.41.10/go.mod h1:60dv0eZJfeVXfbT1tFJinbHrDfSJ2GZl4Q//OSSNAVw= -github.com/aws/smithy-go v1.24.3 h1:XgOAaUgx+HhVBoP4v8n6HCQoTRDhoMghKqw4LNHsDNg= -github.com/aws/smithy-go v1.24.3/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/aws/aws-sdk-go-v2 v1.41.7 h1:DWpAJt66FmnnaRIOT/8ASTucrvuDPZASqhhLey6tLY8= +github.com/aws/aws-sdk-go-v2 v1.41.7/go.mod h1:4LAfZOPHNVNQEckOACQx60Y8pSRjIkNZQz1w92xpMJc= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10 h1:gx1AwW1Iyk9Z9dD9F4akX5gnN3QZwUB20GGKH/I+Rho= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10/go.mod h1:qqY157uZoqm5OXq/amuaBJyC9hgBCBQnsaWnPe905GY= +github.com/aws/aws-sdk-go-v2/config v1.32.18 h1:Hcia46bxhGgF3BaSnG8nSNCWmqTK6bj9xN9/FJ3WK6Q= +github.com/aws/aws-sdk-go-v2/config v1.32.18/go.mod h1:zEjCAYmxqDadH1WX8CdBvmLKhUEUVFgKRQG38zjDmrY= +github.com/aws/aws-sdk-go-v2/credentials v1.19.17 h1:gP2nkGsS+KMvF/jfFz2Vv2qiiOqWKyPACSzPsqHgoW8= +github.com/aws/aws-sdk-go-v2/credentials v1.19.17/go.mod h1:Bsew3S/moG5iT77giPj1q8wb/s0RE5/QfH+ASjYtuQc= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23 h1:UuSfcORqNSz/ey3VPRS8TcVH2Ikf0/sC+Hdj400QI6U= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23/go.mod h1:+G/OSGiOFnSOkYloKj/9M35s74LgVAdJBSD5lsFfqKg= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.23 h1:GpT/TrnBYuE5gan2cZbTtvP+JlHsutdmlV2YfEyNde0= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.23/go.mod h1:xYWD6BS9ywC5bS3sz9Xh04whO/hzK2plt2Zkyrp4JuA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.23 h1:bpd8vxhlQi2r1hiueOw02f/duEPTMK59Q4QMAoTTtTo= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.23/go.mod h1:15DfR2nw+CRHIk0tqNyifu3G1YdAOy68RftkhMDDwYk= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24 h1:OQqn11BtaYv1WLUowvcA30MpzIu8Ti4pcLPIIyoKZrA= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24/go.mod h1:X5ZJyfwVrWA96GzPmUCWFQaEARPR7gCrpq2E92PJwAE= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9 h1:FLudkZLt5ci0ozzgkVo8BJGwvqNaZbTWb3UcucAateA= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9/go.mod h1:w7wZ/s9qK7c8g4al+UyoF1Sp/Z45UwMGcqIzLWVQHWk= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.15 h1:ieLCO1JxUWuxTZ1cRd0GAaeX7O6cIxnwk7tc1LsQhC4= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.15/go.mod h1:e3IzZvQ3kAWNykvE0Tr0RDZCMFInMvhku3qNpcIQXhM= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23 h1:pbrxO/kuIwgEsOPLkaHu0O+m4fNgLU8B3vxQ+72jTPw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23/go.mod h1:/CMNUqoj46HpS3MNRDEDIwcgEnrtZlKRaHNaHxIFpNA= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.23 h1:03xatSQO4+AM1lTAbnRg5OK528EUg744nW7F73U8DKw= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.23/go.mod h1:M8l3mwgx5ToK7wot2sBBce/ojzgnPzZXUV445gTSyE8= +github.com/aws/aws-sdk-go-v2/service/s3 v1.101.0 h1:etqBTKY581iwLL/H/S2sVgk3C9lAsTJFeXWFDsDcWOU= +github.com/aws/aws-sdk-go-v2/service/s3 v1.101.0/go.mod h1:L2dcoOgS2VSgbPLvpak2NyUPsO1TBN7M45Z4H7DlRc4= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.11 h1:TdJ+HdzOBhU8+iVAOGUTU63VXopcumCOF1paFulHWZc= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.11/go.mod h1:R82ZRExE/nheo0N+T8zHPcLRTcH8MGsnR3BiVGX0TwI= +github.com/aws/aws-sdk-go-v2/service/sns v1.39.17 h1:synXIPC/L4Cc489P0XDcrVJzHSLj7krKRpFLalbGM2k= +github.com/aws/aws-sdk-go-v2/service/sns v1.39.17/go.mod h1:4ABZnI23uNK37waIjGwkubnCwGhepIt9x1GvASfljJA= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.17 h1:7byT8HUWrgoRp6sXjxtZwgOKfhss5fW6SkLBtqzgRoE= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.17/go.mod h1:xNWknVi4Ezm1vg1QsB/5EWpAJURq22uqd38U8qKvOJc= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.0 h1:nDARhv/oF55bcxF7rCI/4PDxOKnVXVWwDuDwCs2I2SQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.0/go.mod h1:4vIRDq+CJB2xFAXZ+YgGUTiEft7oAQlhIs71xcSeuVg= +github.com/aws/aws-sdk-go-v2/service/sts v1.42.1 h1:F/M5Y9I3nwr2IEpshZgh1GeHpOItExNM9L1euNuh/fk= +github.com/aws/aws-sdk-go-v2/service/sts v1.42.1/go.mod h1:mTNxImtovCOEEuD65mKW7DCsL+2gjEH+RPEAexAzAio= +github.com/aws/smithy-go v1.25.1 h1:J8ERsGSU7d+aCmdQur5Txg6bVoYelvQJgtZehD12GkI= +github.com/aws/smithy-go v1.25.1/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/banzaicloud/k8s-objectmatcher v1.8.0 h1:Nugn25elKtPMTA2br+JgHNeSQ04sc05MDPmpJnd1N2A= github.com/banzaicloud/k8s-objectmatcher v1.8.0/go.mod h1:p2LSNAjlECf07fbhDyebTkPUIYnU05G+WfGgkTmgeMg= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -654,8 +650,6 @@ github.com/evanphx/json-patch v5.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLi github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU= github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= @@ -955,7 +949,6 @@ github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9 github.com/hashicorp/go-retryablehttp v0.6.2/go.mod h1:gEx6HMUGxYYhJScX7W1Il64m6cc2C1mDaW3NQ9sY1FY= github.com/hashicorp/go-retryablehttp v0.6.6/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-retryablehttp v0.7.1/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= -github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= github.com/hashicorp/go-retryablehttp v0.7.8 h1:ylXZWnqa7Lhqpk0L1P1LzDtGcCR0rPVUrx/c8Unxc48= github.com/hashicorp/go-retryablehttp v0.7.8/go.mod h1:rjiScheydd+CxvumBsIrFKlx3iS0jrZ7LvzFGFmuKbw= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= @@ -1006,9 +999,7 @@ github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -1074,9 +1065,6 @@ github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaO github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -1085,8 +1073,6 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= @@ -1316,11 +1302,9 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= @@ -1669,7 +1653,6 @@ golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1690,7 +1673,6 @@ golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1700,9 +1682,7 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= diff --git a/pkg/operator/ceph/object/bucket/provisioner.go b/pkg/operator/ceph/object/bucket/provisioner.go index 7f1a20f58..1a051b5a5 100644 --- a/pkg/operator/ceph/object/bucket/provisioner.go +++ b/pkg/operator/ceph/object/bucket/provisioner.go @@ -23,7 +23,7 @@ import ( "net/http" "strings" - s3v2 "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/aws/aws-sdk-go-v2/service/s3" s3types "github.com/aws/aws-sdk-go-v2/service/s3/types" smithy "github.com/aws/smithy-go" "github.com/ceph/go-ceph/rgw/admin" @@ -765,10 +765,10 @@ func (p *Provisioner) setBucketPolicy(bucket *bucket) error { additionalConfig := bucket.additionalConfig ctx := context.TODO() - svc := p.s3Agent.ClientV2 + svc := p.s3Agent.Client var livePolicy *string - policyResp, err := svc.GetBucketPolicy(ctx, &s3v2.GetBucketPolicyInput{ + policyResp, err := svc.GetBucketPolicy(ctx, &s3.GetBucketPolicyInput{ Bucket: &p.bucketName, }) if err != nil { @@ -790,14 +790,14 @@ func (p *Provisioner) setBucketPolicy(bucket *bucket) error { log.NamedDebug(nsName, logger, "Policy for bucket %q has changed. diff:%s", p.bucketName, diff) if additionalConfig.bucketPolicy == nil { - _, err = svc.DeleteBucketPolicy(ctx, &s3v2.DeleteBucketPolicyInput{ + _, err = svc.DeleteBucketPolicy(ctx, &s3.DeleteBucketPolicyInput{ Bucket: &p.bucketName, }) if err != nil { return errors.Wrapf(err, "failed to delete policy for bucket %q", p.bucketName) } } else { - _, err = svc.PutBucketPolicy(ctx, &s3v2.PutBucketPolicyInput{ + _, err = svc.PutBucketPolicy(ctx, &s3.PutBucketPolicyInput{ Bucket: &p.bucketName, Policy: additionalConfig.bucketPolicy, }) @@ -814,10 +814,10 @@ func (p *Provisioner) setBucketLifecycle(bucket *bucket) error { additionalConfig := bucket.additionalConfig ctx := context.TODO() - svc := p.s3Agent.ClientV2 - var liveLc *s3v2.GetBucketLifecycleConfigurationOutput + svc := p.s3Agent.Client + var liveLc *s3.GetBucketLifecycleConfigurationOutput - liveLc, err := svc.GetBucketLifecycleConfiguration(ctx, &s3v2.GetBucketLifecycleConfigurationInput{ + liveLc, err := svc.GetBucketLifecycleConfiguration(ctx, &s3.GetBucketLifecycleConfigurationInput{ Bucket: &p.bucketName, }) if err != nil { @@ -868,14 +868,14 @@ func (p *Provisioner) setBucketLifecycle(bucket *bucket) error { log.NamedDebug(nsName, logger, "Lifecycle configuration for bucket %q has changed. diff:%s", p.bucketName, diff) if additionalConfig.bucketLifecycle == nil { - _, err = svc.DeleteBucketLifecycle(ctx, &s3v2.DeleteBucketLifecycleInput{ + _, err = svc.DeleteBucketLifecycle(ctx, &s3.DeleteBucketLifecycleInput{ Bucket: &p.bucketName, }) if err != nil { return errors.Wrapf(err, "failed to delete lifecycle configuration for bucket %q", p.bucketName) } } else { - _, err = svc.PutBucketLifecycleConfiguration(ctx, &s3v2.PutBucketLifecycleConfigurationInput{ + _, err = svc.PutBucketLifecycleConfiguration(ctx, &s3.PutBucketLifecycleConfigurationInput{ Bucket: &p.bucketName, LifecycleConfiguration: confLc, }) diff --git a/pkg/operator/ceph/object/bucket/provisioner_test.go b/pkg/operator/ceph/object/bucket/provisioner_test.go index 1a8d7d3af..950272470 100644 --- a/pkg/operator/ceph/object/bucket/provisioner_test.go +++ b/pkg/operator/ceph/object/bucket/provisioner_test.go @@ -26,7 +26,7 @@ import ( "strings" "testing" - "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go-v2/aws" "github.com/ceph/go-ceph/rgw/admin" cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1" rookclient "github.com/rook/rook/pkg/client/clientset/versioned/fake" diff --git a/pkg/operator/ceph/object/notification/provisioner.go b/pkg/operator/ceph/object/notification/provisioner.go index 029fac235..e650d7fb1 100644 --- a/pkg/operator/ceph/object/notification/provisioner.go +++ b/pkg/operator/ceph/object/notification/provisioner.go @@ -20,7 +20,7 @@ package notification import ( "context" - s3v2 "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/aws/aws-sdk-go-v2/service/s3" s3types "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/ceph/go-ceph/rgw/admin" "github.com/coreos/pkg/capnslog" @@ -144,7 +144,7 @@ var createNotification = func(p provisioner, bucket *bktv1alpha1.ObjectBucket, t if err != nil { return errors.Wrapf(err, "failed to create S3 agent for CephBucketNotification %q provisioning for bucket %q", bnName, bucketName) } - _, err = s3Agent.ClientV2.PutBucketNotificationConfiguration(p.opManagerContext, &s3v2.PutBucketNotificationConfigurationInput{ + _, err = s3Agent.Client.PutBucketNotificationConfiguration(p.opManagerContext, &s3.PutBucketNotificationConfigurationInput{ Bucket: &bucketName, NotificationConfiguration: &s3types.NotificationConfiguration{ TopicConfigurations: []s3types.TopicConfiguration{ @@ -176,7 +176,7 @@ var getAllRGWNotifications = func(p provisioner, ob *bktv1alpha1.ObjectBucket) ( if err != nil { return nil, errors.Wrapf(err, "failed to create S3 agent for CephBucketNotification provisioning for bucket %q", bucketName) } - nc, err := s3Agent.ClientV2.GetBucketNotificationConfiguration(p.opManagerContext, &s3v2.GetBucketNotificationConfigurationInput{ + nc, err := s3Agent.Client.GetBucketNotificationConfiguration(p.opManagerContext, &s3.GetBucketNotificationConfigurationInput{ Bucket: &bucketName, ExpectedBucketOwner: &ownerName, }) @@ -204,7 +204,7 @@ var deleteNotification = func(p provisioner, bucket *bktv1alpha1.ObjectBucket, n if err != nil { return errors.Wrapf(err, "failed to create S3 agent for deleting all bucket notifications from bucket %q", bucketName) } - if err := DeleteBucketNotification(context.TODO(), s3Agent.ClientV2, &DeleteBucketNotificationRequestInput{ + if err := DeleteBucketNotification(context.TODO(), s3Agent.Client, &DeleteBucketNotificationRequestInput{ Bucket: &bucket.Spec.Endpoint.BucketName, }, notificationId); err != nil { return errors.Wrapf(err, "failed to delete bucket notification %q from bucket %q", notificationId, bucketName) diff --git a/pkg/operator/ceph/object/notification/s3ext.go b/pkg/operator/ceph/object/notification/s3ext.go index 9356612e9..56be3f3d5 100644 --- a/pkg/operator/ceph/object/notification/s3ext.go +++ b/pkg/operator/ceph/object/notification/s3ext.go @@ -25,7 +25,7 @@ import ( "time" v4signer "github.com/aws/aws-sdk-go-v2/aws/signer/v4" - s3v2 "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/pkg/errors" ) @@ -53,7 +53,7 @@ const emptyPayloadSHA256 = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495 // bucket notification configuration. This is not part of the standard AWS S3 // API, so we build and sign the HTTP request manually using the v2 client's // credentials and endpoint. -func DeleteBucketNotification(ctx context.Context, client *s3v2.Client, input *DeleteBucketNotificationRequestInput, notificationId string) error { +func DeleteBucketNotification(ctx context.Context, client *s3.Client, input *DeleteBucketNotificationRequestInput, notificationId string) error { if input == nil { input = &DeleteBucketNotificationRequestInput{} } diff --git a/pkg/operator/ceph/object/policy.go b/pkg/operator/ceph/object/policy.go index 5abe466dc..3cef1c2d7 100644 --- a/pkg/operator/ceph/object/policy.go +++ b/pkg/operator/ceph/object/policy.go @@ -20,7 +20,7 @@ import ( "context" "fmt" - s3v2 "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/aws/aws-sdk-go-v2/service/s3" "k8s.io/apimachinery/pkg/util/json" ) @@ -162,17 +162,17 @@ func NewBucketPolicy(ps ...PolicyStatement) *BucketPolicy { } // PutBucketPolicy applies the policy to the bucket -func (s *S3Agent) PutBucketPolicy(bucket string, policy BucketPolicy) (*s3v2.PutBucketPolicyOutput, error) { +func (s *S3Agent) PutBucketPolicy(bucket string, policy BucketPolicy) (*s3.PutBucketPolicyOutput, error) { confirmRemoveSelfBucketAccess := false serializedPolicy, _ := json.Marshal(policy) consumablePolicy := string(serializedPolicy) - p := &s3v2.PutBucketPolicyInput{ + p := &s3.PutBucketPolicyInput{ Bucket: &bucket, ConfirmRemoveSelfBucketAccess: &confirmRemoveSelfBucketAccess, Policy: &consumablePolicy, } - out, err := s.ClientV2.PutBucketPolicy(context.TODO(), p) + out, err := s.Client.PutBucketPolicy(context.TODO(), p) if err != nil { return out, err } @@ -180,7 +180,7 @@ func (s *S3Agent) PutBucketPolicy(bucket string, policy BucketPolicy) (*s3v2.Put } func (s *S3Agent) GetBucketPolicy(bucket string) (*BucketPolicy, error) { - out, err := s.ClientV2.GetBucketPolicy(context.TODO(), &s3v2.GetBucketPolicyInput{ + out, err := s.Client.GetBucketPolicy(context.TODO(), &s3.GetBucketPolicyInput{ Bucket: &bucket, }) if err != nil { diff --git a/pkg/operator/ceph/object/s3-handlers.go b/pkg/operator/ceph/object/s3-handlers.go index c7f4ec476..ee16881f7 100644 --- a/pkg/operator/ceph/object/s3-handlers.go +++ b/pkg/operator/ceph/object/s3-handlers.go @@ -25,30 +25,25 @@ import ( "net/url" "strings" - v2aws "github.com/aws/aws-sdk-go-v2/aws" - v2creds "github.com/aws/aws-sdk-go-v2/credentials" - s3v2 "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/credentials" + "github.com/aws/aws-sdk-go-v2/service/s3" s3types "github.com/aws/aws-sdk-go-v2/service/s3/types" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/credentials" - awssession "github.com/aws/aws-sdk-go/aws/session" - "github.com/aws/aws-sdk-go/service/s3" "github.com/pkg/errors" ) // Region for aws golang sdk const CephRegion = "us-east-1" -// S3Agent wraps the s3.S3 structure to allow for wrapper methods +// S3Agent wraps the S3 client to allow for wrapper methods type S3Agent struct { - Client *s3.S3 // v1 client - ClientV2 *s3v2.Client // v2 client + Client *s3.Client } func NewS3Agent(accessKey, secretKey, endpoint string, debug bool, tlsCert []byte, insecure bool, httpClient *http.Client) (*S3Agent, error) { - logLevel := aws.LogOff + var logMode aws.ClientLogMode if debug { - logLevel = aws.LogDebug + logMode = aws.LogSigning } tlsEnabled := false @@ -64,28 +59,6 @@ func NewS3Agent(accessKey, secretKey, endpoint string, debug bool, tlsCert []byt } } - // ----------------------------- - // SDK v1 client initialization - // ----------------------------- - v1Session, err := awssession.NewSession( - aws.NewConfig(). - WithRegion(CephRegion). - WithCredentials(credentials.NewStaticCredentials(accessKey, secretKey, "")). - WithEndpoint(endpoint). - WithS3ForcePathStyle(true). - WithMaxRetries(5). - WithDisableSSL(!tlsEnabled). - WithHTTPClient(httpClient). - WithLogLevel(logLevel), - ) - if err != nil { - return nil, errors.Wrap(err, "failed to create v1 session") - } - v1Client := s3.New(v1Session) - - // ----------------------------- - // SDK v2 client initialization - // ----------------------------- scheme := "http" if tlsEnabled { scheme = "https" @@ -94,24 +67,21 @@ func NewS3Agent(accessKey, secretKey, endpoint string, debug bool, tlsCert []byt if perr != nil || (u.Scheme != "http" && u.Scheme != "https") { u, _ = url.Parse(scheme + "://" + endpoint) } - // Use the officially-supported v2 endpoint customization mechanism. - // This keeps S3's internal endpoint customizations (including hostname handling) - // consistent with the SDK's expectations, which is especially important for TLS. baseEndpoint := u.String() - v2Cfg := v2aws.Config{ + cfg := aws.Config{ Region: CephRegion, - Credentials: v2aws.NewCredentialsCache(v2creds.NewStaticCredentialsProvider(accessKey, secretKey, "")), + Credentials: aws.NewCredentialsCache(credentials.NewStaticCredentialsProvider(accessKey, secretKey, "")), HTTPClient: httpClient, BaseEndpoint: &baseEndpoint, RetryMaxAttempts: 5, - RetryMode: v2aws.RetryModeStandard, + RetryMode: aws.RetryModeStandard, + ClientLogMode: logMode, } - v2Client := s3v2.NewFromConfig(v2Cfg, func(o *s3v2.Options) { + client := s3.NewFromConfig(cfg, func(o *s3.Options) { o.UsePathStyle = true }) return &S3Agent{ - Client: v1Client, - ClientV2: v2Client, + Client: client, }, nil } @@ -132,11 +102,11 @@ func (s *S3Agent) createBucket(name string, infoLogging bool) error { logger.Debugf("creating bucket %q", name) } - input := &s3v2.CreateBucketInput{ + input := &s3.CreateBucketInput{ Bucket: &name, } - _, err := s.ClientV2.CreateBucket(context.TODO(), input) + _, err := s.Client.CreateBucket(context.TODO(), input) if err != nil { var alreadyExists *s3types.BucketAlreadyExists var alreadyOwned *s3types.BucketAlreadyOwnedByYou @@ -157,7 +127,7 @@ func (s *S3Agent) createBucket(name string, infoLogging bool) error { // DeleteBucket function deletes given bucket using s3 client func (s *S3Agent) DeleteBucket(name string) (bool, error) { - _, err := s.ClientV2.DeleteBucket(context.TODO(), &s3v2.DeleteBucketInput{ + _, err := s.Client.DeleteBucket(context.TODO(), &s3.DeleteBucketInput{ Bucket: &name, }) if err != nil { @@ -171,7 +141,7 @@ func (s *S3Agent) DeleteBucket(name string) (bool, error) { func (s *S3Agent) PutObjectInBucket(bucketname string, body string, key string, contentType string, ) (bool, error) { - _, err := s.ClientV2.PutObject(context.TODO(), &s3v2.PutObjectInput{ + _, err := s.Client.PutObject(context.TODO(), &s3.PutObjectInput{ Body: strings.NewReader(body), Bucket: &bucketname, Key: &key, @@ -186,7 +156,7 @@ func (s *S3Agent) PutObjectInBucket(bucketname string, body string, key string, // GetObjectInBucket function retrieves an object from a bucket using s3 client func (s *S3Agent) GetObjectInBucket(bucketname string, key string) (string, error) { - result, err := s.ClientV2.GetObject(context.TODO(), &s3v2.GetObjectInput{ + result, err := s.Client.GetObject(context.TODO(), &s3.GetObjectInput{ Bucket: &bucketname, Key: &key, }) @@ -205,7 +175,7 @@ func (s *S3Agent) GetObjectInBucket(bucketname string, key string) (string, erro // DeleteObjectInBucket function deletes given bucket using s3 client func (s *S3Agent) DeleteObjectInBucket(bucketname string, key string) (bool, error) { - _, err := s.ClientV2.DeleteObject(context.TODO(), &s3v2.DeleteObjectInput{ + _, err := s.Client.DeleteObject(context.TODO(), &s3.DeleteObjectInput{ Bucket: &bucketname, Key: &key, }) diff --git a/pkg/operator/ceph/object/s3-handlers_test.go b/pkg/operator/ceph/object/s3-handlers_test.go index aaf47ff26..398c466af 100644 --- a/pkg/operator/ceph/object/s3-handlers_test.go +++ b/pkg/operator/ceph/object/s3-handlers_test.go @@ -20,7 +20,7 @@ import ( "net/http" "testing" - "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go-v2/aws" "github.com/stretchr/testify/assert" ) @@ -34,34 +34,29 @@ func TestNewS3Agent(t *testing.T) { insecure := false s3Agent, err := NewS3Agent(accessKey, secretKey, endpoint, debug, nil, insecure, nil) assert.NoError(t, err) - assert.NotEqual(t, aws.LogDebug, s3Agent.Client.Config.LogLevel) - assert.Equal(t, nil, s3Agent.Client.Config.HTTPClient.Transport) - assert.True(t, *s3Agent.Client.Config.DisableSSL) - assert.NotNil(t, s3Agent.ClientV2) - assert.Equal(t, "http://endpoint", *s3Agent.ClientV2.Options().BaseEndpoint) + assert.NotNil(t, s3Agent.Client) + assert.Equal(t, "http://endpoint", *s3Agent.Client.Options().BaseEndpoint) + assert.Equal(t, aws.ClientLogMode(0), s3Agent.Client.Options().ClientLogMode) }) t.Run("test with debug without tls", func(t *testing.T) { debug := true - logLevel := aws.LogDebug insecure := false s3Agent, err := NewS3Agent(accessKey, secretKey, endpoint, debug, nil, insecure, nil) assert.NoError(t, err) - assert.Equal(t, &logLevel, s3Agent.Client.Config.LogLevel) - assert.Nil(t, s3Agent.Client.Config.HTTPClient.Transport) - assert.True(t, *s3Agent.Client.Config.DisableSSL) - assert.NotNil(t, s3Agent.ClientV2) - assert.Equal(t, "http://endpoint", *s3Agent.ClientV2.Options().BaseEndpoint) + assert.NotNil(t, s3Agent.Client) + assert.Equal(t, "http://endpoint", *s3Agent.Client.Options().BaseEndpoint) + assert.Equal(t, aws.LogSigning, s3Agent.Client.Options().ClientLogMode) }) t.Run("test without tls client cert but insecure tls", func(t *testing.T) { debug := true insecure := true s3Agent, err := NewS3Agent(accessKey, secretKey, endpoint, debug, nil, insecure, nil) assert.NoError(t, err) - assert.NotNil(t, s3Agent.Client.Config.HTTPClient.Transport.(*http.Transport).TLSClientConfig.RootCAs) // still includes sys certs - assert.True(t, s3Agent.Client.Config.HTTPClient.Transport.(*http.Transport).TLSClientConfig.InsecureSkipVerify) - assert.False(t, *s3Agent.Client.Config.DisableSSL) - assert.NotNil(t, s3Agent.ClientV2) - assert.Equal(t, "https://endpoint", *s3Agent.ClientV2.Options().BaseEndpoint) + assert.NotNil(t, s3Agent.Client) + assert.Equal(t, "https://endpoint", *s3Agent.Client.Options().BaseEndpoint) + httpClient := s3Agent.Client.Options().HTTPClient.(*http.Client) + assert.NotNil(t, httpClient.Transport.(*http.Transport).TLSClientConfig.RootCAs) + assert.True(t, httpClient.Transport.(*http.Transport).TLSClientConfig.InsecureSkipVerify) }) t.Run("test with secure tls client cert", func(t *testing.T) { debug := true @@ -69,10 +64,11 @@ func TestNewS3Agent(t *testing.T) { tlsCert := []byte("tlsCert") s3Agent, err := NewS3Agent(accessKey, secretKey, endpoint, debug, tlsCert, insecure, nil) assert.NoError(t, err) - assert.NotNil(t, s3Agent.Client.Config.HTTPClient.Transport.(*http.Transport).TLSClientConfig.RootCAs) - assert.False(t, *s3Agent.Client.Config.DisableSSL) - assert.NotNil(t, s3Agent.ClientV2) - assert.Equal(t, "https://endpoint", *s3Agent.ClientV2.Options().BaseEndpoint) + assert.NotNil(t, s3Agent.Client) + assert.Equal(t, "https://endpoint", *s3Agent.Client.Options().BaseEndpoint) + httpClient := s3Agent.Client.Options().HTTPClient.(*http.Client) + assert.NotNil(t, httpClient.Transport.(*http.Transport).TLSClientConfig.RootCAs) + assert.False(t, httpClient.Transport.(*http.Transport).TLSClientConfig.InsecureSkipVerify) }) t.Run("test with insecure tls client cert", func(t *testing.T) { debug := true @@ -80,15 +76,14 @@ func TestNewS3Agent(t *testing.T) { tlsCert := []byte("tlsCert") s3Agent, err := NewS3Agent(accessKey, secretKey, endpoint, debug, tlsCert, insecure, nil) assert.NoError(t, err) - assert.NotNil(t, s3Agent.Client.Config.HTTPClient.Transport) - assert.True(t, s3Agent.Client.Config.HTTPClient.Transport.(*http.Transport).TLSClientConfig.InsecureSkipVerify) - assert.False(t, *s3Agent.Client.Config.DisableSSL) - assert.NotNil(t, s3Agent.ClientV2) - assert.Equal(t, "https://endpoint", *s3Agent.ClientV2.Options().BaseEndpoint) + assert.NotNil(t, s3Agent.Client) + assert.Equal(t, "https://endpoint", *s3Agent.Client.Options().BaseEndpoint) + httpClient := s3Agent.Client.Options().HTTPClient.(*http.Client) + assert.NotNil(t, httpClient.Transport) + assert.True(t, httpClient.Transport.(*http.Transport).TLSClientConfig.InsecureSkipVerify) }) t.Run("test with custom http.Client", func(t *testing.T) { debug := true - logLevel := aws.LogDebug insecure := false httpClient := &http.Client{ Transport: &http.Transport{ @@ -99,32 +94,30 @@ func TestNewS3Agent(t *testing.T) { } s3Agent, err := NewS3Agent(accessKey, secretKey, endpoint, debug, nil, insecure, httpClient) assert.NoError(t, err) - assert.Equal(t, &logLevel, s3Agent.Client.Config.LogLevel) - assert.NotNil(t, s3Agent.Client.Config.HTTPClient.Transport) - assert.True(t, *s3Agent.Client.Config.DisableSSL) - transport := s3Agent.Client.Config.HTTPClient.Transport - assert.Equal(t, 7, transport.(*http.Transport).MaxIdleConns) - assert.Equal(t, 13, transport.(*http.Transport).MaxIdleConnsPerHost) - assert.Equal(t, 17, transport.(*http.Transport).MaxConnsPerHost) - assert.NotNil(t, s3Agent.ClientV2) - assert.Equal(t, "http://endpoint", *s3Agent.ClientV2.Options().BaseEndpoint) + assert.NotNil(t, s3Agent.Client) + assert.Equal(t, "http://endpoint", *s3Agent.Client.Options().BaseEndpoint) + resolvedClient := s3Agent.Client.Options().HTTPClient.(*http.Client) + transport := resolvedClient.Transport.(*http.Transport) + assert.Equal(t, 7, transport.MaxIdleConns) + assert.Equal(t, 13, transport.MaxIdleConnsPerHost) + assert.Equal(t, 17, transport.MaxConnsPerHost) }) - t.Run("v2 endpoint with host:port for TLS", func(t *testing.T) { + t.Run("endpoint with host:port for TLS", func(t *testing.T) { ep := "rook-ceph-rgw-store.test-ns.svc:443" s3Agent, err := NewS3Agent(accessKey, secretKey, ep, false, nil, true, nil) assert.NoError(t, err) - assert.Equal(t, "https://rook-ceph-rgw-store.test-ns.svc:443", *s3Agent.ClientV2.Options().BaseEndpoint) + assert.Equal(t, "https://rook-ceph-rgw-store.test-ns.svc:443", *s3Agent.Client.Options().BaseEndpoint) }) - t.Run("v2 endpoint with host:port without TLS", func(t *testing.T) { + t.Run("endpoint with host:port without TLS", func(t *testing.T) { ep := "rook-ceph-rgw-store.test-ns.svc:80" s3Agent, err := NewS3Agent(accessKey, secretKey, ep, false, nil, false, nil) assert.NoError(t, err) - assert.Equal(t, "http://rook-ceph-rgw-store.test-ns.svc:80", *s3Agent.ClientV2.Options().BaseEndpoint) + assert.Equal(t, "http://rook-ceph-rgw-store.test-ns.svc:80", *s3Agent.Client.Options().BaseEndpoint) }) - t.Run("v2 endpoint with full URL", func(t *testing.T) { + t.Run("endpoint with full URL", func(t *testing.T) { ep := "https://rook-ceph-rgw-store.test-ns.svc:443" s3Agent, err := NewS3Agent(accessKey, secretKey, ep, false, nil, true, nil) assert.NoError(t, err) - assert.Equal(t, "https://rook-ceph-rgw-store.test-ns.svc:443", *s3Agent.ClientV2.Options().BaseEndpoint) + assert.Equal(t, "https://rook-ceph-rgw-store.test-ns.svc:443", *s3Agent.Client.Options().BaseEndpoint) }) } diff --git a/tests/framework/clients/bucket.go b/tests/framework/clients/bucket.go index 51e8f147b..688ee04fa 100644 --- a/tests/framework/clients/bucket.go +++ b/tests/framework/clients/bucket.go @@ -21,7 +21,7 @@ import ( b64 "encoding/base64" "fmt" - s3v2 "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/aws/aws-sdk-go-v2/service/s3" bktv1alpha1 "github.com/kube-object-storage/lib-bucket-provisioner/pkg/apis/objectbucket.io/v1alpha1" rgw "github.com/rook/rook/pkg/operator/ceph/object" "github.com/rook/rook/tests/framework/installer" @@ -163,7 +163,7 @@ func (b *BucketOperation) CheckBucketNotificationSetonRGW(namespace, storeName, return false } logger.Infof("endpoint (%s) Accesskey (%s) secret (%s)", s3endpoint, s3AccessKey, s3SecretKey) - notifications, err := s3client.ClientV2.GetBucketNotificationConfiguration(context.TODO(), &s3v2.GetBucketNotificationConfigurationInput{ + notifications, err := s3client.Client.GetBucketNotificationConfiguration(context.TODO(), &s3.GetBucketNotificationConfigurationInput{ Bucket: &bucketname, }) if err != nil { diff --git a/tests/integration/ceph_object_test.go b/tests/integration/ceph_object_test.go index 71f38732e..e7a9f2287 100644 --- a/tests/integration/ceph_object_test.go +++ b/tests/integration/ceph_object_test.go @@ -19,20 +19,23 @@ package integration import ( "context" "encoding/json" + "errors" "fmt" "strings" "testing" "time" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/service/s3" + "github.com/aws/aws-sdk-go-v2/service/s3" + s3types "github.com/aws/aws-sdk-go-v2/service/s3/types" + smithy "github.com/aws/smithy-go" "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" "github.com/kube-object-storage/lib-bucket-provisioner/pkg/apis/objectbucket.io/v1alpha1" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" + k8serrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1" @@ -56,6 +59,20 @@ const ( var objectStoreServicePrefix = "rook-ceph-rgw-" +var lifecycleCmpOpts = cmp.Options{ + cmpopts.IgnoreUnexported( + s3types.LifecycleRule{}, + s3types.LifecycleExpiration{}, + s3types.LifecycleRuleFilter{}, + s3types.LifecycleRuleAndOperator{}, + s3types.AbortIncompleteMultipartUpload{}, + s3types.NoncurrentVersionExpiration{}, + s3types.NoncurrentVersionTransition{}, + s3types.Transition{}, + s3types.Tag{}, + ), +} + func TestCephObjectSuite(t *testing.T) { s := new(ObjectSuite) defer func(s *ObjectSuite) { @@ -116,7 +133,7 @@ func (s *ObjectSuite) TestWithTLS() { func cleanUpTLS(s *ObjectSuite) { err := s.k8sh.Clientset.CoreV1().Secrets(s.settings.Namespace).Delete(context.TODO(), objectTLSSecretName, metav1.DeleteOptions{}) if err != nil { - if !errors.IsNotFound(err) { + if !k8serrors.IsNotFound(err) { logger.Fatal("failed to deleted store TLS secret") } } @@ -604,7 +621,7 @@ func testObjectStoreOperations(s *suite.Suite, helper *clients.TestClient, k8sh }) t.Run("policy was applied verbatim to bucket", func(t *testing.T) { - policyResp, err := s3client.Client.GetBucketPolicy(&s3.GetBucketPolicyInput{ + policyResp, err := s3client.Client.GetBucketPolicy(ctx, &s3.GetBucketPolicyInput{ Bucket: &bucketName, }) require.NoError(t, err) @@ -651,7 +668,7 @@ func testObjectStoreOperations(s *suite.Suite, helper *clients.TestClient, k8sh t.Run("policy update applied verbatim to bucket", func(t *testing.T) { var livePolicy string utils.Retry(20, time.Second, "policy changed", func() bool { - policyResp, err := s3client.Client.GetBucketPolicy(&s3.GetBucketPolicyInput{ + policyResp, err := s3client.Client.GetBucketPolicy(ctx, &s3.GetBucketPolicyInput{ Bucket: &bucketName, }) if err != nil { @@ -704,15 +721,15 @@ func testObjectStoreOperations(s *suite.Suite, helper *clients.TestClient, k8sh t.Run("policy was removed from bucket", func(t *testing.T) { var err error utils.Retry(20, time.Second, "policy is gone", func() bool { - _, err = s3client.Client.GetBucketPolicy(&s3.GetBucketPolicyInput{ + _, err = s3client.Client.GetBucketPolicy(ctx, &s3.GetBucketPolicyInput{ Bucket: &bucketName, }) return err != nil }) require.Error(t, err) - require.Implements(t, (*awserr.Error)(nil), err) - aerr, _ := err.(awserr.Error) - assert.Equal(t, aerr.Code(), "NoSuchBucketPolicy") + var apiErr smithy.APIError + require.True(t, errors.As(err, &apiErr)) + assert.Equal(t, "NoSuchBucketPolicy", apiErr.ErrorCode()) }) t.Run("delete bucket", func(t *testing.T) { @@ -839,16 +856,16 @@ func testObjectStoreOperations(s *suite.Suite, helper *clients.TestClient, k8sh }) t.Run("lifecycle was applied verbatim to bucket", func(t *testing.T) { - liveLc, err := s3client.Client.GetBucketLifecycleConfiguration(&s3.GetBucketLifecycleConfigurationInput{ + liveLc, err := s3client.Client.GetBucketLifecycleConfiguration(ctx, &s3.GetBucketLifecycleConfigurationInput{ Bucket: &bucketName, }) require.NoError(t, err) - confLc := &s3.GetBucketLifecycleConfigurationOutput{} + confLc := &s3types.BucketLifecycleConfiguration{} err = json.Unmarshal([]byte(bucketLifecycle1), confLc) require.NoError(t, err) - assert.Equal(t, confLc, liveLc) + assert.True(t, cmp.Equal(confLc.Rules, liveLc.Rules, lifecycleCmpOpts...), cmp.Diff(confLc.Rules, liveLc.Rules, lifecycleCmpOpts...)) }) t.Run("update obc bucketLifecycle", func(t *testing.T) { @@ -891,21 +908,21 @@ func testObjectStoreOperations(s *suite.Suite, helper *clients.TestClient, k8sh t.Run("lifecycle update applied verbatim to bucket", func(t *testing.T) { var liveLc *s3.GetBucketLifecycleConfigurationOutput - confLc := &s3.GetBucketLifecycleConfigurationOutput{} + confLc := &s3types.BucketLifecycleConfiguration{} err = json.Unmarshal([]byte(bucketLifecycle2), confLc) require.NoError(t, err) utils.Retry(20, time.Second, "lifecycle changed", func() bool { - liveLc, err = s3client.Client.GetBucketLifecycleConfiguration(&s3.GetBucketLifecycleConfigurationInput{ + liveLc, err = s3client.Client.GetBucketLifecycleConfiguration(ctx, &s3.GetBucketLifecycleConfigurationInput{ Bucket: &bucketName, }) if err != nil { return false } - return cmp.Equal(confLc, liveLc) + return cmp.Equal(confLc.Rules, liveLc.Rules, lifecycleCmpOpts...) }) - assert.Equal(t, confLc, liveLc) + assert.True(t, cmp.Equal(confLc.Rules, liveLc.Rules, lifecycleCmpOpts...), cmp.Diff(confLc.Rules, liveLc.Rules, lifecycleCmpOpts...)) }) t.Run("remove obc bucketLifecycle", func(t *testing.T) { @@ -955,18 +972,19 @@ func testObjectStoreOperations(s *suite.Suite, helper *clients.TestClient, k8sh t.Skip("Waiting for rgw fix from regression in v19.2.3") } utils.Retry(20, time.Second, "lifecycle is gone", func() bool { - _, err = s3client.Client.GetBucketLifecycleConfiguration(&s3.GetBucketLifecycleConfigurationInput{ + _, err = s3client.Client.GetBucketLifecycleConfiguration(ctx, &s3.GetBucketLifecycleConfigurationInput{ Bucket: &bucketName, }) - if aerr, ok := err.(awserr.Error); ok { - return aerr.Code() == "NoSuchLifecycleConfiguration" + var apiErr smithy.APIError + if errors.As(err, &apiErr) { + return apiErr.ErrorCode() == "NoSuchLifecycleConfiguration" } return false }) require.Error(t, err) - require.Implements(t, (*awserr.Error)(nil), err) - aerr, _ := err.(awserr.Error) - assert.Equal(t, aerr.Code(), "NoSuchLifecycleConfiguration") + var apiErr smithy.APIError + require.True(t, errors.As(err, &apiErr)) + assert.Equal(t, "NoSuchLifecycleConfiguration", apiErr.ErrorCode()) }) t.Run("delete bucket", func(t *testing.T) {