Skip to content

Commit 9d7b25e

Browse files
authored
Add new s3 example for SAP ABAP examples (#7876)
* adding metadata updates for iot data plane and iam * s3 metadata added
1 parent 98f2df5 commit 9d7b25e

4 files changed

Lines changed: 240 additions & 61 deletions

File tree

.doc_gen/metadata/s3_metadata.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2462,6 +2462,14 @@ s3_ListBuckets:
24622462
snippet_tags:
24632463
- s3.swift.import
24642464
- s3.swift.listbuckets.ListBuckets
2465+
SAP ABAP:
2466+
versions:
2467+
- sdk_version: 1
2468+
github: sap-abap/services/s3
2469+
excerpts:
2470+
- description:
2471+
snippet_tags:
2472+
- s3.abapv1.list_buckets
24652473
services:
24662474
s3: {ListBuckets}
24672475
s3_PutObjectAcl:

sap-abap/services/s3/#awsex#cl_s3_actions.clas.abap

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,10 @@ CLASS /awsex/cl_s3_actions DEFINITION
176176
EXPORTING
177177
!oo_result TYPE REF TO /aws1/cl_s3_headbucketoutput
178178
RAISING /aws1/cx_rt_generic.
179+
METHODS list_buckets
180+
EXPORTING
181+
!oo_result TYPE REF TO /aws1/cl_s3_listbucketsoutput
182+
RAISING /aws1/cx_rt_generic.
179183
PROTECTED SECTION.
180184
PRIVATE SECTION.
181185
ENDCLASS.
@@ -815,4 +819,23 @@ CLASS /AWSEX/CL_S3_ACTIONS IMPLEMENTATION.
815819
ENDTRY.
816820
" snippet-end:[s3.abapv1.head_bucket]
817821
ENDMETHOD.
822+
823+
824+
METHOD list_buckets.
825+
CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'.
826+
827+
DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ).
828+
DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ).
829+
830+
" snippet-start:[s3.abapv1.list_buckets]
831+
TRY.
832+
oo_result = lo_s3->listbuckets( " oo_result is returned for testing purposes. "
833+
).
834+
DATA(lv_bucket_count) = lines( oo_result->get_buckets( ) ).
835+
MESSAGE |Retrieved { lv_bucket_count } buckets in all regions.| TYPE 'I'.
836+
CATCH /aws1/cx_rt_generic.
837+
MESSAGE 'Unable to list buckets.' TYPE 'E'.
838+
ENDTRY.
839+
" snippet-end:[s3.abapv1.list_buckets]
840+
ENDMETHOD.
818841
ENDCLASS.

sap-abap/services/s3/#awsex#cl_s3_actions.clas.testclasses.abap

Lines changed: 179 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ CLASS ltc_awsex_cl_s3_actions DEFINITION FOR TESTING DURATION SHORT RISK LEVEL D
4949
put_object_legal_hold FOR TESTING RAISING /aws1/cx_rt_generic,
5050
put_object_retention FOR TESTING RAISING /aws1/cx_rt_generic,
5151
get_object_lock_conf FOR TESTING RAISING /aws1/cx_rt_generic,
52-
put_object_lock_conf FOR TESTING RAISING /aws1/cx_rt_generic.
52+
put_object_lock_conf FOR TESTING RAISING /aws1/cx_rt_generic,
53+
list_buckets FOR TESTING RAISING /aws1/cx_rt_generic.
5354

5455
CLASS-METHODS class_setup RAISING /aws1/cx_rt_generic /awsex/cx_generic.
5556
CLASS-METHODS class_teardown RAISING /aws1/cx_rt_generic /awsex/cx_generic.
@@ -459,6 +460,8 @@ CLASS ltc_awsex_cl_s3_actions IMPLEMENTATION.
459460
DATA lt_cors_rules TYPE /aws1/cl_s3_corsrule=>tt_corsrules.
460461
DATA lt_methods TYPE /aws1/cl_s3_allowedmethods_w=>tt_allowedmethods.
461462
DATA lt_origins TYPE /aws1/cl_s3_allowedorigins_w=>tt_allowedorigins.
463+
DATA lv_retry TYPE i.
464+
DATA lv_cors_set TYPE abap_bool VALUE abap_false.
462465

463466
APPEND NEW /aws1/cl_s3_allowedmethods_w( iv_value = 'GET' ) TO lt_methods.
464467
APPEND NEW /aws1/cl_s3_allowedorigins_w( iv_value = '*' ) TO lt_origins.
@@ -467,30 +470,73 @@ CLASS ltc_awsex_cl_s3_actions IMPLEMENTATION.
467470
it_allowedmethods = lt_methods
468471
it_allowedorigins = lt_origins ) TO lt_cors_rules.
469472

470-
ao_s3->putbucketcors(
471-
iv_bucket = av_bucket
472-
io_corsconfiguration = NEW /aws1/cl_s3_corsconfiguration( it_corsrules = lt_cors_rules ) ).
473+
" Set CORS configuration and retry if needed
474+
DO 3 TIMES.
475+
lv_retry = sy-index.
476+
TRY.
477+
ao_s3->putbucketcors(
478+
iv_bucket = av_bucket
479+
io_corsconfiguration = NEW /aws1/cl_s3_corsconfiguration( it_corsrules = lt_cors_rules ) ).
480+
481+
" Wait for CORS configuration to propagate
482+
WAIT UP TO 2 SECONDS.
483+
484+
" Verify CORS was set by reading it back
485+
DATA(lo_verify) = ao_s3->getbucketcors( iv_bucket = av_bucket ).
486+
IF lo_verify IS BOUND AND lo_verify->get_corsrules( ) IS NOT INITIAL.
487+
lv_cors_set = abap_true.
488+
EXIT.
489+
ENDIF.
490+
491+
CATCH /aws1/cx_s3_clientexc INTO DATA(lo_setup_ex).
492+
" Retry on client exception
493+
IF lv_retry = 3.
494+
cl_abap_unit_assert=>fail( msg = |Failed to set CORS configuration after 3 attempts: { lo_setup_ex->get_text( ) }| ).
495+
ENDIF.
496+
WAIT UP TO 1 SECONDS.
497+
ENDTRY.
498+
ENDDO.
473499

474-
" Now test getting the CORS configuration
500+
" Verify CORS was successfully set
501+
cl_abap_unit_assert=>assert_true(
502+
act = lv_cors_set
503+
msg = |CORS configuration was not set after 3 attempts| ).
504+
505+
" Now test getting the CORS configuration using the action method
475506
DATA lo_result TYPE REF TO /aws1/cl_s3_getbktcorsoutput.
476-
ao_s3_actions->get_bucket_cors(
477-
EXPORTING
478-
iv_bucket_name = av_bucket
479-
IMPORTING
480-
oo_result = lo_result ).
507+
TRY.
508+
ao_s3_actions->get_bucket_cors(
509+
EXPORTING
510+
iv_bucket_name = av_bucket
511+
IMPORTING
512+
oo_result = lo_result ).
481513

482-
cl_abap_unit_assert=>assert_bound(
483-
act = lo_result
484-
msg = |Could not get bucket CORS configuration| ).
514+
cl_abap_unit_assert=>assert_bound(
515+
act = lo_result
516+
msg = |Could not get bucket CORS configuration| ).
517+
518+
cl_abap_unit_assert=>assert_not_initial(
519+
act = lo_result->get_corsrules( )
520+
msg = |CORS rules are empty| ).
521+
522+
CATCH /aws1/cx_s3_clientexc INTO DATA(lo_ex).
523+
cl_abap_unit_assert=>fail( msg = |CORS configuration test failed: { lo_ex->get_text( ) }| ).
524+
ENDTRY.
485525

486526
" Cleanup
487-
ao_s3->deletebucketcors( iv_bucket = av_bucket ).
527+
TRY.
528+
ao_s3->deletebucketcors( iv_bucket = av_bucket ).
529+
CATCH /aws1/cx_rt_generic.
530+
" Ignore cleanup errors
531+
ENDTRY.
488532
ENDMETHOD.
489533

490534
METHOD put_bucket_cors.
491535
DATA lt_cors_rules TYPE /aws1/cl_s3_corsrule=>tt_corsrules.
492536
DATA lt_methods TYPE /aws1/cl_s3_allowedmethods_w=>tt_allowedmethods.
493537
DATA lt_origins TYPE /aws1/cl_s3_allowedorigins_w=>tt_allowedorigins.
538+
DATA lv_retry TYPE i.
539+
DATA lv_cors_set TYPE abap_bool VALUE abap_false.
494540

495541
APPEND NEW /aws1/cl_s3_allowedmethods_w( iv_value = 'PUT' ) TO lt_methods.
496542
APPEND NEW /aws1/cl_s3_allowedmethods_w( iv_value = 'POST' ) TO lt_methods.
@@ -501,18 +547,54 @@ CLASS ltc_awsex_cl_s3_actions IMPLEMENTATION.
501547
it_allowedmethods = lt_methods
502548
it_allowedorigins = lt_origins ) TO lt_cors_rules.
503549

504-
ao_s3_actions->put_bucket_cors(
505-
iv_bucket_name = av_bucket
506-
it_cors_rules = lt_cors_rules ).
550+
" Set CORS configuration with retry logic
551+
DO 3 TIMES.
552+
lv_retry = sy-index.
553+
TRY.
554+
ao_s3_actions->put_bucket_cors(
555+
iv_bucket_name = av_bucket
556+
it_cors_rules = lt_cors_rules ).
507557

508-
" Verify CORS was set
509-
DATA(lo_cors) = ao_s3->getbucketcors( iv_bucket = av_bucket ).
510-
cl_abap_unit_assert=>assert_not_initial(
511-
act = lo_cors->get_corsrules( )
512-
msg = |CORS configuration was not set| ).
558+
" Wait for CORS configuration to propagate
559+
WAIT UP TO 2 SECONDS.
560+
561+
" Verify CORS was set by reading it back
562+
DATA(lo_cors) = ao_s3->getbucketcors( iv_bucket = av_bucket ).
563+
IF lo_cors IS BOUND AND lo_cors->get_corsrules( ) IS NOT INITIAL.
564+
lv_cors_set = abap_true.
565+
EXIT.
566+
ENDIF.
567+
568+
CATCH /aws1/cx_s3_clientexc INTO DATA(lo_ex).
569+
" Retry on client exception
570+
IF lv_retry = 3.
571+
cl_abap_unit_assert=>fail( msg = |Failed to set CORS configuration after 3 attempts: { lo_ex->get_text( ) }| ).
572+
ENDIF.
573+
WAIT UP TO 1 SECONDS.
574+
ENDTRY.
575+
ENDDO.
576+
577+
" Verify CORS was successfully set
578+
cl_abap_unit_assert=>assert_true(
579+
act = lv_cors_set
580+
msg = |CORS configuration was not set after 3 attempts| ).
581+
582+
" Verify the CORS rules content
583+
TRY.
584+
DATA(lo_verify) = ao_s3->getbucketcors( iv_bucket = av_bucket ).
585+
cl_abap_unit_assert=>assert_not_initial(
586+
act = lo_verify->get_corsrules( )
587+
msg = |CORS configuration rules are empty| ).
588+
CATCH /aws1/cx_s3_clientexc INTO DATA(lo_verify_ex).
589+
cl_abap_unit_assert=>fail( msg = |Could not verify CORS configuration: { lo_verify_ex->get_text( ) }| ).
590+
ENDTRY.
513591

514592
" Cleanup
515-
ao_s3->deletebucketcors( iv_bucket = av_bucket ).
593+
TRY.
594+
ao_s3->deletebucketcors( iv_bucket = av_bucket ).
595+
CATCH /aws1/cx_rt_generic.
596+
" Ignore cleanup errors
597+
ENDTRY.
516598
ENDMETHOD.
517599

518600
METHOD delete_bucket_cors.
@@ -679,24 +761,63 @@ CLASS ltc_awsex_cl_s3_actions IMPLEMENTATION.
679761

680762
METHOD put_bucket_lifecycle_conf.
681763
DATA lt_rules TYPE /aws1/cl_s3_lifecyclerule=>tt_lifecyclerules.
764+
DATA lv_retry TYPE i.
765+
DATA lv_lifecycle_set TYPE abap_bool VALUE abap_false.
766+
682767
APPEND NEW /aws1/cl_s3_lifecyclerule(
683768
iv_id = 'TestRule'
684769
iv_status = 'Enabled'
685770
io_filter = NEW /aws1/cl_s3_lcrulefilter( iv_prefix = 'archive/' )
686771
io_expiration = NEW /aws1/cl_s3_lifecycleexpir( iv_days = 60 ) ) TO lt_rules.
687772

688-
ao_s3_actions->put_bucket_lifecycle_conf(
689-
iv_bucket_name = av_bucket
690-
it_lifecycle_rule = lt_rules ).
773+
" Set lifecycle configuration with retry logic
774+
DO 3 TIMES.
775+
lv_retry = sy-index.
776+
TRY.
777+
ao_s3_actions->put_bucket_lifecycle_conf(
778+
iv_bucket_name = av_bucket
779+
it_lifecycle_rule = lt_rules ).
691780

692-
" Verify lifecycle was set
693-
DATA(lo_lc) = ao_s3->getbucketlifecycleconf( iv_bucket = av_bucket ).
694-
cl_abap_unit_assert=>assert_not_initial(
695-
act = lo_lc->get_rules( )
696-
msg = |Lifecycle configuration was not set| ).
781+
" Wait for lifecycle configuration to propagate
782+
WAIT UP TO 2 SECONDS.
783+
784+
" Verify lifecycle was set by reading it back
785+
DATA(lo_lc) = ao_s3->getbucketlifecycleconf( iv_bucket = av_bucket ).
786+
IF lo_lc IS BOUND AND lo_lc->get_rules( ) IS NOT INITIAL.
787+
lv_lifecycle_set = abap_true.
788+
EXIT.
789+
ENDIF.
790+
791+
CATCH /aws1/cx_s3_clientexc INTO DATA(lo_ex).
792+
" Retry on client exception
793+
IF lv_retry = 3.
794+
cl_abap_unit_assert=>fail( msg = |Failed to set lifecycle configuration after 3 attempts: { lo_ex->get_text( ) }| ).
795+
ENDIF.
796+
WAIT UP TO 1 SECONDS.
797+
ENDTRY.
798+
ENDDO.
799+
800+
" Verify lifecycle was successfully set
801+
cl_abap_unit_assert=>assert_true(
802+
act = lv_lifecycle_set
803+
msg = |Lifecycle configuration was not set after 3 attempts| ).
804+
805+
" Verify the rules content
806+
TRY.
807+
DATA(lo_verify) = ao_s3->getbucketlifecycleconf( iv_bucket = av_bucket ).
808+
cl_abap_unit_assert=>assert_not_initial(
809+
act = lo_verify->get_rules( )
810+
msg = |Lifecycle configuration rules are empty| ).
811+
CATCH /aws1/cx_s3_clientexc INTO DATA(lo_verify_ex).
812+
cl_abap_unit_assert=>fail( msg = |Could not verify lifecycle configuration: { lo_verify_ex->get_text( ) }| ).
813+
ENDTRY.
697814

698815
" Cleanup
699-
ao_s3->deletebucketlifecycle( iv_bucket = av_bucket ).
816+
TRY.
817+
ao_s3->deletebucketlifecycle( iv_bucket = av_bucket ).
818+
CATCH /aws1/cx_rt_generic.
819+
" Ignore cleanup errors
820+
ENDTRY.
700821
ENDMETHOD.
701822

702823
METHOD delete_bucket_lifecycle.
@@ -1103,4 +1224,30 @@ CLASS ltc_awsex_cl_s3_actions IMPLEMENTATION.
11031224
ENDTRY.
11041225
ENDMETHOD.
11051226

1227+
METHOD list_buckets.
1228+
DATA lo_result TYPE REF TO /aws1/cl_s3_listbucketsoutput.
1229+
1230+
ao_s3_actions->list_buckets(
1231+
IMPORTING
1232+
oo_result = lo_result ).
1233+
1234+
" Verify we got buckets back
1235+
cl_abap_unit_assert=>assert_bound(
1236+
act = lo_result
1237+
msg = |Could not list buckets| ).
1238+
1239+
" Verify that our test buckets are in the list
1240+
DATA(lv_found_bucket) = abap_false.
1241+
LOOP AT lo_result->get_buckets( ) INTO DATA(lo_bucket).
1242+
IF lo_bucket->get_name( ) = av_bucket.
1243+
lv_found_bucket = abap_true.
1244+
EXIT.
1245+
ENDIF.
1246+
ENDLOOP.
1247+
1248+
cl_abap_unit_assert=>assert_true(
1249+
act = lv_found_bucket
1250+
msg = |Test bucket { av_bucket } not found in bucket list| ).
1251+
ENDMETHOD.
1252+
11061253
ENDCLASS.

sap-abap/services/s3/README.md

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -40,35 +40,36 @@ Code examples that show you how to perform the essential operations within a ser
4040

4141
Code excerpts that show you how to call individual service functions.
4242

43-
- [CopyObject](%23awsex%23cl_s3_actions.clas.abap#L194)
44-
- [CreateBucket](%23awsex%23cl_s3_actions.clas.abap#L217)
45-
- [DeleteBucket](%23awsex%23cl_s3_actions.clas.abap#L250)
46-
- [DeleteBucketCors](%23awsex%23cl_s3_actions.clas.abap#L475)
47-
- [DeleteBucketLifecycle](%23awsex%23cl_s3_actions.clas.abap#L590)
48-
- [DeleteBucketPolicy](%23awsex%23cl_s3_actions.clas.abap#L533)
49-
- [DeleteObject](%23awsex%23cl_s3_actions.clas.abap#L270)
50-
- [DeleteObjects](%23awsex%23cl_s3_actions.clas.abap#L378)
51-
- [GetBucketAcl](%23awsex%23cl_s3_actions.clas.abap#L397)
52-
- [GetBucketCors](%23awsex%23cl_s3_actions.clas.abap#L436)
53-
- [GetBucketLifecycleConfiguration](%23awsex%23cl_s3_actions.clas.abap#L551)
54-
- [GetBucketPolicy](%23awsex%23cl_s3_actions.clas.abap#L493)
55-
- [GetObject](%23awsex%23cl_s3_actions.clas.abap#L289)
56-
- [GetObjectAcl](%23awsex%23cl_s3_actions.clas.abap#L608)
57-
- [GetObjectLegalHold](%23awsex%23cl_s3_actions.clas.abap#L653)
58-
- [GetObjectLockConfiguration](%23awsex%23cl_s3_actions.clas.abap#L727)
59-
- [HeadBucket](%23awsex%23cl_s3_actions.clas.abap#L808)
60-
- [ListObjectVersions](%23awsex%23cl_s3_actions.clas.abap#L789)
61-
- [ListObjectsV2](%23awsex%23cl_s3_actions.clas.abap#L330)
62-
- [PutBucketAcl](%23awsex%23cl_s3_actions.clas.abap#L415)
63-
- [PutBucketCors](%23awsex%23cl_s3_actions.clas.abap#L454)
64-
- [PutBucketLifecycleConfiguration](%23awsex%23cl_s3_actions.clas.abap#L569)
65-
- [PutBucketPolicy](%23awsex%23cl_s3_actions.clas.abap#L512)
66-
- [PutBucketVersioning](%23awsex%23cl_s3_actions.clas.abap#L767)
67-
- [PutObject](%23awsex%23cl_s3_actions.clas.abap#L349)
68-
- [PutObjectAcl](%23awsex%23cl_s3_actions.clas.abap#L629)
69-
- [PutObjectLegalHold](%23awsex%23cl_s3_actions.clas.abap#L674)
70-
- [PutObjectLockConfiguration](%23awsex%23cl_s3_actions.clas.abap#L745)
71-
- [PutObjectRetention](%23awsex%23cl_s3_actions.clas.abap#L699)
43+
- [CopyObject](%23awsex%23cl_s3_actions.clas.abap#L198)
44+
- [CreateBucket](%23awsex%23cl_s3_actions.clas.abap#L221)
45+
- [DeleteBucket](%23awsex%23cl_s3_actions.clas.abap#L254)
46+
- [DeleteBucketCors](%23awsex%23cl_s3_actions.clas.abap#L479)
47+
- [DeleteBucketLifecycle](%23awsex%23cl_s3_actions.clas.abap#L594)
48+
- [DeleteBucketPolicy](%23awsex%23cl_s3_actions.clas.abap#L537)
49+
- [DeleteObject](%23awsex%23cl_s3_actions.clas.abap#L274)
50+
- [DeleteObjects](%23awsex%23cl_s3_actions.clas.abap#L382)
51+
- [GetBucketAcl](%23awsex%23cl_s3_actions.clas.abap#L401)
52+
- [GetBucketCors](%23awsex%23cl_s3_actions.clas.abap#L440)
53+
- [GetBucketLifecycleConfiguration](%23awsex%23cl_s3_actions.clas.abap#L555)
54+
- [GetBucketPolicy](%23awsex%23cl_s3_actions.clas.abap#L497)
55+
- [GetObject](%23awsex%23cl_s3_actions.clas.abap#L293)
56+
- [GetObjectAcl](%23awsex%23cl_s3_actions.clas.abap#L612)
57+
- [GetObjectLegalHold](%23awsex%23cl_s3_actions.clas.abap#L657)
58+
- [GetObjectLockConfiguration](%23awsex%23cl_s3_actions.clas.abap#L731)
59+
- [HeadBucket](%23awsex%23cl_s3_actions.clas.abap#L812)
60+
- [ListBuckets](%23awsex%23cl_s3_actions.clas.abap#L830)
61+
- [ListObjectVersions](%23awsex%23cl_s3_actions.clas.abap#L793)
62+
- [ListObjectsV2](%23awsex%23cl_s3_actions.clas.abap#L334)
63+
- [PutBucketAcl](%23awsex%23cl_s3_actions.clas.abap#L419)
64+
- [PutBucketCors](%23awsex%23cl_s3_actions.clas.abap#L458)
65+
- [PutBucketLifecycleConfiguration](%23awsex%23cl_s3_actions.clas.abap#L573)
66+
- [PutBucketPolicy](%23awsex%23cl_s3_actions.clas.abap#L516)
67+
- [PutBucketVersioning](%23awsex%23cl_s3_actions.clas.abap#L771)
68+
- [PutObject](%23awsex%23cl_s3_actions.clas.abap#L353)
69+
- [PutObjectAcl](%23awsex%23cl_s3_actions.clas.abap#L633)
70+
- [PutObjectLegalHold](%23awsex%23cl_s3_actions.clas.abap#L678)
71+
- [PutObjectLockConfiguration](%23awsex%23cl_s3_actions.clas.abap#L749)
72+
- [PutObjectRetention](%23awsex%23cl_s3_actions.clas.abap#L703)
7273

7374
### Scenarios
7475

0 commit comments

Comments
 (0)