From 11e3e4b9419b48ff468146fc77809df3a585ee6e Mon Sep 17 00:00:00 2001 From: dpkaraje Date: Mon, 27 Oct 2025 06:59:33 +0000 Subject: [PATCH 01/11] remove z code and update service names to use TLAs --- .../bdr/zcl_aws1_bdr_actions.clas.abap | 296 -- ...zcl_aws1_bdr_actions.clas.testclasses.abap | 62 - .../bdr/zcl_aws1_bdr_actions.clas.xml | 202 -- .../bdz/zcl_aws1_bdz_actions.clas.abap | 82 - ...zcl_aws1_bdz_actions.clas.testclasses.abap | 154 -- .../bdz/zcl_aws1_bdz_actions.clas.xml | 17 - sap-abap/services/cloudwatch/package.devc.xml | 10 - .../cloudwatch/zcl_aws1_cwt_actions.clas.abap | 191 -- ...zcl_aws1_cwt_actions.clas.testclasses.abap | 574 ---- .../cloudwatch/zcl_aws1_cwt_actions.clas.xml | 49 - .../zcl_aws1_cwt_scenario.clas.abap | 110 - ...cl_aws1_cwt_scenario.clas.testclasses.abap | 122 - .../cloudwatch/zcl_aws1_cwt_scenario.clas.xml | 24 - .../cpd/zcl_aws1_cpd_actions.clas.abap | 47 - ...zcl_aws1_cpd_actions.clas.testclasses.abap | 37 - .../cpd/zcl_aws1_cpd_actions.clas.xml | 17 - .../services/{cloudwatch => cwt}/README.md | 0 .../dyn/zcl_aws1_dyn_actions.clas.abap | 354 --- ...zcl_aws1_dyn_actions.clas.testclasses.abap | 344 --- .../dyn/zcl_aws1_dyn_actions.clas.xml | 69 - .../dyn/zcl_aws1_dyn_scenario.clas.abap | 216 -- ...cl_aws1_dyn_scenario.clas.testclasses.abap | 54 - .../dyn/zcl_aws1_dyn_scenario.clas.xml | 24 - .../ec2/zcl_aws1_ec2_actions.clas.abap | 540 ---- ...zcl_aws1_ec2_actions.clas.testclasses.abap | 487 ---- .../ec2/zcl_aws1_ec2_actions.clas.xml | 109 - sap-abap/services/kinesis/package.devc.xml | 10 - .../kinesis/zcl_aws1_kns_actions.clas.abap | 249 -- ...zcl_aws1_kns_actions.clas.testclasses.abap | 518 ---- .../kinesis/zcl_aws1_kns_actions.clas.xml | 54 - .../kinesis/zcl_aws1_kns_scenario.clas.abap | 158 -- ...cl_aws1_kns_scenario.clas.testclasses.abap | 90 - .../kinesis/zcl_aws1_kns_scenario.clas.xml | 24 - sap-abap/services/{kinesis => kns}/README.md | 0 sap-abap/services/lambda/package.devc.xml | 10 - .../lambda/zcl_aws1_lmd_actions.clas.abap | 274 -- ...zcl_aws1_lmd_actions.clas.testclasses.abap | 332 --- .../lambda/zcl_aws1_lmd_actions.clas.xml | 54 - .../lambda/zcl_aws1_lmd_scenario.clas.abap | 256 -- ...cl_aws1_lmd_scenario.clas.testclasses.abap | 165 -- .../lambda/zcl_aws1_lmd_scenario.clas.xml | 24 - sap-abap/services/{lambda => lmd}/README.md | 0 .../services/s3/zcl_aws1_s3_actions.clas.abap | 237 -- .../zcl_aws1_s3_actions.clas.testclasses.abap | 319 --- .../services/s3/zcl_aws1_s3_actions.clas.xml | 59 - .../s3/zcl_aws1_s3_scenario.clas.abap | 195 -- ...zcl_aws1_s3_scenario.clas.testclasses.abap | 113 - .../services/s3/zcl_aws1_s3_scenario.clas.xml | 73 - sap-abap/services/sagemaker/package.devc.xml | 10 - .../sagemaker/zcl_aws1_sgm_actions.clas.abap | 503 ---- ...zcl_aws1_sgm_actions.clas.testclasses.abap | 2453 ----------------- .../sagemaker/zcl_aws1_sgm_actions.clas.xml | 74 - .../sagemaker/zcl_aws1_sgm_scenario.clas.abap | 259 -- ...cl_aws1_sgm_scenario.clas.testclasses.abap | 321 --- .../sagemaker/zcl_aws1_sgm_scenario.clas.xml | 24 - .../services/{sagemaker => sgm}/README.md | 0 .../sns/zcl_aws1_sns_actions.clas.abap | 226 -- ...zcl_aws1_sns_actions.clas.testclasses.abap | 246 -- .../sns/zcl_aws1_sns_actions.clas.xml | 64 - .../sns/zcl_aws1_sns_scenario.clas.abap | 94 - ...cl_aws1_sns_scenario.clas.testclasses.abap | 187 -- .../sns/zcl_aws1_sns_scenario.clas.xml | 24 - .../sqs/zcl_aws1_sqs_actions.clas.abap | 208 -- ...zcl_aws1_sqs_actions.clas.testclasses.abap | 215 -- .../sqs/zcl_aws1_sqs_actions.clas.xml | 59 - sap-abap/services/{textract => tex}/README.md | 0 sap-abap/services/textract/package.devc.xml | 10 - .../textract/zcl_aws1_tex_actions.clas.abap | 368 --- ...zcl_aws1_tex_actions.clas.testclasses.abap | 218 -- .../textract/zcl_aws1_tex_actions.clas.xml | 44 - .../textract/zcl_aws1_tex_scenario.clas.abap | 113 - ...cl_aws1_tex_scenario.clas.testclasses.abap | 54 - .../textract/zcl_aws1_tex_scenario.clas.xml | 24 - sap-abap/services/translate/package.devc.xml | 10 - .../translate/zcl_aws1_xl8_actions.clas.abap | 219 -- ...zcl_aws1_xl8_actions.clas.testclasses.abap | 455 --- .../translate/zcl_aws1_xl8_actions.clas.xml | 44 - .../translate/zcl_aws1_xl8_scenario.clas.abap | 109 - ...cl_aws1_xl8_scenario.clas.testclasses.abap | 131 - .../translate/zcl_aws1_xl8_scenario.clas.xml | 24 - .../services/{translate => xl8}/README.md | 0 81 files changed, 14195 deletions(-) delete mode 100644 sap-abap/services/bdr/zcl_aws1_bdr_actions.clas.abap delete mode 100644 sap-abap/services/bdr/zcl_aws1_bdr_actions.clas.testclasses.abap delete mode 100644 sap-abap/services/bdr/zcl_aws1_bdr_actions.clas.xml delete mode 100644 sap-abap/services/bdz/zcl_aws1_bdz_actions.clas.abap delete mode 100644 sap-abap/services/bdz/zcl_aws1_bdz_actions.clas.testclasses.abap delete mode 100644 sap-abap/services/bdz/zcl_aws1_bdz_actions.clas.xml delete mode 100644 sap-abap/services/cloudwatch/package.devc.xml delete mode 100644 sap-abap/services/cloudwatch/zcl_aws1_cwt_actions.clas.abap delete mode 100644 sap-abap/services/cloudwatch/zcl_aws1_cwt_actions.clas.testclasses.abap delete mode 100644 sap-abap/services/cloudwatch/zcl_aws1_cwt_actions.clas.xml delete mode 100644 sap-abap/services/cloudwatch/zcl_aws1_cwt_scenario.clas.abap delete mode 100644 sap-abap/services/cloudwatch/zcl_aws1_cwt_scenario.clas.testclasses.abap delete mode 100644 sap-abap/services/cloudwatch/zcl_aws1_cwt_scenario.clas.xml delete mode 100644 sap-abap/services/cpd/zcl_aws1_cpd_actions.clas.abap delete mode 100644 sap-abap/services/cpd/zcl_aws1_cpd_actions.clas.testclasses.abap delete mode 100644 sap-abap/services/cpd/zcl_aws1_cpd_actions.clas.xml rename sap-abap/services/{cloudwatch => cwt}/README.md (100%) delete mode 100644 sap-abap/services/dyn/zcl_aws1_dyn_actions.clas.abap delete mode 100644 sap-abap/services/dyn/zcl_aws1_dyn_actions.clas.testclasses.abap delete mode 100644 sap-abap/services/dyn/zcl_aws1_dyn_actions.clas.xml delete mode 100644 sap-abap/services/dyn/zcl_aws1_dyn_scenario.clas.abap delete mode 100644 sap-abap/services/dyn/zcl_aws1_dyn_scenario.clas.testclasses.abap delete mode 100644 sap-abap/services/dyn/zcl_aws1_dyn_scenario.clas.xml delete mode 100644 sap-abap/services/ec2/zcl_aws1_ec2_actions.clas.abap delete mode 100644 sap-abap/services/ec2/zcl_aws1_ec2_actions.clas.testclasses.abap delete mode 100644 sap-abap/services/ec2/zcl_aws1_ec2_actions.clas.xml delete mode 100644 sap-abap/services/kinesis/package.devc.xml delete mode 100644 sap-abap/services/kinesis/zcl_aws1_kns_actions.clas.abap delete mode 100644 sap-abap/services/kinesis/zcl_aws1_kns_actions.clas.testclasses.abap delete mode 100644 sap-abap/services/kinesis/zcl_aws1_kns_actions.clas.xml delete mode 100644 sap-abap/services/kinesis/zcl_aws1_kns_scenario.clas.abap delete mode 100644 sap-abap/services/kinesis/zcl_aws1_kns_scenario.clas.testclasses.abap delete mode 100644 sap-abap/services/kinesis/zcl_aws1_kns_scenario.clas.xml rename sap-abap/services/{kinesis => kns}/README.md (100%) delete mode 100644 sap-abap/services/lambda/package.devc.xml delete mode 100644 sap-abap/services/lambda/zcl_aws1_lmd_actions.clas.abap delete mode 100644 sap-abap/services/lambda/zcl_aws1_lmd_actions.clas.testclasses.abap delete mode 100644 sap-abap/services/lambda/zcl_aws1_lmd_actions.clas.xml delete mode 100644 sap-abap/services/lambda/zcl_aws1_lmd_scenario.clas.abap delete mode 100644 sap-abap/services/lambda/zcl_aws1_lmd_scenario.clas.testclasses.abap delete mode 100644 sap-abap/services/lambda/zcl_aws1_lmd_scenario.clas.xml rename sap-abap/services/{lambda => lmd}/README.md (100%) delete mode 100644 sap-abap/services/s3/zcl_aws1_s3_actions.clas.abap delete mode 100644 sap-abap/services/s3/zcl_aws1_s3_actions.clas.testclasses.abap delete mode 100644 sap-abap/services/s3/zcl_aws1_s3_actions.clas.xml delete mode 100644 sap-abap/services/s3/zcl_aws1_s3_scenario.clas.abap delete mode 100644 sap-abap/services/s3/zcl_aws1_s3_scenario.clas.testclasses.abap delete mode 100644 sap-abap/services/s3/zcl_aws1_s3_scenario.clas.xml delete mode 100644 sap-abap/services/sagemaker/package.devc.xml delete mode 100644 sap-abap/services/sagemaker/zcl_aws1_sgm_actions.clas.abap delete mode 100644 sap-abap/services/sagemaker/zcl_aws1_sgm_actions.clas.testclasses.abap delete mode 100644 sap-abap/services/sagemaker/zcl_aws1_sgm_actions.clas.xml delete mode 100644 sap-abap/services/sagemaker/zcl_aws1_sgm_scenario.clas.abap delete mode 100644 sap-abap/services/sagemaker/zcl_aws1_sgm_scenario.clas.testclasses.abap delete mode 100644 sap-abap/services/sagemaker/zcl_aws1_sgm_scenario.clas.xml rename sap-abap/services/{sagemaker => sgm}/README.md (100%) delete mode 100644 sap-abap/services/sns/zcl_aws1_sns_actions.clas.abap delete mode 100644 sap-abap/services/sns/zcl_aws1_sns_actions.clas.testclasses.abap delete mode 100644 sap-abap/services/sns/zcl_aws1_sns_actions.clas.xml delete mode 100644 sap-abap/services/sns/zcl_aws1_sns_scenario.clas.abap delete mode 100644 sap-abap/services/sns/zcl_aws1_sns_scenario.clas.testclasses.abap delete mode 100644 sap-abap/services/sns/zcl_aws1_sns_scenario.clas.xml delete mode 100644 sap-abap/services/sqs/zcl_aws1_sqs_actions.clas.abap delete mode 100644 sap-abap/services/sqs/zcl_aws1_sqs_actions.clas.testclasses.abap delete mode 100644 sap-abap/services/sqs/zcl_aws1_sqs_actions.clas.xml rename sap-abap/services/{textract => tex}/README.md (100%) delete mode 100644 sap-abap/services/textract/package.devc.xml delete mode 100644 sap-abap/services/textract/zcl_aws1_tex_actions.clas.abap delete mode 100644 sap-abap/services/textract/zcl_aws1_tex_actions.clas.testclasses.abap delete mode 100644 sap-abap/services/textract/zcl_aws1_tex_actions.clas.xml delete mode 100644 sap-abap/services/textract/zcl_aws1_tex_scenario.clas.abap delete mode 100644 sap-abap/services/textract/zcl_aws1_tex_scenario.clas.testclasses.abap delete mode 100644 sap-abap/services/textract/zcl_aws1_tex_scenario.clas.xml delete mode 100644 sap-abap/services/translate/package.devc.xml delete mode 100644 sap-abap/services/translate/zcl_aws1_xl8_actions.clas.abap delete mode 100644 sap-abap/services/translate/zcl_aws1_xl8_actions.clas.testclasses.abap delete mode 100644 sap-abap/services/translate/zcl_aws1_xl8_actions.clas.xml delete mode 100644 sap-abap/services/translate/zcl_aws1_xl8_scenario.clas.abap delete mode 100644 sap-abap/services/translate/zcl_aws1_xl8_scenario.clas.testclasses.abap delete mode 100644 sap-abap/services/translate/zcl_aws1_xl8_scenario.clas.xml rename sap-abap/services/{translate => xl8}/README.md (100%) diff --git a/sap-abap/services/bdr/zcl_aws1_bdr_actions.clas.abap b/sap-abap/services/bdr/zcl_aws1_bdr_actions.clas.abap deleted file mode 100644 index 9188b71e07b..00000000000 --- a/sap-abap/services/bdr/zcl_aws1_bdr_actions.clas.abap +++ /dev/null @@ -1,296 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 -CLASS zcl_aws1_bdr_actions DEFINITION - PUBLIC - FINAL - CREATE PUBLIC . - - PUBLIC SECTION. - PROTECTED SECTION. - PRIVATE SECTION. - - METHODS prompt_claude_v2 - IMPORTING - !iv_prompt TYPE string - RETURNING - VALUE(ov_answer) TYPE string - RAISING - /aws1/cx_bdrserverexc - /aws1/cx_bdrclientexc - /aws1/cx_rt_technical_generic - /aws1/cx_rt_service_generic - /aws1/cx_rt_no_auth_generic . - METHODS prompt_stable_diffusion - IMPORTING - !iv_prompt TYPE string - RETURNING - VALUE(ov_image) TYPE xstring - RAISING - /aws1/cx_bdrserverexc - /aws1/cx_bdrclientexc - /aws1/cx_rt_technical_generic - /aws1/cx_rt_service_generic - /aws1/cx_rt_no_auth_generic . - METHODS l2_prompt_claude_v2 - IMPORTING - !iv_prompt TYPE string - RETURNING - VALUE(ov_answer) TYPE string - RAISING - /aws1/cx_bdrserverexc - /aws1/cx_bdrclientexc - /aws1/cx_rt_technical_generic - /aws1/cx_rt_service_generic - /aws1/cx_rt_no_auth_generic . - METHODS l2_prompt_stable_diffusion - IMPORTING - !iv_prompt TYPE string - RETURNING - VALUE(ov_image) TYPE xstring - RAISING - /aws1/cx_bdrserverexc - /aws1/cx_bdrclientexc - /aws1/cx_rt_technical_generic - /aws1/cx_rt_service_generic - /aws1/cx_rt_no_auth_generic . - METHODS l2_prompt_claude_v3 - IMPORTING - !iv_prompt TYPE string - RETURNING - VALUE(ov_answer) TYPE string - RAISING - /aws1/cx_bdrserverexc - /aws1/cx_bdrclientexc - /aws1/cx_rt_technical_generic - /aws1/cx_rt_service_generic - /aws1/cx_rt_no_auth_generic - /aws1/cx_bdr_l2_generic . -ENDCLASS. - - - -CLASS ZCL_AWS1_BDR_ACTIONS IMPLEMENTATION. - - - METHOD l2_prompt_claude_v2. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_bdr) = /aws1/cl_bdr_factory=>create( lo_session ). - "snippet-start:[bdr.abapv1.invokemodel_l2_claude_v2] - TRY. - DATA(lo_bdr_l2_claude) = /aws1/cl_bdr_l2_factory=>create_claude_2( lo_bdr ). - " iv_prompt can contain a prompt like 'tell me a joke about Java programmers'. - DATA(lv_answer) = lo_bdr_l2_claude->prompt_for_text( iv_prompt ). - CATCH /aws1/cx_bdraccessdeniedex INTO DATA(lo_ex). - WRITE / lo_ex->get_text( ). - WRITE / |Don't forget to enable model access at https://console.aws.amazon.com/bedrock/home?#/modelaccess|. - - ENDTRY. - "snippet-end:[bdr.abapv1.invokemodel_l2_claude_v2] - ov_answer = lv_answer. - ENDMETHOD. - - - METHOD l2_prompt_claude_v3. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_bdr) = /aws1/cl_bdr_factory=>create( lo_session ). - "snippet-start:[bdr.abapv1.invokemodel_l2_claude_v3] - TRY. - " Choose a model ID from Anthropic that supports the Messages API - currently this is - " Claude v2, Claude v3 and v3.5. For the list of model ID, see: - " https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids.html - - " for the list of models that support the Messages API see: - " https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages.html - DATA(lo_bdr_l2_claude) = /aws1/cl_bdr_l2_factory=>create_anthropic_msg_api( - io_bdr = lo_bdr - iv_model_id = 'anthropic.claude-3-sonnet-20240229-v1:0' ). " choosing Claude v3 Sonnet - " iv_prompt can contain a prompt like 'tell me a joke about Java programmers'. - DATA(lv_answer) = lo_bdr_l2_claude->prompt_for_text( iv_prompt = iv_prompt - iv_max_tokens = 100 ). - CATCH /aws1/cx_bdraccessdeniedex INTO DATA(lo_ex). - WRITE / lo_ex->get_text( ). - WRITE / |Don't forget to enable model access at https://console.aws.amazon.com/bedrock/home?#/modelaccess|. - - ENDTRY. - "snippet-end:[bdr.abapv1.invokemodel_l2_claude_v3] - ov_answer = lv_answer. - ENDMETHOD. - - - METHOD l2_prompt_stable_diffusion. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_bdr) = /aws1/cl_bdr_factory=>create( lo_session ). - "snippet-start:[bdr.abapv1.invokemodel_l2_stable_diffusion] - TRY. - DATA(lo_bdr_l2_sd) = /aws1/cl_bdr_l2_factory=>create_stable_diffusion_xl_1( lo_bdr ). - " iv_prompt contains a prompt like 'Show me a picture of a unicorn reading an enterprise financial report'. - DATA(lv_image) = lo_bdr_l2_sd->text_to_image( iv_prompt ). - CATCH /aws1/cx_bdraccessdeniedex INTO DATA(lo_ex). - WRITE / lo_ex->get_text( ). - WRITE / |Don't forget to enable model access at https://console.aws.amazon.com/bedrock/home?#/modelaccess|. - - ENDTRY. - "snippet-end:[bdr.abapv1.invokemodel_l2_stable_diffusion] - ov_image = lv_image. - - ENDMETHOD. - - - METHOD prompt_claude_v2. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_bdr) = /aws1/cl_bdr_factory=>create( lo_session ). - "snippet-start:[bdr.abapv1.invokemodel_claude_v2] - "Claude V2 Input Parameters should be in a format like this: -* { -* "prompt":"\n\nHuman:\\nTell me a joke\n\nAssistant:\n", -* "max_tokens_to_sample":2048, -* "temperature":0.5, -* "top_k":250, -* "top_p":1.0, -* "stop_sequences":[] -* } - - DATA: BEGIN OF ls_input, - prompt TYPE string, - max_tokens_to_sample TYPE /aws1/rt_shape_integer, - temperature TYPE /aws1/rt_shape_float, - top_k TYPE /aws1/rt_shape_integer, - top_p TYPE /aws1/rt_shape_float, - stop_sequences TYPE /aws1/rt_stringtab, - END OF ls_input. - - "Leave ls_input-stop_sequences empty. - ls_input-prompt = |\n\nHuman:\\n{ iv_prompt }\n\nAssistant:\n|. - ls_input-max_tokens_to_sample = 2048. - ls_input-temperature = '0.5'. - ls_input-top_k = 250. - ls_input-top_p = 1. - - "Serialize into JSON with /ui2/cl_json -- this assumes SAP_UI is installed. - DATA(lv_json) = /ui2/cl_json=>serialize( - data = ls_input - pretty_name = /ui2/cl_json=>pretty_mode-low_case ). - - TRY. - DATA(lo_response) = lo_bdr->invokemodel( - iv_body = /aws1/cl_rt_util=>string_to_xstring( lv_json ) - iv_modelid = 'anthropic.claude-v2' - iv_accept = 'application/json' - iv_contenttype = 'application/json' ). - - "Claude V2 Response format will be: -* { -* "completion": "Knock Knock...", -* "stop_reason": "stop_sequence" -* } - DATA: BEGIN OF ls_response, - completion TYPE string, - stop_reason TYPE string, - END OF ls_response. - - /ui2/cl_json=>deserialize( - EXPORTING jsonx = lo_response->get_body( ) - pretty_name = /ui2/cl_json=>pretty_mode-camel_case - CHANGING data = ls_response ). - - DATA(lv_answer) = ls_response-completion. - CATCH /aws1/cx_bdraccessdeniedex INTO DATA(lo_ex). - WRITE / lo_ex->get_text( ). - WRITE / |Don't forget to enable model access at https://console.aws.amazon.com/bedrock/home?#/modelaccess|. - - ENDTRY. - "snippet-end:[bdr.abapv1.invokemodel_claude_v2] - ov_answer = lv_answer. - ENDMETHOD. - - - METHOD prompt_stable_diffusion. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_bdr) = /aws1/cl_bdr_factory=>create( lo_session ). - "snippet-start:[bdr.abapv1.invokemodel_stable_diffusion] - "Stable Diffusion Input Parameters should be in a format like this: -* { -* "text_prompts": [ -* {"text":"Draw a dolphin with a mustache"}, -* {"text":"Make it photorealistic"} -* ], -* "cfg_scale":10, -* "seed":0, -* "steps":50 -* } - TYPES: BEGIN OF prompt_ts, - text TYPE /aws1/rt_shape_string, - END OF prompt_ts. - - DATA: BEGIN OF ls_input, - text_prompts TYPE STANDARD TABLE OF prompt_ts, - cfg_scale TYPE /aws1/rt_shape_integer, - seed TYPE /aws1/rt_shape_integer, - steps TYPE /aws1/rt_shape_integer, - END OF ls_input. - - APPEND VALUE prompt_ts( text = iv_prompt ) TO ls_input-text_prompts. - ls_input-cfg_scale = 10. - ls_input-seed = 0. "or better, choose a random integer. - ls_input-steps = 50. - - DATA(lv_json) = /ui2/cl_json=>serialize( - data = ls_input - pretty_name = /ui2/cl_json=>pretty_mode-low_case ). - - TRY. - DATA(lo_response) = lo_bdr->invokemodel( - iv_body = /aws1/cl_rt_util=>string_to_xstring( lv_json ) - iv_modelid = 'stability.stable-diffusion-xl-v1' - iv_accept = 'application/json' - iv_contenttype = 'application/json' ). - - "Stable Diffusion Result Format: -* { -* "result": "success", -* "artifacts": [ -* { -* "seed": 0, -* "base64": "iVBORw0KGgoAAAANSUhEUgAAAgAAA.... -* "finishReason": "SUCCESS" -* } -* ] -* } - TYPES: BEGIN OF artifact_ts, - seed TYPE /aws1/rt_shape_integer, - base64 TYPE /aws1/rt_shape_string, - finishreason TYPE /aws1/rt_shape_string, - END OF artifact_ts. - - DATA: BEGIN OF ls_response, - result TYPE /aws1/rt_shape_string, - artifacts TYPE STANDARD TABLE OF artifact_ts, - END OF ls_response. - - /ui2/cl_json=>deserialize( - EXPORTING jsonx = lo_response->get_body( ) - pretty_name = /ui2/cl_json=>pretty_mode-camel_case - CHANGING data = ls_response ). - IF ls_response-artifacts IS NOT INITIAL. - DATA(lv_image) = cl_http_utility=>if_http_utility~decode_x_base64( ls_response-artifacts[ 1 ]-base64 ). - ENDIF. - CATCH /aws1/cx_bdraccessdeniedex INTO DATA(lo_ex). - WRITE / lo_ex->get_text( ). - WRITE / |Don't forget to enable model access at https://console.aws.amazon.com/bedrock/home?#/modelaccess|. - - ENDTRY. - - "snippet-end:[bdr.abapv1.invokemodel_stable_diffusion] - ov_image = lv_image. - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/bdr/zcl_aws1_bdr_actions.clas.testclasses.abap b/sap-abap/services/bdr/zcl_aws1_bdr_actions.clas.testclasses.abap deleted file mode 100644 index 5a1ce6abc1e..00000000000 --- a/sap-abap/services/bdr/zcl_aws1_bdr_actions.clas.testclasses.abap +++ /dev/null @@ -1,62 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS ltc_zcl_aws1_bdr_actions DEFINITION DEFERRED. -CLASS zcl_aws1_bdr_actions DEFINITION LOCAL FRIENDS ltc_zcl_aws1_bdr_actions. - -CLASS ltc_zcl_aws1_bdr_actions DEFINITION FOR TESTING DURATION LONG RISK LEVEL DANGEROUS. - - PRIVATE SECTION. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA ao_bdr TYPE REF TO /aws1/if_bdr. - DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. - DATA ao_bdr_actions TYPE REF TO zcl_aws1_bdr_actions. - - METHODS test_claude_v2 FOR TESTING RAISING /aws1/cx_rt_generic. - METHODS test_stable_diffusion FOR TESTING RAISING /aws1/cx_rt_generic. - - METHODS test_l2_claude_v2 FOR TESTING RAISING /aws1/cx_rt_generic. - METHODS test_l2_claude_v3 FOR TESTING RAISING /aws1/cx_rt_generic. - METHODS test_l2_stable_diffusion FOR TESTING RAISING /aws1/cx_rt_generic. - - METHODS setup RAISING /aws1/cx_rt_generic. - -ENDCLASS. -CLASS ltc_zcl_aws1_bdr_actions IMPLEMENTATION. - - METHOD setup. - ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). - ao_bdr = /aws1/cl_bdr_factory=>create( ao_session ). - ao_bdr_actions = NEW zcl_aws1_bdr_actions( ). - ENDMETHOD. - METHOD test_claude_v2. - DATA(lv_joke) = ao_bdr_actions->prompt_claude_v2( - 'Tell me a joke about ABAP programmers and Java programmers walking into a bar' ). - cl_abap_unit_assert=>assert_not_initial( act = lv_joke ). - ENDMETHOD. - - METHOD test_stable_diffusion. - DATA(lv_joke) = ao_bdr_actions->prompt_stable_diffusion( - 'Show me a picture of a kitten coding in ABAP on an SAP system' ). - cl_abap_unit_assert=>assert_not_initial( act = lv_joke ). - ENDMETHOD. - METHOD test_l2_claude_v2. - DATA(lv_joke) = ao_bdr_actions->l2_prompt_claude_v2( - 'Tell me a joke about ABAP programmers and Java programmers walking into a bar' ). - cl_abap_unit_assert=>assert_not_initial( act = lv_joke ). - ENDMETHOD. - - METHOD test_l2_claude_v3. - DATA(lv_joke) = ao_bdr_actions->l2_prompt_claude_v3( - 'Tell me a joke about ABAP programmers and Java programmers walking into a bar' ). - cl_abap_unit_assert=>assert_not_initial( act = lv_joke ). - ENDMETHOD. - - METHOD test_l2_stable_diffusion. - DATA(lv_joke) = ao_bdr_actions->l2_prompt_stable_diffusion( - 'Show me a picture of a kitten coding in ABAP on an SAP system' ). - cl_abap_unit_assert=>assert_not_initial( act = lv_joke ). - ENDMETHOD. - -ENDCLASS. diff --git a/sap-abap/services/bdr/zcl_aws1_bdr_actions.clas.xml b/sap-abap/services/bdr/zcl_aws1_bdr_actions.clas.xml deleted file mode 100644 index 2c453ff56e9..00000000000 --- a/sap-abap/services/bdr/zcl_aws1_bdr_actions.clas.xml +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - ZCL_AWS1_BDR_ACTIONS - E - Amazon Bedrock Runtime Code Example Actions - 1 - X - X - X - X - - - - L2_PROMPT_CLAUDE_V2 - E - L2 Prompt Claude V2 - - - L2_PROMPT_CLAUDE_V3 - E - L2 Prompt Claude V3 - - - L2_PROMPT_STABLE_DIFFUSION - E - L2 Prompt Stable Diffusion 1.0 with L2 client - - - PROMPT_CLAUDE_V2 - E - Prompt Claude V2 - - - PROMPT_STABLE_DIFFUSION - E - Prompt Stable Diffusion 1.0 with L2 client - - - - - L2_PROMPT_CLAUDE_V2 - /AWS1/CX_BDRCLIENTEXC - E - Exception /AWS1/CX_BDRCLIENTEXC - - - L2_PROMPT_CLAUDE_V2 - /AWS1/CX_BDRSERVEREXC - E - Exception /AWS1/CX_BDRSERVEREXC - - - L2_PROMPT_CLAUDE_V2 - /AWS1/CX_RT_NO_AUTH_GENERIC - E - Generic lack of authorization - - - L2_PROMPT_CLAUDE_V2 - /AWS1/CX_RT_SERVICE_GENERIC - E - Generic Service call error - - - L2_PROMPT_CLAUDE_V2 - /AWS1/CX_RT_TECHNICAL_GENERIC - E - Technical errors - - - L2_PROMPT_CLAUDE_V3 - /AWS1/CX_BDRCLIENTEXC - E - Exception /AWS1/CX_BDRCLIENTEXC - - - L2_PROMPT_CLAUDE_V3 - /AWS1/CX_BDRSERVEREXC - E - Exception /AWS1/CX_BDRSERVEREXC - - - L2_PROMPT_CLAUDE_V3 - /AWS1/CX_BDR_L2_GENERIC - E - Generic Bedrock L2 exception - - - L2_PROMPT_CLAUDE_V3 - /AWS1/CX_RT_NO_AUTH_GENERIC - E - Generic lack of authorization - - - L2_PROMPT_CLAUDE_V3 - /AWS1/CX_RT_SERVICE_GENERIC - E - Generic Service call error - - - L2_PROMPT_CLAUDE_V3 - /AWS1/CX_RT_TECHNICAL_GENERIC - E - Technical errors - - - L2_PROMPT_STABLE_DIFFUSION - /AWS1/CX_BDRCLIENTEXC - E - Exception /AWS1/CX_BDRCLIENTEXC - - - L2_PROMPT_STABLE_DIFFUSION - /AWS1/CX_BDRSERVEREXC - E - Exception /AWS1/CX_BDRSERVEREXC - - - L2_PROMPT_STABLE_DIFFUSION - /AWS1/CX_RT_NO_AUTH_GENERIC - E - Generic lack of authorization - - - L2_PROMPT_STABLE_DIFFUSION - /AWS1/CX_RT_SERVICE_GENERIC - E - Generic Service call error - - - L2_PROMPT_STABLE_DIFFUSION - /AWS1/CX_RT_TECHNICAL_GENERIC - E - Technical errors - - - PROMPT_CLAUDE_V2 - /AWS1/CX_BDRCLIENTEXC - E - Exception /AWS1/CX_BDRCLIENTEXC - - - PROMPT_CLAUDE_V2 - /AWS1/CX_BDRSERVEREXC - E - Exception /AWS1/CX_BDRSERVEREXC - - - PROMPT_CLAUDE_V2 - /AWS1/CX_RT_NO_AUTH_GENERIC - E - Generic lack of authorization - - - PROMPT_CLAUDE_V2 - /AWS1/CX_RT_SERVICE_GENERIC - E - Generic Service call error - - - PROMPT_CLAUDE_V2 - /AWS1/CX_RT_TECHNICAL_GENERIC - E - Technical errors - - - PROMPT_STABLE_DIFFUSION - /AWS1/CX_BDRCLIENTEXC - E - Exception /AWS1/CX_BDRCLIENTEXC - - - PROMPT_STABLE_DIFFUSION - /AWS1/CX_BDRSERVEREXC - E - Exception /AWS1/CX_BDRSERVEREXC - - - PROMPT_STABLE_DIFFUSION - /AWS1/CX_RT_NO_AUTH_GENERIC - E - Generic lack of authorization - - - PROMPT_STABLE_DIFFUSION - /AWS1/CX_RT_SERVICE_GENERIC - E - Generic Service call error - - - PROMPT_STABLE_DIFFUSION - /AWS1/CX_RT_TECHNICAL_GENERIC - E - Technical errors - - - - - diff --git a/sap-abap/services/bdz/zcl_aws1_bdz_actions.clas.abap b/sap-abap/services/bdz/zcl_aws1_bdz_actions.clas.abap deleted file mode 100644 index 6fc76097f29..00000000000 --- a/sap-abap/services/bdz/zcl_aws1_bdz_actions.clas.abap +++ /dev/null @@ -1,82 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 -CLASS zcl_aws1_bdz_actions DEFINITION - PUBLIC - FINAL - CREATE PUBLIC . - - PUBLIC SECTION. - - METHODS invoke_bedrock_agent - IMPORTING - !io_session TYPE REF TO /aws1/cl_rt_session_base - !iv_agentid TYPE /aws1/bdaid - !iv_agentaliasid TYPE /aws1/bdaagentaliasid - RETURNING - VALUE(ov_answer) TYPE string - RAISING - /aws1/cx_bdzserverexc - /aws1/cx_bdzclientexc - /aws1/cx_rt_technical_generic - /aws1/cx_rt_service_generic - /aws1/cx_rt_no_auth_generic - cx_uuid_error . - PROTECTED SECTION. - PRIVATE SECTION. - -ENDCLASS. - - - -CLASS ZCL_AWS1_BDZ_ACTIONS IMPLEMENTATION. - - - METHOD invoke_bedrock_agent. - DATA(lo_bdz) = /aws1/cl_bdz_factory=>create( io_session ). - - "snippet-start:[bdz.abapv1.invokeagent] - - DATA(lo_result) = lo_bdz->invokeagent( - iv_agentid = iv_agentid - iv_agentaliasid = iv_agentaliasid - iv_enabletrace = abap_true - iv_sessionid = CONV #( cl_system_uuid=>create_uuid_c26_static( ) ) - iv_inputtext = |Let's play "rock, paper, scissors". I choose rock.| ). - DATA(lo_stream) = lo_result->get_completion( ). - TRY. - " loop while there are still events in the stream - WHILE lo_stream->/aws1/if_rt_stream_reader~data_available( ) = abap_true. - DATA(lo_evt) = lo_stream->read( ). - " each /AWS1/CL_BDZRESPONSESTREAM_EV event contains exactly one member - " all others are INITIAL. For each event, process the non-initial - " member if desired - IF lo_evt->get_chunk( ) IS NOT INITIAL. - " Process a Chunk event - DATA(lv_xstr) = lo_evt->get_chunk( )->get_bytes( ). - DATA(lv_answer) = /aws1/cl_rt_util=>xstring_to_string( lv_xstr ). - " the answer says something like "I chose paper, so you lost" - ELSEIF lo_evt->get_files( ) IS NOT INITIAL. - " process a Files event if desired - ELSEIF lo_evt->get_returncontrol( ) IS NOT INITIAL. - " process a ReturnControl event if desired - ELSEIF lo_evt->get_trace( ) IS NOT INITIAL. - " process a Trace event if desired - ENDIF. - ENDWHILE. - " the stream of events can possibly contain an exception - " which will be raised to break the loop - " catch /AWS1/CX_BDZACCESSDENIEDEX. - " catch /AWS1/CX_BDZINTERNALSERVEREX. - " catch /AWS1/CX_BDZMODELNOTREADYEX. - " catch /AWS1/CX_BDZVALIDATIONEX. - " catch /AWS1/CX_BDZTHROTTLINGEX. - " catch /AWS1/CX_BDZDEPENDENCYFAILEDEX. - " catch /AWS1/CX_BDZBADGATEWAYEX. - " catch /AWS1/CX_BDZRESOURCENOTFOUNDEX. - " catch /AWS1/CX_BDZSERVICEQUOTAEXCDEX. - " catch /AWS1/CX_BDZCONFLICTEXCEPTION. - ENDTRY. - "snippet-end:[bdz.abapv1.invokeagent]. - ov_answer = lv_answer. - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/bdz/zcl_aws1_bdz_actions.clas.testclasses.abap b/sap-abap/services/bdz/zcl_aws1_bdz_actions.clas.testclasses.abap deleted file mode 100644 index c6d7ba5c98a..00000000000 --- a/sap-abap/services/bdz/zcl_aws1_bdz_actions.clas.testclasses.abap +++ /dev/null @@ -1,154 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 -CLASS ltc_zcl_aws1_bdz_actions DEFINITION FOR TESTING - DURATION SHORT - RISK LEVEL DANGEROUS. - PROTECTED SECTION. - METHODS test_invoke_agent FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. - - PRIVATE SECTION. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - CONSTANTS cv_bdz_lrole TYPE string VALUE 'YMIT1_BDZ_ROLEARN'. - CONSTANTS cv_foundationmodel TYPE string VALUE 'us.amazon.nova-micro-v1:0'. - CONSTANTS cv_alias TYPE string VALUE 'live'. - CONSTANTS cv_action_group_name TYPE string VALUE 'action_group'. - - DATA av_func_name_fail TYPE /aws1/lmdfunctionname. - DATA ao_alias TYPE REF TO /aws1/cl_bdaagentalias. - DATA ao_bda TYPE REF TO /aws1/if_bda. - DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. - DATA av_bdz_rolearn TYPE /aws1/bdaagentrolearn. - - METHODS setup RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic. - METHODS teardown RAISING /aws1/cx_rt_service_generic /aws1/cx_rt_technical_generic /aws1/cx_rt_generic zcx_aws1_ex_generic. - - METHODS wait_for_agent_status - IMPORTING iv_agentid TYPE string - iv_status TYPE string - RETURNING VALUE(oo_agent) TYPE REF TO /aws1/cl_bdaagent - RAISING /aws1/cx_rt_generic - zcx_aws1_ex_generic. - - METHODS wait_for_agent_alias_status - IMPORTING iv_agentid TYPE string - iv_aliasid TYPE string - iv_status TYPE string - RETURNING VALUE(oo_alias) TYPE REF TO /aws1/cl_bdaagentalias - RAISING /aws1/cx_rt_generic - zcx_aws1_ex_generic. - - METHODS prepare - IMPORTING iv_agentid TYPE string - RETURNING VALUE(oo_agent) TYPE REF TO /aws1/cl_bdaagent - RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic. - -ENDCLASS. - - - -CLASS ltc_ZCL_AWS1_BDZ_ACTIONS IMPLEMENTATION. - - METHOD setup. - ao_session = /aws1/cl_rt_session_aws=>create( cv_pfl ). - ao_bda = /aws1/cl_bda_factory=>create( ao_session ). - av_bdz_rolearn = ao_session->resolve_lresource( cv_bdz_lrole ). - - DATA(lv_random_string) = zcl_aws1_ex_utils=>get_random_string( ). - - DATA(lv_instruction) = |You are an agent that plays "rock, paper, scissors". Choose rock, | && - |paper, or scissors.. When the human prompts you with | && - |their choice, reveal your choice and declare the winner. |. - - DATA(lo_agent) = ao_bda->createagent( - iv_agentname = |{ zcl_aws1_ex_utils=>cv_asset_prefix }-bdragt-{ lv_random_string }| - iv_foundationmodel = cv_foundationmodel - iv_agentresourcerolearn = av_bdz_rolearn - iv_instruction = lv_instruction )->get_agent( ). - DATA(lv_agentid) = lo_agent->get_agentid( ). - - wait_for_agent_status( iv_agentid = lv_agentid - iv_status = |NOT_PREPARED| ). - - " get draft version - prepare( lv_agentid ). - - ao_alias = ao_bda->createagentalias( iv_agentid = lv_agentid - iv_agentaliasname = cv_alias )->get_agentalias( ). - wait_for_agent_alias_status( iv_agentid = lv_agentid - iv_aliasid = ao_alias->get_agentaliasid( ) - iv_status = |PREPARED| ). - - ENDMETHOD. - - METHOD prepare. - ao_bda->prepareagent( iv_agentid = iv_agentid ). - oo_agent = wait_for_agent_status( iv_agentid = iv_agentid - iv_status = |PREPARED| ). - ENDMETHOD. - - METHOD wait_for_agent_status. - oo_agent = ao_bda->getagent( iv_agentid )->get_agent( ). - WHILE oo_agent->get_agentstatus( ) <> iv_status. - WAIT UP TO 2 SECONDS. - IF sy-index > 20. - RAISE EXCEPTION TYPE zcx_aws1_ex_generic - EXPORTING - av_msg = |Bedrock agent { iv_agentid } never reached status { iv_status }|. - ENDIF. - oo_agent = ao_bda->getagent( iv_agentid )->get_agent( ). - ENDWHILE. - ENDMETHOD. - - METHOD wait_for_agent_alias_status. - oo_alias = ao_bda->getagentalias( iv_agentid = iv_agentid - iv_agentaliasid = iv_aliasid )->get_agentalias( ). - WHILE oo_alias->get_agentaliasstatus( ) <> iv_status. - WAIT UP TO 2 SECONDS. - IF sy-index > 20. - RAISE EXCEPTION TYPE zcx_aws1_ex_generic - EXPORTING - av_msg = |Bedrock agent alias { iv_aliasid } never reached status { iv_status }|. - ENDIF. - oo_alias = ao_bda->getagentalias( iv_agentid = iv_agentid - iv_agentaliasid = iv_aliasid )->get_agentalias( ). - ENDWHILE. - ENDMETHOD. - - - METHOD teardown. - IF ao_alias IS NOT INITIAL. - DATA(lv_agentid) = ao_alias->get_agentid( ). - TRY. - " first delete aliases - DATA(lt_agent_aliases) = ao_bda->listagentaliases( iv_agentid = lv_agentid )->get_agentaliassummaries( ). - LOOP AT lt_agent_aliases INTO DATA(lo_alias). - ao_bda->deleteagentalias( iv_agentid = lv_agentid - iv_agentaliasid = ao_alias->get_agentaliasid( ) ). - ENDLOOP. - DATA(lv_status) = ao_bda->deleteagent( iv_agentid = lv_agentid )->get_agentstatus( ). - WHILE lv_status <> 'DELETED'. - lv_status = ao_bda->getagent( lv_agentid )->get_agent( )->get_agentstatus( ). - ENDWHILE. - CATCH /aws1/cx_bdaresourcenotfoundex. - " it's gone - ENDTRY. - ENDIF. - - ENDMETHOD. - - - METHOD test_invoke_agent. - DATA lv_agentid TYPE string. - DATA lv_agentaliasid TYPE string. - DATA(lo_example) = NEW zcl_aws1_bdz_actions( ). - DATA(lv_result) = lo_example->invoke_bedrock_agent( - io_session = ao_session - iv_agentid = ao_alias->get_agentid( ) - iv_agentaliasid = ao_alias->get_agentaliasid( ) ). - cl_abap_unit_assert=>assert_text_matches( - text = lv_result - pattern = '.*((rock)|(paper)|(scissors)).*' - msg = |Expected "rock", "paper" or "scissors" in the response but got { lv_result }| ). - ENDMETHOD. - -ENDCLASS. diff --git a/sap-abap/services/bdz/zcl_aws1_bdz_actions.clas.xml b/sap-abap/services/bdz/zcl_aws1_bdz_actions.clas.xml deleted file mode 100644 index 79ede18a774..00000000000 --- a/sap-abap/services/bdz/zcl_aws1_bdz_actions.clas.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - ZCL_AWS1_BDZ_ACTIONS - E - Bedrock Agents Runtime - 1 - X - X - X - X - - - - diff --git a/sap-abap/services/cloudwatch/package.devc.xml b/sap-abap/services/cloudwatch/package.devc.xml deleted file mode 100644 index 7962960c817..00000000000 --- a/sap-abap/services/cloudwatch/package.devc.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - Package for Amazon CloudWatch - - - - diff --git a/sap-abap/services/cloudwatch/zcl_aws1_cwt_actions.clas.abap b/sap-abap/services/cloudwatch/zcl_aws1_cwt_actions.clas.abap deleted file mode 100644 index 796e789a9ef..00000000000 --- a/sap-abap/services/cloudwatch/zcl_aws1_cwt_actions.clas.abap +++ /dev/null @@ -1,191 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS zcl_aws1_cwt_actions DEFINITION - PUBLIC - FINAL - CREATE PUBLIC . - - PUBLIC SECTION. - - METHODS delete_alarms - IMPORTING - !it_alarm_names TYPE /aws1/cl_cwtalarmnames_w=>tt_alarmnames . - METHODS describe_alarms - IMPORTING - !it_alarm_names TYPE /aws1/cl_cwtalarmnames_w=>tt_alarmnames - EXPORTING - !oo_result TYPE REF TO /aws1/cl_cwtdescralarmsoutput . - METHODS disable_alarm_actions - IMPORTING - !it_alarm_names TYPE /aws1/cl_cwtalarmnames_w=>tt_alarmnames . - METHODS enable_alarm_actions - IMPORTING - !it_alarm_names TYPE /aws1/cl_cwtalarmnames_w=>tt_alarmnames . - METHODS list_metrics - IMPORTING - !iv_namespace TYPE /aws1/cwtnamespace - EXPORTING - !oo_result TYPE REF TO /aws1/cl_cwtlistmetricsoutput . - METHODS put_metric_alarm - IMPORTING - !iv_alarm_name TYPE /aws1/cwtalarmname - !iv_metric_name TYPE /aws1/cwtmetricname - !iv_namespace TYPE /aws1/cwtnamespace - !iv_comparison_operator TYPE /aws1/cwtcomparisonoperator - !iv_statistic TYPE /aws1/cwtstatistic - !iv_threshold TYPE /aws1/rt_double_as_string - !iv_alarm_description TYPE /aws1/cwtalarmdescription - !iv_actions_enabled TYPE /aws1/cwtactionsenabled - !iv_evaluation_periods TYPE /aws1/cwtevaluationperiods - !it_dimensions TYPE /aws1/cl_cwtdimension=>tt_dimensions - !iv_unit TYPE /aws1/cwtstandardunit - !iv_period TYPE /aws1/cwtperiod . - PROTECTED SECTION. - PRIVATE SECTION. -ENDCLASS. - - - -CLASS ZCL_AWS1_CWT_ACTIONS IMPLEMENTATION. - - - METHOD delete_alarms. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_cwt) = /aws1/cl_cwt_factory=>create( lo_session ). - - "snippet-start:[cwt.abapv1.delete_alarms] - TRY. - lo_cwt->deletealarms( - it_alarmnames = it_alarm_names ). - MESSAGE 'Alarms deleted.' TYPE 'I'. - CATCH /aws1/cx_cwtresourcenotfound. - MESSAGE 'Resource being accessed is not found.' TYPE 'E'. - ENDTRY. - "snippet-end:[cwt.abapv1.delete_alarms] - - ENDMETHOD. - - - METHOD describe_alarms. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_cwt) = /aws1/cl_cwt_factory=>create( lo_session ). - - "snippet-start:[cwt.abapv1.describe_alarms] - TRY. - oo_result = lo_cwt->describealarms( " oo_result is returned for testing purposes. " - it_alarmnames = it_alarm_names ). - MESSAGE 'Alarms retrieved.' TYPE 'I'. - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). - DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDTRY. - "snippet-end:[cwt.abapv1.describe_alarms] - - ENDMETHOD. - - - METHOD disable_alarm_actions. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_cwt) = /aws1/cl_cwt_factory=>create( lo_session ). - - "snippet-start:[cwt.abapv1.disable_alarm_actions] - - "Disables actions on the specified alarm. " - TRY. - lo_cwt->disablealarmactions( - it_alarmnames = it_alarm_names ). - MESSAGE 'Alarm actions disabled.' TYPE 'I'. - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). - DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDTRY. - "snippet-end:[cwt.abapv1.disable_alarm_actions] - - ENDMETHOD. - - - METHOD enable_alarm_actions. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_cwt) = /aws1/cl_cwt_factory=>create( lo_session ). - - "snippet-start:[cwt.abapv1.enable_alarm_actions] - - "Enable actions on the specified alarm." - TRY. - lo_cwt->enablealarmactions( - it_alarmnames = it_alarm_names ). - MESSAGE 'Alarm actions enabled.' TYPE 'I'. - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). - DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDTRY. - "snippet-end:[cwt.abapv1.enable_alarm_actions] - - ENDMETHOD. - - - METHOD list_metrics. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_cwt) = /aws1/cl_cwt_factory=>create( lo_session ). - - "snippet-start:[cwt.abapv1.list_metrics] - "The following list-metrics example displays the metrics for Amazon CloudWatch." - TRY. - oo_result = lo_cwt->listmetrics( " oo_result is returned for testing purposes. " - iv_namespace = iv_namespace ). - DATA(lt_metrics) = oo_result->get_metrics( ). - MESSAGE 'Metrics retrieved.' TYPE 'I'. - CATCH /aws1/cx_cwtinvparamvalueex. - MESSAGE 'The specified argument was not valid.' TYPE 'E'. - ENDTRY. - "snippet-end:[cwt.abapv1.list_metrics] - - ENDMETHOD. - - - METHOD put_metric_alarm. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_cwt) = /aws1/cl_cwt_factory=>create( lo_session ). - - "snippet-start:[cwt.abapv1.put_metric_alarm] - TRY. - lo_cwt->putmetricalarm( - iv_alarmname = iv_alarm_name - iv_comparisonoperator = iv_comparison_operator - iv_evaluationperiods = iv_evaluation_periods - iv_metricname = iv_metric_name - iv_namespace = iv_namespace - iv_statistic = iv_statistic - iv_threshold = iv_threshold - iv_actionsenabled = iv_actions_enabled - iv_alarmdescription = iv_alarm_description - iv_unit = iv_unit - iv_period = iv_period - it_dimensions = it_dimensions ). - MESSAGE 'Alarm created.' TYPE 'I'. - CATCH /aws1/cx_cwtlimitexceededfault. - MESSAGE 'The request processing has exceeded the limit' TYPE 'E'. - ENDTRY. - "snippet-end:[cwt.abapv1.put_metric_alarm] - - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/cloudwatch/zcl_aws1_cwt_actions.clas.testclasses.abap b/sap-abap/services/cloudwatch/zcl_aws1_cwt_actions.clas.testclasses.abap deleted file mode 100644 index 32065b25eb3..00000000000 --- a/sap-abap/services/cloudwatch/zcl_aws1_cwt_actions.clas.testclasses.abap +++ /dev/null @@ -1,574 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS ltc_zcl_aws1_cwt_actions DEFINITION FOR TESTING DURATION LONG RISK LEVEL DANGEROUS. - - PRIVATE SECTION. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA ao_cwt TYPE REF TO /aws1/if_cwt. - DATA ao_s3 TYPE REF TO /aws1/if_s3. - DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. - DATA ao_cwt_actions TYPE REF TO zcl_aws1_cwt_actions. - DATA lv_time_stamp TYPE timestamp. - DATA lv_found TYPE abap_bool VALUE abap_false. - - METHODS put_metric_alarm FOR TESTING. - METHODS delete_alarms FOR TESTING. - METHODS describe_alarms FOR TESTING. - METHODS enable_alarm_actions FOR TESTING. - METHODS disable_alarm_actions FOR TESTING. - METHODS list_metrics FOR TESTING. - METHODS setup RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic. - -ENDCLASS. "ltc_Zcl_Aws1_Cwt_Actions - - -CLASS ltc_zcl_aws1_cwt_actions IMPLEMENTATION. - - METHOD setup. - ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). - ao_cwt = /aws1/cl_cwt_factory=>create( ao_session ). - ao_s3 = /aws1/cl_s3_factory=>create( ao_session ). - ao_cwt_actions = NEW zcl_aws1_cwt_actions( ). - ENDMETHOD. - - METHOD put_metric_alarm. - - DATA lv_alarm_name TYPE /aws1/cwtalarmname. - DATA lt_alarmnames TYPE /aws1/cl_cwtalarmnames_w=>tt_alarmnames. - DATA lo_alarmname TYPE REF TO /aws1/cl_cwtalarmnames_w. - DATA lt_dimensions TYPE /aws1/cl_cwtdimension=>tt_dimensions. - DATA lo_dimensions TYPE REF TO /aws1/cl_cwtdimension. - DATA lo_alarm_list_result TYPE REF TO /aws1/cl_cwtdescralarmsoutput. - DATA lv_bucket_name TYPE /aws1/s3_bucketname. - DATA lv_uuid_16 TYPE sysuuid_x16. - - CONSTANTS cv_metric_name TYPE /aws1/cwtmetricname VALUE 'NumberOfObjects'. - CONSTANTS cv_namespace TYPE /aws1/cwtnamespace VALUE 'AWS/S3'. - CONSTANTS cv_comparison_operator TYPE /aws1/cwtcomparisonoperator VALUE 'GreaterThanThreshold'. - CONSTANTS cv_statistic TYPE /aws1/cwtstatistic VALUE 'Average'. - CONSTANTS cv_threshold TYPE /aws1/rt_double_as_string VALUE 10. - CONSTANTS cv_alarm_description TYPE /aws1/cwtalarmdescription VALUE 'Alarm when number of objects exceeds 10'. - CONSTANTS cv_actions_enabled TYPE /aws1/cwtactionsenabled VALUE ' '. - CONSTANTS cv_evaluation_periods TYPE /aws1/cwtevaluationperiods VALUE 1. - CONSTANTS cv_unit TYPE /aws1/cwtstandardunit VALUE 'Percent'. - CONSTANTS cv_period TYPE /aws1/cwtperiod VALUE 86400. - CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-cwt-'. - - "Create an Amazon Simple Storage Service (Amazon S3) bucket. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_bucket_name = cv_bucket_name && lv_uuid_16. - TRANSLATE lv_bucket_name TO LOWER CASE. - DATA(lo_s3_actions) = NEW zcl_aws1_s3_actions( ). - zcl_aws1_ex_utils=>create_bucket( iv_bucket = lv_bucket_name - io_s3 = ao_s3 - io_session = ao_session ). - "Define alarm name. - lv_alarm_name = 'code-example-cwt-s3-alarm-' && lv_uuid_16. - TRANSLATE lv_alarm_name TO LOWER CASE. - - "Create Amazon S3 dimensions. - lo_dimensions = NEW #( iv_name = 'StorageType' - iv_value = 'AllStorageTypes' ). - INSERT lo_dimensions INTO TABLE lt_dimensions. - - lo_dimensions = NEW #( iv_name = 'BucketName' - iv_value = lv_bucket_name ). - INSERT lo_dimensions INTO TABLE lt_dimensions. - - ao_cwt_actions->put_metric_alarm( - iv_alarm_name = lv_alarm_name - iv_metric_name = cv_metric_name - iv_namespace = cv_namespace - iv_comparison_operator = cv_comparison_operator - iv_statistic = cv_statistic - iv_threshold = cv_threshold - iv_alarm_description = cv_alarm_description - iv_actions_enabled = cv_actions_enabled - iv_evaluation_periods = cv_evaluation_periods - it_dimensions = lt_dimensions - iv_unit = cv_unit - iv_period = cv_period ). - - "Describe alarm. - lo_alarm_list_result = ao_cwt->describealarms( it_alarmnames = lt_alarmnames ). - - lv_found = abap_false. - - LOOP AT lo_alarm_list_result->get_metricalarms( ) INTO DATA(lo_alarms). - IF lo_alarms->get_alarmname( ) = lv_alarm_name. - lv_found = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Alarm not found| ). - - "Clean up. - lo_alarmname = NEW #( iv_value = lv_alarm_name ). - INSERT lo_alarmname INTO TABLE lt_alarmnames. - - ao_cwt->deletealarms( it_alarmnames = lt_alarmnames ). - - ao_s3->deletebucket( - iv_bucket = lv_bucket_name ). - - ENDMETHOD. - - METHOD delete_alarms. - - DATA lv_alarm_name TYPE /aws1/cwtalarmname. - DATA lt_alarmnames TYPE /aws1/cl_cwtalarmnames_w=>tt_alarmnames. - DATA lo_alarmname TYPE REF TO /aws1/cl_cwtalarmnames_w. - DATA lt_dimensions TYPE /aws1/cl_cwtdimension=>tt_dimensions. - DATA lo_dimensions TYPE REF TO /aws1/cl_cwtdimension. - DATA lo_alarm_list_result TYPE REF TO /aws1/cl_cwtdescralarmsoutput. - DATA lv_bucket_name TYPE /aws1/s3_bucketname. - DATA lv_uuid_16 TYPE sysuuid_x16. - - CONSTANTS cv_metric_name TYPE /aws1/cwtmetricname VALUE 'NumberOfObjects'. - CONSTANTS cv_namespace TYPE /aws1/cwtnamespace VALUE 'AWS/S3'. - CONSTANTS cv_comparison_operator TYPE /aws1/cwtcomparisonoperator VALUE 'GreaterThanThreshold'. - CONSTANTS cv_statistic TYPE /aws1/cwtstatistic VALUE 'Average'. - CONSTANTS cv_threshold TYPE /aws1/rt_double_as_string VALUE 10. - CONSTANTS cv_alarm_description TYPE /aws1/cwtalarmdescription VALUE 'Alarm when number of objects exceeds 10'. - CONSTANTS cv_actions_enabled TYPE /aws1/cwtactionsenabled VALUE ' '. - CONSTANTS cv_evaluation_periods TYPE /aws1/cwtevaluationperiods VALUE 1. - CONSTANTS cv_unit TYPE /aws1/cwtstandardunit VALUE 'Percent'. - CONSTANTS cv_period TYPE /aws1/cwtperiod VALUE 86400. - CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-cwt-'. - - "Create an S3 bucket. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_bucket_name = cv_bucket_name && lv_uuid_16. - TRANSLATE lv_bucket_name TO LOWER CASE. - DATA(lo_s3_actions) = NEW zcl_aws1_s3_actions( ). - zcl_aws1_ex_utils=>create_bucket( iv_bucket = lv_bucket_name - io_s3 = ao_s3 - io_session = ao_session ). - - "Define alarm name. - lv_alarm_name = 'code-example-cwt-s3-alarm-' && lv_uuid_16. - TRANSLATE lv_alarm_name TO LOWER CASE. - - "Create Amazon S3 dimensions. - lo_dimensions = NEW #( iv_name = 'StorageType' - iv_value = 'AllStorageTypes' ). - INSERT lo_dimensions INTO TABLE lt_dimensions. - - lo_dimensions = NEW #( iv_name = 'BucketName' - iv_value = lv_bucket_name ). - INSERT lo_dimensions INTO TABLE lt_dimensions. - - ao_cwt->putmetricalarm( - iv_alarmname = lv_alarm_name - iv_metricname = cv_metric_name - iv_namespace = cv_namespace - iv_comparisonoperator = cv_comparison_operator - iv_statistic = cv_statistic - iv_threshold = cv_threshold - iv_alarmdescription = cv_alarm_description - iv_actionsenabled = cv_actions_enabled - iv_evaluationperiods = cv_evaluation_periods - iv_unit = cv_unit - iv_period = cv_period - it_dimensions = lt_dimensions ). - - "Test delete_alarm. - lo_alarmname = NEW #( iv_value = lv_alarm_name ). - INSERT lo_alarmname INTO TABLE lt_alarmnames. - - ao_cwt_actions->delete_alarms( lt_alarmnames ). - - "Describe alarm. - lo_alarm_list_result = ao_cwt->describealarms( it_alarmnames = lt_alarmnames ). - - "Validation. - lv_found = abap_false. - LOOP AT lo_alarm_list_result->get_metricalarms( ) INTO DATA(lo_alarms). - IF lo_alarms->get_alarmname( ) = lv_alarm_name. - lv_found = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_false( - act = lv_found - msg = |Alarm not deleted| ). - - "Clean up. - ao_s3->deletebucket( - iv_bucket = lv_bucket_name ). - - ENDMETHOD. - - METHOD describe_alarms. - - DATA lv_alarm_name TYPE /aws1/cwtalarmname. - DATA lt_alarmnames TYPE /aws1/cl_cwtalarmnames_w=>tt_alarmnames. - DATA lo_alarmname TYPE REF TO /aws1/cl_cwtalarmnames_w. - DATA lt_dimensions TYPE /aws1/cl_cwtdimension=>tt_dimensions. - DATA lo_dimensions TYPE REF TO /aws1/cl_cwtdimension. - DATA lo_alarm_list_result TYPE REF TO /aws1/cl_cwtdescralarmsoutput. - DATA lv_bucket_name TYPE /aws1/s3_bucketname. - DATA lv_uuid_16 TYPE sysuuid_x16. - - CONSTANTS cv_metric_name TYPE /aws1/cwtmetricname VALUE 'NumberOfObjects'. - CONSTANTS cv_namespace TYPE /aws1/cwtnamespace VALUE 'AWS/S3'. - CONSTANTS cv_comparison_operator TYPE /aws1/cwtcomparisonoperator VALUE 'GreaterThanThreshold'. - CONSTANTS cv_statistic TYPE /aws1/cwtstatistic VALUE 'Average'. - CONSTANTS cv_threshold TYPE /aws1/rt_double_as_string VALUE 10. - CONSTANTS cv_alarm_description TYPE /aws1/cwtalarmdescription VALUE 'Alarm when number of objects exceeds 10'. - CONSTANTS cv_actions_enabled TYPE /aws1/cwtactionsenabled VALUE ' '. - CONSTANTS cv_evaluation_periods TYPE /aws1/cwtevaluationperiods VALUE 1. - CONSTANTS cv_unit TYPE /aws1/cwtstandardunit VALUE 'Percent'. - CONSTANTS cv_period TYPE /aws1/cwtperiod VALUE 86400. - CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-cwt-'. - - "Create an S3 bucket. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_bucket_name = cv_bucket_name && lv_uuid_16. - TRANSLATE lv_bucket_name TO LOWER CASE. - - DATA(lo_s3_actions) = NEW zcl_aws1_s3_actions( ). - zcl_aws1_ex_utils=>create_bucket( iv_bucket = lv_bucket_name - io_s3 = ao_s3 - io_session = ao_session ). - - "Define alarm name. - lv_alarm_name = 'code-example-cwt-s3-alarm-' && lv_uuid_16. - TRANSLATE lv_alarm_name TO LOWER CASE. - - "Create Amazon S3 dimensions. - lo_dimensions = NEW #( iv_name = 'StorageType' - iv_value = 'AllStorageTypes' ). - INSERT lo_dimensions INTO TABLE lt_dimensions. - - lo_dimensions = NEW #( iv_name = 'BucketName' - iv_value = lv_bucket_name ). - INSERT lo_dimensions INTO TABLE lt_dimensions. - - ao_cwt->putmetricalarm( - iv_alarmname = lv_alarm_name - iv_metricname = cv_metric_name - iv_namespace = cv_namespace - iv_comparisonoperator = cv_comparison_operator - iv_statistic = cv_statistic - iv_threshold = cv_threshold - iv_alarmdescription = cv_alarm_description - iv_actionsenabled = cv_actions_enabled - iv_evaluationperiods = cv_evaluation_periods - iv_unit = cv_unit - iv_period = cv_period - it_dimensions = lt_dimensions ). - - "Test describe_alarms. - lo_alarmname = NEW #( iv_value = lv_alarm_name ). - INSERT lo_alarmname INTO TABLE lt_alarmnames. - - ao_cwt_actions->describe_alarms( - EXPORTING it_alarm_names = lt_alarmnames - IMPORTING oo_result = lo_alarm_list_result ). - - "Validation. - lv_found = abap_false. - - LOOP AT lo_alarm_list_result->get_metricalarms( ) INTO DATA(lo_alarms). - IF lo_alarms->get_alarmname( ) = lv_alarm_name. - lv_found = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Alarm not found| ). - - "Clean up. - ao_cwt->deletealarms( it_alarmnames = lt_alarmnames ). - - ao_s3->deletebucket( - iv_bucket = lv_bucket_name ). - - ENDMETHOD. - - METHOD enable_alarm_actions. - - DATA lv_alarm_name TYPE /aws1/cwtalarmname. - DATA lt_alarmnames TYPE /aws1/cl_cwtalarmnames_w=>tt_alarmnames. - DATA lo_alarmname TYPE REF TO /aws1/cl_cwtalarmnames_w. - DATA lt_dimensions TYPE /aws1/cl_cwtdimension=>tt_dimensions. - DATA lo_dimensions TYPE REF TO /aws1/cl_cwtdimension. - DATA lo_alarm_list_result TYPE REF TO /aws1/cl_cwtdescralarmsoutput. - DATA lv_bucket_name TYPE /aws1/s3_bucketname. - DATA lv_uuid_16 TYPE sysuuid_x16. - - CONSTANTS cv_metric_name TYPE /aws1/cwtmetricname VALUE 'NumberOfObjects'. - CONSTANTS cv_namespace TYPE /aws1/cwtnamespace VALUE 'AWS/S3'. - CONSTANTS cv_comparison_operator TYPE /aws1/cwtcomparisonoperator VALUE 'GreaterThanThreshold'. - CONSTANTS cv_statistic TYPE /aws1/cwtstatistic VALUE 'Average'. - CONSTANTS cv_threshold TYPE /aws1/rt_double_as_string VALUE 10. - CONSTANTS cv_alarm_description TYPE /aws1/cwtalarmdescription VALUE 'Alarm when number of objects exceeds 10'. - CONSTANTS cv_actions_enabled TYPE /aws1/cwtactionsenabled VALUE ' '. - CONSTANTS cv_evaluation_periods TYPE /aws1/cwtevaluationperiods VALUE 1. - CONSTANTS cv_unit TYPE /aws1/cwtstandardunit VALUE 'Percent'. - CONSTANTS cv_period TYPE /aws1/cwtperiod VALUE 86400. - CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-cwt-'. - - "Create an S3 bucket. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_bucket_name = cv_bucket_name && lv_uuid_16. - TRANSLATE lv_bucket_name TO LOWER CASE. - - DATA(lo_s3_actions) = NEW zcl_aws1_s3_actions( ). - zcl_aws1_ex_utils=>create_bucket( iv_bucket = lv_bucket_name - io_s3 = ao_s3 - io_session = ao_session ). - - "Define alarm name. - lv_alarm_name = 'code-example-cwt-s3-alarm-' && lv_uuid_16. - TRANSLATE lv_alarm_name TO LOWER CASE. - - "Create Amazon S3 dimensions. - lo_dimensions = NEW #( iv_name = 'StorageType' - iv_value = 'AllStorageTypes' ). - INSERT lo_dimensions INTO TABLE lt_dimensions. - - lo_dimensions = NEW #( iv_name = 'BucketName' - iv_value = lv_bucket_name ). - INSERT lo_dimensions INTO TABLE lt_dimensions. - - ao_cwt->putmetricalarm( - iv_alarmname = lv_alarm_name - iv_metricname = cv_metric_name - iv_namespace = cv_namespace - iv_comparisonoperator = cv_comparison_operator - iv_statistic = cv_statistic - iv_threshold = cv_threshold - iv_alarmdescription = cv_alarm_description - iv_actionsenabled = cv_actions_enabled - iv_evaluationperiods = cv_evaluation_periods - iv_unit = cv_unit - iv_period = cv_period - it_dimensions = lt_dimensions ). - - "Testing enable_alarm_actions. - lo_alarmname = NEW #( iv_value = lv_alarm_name ). - INSERT lo_alarmname INTO TABLE lt_alarmnames. - - ao_cwt_actions->enable_alarm_actions( lt_alarmnames ). - - "Validation. - lo_alarm_list_result = ao_cwt->describealarms( - it_alarmnames = lt_alarmnames ). - - lv_found = abap_false. - - LOOP AT lo_alarm_list_result->get_metricalarms( ) INTO DATA(lo_alarms). - IF lo_alarms->get_actionsenabled( ) = 'X'. - lv_found = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Alarm actions not enabled| ). - - "Clean up. - lo_alarmname = NEW #( iv_value = lv_alarm_name ). - INSERT lo_alarmname INTO TABLE lt_alarmnames. - - ao_cwt->deletealarms( it_alarmnames = lt_alarmnames ). - - ao_s3->deletebucket( - iv_bucket = lv_bucket_name ). - - ENDMETHOD. - - METHOD disable_alarm_actions. - - DATA lv_alarm_name TYPE /aws1/cwtalarmname. - DATA lt_alarmnames TYPE /aws1/cl_cwtalarmnames_w=>tt_alarmnames. - DATA lo_alarmname TYPE REF TO /aws1/cl_cwtalarmnames_w. - DATA lt_dimensions TYPE /aws1/cl_cwtdimension=>tt_dimensions. - DATA lo_dimensions TYPE REF TO /aws1/cl_cwtdimension. - DATA lo_alarm_list_result TYPE REF TO /aws1/cl_cwtdescralarmsoutput. - DATA lv_bucket_name TYPE /aws1/s3_bucketname. - DATA lv_uuid_16 TYPE sysuuid_x16. - - CONSTANTS cv_metric_name TYPE /aws1/cwtmetricname VALUE 'NumberOfObjects'. - CONSTANTS cv_namespace TYPE /aws1/cwtnamespace VALUE 'AWS/S3'. - CONSTANTS cv_comparison_operator TYPE /aws1/cwtcomparisonoperator VALUE 'GreaterThanThreshold'. - CONSTANTS cv_statistic TYPE /aws1/cwtstatistic VALUE 'Average'. - CONSTANTS cv_threshold TYPE /aws1/rt_double_as_string VALUE 10. - CONSTANTS cv_alarm_description TYPE /aws1/cwtalarmdescription VALUE 'Alarm when number of objects exceeds 10'. - CONSTANTS cv_actions_enabled TYPE /aws1/cwtactionsenabled VALUE 'X'. - CONSTANTS cv_evaluation_periods TYPE /aws1/cwtevaluationperiods VALUE 1. - CONSTANTS cv_unit TYPE /aws1/cwtstandardunit VALUE 'Percent'. - CONSTANTS cv_period TYPE /aws1/cwtperiod VALUE 86400. - CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-cwt-'. - - "Create an S3 bucket. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_bucket_name = cv_bucket_name && lv_uuid_16. - TRANSLATE lv_bucket_name TO LOWER CASE. - - DATA(lo_s3_actions) = NEW zcl_aws1_s3_actions( ). - zcl_aws1_ex_utils=>create_bucket( iv_bucket = lv_bucket_name - io_s3 = ao_s3 - io_session = ao_session ). - - "Define alarm name. - lv_alarm_name = 'code-example-cwt-s3-alarm-' && lv_uuid_16. - TRANSLATE lv_alarm_name TO LOWER CASE. - - "Create Amazon S3 dimensions. - lo_dimensions = NEW #( iv_name = 'StorageType' - iv_value = 'AllStorageTypes' ). - INSERT lo_dimensions INTO TABLE lt_dimensions. - - lo_dimensions = NEW #( iv_name = 'BucketName' - iv_value = lv_bucket_name ). - INSERT lo_dimensions INTO TABLE lt_dimensions. - - ao_cwt->putmetricalarm( - iv_alarmname = lv_alarm_name - iv_metricname = cv_metric_name - iv_namespace = cv_namespace - iv_comparisonoperator = cv_comparison_operator - iv_statistic = cv_statistic - iv_threshold = cv_threshold - iv_alarmdescription = cv_alarm_description - iv_actionsenabled = cv_actions_enabled - iv_evaluationperiods = cv_evaluation_periods - iv_unit = cv_unit - iv_period = cv_period - it_dimensions = lt_dimensions ). - - "Testing disable_alarm_actions. - lo_alarmname = NEW #( iv_value = lv_alarm_name ). - INSERT lo_alarmname INTO TABLE lt_alarmnames. - - ao_cwt_actions->disable_alarm_actions( lt_alarmnames ). - - "Validation. - lo_alarm_list_result = ao_cwt->describealarms( - it_alarmnames = lt_alarmnames ). - - lv_found = abap_false. - - LOOP AT lo_alarm_list_result->get_metricalarms( ) INTO DATA(lo_alarms). - IF lo_alarms->get_actionsenabled( ) = ' '. - lv_found = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Alarm actions not disabled| ). - - "Clean up. - lo_alarmname = NEW #( iv_value = lv_alarm_name ). - INSERT lo_alarmname INTO TABLE lt_alarmnames. - - ao_cwt->deletealarms( it_alarmnames = lt_alarmnames ). - - ao_s3->deletebucket( - iv_bucket = lv_bucket_name ). - - ENDMETHOD. - - METHOD list_metrics. - - DATA lv_alarm_name TYPE /aws1/cwtalarmname. - DATA lt_alarmnames TYPE /aws1/cl_cwtalarmnames_w=>tt_alarmnames. - DATA lo_alarmname TYPE REF TO /aws1/cl_cwtalarmnames_w. - DATA lt_dimensions TYPE /aws1/cl_cwtdimension=>tt_dimensions. - DATA lo_dimensions TYPE REF TO /aws1/cl_cwtdimension. - DATA lo_alarm_list_result TYPE REF TO /aws1/cl_cwtdescralarmsoutput. - DATA lv_bucket_name TYPE /aws1/s3_bucketname. - DATA lo_metrics_result TYPE REF TO /aws1/cl_cwtlistmetricsoutput. - DATA lo_list_metrics_result TYPE REF TO /aws1/cl_cwtlistmetricsoutput. - DATA lv_uuid_16 TYPE sysuuid_x16. - DATA lt_metrics TYPE /aws1/cl_cwtmetric=>tt_metrics. - DATA lo_metrics TYPE REF TO /aws1/cl_cwtmetric. - - CONSTANTS cv_metric_name TYPE /aws1/cwtmetricname VALUE 'NumberOfObjects'. - CONSTANTS cv_namespace TYPE /aws1/cwtnamespace VALUE 'AWS/S3'. - CONSTANTS cv_comparison_operator TYPE /aws1/cwtcomparisonoperator VALUE 'GreaterThanThreshold'. - CONSTANTS cv_statistic TYPE /aws1/cwtstatistic VALUE 'Average'. - CONSTANTS cv_threshold TYPE /aws1/rt_double_as_string VALUE 10. - CONSTANTS cv_alarm_description TYPE /aws1/cwtalarmdescription VALUE 'Alarm when number of objects exceeds 10'. - CONSTANTS cv_actions_enabled TYPE /aws1/cwtactionsenabled VALUE 'X'. - CONSTANTS cv_evaluation_periods TYPE /aws1/cwtevaluationperiods VALUE 1. - CONSTANTS cv_unit TYPE /aws1/cwtstandardunit VALUE 'Percent'. - CONSTANTS cv_period TYPE /aws1/cwtperiod VALUE 86400. - CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-cwt-'. - - "Create an S3 bucket. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_bucket_name = cv_bucket_name && lv_uuid_16. - TRANSLATE lv_bucket_name TO LOWER CASE. - - DATA(lo_s3_actions) = NEW zcl_aws1_s3_actions( ). - zcl_aws1_ex_utils=>create_bucket( iv_bucket = lv_bucket_name - io_s3 = ao_s3 - io_session = ao_session ). - - "Define alarm name. - lv_alarm_name = 'code-example-cwt-s3-alarm-' && lv_uuid_16. - TRANSLATE lv_alarm_name TO LOWER CASE. - - "Create Amazon S3 dimensions. - lo_dimensions = NEW #( iv_name = 'StorageType' - iv_value = 'AllStorageTypes' ). - INSERT lo_dimensions INTO TABLE lt_dimensions. - - lo_dimensions = NEW #( iv_name = 'BucketName' - iv_value = lv_bucket_name ). - INSERT lo_dimensions INTO TABLE lt_dimensions. - - ao_cwt->putmetricalarm( - iv_alarmname = lv_alarm_name - iv_metricname = cv_metric_name - iv_namespace = cv_namespace - iv_comparisonoperator = cv_comparison_operator - iv_statistic = cv_statistic - iv_threshold = cv_threshold - iv_alarmdescription = cv_alarm_description - iv_actionsenabled = cv_actions_enabled - iv_evaluationperiods = cv_evaluation_periods - iv_unit = cv_unit - iv_period = cv_period - it_dimensions = lt_dimensions ). - - "Testing list_metrics. - ao_cwt_actions->list_metrics( EXPORTING iv_namespace = 'AWS/S3' IMPORTING oo_result = lo_list_metrics_result ). - lt_metrics = lo_list_metrics_result->get_metrics( ). - - "Validation. - lv_found = abap_false. - - LOOP AT lt_metrics INTO lo_metrics. - IF lo_metrics->get_namespace( ) = 'AWS/S3'. - lv_found = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |No metric found| ). - - "Clean up. - lo_alarmname = NEW #( iv_value = lv_alarm_name ). - INSERT lo_alarmname INTO TABLE lt_alarmnames. - - ao_cwt->deletealarms( it_alarmnames = lt_alarmnames ). - - ao_s3->deletebucket( - iv_bucket = lv_bucket_name ). - - ENDMETHOD. - - -ENDCLASS. diff --git a/sap-abap/services/cloudwatch/zcl_aws1_cwt_actions.clas.xml b/sap-abap/services/cloudwatch/zcl_aws1_cwt_actions.clas.xml deleted file mode 100644 index 9e889288872..00000000000 --- a/sap-abap/services/cloudwatch/zcl_aws1_cwt_actions.clas.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - ZCL_AWS1_CWT_ACTIONS - E - CloudWatch Code Example Actions - 1 - X - X - X - X - - - - DELETE_ALARMS - E - Delete CloudWatch alarm - - - DESCRIBE_ALARMS - E - Describe CloudWatch alarm - - - DISABLE_ALARM_ACTIONS - E - Disable CloudWatch alarm - - - ENABLE_ALARM_ACTIONS - E - Enable CloudWatch Alarm - - - LIST_METRICS - E - List CloudWatch metrics - - - PUT_METRIC_ALARM - E - Create a CloudWatch alarm - - - - - diff --git a/sap-abap/services/cloudwatch/zcl_aws1_cwt_scenario.clas.abap b/sap-abap/services/cloudwatch/zcl_aws1_cwt_scenario.clas.abap deleted file mode 100644 index 714580f1a98..00000000000 --- a/sap-abap/services/cloudwatch/zcl_aws1_cwt_scenario.clas.abap +++ /dev/null @@ -1,110 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS zcl_aws1_cwt_scenario DEFINITION - PUBLIC - FINAL - CREATE PUBLIC . - - PUBLIC SECTION. - - METHODS getting_started_with_cwt - IMPORTING - !iv_alarm_name TYPE /aws1/cwtalarmname - !iv_metric_name TYPE /aws1/cwtmetricname - !iv_namespace TYPE /aws1/cwtnamespace - !iv_comparison_operator TYPE /aws1/cwtcomparisonoperator - !iv_statistic TYPE /aws1/cwtstatistic - !iv_threshold TYPE /aws1/rt_double_as_string - !iv_alarm_description TYPE /aws1/cwtalarmdescription - !iv_actions_enabled TYPE /aws1/cwtactionsenabled - !iv_evaluation_periods TYPE /aws1/cwtevaluationperiods - !it_dimensions TYPE /aws1/cl_cwtdimension=>tt_dimensions - !iv_unit TYPE /aws1/cwtstandardunit - !iv_period TYPE /aws1/cwtperiod - EXPORTING - !oo_result TYPE REF TO /aws1/cl_cwtdescralarmsoutput . - PROTECTED SECTION. - PRIVATE SECTION. -ENDCLASS. - - - -CLASS ZCL_AWS1_CWT_SCENARIO IMPLEMENTATION. - - - METHOD getting_started_with_cwt. - - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_cwt) = /aws1/cl_cwt_factory=>create( lo_session ). - - "This example scenario contains the following actions:" - " 1. Create an Amazon CloudWatch alarm for the Amazon Simple Storage Service (Amazon S3) bucket " - " 2. Disable the CloudWatch alarm actions " - " 3. Describe the CloudWatch alarm " - " 4. Delete the alarm " - - "snippet-start:[cwt.abapv1.getting_started_with_cwt] - - DATA lt_alarmnames TYPE /aws1/cl_cwtalarmnames_w=>tt_alarmnames. - DATA lo_alarmname TYPE REF TO /aws1/cl_cwtalarmnames_w. - - "Create an alarm" - TRY. - lo_cwt->putmetricalarm( - iv_alarmname = iv_alarm_name - iv_comparisonoperator = iv_comparison_operator - iv_evaluationperiods = iv_evaluation_periods - iv_metricname = iv_metric_name - iv_namespace = iv_namespace - iv_statistic = iv_statistic - iv_threshold = iv_threshold - iv_actionsenabled = iv_actions_enabled - iv_alarmdescription = iv_alarm_description - iv_unit = iv_unit - iv_period = iv_period - it_dimensions = it_dimensions ). - MESSAGE 'Alarm created' TYPE 'I'. - CATCH /aws1/cx_cwtlimitexceededfault. - MESSAGE 'The request processing has exceeded the limit' TYPE 'E'. - ENDTRY. - - "Create an ABAP internal table for the created alarm." - lo_alarmname = NEW #( iv_value = iv_alarm_name ). - INSERT lo_alarmname INTO TABLE lt_alarmnames. - - "Disable alarm actions." - TRY. - lo_cwt->disablealarmactions( - it_alarmnames = lt_alarmnames ). - MESSAGE 'Alarm actions disabled' TYPE 'I'. - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_disablealarm_exception). - DATA(lv_disablealarm_error) = |"{ lo_disablealarm_exception->av_err_code }" - { lo_disablealarm_exception->av_err_msg }|. - MESSAGE lv_disablealarm_error TYPE 'E'. - ENDTRY. - - "Describe alarm using the same ABAP internal table." - TRY. - oo_result = lo_cwt->describealarms( " oo_result is returned for testing purpose " - it_alarmnames = lt_alarmnames ). - MESSAGE 'Alarms retrieved' TYPE 'I'. - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_describealarms_exception). - DATA(lv_describealarms_error) = |"{ lo_describealarms_exception->av_err_code }" - { lo_describealarms_exception->av_err_msg }|. - MESSAGE lv_describealarms_error TYPE 'E'. - ENDTRY. - - "Delete alarm." - TRY. - lo_cwt->deletealarms( - it_alarmnames = lt_alarmnames ). - MESSAGE 'Alarms deleted' TYPE 'I'. - CATCH /aws1/cx_cwtresourcenotfound. - MESSAGE 'Resource being access is not found.' TYPE 'E'. - ENDTRY. - "snippet-end:[cwt.abapv1.getting_started_with_cwt] - - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/cloudwatch/zcl_aws1_cwt_scenario.clas.testclasses.abap b/sap-abap/services/cloudwatch/zcl_aws1_cwt_scenario.clas.testclasses.abap deleted file mode 100644 index 2b490381c1c..00000000000 --- a/sap-abap/services/cloudwatch/zcl_aws1_cwt_scenario.clas.testclasses.abap +++ /dev/null @@ -1,122 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS ltc_zcl_aws1_cwt_scenario DEFINITION FOR TESTING DURATION LONG RISK LEVEL DANGEROUS. - - PRIVATE SECTION. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA ao_cwt TYPE REF TO /aws1/if_cwt. - DATA ao_s3 TYPE REF TO /aws1/if_s3. - DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. - DATA ao_cwt_scenario TYPE REF TO zcl_aws1_cwt_scenario. - - METHODS getting_started_with_cwt FOR TESTING. - METHODS setup RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic. -ENDCLASS. "ltc_Zcl_Aws1_Cwt_Scenario - - -CLASS ltc_zcl_aws1_cwt_scenario IMPLEMENTATION. - - METHOD setup. - ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). - ao_cwt = /aws1/cl_cwt_factory=>create( ao_session ). - ao_s3 = /aws1/cl_s3_factory=>create( ao_session ). - ao_cwt_scenario = NEW zcl_aws1_cwt_scenario( ). - ENDMETHOD. - - METHOD getting_started_with_cwt. - - DATA lv_alarm_name TYPE /aws1/cwtalarmname. - DATA lt_alarmnames TYPE /aws1/cl_cwtalarmnames_w=>tt_alarmnames. - DATA lo_alarmname TYPE REF TO /aws1/cl_cwtalarmnames_w. - DATA lt_dimensions TYPE /aws1/cl_cwtdimension=>tt_dimensions. - DATA lo_dimensions TYPE REF TO /aws1/cl_cwtdimension. - DATA lo_alarm_list_result TYPE REF TO /aws1/cl_cwtdescralarmsoutput. - DATA lv_bucket_name TYPE /aws1/s3_bucketname. - DATA lv_uuid_16 TYPE sysuuid_x16. - DATA lo_result TYPE REF TO /aws1/cl_cwtdescralarmsoutput. - - - CONSTANTS cv_metric_name TYPE /aws1/cwtmetricname VALUE 'NumberOfObjects'. - CONSTANTS cv_namespace TYPE /aws1/cwtnamespace VALUE 'AWS/S3'. - CONSTANTS cv_comparison_operator TYPE /aws1/cwtcomparisonoperator VALUE 'GreaterThanThreshold'. - CONSTANTS cv_statistic TYPE /aws1/cwtstatistic VALUE 'Average'. - CONSTANTS cv_threshold TYPE /aws1/rt_double_as_string VALUE 10. - CONSTANTS cv_alarm_description TYPE /aws1/cwtalarmdescription VALUE 'Alarm when number of objects exceeds 10'. - CONSTANTS cv_actions_enabled TYPE /aws1/cwtactionsenabled VALUE ' '. - CONSTANTS cv_evaluation_periods TYPE /aws1/cwtevaluationperiods VALUE 1. - CONSTANTS cv_unit TYPE /aws1/cwtstandardunit VALUE 'Percent'. - CONSTANTS cv_period TYPE /aws1/cwtperiod VALUE 86400. - CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-cwt-'. - - "Create an Amazon Simple Storage Service (Amazon S3) bucket. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_bucket_name = cv_bucket_name && lv_uuid_16. - TRANSLATE lv_bucket_name TO LOWER CASE. - - DATA(lo_s3_actions) = NEW zcl_aws1_s3_actions( ). - lo_s3_actions->create_bucket( lv_bucket_name ). - - "Define alarm name. - lv_alarm_name = 'code-example-cwt-s3-alarm-' && lv_uuid_16. - TRANSLATE lv_alarm_name TO LOWER CASE. - - "Create Amazon S3 dimensions. - lo_dimensions = NEW #( iv_name = 'StorageType' - iv_value = 'AllStorageTypes' ). - INSERT lo_dimensions INTO TABLE lt_dimensions. - - lo_dimensions = NEW #( iv_name = 'BucketName' - iv_value = lv_bucket_name ). - INSERT lo_dimensions INTO TABLE lt_dimensions. - - ao_cwt_scenario->getting_started_with_cwt( - EXPORTING - iv_alarm_name = lv_alarm_name - iv_metric_name = cv_metric_name - iv_namespace = cv_namespace - iv_comparison_operator = cv_comparison_operator - iv_statistic = cv_statistic - iv_threshold = cv_threshold - iv_alarm_description = cv_alarm_description - iv_actions_enabled = cv_actions_enabled - iv_evaluation_periods = cv_evaluation_periods - it_dimensions = lt_dimensions - iv_unit = cv_unit - iv_period = cv_period - IMPORTING - oo_result = lo_result ). - - "Validation. - DATA(lv_found) = abap_false. - - LOOP AT lo_result->get_metricalarms( ) INTO DATA(lo_alarms). - IF lo_alarms->get_actionsenabled( ) = ' '. - lv_found = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Alarm actions not disabled| ). - - lo_alarmname = NEW #( iv_value = lv_alarm_name ). - INSERT lo_alarmname INTO TABLE lt_alarmnames. - lo_alarm_list_result = ao_cwt->describealarms( it_alarmnames = lt_alarmnames ). - lv_found = abap_false. - LOOP AT lo_alarm_list_result->get_metricalarms( ) INTO lo_alarms. - IF lo_alarms->get_alarmname( ) = lv_alarm_name. - lv_found = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_false( - act = lv_found - msg = |Alarm not deleted| ). - - ao_s3->deletebucket( - iv_bucket = lv_bucket_name ). - - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/cloudwatch/zcl_aws1_cwt_scenario.clas.xml b/sap-abap/services/cloudwatch/zcl_aws1_cwt_scenario.clas.xml deleted file mode 100644 index 0964bfdcf4c..00000000000 --- a/sap-abap/services/cloudwatch/zcl_aws1_cwt_scenario.clas.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - ZCL_AWS1_CWT_SCENARIO - E - CloudWatch Code Example Scenario - 1 - X - X - X - X - - - - GETTING_STARTED_WITH_CWT - E - Getting started with Amazon CloudWatch - - - - - diff --git a/sap-abap/services/cpd/zcl_aws1_cpd_actions.clas.abap b/sap-abap/services/cpd/zcl_aws1_cpd_actions.clas.abap deleted file mode 100644 index 5b0de5e3f2b..00000000000 --- a/sap-abap/services/cpd/zcl_aws1_cpd_actions.clas.abap +++ /dev/null @@ -1,47 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -class ZCL_AWS1_CPD_ACTIONS definition - public - final - create public . - -public section. - METHODS detectsentiment - EXPORTING VALUE(oo_result) TYPE REF TO /aws1/cl_cpddetectsentimentrsp . -protected section. -private section. - -ENDCLASS. - - - -CLASS ZCL_AWS1_CPD_ACTIONS IMPLEMENTATION. - - - METHOD detectsentiment. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_cpd) = /aws1/cl_cpd_factory=>create( lo_session ). - - DATA(lv_text) = |I love unicorns!| . - DATA(lv_language_code) = |en| . - - - " snippet-start:[cpd.abapv1.detect_sentiment] - TRY. - oo_result = lo_cpd->detectsentiment( - iv_languagecode = lv_language_code - iv_text = lv_text - ). - - MESSAGE |Detected sentiment: { oo_result->get_sentiment( ) }| TYPE 'I'. - - CATCH /aws1/cx_cpdtextsizelmtexcdex INTO DATA(lo_cpdex) . - MESSAGE 'The size of the input text exceeds the limit. Use a smaller document.' TYPE 'E'. - - ENDTRY. - " snippet-end:[cpd.abapv1.detect_sentiment] - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/cpd/zcl_aws1_cpd_actions.clas.testclasses.abap b/sap-abap/services/cpd/zcl_aws1_cpd_actions.clas.testclasses.abap deleted file mode 100644 index 29af606d68b..00000000000 --- a/sap-abap/services/cpd/zcl_aws1_cpd_actions.clas.testclasses.abap +++ /dev/null @@ -1,37 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS ltc_zcl_aws1_cpd_actions DEFINITION FOR TESTING - DURATION SHORT - RISK LEVEL HARMLESS. - - PRIVATE SECTION. - DATA ao_cpd_actions TYPE REF TO zcl_aws1_cpd_actions. - METHODS: detectsentiment FOR TESTING. -ENDCLASS. "ltc_Zcl_Aws1_Cpd_Actions - - -CLASS ltc_zcl_aws1_cpd_actions IMPLEMENTATION. - - METHOD detectsentiment. - ao_cpd_actions = NEW zcl_aws1_cpd_actions( ). - DATA lo_output TYPE REF TO /aws1/cl_cpddetectsentimentrsp. - DATA(lv_expected_output) = |POSITIVE|. - - ao_cpd_actions->detectsentiment( - IMPORTING - oo_result = lo_output ). - - DATA(lv_found) = abap_true. - IF lo_output->has_sentiment( ) = abap_true. - IF lo_output->ask_sentiment( ) = lv_expected_output. - lv_found = abap_true. - ENDIF. - ENDIF. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Sentiment detection failed| ). - ENDMETHOD. - -ENDCLASS. diff --git a/sap-abap/services/cpd/zcl_aws1_cpd_actions.clas.xml b/sap-abap/services/cpd/zcl_aws1_cpd_actions.clas.xml deleted file mode 100644 index cf647da1aa3..00000000000 --- a/sap-abap/services/cpd/zcl_aws1_cpd_actions.clas.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - ZCL_AWS1_CPD_ACTIONS - E - Comprehend Code Example - 1 - X - X - X - X - - - - diff --git a/sap-abap/services/cloudwatch/README.md b/sap-abap/services/cwt/README.md similarity index 100% rename from sap-abap/services/cloudwatch/README.md rename to sap-abap/services/cwt/README.md diff --git a/sap-abap/services/dyn/zcl_aws1_dyn_actions.clas.abap b/sap-abap/services/dyn/zcl_aws1_dyn_actions.clas.abap deleted file mode 100644 index 1f1772d573d..00000000000 --- a/sap-abap/services/dyn/zcl_aws1_dyn_actions.clas.abap +++ /dev/null @@ -1,354 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS zcl_aws1_dyn_actions DEFINITION - PUBLIC - FINAL - CREATE PUBLIC . - - PUBLIC SECTION. - PROTECTED SECTION. - PRIVATE SECTION. - - METHODS create_table - IMPORTING - VALUE(iv_table_name) TYPE /aws1/dyntablename - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_dyncreatetableoutput . - METHODS describe_table - IMPORTING - VALUE(iv_table_name) TYPE /aws1/dyntablename - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_dyndescrtableoutput . - METHODS delete_table - IMPORTING - VALUE(iv_table_name) TYPE /aws1/dyntablename . - METHODS list_tables - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_dynlisttablesoutput . - METHODS put_item - IMPORTING - VALUE(iv_table_name) TYPE /aws1/dyntablename - VALUE(it_item) TYPE /aws1/cl_dynattributevalue=>tt_putiteminputattributemap . - METHODS get_item - IMPORTING - VALUE(iv_table_name) TYPE /aws1/dyntablename - !it_key TYPE /aws1/cl_dynattributevalue=>tt_key - RETURNING - VALUE(oo_item) TYPE REF TO /aws1/cl_dyngetitemoutput . - METHODS update_item - IMPORTING - VALUE(iv_table_name) TYPE /aws1/dyntablename - VALUE(it_item_key) TYPE /aws1/cl_dynattributevalue=>tt_key - VALUE(it_attribute_updates) TYPE /aws1/cl_dynattrvalueupdate=>tt_attributeupdates - RETURNING - VALUE(oo_output) TYPE REF TO /aws1/cl_dynupdateitemoutput . - METHODS delete_item - IMPORTING - VALUE(iv_table_name) TYPE /aws1/dyntablename - VALUE(it_key_input) TYPE /aws1/cl_dynattributevalue=>tt_key . - METHODS query_table - IMPORTING - VALUE(iv_table_name) TYPE /aws1/dyntablename - VALUE(iv_year) TYPE numeric - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_dynqueryoutput . - METHODS scan_items - IMPORTING - VALUE(iv_table_name) TYPE /aws1/dyntablename - !iv_rating TYPE numeric - RETURNING - VALUE(oo_scan_result) TYPE REF TO /aws1/cl_dynscanoutput . -ENDCLASS. - - - -CLASS ZCL_AWS1_DYN_ACTIONS IMPLEMENTATION. - - - METHOD create_table. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_dyn) = /aws1/cl_dyn_factory=>create( lo_session ). - - " snippet-start:[dyn.abapv1.create_table] - TRY. - DATA(lt_keyschema) = VALUE /aws1/cl_dynkeyschemaelement=>tt_keyschema( - ( NEW /aws1/cl_dynkeyschemaelement( iv_attributename = 'year' - iv_keytype = 'HASH' ) ) - ( NEW /aws1/cl_dynkeyschemaelement( iv_attributename = 'title' - iv_keytype = 'RANGE' ) ) ). - DATA(lt_attributedefinitions) = VALUE /aws1/cl_dynattributedefn=>tt_attributedefinitions( - ( NEW /aws1/cl_dynattributedefn( iv_attributename = 'year' - iv_attributetype = 'N' ) ) - ( NEW /aws1/cl_dynattributedefn( iv_attributename = 'title' - iv_attributetype = 'S' ) ) ). - - " Adjust read/write capacities as desired. - DATA(lo_dynprovthroughput) = NEW /aws1/cl_dynprovthroughput( - iv_readcapacityunits = 5 - iv_writecapacityunits = 5 ). - oo_result = lo_dyn->createtable( - it_keyschema = lt_keyschema - iv_tablename = iv_table_name - it_attributedefinitions = lt_attributedefinitions - io_provisionedthroughput = lo_dynprovthroughput ). - " Table creation can take some time. Wait till table exists before returning. - lo_dyn->get_waiter( )->tableexists( - iv_max_wait_time = 200 - iv_tablename = iv_table_name ). - MESSAGE 'DynamoDB Table' && iv_table_name && 'created.' TYPE 'I'. - " This exception can happen if the table already exists. - CATCH /aws1/cx_dynresourceinuseex INTO DATA(lo_resourceinuseex). - DATA(lv_error) = |"{ lo_resourceinuseex->av_err_code }" - { lo_resourceinuseex->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDTRY. - " snippet-end:[dyn.abapv1.create_table] - ENDMETHOD. - - - METHOD delete_item. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_dyn) = /aws1/cl_dyn_factory=>create( lo_session ). - - " snippet-start:[dyn.abapv1.delete_item] - TRY. - DATA(lo_resp) = lo_dyn->deleteitem( - iv_tablename = iv_table_name - it_key = it_key_input ). - MESSAGE 'Deleted one item.' TYPE 'I'. - CATCH /aws1/cx_dyncondalcheckfaile00. - MESSAGE 'A condition specified in the operation could not be evaluated.' TYPE 'E'. - CATCH /aws1/cx_dynresourcenotfoundex. - MESSAGE 'The table or index does not exist' TYPE 'E'. - CATCH /aws1/cx_dyntransactconflictex. - MESSAGE 'Another transaction is using the item' TYPE 'E'. - ENDTRY. - " snippet-end:[dyn.abapv1.delete_item] - - ENDMETHOD. - - - METHOD delete_table. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_dyn) = /aws1/cl_dyn_factory=>create( lo_session ). - - " snippet-start:[dyn.abapv1.delete_table] - TRY. - lo_dyn->deletetable( iv_tablename = iv_table_name ). - " Wait till the table is actually deleted. - lo_dyn->get_waiter( )->tablenotexists( - iv_max_wait_time = 200 - iv_tablename = iv_table_name ). - MESSAGE 'Table ' && iv_table_name && ' deleted.' TYPE 'I'. - CATCH /aws1/cx_dynresourcenotfoundex. - MESSAGE 'The table ' && iv_table_name && ' does not exist' TYPE 'E'. - CATCH /aws1/cx_dynresourceinuseex. - MESSAGE 'The table cannot be deleted since it is in use' TYPE 'E'. - ENDTRY. - " snippet-end:[dyn.abapv1.delete_table] - ENDMETHOD. - - - METHOD describe_table. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_dyn) = /aws1/cl_dyn_factory=>create( lo_session ). - - " snippet-start:[dyn.abapv1.describe_table] - TRY. - oo_result = lo_dyn->describetable( iv_tablename = iv_table_name ). - DATA(lv_tablename) = oo_result->get_table( )->ask_tablename( ). - DATA(lv_tablearn) = oo_result->get_table( )->ask_tablearn( ). - DATA(lv_tablestatus) = oo_result->get_table( )->ask_tablestatus( ). - DATA(lv_itemcount) = oo_result->get_table( )->ask_itemcount( ). - MESSAGE 'The table name is ' && lv_tablename - && '. The table ARN is ' && lv_tablearn - && '. The tablestatus is ' && lv_tablestatus - && '. Item count is ' && lv_itemcount TYPE 'I'. - CATCH /aws1/cx_dynresourcenotfoundex. - MESSAGE 'The table ' && lv_tablename && ' does not exist' TYPE 'E'. - ENDTRY. - " snippet-end:[dyn.abapv1.describe_table] - - ENDMETHOD. - - - METHOD get_item. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_dyn) = /aws1/cl_dyn_factory=>create( lo_session ). - - " snippet-start:[dyn.abapv1.get_item] - TRY. - oo_item = lo_dyn->getitem( - iv_tablename = iv_table_name - it_key = it_key ). - DATA(lt_attr) = oo_item->get_item( ). - DATA(lo_title) = lt_attr[ key = 'title' ]-value. - DATA(lo_year) = lt_attr[ key = 'year' ]-value. - DATA(lo_rating) = lt_attr[ key = 'rating' ]-value. - MESSAGE 'Movie name is: ' && lo_title->get_s( ) - && 'Movie year is: ' && lo_year->get_n( ) - && 'Moving rating is: ' && lo_rating->get_n( ) TYPE 'I'. - CATCH /aws1/cx_dynresourcenotfoundex. - MESSAGE 'The table or index does not exist' TYPE 'E'. - ENDTRY. - " snippet-end:[dyn.abapv1.get_item] - - ENDMETHOD. - - - METHOD list_tables. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_dyn) = /aws1/cl_dyn_factory=>create( lo_session ). - - " snippet-start:[dyn.abapv1.list_tables] - TRY. - oo_result = lo_dyn->listtables( ). - " You can loop over the oo_result to get table properties like this. - LOOP AT oo_result->get_tablenames( ) INTO DATA(lo_table_name). - DATA(lv_tablename) = lo_table_name->get_value( ). - ENDLOOP. - DATA(lv_tablecount) = lines( oo_result->get_tablenames( ) ). - MESSAGE 'Found ' && lv_tablecount && ' tables' TYPE 'I'. - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). - DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDTRY. - " snippet-end:[dyn.abapv1.list_tables] - - ENDMETHOD. - - - METHOD put_item. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_dyn) = /aws1/cl_dyn_factory=>create( lo_session ). - - " snippet-start:[dyn.abapv1.put_item] - TRY. - DATA(lo_resp) = lo_dyn->putitem( - iv_tablename = iv_table_name - it_item = it_item ). - MESSAGE '1 row inserted into DynamoDB Table' && iv_table_name TYPE 'I'. - CATCH /aws1/cx_dyncondalcheckfaile00. - MESSAGE 'A condition specified in the operation could not be evaluated.' TYPE 'E'. - CATCH /aws1/cx_dynresourcenotfoundex. - MESSAGE 'The table or index does not exist' TYPE 'E'. - CATCH /aws1/cx_dyntransactconflictex. - MESSAGE 'Another transaction is using the item' TYPE 'E'. - ENDTRY. - " snippet-end:[dyn.abapv1.put_item] - - ENDMETHOD. - - - METHOD query_table. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_dyn) = /aws1/cl_dyn_factory=>create( lo_session ). - - " snippet-start:[dyn.abapv1.query_table] - - TRY. - " Query movies for a given year . - DATA(lt_attributelist) = VALUE /aws1/cl_dynattributevalue=>tt_attributevaluelist( - ( NEW /aws1/cl_dynattributevalue( iv_n = |{ iv_year }| ) ) ). - DATA(lt_key_conditions) = VALUE /aws1/cl_dyncondition=>tt_keyconditions( - ( VALUE /aws1/cl_dyncondition=>ts_keyconditions_maprow( - key = 'year' - value = NEW /aws1/cl_dyncondition( - it_attributevaluelist = lt_attributelist - iv_comparisonoperator = |EQ| - ) ) ) ). - oo_result = lo_dyn->query( - iv_tablename = iv_table_name - it_keyconditions = lt_key_conditions ). - DATA(lt_items) = oo_result->get_items( ). - "You can loop over the results to get item attributes. - LOOP AT lt_items INTO DATA(lt_item). - DATA(lo_title) = lt_item[ key = 'title' ]-value. - DATA(lo_year) = lt_item[ key = 'year' ]-value. - ENDLOOP. - DATA(lv_count) = oo_result->get_count( ). - MESSAGE 'Item count is: ' && lv_count TYPE 'I'. - CATCH /aws1/cx_dynresourcenotfoundex. - MESSAGE 'The table or index does not exist' TYPE 'E'. - ENDTRY. - " snippet-end:[dyn.abapv1.query_table] - - ENDMETHOD. - - - METHOD scan_items. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_dyn) = /aws1/cl_dyn_factory=>create( lo_session ). - - " snippet-start:[dyn.abapv1.scan_items] - TRY. - " Scan movies for rating greater than or equal to the rating specified - DATA(lt_attributelist) = VALUE /aws1/cl_dynattributevalue=>tt_attributevaluelist( - ( NEW /aws1/cl_dynattributevalue( iv_n = |{ iv_rating }| ) ) ). - DATA(lt_filter_conditions) = VALUE /aws1/cl_dyncondition=>tt_filterconditionmap( - ( VALUE /aws1/cl_dyncondition=>ts_filterconditionmap_maprow( - key = 'rating' - value = NEW /aws1/cl_dyncondition( - it_attributevaluelist = lt_attributelist - iv_comparisonoperator = |GE| - ) ) ) ). - oo_scan_result = lo_dyn->scan( iv_tablename = iv_table_name - it_scanfilter = lt_filter_conditions ). - DATA(lt_items) = oo_scan_result->get_items( ). - LOOP AT lt_items INTO DATA(lo_item). - " You can loop over to get individual attributes. - DATA(lo_title) = lo_item[ key = 'title' ]-value. - DATA(lo_year) = lo_item[ key = 'year' ]-value. - ENDLOOP. - DATA(lv_count) = oo_scan_result->get_count( ). - MESSAGE 'Found ' && lv_count && ' items' TYPE 'I'. - CATCH /aws1/cx_dynresourcenotfoundex. - MESSAGE 'The table or index does not exist' TYPE 'E'. - ENDTRY. - " snippet-end:[dyn.abapv1.scan_items] - - ENDMETHOD. - - - METHOD update_item. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_dyn) = /aws1/cl_dyn_factory=>create( lo_session ). - - " snippet-start:[dyn.abapv1.update_item] - TRY. - oo_output = lo_dyn->updateitem( - iv_tablename = iv_table_name - it_key = it_item_key - it_attributeupdates = it_attribute_updates ). - MESSAGE '1 item updated in DynamoDB Table' && iv_table_name TYPE 'I'. - CATCH /aws1/cx_dyncondalcheckfaile00. - MESSAGE 'A condition specified in the operation could not be evaluated.' TYPE 'E'. - CATCH /aws1/cx_dynresourcenotfoundex. - MESSAGE 'The table or index does not exist' TYPE 'E'. - CATCH /aws1/cx_dyntransactconflictex. - MESSAGE 'Another transaction is using the item' TYPE 'E'. - ENDTRY. - " snippet-end:[dyn.abapv1.update_item] - - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/dyn/zcl_aws1_dyn_actions.clas.testclasses.abap b/sap-abap/services/dyn/zcl_aws1_dyn_actions.clas.testclasses.abap deleted file mode 100644 index caec5c8ad50..00000000000 --- a/sap-abap/services/dyn/zcl_aws1_dyn_actions.clas.testclasses.abap +++ /dev/null @@ -1,344 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS ltc_zcl_aws1_dyn_actions DEFINITION DEFERRED. -CLASS zcl_aws1_dyn_actions DEFINITION LOCAL FRIENDS ltc_zcl_aws1_dyn_actions. - -CLASS ltc_zcl_aws1_dyn_actions DEFINITION FOR TESTING - DURATION LONG - RISK LEVEL DANGEROUS. - - PROTECTED SECTION. - METHODS: create_table FOR TESTING RAISING /aws1/cx_rt_generic, - describe_table FOR TESTING RAISING /aws1/cx_rt_generic, - list_tables FOR TESTING RAISING /aws1/cx_rt_generic, - put_item FOR TESTING RAISING /aws1/cx_rt_generic, - get_item FOR TESTING RAISING /aws1/cx_rt_generic, - query_table FOR TESTING RAISING /aws1/cx_rt_generic, - scan_items FOR TESTING RAISING /aws1/cx_rt_generic, - update_item FOR TESTING RAISING /aws1/cx_rt_generic, - delete_item FOR TESTING RAISING /aws1/cx_rt_generic, - delete_table FOR TESTING RAISING /aws1/cx_rt_generic. - - PRIVATE SECTION. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA ao_dyn TYPE REF TO /aws1/if_dyn. - DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. - DATA ao_dyn_actions TYPE REF TO zcl_aws1_dyn_actions. - DATA av_table_name TYPE /aws1/dyntablename. - - METHODS setup RAISING /aws1/cx_rt_generic. - METHODS teardown RAISING /aws1/cx_rt_generic. - - METHODS put_item_local - IMPORTING iv_title TYPE string - iv_year TYPE numeric - iv_rating TYPE numeric - RAISING /aws1/cx_rt_generic. - METHODS delete_table_local RAISING /aws1/cx_rt_generic. - METHODS create_table_local RAISING /aws1/cx_rt_generic. - METHODS assert_table_exists RAISING /aws1/cx_rt_generic. - METHODS assert_table_notexists RAISING /aws1/cx_rt_generic. - METHODS query_table_local - IMPORTING iv_year TYPE numeric - RETURNING VALUE(ot_items) TYPE /aws1/cl_dynattributevalue=>tt_itemlist - RAISING /aws1/cx_rt_generic. - -ENDCLASS. - -CLASS ltc_zcl_aws1_dyn_actions IMPLEMENTATION. - - METHOD setup. - ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). - ao_dyn = /aws1/cl_dyn_factory=>create( ao_session ). - ao_dyn_actions = NEW zcl_aws1_dyn_actions( ). - av_table_name = |code-example-create-table|. - ENDMETHOD. - - METHOD teardown. - delete_table_local( ). - ENDMETHOD. - - METHOD create_table. - DATA(lo_table) = ao_dyn_actions->create_table( av_table_name ). - assert_table_exists( ). - MESSAGE 'create_table successful' TYPE 'I'. - ENDMETHOD. - - METHOD describe_table. - create_table_local( ). - DATA(lo_table_description) = ao_dyn_actions->describe_table( - av_table_name ). - DATA(lv_returned_tablename) = lo_table_description->get_table( )->ask_tablename( ). - cl_abap_unit_assert=>assert_equals( - exp = av_table_name - act = lv_returned_tablename - msg = |Expected the table name to be { av_table_name } but found { lv_returned_tablename }| ). - MESSAGE 'describe_table successful' TYPE 'I'. - ENDMETHOD. - - METHOD list_tables. - create_table_local( ). - DATA(lo_tables) = ao_dyn_actions->list_tables( ). - - LOOP AT lo_tables->get_tablenames( ) INTO DATA(lo_table_name). - IF lo_table_name->get_value( ) = av_table_name. - DATA(lv_found) = abap_true. - ENDIF. - ENDLOOP. - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |List table is successful| ). - MESSAGE 'list_tables successful' TYPE 'I'. - ENDMETHOD. - - METHOD put_item. - create_table_local( ). - DATA(lt_item) = VALUE /aws1/cl_dynattributevalue=>tt_putiteminputattributemap( - ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( - key = 'title' value = NEW /aws1/cl_dynattributevalue( iv_s = 'Jaws' ) ) ) - ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( - key = 'year' value = NEW /aws1/cl_dynattributevalue( iv_n = '1975' ) ) ) - ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( - key = 'rating' value = NEW /aws1/cl_dynattributevalue( iv_n = '7.8' ) ) ) ). - ao_dyn_actions->put_item( iv_table_name = av_table_name - it_item = lt_item ). - DATA(lt_items) = query_table_local( '1975' ). - READ TABLE lt_items INTO DATA(lt_attributes) INDEX 1. - DATA(lo_rating) = lt_attributes[ key = 'rating' ]-value. - DATA(lv_rating) = lo_rating->ask_n( ). - cl_abap_unit_assert=>assert_equals( exp = |7.8| - act = lv_rating - msg = |Expected rating 7.5, found { lv_rating } | ). - MESSAGE 'put_item successful' TYPE 'I'. - ENDMETHOD. - - METHOD get_item. - create_table_local( ). - put_item_local( iv_title = 'Jaws' - iv_year = 1975 - iv_rating = '7.5' ). - DATA(lo_item) = ao_dyn_actions->get_item( iv_table_name = av_table_name - it_key = VALUE /aws1/cl_dynattributevalue=>tt_key( - ( VALUE /aws1/cl_dynattributevalue=>ts_key_maprow( - key = 'title' value = NEW /aws1/cl_dynattributevalue( iv_s = 'Jaws' ) ) ) - ( VALUE /aws1/cl_dynattributevalue=>ts_key_maprow( - key = 'year' value = NEW /aws1/cl_dynattributevalue( iv_n = '1975' ) ) ) - ) ). - DATA(lt_attributes) = lo_item->get_item( ). - DATA(lo_rating) = lt_attributes[ key = 'rating' ]-value. - DATA(lv_rating) = lo_rating->ask_n( ). - cl_abap_unit_assert=>assert_equals( exp = |7.5| - act = lv_rating - msg = |Expected rating 7.5, found { lv_rating } | ). - MESSAGE 'get_item successful' TYPE 'I'. - ENDMETHOD. - - METHOD query_table. - create_table_local( ). - put_item_local( iv_title = 'Jaws' - iv_year = 1975 - iv_rating = '7.5' ). - put_item_local( iv_title = 'Star Wars' - iv_year = 1979 - iv_rating = '8.1' ). - put_item_local( iv_title = 'Barbie' - iv_year = 2023 - iv_rating = '7.9' ). - DATA(lo_query_result) = ao_dyn_actions->query_table( iv_table_name = av_table_name - iv_year = 1975 ). - READ TABLE lo_query_result->get_items( ) INTO DATA(lt_item) INDEX 1. - DATA(lo_title) = lt_item[ key = 'title' ]-value. - DATA(lv_title) = lo_title->ask_s( ). - cl_abap_unit_assert=>assert_equals( exp = |Jaws| - act = lv_title - msg = |Expected title Jaws, found { lv_title }| ). - MESSAGE 'query_table successful' TYPE 'I'. - ENDMETHOD. - - METHOD scan_items. - create_table_local( ). - put_item_local( iv_title = 'Jaws' - iv_year = 1975 - iv_rating = '7.5' ). - put_item_local( iv_title = 'Star Wars' - iv_year = 1979 - iv_rating = '8.1' ). - put_item_local( iv_title = 'Barbie' - iv_year = 2023 - iv_rating = '7.8' ). - " Scan table for rating higher than 7.8 - DATA(lo_scan_result) = ao_dyn_actions->scan_items( iv_table_name = av_table_name - iv_rating = '7.8' ). - DATA(lv_count) = lo_scan_result->get_count( ). - cl_abap_unit_assert=>assert_equals( exp = |2| - act = lv_count - msg = |Expected count 3, found { |lv_count| }| ). - MESSAGE 'scan_item successful' TYPE 'I'. - ENDMETHOD. - - METHOD update_item. - create_table_local( ). - put_item_local( iv_title = 'Jaws' - iv_year = 1975 - iv_rating = '7.5' ). - put_item_local( iv_title = 'Star Wars' - iv_year = 1979 - iv_rating = '8.1' ). - DATA(lt_attributeupdates) = VALUE /aws1/cl_dynattrvalueupdate=>tt_attributeupdates( - ( VALUE /aws1/cl_dynattrvalueupdate=>ts_attributeupdates_maprow( - key = 'rating' value = NEW /aws1/cl_dynattrvalueupdate( - io_value = NEW /aws1/cl_dynattributevalue( iv_n = '7.6' ) - iv_action = |PUT| ) ) ) ). - DATA(lt_key) = VALUE /aws1/cl_dynattributevalue=>tt_key( - ( VALUE /aws1/cl_dynattributevalue=>ts_key_maprow( - key = 'title' value = NEW /aws1/cl_dynattributevalue( iv_s = 'Jaws' ) ) ) - ( VALUE /aws1/cl_dynattributevalue=>ts_key_maprow( - key = 'year' value = NEW /aws1/cl_dynattributevalue( iv_n = '1975' ) ) ) ). - DATA(lo_resp) = ao_dyn_actions->update_item( - iv_table_name = av_table_name - it_item_key = lt_key - it_attribute_updates = lt_attributeupdates ). - " Use query item to verify that the update was successful. - DATA(lt_attributelist) = VALUE /aws1/cl_dynattributevalue=>tt_attributevaluelist( - ( NEW /aws1/cl_dynattributevalue( iv_n = '1975' ) ) ). - DATA(lt_key_conditions) = VALUE /aws1/cl_dyncondition=>tt_keyconditions( - ( VALUE /aws1/cl_dyncondition=>ts_keyconditions_maprow( - key = 'year' - value = NEW /aws1/cl_dyncondition( - it_attributevaluelist = lt_attributelist - iv_comparisonoperator = |EQ| - ) ) ) ). - DATA(lt_items) = query_table_local( 1975 ). - READ TABLE lt_items INTO DATA(lt_item) INDEX 1. - DATA(lo_rating) = lt_item[ key = 'rating' ]-value. - DATA(lv_rating) = lo_rating->ask_n( ). - cl_abap_unit_assert=>assert_equals( exp = |7.6| - act = lv_rating - msg = |Expected ratig 7.6, found { lv_rating }| ). - MESSAGE 'update_item successful' TYPE 'I'. - ENDMETHOD. - - METHOD delete_item. - create_table_local( ). - put_item_local( iv_title = 'Jaws' - iv_year = 1975 - iv_rating = '7.5' ). - put_item_local( iv_title = 'Star Wars' - iv_year = 1975 - iv_rating = '8.1' ). - DATA(lt_key) = VALUE /aws1/cl_dynattributevalue=>tt_key( - ( VALUE /aws1/cl_dynattributevalue=>ts_key_maprow( - key = 'title' value = NEW /aws1/cl_dynattributevalue( iv_s = 'Jaws' ) ) ) - ( VALUE /aws1/cl_dynattributevalue=>ts_key_maprow( - key = 'year' value = NEW /aws1/cl_dynattributevalue( iv_n = '1975' ) ) ) ). - ao_dyn_actions->delete_item( iv_table_name = av_table_name - it_key_input = lt_key ). - DATA(lt_items) = query_table_local( '1975' ). - DATA(lv_count) = lines( lt_items ). - cl_abap_unit_assert=>assert_equals( exp = |1| - act = lv_count - msg = |Expected count 1, found { |lv_count| }| ). - MESSAGE 'delete_item successful' TYPE 'I'. - ENDMETHOD. - - METHOD delete_table. - create_table_local( ). - ao_dyn_actions->delete_table( av_table_name ). - assert_table_notexists( ). - MESSAGE 'delete_table successful' TYPE 'I'. - ENDMETHOD. - - METHOD assert_table_exists. - DATA(lv_status) = ao_dyn->describetable( iv_tablename = av_table_name )->get_table( )->get_tablestatus( ). - lv_status = ao_dyn->describetable( iv_tablename = av_table_name )->get_table( )->get_tablestatus( ). - cl_abap_unit_assert=>assert_equals( - exp = lv_status - act = 'ACTIVE' - msg = |Expected the table to be in 'ACTIVE' status but received { lv_status }| ). - ENDMETHOD. - - METHOD assert_table_notexists. - TRY. - DATA(lv_status) = ao_dyn->describetable( iv_tablename = av_table_name )->get_table( )->get_tablestatus( ). - /aws1/cl_rt_assert_abap=>assert_missed_exception( iv_exception = |/AWS1/CX_RT_SERVICE_GENERIC| ). - CATCH /aws1/cx_rt_service_generic. - "ignore. expected since the table does not exist - ENDTRY. - ENDMETHOD. - - METHOD delete_table_local. - TRY. - DATA(lo_resp) = ao_dyn->deletetable( av_table_name ). - ao_dyn->get_waiter( )->tablenotexists( - iv_max_wait_time = 200 - iv_tablename = av_table_name ). - CATCH /aws1/cx_dynresourcenotfoundex. - ENDTRY. - ENDMETHOD. - - METHOD put_item_local. - DATA(lt_item) = VALUE /aws1/cl_dynattributevalue=>tt_putiteminputattributemap( - ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( - key = 'title' value = NEW /aws1/cl_dynattributevalue( iv_s = iv_title ) ) ) - ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( - key = 'year' value = NEW /aws1/cl_dynattributevalue( iv_n = |{ iv_year }| ) ) ) - ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( - key = 'rating' value = NEW /aws1/cl_dynattributevalue( iv_n = |{ iv_rating }| ) ) ) ). - ao_dyn->putitem( iv_tablename = av_table_name - it_item = lt_item ). - ENDMETHOD. - - METHOD create_table_local. - TRY. - DATA(lt_keyschema) = VALUE /aws1/cl_dynkeyschemaelement=>tt_keyschema( - ( NEW /aws1/cl_dynkeyschemaelement( iv_attributename = 'year' - iv_keytype = 'HASH' ) ) - ( NEW /aws1/cl_dynkeyschemaelement( iv_attributename = 'title' - iv_keytype = 'RANGE' ) ) ). - DATA(lt_attributedefinitions) = VALUE /aws1/cl_dynattributedefn=>tt_attributedefinitions( - ( NEW /aws1/cl_dynattributedefn( iv_attributename = 'year' - iv_attributetype = 'N' ) ) - ( NEW /aws1/cl_dynattributedefn( iv_attributename = 'title' - iv_attributetype = 'S' ) ) ). - - " Adjust read/write capacities as desired. - DATA(lo_dynprovthroughput) = NEW /aws1/cl_dynprovthroughput( - iv_readcapacityunits = 5 - iv_writecapacityunits = 5 ). - ao_dyn->createtable( - it_keyschema = lt_keyschema - iv_tablename = av_table_name - it_attributedefinitions = lt_attributedefinitions - io_provisionedthroughput = lo_dynprovthroughput ). - ao_dyn->get_waiter( )->tableexists( - iv_max_wait_time = 200 - iv_tablename = av_table_name ). - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_genericex). - DATA(lv_error) = |"{ lo_genericex->av_err_code }" - { lo_genericex->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDTRY. - ENDMETHOD. - - METHOD query_table_local. - TRY. - DATA(lt_attributelist) = VALUE /aws1/cl_dynattributevalue=>tt_attributevaluelist( - ( NEW /aws1/cl_dynattributevalue( iv_n = |{ iv_year }| ) ) ). - DATA(lt_key_conditions) = VALUE /aws1/cl_dyncondition=>tt_keyconditions( - ( VALUE /aws1/cl_dyncondition=>ts_keyconditions_maprow( - key = 'year' - value = NEW /aws1/cl_dyncondition( - it_attributevaluelist = lt_attributelist - iv_comparisonoperator = |EQ| - ) ) ) ). - DATA(lo_result) = ao_dyn->query( - iv_tablename = av_table_name - it_keyconditions = lt_key_conditions ). - ot_items = lo_result->get_items( ). - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_genericex). - DATA(lv_error) = |"{ lo_genericex->av_err_code }" - { lo_genericex->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDTRY. - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/dyn/zcl_aws1_dyn_actions.clas.xml b/sap-abap/services/dyn/zcl_aws1_dyn_actions.clas.xml deleted file mode 100644 index aa348588a83..00000000000 --- a/sap-abap/services/dyn/zcl_aws1_dyn_actions.clas.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - ZCL_AWS1_DYN_ACTIONS - E - Dynamo DB Code Example - 1 - X - X - X - X - - - - CREATE_TABLE - E - Create Dynamo DB Table - - - DELETE_ITEM - E - Delete item from example-table - - - DELETE_TABLE - E - Delete table - - - DESCRIBE_TABLE - E - Describe table - - - GET_ITEM - E - Get item from example-table - - - LIST_TABLES - E - List tables - - - PUT_ITEM - E - Put item into example-table - - - QUERY_TABLE - E - Query items from example-table - - - SCAN_ITEMS - E - Scan example-table - - - UPDATE_ITEM - E - Update item in example-table - - - - - diff --git a/sap-abap/services/dyn/zcl_aws1_dyn_scenario.clas.abap b/sap-abap/services/dyn/zcl_aws1_dyn_scenario.clas.abap deleted file mode 100644 index ee119cc2371..00000000000 --- a/sap-abap/services/dyn/zcl_aws1_dyn_scenario.clas.abap +++ /dev/null @@ -1,216 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS zcl_aws1_dyn_scenario DEFINITION - PUBLIC - FINAL - CREATE PUBLIC . - - PUBLIC SECTION. - PROTECTED SECTION. - PRIVATE SECTION. - - METHODS getting_started_with_tables - IMPORTING - VALUE(iv_table_name) TYPE /aws1/dyntablename . -ENDCLASS. - - - -CLASS ZCL_AWS1_DYN_SCENARIO IMPLEMENTATION. - - - METHOD getting_started_with_tables. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - " snippet-start:[dyn.abapv1.getting_started_with_tables] - " Create an Amazon Dynamo DB table. - - TRY. - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_dyn) = /aws1/cl_dyn_factory=>create( lo_session ). - DATA(lt_keyschema) = VALUE /aws1/cl_dynkeyschemaelement=>tt_keyschema( - ( NEW /aws1/cl_dynkeyschemaelement( iv_attributename = 'year' - iv_keytype = 'HASH' ) ) - ( NEW /aws1/cl_dynkeyschemaelement( iv_attributename = 'title' - iv_keytype = 'RANGE' ) ) ). - DATA(lt_attributedefinitions) = VALUE /aws1/cl_dynattributedefn=>tt_attributedefinitions( - ( NEW /aws1/cl_dynattributedefn( iv_attributename = 'year' - iv_attributetype = 'N' ) ) - ( NEW /aws1/cl_dynattributedefn( iv_attributename = 'title' - iv_attributetype = 'S' ) ) ). - - " Adjust read/write capacities as desired. - DATA(lo_dynprovthroughput) = NEW /aws1/cl_dynprovthroughput( - iv_readcapacityunits = 5 - iv_writecapacityunits = 5 ). - DATA(oo_result) = lo_dyn->createtable( - it_keyschema = lt_keyschema - iv_tablename = iv_table_name - it_attributedefinitions = lt_attributedefinitions - io_provisionedthroughput = lo_dynprovthroughput ). - " Table creation can take some time. Wait till table exists before returning. - lo_dyn->get_waiter( )->tableexists( - iv_max_wait_time = 200 - iv_tablename = iv_table_name ). - MESSAGE 'DynamoDB Table' && iv_table_name && 'created.' TYPE 'I'. - " It throws exception if the table already exists. - CATCH /aws1/cx_dynresourceinuseex INTO DATA(lo_resourceinuseex). - DATA(lv_error) = |"{ lo_resourceinuseex->av_err_code }" - { lo_resourceinuseex->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDTRY. - - " Describe table - TRY. - DATA(lo_table) = lo_dyn->describetable( iv_tablename = iv_table_name ). - DATA(lv_tablename) = lo_table->get_table( )->ask_tablename( ). - MESSAGE 'The table name is ' && lv_tablename TYPE 'I'. - CATCH /aws1/cx_dynresourcenotfoundex. - MESSAGE 'The table does not exist' TYPE 'E'. - ENDTRY. - - " Put items into the table. - TRY. - DATA(lo_resp_putitem) = lo_dyn->putitem( - iv_tablename = iv_table_name - it_item = VALUE /aws1/cl_dynattributevalue=>tt_putiteminputattributemap( - ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( - key = 'title' value = NEW /aws1/cl_dynattributevalue( iv_s = 'Jaws' ) ) ) - ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( - key = 'year' value = NEW /aws1/cl_dynattributevalue( iv_n = |{ '1975' }| ) ) ) - ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( - key = 'rating' value = NEW /aws1/cl_dynattributevalue( iv_n = |{ '7.5' }| ) ) ) - ) ). - lo_resp_putitem = lo_dyn->putitem( - iv_tablename = iv_table_name - it_item = VALUE /aws1/cl_dynattributevalue=>tt_putiteminputattributemap( - ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( - key = 'title' value = NEW /aws1/cl_dynattributevalue( iv_s = 'Star Wars' ) ) ) - ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( - key = 'year' value = NEW /aws1/cl_dynattributevalue( iv_n = |{ '1978' }| ) ) ) - ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( - key = 'rating' value = NEW /aws1/cl_dynattributevalue( iv_n = |{ '8.1' }| ) ) ) - ) ). - lo_resp_putitem = lo_dyn->putitem( - iv_tablename = iv_table_name - it_item = VALUE /aws1/cl_dynattributevalue=>tt_putiteminputattributemap( - ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( - key = 'title' value = NEW /aws1/cl_dynattributevalue( iv_s = 'Speed' ) ) ) - ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( - key = 'year' value = NEW /aws1/cl_dynattributevalue( iv_n = |{ '1994' }| ) ) ) - ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( - key = 'rating' value = NEW /aws1/cl_dynattributevalue( iv_n = |{ '7.9' }| ) ) ) - ) ). - " TYPE REF TO ZCL_AWS1_dyn_PUT_ITEM_OUTPUT - MESSAGE '3 rows inserted into DynamoDB Table' && iv_table_name TYPE 'I'. - CATCH /aws1/cx_dyncondalcheckfaile00. - MESSAGE 'A condition specified in the operation could not be evaluated.' TYPE 'E'. - CATCH /aws1/cx_dynresourcenotfoundex. - MESSAGE 'The table or index does not exist' TYPE 'E'. - CATCH /aws1/cx_dyntransactconflictex. - MESSAGE 'Another transaction is using the item' TYPE 'E'. - ENDTRY. - - " Get item from table. - TRY. - DATA(lo_resp_getitem) = lo_dyn->getitem( - iv_tablename = iv_table_name - it_key = VALUE /aws1/cl_dynattributevalue=>tt_key( - ( VALUE /aws1/cl_dynattributevalue=>ts_key_maprow( - key = 'title' value = NEW /aws1/cl_dynattributevalue( iv_s = 'Jaws' ) ) ) - ( VALUE /aws1/cl_dynattributevalue=>ts_key_maprow( - key = 'year' value = NEW /aws1/cl_dynattributevalue( iv_n = '1975' ) ) ) - ) ). - DATA(lt_attr) = lo_resp_getitem->get_item( ). - DATA(lo_title) = lt_attr[ key = 'title' ]-value. - DATA(lo_year) = lt_attr[ key = 'year' ]-value. - DATA(lo_rating) = lt_attr[ key = 'year' ]-value. - MESSAGE 'Movie name is: ' && lo_title->get_s( ) TYPE 'I'. - MESSAGE 'Movie year is: ' && lo_year->get_n( ) TYPE 'I'. - MESSAGE 'Movie rating is: ' && lo_rating->get_n( ) TYPE 'I'. - CATCH /aws1/cx_dynresourcenotfoundex. - MESSAGE 'The table or index does not exist' TYPE 'E'. - ENDTRY. - - " Query item from table. - TRY. - DATA(lt_attributelist) = VALUE /aws1/cl_dynattributevalue=>tt_attributevaluelist( - ( NEW /aws1/cl_dynattributevalue( iv_n = '1975' ) ) ). - DATA(lt_keyconditions) = VALUE /aws1/cl_dyncondition=>tt_keyconditions( - ( VALUE /aws1/cl_dyncondition=>ts_keyconditions_maprow( - key = 'year' - value = NEW /aws1/cl_dyncondition( - it_attributevaluelist = lt_attributelist - iv_comparisonoperator = |EQ| - ) ) ) ). - DATA(lo_query_result) = lo_dyn->query( - iv_tablename = iv_table_name - it_keyconditions = lt_keyconditions ). - DATA(lt_items) = lo_query_result->get_items( ). - READ TABLE lo_query_result->get_items( ) INTO DATA(lt_item) INDEX 1. - lo_title = lt_item[ key = 'title' ]-value. - lo_year = lt_item[ key = 'year' ]-value. - lo_rating = lt_item[ key = 'rating' ]-value. - MESSAGE 'Movie name is: ' && lo_title->get_s( ) TYPE 'I'. - MESSAGE 'Movie year is: ' && lo_year->get_n( ) TYPE 'I'. - MESSAGE 'Movie rating is: ' && lo_rating->get_n( ) TYPE 'I'. - CATCH /aws1/cx_dynresourcenotfoundex. - MESSAGE 'The table or index does not exist' TYPE 'E'. - ENDTRY. - - " Scan items from table. - TRY. - DATA(lo_scan_result) = lo_dyn->scan( iv_tablename = iv_table_name ). - lt_items = lo_scan_result->get_items( ). - " Read the first item and display the attributes. - READ TABLE lo_query_result->get_items( ) INTO lt_item INDEX 1. - lo_title = lt_item[ key = 'title' ]-value. - lo_year = lt_item[ key = 'year' ]-value. - lo_rating = lt_item[ key = 'rating' ]-value. - MESSAGE 'Movie name is: ' && lo_title->get_s( ) TYPE 'I'. - MESSAGE 'Movie year is: ' && lo_year->get_n( ) TYPE 'I'. - MESSAGE 'Movie rating is: ' && lo_rating->get_n( ) TYPE 'I'. - CATCH /aws1/cx_dynresourcenotfoundex. - MESSAGE 'The table or index does not exist' TYPE 'E'. - ENDTRY. - - " Update items from table. - TRY. - DATA(lt_attributeupdates) = VALUE /aws1/cl_dynattrvalueupdate=>tt_attributeupdates( - ( VALUE /aws1/cl_dynattrvalueupdate=>ts_attributeupdates_maprow( - key = 'rating' value = NEW /aws1/cl_dynattrvalueupdate( - io_value = NEW /aws1/cl_dynattributevalue( iv_n = '7.6' ) - iv_action = |PUT| ) ) ) ). - DATA(lt_key) = VALUE /aws1/cl_dynattributevalue=>tt_key( - ( VALUE /aws1/cl_dynattributevalue=>ts_key_maprow( - key = 'year' value = NEW /aws1/cl_dynattributevalue( iv_n = '1975' ) ) ) - ( VALUE /aws1/cl_dynattributevalue=>ts_key_maprow( - key = 'title' value = NEW /aws1/cl_dynattributevalue( iv_s = '1980' ) ) ) ). - DATA(lo_resp) = lo_dyn->updateitem( - iv_tablename = iv_table_name - it_key = lt_key - it_attributeupdates = lt_attributeupdates ). - MESSAGE '1 item updated in DynamoDB Table' && iv_table_name TYPE 'I'. - CATCH /aws1/cx_dyncondalcheckfaile00. - MESSAGE 'A condition specified in the operation could not be evaluated.' TYPE 'E'. - CATCH /aws1/cx_dynresourcenotfoundex. - MESSAGE 'The table or index does not exist' TYPE 'E'. - CATCH /aws1/cx_dyntransactconflictex. - MESSAGE 'Another transaction is using the item' TYPE 'E'. - ENDTRY. - - " Delete table. - TRY. - lo_dyn->deletetable( iv_tablename = iv_table_name ). - lo_dyn->get_waiter( )->tablenotexists( - iv_max_wait_time = 200 - iv_tablename = iv_table_name ). - MESSAGE 'DynamoDB Table deleted.' TYPE 'I'. - CATCH /aws1/cx_dynresourcenotfoundex. - MESSAGE 'The table or index does not exist' TYPE 'E'. - CATCH /aws1/cx_dynresourceinuseex. - MESSAGE 'The table cannot be deleted as it is in use' TYPE 'E'. - ENDTRY. - " snippet-end:[dyn.abapv1.getting_started_with_tables] - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/dyn/zcl_aws1_dyn_scenario.clas.testclasses.abap b/sap-abap/services/dyn/zcl_aws1_dyn_scenario.clas.testclasses.abap deleted file mode 100644 index 1b24bfea8d6..00000000000 --- a/sap-abap/services/dyn/zcl_aws1_dyn_scenario.clas.testclasses.abap +++ /dev/null @@ -1,54 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS ltc_zcl_aws1_dyn_scenario DEFINITION DEFERRED. -CLASS zcl_aws1_dyn_scenario DEFINITION LOCAL FRIENDS ltc_zcl_aws1_dyn_scenario. - -CLASS ltc_zcl_aws1_dyn_scenario DEFINITION FOR TESTING - DURATION LONG - RISK LEVEL DANGEROUS. - - PROTECTED SECTION. - METHODS test_dyn FOR TESTING RAISING /aws1/cx_rt_generic. - - PRIVATE SECTION. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA ao_dyn TYPE REF TO /aws1/if_dyn. - DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. - DATA ao_dyn_scenario TYPE REF TO zcl_aws1_dyn_scenario. - DATA av_table_name TYPE /aws1/dyntablename. - - METHODS setup RAISING /aws1/cx_rt_generic. - - METHODS assert_table_not_exist - IMPORTING iv_table_name TYPE string - RAISING /aws1/cx_rt_generic. - -ENDCLASS. - -CLASS ltc_zcl_aws1_dyn_scenario IMPLEMENTATION. - - METHOD setup. - ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). - ao_dyn = /aws1/cl_dyn_factory=>create( ao_session ). - ao_dyn_scenario = NEW zcl_aws1_dyn_scenario( ). - ENDMETHOD. - - METHOD test_dyn. - DATA(av_table_name) = |code-example-getting-startted-with-tables|. - ao_dyn_scenario->getting_started_with_tables( av_table_name ). - assert_table_not_exist( av_table_name ). - ENDMETHOD. - - METHOD assert_table_not_exist. - TRY. - DATA(lv_status) = ao_dyn->describetable( iv_tablename = iv_table_name )->get_table( )->get_tablestatus( ). - " expecting an exception - /aws1/cl_rt_assert_abap=>assert_missed_exception( iv_exception = |/AWS1/CX_DYNRESOURCENOTFOUNDEX| ). - CATCH /aws1/cx_dynresourcenotfoundex. - " good, it is deleted - ENDTRY. - ENDMETHOD. - -ENDCLASS. diff --git a/sap-abap/services/dyn/zcl_aws1_dyn_scenario.clas.xml b/sap-abap/services/dyn/zcl_aws1_dyn_scenario.clas.xml deleted file mode 100644 index 4eecee4a30c..00000000000 --- a/sap-abap/services/dyn/zcl_aws1_dyn_scenario.clas.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - ZCL_AWS1_DYN_SCENARIO - E - Amazon example of Dynamo DB Scenario - 1 - X - X - X - X - - - - GETTING_STARTED_WITH_TABLES - E - Amazon Dynamo DB Scenario. Getting started with tables - - - - - diff --git a/sap-abap/services/ec2/zcl_aws1_ec2_actions.clas.abap b/sap-abap/services/ec2/zcl_aws1_ec2_actions.clas.abap deleted file mode 100644 index 418a5537864..00000000000 --- a/sap-abap/services/ec2/zcl_aws1_ec2_actions.clas.abap +++ /dev/null @@ -1,540 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS zcl_aws1_ec2_actions DEFINITION - PUBLIC - FINAL - CREATE PUBLIC . - - PUBLIC SECTION. - PROTECTED SECTION. - PRIVATE SECTION. - - METHODS allocate_address - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_ec2allocateaddressrs . - METHODS create_instance - IMPORTING - !iv_ami_id TYPE /aws1/ec2imageid - !iv_tag_value TYPE /aws1/ec2string - !iv_subnet_id TYPE /aws1/ec2subnetid - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_ec2reservation . - METHODS create_key_pair - IMPORTING - !iv_key_name TYPE /aws1/ec2string - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_ec2keypair . - METHODS create_security_group - IMPORTING - !iv_security_group_name TYPE /aws1/ec2string - !iv_vpc_id TYPE /aws1/ec2vpcid - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_ec2createsecgrouprslt . - METHODS delete_security_group - IMPORTING - !iv_security_group_id TYPE /aws1/ec2securitygroupid . - METHODS delete_key_pair - IMPORTING - !iv_key_name TYPE /aws1/ec2keypairname . - METHODS describe_addresses - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_ec2descraddressesrslt . - METHODS describe_instances - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_ec2descrinstsresult . - METHODS describe_key_pairs - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_ec2descrkeypairsrslt . - METHODS describe_regions - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_ec2descrregionsresult . - METHODS describe_security_groups - IMPORTING - !iv_group_id TYPE /aws1/ec2securitygroupid - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_ec2descrsecgroupsrslt . - METHODS monitor_instance - IMPORTING - !iv_instance_id TYPE /aws1/ec2instanceid . - METHODS reboot_instance - IMPORTING - !iv_instance_id TYPE /aws1/ec2instanceid . - METHODS release_address - IMPORTING - !iv_allocation_id TYPE /aws1/ec2allocationid . - METHODS start_instance - IMPORTING - !iv_instance_id TYPE /aws1/ec2instanceid - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_ec2startinstsresult . - METHODS stop_instance - IMPORTING - !iv_instance_id TYPE /aws1/ec2instanceid - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_ec2stopinstsresult . - METHODS associate_address - IMPORTING - !iv_instance_id TYPE /aws1/ec2instanceid - !iv_allocation_id TYPE /aws1/ec2allocationid - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_ec2assocaddressresult . - METHODS describe_availability_zones - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_ec2describeazsresult . -ENDCLASS. - - - -CLASS ZCL_AWS1_EC2_ACTIONS IMPLEMENTATION. - - - METHOD allocate_address. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). - - " snippet-start:[ec2.abapv1.allocate_address] - TRY. - oo_result = lo_ec2->allocateaddress( iv_domain = 'vpc' ). " oo_result is returned for testing purposes. " - MESSAGE 'Allocated an Elastic IP address.' TYPE 'I'. - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). - DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDTRY. - " snippet-end:[ec2.abapv1.allocate_address] - ENDMETHOD. - - - METHOD associate_address. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). - - " snippet-start:[ec2.abapv1.associate_address] - TRY. - oo_result = lo_ec2->associateaddress( " oo_result is returned for testing purposes. " - iv_allocationid = iv_allocation_id - iv_instanceid = iv_instance_id ). - MESSAGE 'Associated an Elastic IP address with an EC2 instance.' TYPE 'I'. - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). - DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDTRY. - " snippet-end:[ec2.abapv1.associate_address] - ENDMETHOD. - - - METHOD create_instance. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). - - " snippet-start:[ec2.abapv1.create_instance] - - " Create tags for resource created during instance launch. " - DATA lt_tagspecifications TYPE /aws1/cl_ec2tagspecification=>tt_tagspecificationlist. - DATA ls_tagspecifications LIKE LINE OF lt_tagspecifications. - ls_tagspecifications = NEW /aws1/cl_ec2tagspecification( - iv_resourcetype = 'instance' - it_tags = VALUE /aws1/cl_ec2tag=>tt_taglist( - ( NEW /aws1/cl_ec2tag( iv_key = 'Name' iv_value = iv_tag_value ) ) - ) ). - APPEND ls_tagspecifications TO lt_tagspecifications. - - TRY. - " Create/launch Amazon Elastic Compute Cloud (Amazon EC2) instance. " - oo_result = lo_ec2->runinstances( " oo_result is returned for testing purposes. " - iv_imageid = iv_ami_id - iv_instancetype = 't3.micro' - iv_maxcount = 1 - iv_mincount = 1 - it_tagspecifications = lt_tagspecifications - iv_subnetid = iv_subnet_id ). - MESSAGE 'EC2 instance created.' TYPE 'I'. - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). - DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDTRY. - " snippet-end:[ec2.abapv1.create_instance] - ENDMETHOD. - - - METHOD create_key_pair. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). - - " snippet-start:[ec2.abapv1.create_key_pair] - TRY. - oo_result = lo_ec2->createkeypair( iv_keyname = iv_key_name ). " oo_result is returned for testing purposes. " - MESSAGE 'Amazon EC2 key pair created.' TYPE 'I'. - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). - DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDTRY. - " snippet-end:[ec2.abapv1.create_key_pair] - ENDMETHOD. - - - METHOD create_security_group. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). - - " snippet-start:[ec2.abapv1.create_security_group] - TRY. - oo_result = lo_ec2->createsecuritygroup( " oo_result is returned for testing purposes. " - iv_description = 'Security group example' - iv_groupname = iv_security_group_name - iv_vpcid = iv_vpc_id ). - MESSAGE 'Security group created.' TYPE 'I'. - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). - DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDTRY. - " snippet-end:[ec2.abapv1.create_security_group] - ENDMETHOD. - - - METHOD delete_key_pair. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). - - " snippet-start:[ec2.abapv1.delete_key_pair] - TRY. - lo_ec2->deletekeypair( iv_keyname = iv_key_name ). - MESSAGE 'Amazon EC2 key pair deleted.' TYPE 'I'. - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). - DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDTRY. - " snippet-end:[ec2.abapv1.delete_key_pair] - ENDMETHOD. - - - METHOD delete_security_group. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). - - " snippet-start:[ec2.abapv1.delete_security_group] - TRY. - lo_ec2->deletesecuritygroup( iv_groupid = iv_security_group_id ). - MESSAGE 'Security group deleted.' TYPE 'I'. - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). - DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDTRY. - " snippet-end:[ec2.abapv1.delete_security_group] - ENDMETHOD. - - - METHOD describe_addresses. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). - - " snippet-start:[ec2.abapv1.describe_addresses] - TRY. - oo_result = lo_ec2->describeaddresses( ). " oo_result is returned for testing purposes. " - DATA(lt_addresses) = oo_result->get_addresses( ). - MESSAGE 'Retrieved information about Elastic IP addresses.' TYPE 'I'. - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). - DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDTRY. - " snippet-end:[ec2.abapv1.describe_addresses] - ENDMETHOD. - - - METHOD describe_availability_zones. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). - - " snippet-start:[ec2.abapv1.describe_availability_zones] - TRY. - oo_result = lo_ec2->describeavailabilityzones( ). " oo_result is returned for testing purposes. " - DATA(lt_zones) = oo_result->get_availabilityzones( ). - MESSAGE 'Retrieved information about Availability Zones.' TYPE 'I'. - - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). - DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDTRY. - - " snippet-end:[ec2.abapv1.describe_availability_zones] - ENDMETHOD. - - - METHOD describe_instances. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). - - " snippet-start:[ec2.abapv1.describe_instances] - TRY. - oo_result = lo_ec2->describeinstances( ). " oo_result is returned for testing purposes. " - - " Retrieving details of EC2 instances. " - DATA: lv_istance_id TYPE /aws1/ec2string, - lv_status TYPE /aws1/ec2instancestatename, - lv_instance_type TYPE /aws1/ec2instancetype, - lv_image_id TYPE /aws1/ec2string. - LOOP AT oo_result->get_reservations( ) INTO DATA(lo_reservation). - LOOP AT lo_reservation->get_instances( ) INTO DATA(lo_instance). - lv_istance_id = lo_instance->get_instanceid( ). - lv_status = lo_instance->get_state( )->get_name( ). - lv_instance_type = lo_instance->get_instancetype( ). - lv_image_id = lo_instance->get_imageid( ). - ENDLOOP. - ENDLOOP. - MESSAGE 'Retrieved information about EC2 instances.' TYPE 'I'. - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). - DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDTRY. - " snippet-end:[ec2.abapv1.describe_instances] - ENDMETHOD. - - - METHOD describe_key_pairs. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). - - " snippet-start:[ec2.abapv1.describe_key_pairs] - TRY. - oo_result = lo_ec2->describekeypairs( ). " oo_result is returned for testing purposes. " - DATA(lt_key_pairs) = oo_result->get_keypairs( ). - MESSAGE 'Retrieved information about key pairs.' TYPE 'I'. - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). - DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDTRY. - " snippet-end:[ec2.abapv1.describe_key_pairs] - ENDMETHOD. - - - METHOD describe_regions. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). - - " snippet-start:[ec2.abapv1.describe_regions] - TRY. - oo_result = lo_ec2->describeregions( ). " oo_result is returned for testing purposes. " - DATA(lt_regions) = oo_result->get_regions( ). - MESSAGE 'Retrieved information about Regions.' TYPE 'I'. - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). - DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDTRY. - - " snippet-end:[ec2.abapv1.describe_regions] - ENDMETHOD. - - - METHOD describe_security_groups. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). - - " snippet-start:[ec2.abapv1.describe_security_groups] - TRY. - DATA lt_group_ids TYPE /aws1/cl_ec2groupidstrlist_w=>tt_groupidstringlist. - APPEND NEW /aws1/cl_ec2groupidstrlist_w( iv_value = iv_group_id ) TO lt_group_ids. - oo_result = lo_ec2->describesecuritygroups( it_groupids = lt_group_ids ). " oo_result is returned for testing purposes. " - DATA(lt_security_groups) = oo_result->get_securitygroups( ). - MESSAGE 'Retrieved information about security groups.' TYPE 'I'. - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). - DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDTRY. - " snippet-end:[ec2.abapv1.describe_security_groups] - ENDMETHOD. - - - METHOD monitor_instance. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). - - " snippet-start:[ec2.abapv1.monitor_instance] - - DATA lt_instance_ids TYPE /aws1/cl_ec2instidstringlist_w=>tt_instanceidstringlist. - APPEND NEW /aws1/cl_ec2instidstringlist_w( iv_value = iv_instance_id ) TO lt_instance_ids. - - "Perform dry run" - TRY. - " DryRun is set to true. This checks for the required permissions to monitor the instance without actually making the request. " - lo_ec2->monitorinstances( - it_instanceids = lt_instance_ids - iv_dryrun = abap_true ). - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). - " If the error code returned is `DryRunOperation`, then you have the required permissions to monitor this instance. " - IF lo_exception->av_err_code = 'DryRunOperation'. - MESSAGE 'Dry run to enable detailed monitoring completed.' TYPE 'I'. - " DryRun is set to false to enable detailed monitoring. " - lo_ec2->monitorinstances( - it_instanceids = lt_instance_ids - iv_dryrun = abap_false ). - MESSAGE 'Detailed monitoring enabled.' TYPE 'I'. - " If the error code returned is `UnauthorizedOperation`, then you don't have the required permissions to monitor this instance. " - ELSEIF lo_exception->av_err_code = 'UnauthorizedOperation'. - MESSAGE 'Dry run to enable detailed monitoring failed. User does not have the permissions to monitor the instance.' TYPE 'E'. - ELSE. - DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDIF. - ENDTRY. - " snippet-end:[ec2.abapv1.monitor_instance] - ENDMETHOD. - - - METHOD reboot_instance. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). - - " snippet-start:[ec2.abapv1.reboot_instance] - DATA lt_instance_ids TYPE /aws1/cl_ec2instidstringlist_w=>tt_instanceidstringlist. - APPEND NEW /aws1/cl_ec2instidstringlist_w( iv_value = iv_instance_id ) TO lt_instance_ids. - - "Perform dry run" - TRY. - " DryRun is set to true. This checks for the required permissions to reboot the instance without actually making the request. " - lo_ec2->rebootinstances( - it_instanceids = lt_instance_ids - iv_dryrun = abap_true ). - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). - " If the error code returned is `DryRunOperation`, then you have the required permissions to reboot this instance. " - IF lo_exception->av_err_code = 'DryRunOperation'. - MESSAGE 'Dry run to reboot instance completed.' TYPE 'I'. - " DryRun is set to false to make a reboot request. " - lo_ec2->rebootinstances( - it_instanceids = lt_instance_ids - iv_dryrun = abap_false ). - MESSAGE 'Instance rebooted.' TYPE 'I'. - " If the error code returned is `UnauthorizedOperation`, then you don't have the required permissions to reboot this instance. " - ELSEIF lo_exception->av_err_code = 'UnauthorizedOperation'. - MESSAGE 'Dry run to reboot instance failed. User does not have permissions to reboot the instance.' TYPE 'E'. - ELSE. - DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDIF. - ENDTRY. - " snippet-end:[ec2.abapv1.reboot_instance] - ENDMETHOD. - - - METHOD release_address. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). - - " snippet-start:[ec2.abapv1.release_address] - TRY. - lo_ec2->releaseaddress( iv_allocationid = iv_allocation_id ). - MESSAGE 'Elastic IP address released.' TYPE 'I'. - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). - DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDTRY. - " snippet-end:[ec2.abapv1.release_address] - ENDMETHOD. - - - METHOD start_instance. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). - - " snippet-start:[ec2.abapv1.start_instance] - - DATA lt_instance_ids TYPE /aws1/cl_ec2instidstringlist_w=>tt_instanceidstringlist. - APPEND NEW /aws1/cl_ec2instidstringlist_w( iv_value = iv_instance_id ) TO lt_instance_ids. - - "Perform dry run" - TRY. - " DryRun is set to true. This checks for the required permissions to start the instance without actually making the request. " - lo_ec2->startinstances( - it_instanceids = lt_instance_ids - iv_dryrun = abap_true ). - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). - " If the error code returned is `DryRunOperation`, then you have the required permissions to start this instance. " - IF lo_exception->av_err_code = 'DryRunOperation'. - MESSAGE 'Dry run to start instance completed.' TYPE 'I'. - " DryRun is set to false to start instance. " - oo_result = lo_ec2->startinstances( " oo_result is returned for testing purposes. " - it_instanceids = lt_instance_ids - iv_dryrun = abap_false ). - MESSAGE 'Successfully started the EC2 instance.' TYPE 'I'. - " If the error code returned is `UnauthorizedOperation`, then you don't have the required permissions to start this instance. " - ELSEIF lo_exception->av_err_code = 'UnauthorizedOperation'. - MESSAGE 'Dry run to start instance failed. User does not have permissions to start the instance.' TYPE 'E'. - ELSE. - DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDIF. - ENDTRY. - " snippet-end:[ec2.abapv1.start_instance] - ENDMETHOD. - - - METHOD stop_instance. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). - - " snippet-start:[ec2.abapv1.stop_instance] - - DATA lt_instance_ids TYPE /aws1/cl_ec2instidstringlist_w=>tt_instanceidstringlist. - APPEND NEW /aws1/cl_ec2instidstringlist_w( iv_value = iv_instance_id ) TO lt_instance_ids. - - "Perform dry run" - TRY. - " DryRun is set to true. This checks for the required permissions to stop the instance without actually making the request. " - lo_ec2->stopinstances( - it_instanceids = lt_instance_ids - iv_dryrun = abap_true ). - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). - " If the error code returned is `DryRunOperation`, then you have the required permissions to stop this instance. " - IF lo_exception->av_err_code = 'DryRunOperation'. - MESSAGE 'Dry run to stop instance completed.' TYPE 'I'. - " DryRun is set to false to stop instance. " - oo_result = lo_ec2->stopinstances( " oo_result is returned for testing purposes. " - it_instanceids = lt_instance_ids - iv_dryrun = abap_false ). - MESSAGE 'Successfully stopped the EC2 instance.' TYPE 'I'. - " If the error code returned is `UnauthorizedOperation`, then you don't have the required permissions to stop this instance. " - ELSEIF lo_exception->av_err_code = 'UnauthorizedOperation'. - MESSAGE 'Dry run to stop instance failed. User does not have permissions to stop the instance.' TYPE 'E'. - ELSE. - DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDIF. - ENDTRY. - " snippet-end:[ec2.abapv1.stop_instance] - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/ec2/zcl_aws1_ec2_actions.clas.testclasses.abap b/sap-abap/services/ec2/zcl_aws1_ec2_actions.clas.testclasses.abap deleted file mode 100644 index 77e4ab97541..00000000000 --- a/sap-abap/services/ec2/zcl_aws1_ec2_actions.clas.testclasses.abap +++ /dev/null @@ -1,487 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS ltc_zcl_aws1_ec2_actions DEFINITION DEFERRED. -CLASS zcl_aws1_ec2_actions DEFINITION LOCAL FRIENDS ltc_zcl_aws1_ec2_actions. - -CLASS ltc_zcl_aws1_ec2_actions DEFINITION FOR TESTING DURATION LONG RISK LEVEL DANGEROUS. - - PRIVATE SECTION. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - CLASS-DATA ao_ec2 TYPE REF TO /aws1/if_ec2. - CLASS-DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. - CLASS-DATA ao_ec2_actions TYPE REF TO zcl_aws1_ec2_actions. - CLASS-DATA av_vpc_id TYPE /aws1/ec2string. - CLASS-DATA av_subnet_id TYPE /aws1/ec2string. - CLASS-DATA at_instance_id TYPE TABLE OF /aws1/ec2string. " table of instance IDs to terminate - CLASS-DATA av_instance_id TYPE /aws1/ec2string. " main instance Id for tests - - METHODS: allocate_address FOR TESTING RAISING /aws1/cx_rt_generic, - associate_address FOR TESTING RAISING /aws1/cx_rt_generic, - create_instance FOR TESTING RAISING /aws1/cx_rt_generic, - create_key_pair FOR TESTING RAISING /aws1/cx_rt_generic, - create_security_group FOR TESTING RAISING /aws1/cx_rt_generic, - delete_security_group FOR TESTING RAISING /aws1/cx_rt_generic, - delete_key_pair FOR TESTING RAISING /aws1/cx_rt_generic, - describe_addresses FOR TESTING RAISING /aws1/cx_rt_generic, - describe_instances FOR TESTING RAISING /aws1/cx_rt_generic, - describe_key_pairs FOR TESTING RAISING /aws1/cx_rt_generic, - describe_regions FOR TESTING RAISING /aws1/cx_rt_generic, - describe_availability_zones FOR TESTING RAISING /aws1/cx_rt_generic, - describe_security_groups FOR TESTING RAISING /aws1/cx_rt_generic, - monitor_instance FOR TESTING RAISING /aws1/cx_rt_generic, - reboot_instance FOR TESTING RAISING /aws1/cx_rt_generic, - release_address FOR TESTING RAISING /aws1/cx_rt_generic, - start_instances FOR TESTING RAISING /aws1/cx_rt_generic, - stop_instances FOR TESTING RAISING /aws1/cx_rt_generic. - - CLASS-METHODS class_setup RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic. - CLASS-METHODS class_teardown RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic. - - - CLASS-METHODS: - get_ami_id - RETURNING VALUE(ov_ami_id) TYPE /aws1/ec2string - RAISING /aws1/cx_rt_generic, - wait_until_status_change - IMPORTING iv_required_status TYPE string - iv_instance_id TYPE string - RETURNING VALUE(ov_current_status) TYPE string - RAISING /aws1/cx_rt_service_generic, - run_instance - IMPORTING iv_subnet_id TYPE /aws1/ec2subnetid - RETURNING VALUE(ov_instance_id) TYPE /aws1/ec2string - RAISING /aws1/cx_rt_service_generic, - terminate_instance - IMPORTING iv_instance_id TYPE /aws1/ec2string - RAISING /aws1/cx_rt_service_generic. - -ENDCLASS. - -CLASS ltc_zcl_aws1_ec2_actions IMPLEMENTATION. - - METHOD class_setup. - ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). - ao_ec2 = /aws1/cl_ec2_factory=>create( ao_session ). - ao_ec2_actions = NEW zcl_aws1_ec2_actions( ). - av_vpc_id = ao_ec2->createvpc( iv_cidrblock = '10.10.0.0/16' )->get_vpc( )->get_vpcid( ). - av_subnet_id = ao_ec2->createsubnet( iv_vpcid = av_vpc_id - iv_cidrblock = '10.10.0.0/24' )->get_subnet( )->get_subnetid( ). - av_instance_id = run_instance( av_subnet_id ). - - ENDMETHOD. - - METHOD class_teardown. - LOOP AT at_instance_id ASSIGNING FIELD-SYMBOL(). - terminate_instance( ). - ENDLOOP. - - DO 4 TIMES. - TRY. - ao_ec2->deletesubnet( iv_subnetid = av_subnet_id ). - EXIT. " exit the loop - CATCH /aws1/cx_ec2clientexc INTO DATA(lo_ex). - IF lo_ex->get_text( ) CS 'dependencies'. - WAIT UP TO 15 SECONDS. - ELSE. - RAISE EXCEPTION lo_ex. - ENDIF. - - ENDTRY. - ENDDO. - DO 4 TIMES. - TRY. - ao_ec2->deletevpc( iv_vpcid = av_vpc_id ). - CATCH /aws1/cx_ec2clientexc INTO lo_ex. - IF lo_ex->av_err_code = 'DependencyViolation'. - WAIT UP TO 15 SECONDS. - ELSEIF lo_ex->av_err_code = 'InvalidVpcID.NotFound'. - EXIT. - ELSE. - RAISE EXCEPTION lo_ex. - ENDIF. - ENDTRY. - ENDDO. - ENDMETHOD. - - METHOD allocate_address. - DATA(lo_result) = ao_ec2_actions->allocate_address( ). - - cl_abap_unit_assert=>assert_not_initial( - act = lo_result->get_allocationid( ) - msg = |Failed to allocate an Elastic IP address| ). - - ao_ec2->releaseaddress( iv_allocationid = lo_result->get_allocationid( ) ). - - ENDMETHOD. - METHOD associate_address. - DATA(lv_internet_gateway_id) = ao_ec2->createinternetgateway( )->get_internetgateway( )->get_internetgatewayid( ). - ao_ec2->attachinternetgateway( iv_internetgatewayid = lv_internet_gateway_id - iv_vpcid = av_vpc_id ). - wait_until_status_change( iv_instance_id = av_instance_id - iv_required_status = 'running' ). - DATA(lv_allocation_id) = ao_ec2->allocateaddress( iv_domain = 'vpc' )->get_allocationid( ). - - DATA(lo_result) = ao_ec2_actions->associate_address( - iv_instance_id = av_instance_id - iv_allocation_id = lv_allocation_id ). - - cl_abap_unit_assert=>assert_not_initial( - act = lo_result->get_associationid( ) - msg = |Failed to associate Elastic IP address with EC2 instancce| ). - - ao_ec2->disassociateaddress( iv_associationid = lo_result->get_associationid( ) ). - ao_ec2->releaseaddress( iv_allocationid = lv_allocation_id ). - ao_ec2->detachinternetgateway( iv_internetgatewayid = lv_internet_gateway_id - iv_vpcid = av_vpc_id ). - ao_ec2->deleteinternetgateway( iv_internetgatewayid = lv_internet_gateway_id ). - ENDMETHOD. - METHOD describe_addresses. - DATA(lv_internet_gateway_id) = ao_ec2->createinternetgateway( )->get_internetgateway( )->get_internetgatewayid( ). - ao_ec2->attachinternetgateway( iv_internetgatewayid = lv_internet_gateway_id - iv_vpcid = av_vpc_id ). - wait_until_status_change( iv_instance_id = av_instance_id - iv_required_status = 'running' ). - - DATA(lo_allocate_result) = ao_ec2->allocateaddress( iv_domain = 'vpc' ). - DATA(lo_associate_result) = ao_ec2->associateaddress( iv_allocationid = lo_allocate_result->get_allocationid( ) - iv_instanceid = av_instance_id ). - - DATA(lo_describe_result) = ao_ec2_actions->describe_addresses( ). - - LOOP AT lo_describe_result->get_addresses( ) INTO DATA(lo_address). - IF lo_address->get_instanceid( ) = av_instance_id AND lo_address->get_publicip( ) = lo_allocate_result->get_publicip( ). - DATA(lv_found) = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Elastic IP address associated with EC2 instance should have been included in the address list| ). - - ao_ec2->disassociateaddress( iv_associationid = lo_associate_result->get_associationid( ) ). - ao_ec2->releaseaddress( iv_allocationid = lo_allocate_result->get_allocationid( ) ). - ao_ec2->detachinternetgateway( iv_internetgatewayid = lv_internet_gateway_id - iv_vpcid = av_vpc_id ). - ao_ec2->deleteinternetgateway( iv_internetgatewayid = lv_internet_gateway_id ). - ENDMETHOD. - METHOD release_address. - DATA(lv_internet_gateway_id) = ao_ec2->createinternetgateway( )->get_internetgateway( )->get_internetgatewayid( ). - ao_ec2->attachinternetgateway( iv_internetgatewayid = lv_internet_gateway_id - iv_vpcid = av_vpc_id ). - wait_until_status_change( iv_instance_id = av_instance_id - iv_required_status = 'running' ). - - DATA(lo_allocate_result) = ao_ec2->allocateaddress( iv_domain = 'vpc' ). - DATA(lo_associate_result) = ao_ec2->associateaddress( iv_allocationid = lo_allocate_result->get_allocationid( ) - iv_instanceid = av_instance_id ). - - ao_ec2->disassociateaddress( iv_associationid = lo_associate_result->get_associationid( ) ). - ao_ec2_actions->release_address( lo_allocate_result->get_allocationid( ) ). - - DATA(lo_describe_result) = ao_ec2_actions->describe_addresses( ). - - LOOP AT lo_describe_result->get_addresses( ) INTO DATA(lo_address). - IF lo_address->get_publicip( ) = lo_allocate_result->get_publicip( ). - DATA(lv_found) = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_false( - act = lv_found - msg = |Elastic IP address should have been released| ). - - ao_ec2->detachinternetgateway( iv_internetgatewayid = lv_internet_gateway_id - iv_vpcid = av_vpc_id ). - ao_ec2->deleteinternetgateway( iv_internetgatewayid = lv_internet_gateway_id ). - ENDMETHOD. - METHOD create_instance. - DATA(lo_create_result) = ao_ec2_actions->create_instance( - iv_ami_id = get_ami_id( ) - iv_tag_value = 'code-example-create-instance' - iv_subnet_id = av_subnet_id ). - READ TABLE lo_create_result->get_instances( ) INTO DATA(lo_instance) INDEX 1. - DATA(lv_current_status) = wait_until_status_change( iv_instance_id = lo_instance->get_instanceid( ) - iv_required_status = 'running' ). - - cl_abap_unit_assert=>assert_equals( - act = lv_current_status - exp = 'running' - msg = |EC2 instance { lo_instance->get_instanceid( ) } should have been in 'running' state| ). - APPEND lo_instance->get_instanceid( ) TO at_instance_id. - ENDMETHOD. - METHOD monitor_instance. - ao_ec2_actions->monitor_instance( av_instance_id ). - WAIT UP TO 5 SECONDS. - DATA(lo_describe_result) = ao_ec2->describeinstances( - it_instanceids = VALUE /aws1/cl_ec2instidstringlist_w=>tt_instanceidstringlist( - ( NEW /aws1/cl_ec2instidstringlist_w( av_instance_id ) ) - ) ). - READ TABLE lo_describe_result->get_reservations( ) INTO DATA(lo_reservation) INDEX 1. - READ TABLE lo_reservation->get_instances( ) INTO DATA(lo_describe_instance) INDEX 1. - cl_abap_unit_assert=>assert_equals( - exp = lo_describe_instance->get_monitoring( )->get_state( ) - act = 'enabled' - msg = |Detailed monitoring should have been enabled| ). - ENDMETHOD. - METHOD reboot_instance. - wait_until_status_change( iv_instance_id = av_instance_id - iv_required_status = 'running' ). - ao_ec2_actions->reboot_instance( av_instance_id ). - DATA(lv_current_status) = wait_until_status_change( iv_instance_id = av_instance_id - iv_required_status = 'running' ). - - cl_abap_unit_assert=>assert_equals( - exp = lv_current_status - act = 'running' - msg = |Failed to reboot the specified instance| ). - ENDMETHOD. - METHOD start_instances. - ao_ec2->stopinstances( - it_instanceids = VALUE /aws1/cl_ec2instidstringlist_w=>tt_instanceidstringlist( - ( NEW /aws1/cl_ec2instidstringlist_w( av_instance_id ) ) - ) ). - wait_until_status_change( iv_instance_id = av_instance_id - iv_required_status = 'stopped' ). - - DATA(lo_start_result) = ao_ec2_actions->start_instance( av_instance_id ). - READ TABLE lo_start_result->get_startinginstances( ) INTO DATA(lo_start_instance) INDEX 1. - cl_abap_unit_assert=>assert_equals( - exp = lo_start_instance->get_currentstate( )->get_name( ) - act = 'pending' - msg = |Instance should have been in 'pending' state when a request is made to start a stopped instance| ). - - DATA(lv_current_status) = wait_until_status_change( iv_instance_id = av_instance_id - iv_required_status = 'running' ). - cl_abap_unit_assert=>assert_equals( - exp = lv_current_status - act = 'running' - msg = |Failed to start a stopped instance| ). - ENDMETHOD. - METHOD stop_instances. - DATA(lo_start_result) = ao_ec2_actions->start_instance( av_instance_id ). - wait_until_status_change( iv_instance_id = av_instance_id - iv_required_status = 'running' ). - DATA(lo_stop_result) = ao_ec2_actions->stop_instance( av_instance_id ). - READ TABLE lo_stop_result->get_stoppinginstances( ) INTO DATA(lo_stop_instance) INDEX 1. - cl_abap_unit_assert=>assert_equals( - exp = lo_stop_instance->get_currentstate( )->get_name( ) - act = 'stopping' - msg = |Instance should have been in 'stopping' state when a request is made to stop a running instance| ). - - DATA(lv_current_status) = wait_until_status_change( iv_instance_id = av_instance_id - iv_required_status = 'stopped' ). - cl_abap_unit_assert=>assert_equals( - exp = lv_current_status - act = 'stopped' - msg = |Failed to stop a running instance| ). - - ENDMETHOD. - METHOD describe_instances. - DATA(lo_describe_result) = ao_ec2_actions->describe_instances( ). - READ TABLE lo_describe_result->get_reservations( ) INTO DATA(lo_reservation) INDEX 1. - cl_abap_unit_assert=>assert_not_initial( - act = lo_reservation->get_instances( ) - msg = |Instance List should not be empty| ). - ENDMETHOD. - METHOD create_key_pair. - CONSTANTS cv_key_name TYPE /aws1/ec2string VALUE 'code-example-create-key-pair'. - DATA(lo_result) = ao_ec2_actions->create_key_pair( cv_key_name ). - cl_abap_unit_assert=>assert_not_initial( - act = lo_result->get_keypairid( ) - msg = |Failed to create key pair { cv_key_name }| ). - - - IF lo_result->get_keyfingerprint( ) IS NOT INITIAL AND lo_result->get_keymaterial( ) IS NOT INITIAL AND lo_result->get_keyname( ) = cv_key_name. - DATA(lv_has_details) = abap_true. - ENDIF. - - cl_abap_unit_assert=>assert_true( - act = lv_has_details - msg = |The response object for key pair { cv_key_name } does not contain the required elements| ). - - ao_ec2->deletekeypair( iv_keyname = cv_key_name ). - ENDMETHOD. - METHOD delete_key_pair. - CONSTANTS cv_key_name TYPE /aws1/ec2string VALUE 'code-example-delete-key-pair'. - ao_ec2->createkeypair( iv_keyname = cv_key_name ). - ao_ec2_actions->delete_key_pair( cv_key_name ). - DATA(lo_result) = ao_ec2->describekeypairs( ). - - - LOOP AT lo_result->get_keypairs( ) INTO DATA(lo_key_pair). - IF lo_key_pair->get_keyname( ) = cv_key_name. - DATA(lv_found) = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_false( - act = lv_found - msg = |Key Pair { cv_key_name } should have been deleted| ). - ENDMETHOD. - METHOD describe_key_pairs. - CONSTANTS cv_key_name TYPE /aws1/ec2string VALUE 'code-example-describe-key-pairs'. - ao_ec2->createkeypair( iv_keyname = cv_key_name ). - DATA(lo_result) = ao_ec2_actions->describe_key_pairs( ). - - - LOOP AT lo_result->get_keypairs( ) INTO DATA(lo_key_pair). - IF lo_key_pair->get_keyname( ) = cv_key_name. - DATA(lv_found) = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Key Pair { cv_key_name } should have been included in key pair list| ). - ao_ec2->deletekeypair( iv_keyname = cv_key_name ). - ENDMETHOD. - METHOD describe_regions. - DATA(lo_result) = ao_ec2_actions->describe_regions( ). - cl_abap_unit_assert=>assert_not_initial( - act = lo_result->get_regions( ) - msg = |Failed to retrieve list of regions| ). - ENDMETHOD. - METHOD describe_availability_zones. - DATA(lo_result) = ao_ec2_actions->describe_availability_zones( ). - cl_abap_unit_assert=>assert_not_initial( - act = lo_result->get_availabilityzones( ) - msg = |Failed to retrieve list of availability zones| ). - ENDMETHOD. - METHOD create_security_group. - CONSTANTS cv_security_group_name TYPE /aws1/ec2string VALUE 'code-example-create-security-group'. - DATA(lo_create_result) = ao_ec2_actions->create_security_group( iv_security_group_name = cv_security_group_name - iv_vpc_id = av_vpc_id ). - DATA(lo_describe_result) = ao_ec2->describesecuritygroups( - it_groupids = VALUE /aws1/cl_ec2groupidstrlist_w=>tt_groupidstringlist( - ( NEW /aws1/cl_ec2groupidstrlist_w( lo_create_result->get_groupid( ) ) ) - ) ). - - - LOOP AT lo_describe_result->get_securitygroups( ) INTO DATA(lo_security_group). - IF lo_security_group->get_groupname( ) = cv_security_group_name. - DATA(lv_found) = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Failed to create security group { cv_security_group_name }| ). - - ao_ec2->deletesecuritygroup( iv_groupid = lo_create_result->get_groupid( ) ). - ENDMETHOD. - METHOD delete_security_group. - CONSTANTS cv_security_group_name TYPE /aws1/ec2string VALUE 'code-example-delete-security-group'. - DATA(lo_create_result) = ao_ec2->createsecuritygroup( - iv_groupname = cv_security_group_name - iv_description = |security group for delete_security_group test| - iv_vpcid = av_vpc_id ). - ao_ec2_actions->delete_security_group( lo_create_result->get_groupid( ) ). - DATA(lo_describe_result) = ao_ec2->describesecuritygroups( - it_filters = VALUE /aws1/cl_ec2filter=>tt_filterlist( - ( NEW /aws1/cl_ec2filter( - iv_name = 'vpc-id' - it_values = VALUE /aws1/cl_ec2valuestringlist_w=>tt_valuestringlist( - ( NEW /aws1/cl_ec2valuestringlist_w( av_vpc_id ) ) - ) - ) ) - ) ). - - - LOOP AT lo_describe_result->get_securitygroups( ) INTO DATA(lo_security_group). - IF lo_security_group->get_groupname( ) = cv_security_group_name. - DATA(lv_found) = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_false( - act = lv_found - msg = |Security Group { cv_security_group_name } should have been deleted| ). - - ENDMETHOD. - METHOD describe_security_groups. - CONSTANTS cv_security_group_name TYPE /aws1/ec2string VALUE 'code-example-describe-security-groups'. - DATA(lo_create_result) = ao_ec2->createsecuritygroup( - iv_groupname = cv_security_group_name - iv_description = |security group for describe_security_groups test| - iv_vpcid = av_vpc_id ). - - DATA(lo_describe_result) = ao_ec2_actions->describe_security_groups( lo_create_result->get_groupid( ) ). - - LOOP AT lo_describe_result->get_securitygroups( ) INTO DATA(lo_security_group). - IF lo_security_group->get_groupname( ) = cv_security_group_name. - DATA(lv_found) = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Security Group { cv_security_group_name } should have been included in security group list| ). - - ao_ec2->deletesecuritygroup( iv_groupid = lo_create_result->get_groupid( ) ). - ENDMETHOD. - METHOD get_ami_id. - CONSTANTS: cv_ami_name TYPE string VALUE 'amzn2-ami-kernel-5.10-hvm*', - cv_architecture TYPE string VALUE 'x86_64'. - TYPES: BEGIN OF ty_ami, - cdate TYPE string, - image TYPE REF TO /aws1/cl_ec2image, - END OF ty_ami. - DATA(lt_images) = ao_ec2->describeimages( - it_filters = VALUE /aws1/cl_ec2filter=>tt_filterlist( - ( NEW /aws1/cl_ec2filter( - iv_name = 'name' - it_values = VALUE /aws1/cl_ec2valuestringlist_w=>tt_valuestringlist( - ( NEW /aws1/cl_ec2valuestringlist_w( cv_ami_name ) ) - ) ) ) - ( NEW /aws1/cl_ec2filter( - iv_name = 'architecture' - it_values = VALUE /aws1/cl_ec2valuestringlist_w=>tt_valuestringlist( - ( NEW /aws1/cl_ec2valuestringlist_w( cv_architecture ) ) - ) ) ) - ) - )->get_images( ). - DATA lt_ami TYPE TABLE OF ty_ami. - LOOP AT lt_images ASSIGNING FIELD-SYMBOL(). - APPEND VALUE ty_ami( cdate = ->get_creationdate( ) image = ) TO lt_ami. - ENDLOOP. - SORT lt_ami BY cdate DESCENDING. - READ TABLE lt_ami INTO DATA(lo_ami) INDEX 1. - ov_ami_id = lo_ami-image->get_imageid( ). - ENDMETHOD. - METHOD wait_until_status_change. - DO 96 TIMES. - WAIT UP TO 5 SECONDS. - DATA(lo_describe_result) = ao_ec2->describeinstances( - it_instanceids = VALUE /aws1/cl_ec2instidstringlist_w=>tt_instanceidstringlist( - ( NEW /aws1/cl_ec2instidstringlist_w( iv_instance_id ) ) - ) ). - READ TABLE lo_describe_result->get_reservations( ) INTO DATA(lo_reservation) INDEX 1. - READ TABLE lo_reservation->get_instances( ) INTO DATA(lo_describe_instance) INDEX 1. - IF lo_describe_instance->get_state( )->get_name( ) = iv_required_status. - EXIT. - ENDIF. - ENDDO. - ov_current_status = lo_describe_instance->get_state( )->get_name( ). - ENDMETHOD. - METHOD run_instance. - DATA(lo_create_result) = ao_ec2->runinstances( - iv_imageid = get_ami_id( ) - iv_instancetype = 't3.micro' - iv_maxcount = 1 - iv_mincount = 1 - iv_subnetid = iv_subnet_id ). - READ TABLE lo_create_result->get_instances( ) INTO DATA(lo_instance) INDEX 1. - ov_instance_id = lo_instance->get_instanceid( ). - APPEND ov_instance_id TO at_instance_id. - ENDMETHOD. - METHOD terminate_instance. - ao_ec2->terminateinstances00( - it_instanceids = VALUE /aws1/cl_ec2instidstringlist_w=>tt_instanceidstringlist( - ( NEW /aws1/cl_ec2instidstringlist_w( iv_instance_id ) ) - ) ). - wait_until_status_change( iv_instance_id = iv_instance_id - iv_required_status = 'terminated' ). - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/ec2/zcl_aws1_ec2_actions.clas.xml b/sap-abap/services/ec2/zcl_aws1_ec2_actions.clas.xml deleted file mode 100644 index 70e3020e5ff..00000000000 --- a/sap-abap/services/ec2/zcl_aws1_ec2_actions.clas.xml +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - ZCL_AWS1_EC2_ACTIONS - E - EC2 Code Example Actions - 1 - X - X - X - X - - - - ALLOCATE_ADDRESS - E - Allocate an Elastic IP address - - - ASSOCIATE_ADDRESS - E - Associate an Elastic IP address to an EC2 instance - - - CREATE_INSTANCE - E - Create an EC2 instance - - - CREATE_KEY_PAIR - E - Create an Amazon EC2 security key pair - - - CREATE_SECURITY_GROUP - E - Create an Amazon EC2 security group - - - DELETE_KEY_PAIR - E - Delete an Amazon EC2 security key pair - - - DELETE_SECURITY_GROUP - E - Delete an Amazon EC2 security group - - - DESCRIBE_ADDRESSES - E - Retrieve information about Elastic IP addresses - - - DESCRIBE_AVAILABILITY_ZONES - E - Retrieve information about Availability Zones - - - DESCRIBE_INSTANCES - E - Retrieve information about EC2 instances - - - DESCRIBE_KEY_PAIRS - E - Retrieve information about Amazon EC2 security key pairs - - - DESCRIBE_REGIONS - E - Retrieve information about Regions - - - DESCRIBE_SECURITY_GROUPS - E - Retrieve information about an Amazon EC2 security group - - - MONITOR_INSTANCE - E - Enable detailed monitoring for a running EC2 instance - - - REBOOT_INSTANCE - E - Reboot an EC2 instance - - - RELEASE_ADDRESS - E - Release an Elastic IP address - - - START_INSTANCE - E - Start an EC2 instance - - - STOP_INSTANCE - E - Stop an EC2 instance - - - - - diff --git a/sap-abap/services/kinesis/package.devc.xml b/sap-abap/services/kinesis/package.devc.xml deleted file mode 100644 index f465ebf6d25..00000000000 --- a/sap-abap/services/kinesis/package.devc.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - Package for Amazon Kinesis - - - - diff --git a/sap-abap/services/kinesis/zcl_aws1_kns_actions.clas.abap b/sap-abap/services/kinesis/zcl_aws1_kns_actions.clas.abap deleted file mode 100644 index e8958129237..00000000000 --- a/sap-abap/services/kinesis/zcl_aws1_kns_actions.clas.abap +++ /dev/null @@ -1,249 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS zcl_aws1_kns_actions DEFINITION - PUBLIC - FINAL - CREATE PUBLIC . - - PUBLIC SECTION. - - METHODS create_stream - IMPORTING - !iv_stream_name TYPE /aws1/knsstreamname - !iv_shard_count TYPE /aws1/knspositiveintegerobject . - METHODS delete_stream - IMPORTING - !iv_stream_name TYPE /aws1/knsstreamname . - METHODS describe_stream - IMPORTING - !iv_stream_name TYPE /aws1/knsstreamname - EXPORTING - !oo_result TYPE REF TO /aws1/cl_knsdescrstreamoutput . - METHODS get_records - IMPORTING - !iv_shard_iterator TYPE /aws1/knssharditerator - EXPORTING - !oo_result TYPE REF TO /aws1/cl_knsgetrecordsoutput . - METHODS list_streams - IMPORTING - !iv_limit TYPE /aws1/knsliststreamsinputlimit - EXPORTING - !oo_result TYPE REF TO /aws1/cl_knsliststreamsoutput . - METHODS put_record - IMPORTING - !iv_stream_name TYPE /aws1/knsstreamname - !iv_data TYPE /aws1/knsdata - !iv_partition_key TYPE /aws1/knspartitionkey - EXPORTING - !oo_result TYPE REF TO /aws1/cl_knsputrecordoutput . - METHODS register_stream_consumer - IMPORTING - !iv_stream_arn TYPE /aws1/knsstreamarn - !iv_consumer_name TYPE /aws1/knsconsumername - EXPORTING - !oo_result TYPE REF TO /aws1/cl_knsregstreamconsout . - PROTECTED SECTION. - PRIVATE SECTION. -ENDCLASS. - - - -CLASS ZCL_AWS1_KNS_ACTIONS IMPLEMENTATION. - - - METHOD create_stream. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_kns) = /aws1/cl_kns_factory=>create( lo_session ). - - "snippet-start:[kns.abapv1.create_stream] - TRY. - lo_kns->createstream( - iv_streamname = iv_stream_name - iv_shardcount = iv_shard_count ). - MESSAGE 'Stream created.' TYPE 'I'. - CATCH /aws1/cx_knsinvalidargumentex. - MESSAGE 'The specified argument was not valid.' TYPE 'E'. - CATCH /aws1/cx_knslimitexceededex. - MESSAGE 'The request processing has failed because of a limit exceed exception.' TYPE 'E'. - CATCH /aws1/cx_knsresourceinuseex. - MESSAGE 'The request processing has failed because the resource is in use.' TYPE 'E'. - ENDTRY. - "snippet-end:[kns.abapv1.create_stream] - - ENDMETHOD. - - - METHOD delete_stream. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_kns) = /aws1/cl_kns_factory=>create( lo_session ). - - "snippet-start:[kns.abapv1.delete_stream] - TRY. - lo_kns->deletestream( - iv_streamname = iv_stream_name ). - MESSAGE 'Stream deleted.' TYPE 'I'. - CATCH /aws1/cx_knslimitexceededex. - MESSAGE 'The request processing has failed because of a limit exceed exception.' TYPE 'E'. - CATCH /aws1/cx_knsresourceinuseex. - MESSAGE 'The request processing has failed because the resource is in use.' TYPE 'E'. - ENDTRY. - "snippet-end:[kns.abapv1.delete_stream] - - ENDMETHOD. - - - METHOD describe_stream. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_kns) = /aws1/cl_kns_factory=>create( lo_session ). - - "snippet-start:[kns.abapv1.describe_stream] - TRY. - oo_result = lo_kns->describestream( - iv_streamname = iv_stream_name ). - DATA(lt_stream_description) = oo_result->get_streamdescription( ). - MESSAGE 'Streams retrieved.' TYPE 'I'. - CATCH /aws1/cx_knslimitexceededex. - MESSAGE 'The request processing has failed because of a limit exceed exception.' TYPE 'E'. - CATCH /aws1/cx_knsresourcenotfoundex. - MESSAGE 'Resource being accessed is not found.' TYPE 'E'. - ENDTRY. - "snippet-end:[kns.abapv1.describe_stream] - - - - ENDMETHOD. - - - METHOD get_records. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_kns) = /aws1/cl_kns_factory=>create( lo_session ). - - "snippet-start:[kns.abapv1.get_records] - TRY. - oo_result = lo_kns->getrecords( " oo_result is returned for testing purposes. " - iv_sharditerator = iv_shard_iterator ). - DATA(lt_records) = oo_result->get_records( ). - MESSAGE 'Record retrieved.' TYPE 'I'. - CATCH /aws1/cx_knsexpirediteratorex. - MESSAGE 'Iterator expired.' TYPE 'E'. - CATCH /aws1/cx_knsinvalidargumentex. - MESSAGE 'The specified argument was not valid.' TYPE 'E'. - CATCH /aws1/cx_knskmsaccessdeniedex. - MESSAGE 'You do not have permission to perform this AWS KMS action.' TYPE 'E'. - CATCH /aws1/cx_knskmsdisabledex. - MESSAGE 'KMS key used is disabled.' TYPE 'E'. - CATCH /aws1/cx_knskmsinvalidstateex. - MESSAGE 'KMS key used is in an invalid state. ' TYPE 'E'. - CATCH /aws1/cx_knskmsnotfoundex. - MESSAGE 'KMS key used is not found.' TYPE 'E'. - CATCH /aws1/cx_knskmsoptinrequired. - MESSAGE 'KMS key option is required.' TYPE 'E'. - CATCH /aws1/cx_knskmsthrottlingex. - MESSAGE 'The rate of requests to AWS KMS is exceeding the request quotas.' TYPE 'E'. - CATCH /aws1/cx_knsprovthruputexcdex. - MESSAGE 'The request rate for the stream is too high, or the requested data is too large for the available throughput.' TYPE 'E'. - CATCH /aws1/cx_knsresourcenotfoundex. - MESSAGE 'Resource being accessed is not found.' TYPE 'E'. - ENDTRY. - "snippet-end:[kns.abapv1.get_records] - - ENDMETHOD. - - - METHOD list_streams. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_kns) = /aws1/cl_kns_factory=>create( lo_session ). - - "snippet-start:[kns.abapv1.list_streams] - TRY. - oo_result = lo_kns->liststreams( " oo_result is returned for testing purposes. " - "Set Limit to specify that a maximum of streams should be returned." - iv_limit = iv_limit ). - DATA(lt_streams) = oo_result->get_streamnames( ). - MESSAGE 'Streams listed.' TYPE 'I'. - CATCH /aws1/cx_knslimitexceededex. - MESSAGE 'The request processing has failed because of a limit exceed exception.' TYPE 'E'. - ENDTRY. - "snippet-end:[kns.abapv1.list_streams] - - ENDMETHOD. - - - METHOD put_record. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_kns) = /aws1/cl_kns_factory=>create( lo_session ). - - "snippet-start:[kns.abapv1.put_record] - TRY. - oo_result = lo_kns->putrecord( " oo_result is returned for testing purposes. " - iv_streamname = iv_stream_name - iv_data = iv_data - iv_partitionkey = iv_partition_key ). - MESSAGE 'Record created.' TYPE 'I'. - CATCH /aws1/cx_knsinvalidargumentex. - MESSAGE 'The specified argument was not valid.' TYPE 'E'. - CATCH /aws1/cx_knskmsaccessdeniedex. - MESSAGE 'You do not have permission to perform this AWS KMS action.' TYPE 'E'. - CATCH /aws1/cx_knskmsdisabledex. - MESSAGE 'KMS key used is disabled.' TYPE 'E'. - CATCH /aws1/cx_knskmsinvalidstateex. - MESSAGE 'KMS key used is in an invalid state. ' TYPE 'E'. - CATCH /aws1/cx_knskmsnotfoundex. - MESSAGE 'KMS key used is not found.' TYPE 'E'. - CATCH /aws1/cx_knskmsoptinrequired. - MESSAGE 'KMS key option is required.' TYPE 'E'. - CATCH /aws1/cx_knskmsthrottlingex. - MESSAGE 'The rate of requests to AWS KMS is exceeding the request quotas.' TYPE 'E'. - CATCH /aws1/cx_knsprovthruputexcdex. - MESSAGE 'The request rate for the stream is too high, or the requested data is too large for the available throughput.' TYPE 'E'. - CATCH /aws1/cx_knsresourcenotfoundex. - MESSAGE 'Resource being accessed is not found.' TYPE 'E'. - ENDTRY. - "snippet-end:[kns.abapv1.put_record] - ENDMETHOD. - - - METHOD register_stream_consumer. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_kns) = /aws1/cl_kns_factory=>create( lo_session ). - - "snippet-start:[kns.abapv1.register_stream_consumer] - TRY. - oo_result = lo_kns->registerstreamconsumer( " oo_result is returned for testing purposes. " - iv_streamarn = iv_stream_arn - iv_consumername = iv_consumer_name ). - MESSAGE 'Stream consumer registered.' TYPE 'I'. - CATCH /aws1/cx_knsinvalidargumentex. - MESSAGE 'The specified argument was not valid.' TYPE 'E'. - CATCH /aws1/cx_sgmresourcelimitexcd. - MESSAGE 'You have reached the limit on the number of resources.' TYPE 'E'. - CATCH /aws1/cx_sgmresourceinuse. - MESSAGE 'Resource being accessed is in use.' TYPE 'E'. - CATCH /aws1/cx_sgmresourcenotfound. - MESSAGE 'Resource being accessed is not found.' TYPE 'E'. - ENDTRY. - "snippet-end:[kns.abapv1.register_stream_consumer] - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/kinesis/zcl_aws1_kns_actions.clas.testclasses.abap b/sap-abap/services/kinesis/zcl_aws1_kns_actions.clas.testclasses.abap deleted file mode 100644 index 1cc78f19b7c..00000000000 --- a/sap-abap/services/kinesis/zcl_aws1_kns_actions.clas.testclasses.abap +++ /dev/null @@ -1,518 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS ltc_zcl_aws1_kns_actions DEFINITION FOR TESTING DURATION LONG RISK LEVEL DANGEROUS. - - PRIVATE SECTION. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA ao_kns TYPE REF TO /aws1/if_kns. - DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. - DATA ao_kns_actions TYPE REF TO zcl_aws1_kns_actions. - - METHODS setup FOR TESTING. - METHODS create_stream FOR TESTING. - METHODS delete_stream FOR TESTING. - METHODS list_streams FOR TESTING. - METHODS describe_stream FOR TESTING. - METHODS put_record FOR TESTING. - METHODS get_records FOR TESTING. - METHODS register_stream_consumer FOR TESTING. - -ENDCLASS. "ltc_Zcl_Aws1_Kns_Actions - - -CLASS ltc_zcl_aws1_kns_actions IMPLEMENTATION. - - METHOD setup. - ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). - ao_kns = /aws1/cl_kns_factory=>create( ao_session ). - ao_kns_actions = NEW zcl_aws1_kns_actions( ). - ENDMETHOD. - - METHOD create_stream. - - DATA lv_stream_name TYPE /aws1/knsstreamname. - DATA lo_stream_describe_result TYPE REF TO /aws1/cl_knsdescrstreamoutput. - DATA lo_stream_description TYPE REF TO /aws1/cl_knsstreamdescription. - DATA lv_stream_status TYPE /aws1/knsstreamstatus. - - DATA lv_uuid_16 TYPE sysuuid_x16. - - CONSTANTS cv_shard_count TYPE /aws1/knspositiveintegerobject VALUE 1. - - "Define stream name. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_stream_name = 'code-example-kns-stream-' && lv_uuid_16. - TRANSLATE lv_stream_name TO LOWER CASE. - - "Testing. - ao_kns_actions->create_stream( - iv_stream_name = lv_stream_name - iv_shard_count = cv_shard_count ). - - "Wait for stream to become active. - lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). - lo_stream_description = lo_stream_describe_result->get_streamdescription( ). - WHILE lo_stream_description->get_streamstatus( ) <> 'ACTIVE'. - IF sy-index = 30. - EXIT. "maximum 5 minutes - ENDIF. - WAIT UP TO 10 SECONDS. - lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). - lo_stream_description = lo_stream_describe_result->get_streamdescription( ). - ENDWHILE. - - "Testing. - DATA(lv_found) = abap_false. - IF lo_stream_description->get_streamstatus( ) = 'ACTIVE'. - lv_found = abap_true. - ENDIF. - - "Validation. - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Stream cannot be found| ). - - "Clean up. - ao_kns->deletestream( - iv_streamname = lv_stream_name ). - - ENDMETHOD. - - - METHOD delete_stream. - - DATA lv_stream_name TYPE /aws1/knsstreamname. - DATA lo_stream_describe_result TYPE REF TO /aws1/cl_knsdescrstreamoutput. - DATA lo_stream_list_result TYPE REF TO /aws1/cl_knsliststreamsoutput. - DATA lo_stream_description TYPE REF TO /aws1/cl_knsstreamdescription. - DATA lv_stream_status TYPE /aws1/knsstreamstatus. - - DATA lv_uuid_16 TYPE sysuuid_x16. - - CONSTANTS cv_shard_count TYPE /aws1/knspositiveintegerobject VALUE 1. - - "Define name. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_stream_name = 'code-example-kns-stream-' && lv_uuid_16. - TRANSLATE lv_stream_name TO LOWER CASE. - - "Create stream. - ao_kns->createstream( - iv_streamname = lv_stream_name - iv_shardcount = cv_shard_count ). - - "Wait for stream to become active. - lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). - lo_stream_description = lo_stream_describe_result->get_streamdescription( ). - WHILE lo_stream_description->get_streamstatus( ) <> 'ACTIVE'. - IF sy-index = 30. - EXIT. "maximum 5 minutes - ENDIF. - WAIT UP TO 10 SECONDS. - lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). - lo_stream_description = lo_stream_describe_result->get_streamdescription( ). - ENDWHILE. - - "Testing. - ao_kns_actions->delete_stream( - lv_stream_name ). - - "Confirm deletion. - DATA(lv_found) = abap_true. - lo_stream_list_result = ao_kns->liststreams( iv_exclusivestartstreamname = lv_stream_name ). - - IF lo_stream_list_result->has_streamnames( ) = 'X'. - lv_found = abap_false. - ENDIF. - - cl_abap_unit_assert=>assert_false( - act = lv_found - msg = |Stream not deleted| ). - - "Nothing to clean up. - - ENDMETHOD. - - METHOD list_streams. - - DATA lv_stream_name TYPE /aws1/knsstreamname. - DATA lo_stream_describe_result TYPE REF TO /aws1/cl_knsdescrstreamoutput. - DATA lo_stream_description TYPE REF TO /aws1/cl_knsstreamdescription. - DATA lo_stream_list_result TYPE REF TO /aws1/cl_knsliststreamsoutput. - DATA lv_stream_status TYPE /aws1/knsstreamstatus. - - DATA lv_uuid_16 TYPE sysuuid_x16. - - CONSTANTS cv_shard_count TYPE /aws1/knspositiveintegerobject VALUE 1. - CONSTANTS cv_limit TYPE /aws1/knsliststreamsinputlimit VALUE 20. - - "Define stream. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_stream_name = 'code-example-kns-stream-' && lv_uuid_16. - TRANSLATE lv_stream_name TO LOWER CASE. - - "Create stream. - ao_kns->createstream( - iv_streamname = lv_stream_name - iv_shardcount = cv_shard_count ). - - "Wait for stream to become active. - lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). - lo_stream_description = lo_stream_describe_result->get_streamdescription( ). - WHILE lo_stream_description->get_streamstatus( ) <> 'ACTIVE'. - IF sy-index = 30. - EXIT. "maximum 5 minutes - ENDIF. - WAIT UP TO 10 SECONDS. - lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). - lo_stream_description = lo_stream_describe_result->get_streamdescription( ). - ENDWHILE. - - "Testing. - ao_kns_actions->list_streams( EXPORTING iv_limit = cv_limit IMPORTING oo_result = lo_stream_list_result ). - - "Validation. - DATA(lv_found) = abap_false. - - IF lo_stream_list_result->has_streamnames( ) = 'X'. - lv_found = abap_true. - ENDIF. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Stream not found| ). - - "Clean up. - ao_kns->deletestream( - iv_streamname = lv_stream_name ). - - ENDMETHOD. - - METHOD describe_stream. - - DATA lv_stream_name TYPE /aws1/knsstreamname. - DATA lo_stream_describe_result TYPE REF TO /aws1/cl_knsdescrstreamoutput. - DATA lo_stream_description TYPE REF TO /aws1/cl_knsstreamdescription. - DATA lo_stream_list_result TYPE REF TO /aws1/cl_knsliststreamsoutput. - DATA lv_stream_status TYPE /aws1/knsstreamstatus. - - DATA lv_uuid_16 TYPE sysuuid_x16. - - CONSTANTS cv_shard_count TYPE /aws1/knspositiveintegerobject VALUE 1. - - "Define name. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_stream_name = 'code-example-kns-stream-' && lv_uuid_16. - TRANSLATE lv_stream_name TO LOWER CASE. - - "Create stream. - ao_kns->createstream( - iv_streamname = lv_stream_name - iv_shardcount = cv_shard_count ). - - "Wait for stream to become active. - lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). - lo_stream_description = lo_stream_describe_result->get_streamdescription( ). - WHILE lo_stream_description->get_streamstatus( ) <> 'ACTIVE'. - IF sy-index = 30. - EXIT. "maximum 5 minutes - ENDIF. - WAIT UP TO 10 SECONDS. - lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). - lo_stream_description = lo_stream_describe_result->get_streamdescription( ). - ENDWHILE. - - "Testing. - ao_kns_actions->describe_stream( EXPORTING iv_stream_name = lv_stream_name IMPORTING oo_result = lo_stream_describe_result ). - - "Validation. - DATA(lv_found) = abap_false. - - lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). - lo_stream_description = lo_stream_describe_result->get_streamdescription( ). - IF lo_stream_description->get_streamstatus( ) = 'ACTIVE'. - lv_found = abap_true. - ENDIF. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Stream not found| ). - - "Clean up. - ao_kns->deletestream( - iv_streamname = lv_stream_name ). - - ENDMETHOD. - - METHOD put_record. - - DATA lo_stream_describe_result TYPE REF TO /aws1/cl_knsdescrstreamoutput. - DATA lo_stream_description TYPE REF TO /aws1/cl_knsstreamdescription. - DATA lv_stream_status TYPE /aws1/knsstreamstatus. - DATA lo_put_record_output TYPE REF TO /aws1/cl_knsputrecordoutput. - DATA lo_get_record_output TYPE REF TO /aws1/cl_knsgetrecordsoutput. - DATA lo_sharditerator TYPE REF TO /aws1/cl_knsgetsharditerator01. - DATA lt_record_list TYPE /aws1/cl_knsrecord=>tt_recordlist. - DATA lv_record_data TYPE /aws1/knsdata. - DATA lv_stream_name TYPE /aws1/knsstreamname. - DATA lv_shardid TYPE /aws1/knsshardid. - - DATA lv_uuid_16 TYPE sysuuid_x16. - DATA(lv_data) = /aws1/cl_rt_util=>string_to_xstring( - `{` && - `"word": "This",` && - `"word": "is"` && - `"word": "a"` && - `"word": "code"` && - `"word": "example"` && - `}` ). - - CONSTANTS cv_shard_count TYPE /aws1/knspositiveintegerobject VALUE 1. - CONSTANTS cv_partition_key TYPE /aws1/knspartitionkey VALUE '123'. - CONSTANTS cv_sharditeratortype TYPE /aws1/knssharditeratortype VALUE 'TRIM_HORIZON'. - - "Define name. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_stream_name = 'code-example-kns-stream-' && lv_uuid_16. - TRANSLATE lv_stream_name TO LOWER CASE. - - "Create stream. - ao_kns->createstream( - iv_streamname = lv_stream_name - iv_shardcount = cv_shard_count ). - - "Wait for stream to become active. - lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). - lo_stream_description = lo_stream_describe_result->get_streamdescription( ). - WHILE lo_stream_description->get_streamstatus( ) <> 'ACTIVE'. - IF sy-index = 30. - EXIT. "maximum 5 minutes - ENDIF. - WAIT UP TO 10 SECONDS. - lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). - lo_stream_description = lo_stream_describe_result->get_streamdescription( ). - ENDWHILE. - - "Testing. - ao_kns_actions->put_record( EXPORTING iv_stream_name = lv_stream_name - iv_data = lv_data - iv_partition_key = cv_partition_key IMPORTING oo_result = lo_put_record_output ). - - "Get the shard ID. - lv_shardid = lo_put_record_output->get_shardid( ). - - "Get the shard iterator using the shard ID. - lo_sharditerator = ao_kns->getsharditerator( - iv_shardid = lv_shardid - iv_sharditeratortype = cv_sharditeratortype - iv_streamname = lv_stream_name ). - - "Get the record using the shard iterator. - lo_get_record_output = ao_kns->getrecords( - iv_sharditerator = lo_sharditerator->get_sharditerator( ) ). - - lt_record_list = lo_get_record_output->get_records( ). - LOOP AT lt_record_list INTO DATA(lo_record). - lv_record_data = lo_record->get_data( ). - ENDLOOP. - - "Validation. - DATA(lv_found) = abap_false. - - IF lv_record_data = lv_data. - lv_found = abap_true. - ENDIF. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Record not found| ). - - "Clean up. - ao_kns->deletestream( - iv_streamname = lv_stream_name ). - - ENDMETHOD. - - METHOD get_records. - - DATA lo_stream_describe_result TYPE REF TO /aws1/cl_knsdescrstreamoutput. - DATA lo_stream_description TYPE REF TO /aws1/cl_knsstreamdescription. - DATA lv_stream_status TYPE /aws1/knsstreamstatus. - DATA lo_put_record_output TYPE REF TO /aws1/cl_knsputrecordoutput. - DATA lo_get_record_output TYPE REF TO /aws1/cl_knsgetrecordsoutput. - DATA lo_sharditerator TYPE REF TO /aws1/cl_knsgetsharditerator01. - DATA lt_record_list TYPE /aws1/cl_knsrecord=>tt_recordlist. - DATA lv_record_data TYPE /aws1/knsdata. - DATA lv_stream_name TYPE /aws1/knsstreamname. - DATA lv_shardid TYPE /aws1/knsshardid. - - DATA lv_uuid_16 TYPE sysuuid_x16. - DATA(lv_data) = /aws1/cl_rt_util=>string_to_xstring( - `{` && - `"word": "This",` && - `"word": "is"` && - `"word": "a"` && - `"word": "code"` && - `"word": "example"` && - `}` ). - - CONSTANTS cv_shard_count TYPE /aws1/knspositiveintegerobject VALUE 1. - CONSTANTS cv_partition_key TYPE /aws1/knspartitionkey VALUE '123'. - CONSTANTS cv_sharditeratortype TYPE /aws1/knssharditeratortype VALUE 'TRIM_HORIZON'. - - "Define name. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_stream_name = 'code-example-kns-stream-' && lv_uuid_16. - TRANSLATE lv_stream_name TO LOWER CASE. - - "Create stream. - ao_kns->createstream( - iv_streamname = lv_stream_name - iv_shardcount = cv_shard_count ). - - "Wait for stream to become active. - lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). - lo_stream_description = lo_stream_describe_result->get_streamdescription( ). - - WHILE lo_stream_description->get_streamstatus( ) <> 'ACTIVE'. - IF sy-index = 30. - EXIT. "maximum 5 minutes - ENDIF. - WAIT UP TO 10 SECONDS. - lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). - lo_stream_description = lo_stream_describe_result->get_streamdescription( ). - ENDWHILE. - - "Create a record. - lo_put_record_output = ao_kns->putrecord( - iv_streamname = lv_stream_name - iv_data = lv_data - iv_partitionkey = cv_partition_key ). - - "Get the shard ID. - lv_shardid = lo_put_record_output->get_shardid( ). - - "Get the shard iterator. - lo_sharditerator = ao_kns->getsharditerator( - iv_shardid = lv_shardid - iv_sharditeratortype = cv_sharditeratortype - iv_streamname = lv_stream_name ). - - "Testing. - ao_kns_actions->get_records( EXPORTING iv_shard_iterator = lo_sharditerator->get_sharditerator( ) IMPORTING oo_result = lo_get_record_output ). - - "Get records. - lt_record_list = lo_get_record_output->get_records( ). - - LOOP AT lt_record_list INTO DATA(lo_record). - lv_record_data = lo_record->get_data( ). - ENDLOOP. - - "Validation. - DATA(lv_found) = abap_false. - IF lv_record_data = lv_data. - lv_found = abap_true. - ENDIF. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Record not found| ). - - "Clean up. - ao_kns->deletestream( - iv_streamname = lv_stream_name ). - - ENDMETHOD. - - METHOD register_stream_consumer. - - DATA lo_stream_describe_result TYPE REF TO /aws1/cl_knsdescrstreamoutput. - DATA lo_stream_description TYPE REF TO /aws1/cl_knsstreamdescription. - DATA lv_stream_status TYPE /aws1/knsstreamstatus. - DATA lo_put_record_output TYPE REF TO /aws1/cl_knsputrecordoutput. - DATA lo_get_record_output TYPE REF TO /aws1/cl_knsgetrecordsoutput. - DATA lo_sharditerator TYPE REF TO /aws1/cl_knsgetsharditerator01. - DATA lo_knsregstreamconsout TYPE REF TO /aws1/cl_knsregstreamconsout. - DATA lt_record_list TYPE /aws1/cl_knsrecord=>tt_recordlist. - DATA lv_record_data TYPE /aws1/knsdata. - DATA lv_stream_name TYPE /aws1/knsstreamname. - DATA lv_consumer_name TYPE /aws1/knsconsumername. - DATA lv_shardid TYPE /aws1/knsshardid. - DATA lv_stream_arn TYPE /aws1/knsstreamarn. - - DATA lo_knsliststreamconsout TYPE REF TO /aws1/cl_knsliststreamconsout. - DATA lo_knsconsumer TYPE REF TO /aws1/cl_knsconsumer. - DATA lv_uuid_16 TYPE sysuuid_x16. - - CONSTANTS cv_shard_count TYPE /aws1/knspositiveintegerobject VALUE 1. - CONSTANTS cv_partition_key TYPE /aws1/knspartitionkey VALUE '123'. - CONSTANTS cv_sharditeratortype TYPE /aws1/knssharditeratortype VALUE 'TRIM_HORIZON'. - - DATA(lv_data) = /aws1/cl_rt_util=>string_to_xstring( - `{` && - `"word": "This",` && - `"word": "is"` && - `"word": "a"` && - `"word": "code"` && - `"word": "example"` && - `}` ). - - "Define name. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_stream_name = 'code-example-kns-stream-' && lv_uuid_16. - TRANSLATE lv_stream_name TO LOWER CASE. - lv_consumer_name = 'code-example-kns-consumer-' && lv_uuid_16. - TRANSLATE lv_consumer_name TO LOWER CASE. - - "Create stream. - ao_kns->createstream( - iv_streamname = lv_stream_name - iv_shardcount = cv_shard_count ). - - "Wait for stream to become active. - lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). - lo_stream_description = lo_stream_describe_result->get_streamdescription( ). - WHILE lo_stream_description->get_streamstatus( ) <> 'ACTIVE'. - IF sy-index = 30. - EXIT. "maximum 5 minutes - ENDIF. - WAIT UP TO 10 SECONDS. - lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). - lo_stream_description = lo_stream_describe_result->get_streamdescription( ). - ENDWHILE. - - "Get stream Amazon Resource Name (ARN). - lv_stream_arn = lo_stream_description->get_streamarn( ). - - "Testing. - ao_kns_actions->register_stream_consumer( EXPORTING iv_consumer_name = lv_consumer_name - iv_stream_arn = lv_stream_arn IMPORTING oo_result = lo_knsregstreamconsout ). - - "Validation. - DATA(lv_found) = abap_false. - - lo_knsliststreamconsout = ao_kns->liststreamconsumers( - iv_streamarn = lv_stream_arn ). - lo_knsconsumer = lo_knsregstreamconsout->get_consumer( ). - - IF lo_knsconsumer->get_consumername( ) = lv_consumer_name. - lv_found = abap_true. - ENDIF. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Record not found| ). - - "Clean up. - ao_kns->deregisterstreamconsumer( - iv_streamarn = lv_stream_arn - iv_consumername = lv_consumer_name ). - - ao_kns->deletestream( - iv_streamname = lv_stream_name ). - ENDMETHOD. - -ENDCLASS. diff --git a/sap-abap/services/kinesis/zcl_aws1_kns_actions.clas.xml b/sap-abap/services/kinesis/zcl_aws1_kns_actions.clas.xml deleted file mode 100644 index b0ba7bb3681..00000000000 --- a/sap-abap/services/kinesis/zcl_aws1_kns_actions.clas.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - ZCL_AWS1_KNS_ACTIONS - E - Kinesis Code Example Actions - 1 - X - X - X - X - - - - CREATE_STREAM - E - Create a Kinesis stream. - - - DELETE_STREAM - E - Delete a Kinesis stream. - - - DESCRIBE_STREAM - E - Describe a Kinesis stream. - - - GET_RECORDS - E - Get data records from a Kinesis data stream's shard. - - - LIST_STREAMS - E - List Kinesis streams. - - - PUT_RECORD - E - Write data record into a Kinesis data stream. - - - REGISTER_STREAM_CONSUMER - E - Register a consumer with a Kinesis data stream. - - - - - diff --git a/sap-abap/services/kinesis/zcl_aws1_kns_scenario.clas.abap b/sap-abap/services/kinesis/zcl_aws1_kns_scenario.clas.abap deleted file mode 100644 index b00d0516226..00000000000 --- a/sap-abap/services/kinesis/zcl_aws1_kns_scenario.clas.abap +++ /dev/null @@ -1,158 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS zcl_aws1_kns_scenario DEFINITION - PUBLIC - FINAL - CREATE PUBLIC . - - PUBLIC SECTION. - - METHODS getting_started_with_kns - IMPORTING - !iv_stream_name TYPE /aws1/knsstreamname - !iv_partition_key TYPE /aws1/knspartitionkey - !iv_data TYPE /aws1/knsdata - !iv_shard_count TYPE /aws1/knspositiveintegerobject - !iv_sharditeratortype TYPE /aws1/knssharditeratortype - EXPORTING - !oo_result TYPE REF TO /aws1/cl_knsgetrecordsoutput . - PROTECTED SECTION. - PRIVATE SECTION. -ENDCLASS. - - - -CLASS ZCL_AWS1_KNS_SCENARIO IMPLEMENTATION. - - - METHOD getting_started_with_kns. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_kns) = /aws1/cl_kns_factory=>create( lo_session ). - - "This example scenario contains the following actions:" - " 1. Create a stream. " - " 2. Put a record in a stream. " - " 3. Create a shard iterator. " - " 4. Read the record. " - " 5. Delete the stream. " - - "snippet-start:[kns.abapv1.getting_started_with_kns] - - DATA lo_stream_describe_result TYPE REF TO /aws1/cl_knsdescrstreamoutput. - DATA lo_stream_description TYPE REF TO /aws1/cl_knsstreamdescription. - DATA lo_sharditerator TYPE REF TO /aws1/cl_knsgetsharditerator01. - DATA lo_record_result TYPE REF TO /aws1/cl_knsputrecordoutput. - - "Create stream." - TRY. - lo_kns->createstream( - iv_streamname = iv_stream_name - iv_shardcount = iv_shard_count ). - MESSAGE 'Stream created.' TYPE 'I'. - CATCH /aws1/cx_knsinvalidargumentex. - MESSAGE 'The specified argument was not valid.' TYPE 'E'. - CATCH /aws1/cx_knslimitexceededex. - MESSAGE 'The request processing has failed because of a limit exceeded exception.' TYPE 'E'. - CATCH /aws1/cx_knsresourceinuseex. - MESSAGE 'The request processing has failed because the resource is in use.' TYPE 'E'. - ENDTRY. - - "Wait for stream to becomes active." - lo_stream_describe_result = lo_kns->describestream( iv_streamname = iv_stream_name ). - lo_stream_description = lo_stream_describe_result->get_streamdescription( ). - WHILE lo_stream_description->get_streamstatus( ) <> 'ACTIVE'. - IF sy-index = 30. - EXIT. "maximum 5 minutes" - ENDIF. - WAIT UP TO 10 SECONDS. - lo_stream_describe_result = lo_kns->describestream( iv_streamname = iv_stream_name ). - lo_stream_description = lo_stream_describe_result->get_streamdescription( ). - ENDWHILE. - - "Create record." - TRY. - lo_record_result = lo_kns->putrecord( - iv_streamname = iv_stream_name - iv_data = iv_data - iv_partitionkey = iv_partition_key ). - MESSAGE 'Record created.' TYPE 'I'. - CATCH /aws1/cx_knsinvalidargumentex. - MESSAGE 'The specified argument was not valid.' TYPE 'E'. - CATCH /aws1/cx_knskmsaccessdeniedex. - MESSAGE 'You do not have permission to perform this AWS KMS action.' TYPE 'E'. - CATCH /aws1/cx_knskmsdisabledex. - MESSAGE 'KMS key used is disabled.' TYPE 'E'. - CATCH /aws1/cx_knskmsinvalidstateex. - MESSAGE 'KMS key used is in an invalid state. ' TYPE 'E'. - CATCH /aws1/cx_knskmsnotfoundex. - MESSAGE 'KMS key used is not found.' TYPE 'E'. - CATCH /aws1/cx_knskmsoptinrequired. - MESSAGE 'KMS key option is required.' TYPE 'E'. - CATCH /aws1/cx_knskmsthrottlingex. - MESSAGE 'The rate of requests to AWS KMS is exceeding the request quotas.' TYPE 'E'. - CATCH /aws1/cx_knsprovthruputexcdex. - MESSAGE 'The request rate for the stream is too high, or the requested data is too large for the available throughput.' TYPE 'E'. - CATCH /aws1/cx_knsresourcenotfoundex. - MESSAGE 'Resource being accessed is not found.' TYPE 'E'. - ENDTRY. - - "Create a shard iterator in order to read the record." - TRY. - lo_sharditerator = lo_kns->getsharditerator( - iv_shardid = lo_record_result->get_shardid( ) - iv_sharditeratortype = iv_sharditeratortype - iv_streamname = iv_stream_name ). - MESSAGE 'Shard iterator created.' TYPE 'I'. - CATCH /aws1/cx_knsinvalidargumentex. - MESSAGE 'The specified argument was not valid.' TYPE 'E'. - CATCH /aws1/cx_knsprovthruputexcdex. - MESSAGE 'The request rate for the stream is too high, or the requested data is too large for the available throughput.' TYPE 'E'. - CATCH /aws1/cx_sgmresourcenotfound. - MESSAGE 'Resource being accessed is not found.' TYPE 'E'. - ENDTRY. - - "Read the record." - TRY. - oo_result = lo_kns->getrecords( " oo_result is returned for testing purposes. " - iv_sharditerator = lo_sharditerator->get_sharditerator( ) ). - MESSAGE 'Shard iterator created.' TYPE 'I'. - CATCH /aws1/cx_knsexpirediteratorex. - MESSAGE 'Iterator expired.' TYPE 'E'. - CATCH /aws1/cx_knsinvalidargumentex. - MESSAGE 'The specified argument was not valid.' TYPE 'E'. - CATCH /aws1/cx_knskmsaccessdeniedex. - MESSAGE 'You do not have permission to perform this AWS KMS action.' TYPE 'E'. - CATCH /aws1/cx_knskmsdisabledex. - MESSAGE 'KMS key used is disabled.' TYPE 'E'. - CATCH /aws1/cx_knskmsinvalidstateex. - MESSAGE 'KMS key used is in an invalid state. ' TYPE 'E'. - CATCH /aws1/cx_knskmsnotfoundex. - MESSAGE 'KMS key used is not found.' TYPE 'E'. - CATCH /aws1/cx_knskmsoptinrequired. - MESSAGE 'KMS key option is required.' TYPE 'E'. - CATCH /aws1/cx_knskmsthrottlingex. - MESSAGE 'The rate of requests to AWS KMS is exceeding the request quotas.' TYPE 'E'. - CATCH /aws1/cx_knsprovthruputexcdex. - MESSAGE 'The request rate for the stream is too high, or the requested data is too large for the available throughput.' TYPE 'E'. - CATCH /aws1/cx_knsresourcenotfoundex. - MESSAGE 'Resource being accessed is not found.' TYPE 'E'. - ENDTRY. - - "Delete stream." - TRY. - lo_kns->deletestream( - iv_streamname = iv_stream_name ). - MESSAGE 'Stream deleted.' TYPE 'I'. - CATCH /aws1/cx_knslimitexceededex. - MESSAGE 'The request processing has failed because of a limit exceeded exception.' TYPE 'E'. - CATCH /aws1/cx_knsresourceinuseex. - MESSAGE 'The request processing has failed because the resource is in use.' TYPE 'E'. - ENDTRY. - "snippet-end:[kns.abapv1.getting_started_with_kns] - - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/kinesis/zcl_aws1_kns_scenario.clas.testclasses.abap b/sap-abap/services/kinesis/zcl_aws1_kns_scenario.clas.testclasses.abap deleted file mode 100644 index 22b16f157a1..00000000000 --- a/sap-abap/services/kinesis/zcl_aws1_kns_scenario.clas.testclasses.abap +++ /dev/null @@ -1,90 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0"" - -CLASS ltc_zcl_aws1_kns_scenario DEFINITION FOR TESTING DURATION SHORT RISK LEVEL DANGEROUS. - - PRIVATE SECTION. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA ao_kns TYPE REF TO /aws1/if_kns. - DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. - DATA ao_kns_scenario TYPE REF TO zcl_aws1_kns_scenario. - DATA lv_found TYPE abap_bool VALUE abap_false. - - METHODS getting_started_with_kns FOR TESTING. - METHODS setup RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic. - -ENDCLASS. "ltc_Zcl_Aws1_Kns_Scenario - - -CLASS ltc_zcl_aws1_kns_scenario IMPLEMENTATION. - - METHOD setup. - ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). - ao_kns = /aws1/cl_kns_factory=>create( ao_session ). - ao_kns_scenario = NEW zcl_aws1_kns_scenario( ). - ENDMETHOD. - - METHOD getting_started_with_kns. - - DATA lo_get_record_output TYPE REF TO /aws1/cl_knsgetrecordsoutput. - DATA lt_record_list TYPE /aws1/cl_knsrecord=>tt_recordlist. - DATA lv_record_data TYPE /aws1/knsdata. - DATA lv_stream_name TYPE /aws1/knsstreamname. - DATA lv_shardid TYPE /aws1/knsshardid. - - DATA(lv_data) = /aws1/cl_rt_util=>string_to_xstring( - `{` && - `"word": "This",` && - `"word": "is"` && - `"word": "a"` && - `"word": "code"` && - `"word": "example"` && - `}` ). - - CONSTANTS cv_shard_count TYPE /aws1/knspositiveintegerobject VALUE 1. - CONSTANTS cv_partition_key TYPE /aws1/knspartitionkey VALUE '123'. - CONSTANTS cv_sharditeratortype TYPE /aws1/knssharditeratortype VALUE 'TRIM_HORIZON'. - - "Define name. - DATA(lv_uuid_16) = cl_system_uuid=>create_uuid_x16_static( ). - lv_stream_name = 'code-example-kns-stream-' && lv_uuid_16. - TRANSLATE lv_stream_name TO LOWER CASE. - - ao_kns_scenario->getting_started_with_kns( - EXPORTING - iv_stream_name = lv_stream_name - iv_shard_count = cv_shard_count - iv_partition_key = cv_partition_key - iv_sharditeratortype = cv_sharditeratortype - iv_data = lv_data - IMPORTING - oo_result = lo_get_record_output ). - - lt_record_list = lo_get_record_output->get_records( ). - - "Validation. - LOOP AT lt_record_list INTO DATA(lo_record). - lv_record_data = lo_record->get_data( ). - ENDLOOP. - - IF lv_record_data = lv_data. - DATA(lv_found) = abap_true. - ENDIF. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Record not found| ). - - lv_found = abap_true. - IF ao_kns->liststreams( iv_exclusivestartstreamname = lv_stream_name )->has_streamnames( ) = 'X'. - lv_found = abap_false. - ENDIF. - - cl_abap_unit_assert=>assert_false( - act = lv_found - msg = |Stream not deleted| ). - ENDMETHOD. - -ENDCLASS. diff --git a/sap-abap/services/kinesis/zcl_aws1_kns_scenario.clas.xml b/sap-abap/services/kinesis/zcl_aws1_kns_scenario.clas.xml deleted file mode 100644 index 482ae6c592b..00000000000 --- a/sap-abap/services/kinesis/zcl_aws1_kns_scenario.clas.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - ZCL_AWS1_KNS_SCENARIO - E - Kinesis Code Example Scenario - 1 - X - X - X - X - - - - GETTING_STARTED_WITH_KNS - E - Getting started with Kinesis - - - - - diff --git a/sap-abap/services/kinesis/README.md b/sap-abap/services/kns/README.md similarity index 100% rename from sap-abap/services/kinesis/README.md rename to sap-abap/services/kns/README.md diff --git a/sap-abap/services/lambda/package.devc.xml b/sap-abap/services/lambda/package.devc.xml deleted file mode 100644 index e71a89f3fc1..00000000000 --- a/sap-abap/services/lambda/package.devc.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - Package for AWS Lambda - - - - diff --git a/sap-abap/services/lambda/zcl_aws1_lmd_actions.clas.abap b/sap-abap/services/lambda/zcl_aws1_lmd_actions.clas.abap deleted file mode 100644 index 00fc04ceefc..00000000000 --- a/sap-abap/services/lambda/zcl_aws1_lmd_actions.clas.abap +++ /dev/null @@ -1,274 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS zcl_aws1_lmd_actions DEFINITION - PUBLIC - FINAL - CREATE PUBLIC . - - PUBLIC SECTION. - PROTECTED SECTION. - PRIVATE SECTION. - - METHODS create_function - IMPORTING - !iv_function_name TYPE /aws1/lmdfunctionname - !iv_role_arn TYPE /aws1/lmdrolearn - !iv_handler TYPE /aws1/lmdhandler - !io_zip_file TYPE REF TO /aws1/cl_lmdfunctioncode . - METHODS get_function - IMPORTING - !iv_function_name TYPE /aws1/lmdnamespacedfuncname - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_lmdgetfuncresponse . - METHODS list_functions - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_lmdlistfuncsresponse . - METHODS invoke_function - IMPORTING - !iv_function_name TYPE /aws1/lmdnamespacedfuncname - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_lmdinvocationresponse . - METHODS update_function_code - IMPORTING - !iv_function_name TYPE /aws1/lmdfunctionname - !io_zip_file TYPE /aws1/lmdblob - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_lmdfunctionconf . - METHODS update_function_configuration - IMPORTING - !iv_function_name TYPE /aws1/lmdruntime - !iv_runtime TYPE /aws1/lmdhandler - !iv_memory_size TYPE /aws1/lmdmemorysize - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_lmdfunctionconf . - METHODS delete_function - IMPORTING - !iv_function_name TYPE /aws1/lmdfunctionname . -ENDCLASS. - - - -CLASS ZCL_AWS1_LMD_ACTIONS IMPLEMENTATION. - - - METHOD create_function. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_lmd) = /aws1/cl_lmd_factory=>create( lo_session ). - - " snippet-start:[lmd.abapv1.create_function] - TRY. - lo_lmd->createfunction( - iv_functionname = iv_function_name - iv_runtime = `python3.9` - iv_role = iv_role_arn - iv_handler = iv_handler - io_code = io_zip_file - iv_description = 'AWS Lambda code example' ). - MESSAGE 'Lambda function created.' TYPE 'I'. - CATCH /aws1/cx_lmdcodesigningcfgno00. - MESSAGE 'Code signing configuration does not exist.' TYPE 'E'. - CATCH /aws1/cx_lmdcodestorageexcdex. - MESSAGE 'Maximum total code size per account exceeded.' TYPE 'E'. - CATCH /aws1/cx_lmdcodeverification00. - MESSAGE 'Code signature failed one or more validation checks for signature mismatch or expiration.' TYPE 'E'. - CATCH /aws1/cx_lmdinvalidcodesigex. - MESSAGE 'Code signature failed the integrity check.' TYPE 'E'. - CATCH /aws1/cx_lmdinvparamvalueex. - MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. - CATCH /aws1/cx_lmdresourceconflictex. - MESSAGE 'Resource already exists or another operation is in progress.' TYPE 'E'. - CATCH /aws1/cx_lmdresourcenotfoundex. - MESSAGE 'The requested resource does not exist.' TYPE 'E'. - CATCH /aws1/cx_lmdserviceexception. - MESSAGE 'An internal problem was encountered by the AWS Lambda service.' TYPE 'E'. - CATCH /aws1/cx_lmdtoomanyrequestsex. - MESSAGE 'The maximum request throughput was reached.' TYPE 'E'. - ENDTRY. - " snippet-end:[lmd.abapv1.create_function] - ENDMETHOD. - - - METHOD delete_function. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_lmd) = /aws1/cl_lmd_factory=>create( lo_session ). - - " snippet-start:[lmd.abapv1.delete_function] - TRY. - lo_lmd->deletefunction( iv_functionname = iv_function_name ). - MESSAGE 'Lambda function deleted.' TYPE 'I'. - CATCH /aws1/cx_lmdinvparamvalueex. - MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. - CATCH /aws1/cx_lmdresourceconflictex. - MESSAGE 'Resource already exists or another operation is in progress.' TYPE 'E'. - CATCH /aws1/cx_lmdresourcenotfoundex. - MESSAGE 'The requested resource does not exist.' TYPE 'E'. - CATCH /aws1/cx_lmdserviceexception. - MESSAGE 'An internal problem was encountered by the AWS Lambda service.' TYPE 'E'. - CATCH /aws1/cx_lmdtoomanyrequestsex. - MESSAGE 'The maximum request throughput was reached.' TYPE 'E'. - ENDTRY. - " snippet-end:[lmd.abapv1.delete_function] - ENDMETHOD. - - - METHOD get_function. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_lmd) = /aws1/cl_lmd_factory=>create( lo_session ). - - " snippet-start:[lmd.abapv1.get_function] - TRY. - oo_result = lo_lmd->getfunction( iv_functionname = iv_function_name ). " oo_result is returned for testing purposes. " - MESSAGE 'Lambda function information retrieved.' TYPE 'I'. - CATCH /aws1/cx_lmdinvparamvalueex. - MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. - CATCH /aws1/cx_lmdserviceexception. - MESSAGE 'An internal problem was encountered by the AWS Lambda service.' TYPE 'E'. - CATCH /aws1/cx_lmdtoomanyrequestsex. - MESSAGE 'The maximum request throughput was reached.' TYPE 'E'. - ENDTRY. - " snippet-end:[lmd.abapv1.get_function] - ENDMETHOD. - - - METHOD invoke_function. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_lmd) = /aws1/cl_lmd_factory=>create( lo_session ). - - " snippet-start:[lmd.abapv1.invoke_function] - TRY. - DATA(lv_json) = /aws1/cl_rt_util=>string_to_xstring( - `{` && - `"action": "increment",` && - `"number": 10` && - `}` ). - oo_result = lo_lmd->invoke( " oo_result is returned for testing purposes. " - iv_functionname = iv_function_name - iv_payload = lv_json ). - MESSAGE 'Lambda function invoked.' TYPE 'I'. - CATCH /aws1/cx_lmdinvparamvalueex. - MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. - CATCH /aws1/cx_lmdinvrequestcontex. - MESSAGE 'Unable to parse request body as JSON.' TYPE 'E'. - CATCH /aws1/cx_lmdinvalidzipfileex. - MESSAGE 'The deployment package could not be unzipped.' TYPE 'E'. - CATCH /aws1/cx_lmdrequesttoolargeex. - MESSAGE 'Invoke request body JSON input limit was exceeded by the request payload.' TYPE 'E'. - CATCH /aws1/cx_lmdresourceconflictex. - MESSAGE 'Resource already exists or another operation is in progress.' TYPE 'E'. - CATCH /aws1/cx_lmdresourcenotfoundex. - MESSAGE 'The requested resource does not exist.' TYPE 'E'. - CATCH /aws1/cx_lmdserviceexception. - MESSAGE 'An internal problem was encountered by the AWS Lambda service.' TYPE 'E'. - CATCH /aws1/cx_lmdtoomanyrequestsex. - MESSAGE 'The maximum request throughput was reached.' TYPE 'E'. - CATCH /aws1/cx_lmdunsuppedmediatyp00. - MESSAGE 'Invoke request body does not have JSON as its content type.' TYPE 'E'. - ENDTRY. - " snippet-end:[lmd.abapv1.invoke_function] - ENDMETHOD. - - - METHOD list_functions. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_lmd) = /aws1/cl_lmd_factory=>create( lo_session ). - - " snippet-start:[lmd.abapv1.list_functions] - TRY. - oo_result = lo_lmd->listfunctions( ). " oo_result is returned for testing purposes. " - DATA(lt_functions) = oo_result->get_functions( ). - MESSAGE 'Retrieved list of Lambda functions.' TYPE 'I'. - CATCH /aws1/cx_lmdinvparamvalueex. - MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. - CATCH /aws1/cx_lmdserviceexception. - MESSAGE 'An internal problem was encountered by the AWS Lambda service.' TYPE 'E'. - CATCH /aws1/cx_lmdtoomanyrequestsex. - MESSAGE 'The maximum request throughput was reached.' TYPE 'E'. - ENDTRY. - " snippet-end:[lmd.abapv1.list_functions] - ENDMETHOD. - - - METHOD update_function_code. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_lmd) = /aws1/cl_lmd_factory=>create( lo_session ). - - " snippet-start:[lmd.abapv1.update_function_code] - TRY. - oo_result = lo_lmd->updatefunctioncode( " oo_result is returned for testing purposes. " - iv_functionname = iv_function_name - iv_zipfile = io_zip_file ). - - MESSAGE 'Lambda function code updated.' TYPE 'I'. - CATCH /aws1/cx_lmdcodesigningcfgno00. - MESSAGE 'Code signing configuration does not exist.' TYPE 'E'. - CATCH /aws1/cx_lmdcodestorageexcdex. - MESSAGE 'Maximum total code size per account exceeded.' TYPE 'E'. - CATCH /aws1/cx_lmdcodeverification00. - MESSAGE 'Code signature failed one or more validation checks for signature mismatch or expiration.' TYPE 'E'. - CATCH /aws1/cx_lmdinvalidcodesigex. - MESSAGE 'Code signature failed the integrity check.' TYPE 'E'. - CATCH /aws1/cx_lmdinvparamvalueex. - MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. - CATCH /aws1/cx_lmdresourceconflictex. - MESSAGE 'Resource already exists or another operation is in progress.' TYPE 'E'. - CATCH /aws1/cx_lmdresourcenotfoundex. - MESSAGE 'The requested resource does not exist.' TYPE 'E'. - CATCH /aws1/cx_lmdserviceexception. - MESSAGE 'An internal problem was encountered by the AWS Lambda service.' TYPE 'E'. - CATCH /aws1/cx_lmdtoomanyrequestsex. - MESSAGE 'The maximum request throughput was reached.' TYPE 'E'. - ENDTRY. - " snippet-end:[lmd.abapv1.update_function_code] - ENDMETHOD. - - - METHOD update_function_configuration. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_lmd) = /aws1/cl_lmd_factory=>create( lo_session ). - - " snippet-start:[lmd.abapv1.update_function_configuration] - TRY. - oo_result = lo_lmd->updatefunctionconfiguration( " oo_result is returned for testing purposes. " - iv_functionname = iv_function_name - iv_runtime = iv_runtime - iv_description = 'Updated Lambda function' - iv_memorysize = iv_memory_size ). - - MESSAGE 'Lambda function configuration/settings updated.' TYPE 'I'. - CATCH /aws1/cx_lmdcodesigningcfgno00. - MESSAGE 'Code signing configuration does not exist.' TYPE 'E'. - CATCH /aws1/cx_lmdcodeverification00. - MESSAGE 'Code signature failed one or more validation checks for signature mismatch or expiration.' TYPE 'E'. - CATCH /aws1/cx_lmdinvalidcodesigex. - MESSAGE 'Code signature failed the integrity check.' TYPE 'E'. - CATCH /aws1/cx_lmdinvparamvalueex. - MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. - CATCH /aws1/cx_lmdresourceconflictex. - MESSAGE 'Resource already exists or another operation is in progress.' TYPE 'E'. - CATCH /aws1/cx_lmdresourcenotfoundex. - MESSAGE 'The requested resource does not exist.' TYPE 'E'. - CATCH /aws1/cx_lmdserviceexception. - MESSAGE 'An internal problem was encountered by the AWS Lambda service.' TYPE 'E'. - CATCH /aws1/cx_lmdtoomanyrequestsex. - MESSAGE 'The maximum request throughput was reached.' TYPE 'E'. - ENDTRY. - " snippet-end:[lmd.abapv1.update_function_configuration] - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/lambda/zcl_aws1_lmd_actions.clas.testclasses.abap b/sap-abap/services/lambda/zcl_aws1_lmd_actions.clas.testclasses.abap deleted file mode 100644 index 7d0e3aa7b97..00000000000 --- a/sap-abap/services/lambda/zcl_aws1_lmd_actions.clas.testclasses.abap +++ /dev/null @@ -1,332 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS ltc_zcl_aws1_lmd_actions DEFINITION DEFERRED. -CLASS zcl_aws1_lmd_actions DEFINITION LOCAL FRIENDS ltc_zcl_aws1_lmd_actions. - -CLASS ltc_zcl_aws1_lmd_actions DEFINITION FOR TESTING DURATION SHORT RISK LEVEL DANGEROUS. - - PRIVATE SECTION. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA ao_lmd TYPE REF TO /aws1/if_lmd. - DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. - DATA ao_lmd_actions TYPE REF TO zcl_aws1_lmd_actions. - DATA av_lrole TYPE /aws1/lmdrolearn. - CONSTANTS cv_create_function_name TYPE /aws1/lmdfunctionname VALUE 'code-example-create-function'. - CONSTANTS cv_misc_function_name TYPE /aws1/lmdfunctionname VALUE 'code-example-misce-function'. - CONSTANTS cv_del_function_name TYPE /aws1/lmdfunctionname VALUE 'code-example-delete-function'. - - METHODS: create_function FOR TESTING RAISING /aws1/cx_rt_generic, - get_function FOR TESTING RAISING /aws1/cx_rt_generic, - list_functions FOR TESTING RAISING /aws1/cx_rt_generic, - invoke_function FOR TESTING RAISING /aws1/cx_rt_generic, - update_function_code FOR TESTING RAISING /aws1/cx_rt_generic, - update_function_configuration FOR TESTING RAISING /aws1/cx_rt_generic, - delete_function FOR TESTING RAISING /aws1/cx_rt_generic. - - METHODS setup RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic. - METHODS teardown RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic. - METHODS: - create_code - RETURNING VALUE(oo_code) TYPE REF TO /aws1/cl_lmdfunctioncode - RAISING /aws1/cx_rt_generic, - update_code - RETURNING VALUE(oo_code) TYPE /aws1/lmdblob - RAISING /aws1/cx_rt_generic, - create_lambda_function - IMPORTING iv_function_name TYPE /aws1/lmdfunctionname - RAISING /aws1/cx_rt_generic, - verify_lambda_state - IMPORTING iv_function_name TYPE /aws1/lmdfunctionname - RAISING /aws1/cx_rt_generic, - assert_lambda_result - IMPORTING - iv_payload TYPE /aws1/lmdblob - iv_exp TYPE i - RAISING /aws1/cx_rt_generic. - -ENDCLASS. - -CLASS ltc_zcl_aws1_lmd_actions IMPLEMENTATION. - - METHOD setup. - ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). - ao_lmd = /aws1/cl_lmd_factory=>create( ao_session ). - ao_lmd_actions = NEW zcl_aws1_lmd_actions( ). - - DATA(lt_roles) = ao_session->get_configuration( )->get_logical_iam_roles( ). - READ TABLE lt_roles INDEX 1 INTO DATA(lo_role). " use the first role we find in the profile, as our lambda role - av_lrole = lo_role-iam_role_arn. - - create_lambda_function( cv_misc_function_name ). - - ENDMETHOD. - METHOD teardown. - TRY. - ao_lmd->deletefunction( iv_functionname = cv_misc_function_name ). - CATCH /aws1/cx_lmdresourcenotfoundex. - ENDTRY. - TRY. - ao_lmd->deletefunction( iv_functionname = cv_create_function_name ). - CATCH /aws1/cx_lmdresourcenotfoundex. - ENDTRY. - TRY. - ao_lmd->deletefunction( iv_functionname = cv_create_function_name ). - CATCH /aws1/cx_lmdresourcenotfoundex. - ENDTRY. - ENDMETHOD. - - METHOD create_function. - ao_lmd_actions->create_function( - iv_function_name = cv_create_function_name - iv_role_arn = av_lrole - iv_handler = |lambda_function.lambda_handler| - io_zip_file = create_code( ) ). - DATA(lv_function_arn) = ao_lmd->getfunctionconfiguration( iv_functionname = cv_create_function_name )->get_functionarn( ). - cl_abap_unit_assert=>assert_not_initial( - act = lv_function_arn - msg = |Failed to create Lambda function { cv_create_function_name }| ). - ENDMETHOD. - METHOD create_code. - DATA(lo_zip) = NEW cl_abap_zip( ). - DATA(lv_code) = - |import logging\n| && - |import json\n| && - |\n| && - |logger = logging.getLogger()\n| && - |logger.setLevel(logging.INFO)\n| && - |\n| && - |def lambda_handler(event, context):\n| && - | # TODO implement\n| && - | action = event.get('action')\n| && - | if action == 'increment':\n| && - | result = event.get('number', 0) + 1\n| && - | logger.info('Calculated result of %s', result)\n| && - | else:\n| && - | logger.error("%s is not a valid action.", action)\n| && - | return \{\n| && - | 'statusCode': 200,\n| && - | 'body': json.dumps(result)\n| && - | \}\n|. - - DATA(lv_xcode) = /aws1/cl_rt_util=>string_to_xstring( lv_code ). - lo_zip->add( name = 'lambda_function.py' - content = lv_xcode ). - DATA(lv_xzip) = lo_zip->save( ). - oo_code = NEW /aws1/cl_lmdfunctioncode( iv_zipfile = lv_xzip ). - ENDMETHOD. - METHOD get_function. - DATA(lo_result) = ao_lmd_actions->get_function( cv_misc_function_name ). - - cl_abap_unit_assert=>assert_not_initial( - act = lo_result - msg = |Failed to retrieve information about Lambda function { cv_misc_function_name }| ). - - cl_abap_unit_assert=>assert_equals( - exp = cv_misc_function_name - act = lo_result->get_configuration( )->get_functionname( ) - msg = |Lambda function name did not match expected value { cv_misc_function_name }| ). - - cl_abap_unit_assert=>assert_equals( - exp = `lambda_function.lambda_handler` - act = lo_result->get_configuration( )->get_handler( ) - msg = |Handler did not match expected value| ). - - cl_abap_unit_assert=>assert_equals( - exp = av_lrole - act = lo_result->get_configuration( )->get_role( ) - msg = |Function's execution role did not match expected value { av_lrole }| ). - - cl_abap_unit_assert=>assert_equals( - exp = `python3.9` - act = lo_result->get_configuration( )->get_runtime( ) - msg = |Function's runtime did not match expected value | ). - - cl_abap_unit_assert=>assert_not_initial( - act = lo_result->get_code( )->get_location( ) - msg = |Failed to retrieve value of Lambda location/URL| ). - ENDMETHOD. - METHOD create_lambda_function. - ao_lmd->createfunction( - iv_functionname = iv_function_name - iv_runtime = `python3.9` - iv_role = av_lrole - iv_handler = `lambda_function.lambda_handler` - io_code = create_code( ) ). - ENDMETHOD. - METHOD list_functions. - DATA(lo_result) = ao_lmd_actions->list_functions( ). - - - cl_abap_unit_assert=>assert_number_between( - number = lines( lo_result->get_functions( ) ) - lower = 1 - upper = 1000000 - msg = |At least one function should have been found by ListFunctions| ). - ENDMETHOD. - METHOD invoke_function. - CONSTANTS cv_function_name TYPE /aws1/lmdfunctionname VALUE 'code-example-invoke-function'. - create_lambda_function( cv_function_name ). - verify_lambda_state( cv_function_name ). - - DATA(lo_result) = ao_lmd_actions->invoke_function( cv_function_name ). - - cl_abap_unit_assert=>assert_initial( - act = lo_result->get_functionerror( ) - msg = |Invoke function call failed with error { lo_result->get_functionerror( ) }| ). - - assert_lambda_result( - iv_payload = lo_result->ask_payload( ) - iv_exp = 11 ). - - ao_lmd->deletefunction( iv_functionname = cv_function_name ). - - ENDMETHOD. - METHOD verify_lambda_state. - WHILE ao_lmd->getfunction( iv_functionname = iv_function_name )->get_configuration( )->ask_state( ) <> 'Active'. - IF sy-index = 10. - EXIT. - ENDIF. - WAIT UP TO 1 SECONDS. - ENDWHILE. - ENDMETHOD. - METHOD assert_lambda_result. - DATA(lo_doc) = cl_ixml=>create( )->create_document( ). - CALL TRANSFORMATION id - SOURCE XML iv_payload - RESULT XML lo_doc. - - DATA(lo_iter) = lo_doc->get_first_child( )->get_children( )->create_iterator( ). - DATA(lo_node) = lo_iter->get_next( ). - - - WHILE lo_node IS NOT INITIAL. - DATA(lv_name) = lo_node->get_attributes( )->get_named_item_ns( name = 'name' )->get_value( ). - IF lv_name = 'body'. - DATA(lv_value) = lo_node->get_value( ). - ENDIF. - lo_node = lo_iter->get_next( ). - ENDWHILE. - - cl_abap_unit_assert=>assert_equals( - exp = iv_exp - act = lv_value - msg = |Invoke function response ({ lv_value }) was not as expected ({ iv_exp })| ). - ENDMETHOD. - - METHOD update_function_code. - - verify_lambda_state( cv_misc_function_name ). - - DATA(lo_update_result) = ao_lmd_actions->update_function_code( - iv_function_name = cv_misc_function_name - io_zip_file = update_code( ) ). - WAIT UP TO 10 SECONDS. - - cl_abap_unit_assert=>assert_not_initial( - act = lo_update_result - msg = |Failed to update Lambda function code| ). - - DATA(lv_json) = /aws1/cl_rt_util=>string_to_xstring( - `{` && - `"action": "decrement",` && - `"number": 10` && - `}` ). - - DATA(lo_invoke_result) = ao_lmd->invoke( - iv_functionname = cv_misc_function_name - iv_payload = lv_json ). - - cl_abap_unit_assert=>assert_initial( - act = lo_invoke_result->get_functionerror( ) - msg = |Invoke function call failed with error { lo_invoke_result->get_functionerror( ) }| ). - - assert_lambda_result( - iv_payload = lo_invoke_result->ask_payload( ) - iv_exp = 9 ). - ENDMETHOD. - METHOD update_code. - DATA(lo_zip) = NEW cl_abap_zip( ). - DATA(lv_code) = - |import logging\n| && - |import json\n| && - |\n| && - |logger = logging.getLogger()\n| && - |logger.setLevel(logging.INFO)\n| && - |\n| && - |def lambda_handler(event, context):\n| && - | # TODO implement\n| && - | action = event.get('action')\n| && - | if action == 'increment':\n| && - | result = event.get('number', 0) + 1\n| && - | logger.info('Calculated result of %s', result)\n| && - | elif action == 'decrement':\n| && - | result = event.get('number', 0) - 1\n| && - | logger.info('Calculated result of %s', result)\n| && - | else:\n| && - | logger.error("%s is not a valid action.", action)\n| && - | return \{\n| && - | 'statusCode': 200,\n| && - | 'body': json.dumps(result)\n| && - | \}\n|. - - - DATA(lv_xcode) = /aws1/cl_rt_util=>string_to_xstring( lv_code ). - lo_zip->add( name = 'lambda_function.py' - content = lv_xcode ). - oo_code = lo_zip->save( ). - ENDMETHOD. - METHOD update_function_configuration. - verify_lambda_state( cv_misc_function_name ). - - DATA(lo_result) = ao_lmd_actions->update_function_configuration( - iv_function_name = cv_misc_function_name - iv_runtime = `python3.9` - iv_memory_size = 150 ). - - cl_abap_unit_assert=>assert_not_initial( - act = lo_result - msg = |Failed to update Lambda function configuration| ). - - cl_abap_unit_assert=>assert_equals( - exp = `lambda_function.lambda_handler` - act = lo_result->get_handler( ) - msg = |Handler did not match expected value| ). - - cl_abap_unit_assert=>assert_equals( - exp = av_lrole - act = lo_result->get_role( ) - msg = |Function's execution role did not match expected value { av_lrole }| ). - - cl_abap_unit_assert=>assert_equals( - exp = `python3.9` - act = lo_result->get_runtime( ) - msg = |Function's runtime did not match expected value | ). - - cl_abap_unit_assert=>assert_equals( - exp = 'updated lambda function' - act = to_lower( lo_result->get_description( ) ) - msg = |Function's description did not match expected value | ). - - cl_abap_unit_assert=>assert_equals( - exp = 150 - act = lo_result->get_memorysize( ) - msg = |Function memory did not match expected value| ). - ENDMETHOD. - METHOD delete_function. - create_lambda_function( cv_del_function_name ). - ao_lmd_actions->delete_function( cv_del_function_name ). - - TRY. - ao_lmd->getfunction( iv_functionname = cv_del_function_name ). - " should not reach here - cl_abap_unit_assert=>assert_true( - act = abap_false - msg = |Function { cv_del_function_name } should have been deleted| ). - CATCH /aws1/cx_lmdresourcenotfoundex. - " expected this exception - ENDTRY. - - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/lambda/zcl_aws1_lmd_actions.clas.xml b/sap-abap/services/lambda/zcl_aws1_lmd_actions.clas.xml deleted file mode 100644 index a6972d01fcd..00000000000 --- a/sap-abap/services/lambda/zcl_aws1_lmd_actions.clas.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - ZCL_AWS1_LMD_ACTIONS - E - Lambda Code Example Actions - 1 - X - X - X - X - - - - CREATE_FUNCTION - E - Create a Lambda function. - - - DELETE_FUNCTION - E - Delete a Lambda function. - - - GET_FUNCTION - E - Get a Lambda function. - - - INVOKE_FUNCTION - E - Invoke a Lambda function. - - - LIST_FUNCTIONS - E - List lambda functions. - - - UPDATE_FUNCTION_CODE - E - Update Lambda function code. - - - UPDATE_FUNCTION_CONFIGURATION - E - Update Lambda function configuration. - - - - - diff --git a/sap-abap/services/lambda/zcl_aws1_lmd_scenario.clas.abap b/sap-abap/services/lambda/zcl_aws1_lmd_scenario.clas.abap deleted file mode 100644 index fd215bceca7..00000000000 --- a/sap-abap/services/lambda/zcl_aws1_lmd_scenario.clas.abap +++ /dev/null @@ -1,256 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS zcl_aws1_lmd_scenario DEFINITION - PUBLIC - FINAL - CREATE PUBLIC . - - PUBLIC SECTION. - PROTECTED SECTION. - PRIVATE SECTION. - - METHODS getting_started_with_functions - IMPORTING - !iv_role_name TYPE /aws1/iamrolenametype - !iv_function_name TYPE /aws1/lmdfunctionname - !iv_handler TYPE /aws1/lmdhandler - !io_initial_zip_file TYPE REF TO /aws1/cl_lmdfunctioncode - !io_updated_zip_file TYPE /aws1/lmdblob - EXPORTING - !ov_updated_invoke_payload TYPE /aws1/lmdblob - !ov_initial_invoke_payload TYPE /aws1/lmdblob . -ENDCLASS. - - - -CLASS ZCL_AWS1_LMD_SCENARIO IMPLEMENTATION. - - - METHOD getting_started_with_functions. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_iam) = /aws1/cl_iam_factory=>create( lo_session ). - DATA(lo_lmd) = /aws1/cl_lmd_factory=>create( lo_session ). - DATA lo_exception TYPE REF TO /aws1/cx_rt_service_generic. - - "snippet-start:[lmd.abapv1.getting_started_with_functions] - - TRY. - "Create an AWS Identity and Access Management (IAM) role that grants AWS Lambda permission to write to logs." - DATA(lv_policy_document) = `{` && - `"Version":"2012-10-17",` && - `"Statement": [` && - `{` && - `"Effect": "Allow",` && - `"Action": [` && - `"sts:AssumeRole"` && - `],` && - `"Principal": {` && - `"Service": [` && - `"lambda.amazonaws.com"` && - `]` && - `}` && - `}` && - `]` && - `}`. - TRY. - DATA(lo_create_role_output) = lo_iam->createrole( - iv_rolename = iv_role_name - iv_assumerolepolicydocument = lv_policy_document - iv_description = 'Grant lambda permission to write to logs' ). - DATA(lv_role_arn) = lo_create_role_output->get_role( )->get_arn( ). - MESSAGE 'IAM role created.' TYPE 'I'. - WAIT UP TO 10 SECONDS. " Make sure that the IAM role is ready for use. " - CATCH /aws1/cx_iamentityalrdyexex. - DATA(lo_role) = lo_iam->getrole( iv_rolename = iv_role_name ). - lv_role_arn = lo_role->get_role( )->get_arn( ). - CATCH /aws1/cx_iaminvalidinputex. - MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. - CATCH /aws1/cx_iammalformedplydocex. - MESSAGE 'Policy document in the request is malformed.' TYPE 'E'. - ENDTRY. - - TRY. - lo_iam->attachrolepolicy( - iv_rolename = iv_role_name - iv_policyarn = 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole' ). - MESSAGE 'Attached policy to the IAM role.' TYPE 'I'. - CATCH /aws1/cx_iaminvalidinputex. - MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. - CATCH /aws1/cx_iamnosuchentityex. - MESSAGE 'The requested resource entity does not exist.' TYPE 'E'. - CATCH /aws1/cx_iamplynotattachableex. - MESSAGE 'Service role policies can only be attached to the service-linked role for their service.' TYPE 'E'. - CATCH /aws1/cx_iamunmodableentityex. - MESSAGE 'Service that depends on the service-linked role is not modifiable.' TYPE 'E'. - ENDTRY. - - " Create a Lambda function and upload handler code. " - " Lambda function performs 'increment' action on a number. " - TRY. - lo_lmd->createfunction( - iv_functionname = iv_function_name - iv_runtime = `python3.9` - iv_role = lv_role_arn - iv_handler = iv_handler - io_code = io_initial_zip_file - iv_description = 'AWS Lambda code example' ). - MESSAGE 'Lambda function created.' TYPE 'I'. - CATCH /aws1/cx_lmdcodestorageexcdex. - MESSAGE 'Maximum total code size per account exceeded.' TYPE 'E'. - CATCH /aws1/cx_lmdinvparamvalueex. - MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. - CATCH /aws1/cx_lmdresourcenotfoundex. - MESSAGE 'The requested resource does not exist.' TYPE 'E'. - ENDTRY. - - " Verify the function is in Active state " - WHILE lo_lmd->getfunction( iv_functionname = iv_function_name )->get_configuration( )->ask_state( ) <> 'Active'. - IF sy-index = 10. - EXIT. " Maximum 10 seconds. " - ENDIF. - WAIT UP TO 1 SECONDS. - ENDWHILE. - - "Invoke the function with a single parameter and get results." - TRY. - DATA(lv_json) = /aws1/cl_rt_util=>string_to_xstring( - `{` && - `"action": "increment",` && - `"number": 10` && - `}` ). - DATA(lo_initial_invoke_output) = lo_lmd->invoke( - iv_functionname = iv_function_name - iv_payload = lv_json ). - ov_initial_invoke_payload = lo_initial_invoke_output->get_payload( ). " ov_initial_invoke_payload is returned for testing purposes. " - DATA(lo_writer_json) = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ). - CALL TRANSFORMATION id SOURCE XML ov_initial_invoke_payload RESULT XML lo_writer_json. - DATA(lv_result) = cl_abap_codepage=>convert_from( lo_writer_json->get_output( ) ). - MESSAGE 'Lambda function invoked.' TYPE 'I'. - CATCH /aws1/cx_lmdinvparamvalueex. - MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. - CATCH /aws1/cx_lmdinvrequestcontex. - MESSAGE 'Unable to parse request body as JSON.' TYPE 'E'. - CATCH /aws1/cx_lmdresourcenotfoundex. - MESSAGE 'The requested resource does not exist.' TYPE 'E'. - CATCH /aws1/cx_lmdunsuppedmediatyp00. - MESSAGE 'Invoke request body does not have JSON as its content type.' TYPE 'E'. - ENDTRY. - - " Update the function code and configure its Lambda environment with an environment variable. " - " Lambda function is updated to perform 'decrement' action also. " - TRY. - lo_lmd->updatefunctioncode( - iv_functionname = iv_function_name - iv_zipfile = io_updated_zip_file ). - WAIT UP TO 10 SECONDS. " Make sure that the update is completed. " - MESSAGE 'Lambda function code updated.' TYPE 'I'. - CATCH /aws1/cx_lmdcodestorageexcdex. - MESSAGE 'Maximum total code size per account exceeded.' TYPE 'E'. - CATCH /aws1/cx_lmdinvparamvalueex. - MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. - CATCH /aws1/cx_lmdresourcenotfoundex. - MESSAGE 'The requested resource does not exist.' TYPE 'E'. - ENDTRY. - - TRY. - DATA lt_variables TYPE /aws1/cl_lmdenvironmentvaria00=>tt_environmentvariables. - DATA ls_variable LIKE LINE OF lt_variables. - ls_variable-key = 'LOG_LEVEL'. - ls_variable-value = NEW /aws1/cl_lmdenvironmentvaria00( iv_value = 'info' ). - INSERT ls_variable INTO TABLE lt_variables. - - lo_lmd->updatefunctionconfiguration( - iv_functionname = iv_function_name - io_environment = NEW /aws1/cl_lmdenvironment( it_variables = lt_variables ) ). - WAIT UP TO 10 SECONDS. " Make sure that the update is completed. " - MESSAGE 'Lambda function configuration/settings updated.' TYPE 'I'. - CATCH /aws1/cx_lmdinvparamvalueex. - MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. - CATCH /aws1/cx_lmdresourceconflictex. - MESSAGE 'Resource already exists or another operation is in progress.' TYPE 'E'. - CATCH /aws1/cx_lmdresourcenotfoundex. - MESSAGE 'The requested resource does not exist.' TYPE 'E'. - ENDTRY. - - "Invoke the function with new parameters and get results. Display the execution log that's returned from the invocation." - TRY. - lv_json = /aws1/cl_rt_util=>string_to_xstring( - `{` && - `"action": "decrement",` && - `"number": 10` && - `}` ). - DATA(lo_updated_invoke_output) = lo_lmd->invoke( - iv_functionname = iv_function_name - iv_payload = lv_json ). - ov_updated_invoke_payload = lo_updated_invoke_output->get_payload( ). " ov_updated_invoke_payload is returned for testing purposes. " - lo_writer_json = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ). - CALL TRANSFORMATION id SOURCE XML ov_updated_invoke_payload RESULT XML lo_writer_json. - lv_result = cl_abap_codepage=>convert_from( lo_writer_json->get_output( ) ). - MESSAGE 'Lambda function invoked.' TYPE 'I'. - CATCH /aws1/cx_lmdinvparamvalueex. - MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. - CATCH /aws1/cx_lmdinvrequestcontex. - MESSAGE 'Unable to parse request body as JSON.' TYPE 'E'. - CATCH /aws1/cx_lmdresourcenotfoundex. - MESSAGE 'The requested resource does not exist.' TYPE 'E'. - CATCH /aws1/cx_lmdunsuppedmediatyp00. - MESSAGE 'Invoke request body does not have JSON as its content type.' TYPE 'E'. - ENDTRY. - - " List the functions for your account. " - TRY. - DATA(lo_list_output) = lo_lmd->listfunctions( ). - DATA(lt_functions) = lo_list_output->get_functions( ). - MESSAGE 'Retrieved list of Lambda functions.' TYPE 'I'. - CATCH /aws1/cx_lmdinvparamvalueex. - MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. - ENDTRY. - - " Delete the Lambda function. " - TRY. - lo_lmd->deletefunction( iv_functionname = iv_function_name ). - MESSAGE 'Lambda function deleted.' TYPE 'I'. - CATCH /aws1/cx_lmdinvparamvalueex. - MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. - CATCH /aws1/cx_lmdresourcenotfoundex. - MESSAGE 'The requested resource does not exist.' TYPE 'W'. - ENDTRY. - - " Detach role policy. " - TRY. - lo_iam->detachrolepolicy( - iv_rolename = iv_role_name - iv_policyarn = 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole' ). - MESSAGE 'Detached policy from the IAM role.' TYPE 'I'. - CATCH /aws1/cx_iaminvalidinputex. - MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. - CATCH /aws1/cx_iamnosuchentityex. - MESSAGE 'The requested resource entity does not exist.' TYPE 'W'. - CATCH /aws1/cx_iamplynotattachableex. - MESSAGE 'Service role policies can only be attached to the service-linked role for their service.' TYPE 'E'. - CATCH /aws1/cx_iamunmodableentityex. - MESSAGE 'Service that depends on the service-linked role is not modifiable.' TYPE 'E'. - ENDTRY. - - " Delete the IAM role. " - TRY. - lo_iam->deleterole( iv_rolename = iv_role_name ). - MESSAGE 'IAM role deleted.' TYPE 'I'. - CATCH /aws1/cx_iamnosuchentityex. - MESSAGE 'The requested resource entity does not exist.' TYPE 'W'. - CATCH /aws1/cx_iamunmodableentityex. - MESSAGE 'Service that depends on the service-linked role is not modifiable.' TYPE 'E'. - ENDTRY. - - CATCH /aws1/cx_rt_service_generic INTO lo_exception. - DATA(lv_error) = lo_exception->get_longtext( ). - MESSAGE lv_error TYPE 'E'. - ENDTRY. - "snippet-end:[lmd.abapv1.getting_started_with_functions] - - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/lambda/zcl_aws1_lmd_scenario.clas.testclasses.abap b/sap-abap/services/lambda/zcl_aws1_lmd_scenario.clas.testclasses.abap deleted file mode 100644 index 48737bcc2c7..00000000000 --- a/sap-abap/services/lambda/zcl_aws1_lmd_scenario.clas.testclasses.abap +++ /dev/null @@ -1,165 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS ltc_zcl_aws1_lmd_scenario DEFINITION DEFERRED. -CLASS zcl_aws1_lmd_scenario DEFINITION LOCAL FRIENDS ltc_zcl_aws1_lmd_scenario. - -CLASS ltc_zcl_aws1_lmd_scenario DEFINITION FOR TESTING DURATION SHORT RISK LEVEL DANGEROUS. - - PRIVATE SECTION. - CONSTANTS: cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO', - cv_function_name TYPE /aws1/lmdfunctionname VALUE 'code-example-function-scenario'. - - DATA ao_lmd TYPE REF TO /aws1/if_lmd. - DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. - DATA ao_lmd_scenario TYPE REF TO zcl_aws1_lmd_scenario. - - METHODS getting_started_scenario FOR TESTING RAISING /aws1/cx_rt_generic. - - METHODS: setup RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic, - teardown RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic, - create_code - RETURNING VALUE(oo_code) TYPE REF TO /aws1/cl_lmdfunctioncode - RAISING /aws1/cx_rt_generic, - update_code - RETURNING VALUE(oo_code) TYPE /aws1/lmdblob - RAISING /aws1/cx_rt_generic, - assert_lambda_result - IMPORTING - iv_payload TYPE /aws1/lmdblob - iv_exp TYPE i - RAISING /aws1/cx_rt_generic. - -ENDCLASS. - -CLASS ltc_zcl_aws1_lmd_scenario IMPLEMENTATION. - - METHOD setup. - ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). - ao_lmd = /aws1/cl_lmd_factory=>create( ao_session ). - ao_lmd_scenario = NEW zcl_aws1_lmd_scenario( ). - - ENDMETHOD. - METHOD teardown. - TRY. - ao_lmd->deletefunction( iv_functionname = cv_function_name ). - CATCH cx_root. - ENDTRY. - ENDMETHOD. - - METHOD getting_started_scenario. - DATA lv_initial_invoke_payload TYPE /aws1/lmdblob. - DATA lv_updated_invoke_payload TYPE /aws1/lmdblob. - ao_lmd_scenario->getting_started_with_functions( - EXPORTING - iv_role_name = 'code-example-lambda-role-write-logs' - iv_function_name = cv_function_name - iv_handler = |lambda_function.lambda_handler| - io_initial_zip_file = create_code( ) - io_updated_zip_file = update_code( ) - IMPORTING - ov_initial_invoke_payload = lv_initial_invoke_payload - ov_updated_invoke_payload = lv_updated_invoke_payload ). - assert_lambda_result( - iv_payload = lv_initial_invoke_payload - iv_exp = 11 ). - - assert_lambda_result( - iv_payload = lv_updated_invoke_payload - iv_exp = 9 ). - - - LOOP AT ao_lmd->listfunctions( )->get_functions( ) INTO DATA(lo_function). - IF lo_function->get_functionname( ) = cv_function_name. - DATA(lv_found) = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_false( - act = lv_found - msg = |Function { cv_function_name } should have been deleted| ). - - ENDMETHOD. - METHOD create_code. - DATA(lo_zip) = NEW cl_abap_zip( ). - DATA(lv_code) = - |import logging\n| && - |import json\n| && - |\n| && - |logger = logging.getLogger()\n| && - |logger.setLevel(logging.INFO)\n| && - |\n| && - |def lambda_handler(event, context):\n| && - | # TODO implement\n| && - | action = event.get('action')\n| && - | if action == 'increment':\n| && - | result = event.get('number', 0) + 1\n| && - | logger.info('Calculated result of %s', result)\n| && - | else:\n| && - | logger.error("%s is not a valid action.", action)\n| && - | return \{\n| && - | 'statusCode': 200,\n| && - | 'body': json.dumps(result)\n| && - | \}\n|. - - DATA(lv_xcode) = /aws1/cl_rt_util=>string_to_xstring( lv_code ). - lo_zip->add( name = 'lambda_function.py' - content = lv_xcode ). - DATA(lv_xzip) = lo_zip->save( ). - oo_code = NEW /aws1/cl_lmdfunctioncode( iv_zipfile = lv_xzip ). - ENDMETHOD. - METHOD update_code. - DATA(lo_zip) = NEW cl_abap_zip( ). - DATA(lv_code) = - |import logging\n| && - |import json\n| && - |\n| && - |logger = logging.getLogger()\n| && - |logger.setLevel(logging.INFO)\n| && - |\n| && - |def lambda_handler(event, context):\n| && - | # TODO implement\n| && - | action = event.get('action')\n| && - | if action == 'increment':\n| && - | result = event.get('number', 0) + 1\n| && - | logger.info('Calculated result of %s', result)\n| && - | elif action == 'decrement':\n| && - | result = event.get('number', 0) - 1\n| && - | logger.info('Calculated result of %s', result)\n| && - | else:\n| && - | logger.error("%s is not a valid action.", action)\n| && - | return \{\n| && - | 'statusCode': 200,\n| && - | 'body': json.dumps(result)\n| && - | \}\n|. - - - DATA(lv_xcode) = /aws1/cl_rt_util=>string_to_xstring( lv_code ). - lo_zip->add( name = 'lambda_function.py' - content = lv_xcode ). - oo_code = lo_zip->save( ). - ENDMETHOD. - METHOD assert_lambda_result. - DATA(lo_doc) = cl_ixml=>create( )->create_document( ). - CALL TRANSFORMATION id - SOURCE XML iv_payload - RESULT XML lo_doc. - - DATA(lo_iter) = lo_doc->get_first_child( )->get_children( )->create_iterator( ). - DATA(lo_node) = lo_iter->get_next( ). - - - WHILE lo_node IS NOT INITIAL. - DATA(lv_name) = lo_node->get_attributes( )->get_named_item_ns( name = 'name' )->get_value( ). - IF lv_name = 'body'. - DATA(lv_value) = lo_node->get_value( ). - ENDIF. - lo_node = lo_iter->get_next( ). - ENDWHILE. - - cl_abap_unit_assert=>assert_equals( - exp = iv_exp - act = lv_value - msg = |Invoke function response ({ lv_value }) was not as expected ({ iv_exp })| ). - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/lambda/zcl_aws1_lmd_scenario.clas.xml b/sap-abap/services/lambda/zcl_aws1_lmd_scenario.clas.xml deleted file mode 100644 index 660634f8dc6..00000000000 --- a/sap-abap/services/lambda/zcl_aws1_lmd_scenario.clas.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - ZCL_AWS1_LMD_SCENARIO - E - Lambda Code Example Scenarios - 1 - X - X - X - X - - - - GETTING_STARTED_WITH_FUNCTIONS - E - Get started with creating and invoking Lambda functions. - - - - - diff --git a/sap-abap/services/lambda/README.md b/sap-abap/services/lmd/README.md similarity index 100% rename from sap-abap/services/lambda/README.md rename to sap-abap/services/lmd/README.md diff --git a/sap-abap/services/s3/zcl_aws1_s3_actions.clas.abap b/sap-abap/services/s3/zcl_aws1_s3_actions.clas.abap deleted file mode 100644 index f8f0e196399..00000000000 --- a/sap-abap/services/s3/zcl_aws1_s3_actions.clas.abap +++ /dev/null @@ -1,237 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 -CLASS zcl_aws1_s3_actions DEFINITION - PUBLIC - FINAL - CREATE PUBLIC . - - PUBLIC SECTION. - - METHODS create_bucket - IMPORTING - !iv_bucket_name TYPE /aws1/s3_bucketname . - METHODS put_object - IMPORTING - !iv_bucket_name TYPE /aws1/s3_bucketname - !iv_file_name TYPE /aws1/s3_objectkey . - METHODS get_object - IMPORTING - !iv_bucket_name TYPE /aws1/s3_bucketname - !iv_object_key TYPE /aws1/s3_objectkey - EXPORTING - !oo_result TYPE REF TO /aws1/cl_s3_getobjectoutput . - METHODS copy_object - IMPORTING - !iv_dest_bucket TYPE /aws1/s3_bucketname - !iv_dest_object TYPE /aws1/s3_objectkey - !iv_src_bucket TYPE /aws1/s3_bucketname - !iv_src_object TYPE /aws1/s3_objectkey . - METHODS list_objects - IMPORTING - !iv_bucket_name TYPE /aws1/s3_bucketname - EXPORTING - !oo_result TYPE REF TO /aws1/cl_s3_listobjectsoutput . - METHODS delete_object - IMPORTING - !iv_bucket_name TYPE /aws1/s3_bucketname - !iv_object_key TYPE /aws1/s3_objectkey . - METHODS delete_bucket - IMPORTING - !iv_bucket_name TYPE /aws1/s3_bucketname . - METHODS list_objects_v2 - IMPORTING - !iv_bucket_name TYPE /aws1/s3_bucketname - EXPORTING - !oo_result TYPE REF TO /aws1/cl_s3_listobjsv2output . - PROTECTED SECTION. - PRIVATE SECTION. -ENDCLASS. - - - -CLASS ZCL_AWS1_S3_ACTIONS IMPLEMENTATION. - - - METHOD copy_object. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ). - - "snippet-start:[s3.abapv1.copy_object] - TRY. - lo_s3->copyobject( - iv_bucket = iv_dest_bucket - iv_key = iv_dest_object - iv_copysource = |{ iv_src_bucket }/{ iv_src_object }| ). - MESSAGE 'Object copied to another bucket.' TYPE 'I'. - CATCH /aws1/cx_s3_nosuchbucket. - MESSAGE 'Bucket does not exist.' TYPE 'E'. - CATCH /aws1/cx_s3_nosuchkey. - MESSAGE 'Object key does not exist.' TYPE 'E'. - ENDTRY. - "snippet-end:[s3.abapv1.copy_object] - ENDMETHOD. - - - METHOD create_bucket. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ). - - " snippet-start:[s3.abapv1.create_bucket] - TRY. - " determine our region from our session - DATA(lv_region) = CONV /aws1/s3_bucketlocationcnstrnt( lo_session->get_region( ) ). - DATA lo_constraint TYPE REF TO /aws1/cl_s3_createbucketconf. - " When in the us-east-1 region, you must not specify a constraint - " In all other regions, specify the region as the constraint - IF lv_region = 'us-east-1'. - CLEAR lo_constraint. - ELSE. - lo_constraint = NEW /aws1/cl_s3_createbucketconf( lv_region ). - ENDIF. - - lo_s3->createbucket( - iv_bucket = iv_bucket_name - io_createbucketconfiguration = lo_constraint ). - MESSAGE 'S3 bucket created.' TYPE 'I'. - CATCH /aws1/cx_s3_bucketalrdyexists. - MESSAGE 'Bucket name already exists.' TYPE 'E'. - CATCH /aws1/cx_s3_bktalrdyownedbyyou. - MESSAGE 'Bucket already exists and is owned by you.' TYPE 'E'. - ENDTRY. - " snippet-end:[s3.abapv1.create_bucket] - ENDMETHOD. - - - METHOD delete_bucket. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ). - - "snippet-start:[s3.abapv1.delete_bucket] - TRY. - - lo_s3->deletebucket( - iv_bucket = iv_bucket_name ). - MESSAGE 'Deleted S3 bucket.' TYPE 'I'. - CATCH /aws1/cx_s3_nosuchbucket. - MESSAGE 'Bucket does not exist.' TYPE 'E'. - ENDTRY. - "snippet-end:[s3.abapv1.delete_bucket] - - ENDMETHOD. - - - METHOD delete_object. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ). - - "snippet-start:[s3.abapv1.delete_object] - TRY. - lo_s3->deleteobject( - iv_bucket = iv_bucket_name - iv_key = iv_object_key ). - MESSAGE 'Object deleted from S3 bucket.' TYPE 'I'. - CATCH /aws1/cx_s3_nosuchbucket. - MESSAGE 'Bucket does not exist.' TYPE 'E'. - ENDTRY. - "snippet-end:[s3.abapv1.delete_object] - ENDMETHOD. - - - METHOD get_object. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ). - - "snippet-start:[s3.abapv1.get_object] - TRY. - oo_result = lo_s3->getobject( " oo_result is returned for testing purposes. " - iv_bucket = iv_bucket_name - iv_key = iv_object_key ). - DATA(lv_object_data) = oo_result->get_body( ). - MESSAGE 'Object retrieved from S3 bucket.' TYPE 'I'. - CATCH /aws1/cx_s3_nosuchbucket. - MESSAGE 'Bucket does not exist.' TYPE 'E'. - CATCH /aws1/cx_s3_nosuchkey. - MESSAGE 'Object key does not exist.' TYPE 'E'. - ENDTRY. - "snippet-end:[s3.abapv1.get_object] - - ENDMETHOD. - - - METHOD list_objects. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ). - - "snippet-start:[s3.abapv1.list_objects] - TRY. - oo_result = lo_s3->listobjects( " oo_result is returned for testing purposes. " - iv_bucket = iv_bucket_name ). - MESSAGE 'Retrieved list of objects in S3 bucket.' TYPE 'I'. - CATCH /aws1/cx_s3_nosuchbucket. - MESSAGE 'Bucket does not exist.' TYPE 'E'. - ENDTRY. - "snippet-end:[s3.abapv1.list_objects] - ENDMETHOD. - - - METHOD list_objects_v2. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ). - - "snippet-start:[s3.abapv1.list_objects_v2] - TRY. - oo_result = lo_s3->listobjectsv2( " oo_result is returned for testing purposes. " - iv_bucket = iv_bucket_name ). - MESSAGE 'Retrieved list of objects in S3 bucket.' TYPE 'I'. - CATCH /aws1/cx_s3_nosuchbucket. - MESSAGE 'Bucket does not exist.' TYPE 'E'. - ENDTRY. - "snippet-end:[s3.abapv1.list_objects_v2] - ENDMETHOD. - - - METHOD put_object. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ). - - "snippet-start:[s3.abapv1.put_object] - - "Get contents of file from application server." - DATA lv_body TYPE xstring. - OPEN DATASET iv_file_name FOR INPUT IN BINARY MODE. - READ DATASET iv_file_name INTO lv_body. - CLOSE DATASET iv_file_name. - - "Upload/put an object to an S3 bucket." - TRY. - lo_s3->putobject( - iv_bucket = iv_bucket_name - iv_key = iv_file_name - iv_body = lv_body ). - MESSAGE 'Object uploaded to S3 bucket.' TYPE 'I'. - CATCH /aws1/cx_s3_nosuchbucket. - MESSAGE 'Bucket does not exist.' TYPE 'E'. - ENDTRY. - - "snippet-end:[s3.abapv1.put_object] - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/s3/zcl_aws1_s3_actions.clas.testclasses.abap b/sap-abap/services/s3/zcl_aws1_s3_actions.clas.testclasses.abap deleted file mode 100644 index e261db6b48a..00000000000 --- a/sap-abap/services/s3/zcl_aws1_s3_actions.clas.testclasses.abap +++ /dev/null @@ -1,319 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS ltc_zcl_aws1_s3_actions DEFINITION DEFERRED. -CLASS zcl_aws1_s3_actions DEFINITION LOCAL FRIENDS ltc_zcl_aws1_s3_actions. - -CLASS ltc_zcl_aws1_s3_actions DEFINITION FOR TESTING DURATION SHORT RISK LEVEL DANGEROUS. - - PRIVATE SECTION. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - - CLASS-DATA av_bucket TYPE /aws1/s3_bucketname. - CLASS-DATA av_bucket_create TYPE /aws1/s3_bucketname. - CLASS-DATA av_bucket_delete TYPE /aws1/s3_bucketname. - CLASS-DATA av_src_bucket TYPE /aws1/s3_bucketname. - CLASS-DATA av_dest_bucket TYPE /aws1/s3_bucketname. - - CLASS-DATA ao_s3 TYPE REF TO /aws1/if_s3. - CLASS-DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. - CLASS-DATA ao_s3_actions TYPE REF TO zcl_aws1_s3_actions. - - METHODS: create_bucket FOR TESTING RAISING /aws1/cx_rt_generic, - put_object FOR TESTING RAISING /aws1/cx_rt_generic, - get_object FOR TESTING RAISING /aws1/cx_rt_generic, - copy_object FOR TESTING RAISING /aws1/cx_rt_generic, - list_objects FOR TESTING RAISING /aws1/cx_rt_generic, - list_objects_v2 FOR TESTING RAISING /aws1/cx_rt_generic, - delete_object FOR TESTING RAISING /aws1/cx_rt_generic, - delete_bucket FOR TESTING RAISING /aws1/cx_rt_generic. - - CLASS-METHODS class_setup RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic. - CLASS-METHODS class_teardown RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic. - - METHODS assert_bucket_exists - IMPORTING - iv_bucket TYPE /aws1/s3_bucketname - iv_exp TYPE abap_bool - iv_msg TYPE string - RAISING /aws1/cx_rt_generic. - METHODS create_file IMPORTING iv_file TYPE /aws1/s3_objectkey. - METHODS get_file_data - IMPORTING - iv_file TYPE /aws1/s3_objectkey - RETURNING - VALUE(ov_file_data) TYPE /aws1/s3_streamingblob. - METHODS delete_file IMPORTING iv_file TYPE /aws1/s3_objectkey. - METHODS put_file_in_bucket - IMPORTING - iv_bucket TYPE /aws1/s3_bucketname - iv_file TYPE /aws1/s3_objectkey. -ENDCLASS. - -CLASS ltc_zcl_aws1_s3_actions IMPLEMENTATION. - - METHOD class_setup. - ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). - ao_s3 = /aws1/cl_s3_factory=>create( ao_session ). - ao_s3_actions = NEW zcl_aws1_s3_actions( ). - - DATA(lv_acct) = ao_session->get_account_id( ). - av_bucket = |sap-abap-s3-demo-bucket-{ lv_acct }|. - av_src_bucket = |sap-abap-s3-demo-copy-object-src-bucket-{ lv_acct }|. - av_dest_bucket = |sap-abap-s3-demo-copy-object-dst-bucket-{ lv_acct }|. - av_bucket_delete = |sap-abap-s3-demo-bucket-delete-{ lv_acct }|. - av_bucket_create = |sap-abap-s3-demo-bucket-create-{ lv_acct }|. - ao_s3_actions->create_bucket( av_bucket ). - ao_s3_actions->create_bucket( av_src_bucket ). - ao_s3_actions->create_bucket( av_dest_bucket ). - ao_s3_actions->create_bucket( av_bucket_delete ). - - - ENDMETHOD. - METHOD class_teardown. - zcl_aws1_ex_utils=>cleanup_bucket( io_s3 = ao_s3 - iv_bucket = av_bucket ). - zcl_aws1_ex_utils=>cleanup_bucket( io_s3 = ao_s3 - iv_bucket = av_bucket_create ). - zcl_aws1_ex_utils=>cleanup_bucket( io_s3 = ao_s3 - iv_bucket = av_bucket_delete ). - zcl_aws1_ex_utils=>cleanup_bucket( io_s3 = ao_s3 - iv_bucket = av_src_bucket ). - zcl_aws1_ex_utils=>cleanup_bucket( io_s3 = ao_s3 - iv_bucket = av_dest_bucket ). - ENDMETHOD. - - METHOD create_bucket. - ao_s3_actions->create_bucket( av_bucket_create ). - - assert_bucket_exists( - iv_bucket = av_bucket - iv_exp = abap_true - iv_msg = |Bucket { av_bucket_create } was not created| ). - - ENDMETHOD. - METHOD put_object. - CONSTANTS cv_file TYPE /aws1/s3_objectkey VALUE 'put_object_ex_file'. - create_file( cv_file ). - - ao_s3_actions->put_object( - iv_bucket_name = av_bucket - iv_file_name = cv_file ). - - cl_abap_unit_assert=>assert_equals( - exp = get_file_data( iv_file = cv_file ) - act = ao_s3->getobject( iv_bucket = av_bucket iv_key = cv_file )->get_body( ) - msg = |Object { cv_file } did not match expected value| ). - - ao_s3->deleteobject( iv_bucket = av_bucket - iv_key = cv_file ). - delete_file( cv_file ). - - ENDMETHOD. - METHOD create_file. - DATA lv_param TYPE btcxpgpar. - lv_param = |if=/dev/random of={ iv_file } bs=1M count=1 iflag=fullblock|. - CALL FUNCTION 'SXPG_COMMAND_EXECUTE' - EXPORTING - commandname = 'DB24DD' - additional_parameters = lv_param - operatingsystem = 'ANYOS' - EXCEPTIONS - OTHERS = 15. - /aws1/cl_rt_assert_abap=>assert_subrc( iv_exp = 0 - iv_msg = |Could not create { iv_file }| ). - ENDMETHOD. - METHOD get_file_data. - "Get file content. - OPEN DATASET iv_file FOR INPUT IN BINARY MODE. - READ DATASET iv_file INTO ov_file_data. - CLOSE DATASET iv_file. - ENDMETHOD. - METHOD delete_file. - DELETE DATASET iv_file. - cl_abap_unit_assert=>assert_equals( - exp = sy-subrc - act = 0 - msg = |Could not delete { iv_file }| ). - ENDMETHOD. - METHOD get_object. - CONSTANTS cv_file TYPE /aws1/s3_objectkey VALUE 'get_object_ex_file'. - DATA lo_result TYPE REF TO /aws1/cl_s3_getobjectoutput. - create_file( cv_file ). - - put_file_in_bucket( iv_bucket = av_bucket - iv_file = cv_file ). - - - ao_s3_actions->get_object( - EXPORTING - iv_bucket_name = av_bucket - iv_object_key = cv_file - IMPORTING - oo_result = lo_result ). - - cl_abap_unit_assert=>assert_equals( - exp = get_file_data( iv_file = cv_file ) - act = lo_result->get_body( ) - msg = |Object { cv_file } did not match expected value| ). - - ao_s3->deleteobject( iv_bucket = av_bucket - iv_key = cv_file ). - delete_file( cv_file ). - - ENDMETHOD. - METHOD put_file_in_bucket. - ao_s3->putobject( - iv_bucket = iv_bucket - iv_key = iv_file - iv_body = get_file_data( iv_file = iv_file ) ). - ENDMETHOD. - METHOD copy_object. - CONSTANTS cv_src_file TYPE /aws1/s3_objectkey VALUE 'copy_object_ex_file'. - CONSTANTS cv_dest_file TYPE /aws1/s3_objectkey VALUE 'copied_object_ex_file'. - - - create_file( cv_src_file ). - put_file_in_bucket( iv_bucket = av_src_bucket - iv_file = cv_src_file ). - - ao_s3_actions->copy_object( - iv_dest_bucket = av_dest_bucket - iv_dest_object = cv_dest_file - iv_src_bucket = av_src_bucket - iv_src_object = cv_src_file ). - - cl_abap_unit_assert=>assert_equals( - exp = get_file_data( iv_file = cv_src_file ) - act = ao_s3->getobject( iv_bucket = av_dest_bucket iv_key = cv_dest_file )->get_body( ) - msg = |Object { cv_dest_file } did not match expected value| ). - - ao_s3->deleteobject( iv_bucket = av_src_bucket - iv_key = cv_src_file ). - ao_s3->deletebucket( iv_bucket = av_src_bucket ). - delete_file( cv_src_file ). - - ao_s3->deleteobject( iv_bucket = av_dest_bucket - iv_key = cv_dest_file ). - ao_s3->deletebucket( iv_bucket = av_dest_bucket ). - delete_file( cv_dest_file ). - - ENDMETHOD. - METHOD list_objects. - CONSTANTS cv_file TYPE /aws1/s3_objectkey VALUE 'list_objects_ex_file1'. - create_file( cv_file ). - - put_file_in_bucket( iv_bucket = av_bucket - iv_file = cv_file ). - - DATA lo_list TYPE REF TO /aws1/cl_s3_listobjectsoutput. - ao_s3_actions->list_objects( - EXPORTING - iv_bucket_name = av_bucket - IMPORTING - oo_result = lo_list ). - - - LOOP AT lo_list->get_contents( ) INTO DATA(lo_object). - IF lo_object->get_key( ) = cv_file. - DATA(lv_found) = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Could not find object { cv_file } in the list| ). - - ao_s3->deleteobject( iv_bucket = av_bucket - iv_key = cv_file ). - delete_file( cv_file ). - - ENDMETHOD. - - METHOD list_objects_v2. - CONSTANTS cv_file TYPE /aws1/s3_objectkey VALUE 'list_objects_ex_file1'. - create_file( cv_file ). - - put_file_in_bucket( iv_bucket = av_bucket - iv_file = cv_file ). - - DATA lo_list TYPE REF TO /aws1/cl_s3_listobjsv2output. - ao_s3_actions->list_objects_v2( - EXPORTING - iv_bucket_name = av_bucket - IMPORTING - oo_result = lo_list ). - - - LOOP AT lo_list->get_contents( ) INTO DATA(lo_object). - IF lo_object->get_key( ) = cv_file. - DATA(lv_found) = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Could not find object { cv_file } in the list| ). - - ao_s3->deleteobject( iv_bucket = av_bucket - iv_key = cv_file ). - delete_file( cv_file ). - - ENDMETHOD. - METHOD delete_object. - CONSTANTS cv_file1 TYPE /aws1/s3_objectkey VALUE 'delete_object_ex_file1'. - CONSTANTS cv_file2 TYPE /aws1/s3_objectkey VALUE 'delete_object_ex_file2'. - create_file( cv_file1 ). - create_file( cv_file2 ). - - put_file_in_bucket( iv_bucket = av_bucket - iv_file = cv_file1 ). - put_file_in_bucket( iv_bucket = av_bucket - iv_file = cv_file2 ). - - ao_s3_actions->delete_object( iv_bucket_name = av_bucket - iv_object_key = cv_file1 ). - ao_s3_actions->delete_object( iv_bucket_name = av_bucket - iv_object_key = cv_file2 ). - - DATA(lo_list) = ao_s3->listobjects( iv_bucket = av_bucket ). - cl_abap_unit_assert=>assert_equals( - exp = lines( lo_list->get_contents( ) ) - act = 0 - msg = |Could not delete all objects in bucket { av_bucket }| ). - - delete_file( cv_file1 ). - delete_file( cv_file2 ). - - ENDMETHOD. - METHOD delete_bucket. - ao_s3_actions->delete_bucket( av_bucket_delete ). - assert_bucket_exists( - iv_exp = abap_false - iv_bucket = av_bucket_delete - iv_msg = |Bucket { av_bucket_delete } should have been deleted| ). - - - ENDMETHOD. - METHOD assert_bucket_exists. - DATA(lv_found) = abap_true. - TRY. - ao_s3->headbucket( iv_bucket = av_bucket_delete ). - CATCH /aws1/cx_s3_nosuchbucket INTO DATA(lo_ex). - lv_found = abap_false. - CATCH /aws1/cx_s3_clientexc INTO DATA(lo_ex2). - IF lo_ex2->av_http_code = 404. - lv_found = abap_false. - ELSE. - RAISE EXCEPTION lo_ex2. - ENDIF. - ENDTRY. - cl_abap_unit_assert=>assert_equals( - act = lv_found - exp = iv_exp - msg = iv_msg ). - - ENDMETHOD. - -ENDCLASS. diff --git a/sap-abap/services/s3/zcl_aws1_s3_actions.clas.xml b/sap-abap/services/s3/zcl_aws1_s3_actions.clas.xml deleted file mode 100644 index b47d1d40545..00000000000 --- a/sap-abap/services/s3/zcl_aws1_s3_actions.clas.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - ZCL_AWS1_S3_ACTIONS - E - Amazon S3 Code Example Actions - 1 - X - X - X - X - - - - COPY_OBJECT - E - Copy an object from one bucket to another. - - - CREATE_BUCKET - E - Create an S3 bucket. - - - DELETE_BUCKET - E - Delete the bucket. - - - DELETE_OBJECT - E - Delete an object from a bucket. - - - GET_OBJECT - E - Get an object from a bucket. - - - LIST_OBJECTS - E - List objects in the bucket. - - - LIST_OBJECTS_V2 - E - List objects in the bucket with V2 method. - - - PUT_OBJECT - E - Upload an object to a S3 bucket. - - - - - diff --git a/sap-abap/services/s3/zcl_aws1_s3_scenario.clas.abap b/sap-abap/services/s3/zcl_aws1_s3_scenario.clas.abap deleted file mode 100644 index ad25f3835e7..00000000000 --- a/sap-abap/services/s3/zcl_aws1_s3_scenario.clas.abap +++ /dev/null @@ -1,195 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS zcl_aws1_s3_scenario DEFINITION - PUBLIC - FINAL - CREATE PUBLIC . - - PUBLIC SECTION. - - METHODS getting_started_with_s3 - IMPORTING - !iv_bucket_name TYPE /aws1/s3_bucketname - !iv_key TYPE /aws1/s3_objectkey - !iv_copy_to_folder TYPE /aws1/s3_bucketname - RAISING - /aws1/cx_rt_service_generic - /aws1/cx_rt_technical_generic - /aws1/cx_rt_no_auth_generic . - METHODS presigner_get - IMPORTING - !iv_bucket_name TYPE /aws1/s3_bucketname - !iv_key TYPE /aws1/s3_objectkey - RETURNING - VALUE(ov_url) TYPE string - RAISING - /aws1/cx_rt_service_generic - /aws1/cx_rt_technical_generic - /aws1/cx_rt_no_auth_generic . - PROTECTED SECTION. - PRIVATE SECTION. -ENDCLASS. - - - -CLASS ZCL_AWS1_S3_SCENARIO IMPLEMENTATION. - - - METHOD getting_started_with_s3. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - "snippet-start:[s3.abapv1.getting_started_with_s3] - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ). - - " Create an Amazon Simple Storage Service (Amazon S3) bucket. " - TRY. - " determine our region from our session - DATA(lv_region) = CONV /aws1/s3_bucketlocationcnstrnt( lo_session->get_region( ) ). - DATA lo_constraint TYPE REF TO /aws1/cl_s3_createbucketconf. - " When in the us-east-1 region, you must not specify a constraint - " In all other regions, specify the region as the constraint - IF lv_region = 'us-east-1'. - CLEAR lo_constraint. - ELSE. - lo_constraint = NEW /aws1/cl_s3_createbucketconf( lv_region ). - ENDIF. - - lo_s3->createbucket( - iv_bucket = iv_bucket_name - io_createbucketconfiguration = lo_constraint ). - MESSAGE 'S3 bucket created.' TYPE 'I'. - CATCH /aws1/cx_s3_bucketalrdyexists. - MESSAGE 'Bucket name already exists.' TYPE 'E'. - CATCH /aws1/cx_s3_bktalrdyownedbyyou. - MESSAGE 'Bucket already exists and is owned by you.' TYPE 'E'. - ENDTRY. - - - "Upload an object to an S3 bucket." - TRY. - "Get contents of file from application server." - DATA lv_file_content TYPE xstring. - OPEN DATASET iv_key FOR INPUT IN BINARY MODE. - READ DATASET iv_key INTO lv_file_content. - CLOSE DATASET iv_key. - - lo_s3->putobject( - iv_bucket = iv_bucket_name - iv_key = iv_key - iv_body = lv_file_content ). - MESSAGE 'Object uploaded to S3 bucket.' TYPE 'I'. - CATCH /aws1/cx_s3_nosuchbucket. - MESSAGE 'Bucket does not exist.' TYPE 'E'. - ENDTRY. - - " Get an object from a bucket. " - TRY. - DATA(lo_result) = lo_s3->getobject( - iv_bucket = iv_bucket_name - iv_key = iv_key ). - DATA(lv_object_data) = lo_result->get_body( ). - MESSAGE 'Object retrieved from S3 bucket.' TYPE 'I'. - CATCH /aws1/cx_s3_nosuchbucket. - MESSAGE 'Bucket does not exist.' TYPE 'E'. - CATCH /aws1/cx_s3_nosuchkey. - MESSAGE 'Object key does not exist.' TYPE 'E'. - ENDTRY. - - " Copy an object to a subfolder in a bucket. " - TRY. - lo_s3->copyobject( - iv_bucket = iv_bucket_name - iv_key = |{ iv_copy_to_folder }/{ iv_key }| - iv_copysource = |{ iv_bucket_name }/{ iv_key }| ). - MESSAGE 'Object copied to a subfolder.' TYPE 'I'. - CATCH /aws1/cx_s3_nosuchbucket. - MESSAGE 'Bucket does not exist.' TYPE 'E'. - CATCH /aws1/cx_s3_nosuchkey. - MESSAGE 'Object key does not exist.' TYPE 'E'. - ENDTRY. - - " List objects in the bucket. " - TRY. - DATA(lo_list) = lo_s3->listobjects( - iv_bucket = iv_bucket_name ). - MESSAGE 'Retrieved list of objects in S3 bucket.' TYPE 'I'. - CATCH /aws1/cx_s3_nosuchbucket. - MESSAGE 'Bucket does not exist.' TYPE 'E'. - ENDTRY. - DATA text TYPE string VALUE 'Object List - '. - DATA lv_object_key TYPE /aws1/s3_objectkey. - LOOP AT lo_list->get_contents( ) INTO DATA(lo_object). - lv_object_key = lo_object->get_key( ). - CONCATENATE lv_object_key ', ' INTO text. - ENDLOOP. - MESSAGE text TYPE'I'. - - " Delete the objects in a bucket. " - TRY. - lo_s3->deleteobject( - iv_bucket = iv_bucket_name - iv_key = iv_key ). - lo_s3->deleteobject( - iv_bucket = iv_bucket_name - iv_key = |{ iv_copy_to_folder }/{ iv_key }| ). - MESSAGE 'Objects deleted from S3 bucket.' TYPE 'I'. - CATCH /aws1/cx_s3_nosuchbucket. - MESSAGE 'Bucket does not exist.' TYPE 'E'. - ENDTRY. - - - " Delete the bucket. " - TRY. - lo_s3->deletebucket( - iv_bucket = iv_bucket_name ). - MESSAGE 'Deleted S3 bucket.' TYPE 'I'. - CATCH /aws1/cx_s3_nosuchbucket. - MESSAGE 'Bucket does not exist.' TYPE 'E'. - ENDTRY. - "snippet-end:[s3.abapv1.getting_started_with_s3] - - ENDMETHOD. - - - METHOD presigner_get. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - "snippet-start:[s3.abapv1.s3_presigned_url_get] - " iv_bucket_name is the bucket name - " iv_key is the object name like "myfile.txt" - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ). - - "Upload a nice Hello World file to an S3 bucket." - TRY. - DATA(lv_contents) = cl_abap_codepage=>convert_to( 'Hello, World' ). - lo_s3->putobject( - iv_bucket = iv_bucket_name - iv_key = iv_key - iv_body = lv_contents - iv_contenttype = 'text/plain' ). - MESSAGE 'Object uploaded to S3 bucket.' TYPE 'I'. - CATCH /aws1/cx_s3_nosuchbucket. - MESSAGE 'Bucket does not exist.' TYPE 'E'. - ENDTRY. - - " now generate a presigned URL with a 600-second expiration - DATA(lo_presigner) = lo_s3->get_presigner( iv_expires_sec = 600 ). - " the presigner getobject() method has the same signature as - " lo_s3->getobject(), but it doesn't actually make the call. - " to the service. It just prepares a presigned URL for a future call - DATA(lo_presigned_req) = lo_presigner->getobject( - iv_bucket = iv_bucket_name - iv_key = iv_key ). - - " You can provide this URL to a web page, user, email etc so they - " can retrieve the file. The URL will expire in 10 minutes. - ov_url = lo_presigned_req->get_url( ). - "snippet-end:[s3.abapv1.s3_presigned_url_get] - - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/s3/zcl_aws1_s3_scenario.clas.testclasses.abap b/sap-abap/services/s3/zcl_aws1_s3_scenario.clas.testclasses.abap deleted file mode 100644 index 5ffd5c8e5f8..00000000000 --- a/sap-abap/services/s3/zcl_aws1_s3_scenario.clas.testclasses.abap +++ /dev/null @@ -1,113 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS ltc_zcl_aws1_s3_scenario DEFINITION DEFERRED. -CLASS zcl_aws1_s3_scenario DEFINITION LOCAL FRIENDS ltc_zcl_aws1_s3_scenario. - -CLASS ltc_zcl_aws1_s3_scenario DEFINITION FOR TESTING DURATION SHORT RISK LEVEL DANGEROUS. - - PRIVATE SECTION. - CONSTANTS: cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO', - cv_file TYPE /aws1/s3_objectkey VALUE 's3_scenario_ex_file', - cv_copy_to_folder TYPE /aws1/s3_bucketname VALUE 'code-example-scenario-folder'. - - DATA av_bucket TYPE /aws1/s3_bucketname. - - DATA ao_s3 TYPE REF TO /aws1/if_s3. - DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. - DATA ao_s3_scenario TYPE REF TO zcl_aws1_s3_scenario. - - METHODS getting_started_scenario FOR TESTING RAISING /aws1/cx_rt_generic. - METHODS presigner_get_scenario FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. - METHODS setup RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic. - METHODS teardown RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic. - -ENDCLASS. - -CLASS ltc_zcl_aws1_s3_scenario IMPLEMENTATION. - - METHOD setup. - DATA lv_param TYPE btcxpgpar. - ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). - DATA(lv_acct) = ao_session->get_account_id( ). - av_bucket = |sap-abap-s3-scenario-bucket-{ lv_acct }|. - - ao_s3 = /aws1/cl_s3_factory=>create( ao_session ). - ao_s3_scenario = NEW zcl_aws1_s3_scenario( ). - - - lv_param = |if=/dev/random of={ cv_file } bs=1M count=1 iflag=fullblock|. - CALL FUNCTION 'SXPG_COMMAND_EXECUTE' - EXPORTING - commandname = 'DB24DD' - additional_parameters = lv_param - operatingsystem = 'ANYOS' - EXCEPTIONS - OTHERS = 15. - /aws1/cl_rt_assert_abap=>assert_subrc( iv_exp = 0 - iv_msg = |Could not create { cv_file }| ). - - ENDMETHOD. - - METHOD teardown. - zcl_aws1_ex_utils=>cleanup_bucket( io_s3 = ao_s3 - iv_bucket = av_bucket ). - - ENDMETHOD. - - - - METHOD getting_started_scenario. - ao_s3_scenario->getting_started_with_s3( - iv_bucket_name = av_bucket - iv_key = cv_file - iv_copy_to_folder = cv_copy_to_folder ). - - - LOOP AT ao_s3->listbuckets( )->get_buckets( ) INTO DATA(lo_bucket). - IF lo_bucket->get_name( ) = av_bucket. - DATA(lv_found) = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_equals( - exp = abap_false - act = lv_found - msg = |Bucket { av_bucket } should have been deleted| ). - ENDMETHOD. - - METHOD presigner_get_scenario. - " we don't show the customer the bucket creation in this scenario. - " So we'll create a separate bucket just for this scenario - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ). - - DATA(lv_region) = CONV /aws1/s3_bucketlocationcnstrnt( lo_session->get_region( ) ). - DATA lo_constraint TYPE REF TO /aws1/cl_s3_createbucketconf. - IF lv_region = 'us-east-1'. - CLEAR lo_constraint. - ELSE. - lo_constraint = NEW /aws1/cl_s3_createbucketconf( lv_region ). - ENDIF. - - DATA(lv_uuid) = cl_system_uuid=>if_system_uuid_static~create_uuid_c32( ). - TRANSLATE lv_uuid TO LOWER CASE. - DATA(lv_bucket_name) = |sap-abap-s3-scenario-presigner-{ lv_uuid }|. - - lo_s3->createbucket( - iv_bucket = lv_bucket_name - io_createbucketconfiguration = lo_constraint ). - - - DATA(lv_url) = ao_s3_scenario->presigner_get( - iv_bucket_name = lv_bucket_name - iv_key = cv_file ). - ASSERT lv_url IS NOT INITIAL. - - " cleanup - lo_s3->deleteobject( iv_bucket = lv_bucket_name iv_key = cv_file ). - lo_s3->deletebucket( iv_bucket = lv_bucket_name ). - - ENDMETHOD. - -ENDCLASS. diff --git a/sap-abap/services/s3/zcl_aws1_s3_scenario.clas.xml b/sap-abap/services/s3/zcl_aws1_s3_scenario.clas.xml deleted file mode 100644 index 6bae44f2d78..00000000000 --- a/sap-abap/services/s3/zcl_aws1_s3_scenario.clas.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - ZCL_AWS1_S3_SCENARIO - E - Amazon S3 Code Example Scenarios - 1 - X - X - X - X - - - - GETTING_STARTED_WITH_S3 - E - Getting started with Amazon S3 buckets and objects. - - - PRESIGNER_GET - E - Getting started with Amazon S3 buckets and objects. - - - - - GETTING_STARTED_WITH_S3 - /AWS1/CX_RT_NO_AUTH_GENERIC - E - Generic lack of authorization - - - GETTING_STARTED_WITH_S3 - /AWS1/CX_RT_SERVICE_GENERIC - E - Generic Service call error - - - GETTING_STARTED_WITH_S3 - /AWS1/CX_RT_TECHNICAL_GENERIC - E - Technical errors - - - PRESIGNER_GET - /AWS1/CX_RT_NO_AUTH_GENERIC - E - Generic lack of authorization - - - PRESIGNER_GET - /AWS1/CX_RT_SERVICE_GENERIC - E - Generic Service call error - - - PRESIGNER_GET - /AWS1/CX_RT_TECHNICAL_GENERIC - E - Technical errors - - - PRESIGNER_GET - IV_KEY - E - Object Key - - - - - diff --git a/sap-abap/services/sagemaker/package.devc.xml b/sap-abap/services/sagemaker/package.devc.xml deleted file mode 100644 index 8b29a8e1f19..00000000000 --- a/sap-abap/services/sagemaker/package.devc.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - Package for Amazon Sagemaker - - - - diff --git a/sap-abap/services/sagemaker/zcl_aws1_sgm_actions.clas.abap b/sap-abap/services/sagemaker/zcl_aws1_sgm_actions.clas.abap deleted file mode 100644 index 487ca4a0c37..00000000000 --- a/sap-abap/services/sagemaker/zcl_aws1_sgm_actions.clas.abap +++ /dev/null @@ -1,503 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS zcl_aws1_sgm_actions DEFINITION - PUBLIC - FINAL - CREATE PUBLIC . - - PUBLIC SECTION. - - METHODS create_endpoint - IMPORTING - !iv_model_name TYPE /aws1/sgmmodelname - !iv_endpoint_name TYPE /aws1/sgmendpointname - !iv_endpoint_config_name TYPE /aws1/sgmendpointconfigname - !iv_instance_type TYPE /aws1/sgminstancetype - !iv_initial_instance_count TYPE /aws1/sgminitialtaskcount - !iv_variant_name TYPE /aws1/sgmvariantname - EXPORTING - !oo_result TYPE REF TO /aws1/cl_sgmcreateendptoutput . - METHODS create_model - IMPORTING - !iv_model_name TYPE /aws1/sgmmodelname - !iv_execution_role_arn TYPE /aws1/sgmrolearn - !iv_model_data_url TYPE /aws1/sgmurl - !iv_container_image TYPE /aws1/sgmcontainermode - EXPORTING - !oo_result TYPE REF TO /aws1/cl_sgmcreatemodeloutput . - METHODS create_training_job - IMPORTING - !iv_training_job_name TYPE /aws1/sgmtrainingjobname - !iv_role_arn TYPE /aws1/sgmrolearn - !iv_trn_data_s3datatype TYPE /aws1/sgms3datatype - !iv_trn_data_s3datadistribution TYPE /aws1/sgms3datadistribution - !iv_trn_data_s3uri TYPE /aws1/sgms3uri - !iv_trn_data_compressiontype TYPE /aws1/sgmcompressiontype - !iv_trn_data_contenttype TYPE /aws1/sgmcontenttype - !iv_val_data_s3datatype TYPE /aws1/sgms3datatype - !iv_val_data_s3datadistribution TYPE /aws1/sgms3datadistribution - !iv_val_data_s3uri TYPE /aws1/sgms3uri - !iv_val_data_compressiontype TYPE /aws1/sgmcompressiontype - !iv_val_data_contenttype TYPE /aws1/sgmcontenttype - !iv_hp_max_depth TYPE /aws1/sgmhyperparametervalue - !iv_hp_scale_pos_weight TYPE /aws1/sgmhyperparametervalue - !iv_hp_num_round TYPE /aws1/sgmhyperparametervalue - !iv_hp_objective TYPE /aws1/sgmhyperparametervalue - !iv_hp_subsample TYPE /aws1/sgmhyperparametervalue - !iv_hp_eval_metric TYPE /aws1/sgmhyperparametervalue - !iv_hp_eta TYPE /aws1/sgmhyperparametervalue - !iv_training_image TYPE /aws1/sgmalgorithmimage - !iv_training_input_mode TYPE /aws1/sgmtraininginputmode - !iv_instance_count TYPE /aws1/sgmtraininginstancecount - !iv_instance_type TYPE /aws1/sgmtraininginstancetype - !iv_volume_sizeingb TYPE /aws1/sgmvolumesizeingb - !iv_s3_output_path TYPE /aws1/sgms3uri - !iv_max_runtime_in_seconds TYPE /aws1/sgmmaxruntimeinseconds - EXPORTING - !oo_result TYPE REF TO /aws1/cl_sgmcreatetrnjobrsp . - METHODS create_transform_job - IMPORTING - !iv_tf_job_name TYPE /aws1/sgmtransformjobname - !iv_tf_data_s3datatype TYPE /aws1/sgms3datatype - !iv_tf_data_s3uri TYPE /aws1/sgms3uri - !iv_tf_data_compressiontype TYPE /aws1/sgmcompressiontype - !iv_tf_data_contenttype TYPE /aws1/sgmcontenttype - !iv_instance_count TYPE /aws1/sgmtraininginstancecount - !iv_instance_type TYPE /aws1/sgmtraininginstancetype - !iv_s3_output_path TYPE /aws1/sgms3uri - !iv_tf_model_name TYPE /aws1/sgmmodelname - EXPORTING - !oo_result TYPE REF TO /aws1/cl_sgmcretransformjobrsp . - METHODS delete_endpoint - IMPORTING - !iv_endpoint_name TYPE /aws1/sgmendpointname - !iv_endpoint_config_name TYPE /aws1/sgmendpointconfigname . - METHODS delete_model - IMPORTING - !iv_model_name TYPE /aws1/sgmmodelname . - METHODS describe_training_job - IMPORTING - !iv_training_job_name TYPE /aws1/sgmtrainingjobname - EXPORTING - !oo_result TYPE REF TO /aws1/cl_sgmdescrtrnjobrsp . - METHODS list_algorithms - IMPORTING - !iv_name_contains TYPE /aws1/sgmnamecontains - EXPORTING - !oo_result TYPE REF TO /aws1/cl_sgmlistalgsoutput . - METHODS list_models - IMPORTING - !iv_name_contains TYPE /aws1/sgmmodelnamecontains - EXPORTING - !oo_result TYPE REF TO /aws1/cl_sgmlistmodelsoutput . - METHODS list_notebook_instances - IMPORTING - !iv_name_contains TYPE /aws1/sgmnotebookinstnamecon00 - EXPORTING - !oo_result TYPE REF TO /aws1/cl_sgmlstnotebookinsts01 . - METHODS list_training_jobs - IMPORTING - !iv_name_contains TYPE /aws1/sgmtrainingjobname - !iv_max_results TYPE /aws1/sgmmaxresults - EXPORTING - !oo_result TYPE REF TO /aws1/cl_sgmlisttrnjobsrsp . - PROTECTED SECTION. - PRIVATE SECTION. -ENDCLASS. - - - -CLASS ZCL_AWS1_SGM_ACTIONS IMPLEMENTATION. - - - METHOD create_endpoint. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sgm) = /aws1/cl_sgm_factory=>create( lo_session ). - - "snippet-start:[sgm.abapv1.create_endpoint] - - DATA lt_production_variants TYPE /aws1/cl_sgmproductionvariant=>tt_productionvariantlist. - DATA lo_production_variants TYPE REF TO /aws1/cl_sgmproductionvariant. - DATA oo_ep_config_result TYPE REF TO /aws1/cl_sgmcreateendptcfgout. - - "Create a production variant as an ABAP object." - "Identifies a model that you want to host and the resources chosen to deploy for hosting it." - lo_production_variants = NEW #( iv_variantname = iv_variant_name - iv_modelname = iv_model_name - iv_initialinstancecount = iv_initial_instance_count - iv_instancetype = iv_instance_type ). - - INSERT lo_production_variants INTO TABLE lt_production_variants. - - "Create an endpoint configuration." - TRY. - oo_ep_config_result = lo_sgm->createendpointconfig( - iv_endpointconfigname = iv_endpoint_config_name - it_productionvariants = lt_production_variants ). - MESSAGE 'Endpoint configuration created.' TYPE 'I'. - CATCH /aws1/cx_sgmresourcelimitexcd. - MESSAGE 'You have reached the limit on the number of resources.' TYPE 'E'. - ENDTRY. - - "Create an endpoint." - TRY. - oo_result = lo_sgm->createendpoint( " oo_result is returned for testing purposes. " - iv_endpointconfigname = iv_endpoint_config_name - iv_endpointname = iv_endpoint_name ). - MESSAGE 'Endpoint created.' TYPE 'I'. - CATCH /aws1/cx_sgmresourcelimitexcd. - MESSAGE 'You have reached the limit on the number of resources.' TYPE 'E'. - ENDTRY. - - "snippet-end:[sgm.abapv1.create_endpoint] - - ENDMETHOD. - - - METHOD create_model. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sgm) = /aws1/cl_sgm_factory=>create( lo_session ). - - "snippet-start:[sgm.abapv1.create_model] - - DATA lo_primarycontainer TYPE REF TO /aws1/cl_sgmcontainerdefn. - - "Create an ABAP object for the container image based on input variables." - lo_primarycontainer = NEW #( iv_image = iv_container_image - iv_modeldataurl = iv_model_data_url ). - - "Create an Amazon SageMaker model." - TRY. - oo_result = lo_sgm->createmodel( " oo_result is returned for testing purposes. " - iv_executionrolearn = iv_execution_role_arn - iv_modelname = iv_model_name - io_primarycontainer = lo_primarycontainer ). - MESSAGE 'Model created.' TYPE 'I'. - CATCH /aws1/cx_sgmresourcelimitexcd. - MESSAGE 'You have reached the limit on the number of resources.' TYPE 'E'. - ENDTRY. - "snippet-end:[sgm.abapv1.create_model] - ENDMETHOD. - - - METHOD create_training_job. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sgm) = /aws1/cl_sgm_factory=>create( lo_session ). - - "snippet-start:[sgm.abapv1.create_training_job] - - DATA lo_hyperparameters_w TYPE REF TO /aws1/cl_sgmhyperparameters_w. - DATA lt_hyperparameters TYPE /aws1/cl_sgmhyperparameters_w=>tt_hyperparameters. - DATA lt_input_data_config TYPE /aws1/cl_sgmchannel=>tt_inputdataconfig. - DATA lo_trn_channel TYPE REF TO /aws1/cl_sgmchannel. - DATA lo_trn_datasource TYPE REF TO /aws1/cl_sgmdatasource. - DATA lo_trn_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. - DATA lo_val_channel TYPE REF TO /aws1/cl_sgmchannel. - DATA lo_val_datasource TYPE REF TO /aws1/cl_sgmdatasource. - DATA lo_val_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. - DATA lo_algorithm_specification TYPE REF TO /aws1/cl_sgmalgorithmspec. - DATA lo_resource_config TYPE REF TO /aws1/cl_sgmresourceconfig. - DATA lo_output_data_config TYPE REF TO /aws1/cl_sgmoutputdataconfig. - DATA lo_stopping_condition TYPE REF TO /aws1/cl_sgmstoppingcondition. - - "Create ABAP internal table for hyperparameters based on input variables." - "These hyperparameters are based on the Amazon SageMaker built-in algorithm, XGBoost." - lo_hyperparameters_w = NEW #( iv_value = iv_hp_max_depth ). - INSERT VALUE #( key = 'max_depth' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = iv_hp_eta ). - INSERT VALUE #( key = 'eta' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = iv_hp_eval_metric ). - INSERT VALUE #( key = 'eval_metric' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = iv_hp_scale_pos_weight ). - INSERT VALUE #( key = 'scale_pos_weight' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = iv_hp_subsample ). - INSERT VALUE #( key = 'subsample' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = iv_hp_objective ). - INSERT VALUE #( key = 'objective' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = iv_hp_num_round ). - INSERT VALUE #( key = 'num_round' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - "Create ABAP objects for training data sources." - lo_trn_s3datasource = NEW #( iv_s3datatype = iv_trn_data_s3datatype - iv_s3datadistributiontype = iv_trn_data_s3datadistribution - iv_s3uri = iv_trn_data_s3uri ). - - lo_trn_datasource = NEW #( io_s3datasource = lo_trn_s3datasource ). - - lo_trn_channel = NEW #( iv_channelname = 'train' - io_datasource = lo_trn_datasource - iv_compressiontype = iv_trn_data_compressiontype - iv_contenttype = iv_trn_data_contenttype ). - - INSERT lo_trn_channel INTO TABLE lt_input_data_config. - - "Create ABAP objects for validation data sources." - lo_val_s3datasource = NEW #( iv_s3datatype = iv_val_data_s3datatype - iv_s3datadistributiontype = iv_val_data_s3datadistribution - iv_s3uri = iv_val_data_s3uri ). - - lo_val_datasource = NEW #( io_s3datasource = lo_val_s3datasource ). - - lo_val_channel = NEW #( iv_channelname = 'validation' - io_datasource = lo_val_datasource - iv_compressiontype = iv_val_data_compressiontype - iv_contenttype = iv_val_data_contenttype ). - - INSERT lo_val_channel INTO TABLE lt_input_data_config. - - "Create an ABAP object for algorithm specification." - lo_algorithm_specification = NEW #( iv_trainingimage = iv_training_image - iv_traininginputmode = iv_training_input_mode ). - - "Create an ABAP object for resource configuration." - lo_resource_config = NEW #( iv_instancecount = iv_instance_count - iv_instancetype = iv_instance_type - iv_volumesizeingb = iv_volume_sizeingb ). - - "Create an ABAP object for output data configuration." - lo_output_data_config = NEW #( iv_s3outputpath = iv_s3_output_path ). - - "Create an ABAP object for stopping condition." - lo_stopping_condition = NEW #( iv_maxruntimeinseconds = iv_max_runtime_in_seconds ). - - "Create a training job." - TRY. - oo_result = lo_sgm->createtrainingjob( " oo_result is returned for testing purposes. " - iv_trainingjobname = iv_training_job_name - iv_rolearn = iv_role_arn - it_hyperparameters = lt_hyperparameters - it_inputdataconfig = lt_input_data_config - io_algorithmspecification = lo_algorithm_specification - io_outputdataconfig = lo_output_data_config - io_resourceconfig = lo_resource_config - io_stoppingcondition = lo_stopping_condition ). - MESSAGE 'Training job created.' TYPE 'I'. - CATCH /aws1/cx_sgmresourceinuse. - MESSAGE 'Resource being accessed is in use.' TYPE 'E'. - CATCH /aws1/cx_sgmresourcenotfound. - MESSAGE 'Resource being accessed is not found.' TYPE 'E'. - CATCH /aws1/cx_sgmresourcelimitexcd. - MESSAGE 'You have reached the limit on the number of resources.' TYPE 'E'. - ENDTRY. - "snippet-end:[sgm.abapv1.create_training_job] - - ENDMETHOD. - - - METHOD create_transform_job. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sgm) = /aws1/cl_sgm_factory=>create( lo_session ). - - "snippet-start:[sgm.abapv1.create_transform_job] - - DATA lo_transforminput TYPE REF TO /aws1/cl_sgmtransforminput. - DATA lo_transformoutput TYPE REF TO /aws1/cl_sgmtransformoutput. - DATA lo_transformresources TYPE REF TO /aws1/cl_sgmtransformresources. - DATA lo_datasource TYPE REF TO /aws1/cl_sgmtransformdatasrc. - DATA lo_s3datasource TYPE REF TO /aws1/cl_sgmtransforms3datasrc. - - "Create an ABAP object for an Amazon Simple Storage Service (Amazon S3) data source." - lo_s3datasource = NEW #( iv_s3uri = iv_tf_data_s3uri - iv_s3datatype = iv_tf_data_s3datatype ). - - "Create an ABAP object for data source." - lo_datasource = NEW #( io_s3datasource = lo_s3datasource ). - - "Create an ABAP object for transform data source." - lo_transforminput = NEW #( io_datasource = lo_datasource - iv_contenttype = iv_tf_data_contenttype - iv_compressiontype = iv_tf_data_compressiontype ). - - "Create an ABAP object for resource configuration." - lo_transformresources = NEW #( iv_instancecount = iv_instance_count - iv_instancetype = iv_instance_type ). - - "Create an ABAP object for output data configuration." - lo_transformoutput = NEW #( iv_s3outputpath = iv_s3_output_path ). - - "Create a transform job." - TRY. - oo_result = lo_sgm->createtransformjob( " oo_result is returned for testing purposes. " - iv_modelname = iv_tf_model_name - iv_transformjobname = iv_tf_job_name - io_transforminput = lo_transforminput - io_transformoutput = lo_transformoutput - io_transformresources = lo_transformresources ). - MESSAGE 'Transform job created.' TYPE 'I'. - CATCH /aws1/cx_sgmresourceinuse. - MESSAGE 'Resource being accessed is in use.' TYPE 'E'. - CATCH /aws1/cx_sgmresourcenotfound. - MESSAGE 'Resource being accessed is not found.' TYPE 'E'. - CATCH /aws1/cx_sgmresourcelimitexcd. - MESSAGE 'You have reached the limit on the number of resources.' TYPE 'E'. - ENDTRY. - "snippet-end:[sgm.abapv1.create_transform_job] - - ENDMETHOD. - - - METHOD delete_endpoint. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sgm) = /aws1/cl_sgm_factory=>create( lo_session ). - - "snippet-start:[sgm.abapv1.delete_endpoint] - "Delete an endpoint." - TRY. - lo_sgm->deleteendpoint( - iv_endpointname = iv_endpoint_name ). - MESSAGE 'Endpoint configuration deleted.' TYPE 'I'. - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_endpoint_exception). - DATA(lv_endpoint_error) = |"{ lo_endpoint_exception->av_err_code }" - { lo_endpoint_exception->av_err_msg }|. - MESSAGE lv_endpoint_error TYPE 'E'. - ENDTRY. - - "Delete an endpoint configuration." - TRY. - lo_sgm->deleteendpointconfig( - iv_endpointconfigname = iv_endpoint_config_name ). - MESSAGE 'Endpoint deleted.' TYPE 'I'. - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_endpointconfig_exception). - DATA(lv_endpointconfig_error) = |"{ lo_endpointconfig_exception->av_err_code }" - { lo_endpointconfig_exception->av_err_msg }|. - MESSAGE lv_endpointconfig_error TYPE 'E'. - ENDTRY. - "snippet-end:[sgm.abapv1.delete_endpoint] - - ENDMETHOD. - - - METHOD delete_model. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sgm) = /aws1/cl_sgm_factory=>create( lo_session ). - - "snippet-start:[sgm.abapv1.delete_model] - TRY. - lo_sgm->deletemodel( - iv_modelname = iv_model_name ). - MESSAGE 'Model deleted.' TYPE 'I'. - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). - DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDTRY. - "snippet-end:[sgm.abapv1.delete_model] - - - ENDMETHOD. - - - METHOD describe_training_job. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sgm) = /aws1/cl_sgm_factory=>create( lo_session ). - - "snippet-start:[sgm.abapv1.describe_training_job] - TRY. - oo_result = lo_sgm->describetrainingjob( " oo_result is returned for testing purposes. " - iv_trainingjobname = iv_training_job_name ). - MESSAGE 'Retrieved description of training job.' TYPE 'I'. - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). - DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDTRY. - "snippet-end:[sgm.abapv1.describe_training_job] - - ENDMETHOD. - - - METHOD list_algorithms. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sgm) = /aws1/cl_sgm_factory=>create( lo_session ). - - "snippet-start:[sgm.abapv1.list_algorithms] - TRY. - oo_result = lo_sgm->listalgorithms( " oo_result is returned for testing purposes. " - iv_namecontains = iv_name_contains ). - MESSAGE 'Retrieved list of algorithms.' TYPE 'I'. - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). - DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDTRY. - "snippet-end:[sgm.abapv1.list_algorithms] - - ENDMETHOD. - - - METHOD list_models. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sgm) = /aws1/cl_sgm_factory=>create( lo_session ). - - "snippet-start:[sgm.abapv1.list_models] - TRY. - oo_result = lo_sgm->listmodels( " oo_result is returned for testing purposes. " - iv_namecontains = iv_name_contains ). - MESSAGE 'Retrieved list of models.' TYPE 'I'. - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). - DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDTRY. - "snippet-end:[sgm.abapv1.list_models] - - ENDMETHOD. - - - METHOD list_notebook_instances. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sgm) = /aws1/cl_sgm_factory=>create( lo_session ). - - "snippet-start:[sgm.abapv1.list_notebook_instances] - TRY. - oo_result = lo_sgm->listnotebookinstances( " oo_result is returned for testing purposes. " - iv_namecontains = iv_name_contains ). - MESSAGE 'Retrieved list of notebook instances.' TYPE 'I'. - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). - DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDTRY. - "snippet-end:[sgm.abapv1.list_notebook_instances] - ENDMETHOD. - - - METHOD list_training_jobs. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sgm) = /aws1/cl_sgm_factory=>create( lo_session ). - - "snippet-start:[sgm.abapv1.list_training_jobs] - TRY. - oo_result = lo_sgm->listtrainingjobs( " oo_result is returned for testing purposes. " - iv_namecontains = iv_name_contains - iv_maxresults = iv_max_results ). - MESSAGE 'Retrieved list of training jobs.' TYPE 'I'. - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). - DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. - MESSAGE lv_error TYPE 'E'. - ENDTRY. - "snippet-end:[sgm.abapv1.list_training_jobs] - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/sagemaker/zcl_aws1_sgm_actions.clas.testclasses.abap b/sap-abap/services/sagemaker/zcl_aws1_sgm_actions.clas.testclasses.abap deleted file mode 100644 index c11b34317a5..00000000000 --- a/sap-abap/services/sagemaker/zcl_aws1_sgm_actions.clas.testclasses.abap +++ /dev/null @@ -1,2453 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS ltc_zcl_aws1_sgm_actions DEFINITION FOR TESTING DURATION MEDIUM RISK LEVEL DANGEROUS. - - PRIVATE SECTION. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA ao_sgm TYPE REF TO /aws1/if_sgm. - DATA ao_s3 TYPE REF TO /aws1/if_s3. - DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. - DATA ao_sgm_actions TYPE REF TO zcl_aws1_sgm_actions. - DATA av_lrole TYPE /aws1/sgmrolearn. - DATA av_file_content TYPE /aws1/s3_streamingblob. - - METHODS setup RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic. - METHODS list_training_jobs FOR TESTING. - METHODS list_notebook_instances FOR TESTING. - METHODS list_models FOR TESTING. - METHODS list_algorithms FOR TESTING. - METHODS create_model FOR TESTING. - METHODS create_endpoint FOR TESTING. - METHODS create_transform_job FOR TESTING. - METHODS create_training_job FOR TESTING. - METHODS delete_endpoint FOR TESTING. - METHODS delete_model FOR TESTING. - METHODS describe_training_job FOR TESTING. - -ENDCLASS. "ltc_Zcl_Aws1_Sgm_Actions - - -CLASS ltc_zcl_aws1_sgm_actions IMPLEMENTATION. - METHOD setup. - ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). - ao_sgm = /aws1/cl_sgm_factory=>create( ao_session ). - ao_s3 = /aws1/cl_s3_factory=>create( ao_session ). - ao_sgm_actions = NEW zcl_aws1_sgm_actions( ). - - "Training data. - av_file_content = /aws1/cl_rt_util=>string_to_xstring( - |0 0:75 1:6.4 17:1 25:1 95:1 325:1\n| && - |0 0:59 1:7.3 16:1 19:1 296:1 328:1\n| && - |0 0:66 1:6.6 9:1 25:1 193:1 330:1\n| && - |0 0:64 1:6.9 9:1 21:1 146:1 330:1\n| && - |0 0:65 1:8.699999999999999 9:1 29:1 252:1 325:1\n| && - |0 0:61 1:6.1 14:1 29:1 42:1 325:1\n| && - |0 0:81 1:8.300000000000001 12:1 29:1 166:1 325:1\n| && - |0 0:43 1:3.9 10:1 27:1 310:1 330:1\n| && - |0 0:69 1:6.9 8:1 25:1 95:1 325:1\n| && - |1 0:88 1:8.6 9:1 21:1 204:1 330:1\n| && - |0 0:55 1:7.8 12:1 22:1 140:1 325:1\n| && - |0 0:62 1:6 16:1 29:1 95:1 325:1\n| && - |0 0:66 1:7.8 15:1 19:1 204:1 330:1\n| && - |0 0:85 1:5.8 7:1 19:1 295:1 328:1\n| && - |0 0:80 1:6.8 12:1 29:1 166:1 325:1\n| && - |0 0:70 1:3.6 7:1 28:1 95:1 330:1\n| && - |1 0:81 1:6.2 10:1 27:1 61:1 328:1\n| && - |0 0:77 1:7.1 7:1 30:1 222:1 326:1\n| && - |0 0:39 1:3.1 7:1 27:1 102:1 330:1\n| && - |0 0:55 1:5.7 4:1 21:1 278:1 330:1\n| && - |1 0:87 1:7.6 11:1 19:1 310:1 328:1\n| && - |0 0:62 1:6.2 9:1 25:1 149:1 325:1\n| && - |0 0:80 1:8 4:1 24:1 230:1 325:1\n| && - |0 0:68 1:4.9 7:1 30:1 298:1 330:1\n| && - |0 0:73 1:9 4:1 26:1 204:1 330:1\n| && - |0 0:66 1:7.2 9:1 19:1 204:1 330:1\n| && - |0 0:66 1:8.199999999999999 8:1 26:1 38:1 325:1\n| && - |0 0:86 1:8.199999999999999 4:1 23:1 209:1 325:1\n| && - |0 0:81 1:6.4 8:1 29:1 95:1 325:1\n| && - |0 0:71 1:7.1 5:1 29:1 95:1 325:1\n| && - |0 0:79 1:7.9 5:1 22:1 42:1 325:1\n| && - |1 0:64 1:6.4 9:1 22:1 252:1 330:1\n| && - |0 0:78 1:8.300000000000001 9:1 29:1 42:1 325:1\n| && - |1 0:91 1:9 8:1 19:1 305:1 328:1\n| && - |0 0:84 1:6.8 10:1 29:1 95:1 326:1\n| && - |0 0:85 1:8.199999999999999 7:1 27:1 322:1 328:1\n| && - |0 0:33 1:7 4:1 27:1 166:1 325:1\n| && - |0 0:73 1:3 7:1 27:1 42:1 328:1\n| && - |0 0:81 1:8 6:1 29:1 95:1 325:1\n| && - |0 0:59 1:6.8 2:1 25:1 75:1 325:1\n| && - |0 0:85 1:7.5 9:1 29:1 249:1 325:1\n| && - |0 0:79 1:7.6 5:1 29:1 95:1 325:1\n| && - |0 0:63 1:6.9 10:1 29:1 95:1 325:1\n| && - |1 0:95 1:6.8 10:1 23:1 252:1 325:1\n| && - |0 0:47 1:6.1 6:1 19:1 95:1 330:1\n| && - |0 0:81 1:8.6 14:1 19:1 249:1 328:1\n| && - |0 0:50 1:7 9:1 27:1 193:1 328:1\n| && - |0 0:88 1:7.9 10:1 29:1 95:1 326:1\n| && - |1 0:74 1:6.1 10:1 29:1 166:1 325:1\n| && - |0 0:82 1:8.1 17:1 29:1 95:1 325:1\n| && - |0 0:67 1:7.2 10:1 19:1 95:1 328:1\n| && - |0 0:67 1:6.7 6:1 23:1 307:1 326:1\n| && - |0 0:77 1:7.9 10:1 29:1 95:1 325:1\n| && - |0 0:68 1:5.9 7:1 19:1 61:1 328:1\n| && - |1 0:81 1:7.5 10:1 19:1 310:1 326:1\n| && - |0 0:62 1:7.5 4:1 26:1 278:1 326:1\n| && - |1 0:53 1:6.9 5:1 26:1 149:1 325:1\n| && - |0 0:78 1:8.1 2:1 26:1 315:1 326:1\n| && - |0 0:54 1:5.4 17:1 29:1 79:1 325:1\n| && - |0 0:89 1:8.4 10:1 25:1 252:1 326:1\n| && - |1 0:75 1:5.6 2:1 26:1 209:1 325:1\n| && - |0 0:78 1:8.300000000000001 9:1 29:1 252:1 325:1\n| && - |0 0:75 1:8.199999999999999 7:1 28:1 198:1 325:1\n| && - |0 0:72 1:7 7:1 27:1 256:1 330:1\n| && - |0 0:57 1:4.8 9:1 21:1 71:1 330:1\n| && - |0 0:58 1:5.9 10:1 27:1 204:1 330:1\n| && - |0 0:74 1:8.300000000000001 17:1 28:1 224:1 330:1\n| && - |0 0:48 1:7.1 14:1 26:1 249:1 330:1\n| && - |0 0:82 1:7.3 10:1 22:1 276:1 330:1\n| && - |0 0:66 1:7.4 6:1 25:1 307:1 325:1\n| && - |1 0:70 1:8.699999999999999 9:1 19:1 95:1 325:1\n| && - |0 0:86 1:8.4 7:1 23:1 295:1 326:1\n| && - |0 0:42 1:4.2 17:1 25:1 204:1 330:1\n| && - |0 0:75 1:7.8 4:1 27:1 75:1 325:1\n| && - |0 0:93 1:9.300000000000001 9:1 19:1 71:1 330:1\n| && - |0 0:63 1:7.8 17:1 22:1 279:1 330:1\n| && - |1 0:71 1:5.7 4:1 24:1 193:1 326:1\n| && - |0 0:42 1:5 16:1 19:1 256:1 326:1\n| && - |0 0:53 1:5.2 16:1 22:1 249:1 330:1\n| && - |0 0:64 1:6.4 12:1 19:1 282:1 330:1\n| && - |0 0:60 1:7 14:1 19:1 209:1 325:1\n| && - |0 0:86 1:7.4 16:1 21:1 95:1 328:1\n| && - |0 0:91 1:8.9 17:1 29:1 249:1 325:1\n| && - |1 0:82 1:7.8 10:1 26:1 61:1 328:1\n| && - |1 0:92 1:8.300000000000001 16:1 22:1 95:1 330:1\n| && - |1 0:85 1:8.800000000000001 9:1 26:1 252:1 325:1\n| && - |0 0:79 1:7.5 9:1 29:1 252:1 325:1\n| && - |1 0:61 1:5.3 14:1 28:1 35:1 325:1\n| && - |0 0:75 1:7.7 7:1 28:1 95:1 330:1\n| && - |0 0:68 1:8.5 14:1 29:1 279:1 326:1\n| && - |1 0:67 1:5 16:1 27:1 71:1 328:1\n| && - |0 0:79 1:8.5 12:1 26:1 103:1 330:1\n| && - |0 0:61 1:5.1 16:1 29:1 105:1 330:1\n| && - |1 0:72 1:8.699999999999999 12:1 26:1 71:1 330:1\n| && - |0 0:60 1:6.3 9:1 20:1 307:1 328:1\n| && - |0 0:67 1:7.8 9:1 29:1 39:1 325:1\n| && - |0 0:53 1:5.6 9:1 26:1 189:1 330:1\n| && - |1 0:98 1:7.7 8:1 29:1 42:1 330:1\n| && - |0 0:76 1:6.7 7:1 28:1 75:1 330:1\n| && - |1 0:74 1:5.3 7:1 28:1 95:1 330:1\n| ). - - ENDMETHOD. - - METHOD create_training_job. - - DATA lo_result TYPE REF TO /aws1/cl_sgmcreatetrnjobrsp. - DATA lv_training_job_name TYPE /aws1/sgmtrainingjobname. - - DATA lv_bucket_name TYPE /aws1/s3_bucketname. - DATA lv_file_content TYPE /aws1/s3_streamingblob. - DATA lv_trn_data_s3uri TYPE /aws1/sgms3uri. - DATA lv_val_data_s3uri TYPE /aws1/sgms3uri. - DATA lv_s3_output_path TYPE /aws1/sgms3uri. - DATA lv_model_key TYPE /aws1/s3_objectkey. - DATA lo_training_result TYPE REF TO /aws1/cl_sgmdescrtrnjobrsp. - DATA lv_uuid_16 TYPE sysuuid_x16. - - "Define hyperparameters. - CONSTANTS cv_hp_max_depth TYPE /aws1/sgmhyperparametervalue VALUE '3'. - CONSTANTS cv_hp_scale_pos_weight TYPE /aws1/sgmhyperparametervalue VALUE '2.0'. - CONSTANTS cv_hp_num_round TYPE /aws1/sgmhyperparametervalue VALUE '100'. - CONSTANTS cv_hp_objective TYPE /aws1/sgmhyperparametervalue VALUE 'binary:logistic'. - CONSTANTS cv_hp_subsample TYPE /aws1/sgmhyperparametervalue VALUE '0.5'. - CONSTANTS cv_hp_eta TYPE /aws1/sgmhyperparametervalue VALUE '0.1'. - CONSTANTS cv_hp_eval_metric TYPE /aws1/sgmhyperparametervalue VALUE 'auc'. - - "Define training data. - CONSTANTS cv_trn_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. - CONSTANTS cv_trn_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. - CONSTANTS cv_trn_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. - CONSTANTS cv_trn_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. - - "Define validation data. - CONSTANTS cv_val_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. - CONSTANTS cv_val_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. - CONSTANTS cv_val_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. - CONSTANTS cv_val_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. - - "Define training parameters. - CONSTANTS cv_training_image TYPE /aws1/sgmalgorithmimage VALUE '123456789012.abc.ecr.us-east-1.amazonaws.com/sagemaker-xgboost:1.5-1'. - CONSTANTS cv_training_input_mode TYPE /aws1/sgmtraininginputmode VALUE 'File'. - CONSTANTS cv_instance_count TYPE /aws1/sgmtraininginstancecount VALUE '1'. - CONSTANTS cv_instance_type TYPE /aws1/sgmtraininginstancetype VALUE 'ml.c4.2xlarge'. - CONSTANTS cv_volume_sizeingb TYPE /aws1/sgmvolumesizeingb VALUE '10'. - CONSTANTS cv_max_runtime_in_seconds TYPE /aws1/sgmmaxruntimeinseconds VALUE '1800'. - CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-sgm-'. - CONSTANTS cv_train_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/train/train.libsvm'. - CONSTANTS cv_val_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/validation/validation.libsvm'. - - "Define role Amazon Resource Name (ARN). - DATA(lt_roles) = ao_session->get_configuration( )->get_logical_iam_roles( ). - READ TABLE lt_roles INDEX 1 INTO DATA(lo_role). " take first role from the logical role mapping - av_lrole = lo_role-iam_role_arn. - - "Define job name. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_training_job_name = 'code-example-trn-job-' && lv_uuid_16. - TRANSLATE lv_training_job_name TO LOWER CASE. - - "Create training data in Amazon Simple Storage Service (Amazon S3). - lv_bucket_name = cv_bucket_name && lv_uuid_16. - TRANSLATE lv_bucket_name TO LOWER CASE. - zcl_aws1_ex_utils=>create_bucket( iv_bucket = lv_bucket_name - io_s3 = ao_s3 - io_session = ao_session ). - - - lv_trn_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_train_key. - lv_val_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_val_key. - lv_s3_output_path = 's3://' && lv_bucket_name && '/' && 'sagemaker/'. - lv_model_key = 'sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. - - ao_s3->putobject( - iv_bucket = lv_bucket_name - iv_key = cv_train_key - iv_body = av_file_content ). - - ao_s3->putobject( - iv_bucket = lv_bucket_name - iv_key = cv_val_key - iv_body = av_file_content ). - - "Testing. - ao_sgm_actions->create_training_job( - EXPORTING - iv_training_job_name = lv_training_job_name - iv_role_arn = av_lrole - iv_trn_data_s3datatype = cv_trn_data_s3datatype - iv_trn_data_s3datadistribution = cv_trn_data_s3datadistribution - iv_trn_data_s3uri = lv_trn_data_s3uri - iv_trn_data_compressiontype = cv_trn_data_compressiontype - iv_trn_data_contenttype = cv_trn_data_contenttype - iv_val_data_s3datatype = cv_val_data_s3datatype - iv_val_data_s3datadistribution = cv_val_data_s3datadistribution - iv_val_data_s3uri = lv_val_data_s3uri - iv_val_data_compressiontype = cv_val_data_compressiontype - iv_val_data_contenttype = cv_val_data_contenttype - iv_hp_max_depth = cv_hp_max_depth - iv_hp_scale_pos_weight = cv_hp_scale_pos_weight - iv_hp_num_round = cv_hp_num_round - iv_hp_objective = cv_hp_objective - iv_hp_subsample = cv_hp_subsample - iv_hp_eval_metric = cv_hp_eval_metric - iv_hp_eta = cv_hp_eta - iv_training_image = cv_training_image - iv_training_input_mode = cv_training_input_mode - iv_instance_count = cv_instance_count - iv_instance_type = cv_instance_type - iv_volume_sizeingb = cv_volume_sizeingb - iv_s3_output_path = lv_s3_output_path - iv_max_runtime_in_seconds = cv_max_runtime_in_seconds - IMPORTING - oo_result = lo_result ). - - DATA(lv_found) = abap_false. - IF lo_result->has_trainingjobarn( ) = 'X'. - lv_found = abap_true. - ENDIF. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Training Job cannot be found| ). - - "Wait for training job to be completed. - lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). - WHILE lo_training_result->get_trainingjobstatus( ) <> 'Completed'. - IF sy-index = 30. - EXIT. "maximum 900 seconds - ENDIF. - WAIT UP TO 30 SECONDS. - lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). - ENDWHILE. - - "Clean up. - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = cv_train_key ). - - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = cv_val_key ). - - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = lv_model_key ). - - ao_s3->deletebucket( - iv_bucket = lv_bucket_name ). - - ENDMETHOD. - - METHOD list_training_jobs. - - DATA lo_hyperparameters_w TYPE REF TO /aws1/cl_sgmhyperparameters_w. - DATA lt_hyperparameters TYPE /aws1/cl_sgmhyperparameters_w=>tt_hyperparameters. - DATA lt_input_data_config TYPE /aws1/cl_sgmchannel=>tt_inputdataconfig. - DATA lo_trn_channel TYPE REF TO /aws1/cl_sgmchannel. - DATA lo_trn_datasource TYPE REF TO /aws1/cl_sgmdatasource. - DATA lo_trn_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. - DATA lo_val_channel TYPE REF TO /aws1/cl_sgmchannel. - DATA lo_val_datasource TYPE REF TO /aws1/cl_sgmdatasource. - DATA lo_val_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. - DATA lo_output_data_config TYPE REF TO /aws1/cl_sgmoutputdataconfig. - DATA lo_resource_config TYPE REF TO /aws1/cl_sgmresourceconfig. - DATA lo_algorithm_specification TYPE REF TO /aws1/cl_sgmalgorithmspec. - DATA lo_list_result TYPE REF TO /aws1/cl_sgmlisttrnjobsrsp. - DATA lo_stopping_condition TYPE REF TO /aws1/cl_sgmstoppingcondition. - DATA lv_training_job_name TYPE /aws1/sgmtrainingjobname. - - DATA lv_bucket_name TYPE /aws1/s3_bucketname. - DATA lv_file_content TYPE /aws1/s3_streamingblob. - DATA lv_trn_data_s3uri TYPE /aws1/sgms3uri. - DATA lv_val_data_s3uri TYPE /aws1/sgms3uri. - DATA lv_s3_output_path TYPE /aws1/sgms3uri. - DATA lv_model_key TYPE /aws1/s3_objectkey. - DATA lo_training_result TYPE REF TO /aws1/cl_sgmdescrtrnjobrsp. - DATA lv_uuid_16 TYPE sysuuid_x16. - - "Create training data in Amazon S3. - CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-sgm-'. - CONSTANTS cv_train_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/train/train.libsvm'. - CONSTANTS cv_val_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/validation/validation.libsvm'. - - "Define hyperparameters. - CONSTANTS cv_hp_max_depth TYPE /aws1/sgmhyperparametervalue VALUE '3'. - CONSTANTS cv_hp_scale_pos_weight TYPE /aws1/sgmhyperparametervalue VALUE '2.0'. - CONSTANTS cv_hp_num_round TYPE /aws1/sgmhyperparametervalue VALUE '100'. - CONSTANTS cv_hp_objective TYPE /aws1/sgmhyperparametervalue VALUE 'binary:logistic'. - CONSTANTS cv_hp_subsample TYPE /aws1/sgmhyperparametervalue VALUE '0.5'. - CONSTANTS cv_hp_eta TYPE /aws1/sgmhyperparametervalue VALUE '0.1'. - CONSTANTS cv_hp_eval_metric TYPE /aws1/sgmhyperparametervalue VALUE 'auc'. - - "Define training data. - CONSTANTS cv_trn_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. - CONSTANTS cv_trn_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. - CONSTANTS cv_trn_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. - CONSTANTS cv_trn_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. - - "Define validation data. - CONSTANTS cv_val_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. - CONSTANTS cv_val_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. - CONSTANTS cv_val_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. - CONSTANTS cv_val_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. - - "Define training parameters. - CONSTANTS cv_training_image TYPE /aws1/sgmalgorithmimage VALUE '123456789012.abc.ecr.us-east-1.amazonaws.com/sagemaker-xgboost:1.5-1'. - CONSTANTS cv_training_input_mode TYPE /aws1/sgmtraininginputmode VALUE 'File'. - CONSTANTS cv_instance_count TYPE /aws1/sgmtraininginstancecount VALUE '1'. - CONSTANTS cv_instance_type TYPE /aws1/sgmtraininginstancetype VALUE 'ml.c4.2xlarge'. - CONSTANTS cv_volume_sizeingb TYPE /aws1/sgmvolumesizeingb VALUE '10'. - CONSTANTS cv_max_runtime_in_seconds TYPE /aws1/sgmmaxruntimeinseconds VALUE '1800'. - CONSTANTS cv_max_results TYPE /aws1/sgmmaxresults VALUE '1'. - - "Define role ARN. - DATA(lt_roles) = ao_session->get_configuration( )->get_logical_iam_roles( ). - READ TABLE lt_roles INDEX 1 INTO DATA(lo_role). " take first role from the logical role mapping - av_lrole = lo_role-iam_role_arn. - - "Define job name. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_training_job_name = 'code-example-trn-job-' && lv_uuid_16. - TRANSLATE lv_training_job_name TO LOWER CASE. - - "Create training data in Amazon S3. - lv_bucket_name = cv_bucket_name && lv_uuid_16. - TRANSLATE lv_bucket_name TO LOWER CASE. - zcl_aws1_ex_utils=>create_bucket( iv_bucket = lv_bucket_name - io_s3 = ao_s3 - io_session = ao_session ). - - - lv_trn_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_train_key. - lv_val_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_val_key. - lv_s3_output_path = 's3://' && lv_bucket_name && '/' && 'sagemaker/'. - lv_model_key = 'sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. - - ao_s3->putobject( - iv_bucket = lv_bucket_name - iv_key = cv_train_key - iv_body = av_file_content ). - - ao_s3->putobject( - iv_bucket = lv_bucket_name - iv_key = cv_val_key - iv_body = av_file_content ). - - "Create ABAP internal table for hyperparameters based on input variables. - lo_hyperparameters_w = NEW #( iv_value = cv_hp_max_depth ). - INSERT VALUE #( key = 'max_depth' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_eta ). - INSERT VALUE #( key = 'eta' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_eval_metric ). - INSERT VALUE #( key = 'eval_metric' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_scale_pos_weight ). - INSERT VALUE #( key = 'scale_pos_weight' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_subsample ). - INSERT VALUE #( key = 'subsample' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_objective ). - INSERT VALUE #( key = 'objective' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_num_round ). - INSERT VALUE #( key = 'num_round' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - "Create ABAP objects for data based on input variables. - "Training data. - lo_trn_s3datasource = NEW #( iv_s3datatype = cv_trn_data_s3datatype - iv_s3datadistributiontype = cv_trn_data_s3datadistribution - iv_s3uri = lv_trn_data_s3uri ). - - lo_trn_datasource = NEW #( io_s3datasource = lo_trn_s3datasource ). - - lo_trn_channel = NEW #( iv_channelname = 'train' - io_datasource = lo_trn_datasource - iv_compressiontype = cv_trn_data_compressiontype - iv_contenttype = cv_trn_data_contenttype ). - - INSERT lo_trn_channel INTO TABLE lt_input_data_config. - - "Validation data. - lo_val_s3datasource = NEW #( iv_s3datatype = cv_val_data_s3datatype - iv_s3datadistributiontype = cv_val_data_s3datadistribution - iv_s3uri = lv_val_data_s3uri ). - - lo_val_datasource = NEW #( io_s3datasource = lo_val_s3datasource ). - - lo_val_channel = NEW #( iv_channelname = 'validation' - io_datasource = lo_val_datasource - iv_compressiontype = cv_val_data_compressiontype - iv_contenttype = cv_val_data_contenttype ). - - INSERT lo_val_channel INTO TABLE lt_input_data_config. - - "Create an ABAP object for algorithm specification based on input variables. - lo_algorithm_specification = NEW #( iv_trainingimage = cv_training_image - iv_traininginputmode = cv_training_input_mode ). - - "Create an ABAP object for resource configuration. - lo_resource_config = NEW #( iv_instancecount = cv_instance_count - iv_instancetype = cv_instance_type - iv_volumesizeingb = cv_volume_sizeingb ). - - "Create an ABAP object for output data configuration. - lo_output_data_config = NEW #( iv_s3outputpath = lv_s3_output_path ). - - "Create an ABAP object for stopping condition. - lo_stopping_condition = NEW #( iv_maxruntimeinseconds = cv_max_runtime_in_seconds ). - - "Create a training job. - ao_sgm->createtrainingjob( - iv_trainingjobname = lv_training_job_name - iv_rolearn = av_lrole - it_hyperparameters = lt_hyperparameters - it_inputdataconfig = lt_input_data_config - io_algorithmspecification = lo_algorithm_specification - io_outputdataconfig = lo_output_data_config - io_resourceconfig = lo_resource_config - io_stoppingcondition = lo_stopping_condition ). - - "Testing. - ao_sgm_actions->list_training_jobs( - EXPORTING - iv_name_contains = lv_training_job_name - iv_max_results = cv_max_results - IMPORTING - oo_result = lo_list_result ). - - "Validation. - DATA(lv_found) = abap_false. - LOOP AT lo_list_result->get_trainingjobsummaries( ) INTO DATA(lo_job). - IF lo_job->has_trainingjobname( ) = 'X'. - lv_found = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Training job cannot be found| ). - - "Wait for training job to be completed. - lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). - WHILE lo_training_result->get_trainingjobstatus( ) <> 'Completed'. - IF sy-index = 30. - EXIT. "maximum 900 seconds - ENDIF. - WAIT UP TO 30 SECONDS. - lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). - ENDWHILE. - - "Clean up. - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = cv_train_key ). - - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = cv_val_key ). - - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = lv_model_key ). - - ao_s3->deletebucket( - iv_bucket = lv_bucket_name ). - - ENDMETHOD. - - METHOD describe_training_job. - - DATA lv_training_job_name TYPE /aws1/sgmtrainingjobname. - DATA lo_hyperparameters_w TYPE REF TO /aws1/cl_sgmhyperparameters_w. - DATA lt_hyperparameters TYPE /aws1/cl_sgmhyperparameters_w=>tt_hyperparameters. - DATA lt_input_data_config TYPE /aws1/cl_sgmchannel=>tt_inputdataconfig. - DATA lo_trn_channel TYPE REF TO /aws1/cl_sgmchannel. - DATA lo_trn_datasource TYPE REF TO /aws1/cl_sgmdatasource. - DATA lo_trn_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. - DATA lo_val_channel TYPE REF TO /aws1/cl_sgmchannel. - DATA lo_val_datasource TYPE REF TO /aws1/cl_sgmdatasource. - DATA lo_val_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. - DATA lo_stopping_condition TYPE REF TO /aws1/cl_sgmstoppingcondition. - DATA lo_algorithm_specification TYPE REF TO /aws1/cl_sgmalgorithmspec. - DATA lo_resource_config TYPE REF TO /aws1/cl_sgmresourceconfig. - DATA lo_output_data_config TYPE REF TO /aws1/cl_sgmoutputdataconfig. - DATA lo_list_result TYPE REF TO /aws1/cl_sgmdescrtrnjobrsp. - - DATA lv_bucket_name TYPE /aws1/s3_bucketname. - DATA lv_file_content TYPE /aws1/s3_streamingblob. - DATA lv_trn_data_s3uri TYPE /aws1/sgms3uri. - DATA lv_val_data_s3uri TYPE /aws1/sgms3uri. - DATA lv_s3_output_path TYPE /aws1/sgms3uri. - DATA lv_model_key TYPE /aws1/s3_objectkey. - DATA lo_training_result TYPE REF TO /aws1/cl_sgmdescrtrnjobrsp. - DATA lv_uuid_16 TYPE sysuuid_x16. - - "Define hyperparameters. - CONSTANTS cv_hp_max_depth TYPE /aws1/sgmhyperparametervalue VALUE '3'. - CONSTANTS cv_hp_scale_pos_weight TYPE /aws1/sgmhyperparametervalue VALUE '2.0'. - CONSTANTS cv_hp_num_round TYPE /aws1/sgmhyperparametervalue VALUE '100'. - CONSTANTS cv_hp_objective TYPE /aws1/sgmhyperparametervalue VALUE 'binary:logistic'. - CONSTANTS cv_hp_subsample TYPE /aws1/sgmhyperparametervalue VALUE '0.5'. - CONSTANTS cv_hp_eta TYPE /aws1/sgmhyperparametervalue VALUE '0.1'. - CONSTANTS cv_hp_eval_metric TYPE /aws1/sgmhyperparametervalue VALUE 'auc'. - - "Define training data. - CONSTANTS cv_trn_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. - CONSTANTS cv_trn_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. - CONSTANTS cv_trn_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. - CONSTANTS cv_trn_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. - - "Define validation data. - CONSTANTS cv_val_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. - CONSTANTS cv_val_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. - CONSTANTS cv_val_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. - CONSTANTS cv_val_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. - - "Define training parameters. - CONSTANTS cv_training_image TYPE /aws1/sgmalgorithmimage VALUE '123456789012.abc.ecr.us-east-1.amazonaws.com/sagemaker-xgboost:1.5-1'. - CONSTANTS cv_training_input_mode TYPE /aws1/sgmtraininginputmode VALUE 'File'. - CONSTANTS cv_instance_count TYPE /aws1/sgmtraininginstancecount VALUE '1'. - CONSTANTS cv_instance_type TYPE /aws1/sgmtraininginstancetype VALUE 'ml.c4.2xlarge'. - CONSTANTS cv_volume_sizeingb TYPE /aws1/sgmvolumesizeingb VALUE '10'. - CONSTANTS cv_max_runtime_in_seconds TYPE /aws1/sgmmaxruntimeinseconds VALUE '1800'. - CONSTANTS cv_job_status TYPE /aws1/sgmtrainingjobstatus VALUE 'InProgress'. - CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-sgm-'. - CONSTANTS cv_train_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/train/train.libsvm'. - CONSTANTS cv_val_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/validation/validation.libsvm'. - - "Define role ARN. - DATA(lt_roles) = ao_session->get_configuration( )->get_logical_iam_roles( ). - READ TABLE lt_roles INDEX 1 INTO DATA(lo_role). " take first role from the logical role mapping - av_lrole = lo_role-iam_role_arn. - - "Define job name. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_training_job_name = 'code-example-trn-job-' && lv_uuid_16. - TRANSLATE lv_training_job_name TO LOWER CASE. - - "Create training data in Amazon S3. - lv_bucket_name = cv_bucket_name && lv_uuid_16. - TRANSLATE lv_bucket_name TO LOWER CASE. - zcl_aws1_ex_utils=>create_bucket( iv_bucket = lv_bucket_name - io_s3 = ao_s3 - io_session = ao_session ). - - - lv_trn_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_train_key. - lv_val_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_val_key. - lv_s3_output_path = 's3://' && lv_bucket_name && '/' && 'sagemaker/'. - lv_model_key = 'sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. - - ao_s3->putobject( - iv_bucket = lv_bucket_name - iv_key = cv_train_key - iv_body = av_file_content ). - - ao_s3->putobject( - iv_bucket = lv_bucket_name - iv_key = cv_val_key - iv_body = av_file_content ). - - "Create ABAP internal table for hyperparameters based on input variables. - lo_hyperparameters_w = NEW #( iv_value = cv_hp_max_depth ). - INSERT VALUE #( key = 'max_depth' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_eta ). - INSERT VALUE #( key = 'eta' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_eval_metric ). - INSERT VALUE #( key = 'eval_metric' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_scale_pos_weight ). - INSERT VALUE #( key = 'scale_pos_weight' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_subsample ). - INSERT VALUE #( key = 'subsample' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_objective ). - INSERT VALUE #( key = 'objective' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_num_round ). - INSERT VALUE #( key = 'num_round' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - "Create ABAP objects for data based on input variables. - "Training data. - lo_trn_s3datasource = NEW #( iv_s3datatype = cv_trn_data_s3datatype - iv_s3datadistributiontype = cv_trn_data_s3datadistribution - iv_s3uri = lv_trn_data_s3uri ). - - lo_trn_datasource = NEW #( io_s3datasource = lo_trn_s3datasource ). - - lo_trn_channel = NEW #( iv_channelname = 'train' - io_datasource = lo_trn_datasource - iv_compressiontype = cv_trn_data_compressiontype - iv_contenttype = cv_trn_data_contenttype ). - - INSERT lo_trn_channel INTO TABLE lt_input_data_config. - - "Validation data. - lo_val_s3datasource = NEW #( iv_s3datatype = cv_val_data_s3datatype - iv_s3datadistributiontype = cv_val_data_s3datadistribution - iv_s3uri = lv_val_data_s3uri ). - - lo_val_datasource = NEW #( io_s3datasource = lo_val_s3datasource ). - - lo_val_channel = NEW #( iv_channelname = 'validation' - io_datasource = lo_val_datasource - iv_compressiontype = cv_val_data_compressiontype - iv_contenttype = cv_val_data_contenttype ). - - INSERT lo_val_channel INTO TABLE lt_input_data_config. - - "Create an ABAP object for algorithm specification based on input variables. - lo_algorithm_specification = NEW #( iv_trainingimage = cv_training_image - iv_traininginputmode = cv_training_input_mode ). - - "Create an ABAP object for resource configuration. - lo_resource_config = NEW #( iv_instancecount = cv_instance_count - iv_instancetype = cv_instance_type - iv_volumesizeingb = cv_volume_sizeingb ). - - "Create an ABAP object for output data configuration. - lo_output_data_config = NEW #( iv_s3outputpath = lv_s3_output_path ). - - "Create an ABAP object for stopping condition. - lo_stopping_condition = NEW #( iv_maxruntimeinseconds = cv_max_runtime_in_seconds ). - - "Create a training job. - ao_sgm->createtrainingjob( - iv_trainingjobname = lv_training_job_name - iv_rolearn = av_lrole - it_hyperparameters = lt_hyperparameters - it_inputdataconfig = lt_input_data_config - io_algorithmspecification = lo_algorithm_specification - io_outputdataconfig = lo_output_data_config - io_resourceconfig = lo_resource_config - io_stoppingcondition = lo_stopping_condition ). - - "Testing describe training job method. - ao_sgm_actions->describe_training_job( EXPORTING iv_training_job_name = lv_training_job_name IMPORTING oo_result = lo_list_result ). - - DATA(lv_found) = abap_false. - - IF lo_list_result->get_trainingjobstatus( ) = cv_job_status. - lv_found = abap_true. - ENDIF. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Training job status is incorrect| ). - - "Wait for training job to be completed. - lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). - WHILE lo_training_result->get_trainingjobstatus( ) <> 'Completed'. - IF sy-index = 30. - EXIT. "maximum 900 seconds - ENDIF. - WAIT UP TO 30 SECONDS. - lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). - ENDWHILE. - - "Clean up. - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = cv_train_key ). - - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = cv_val_key ). - - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = lv_model_key ). - - ao_s3->deletebucket( - iv_bucket = lv_bucket_name ). - - ENDMETHOD. - - METHOD create_model. - - DATA lo_hyperparameters_w TYPE REF TO /aws1/cl_sgmhyperparameters_w. - DATA lt_hyperparameters TYPE /aws1/cl_sgmhyperparameters_w=>tt_hyperparameters. - DATA lt_input_data_config TYPE /aws1/cl_sgmchannel=>tt_inputdataconfig. - DATA lo_trn_channel TYPE REF TO /aws1/cl_sgmchannel. - DATA lo_trn_datasource TYPE REF TO /aws1/cl_sgmdatasource. - DATA lo_trn_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. - DATA lo_val_channel TYPE REF TO /aws1/cl_sgmchannel. - DATA lo_val_datasource TYPE REF TO /aws1/cl_sgmdatasource. - DATA lo_val_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. - DATA lo_output_data_config TYPE REF TO /aws1/cl_sgmoutputdataconfig. - DATA lo_resource_config TYPE REF TO /aws1/cl_sgmresourceconfig. - DATA lo_algorithm_specification TYPE REF TO /aws1/cl_sgmalgorithmspec. - DATA lo_list_result TYPE REF TO /aws1/cl_sgmlisttrnjobsrsp. - DATA lo_stopping_condition TYPE REF TO /aws1/cl_sgmstoppingcondition. - DATA lv_training_job_name TYPE /aws1/sgmtrainingjobname. - - DATA lo_result TYPE REF TO /aws1/cl_sgmcreatemodeloutput. - DATA lv_model_name TYPE /aws1/sgmmodelname. - DATA lv_model_data_url TYPE /aws1/sgmurl. - DATA lv_bucket_name TYPE /aws1/s3_bucketname. - DATA lv_file_content TYPE /aws1/s3_streamingblob. - DATA lv_trn_data_s3uri TYPE /aws1/sgms3uri. - DATA lv_val_data_s3uri TYPE /aws1/sgms3uri. - DATA lv_s3_output_path TYPE /aws1/sgms3uri. - DATA lv_model_key TYPE /aws1/s3_objectkey. - DATA lo_training_result TYPE REF TO /aws1/cl_sgmdescrtrnjobrsp. - DATA lv_uuid_16 TYPE sysuuid_x16. - - "Define Amazon S3 parameters for data. - CONSTANTS cv_container_image TYPE /aws1/sgmcontainerimage VALUE '123456789012.abc.ecr.us-east-1.amazonaws.com/sagemaker-xgboost:1.5-1'. - CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-sgm-'. - CONSTANTS cv_train_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/train/train.libsvm'. - CONSTANTS cv_val_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/validation/validation.libsvm'. - - "Define hyperparameters. - CONSTANTS cv_hp_max_depth TYPE /aws1/sgmhyperparametervalue VALUE '3'. - CONSTANTS cv_hp_scale_pos_weight TYPE /aws1/sgmhyperparametervalue VALUE '2.0'. - CONSTANTS cv_hp_num_round TYPE /aws1/sgmhyperparametervalue VALUE '100'. - CONSTANTS cv_hp_objective TYPE /aws1/sgmhyperparametervalue VALUE 'binary:logistic'. - CONSTANTS cv_hp_subsample TYPE /aws1/sgmhyperparametervalue VALUE '0.5'. - CONSTANTS cv_hp_eta TYPE /aws1/sgmhyperparametervalue VALUE '0.1'. - CONSTANTS cv_hp_eval_metric TYPE /aws1/sgmhyperparametervalue VALUE 'auc'. - - "Define training data. - CONSTANTS cv_trn_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. - CONSTANTS cv_trn_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. - CONSTANTS cv_trn_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. - CONSTANTS cv_trn_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. - - "Define validation data. - CONSTANTS cv_val_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. - CONSTANTS cv_val_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. - CONSTANTS cv_val_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. - CONSTANTS cv_val_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. - - "Define training parameters. - CONSTANTS cv_training_image TYPE /aws1/sgmalgorithmimage VALUE '123456789012.abc.ecr.us-east-1.amazonaws.com/sagemaker-xgboost:1.5-1'. - CONSTANTS cv_training_input_mode TYPE /aws1/sgmtraininginputmode VALUE 'File'. - CONSTANTS cv_instance_count TYPE /aws1/sgmtraininginstancecount VALUE '1'. - CONSTANTS cv_instance_type TYPE /aws1/sgmtraininginstancetype VALUE 'ml.c4.2xlarge'. - CONSTANTS cv_volume_sizeingb TYPE /aws1/sgmvolumesizeingb VALUE '10'. - CONSTANTS cv_max_runtime_in_seconds TYPE /aws1/sgmmaxruntimeinseconds VALUE '1800'. - CONSTANTS cv_max_results TYPE /aws1/sgmmaxresults VALUE '1'. - - "Define role ARN. - DATA(lt_roles) = ao_session->get_configuration( )->get_logical_iam_roles( ). - READ TABLE lt_roles INDEX 1 INTO DATA(lo_role). " take first role from the logical role mapping - av_lrole = lo_role-iam_role_arn. - - "Define job name. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_training_job_name = 'code-example-trn-job-' && lv_uuid_16. - TRANSLATE lv_training_job_name TO LOWER CASE. - - "Define model name. - lv_model_name = 'code-example-model-' && lv_uuid_16. - TRANSLATE lv_model_name TO LOWER CASE. - - "Create training data in Amazon S3. - lv_bucket_name = cv_bucket_name && lv_uuid_16. - TRANSLATE lv_bucket_name TO LOWER CASE. - zcl_aws1_ex_utils=>create_bucket( iv_bucket = lv_bucket_name - io_s3 = ao_s3 - io_session = ao_session ). - - - lv_trn_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_train_key. - lv_val_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_val_key. - lv_s3_output_path = 's3://' && lv_bucket_name && '/' && 'sagemaker/'. - lv_model_key = 'sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. - lv_model_data_url = 's3://' && lv_bucket_name && '/sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. - - - ao_s3->putobject( - iv_bucket = lv_bucket_name - iv_key = cv_train_key - iv_body = av_file_content ). - - ao_s3->putobject( - iv_bucket = lv_bucket_name - iv_key = cv_val_key - iv_body = av_file_content ). - - "Create ABAP internal table for hyperparameters based on input variables. - lo_hyperparameters_w = NEW #( iv_value = cv_hp_max_depth ). - INSERT VALUE #( key = 'max_depth' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_eta ). - INSERT VALUE #( key = 'eta' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_eval_metric ). - INSERT VALUE #( key = 'eval_metric' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_scale_pos_weight ). - INSERT VALUE #( key = 'scale_pos_weight' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_subsample ). - INSERT VALUE #( key = 'subsample' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_objective ). - INSERT VALUE #( key = 'objective' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_num_round ). - INSERT VALUE #( key = 'num_round' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - "Create ABAP objects for data based on input variables. - "Training data. - lo_trn_s3datasource = NEW #( iv_s3datatype = cv_trn_data_s3datatype - iv_s3datadistributiontype = cv_trn_data_s3datadistribution - iv_s3uri = lv_trn_data_s3uri ). - - lo_trn_datasource = NEW #( io_s3datasource = lo_trn_s3datasource ). - - lo_trn_channel = NEW #( iv_channelname = 'train' - io_datasource = lo_trn_datasource - iv_compressiontype = cv_trn_data_compressiontype - iv_contenttype = cv_trn_data_contenttype ). - - INSERT lo_trn_channel INTO TABLE lt_input_data_config. - - "Validation data. - lo_val_s3datasource = NEW #( iv_s3datatype = cv_val_data_s3datatype - iv_s3datadistributiontype = cv_val_data_s3datadistribution - iv_s3uri = lv_val_data_s3uri ). - - lo_val_datasource = NEW #( io_s3datasource = lo_val_s3datasource ). - - lo_val_channel = NEW #( iv_channelname = 'validation' - io_datasource = lo_val_datasource - iv_compressiontype = cv_val_data_compressiontype - iv_contenttype = cv_val_data_contenttype ). - - INSERT lo_val_channel INTO TABLE lt_input_data_config. - - "Create an ABAP object for algorithm specification based on input variables. - lo_algorithm_specification = NEW #( iv_trainingimage = cv_training_image - iv_traininginputmode = cv_training_input_mode ). - - "Create an ABAP object for resource configuration. - lo_resource_config = NEW #( iv_instancecount = cv_instance_count - iv_instancetype = cv_instance_type - iv_volumesizeingb = cv_volume_sizeingb ). - - "Create an ABAP object for output data configuration. - lo_output_data_config = NEW #( iv_s3outputpath = lv_s3_output_path ). - - "Create an ABAP object for stopping condition. - lo_stopping_condition = NEW #( iv_maxruntimeinseconds = cv_max_runtime_in_seconds ). - - "Create a training job. - ao_sgm->createtrainingjob( - iv_trainingjobname = lv_training_job_name - iv_rolearn = av_lrole - it_hyperparameters = lt_hyperparameters - it_inputdataconfig = lt_input_data_config - io_algorithmspecification = lo_algorithm_specification - io_outputdataconfig = lo_output_data_config - io_resourceconfig = lo_resource_config - io_stoppingcondition = lo_stopping_condition ). - - "Wait for training job to be completed. - lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). - WHILE lo_training_result->get_trainingjobstatus( ) <> 'Completed'. - IF sy-index = 30. - EXIT. "maximum 900 seconds - ENDIF. - WAIT UP TO 30 SECONDS. - lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). - ENDWHILE. - - "Test the create_model method. - ao_sgm_actions->create_model( EXPORTING iv_model_name = lv_model_name - iv_execution_role_arn = av_lrole - iv_model_data_url = lv_model_data_url - iv_container_image = cv_container_image IMPORTING oo_result = lo_result ). - - DATA(lv_found) = abap_false. - - IF lo_result->has_modelarn( ) = 'X'. - lv_found = abap_true. - ENDIF. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Model cannot be found| ). - - "Clean up. - ao_sgm->deletemodel( - iv_modelname = lv_model_name ). - - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = cv_train_key ). - - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = cv_val_key ). - - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = lv_model_key ). - - ao_s3->deletebucket( - iv_bucket = lv_bucket_name ). - - ENDMETHOD. - - METHOD list_models. - - DATA lo_hyperparameters_w TYPE REF TO /aws1/cl_sgmhyperparameters_w. - DATA lt_hyperparameters TYPE /aws1/cl_sgmhyperparameters_w=>tt_hyperparameters. - DATA lt_input_data_config TYPE /aws1/cl_sgmchannel=>tt_inputdataconfig. - DATA lo_trn_channel TYPE REF TO /aws1/cl_sgmchannel. - DATA lo_trn_datasource TYPE REF TO /aws1/cl_sgmdatasource. - DATA lo_trn_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. - DATA lo_val_channel TYPE REF TO /aws1/cl_sgmchannel. - DATA lo_val_datasource TYPE REF TO /aws1/cl_sgmdatasource. - DATA lo_val_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. - DATA lo_output_data_config TYPE REF TO /aws1/cl_sgmoutputdataconfig. - DATA lo_resource_config TYPE REF TO /aws1/cl_sgmresourceconfig. - DATA lo_algorithm_specification TYPE REF TO /aws1/cl_sgmalgorithmspec. - DATA lo_list_result TYPE REF TO /aws1/cl_sgmlisttrnjobsrsp. - DATA lo_stopping_condition TYPE REF TO /aws1/cl_sgmstoppingcondition. - DATA lv_training_job_name TYPE /aws1/sgmtrainingjobname. - - DATA lo_result TYPE REF TO /aws1/cl_sgmcreatemodeloutput. - DATA lv_model_name TYPE /aws1/sgmmodelname. - DATA lv_model_data_url TYPE /aws1/sgmurl. - DATA lv_bucket_name TYPE /aws1/s3_bucketname. - DATA lv_file_content TYPE /aws1/s3_streamingblob. - DATA lv_trn_data_s3uri TYPE /aws1/sgms3uri. - DATA lv_val_data_s3uri TYPE /aws1/sgms3uri. - DATA lv_s3_output_path TYPE /aws1/sgms3uri. - DATA lv_model_key TYPE /aws1/s3_objectkey. - DATA lo_training_result TYPE REF TO /aws1/cl_sgmdescrtrnjobrsp. - DATA lo_primarycontainer TYPE REF TO /aws1/cl_sgmcontainerdefn. - DATA lo_model_list_result TYPE REF TO /aws1/cl_sgmlistmodelsoutput. - DATA lv_uuid_16 TYPE sysuuid_x16. - - "Define Amazon S3 parameters. - CONSTANTS cv_container_image TYPE /aws1/sgmcontainerimage VALUE '123456789012.abc.ecr.us-east-1.amazonaws.com/sagemaker-xgboost:1.5-1'. - CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-sgm-'. - CONSTANTS cv_train_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/train/train.libsvm'. - CONSTANTS cv_val_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/validation/validation.libsvm'. - - "Define hyperparameters. - CONSTANTS cv_hp_max_depth TYPE /aws1/sgmhyperparametervalue VALUE '3'. - CONSTANTS cv_hp_scale_pos_weight TYPE /aws1/sgmhyperparametervalue VALUE '2.0'. - CONSTANTS cv_hp_num_round TYPE /aws1/sgmhyperparametervalue VALUE '100'. - CONSTANTS cv_hp_objective TYPE /aws1/sgmhyperparametervalue VALUE 'binary:logistic'. - CONSTANTS cv_hp_subsample TYPE /aws1/sgmhyperparametervalue VALUE '0.5'. - CONSTANTS cv_hp_eta TYPE /aws1/sgmhyperparametervalue VALUE '0.1'. - CONSTANTS cv_hp_eval_metric TYPE /aws1/sgmhyperparametervalue VALUE 'auc'. - - "Define training data. - CONSTANTS cv_trn_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. - CONSTANTS cv_trn_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. - CONSTANTS cv_trn_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. - CONSTANTS cv_trn_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. - - "Define validation data. - CONSTANTS cv_val_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. - CONSTANTS cv_val_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. - CONSTANTS cv_val_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. - CONSTANTS cv_val_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. - - "Define training parameters. - CONSTANTS cv_training_image TYPE /aws1/sgmalgorithmimage VALUE '123456789012.abc.ecr.us-east-1.amazonaws.com/sagemaker-xgboost:1.5-1'. - CONSTANTS cv_training_input_mode TYPE /aws1/sgmtraininginputmode VALUE 'File'. - CONSTANTS cv_instance_count TYPE /aws1/sgmtraininginstancecount VALUE '1'. - CONSTANTS cv_instance_type TYPE /aws1/sgmtraininginstancetype VALUE 'ml.c4.2xlarge'. - CONSTANTS cv_volume_sizeingb TYPE /aws1/sgmvolumesizeingb VALUE '10'. - CONSTANTS cv_max_runtime_in_seconds TYPE /aws1/sgmmaxruntimeinseconds VALUE '1800'. - CONSTANTS cv_max_results TYPE /aws1/sgmmaxresults VALUE '1'. - - "Define role ARN. - DATA(lt_roles) = ao_session->get_configuration( )->get_logical_iam_roles( ). - READ TABLE lt_roles INDEX 1 INTO DATA(lo_role). " take first role from the logical role mapping - av_lrole = lo_role-iam_role_arn. - - "Define job name. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_training_job_name = 'code-example-trn-job-' && lv_uuid_16. - TRANSLATE lv_training_job_name TO LOWER CASE. - - "Define model name. - lv_model_name = 'code-example-model-' && lv_uuid_16. - TRANSLATE lv_model_name TO LOWER CASE. - - "Create training data in Amazon S3. - lv_bucket_name = cv_bucket_name && lv_uuid_16. - TRANSLATE lv_bucket_name TO LOWER CASE. - zcl_aws1_ex_utils=>create_bucket( iv_bucket = lv_bucket_name - io_s3 = ao_s3 - io_session = ao_session ). - - - lv_trn_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_train_key. - lv_val_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_val_key. - lv_s3_output_path = 's3://' && lv_bucket_name && '/' && 'sagemaker/'. - lv_model_key = 'sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. - lv_model_data_url = 's3://' && lv_bucket_name && '/sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. - - ao_s3->putobject( - iv_bucket = lv_bucket_name - iv_key = cv_train_key - iv_body = av_file_content ). - - ao_s3->putobject( - iv_bucket = lv_bucket_name - iv_key = cv_val_key - iv_body = av_file_content ). - - "Create ABAP internal table for hyperparameters based on input variables. - lo_hyperparameters_w = NEW #( iv_value = cv_hp_max_depth ). - INSERT VALUE #( key = 'max_depth' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_eta ). - INSERT VALUE #( key = 'eta' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_eval_metric ). - INSERT VALUE #( key = 'eval_metric' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_scale_pos_weight ). - INSERT VALUE #( key = 'scale_pos_weight' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_subsample ). - INSERT VALUE #( key = 'subsample' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_objective ). - INSERT VALUE #( key = 'objective' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_num_round ). - INSERT VALUE #( key = 'num_round' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - "Create ABAP objects for data based on input variables. - "Training data. - lo_trn_s3datasource = NEW #( iv_s3datatype = cv_trn_data_s3datatype - iv_s3datadistributiontype = cv_trn_data_s3datadistribution - iv_s3uri = lv_trn_data_s3uri ). - - lo_trn_datasource = NEW #( io_s3datasource = lo_trn_s3datasource ). - - lo_trn_channel = NEW #( iv_channelname = 'train' - io_datasource = lo_trn_datasource - iv_compressiontype = cv_trn_data_compressiontype - iv_contenttype = cv_trn_data_contenttype ). - - INSERT lo_trn_channel INTO TABLE lt_input_data_config. - - "Validation data. - lo_val_s3datasource = NEW #( iv_s3datatype = cv_val_data_s3datatype - iv_s3datadistributiontype = cv_val_data_s3datadistribution - iv_s3uri = lv_val_data_s3uri ). - - lo_val_datasource = NEW #( io_s3datasource = lo_val_s3datasource ). - - lo_val_channel = NEW #( iv_channelname = 'validation' - io_datasource = lo_val_datasource - iv_compressiontype = cv_val_data_compressiontype - iv_contenttype = cv_val_data_contenttype ). - - INSERT lo_val_channel INTO TABLE lt_input_data_config. - - "Create an ABAP object for algorithm specification based on input variables. - lo_algorithm_specification = NEW #( iv_trainingimage = cv_training_image - iv_traininginputmode = cv_training_input_mode ). - - "Create an ABAP object for resource configuration. - lo_resource_config = NEW #( iv_instancecount = cv_instance_count - iv_instancetype = cv_instance_type - iv_volumesizeingb = cv_volume_sizeingb ). - - "Create an ABAP object for output data configuration. - lo_output_data_config = NEW #( iv_s3outputpath = lv_s3_output_path ). - - "Create an ABAP object for stopping condition. - lo_stopping_condition = NEW #( iv_maxruntimeinseconds = cv_max_runtime_in_seconds ). - - "Run method to create a training job. - ao_sgm->createtrainingjob( - iv_trainingjobname = lv_training_job_name - iv_rolearn = av_lrole - it_hyperparameters = lt_hyperparameters - it_inputdataconfig = lt_input_data_config - io_algorithmspecification = lo_algorithm_specification - io_outputdataconfig = lo_output_data_config - io_resourceconfig = lo_resource_config - io_stoppingcondition = lo_stopping_condition ). - - "Wait for training job to be completed. - lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). - WHILE lo_training_result->get_trainingjobstatus( ) <> 'Completed'. - IF sy-index = 30. - EXIT. "maximum 900 seconds - ENDIF. - WAIT UP TO 30 SECONDS. - lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). - ENDWHILE. - - "Create an ABAP internal table for the container image based on input variables. - lo_primarycontainer = NEW #( iv_image = cv_container_image - iv_modeldataurl = lv_model_data_url ). - - "Create a new model via so_sgm. - ao_sgm->createmodel( iv_modelname = lv_model_name - iv_executionrolearn = av_lrole - io_primarycontainer = lo_primarycontainer ). - - "Call list_models via so_sgm_actions. - ao_sgm_actions->list_models( EXPORTING iv_name_contains = lv_model_name IMPORTING oo_result = lo_model_list_result ). - - DATA(lv_found) = abap_false. - - LOOP AT lo_model_list_result->get_models( ) INTO DATA(lo_models). - IF lo_models->get_modelname( ) = lv_model_name. - lv_found = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Model cannot be found| ). - - "Clean up. - ao_sgm->deletemodel( - iv_modelname = lv_model_name ). - - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = cv_train_key ). - - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = cv_val_key ). - - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = lv_model_key ). - - ao_s3->deletebucket( - iv_bucket = lv_bucket_name ). - - ENDMETHOD. - - METHOD delete_model. - - DATA lo_hyperparameters_w TYPE REF TO /aws1/cl_sgmhyperparameters_w. - DATA lt_hyperparameters TYPE /aws1/cl_sgmhyperparameters_w=>tt_hyperparameters. - DATA lt_input_data_config TYPE /aws1/cl_sgmchannel=>tt_inputdataconfig. - DATA lo_trn_channel TYPE REF TO /aws1/cl_sgmchannel. - DATA lo_trn_datasource TYPE REF TO /aws1/cl_sgmdatasource. - DATA lo_trn_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. - DATA lo_val_channel TYPE REF TO /aws1/cl_sgmchannel. - DATA lo_val_datasource TYPE REF TO /aws1/cl_sgmdatasource. - DATA lo_val_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. - DATA lo_output_data_config TYPE REF TO /aws1/cl_sgmoutputdataconfig. - DATA lo_resource_config TYPE REF TO /aws1/cl_sgmresourceconfig. - DATA lo_algorithm_specification TYPE REF TO /aws1/cl_sgmalgorithmspec. - DATA lo_list_result TYPE REF TO /aws1/cl_sgmlisttrnjobsrsp. - DATA lo_stopping_condition TYPE REF TO /aws1/cl_sgmstoppingcondition. - DATA lv_training_job_name TYPE /aws1/sgmtrainingjobname. - - DATA lo_result TYPE REF TO /aws1/cl_sgmcreatemodeloutput. - DATA lv_model_name TYPE /aws1/sgmmodelname. - DATA lv_model_data_url TYPE /aws1/sgmurl. - DATA lv_bucket_name TYPE /aws1/s3_bucketname. - DATA lv_file_content TYPE /aws1/s3_streamingblob. - DATA lv_trn_data_s3uri TYPE /aws1/sgms3uri. - DATA lv_val_data_s3uri TYPE /aws1/sgms3uri. - DATA lv_s3_output_path TYPE /aws1/sgms3uri. - DATA lv_model_key TYPE /aws1/s3_objectkey. - DATA lo_training_result TYPE REF TO /aws1/cl_sgmdescrtrnjobrsp. - DATA lo_primarycontainer TYPE REF TO /aws1/cl_sgmcontainerdefn. - DATA lo_model_list_result TYPE REF TO /aws1/cl_sgmlistmodelsoutput. - DATA lv_uuid_16 TYPE sysuuid_x16. - - "Define Amazon S3 parameters. - CONSTANTS cv_container_image TYPE /aws1/sgmcontainerimage VALUE '123456789012.abc.ecr.us-east-1.amazonaws.com/sagemaker-xgboost:1.5-1'. - CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-sgm-'. - CONSTANTS cv_train_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/train/train.libsvm'. - CONSTANTS cv_val_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/validation/validation.libsvm'. - - "Define hyperparameters. - CONSTANTS cv_hp_max_depth TYPE /aws1/sgmhyperparametervalue VALUE '3'. - CONSTANTS cv_hp_scale_pos_weight TYPE /aws1/sgmhyperparametervalue VALUE '2.0'. - CONSTANTS cv_hp_num_round TYPE /aws1/sgmhyperparametervalue VALUE '100'. - CONSTANTS cv_hp_objective TYPE /aws1/sgmhyperparametervalue VALUE 'binary:logistic'. - CONSTANTS cv_hp_subsample TYPE /aws1/sgmhyperparametervalue VALUE '0.5'. - CONSTANTS cv_hp_eta TYPE /aws1/sgmhyperparametervalue VALUE '0.1'. - CONSTANTS cv_hp_eval_metric TYPE /aws1/sgmhyperparametervalue VALUE 'auc'. - - "Define training data. - CONSTANTS cv_trn_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. - CONSTANTS cv_trn_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. - CONSTANTS cv_trn_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. - CONSTANTS cv_trn_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. - - "Define validation data. - CONSTANTS cv_val_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. - CONSTANTS cv_val_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. - CONSTANTS cv_val_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. - CONSTANTS cv_val_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. - - "Define training parameters. - CONSTANTS cv_training_image TYPE /aws1/sgmalgorithmimage VALUE '123456789012.abc.ecr.us-east-1.amazonaws.com/sagemaker-xgboost:1.5-1'. - CONSTANTS cv_training_input_mode TYPE /aws1/sgmtraininginputmode VALUE 'File'. - CONSTANTS cv_instance_count TYPE /aws1/sgmtraininginstancecount VALUE '1'. - CONSTANTS cv_instance_type TYPE /aws1/sgmtraininginstancetype VALUE 'ml.c4.2xlarge'. - CONSTANTS cv_volume_sizeingb TYPE /aws1/sgmvolumesizeingb VALUE '10'. - CONSTANTS cv_max_runtime_in_seconds TYPE /aws1/sgmmaxruntimeinseconds VALUE '1800'. - CONSTANTS cv_max_results TYPE /aws1/sgmmaxresults VALUE '1'. - - "Define role ARN. - DATA(lt_roles) = ao_session->get_configuration( )->get_logical_iam_roles( ). - READ TABLE lt_roles INDEX 1 INTO DATA(lo_role). " take first role from the logical role mapping - av_lrole = lo_role-iam_role_arn. - - "Define job name. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_training_job_name = 'code-example-trn-job-' && lv_uuid_16. - TRANSLATE lv_training_job_name TO LOWER CASE. - - "Define model name. - lv_model_name = 'code-example-model-' && lv_uuid_16. - TRANSLATE lv_model_name TO LOWER CASE. - - "Create training data in Amazon S3. - lv_bucket_name = cv_bucket_name && lv_uuid_16. - TRANSLATE lv_bucket_name TO LOWER CASE. - zcl_aws1_ex_utils=>create_bucket( iv_bucket = lv_bucket_name - io_s3 = ao_s3 - io_session = ao_session ). - - - lv_trn_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_train_key. - lv_val_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_val_key. - lv_s3_output_path = 's3://' && lv_bucket_name && '/' && 'sagemaker/'. - lv_model_key = 'sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. - lv_model_data_url = 's3://' && lv_bucket_name && '/sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. - - ao_s3->putobject( - iv_bucket = lv_bucket_name - iv_key = cv_train_key - iv_body = av_file_content ). - - ao_s3->putobject( - iv_bucket = lv_bucket_name - iv_key = cv_val_key - iv_body = av_file_content ). - - "Create ABAP internal table for hyperparameters based on input variables. - lo_hyperparameters_w = NEW #( iv_value = cv_hp_max_depth ). - INSERT VALUE #( key = 'max_depth' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_eta ). - INSERT VALUE #( key = 'eta' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_eval_metric ). - INSERT VALUE #( key = 'eval_metric' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_scale_pos_weight ). - INSERT VALUE #( key = 'scale_pos_weight' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_subsample ). - INSERT VALUE #( key = 'subsample' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_objective ). - INSERT VALUE #( key = 'objective' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_num_round ). - INSERT VALUE #( key = 'num_round' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - "Create ABAP objects for data based on input variables. - "Training data. - lo_trn_s3datasource = NEW #( iv_s3datatype = cv_trn_data_s3datatype - iv_s3datadistributiontype = cv_trn_data_s3datadistribution - iv_s3uri = lv_trn_data_s3uri ). - - lo_trn_datasource = NEW #( io_s3datasource = lo_trn_s3datasource ). - - lo_trn_channel = NEW #( iv_channelname = 'train' - io_datasource = lo_trn_datasource - iv_compressiontype = cv_trn_data_compressiontype - iv_contenttype = cv_trn_data_contenttype ). - - INSERT lo_trn_channel INTO TABLE lt_input_data_config. - - "Validation data. - lo_val_s3datasource = NEW #( iv_s3datatype = cv_val_data_s3datatype - iv_s3datadistributiontype = cv_val_data_s3datadistribution - iv_s3uri = lv_val_data_s3uri ). - - lo_val_datasource = NEW #( io_s3datasource = lo_val_s3datasource ). - - lo_val_channel = NEW #( iv_channelname = 'validation' - io_datasource = lo_val_datasource - iv_compressiontype = cv_val_data_compressiontype - iv_contenttype = cv_val_data_contenttype ). - - INSERT lo_val_channel INTO TABLE lt_input_data_config. - - "Create an ABAP object for algorithm specification based on input variables. - lo_algorithm_specification = NEW #( iv_trainingimage = cv_training_image - iv_traininginputmode = cv_training_input_mode ). - - "Create an ABAP object for resource configuration. - lo_resource_config = NEW #( iv_instancecount = cv_instance_count - iv_instancetype = cv_instance_type - iv_volumesizeingb = cv_volume_sizeingb ). - - "Create an ABAP object for output data configuration. - lo_output_data_config = NEW #( iv_s3outputpath = lv_s3_output_path ). - - "Create an ABAP object for stopping condition. - lo_stopping_condition = NEW #( iv_maxruntimeinseconds = cv_max_runtime_in_seconds ). - - "Create a training job. - ao_sgm->createtrainingjob( - iv_trainingjobname = lv_training_job_name - iv_rolearn = av_lrole - it_hyperparameters = lt_hyperparameters - it_inputdataconfig = lt_input_data_config - io_algorithmspecification = lo_algorithm_specification - io_outputdataconfig = lo_output_data_config - io_resourceconfig = lo_resource_config - io_stoppingcondition = lo_stopping_condition ). - - "Wait for training job to be completed. - lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). - WHILE lo_training_result->get_trainingjobstatus( ) <> 'Completed'. - IF sy-index = 30. - EXIT. "maximum 900 seconds - ENDIF. - WAIT UP TO 30 SECONDS. - lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). - ENDWHILE. - - "Create an ABAP internal table for the container image based on input variables. - lo_primarycontainer = NEW #( iv_image = cv_container_image - iv_modeldataurl = lv_model_data_url ). - - "Create a new model via so_sgm. - ao_sgm->createmodel( iv_modelname = lv_model_name - iv_executionrolearn = av_lrole - io_primarycontainer = lo_primarycontainer ). - - "Test the ao_sgm_actions delete_model method. - ao_sgm_actions->delete_model( lv_model_name ). - - "List the deleted model via so_sgm. - lo_model_list_result = ao_sgm->listmodels( - iv_namecontains = lv_model_name ). - - DATA(lv_found) = abap_false. - - "The model should be deleted. - LOOP AT lo_model_list_result->get_models( ) INTO DATA(lo_models). - IF lo_models->get_modelname( ) = lv_model_name. - lv_found = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_false( - act = lv_found - msg = |Model was not deleted| ). - - "Clean up. - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = cv_train_key ). - - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = cv_val_key ). - - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = lv_model_key ). - - ao_s3->deletebucket( - iv_bucket = lv_bucket_name ). - - ENDMETHOD. - - METHOD create_endpoint. - - DATA lo_hyperparameters_w TYPE REF TO /aws1/cl_sgmhyperparameters_w. - DATA lt_hyperparameters TYPE /aws1/cl_sgmhyperparameters_w=>tt_hyperparameters. - DATA lt_input_data_config TYPE /aws1/cl_sgmchannel=>tt_inputdataconfig. - DATA lo_trn_channel TYPE REF TO /aws1/cl_sgmchannel. - DATA lo_trn_datasource TYPE REF TO /aws1/cl_sgmdatasource. - DATA lo_trn_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. - DATA lo_val_channel TYPE REF TO /aws1/cl_sgmchannel. - DATA lo_val_datasource TYPE REF TO /aws1/cl_sgmdatasource. - DATA lo_val_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. - DATA lo_output_data_config TYPE REF TO /aws1/cl_sgmoutputdataconfig. - DATA lo_resource_config TYPE REF TO /aws1/cl_sgmresourceconfig. - DATA lo_algorithm_specification TYPE REF TO /aws1/cl_sgmalgorithmspec. - DATA lo_list_result TYPE REF TO /aws1/cl_sgmlisttrnjobsrsp. - DATA lo_stopping_condition TYPE REF TO /aws1/cl_sgmstoppingcondition. - DATA lv_training_job_name TYPE /aws1/sgmtrainingjobname. - - DATA lo_result TYPE REF TO /aws1/cl_sgmcreatemodeloutput. - DATA lv_model_name TYPE /aws1/sgmmodelname. - DATA lv_model_data_url TYPE /aws1/sgmurl. - DATA lv_bucket_name TYPE /aws1/s3_bucketname. - DATA lv_file_content TYPE /aws1/s3_streamingblob. - DATA lv_trn_data_s3uri TYPE /aws1/sgms3uri. - DATA lv_val_data_s3uri TYPE /aws1/sgms3uri. - DATA lv_s3_output_path TYPE /aws1/sgms3uri. - DATA lv_model_key TYPE /aws1/s3_objectkey. - DATA lo_training_result TYPE REF TO /aws1/cl_sgmdescrtrnjobrsp. - DATA lo_primarycontainer TYPE REF TO /aws1/cl_sgmcontainerdefn. - DATA lo_model_list_result TYPE REF TO /aws1/cl_sgmlistmodelsoutput. - DATA lv_endpoint_name TYPE /aws1/sgmendpointname. - DATA lv_endpoint_config_name TYPE /aws1/sgmendpointconfigname. - DATA lv_endpoint_variant_name TYPE /aws1/sgmvariantname. - DATA lo_endpoint_output TYPE REF TO /aws1/cl_sgmcreateendptoutput. - DATA lo_endpoint_result TYPE REF TO /aws1/cl_sgmdescrendptoutput. - DATA lv_uuid_16 TYPE sysuuid_x16. - - "Define Amazon S3 parameters. - CONSTANTS cv_container_image TYPE /aws1/sgmcontainerimage VALUE '123456789012.abc.ecr.us-east-1.amazonaws.com/sagemaker-xgboost:1.5-1'. - CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-sgm-'. - CONSTANTS cv_train_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/train/train.libsvm'. - CONSTANTS cv_val_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/validation/validation.libsvm'. - - "Define hyperparameters. - CONSTANTS cv_hp_max_depth TYPE /aws1/sgmhyperparametervalue VALUE '3'. - CONSTANTS cv_hp_scale_pos_weight TYPE /aws1/sgmhyperparametervalue VALUE '2.0'. - CONSTANTS cv_hp_num_round TYPE /aws1/sgmhyperparametervalue VALUE '100'. - CONSTANTS cv_hp_objective TYPE /aws1/sgmhyperparametervalue VALUE 'binary:logistic'. - CONSTANTS cv_hp_subsample TYPE /aws1/sgmhyperparametervalue VALUE '0.5'. - CONSTANTS cv_hp_eta TYPE /aws1/sgmhyperparametervalue VALUE '0.1'. - CONSTANTS cv_hp_eval_metric TYPE /aws1/sgmhyperparametervalue VALUE 'auc'. - - "Define training data. - CONSTANTS cv_trn_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. - CONSTANTS cv_trn_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. - CONSTANTS cv_trn_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. - CONSTANTS cv_trn_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. - - "Define validation data. - CONSTANTS cv_val_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. - CONSTANTS cv_val_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. - CONSTANTS cv_val_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. - CONSTANTS cv_val_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. - - "Define training parameters. - CONSTANTS cv_training_image TYPE /aws1/sgmalgorithmimage VALUE '123456789012.abc.ecr.us-east-1.amazonaws.com/sagemaker-xgboost:1.5-1'. - CONSTANTS cv_training_input_mode TYPE /aws1/sgmtraininginputmode VALUE 'File'. - CONSTANTS cv_instance_count TYPE /aws1/sgmtraininginstancecount VALUE '1'. - CONSTANTS cv_instance_type TYPE /aws1/sgmtraininginstancetype VALUE 'ml.c4.2xlarge'. - CONSTANTS cv_volume_sizeingb TYPE /aws1/sgmvolumesizeingb VALUE '10'. - CONSTANTS cv_max_runtime_in_seconds TYPE /aws1/sgmmaxruntimeinseconds VALUE '1800'. - CONSTANTS cv_max_results TYPE /aws1/sgmmaxresults VALUE '1'. - - "Define endpoint parameters. - CONSTANTS cv_ep_instance_type TYPE /aws1/sgminstancetype VALUE 'ml.m4.xlarge'. - CONSTANTS cv_ep_initial_instance_count TYPE /aws1/sgminitialtaskcount VALUE '1'. - - "Define role ARN. - DATA(lt_roles) = ao_session->get_configuration( )->get_logical_iam_roles( ). - READ TABLE lt_roles INDEX 1 INTO DATA(lo_role). " take first role from the logical role mapping - av_lrole = lo_role-iam_role_arn. - - "Define job name. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_training_job_name = 'code-example-trn-job-' && lv_uuid_16. - TRANSLATE lv_training_job_name TO LOWER CASE. - - "Define model name. - lv_model_name = 'code-example-model-' && lv_uuid_16. - TRANSLATE lv_model_name TO LOWER CASE. - - "Define endpoint name. - lv_endpoint_name = 'code-example-endpoint-' && lv_uuid_16. - lv_endpoint_config_name = 'code-example-endpoint-cfg-' && lv_uuid_16. - lv_endpoint_variant_name = 'code-example-endpoint-variant-' && lv_uuid_16. - - "Create training data in Amazon S3. - lv_bucket_name = cv_bucket_name && lv_uuid_16. - TRANSLATE lv_bucket_name TO LOWER CASE. - zcl_aws1_ex_utils=>create_bucket( iv_bucket = lv_bucket_name - io_s3 = ao_s3 - io_session = ao_session ). - - - lv_trn_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_train_key. - lv_val_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_val_key. - lv_s3_output_path = 's3://' && lv_bucket_name && '/' && 'sagemaker/'. - lv_model_key = 'sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. - lv_model_data_url = 's3://' && lv_bucket_name && '/sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. - - ao_s3->putobject( - iv_bucket = lv_bucket_name - iv_key = cv_train_key - iv_body = av_file_content ). - - ao_s3->putobject( - iv_bucket = lv_bucket_name - iv_key = cv_val_key - iv_body = av_file_content ). - - "Create ABAP internal table for hyperparameters based on input variables. - lo_hyperparameters_w = NEW #( iv_value = cv_hp_max_depth ). - INSERT VALUE #( key = 'max_depth' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_eta ). - INSERT VALUE #( key = 'eta' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_eval_metric ). - INSERT VALUE #( key = 'eval_metric' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_scale_pos_weight ). - INSERT VALUE #( key = 'scale_pos_weight' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_subsample ). - INSERT VALUE #( key = 'subsample' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_objective ). - INSERT VALUE #( key = 'objective' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_num_round ). - INSERT VALUE #( key = 'num_round' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - "Create ABAP objects for data based on input variables. - "Training data. - lo_trn_s3datasource = NEW #( iv_s3datatype = cv_trn_data_s3datatype - iv_s3datadistributiontype = cv_trn_data_s3datadistribution - iv_s3uri = lv_trn_data_s3uri ). - - lo_trn_datasource = NEW #( io_s3datasource = lo_trn_s3datasource ). - - lo_trn_channel = NEW #( iv_channelname = 'train' - io_datasource = lo_trn_datasource - iv_compressiontype = cv_trn_data_compressiontype - iv_contenttype = cv_trn_data_contenttype ). - - INSERT lo_trn_channel INTO TABLE lt_input_data_config. - - "Validation data. - lo_val_s3datasource = NEW #( iv_s3datatype = cv_val_data_s3datatype - iv_s3datadistributiontype = cv_val_data_s3datadistribution - iv_s3uri = lv_val_data_s3uri ). - - lo_val_datasource = NEW #( io_s3datasource = lo_val_s3datasource ). - - lo_val_channel = NEW #( iv_channelname = 'validation' - io_datasource = lo_val_datasource - iv_compressiontype = cv_val_data_compressiontype - iv_contenttype = cv_val_data_contenttype ). - - INSERT lo_val_channel INTO TABLE lt_input_data_config. - - "Create an ABAP object for algorithm specification based on input variables. - lo_algorithm_specification = NEW #( iv_trainingimage = cv_training_image - iv_traininginputmode = cv_training_input_mode ). - - "Create an ABAP object for resource configuration. - lo_resource_config = NEW #( iv_instancecount = cv_instance_count - iv_instancetype = cv_instance_type - iv_volumesizeingb = cv_volume_sizeingb ). - - "Create an ABAP object for output data configuration. - lo_output_data_config = NEW #( iv_s3outputpath = lv_s3_output_path ). - - "Create an ABAP object for stopping condition. - lo_stopping_condition = NEW #( iv_maxruntimeinseconds = cv_max_runtime_in_seconds ). - - "Run method to create a training job. - ao_sgm->createtrainingjob( - iv_trainingjobname = lv_training_job_name - iv_rolearn = av_lrole - it_hyperparameters = lt_hyperparameters - it_inputdataconfig = lt_input_data_config - io_algorithmspecification = lo_algorithm_specification - io_outputdataconfig = lo_output_data_config - io_resourceconfig = lo_resource_config - io_stoppingcondition = lo_stopping_condition ). - - "Wait for training job to be completed. - lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). - WHILE lo_training_result->get_trainingjobstatus( ) <> 'Completed'. - IF sy-index = 30. - EXIT. "maximum 900 seconds - ENDIF. - WAIT UP TO 30 SECONDS. - lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). - ENDWHILE. - - "Create an ABAP internal table for the container image based on input variables. - lo_primarycontainer = NEW #( iv_image = cv_container_image - iv_modeldataurl = lv_model_data_url ). - - "Create a new model via so_sgm. - ao_sgm->createmodel( iv_modelname = lv_model_name - iv_executionrolearn = av_lrole - io_primarycontainer = lo_primarycontainer ). - - "Test the create_endpoint method. - ao_sgm_actions->create_endpoint( EXPORTING iv_model_name = lv_model_name - iv_endpoint_config_name = lv_endpoint_config_name - iv_endpoint_name = lv_endpoint_name - iv_instance_type = cv_ep_instance_type - iv_variant_name = lv_endpoint_variant_name - iv_initial_instance_count = cv_ep_initial_instance_count IMPORTING oo_result = lo_endpoint_output ). - - DATA(lv_found) = abap_false. - - IF lo_endpoint_output->has_endpointarn( ) = 'X'. - lv_found = abap_true. - ENDIF. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Endpoint not found| ). - - "Wait for endpoint creation to be completed. - lo_endpoint_result = ao_sgm->describeendpoint( iv_endpointname = lv_endpoint_name ). - WHILE lo_endpoint_result->get_endpointstatus( ) <> 'InService'. - IF sy-index = 30. - EXIT. "maximum 900 seconds - ENDIF. - WAIT UP TO 30 SECONDS. - lo_endpoint_result = ao_sgm->describeendpoint( iv_endpointname = lv_endpoint_name ). - ENDWHILE. - - "Clean up. - ao_sgm->deleteendpoint( - iv_endpointname = lv_endpoint_name ). - - ao_sgm->deleteendpointconfig( - iv_endpointconfigname = lv_endpoint_config_name ). - - ao_sgm->deletemodel( - iv_modelname = lv_model_name ). - - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = cv_train_key ). - - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = cv_val_key ). - - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = lv_model_key ). - - ao_s3->deletebucket( - iv_bucket = lv_bucket_name ). - - ENDMETHOD. - - METHOD delete_endpoint. - - DATA lo_hyperparameters_w TYPE REF TO /aws1/cl_sgmhyperparameters_w. - DATA lt_hyperparameters TYPE /aws1/cl_sgmhyperparameters_w=>tt_hyperparameters. - DATA lt_input_data_config TYPE /aws1/cl_sgmchannel=>tt_inputdataconfig. - DATA lo_trn_channel TYPE REF TO /aws1/cl_sgmchannel. - DATA lo_trn_datasource TYPE REF TO /aws1/cl_sgmdatasource. - DATA lo_trn_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. - DATA lo_val_channel TYPE REF TO /aws1/cl_sgmchannel. - DATA lo_val_datasource TYPE REF TO /aws1/cl_sgmdatasource. - DATA lo_val_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. - DATA lo_output_data_config TYPE REF TO /aws1/cl_sgmoutputdataconfig. - DATA lo_resource_config TYPE REF TO /aws1/cl_sgmresourceconfig. - DATA lo_algorithm_specification TYPE REF TO /aws1/cl_sgmalgorithmspec. - DATA lo_list_result TYPE REF TO /aws1/cl_sgmlisttrnjobsrsp. - DATA lo_stopping_condition TYPE REF TO /aws1/cl_sgmstoppingcondition. - DATA lv_training_job_name TYPE /aws1/sgmtrainingjobname. - - DATA lo_result TYPE REF TO /aws1/cl_sgmcreatemodeloutput. - DATA lv_model_name TYPE /aws1/sgmmodelname. - DATA lv_model_data_url TYPE /aws1/sgmurl. - DATA lv_bucket_name TYPE /aws1/s3_bucketname. - DATA lv_file_content TYPE /aws1/s3_streamingblob. - DATA lv_trn_data_s3uri TYPE /aws1/sgms3uri. - DATA lv_val_data_s3uri TYPE /aws1/sgms3uri. - DATA lv_s3_output_path TYPE /aws1/sgms3uri. - DATA lv_model_key TYPE /aws1/s3_objectkey. - DATA lo_training_result TYPE REF TO /aws1/cl_sgmdescrtrnjobrsp. - DATA lo_primarycontainer TYPE REF TO /aws1/cl_sgmcontainerdefn. - DATA lo_model_list_result TYPE REF TO /aws1/cl_sgmlistmodelsoutput. - DATA lv_endpoint_name TYPE /aws1/sgmendpointname. - DATA lv_endpoint_config_name TYPE /aws1/sgmendpointconfigname. - DATA lv_endpoint_variant_name TYPE /aws1/sgmvariantname. - DATA lo_endpoint_output TYPE REF TO /aws1/cl_sgmcreateendptoutput. - DATA lo_endpoint_result TYPE REF TO /aws1/cl_sgmdescrendptoutput. - DATA lo_endpoint_list_result TYPE REF TO /aws1/cl_sgmlistendptsoutput. - DATA lv_uuid_16 TYPE sysuuid_x16. - - "Define Amazon S3 parameters. - CONSTANTS cv_container_image TYPE /aws1/sgmcontainerimage VALUE '123456789012.abc.ecr.us-east-1.amazonaws.com/sagemaker-xgboost:1.5-1'. - CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-sgm-'. - CONSTANTS cv_train_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/train/train.libsvm'. - CONSTANTS cv_val_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/validation/validation.libsvm'. - - "Define hyperparameters. - CONSTANTS cv_hp_max_depth TYPE /aws1/sgmhyperparametervalue VALUE '3'. - CONSTANTS cv_hp_scale_pos_weight TYPE /aws1/sgmhyperparametervalue VALUE '2.0'. - CONSTANTS cv_hp_num_round TYPE /aws1/sgmhyperparametervalue VALUE '100'. - CONSTANTS cv_hp_objective TYPE /aws1/sgmhyperparametervalue VALUE 'binary:logistic'. - CONSTANTS cv_hp_subsample TYPE /aws1/sgmhyperparametervalue VALUE '0.5'. - CONSTANTS cv_hp_eta TYPE /aws1/sgmhyperparametervalue VALUE '0.1'. - CONSTANTS cv_hp_eval_metric TYPE /aws1/sgmhyperparametervalue VALUE 'auc'. - - "Define training data. - CONSTANTS cv_trn_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. - CONSTANTS cv_trn_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. - CONSTANTS cv_trn_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. - CONSTANTS cv_trn_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. - - "Define validation data. - CONSTANTS cv_val_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. - CONSTANTS cv_val_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. - CONSTANTS cv_val_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. - CONSTANTS cv_val_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. - - "Define training parameters. - CONSTANTS cv_training_image TYPE /aws1/sgmalgorithmimage VALUE '123456789012.abc.ecr.us-east-1.amazonaws.com/sagemaker-xgboost:1.5-1'. - CONSTANTS cv_training_input_mode TYPE /aws1/sgmtraininginputmode VALUE 'File'. - CONSTANTS cv_instance_count TYPE /aws1/sgmtraininginstancecount VALUE '1'. - CONSTANTS cv_instance_type TYPE /aws1/sgmtraininginstancetype VALUE 'ml.c4.2xlarge'. - CONSTANTS cv_volume_sizeingb TYPE /aws1/sgmvolumesizeingb VALUE '10'. - CONSTANTS cv_max_runtime_in_seconds TYPE /aws1/sgmmaxruntimeinseconds VALUE '1800'. - CONSTANTS cv_max_results TYPE /aws1/sgmmaxresults VALUE '1'. - - "Define endpoint parameters. - CONSTANTS cv_ep_instance_type TYPE /aws1/sgminstancetype VALUE 'ml.m4.xlarge'. - CONSTANTS cv_ep_initial_instance_count TYPE /aws1/sgminitialtaskcount VALUE '1'. - - "Define role ARN. - DATA(lt_roles) = ao_session->get_configuration( )->get_logical_iam_roles( ). - READ TABLE lt_roles INDEX 1 INTO DATA(lo_role). " take first role from the logical role mapping - av_lrole = lo_role-iam_role_arn. - - "Define job name. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_training_job_name = 'code-example-trn-job-' && lv_uuid_16. - TRANSLATE lv_training_job_name TO LOWER CASE. - - "Define model name. - lv_model_name = 'code-example-model-' && lv_uuid_16. - TRANSLATE lv_model_name TO LOWER CASE. - - "Define endpoint name. - lv_endpoint_name = 'code-example-endpoint-' && lv_uuid_16. - lv_endpoint_config_name = 'code-example-endpoint-cfg-' && lv_uuid_16. - lv_endpoint_variant_name = 'code-example-endpoint-variant-' && lv_uuid_16. - - "Create training data in Amazon S3. - lv_bucket_name = cv_bucket_name && lv_uuid_16. - TRANSLATE lv_bucket_name TO LOWER CASE. - zcl_aws1_ex_utils=>create_bucket( iv_bucket = lv_bucket_name - io_s3 = ao_s3 - io_session = ao_session ). - - - lv_trn_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_train_key. - lv_val_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_val_key. - lv_s3_output_path = 's3://' && lv_bucket_name && '/' && 'sagemaker/'. - lv_model_key = 'sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. - lv_model_data_url = 's3://' && lv_bucket_name && '/sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. - - ao_s3->putobject( - iv_bucket = lv_bucket_name - iv_key = cv_train_key - iv_body = av_file_content ). - - ao_s3->putobject( - iv_bucket = lv_bucket_name - iv_key = cv_val_key - iv_body = av_file_content ). - - "Create ABAP internal table for hyperparameters based on input variables. - lo_hyperparameters_w = NEW #( iv_value = cv_hp_max_depth ). - INSERT VALUE #( key = 'max_depth' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_eta ). - INSERT VALUE #( key = 'eta' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_eval_metric ). - INSERT VALUE #( key = 'eval_metric' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_scale_pos_weight ). - INSERT VALUE #( key = 'scale_pos_weight' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_subsample ). - INSERT VALUE #( key = 'subsample' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_objective ). - INSERT VALUE #( key = 'objective' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_num_round ). - INSERT VALUE #( key = 'num_round' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - "Create ABAP objects for data based on input variables. - "Training data. - lo_trn_s3datasource = NEW #( iv_s3datatype = cv_trn_data_s3datatype - iv_s3datadistributiontype = cv_trn_data_s3datadistribution - iv_s3uri = lv_trn_data_s3uri ). - - lo_trn_datasource = NEW #( io_s3datasource = lo_trn_s3datasource ). - - lo_trn_channel = NEW #( iv_channelname = 'train' - io_datasource = lo_trn_datasource - iv_compressiontype = cv_trn_data_compressiontype - iv_contenttype = cv_trn_data_contenttype ). - - INSERT lo_trn_channel INTO TABLE lt_input_data_config. - - "Validation data. - lo_val_s3datasource = NEW #( iv_s3datatype = cv_val_data_s3datatype - iv_s3datadistributiontype = cv_val_data_s3datadistribution - iv_s3uri = lv_val_data_s3uri ). - - lo_val_datasource = NEW #( io_s3datasource = lo_val_s3datasource ). - - lo_val_channel = NEW #( iv_channelname = 'validation' - io_datasource = lo_val_datasource - iv_compressiontype = cv_val_data_compressiontype - iv_contenttype = cv_val_data_contenttype ). - - INSERT lo_val_channel INTO TABLE lt_input_data_config. - - "Create an ABAP object for algorithm specification based on input variables. - lo_algorithm_specification = NEW #( iv_trainingimage = cv_training_image - iv_traininginputmode = cv_training_input_mode ). - - "Create an ABAP object for resource configuration. - lo_resource_config = NEW #( iv_instancecount = cv_instance_count - iv_instancetype = cv_instance_type - iv_volumesizeingb = cv_volume_sizeingb ). - - "Create an ABAP object for output data configuration. - lo_output_data_config = NEW #( iv_s3outputpath = lv_s3_output_path ). - - "Create an ABAP object for stopping condition. - lo_stopping_condition = NEW #( iv_maxruntimeinseconds = cv_max_runtime_in_seconds ). - - "Run method to create a training job. - ao_sgm->createtrainingjob( - iv_trainingjobname = lv_training_job_name - iv_rolearn = av_lrole - it_hyperparameters = lt_hyperparameters - it_inputdataconfig = lt_input_data_config - io_algorithmspecification = lo_algorithm_specification - io_outputdataconfig = lo_output_data_config - io_resourceconfig = lo_resource_config - io_stoppingcondition = lo_stopping_condition ). - - "Wait for training job to be completed. - lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). - WHILE lo_training_result->get_trainingjobstatus( ) <> 'Completed'. - IF sy-index = 30. - EXIT. "maximum 900 seconds - ENDIF. - WAIT UP TO 30 SECONDS. - lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). - ENDWHILE. - - "Create an ABAP internal table for the container image based on input variables. - lo_primarycontainer = NEW #( iv_image = cv_container_image - iv_modeldataurl = lv_model_data_url ). - - "Create a new model via so_sgm. - ao_sgm->createmodel( iv_modelname = lv_model_name - iv_executionrolearn = av_lrole - io_primarycontainer = lo_primarycontainer ). - - "Create an endpoint. - DATA lt_production_variants TYPE /aws1/cl_sgmproductionvariant=>tt_productionvariantlist. - DATA lo_production_variants TYPE REF TO /aws1/cl_sgmproductionvariant. - DATA lo_ep_config_result TYPE REF TO /aws1/cl_sgmcreateendptcfgout. - - - lo_production_variants = NEW #( iv_variantname = lv_endpoint_variant_name - iv_modelname = lv_model_name - iv_initialinstancecount = cv_ep_initial_instance_count - iv_instancetype = cv_ep_instance_type ). - - INSERT lo_production_variants INTO TABLE lt_production_variants. - - "Create an endpoint configuration. - lo_ep_config_result = ao_sgm->createendpointconfig( - iv_endpointconfigname = lv_endpoint_config_name - it_productionvariants = lt_production_variants ). - - "Create an endpoint. - lo_endpoint_output = ao_sgm->createendpoint( - iv_endpointconfigname = lv_endpoint_config_name - iv_endpointname = lv_endpoint_name ). - - DATA(lv_found) = abap_false. - - IF lo_endpoint_output->has_endpointarn( ) = 'X'. - lv_found = abap_true. - ENDIF. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Endpoint not found| ). - - "Wait for endpoint creation to be completed. - lo_endpoint_result = ao_sgm->describeendpoint( iv_endpointname = lv_endpoint_name ). - WHILE lo_endpoint_result->get_endpointstatus( ) <> 'InService'. - IF sy-index = 30. - EXIT. "maximum 900 seconds - ENDIF. - WAIT UP TO 30 SECONDS. - lo_endpoint_result = ao_sgm->describeendpoint( iv_endpointname = lv_endpoint_name ). - ENDWHILE. - - "Testing. - ao_sgm_actions->delete_endpoint( - iv_endpoint_name = lv_endpoint_name - iv_endpoint_config_name = lv_endpoint_config_name ). - - WAIT UP TO 30 SECONDS. - - "Check if endpoint exists. - lo_endpoint_list_result = ao_sgm->listendpoints( - iv_namecontains = lv_endpoint_name ). - - lv_found = abap_false. - - "The endpoint should be deleted. - LOOP AT lo_endpoint_list_result->get_endpoints( ) INTO DATA(lo_endpoints). - IF lo_endpoints->get_endpointname( ) = lv_endpoint_name. - lv_found = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_false( - act = lv_found - msg = |Endpoint was not deleted| ). - - "Cleaning up via ao_sgm. - ao_sgm->deletemodel( - iv_modelname = lv_model_name ). - - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = cv_train_key ). - - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = cv_val_key ). - - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = lv_model_key ). - - ao_s3->deletebucket( - iv_bucket = lv_bucket_name ). - - - ENDMETHOD. - - METHOD list_notebook_instances. - - DATA lo_list_result TYPE REF TO /aws1/cl_sgmlstnotebookinsts01. - DATA lv_notebook_name TYPE /aws1/sgmnotebookinstancename. - DATA lo_notebook_result TYPE REF TO /aws1/cl_sgmdscnotebookinstout. - - DATA lv_uuid_16 TYPE sysuuid_x16. - - CONSTANTS cv_instancetype TYPE /aws1/sgminstancetype VALUE 'ml.t3.medium'. - - "Define ARN. - DATA(lt_roles) = ao_session->get_configuration( )->get_logical_iam_roles( ). - READ TABLE lt_roles INDEX 1 INTO DATA(lo_role). " take first role from the logical role mapping - av_lrole = lo_role-iam_role_arn. - - "Define notebook name. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_notebook_name = 'code-example-sgm-notebook-' && lv_uuid_16. - - "Create a notebook instance. - ao_sgm->createnotebookinstance( - iv_notebookinstancename = lv_notebook_name - iv_instancetype = cv_instancetype - iv_rolearn = av_lrole ). - - "Waiter. - lo_notebook_result = ao_sgm->describenotebookinstance( iv_notebookinstancename = lv_notebook_name ). - WHILE lo_notebook_result->get_notebookinstancestatus( ) <> 'InService'. - IF sy-index = 30. - EXIT. "maximum 900 seconds - ENDIF. - WAIT UP TO 30 SECONDS. - lo_notebook_result = ao_sgm->describenotebookinstance( iv_notebookinstancename = lv_notebook_name ). - ENDWHILE. - - " Test the list notebook instance. - ao_sgm_actions->list_notebook_instances( - EXPORTING - iv_name_contains = lv_notebook_name - IMPORTING - oo_result = lo_list_result ). - - DATA(lv_found) = abap_false. - - LOOP AT lo_list_result->get_notebookinstances( ) INTO DATA(lo_notebook). - IF lo_notebook->get_notebookinstancename( ) = lv_notebook_name. - lv_found = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Notebook cannot be found| ). - - "Stop notebook instance before deletion. - ao_sgm->stopnotebookinstance( - iv_notebookinstancename = lv_notebook_name ). - - "Waiter. - lo_notebook_result = ao_sgm->describenotebookinstance( iv_notebookinstancename = lv_notebook_name ). - WHILE lo_notebook_result->get_notebookinstancestatus( ) <> 'Stopped'. - IF sy-index = 30. - EXIT. "maximum 10 minutes - ENDIF. - WAIT UP TO 30 SECONDS. - lo_notebook_result = ao_sgm->describenotebookinstance( iv_notebookinstancename = lv_notebook_name ). - ENDWHILE. - - "Delete notebook. - ao_sgm->deletenotebookinstance( - iv_notebookinstancename = lv_notebook_name ). - - ENDMETHOD. - - METHOD create_transform_job. - - DATA lo_hyperparameters_w TYPE REF TO /aws1/cl_sgmhyperparameters_w. - DATA lt_hyperparameters TYPE /aws1/cl_sgmhyperparameters_w=>tt_hyperparameters. - DATA lt_input_data_config TYPE /aws1/cl_sgmchannel=>tt_inputdataconfig. - DATA lo_trn_channel TYPE REF TO /aws1/cl_sgmchannel. - DATA lo_trn_datasource TYPE REF TO /aws1/cl_sgmdatasource. - DATA lo_trn_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. - DATA lo_val_channel TYPE REF TO /aws1/cl_sgmchannel. - DATA lo_val_datasource TYPE REF TO /aws1/cl_sgmdatasource. - DATA lo_val_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. - DATA lo_output_data_config TYPE REF TO /aws1/cl_sgmoutputdataconfig. - DATA lo_resource_config TYPE REF TO /aws1/cl_sgmresourceconfig. - DATA lo_algorithm_specification TYPE REF TO /aws1/cl_sgmalgorithmspec. - DATA lo_list_result TYPE REF TO /aws1/cl_sgmlisttrnjobsrsp. - DATA lo_stopping_condition TYPE REF TO /aws1/cl_sgmstoppingcondition. - DATA lv_training_job_name TYPE /aws1/sgmtrainingjobname. - - DATA lo_result TYPE REF TO /aws1/cl_sgmcreatemodeloutput. - DATA lv_model_name TYPE /aws1/sgmmodelname. - DATA lv_model_data_url TYPE /aws1/sgmurl. - DATA lv_bucket_name TYPE /aws1/s3_bucketname. - DATA lv_file_content TYPE /aws1/s3_streamingblob. - DATA lv_trn_data_s3uri TYPE /aws1/sgms3uri. - DATA lv_val_data_s3uri TYPE /aws1/sgms3uri. - DATA lv_s3_output_path TYPE /aws1/sgms3uri. - DATA lv_s3_transform_output_path TYPE /aws1/sgms3uri. - DATA lv_model_key TYPE /aws1/s3_objectkey. - DATA lo_training_result TYPE REF TO /aws1/cl_sgmdescrtrnjobrsp. - DATA lo_primarycontainer TYPE REF TO /aws1/cl_sgmcontainerdefn. - DATA lo_model_list_result TYPE REF TO /aws1/cl_sgmlistmodelsoutput. - DATA lo_tf_result TYPE REF TO /aws1/cl_sgmcretransformjobrsp. - DATA lv_transform_job_name TYPE /aws1/sgmtransformjobname. - DATA lv_transform_data_s3uri TYPE /aws1/sgms3uri. - DATA lv_uuid_16 TYPE sysuuid_x16. - - "Define Amazon S3 parameters. - CONSTANTS cv_container_image TYPE /aws1/sgmcontainerimage VALUE '123456789012.abc.ecr.us-east-1.amazonaws.com/sagemaker-xgboost:1.5-1'. - CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-sgm-'. - CONSTANTS cv_transform_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/transform/transform.libsvm'. - CONSTANTS cv_train_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/train/train.libsvm'. - CONSTANTS cv_val_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/validation/validation.libsvm'. - - "Define hyperparameters. - CONSTANTS cv_hp_max_depth TYPE /aws1/sgmhyperparametervalue VALUE '3'. - CONSTANTS cv_hp_scale_pos_weight TYPE /aws1/sgmhyperparametervalue VALUE '2.0'. - CONSTANTS cv_hp_num_round TYPE /aws1/sgmhyperparametervalue VALUE '100'. - CONSTANTS cv_hp_objective TYPE /aws1/sgmhyperparametervalue VALUE 'binary:logistic'. - CONSTANTS cv_hp_subsample TYPE /aws1/sgmhyperparametervalue VALUE '0.5'. - CONSTANTS cv_hp_eta TYPE /aws1/sgmhyperparametervalue VALUE '0.1'. - CONSTANTS cv_hp_eval_metric TYPE /aws1/sgmhyperparametervalue VALUE 'auc'. - - "Define training data. - CONSTANTS cv_trn_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. - CONSTANTS cv_trn_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. - CONSTANTS cv_trn_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. - CONSTANTS cv_trn_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. - - "Define validation data. - CONSTANTS cv_val_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. - CONSTANTS cv_val_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. - CONSTANTS cv_val_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. - CONSTANTS cv_val_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. - - "Define training parameters. - CONSTANTS cv_training_image TYPE /aws1/sgmalgorithmimage VALUE '123456789012.abc.ecr.us-east-1.amazonaws.com/sagemaker-xgboost:1.5-1'. - CONSTANTS cv_training_input_mode TYPE /aws1/sgmtraininginputmode VALUE 'File'. - CONSTANTS cv_instance_count TYPE /aws1/sgmtraininginstancecount VALUE '1'. - CONSTANTS cv_instance_type TYPE /aws1/sgmtraininginstancetype VALUE 'ml.c4.2xlarge'. - CONSTANTS cv_volume_sizeingb TYPE /aws1/sgmvolumesizeingb VALUE '10'. - CONSTANTS cv_max_runtime_in_seconds TYPE /aws1/sgmmaxruntimeinseconds VALUE '1800'. - CONSTANTS cv_max_results TYPE /aws1/sgmmaxresults VALUE '1'. - - "Define transform data. - CONSTANTS cv_tf_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. - CONSTANTS cv_tf_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. - CONSTANTS cv_tf_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. - - "Define transform parameters. - CONSTANTS cv_tf_instance_count TYPE /aws1/sgmtraininginstancecount VALUE '1'. - CONSTANTS cv_tf_instance_type TYPE /aws1/sgmtraininginstancetype VALUE 'ml.c4.2xlarge'. - - "Define role ARN. - DATA(lt_roles) = ao_session->get_configuration( )->get_logical_iam_roles( ). - READ TABLE lt_roles INDEX 1 INTO DATA(lo_role). " take first role from the logical role mapping - av_lrole = lo_role-iam_role_arn. - - "Define job name. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_training_job_name = 'code-example-trn-job-' && lv_uuid_16. - TRANSLATE lv_training_job_name TO LOWER CASE. - - "Define model name. - lv_model_name = 'code-example-model-' && lv_uuid_16. - TRANSLATE lv_model_name TO LOWER CASE. - - "Define job name. - lv_transform_job_name = 'code-example-transform-job-' && lv_uuid_16. - TRANSLATE lv_transform_job_name TO LOWER CASE. - - "Create training data in Amazon S3. - lv_bucket_name = cv_bucket_name && lv_uuid_16. - TRANSLATE lv_bucket_name TO LOWER CASE. - zcl_aws1_ex_utils=>create_bucket( iv_bucket = lv_bucket_name - io_s3 = ao_s3 - io_session = ao_session ). - - - lv_trn_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_train_key. - lv_val_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_val_key. - lv_transform_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_transform_key. - lv_s3_output_path = 's3://' && lv_bucket_name && '/' && 'sagemaker/'. - lv_s3_transform_output_path = 's3://' && lv_bucket_name && '/' && 'sagemaker/transform/'. - lv_model_key = 'sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. - lv_model_data_url = 's3://' && lv_bucket_name && '/sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. - - ao_s3->putobject( - iv_bucket = lv_bucket_name - iv_key = cv_train_key - iv_body = av_file_content ). - - ao_s3->putobject( - iv_bucket = lv_bucket_name - iv_key = cv_val_key - iv_body = av_file_content ). - - ao_s3->putobject( - iv_bucket = lv_bucket_name - iv_key = cv_transform_key - iv_body = av_file_content ). - - "Create ABAP internal table for hyperparameters based on input variables. - lo_hyperparameters_w = NEW #( iv_value = cv_hp_max_depth ). - INSERT VALUE #( key = 'max_depth' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_eta ). - INSERT VALUE #( key = 'eta' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_eval_metric ). - INSERT VALUE #( key = 'eval_metric' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_scale_pos_weight ). - INSERT VALUE #( key = 'scale_pos_weight' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_subsample ). - INSERT VALUE #( key = 'subsample' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_objective ). - INSERT VALUE #( key = 'objective' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = cv_hp_num_round ). - INSERT VALUE #( key = 'num_round' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - "Create ABAP internal table for data based on input variables. - "Training data. - lo_trn_s3datasource = NEW #( iv_s3datatype = cv_trn_data_s3datatype - iv_s3datadistributiontype = cv_trn_data_s3datadistribution - iv_s3uri = lv_trn_data_s3uri ). - - lo_trn_datasource = NEW #( io_s3datasource = lo_trn_s3datasource ). - - lo_trn_channel = NEW #( iv_channelname = 'train' - io_datasource = lo_trn_datasource - iv_compressiontype = cv_trn_data_compressiontype - iv_contenttype = cv_trn_data_contenttype ). - - INSERT lo_trn_channel INTO TABLE lt_input_data_config. - - "Validation data. - lo_val_s3datasource = NEW #( iv_s3datatype = cv_val_data_s3datatype - iv_s3datadistributiontype = cv_val_data_s3datadistribution - iv_s3uri = lv_val_data_s3uri ). - - lo_val_datasource = NEW #( io_s3datasource = lo_val_s3datasource ). - - lo_val_channel = NEW #( iv_channelname = 'validation' - io_datasource = lo_val_datasource - iv_compressiontype = cv_val_data_compressiontype - iv_contenttype = cv_val_data_contenttype ). - - INSERT lo_val_channel INTO TABLE lt_input_data_config. - - "Create an ABAP object for algorithm specification based on input variables. - lo_algorithm_specification = NEW #( iv_trainingimage = cv_training_image - iv_traininginputmode = cv_training_input_mode ). - - "Create an ABAP object for resource configuration. - lo_resource_config = NEW #( iv_instancecount = cv_instance_count - iv_instancetype = cv_instance_type - iv_volumesizeingb = cv_volume_sizeingb ). - - "Create an ABAP object for output data configuration. - lo_output_data_config = NEW #( iv_s3outputpath = lv_s3_output_path ). - - "Create an ABAP object for stopping condition. - lo_stopping_condition = NEW #( iv_maxruntimeinseconds = cv_max_runtime_in_seconds ). - - "Create a training job. - ao_sgm->createtrainingjob( - iv_trainingjobname = lv_training_job_name - iv_rolearn = av_lrole - it_hyperparameters = lt_hyperparameters - it_inputdataconfig = lt_input_data_config - io_algorithmspecification = lo_algorithm_specification - io_outputdataconfig = lo_output_data_config - io_resourceconfig = lo_resource_config - io_stoppingcondition = lo_stopping_condition ). - - "Wait for training job to be completed. - lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). - WHILE lo_training_result->get_trainingjobstatus( ) <> 'Completed'. - IF sy-index = 30. - EXIT. "maximum 900 seconds - ENDIF. - WAIT UP TO 30 SECONDS. - lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). - ENDWHILE. - - "Create an ABAP object for the container image based on input variables. - lo_primarycontainer = NEW #( iv_image = cv_container_image - iv_modeldataurl = lv_model_data_url ). - - "Create a new model. - ao_sgm->createmodel( iv_modelname = lv_model_name - iv_executionrolearn = av_lrole - io_primarycontainer = lo_primarycontainer ). - - ao_sgm_actions->create_transform_job( - EXPORTING - iv_tf_model_name = lv_model_name - iv_tf_job_name = lv_transform_job_name - iv_tf_data_s3datatype = cv_tf_data_s3datatype - iv_tf_data_s3uri = lv_transform_data_s3uri - iv_tf_data_compressiontype = cv_tf_data_compressiontype - iv_tf_data_contenttype = cv_tf_data_contenttype - iv_instance_count = cv_tf_instance_count - iv_instance_type = cv_tf_instance_type - iv_s3_output_path = lv_s3_transform_output_path - IMPORTING - oo_result = lo_tf_result ). - - DATA(lv_found) = abap_false. - - IF lo_tf_result->has_transformjobarn( ) = 'X'. - lv_found = abap_true. - ENDIF. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Transform Job cannot be found| ). - - "Transform jobs and logs cannot be deleted and are retained indefinitely. - - "Clean up. - ao_sgm->deletemodel( - iv_modelname = lv_model_name ). - - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = cv_train_key ). - - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = cv_val_key ). - - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = cv_transform_key ). - - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = lv_model_key ). - - ao_s3->deletebucket( - iv_bucket = lv_bucket_name ). - - ENDMETHOD. - - METHOD list_algorithms. - - DATA lv_algorithm_name TYPE /aws1/sgmentityname. - DATA lo_trainingspecification TYPE REF TO /aws1/cl_sgmtrainingspec. - DATA lo_sgmchannelspec TYPE REF TO /aws1/cl_sgmchannelspec. - DATA lt_sgmchannelspec TYPE /aws1/cl_sgmchannelspec=>tt_channelspecifications. - DATA lo_sgmtrninstancetypes_w TYPE REF TO /aws1/cl_sgmtrninstancetypes_w. - DATA lt_supportedtrninstancetypes TYPE /aws1/cl_sgmtrninstancetypes_w=>tt_traininginstancetypes. - DATA lo_algorithms_result TYPE REF TO /aws1/cl_sgmlistalgsoutput. - DATA lv_instance_type TYPE /aws1/sgmtraininginstancetype. - DATA lo_sgmcontenttypes_w TYPE REF TO /aws1/cl_sgmcontenttypes_w. - DATA lt_supportedcontenttypes TYPE /aws1/cl_sgmcontenttypes_w=>tt_contenttypes. - DATA lo_sgmcompressiontypes_w TYPE REF TO /aws1/cl_sgmcompressiontypes_w. - DATA lt_supportedcompressiontypes TYPE /aws1/cl_sgmcompressiontypes_w=>tt_compressiontypes. - DATA lo_supportedinputmodes TYPE REF TO /aws1/cl_sgminputmodes_w. - DATA lt_supportedinputmodes TYPE /aws1/cl_sgminputmodes_w=>tt_inputmodes. - DATA lo_des_algorithm_result TYPE REF TO /aws1/cl_sgmdescribealgoutput. - - DATA lv_uuid_16 TYPE sysuuid_x16. - - CONSTANTS cv_container_image TYPE /aws1/sgmcontainerimage VALUE '123456789012.abc.ecr.us-east-1.amazonaws.com/sagemaker-xgboost:1.5-1'. - - "Define name. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_algorithm_name = 'code-example-algorithm-' && lv_uuid_16. - TRANSLATE lv_algorithm_name TO LOWER CASE. - - "Define training specification. - lo_sgmtrninstancetypes_w = NEW #( iv_value = 'ml.m5.large' ). - INSERT lo_sgmtrninstancetypes_w INTO TABLE lt_supportedtrninstancetypes. - - lo_sgmcontenttypes_w = NEW #( iv_value = 'S3Prefix' ). - INSERT lo_sgmcontenttypes_w INTO TABLE lt_supportedcontenttypes. - - lo_sgmcompressiontypes_w = NEW #( iv_value = 'None' ). - INSERT lo_sgmcompressiontypes_w INTO TABLE lt_supportedcompressiontypes. - - lo_supportedinputmodes = NEW #( iv_value = 'File' ). - INSERT lo_supportedinputmodes INTO TABLE lt_supportedinputmodes. - - lo_sgmchannelspec = NEW #( iv_name = 'train' - it_supportedcontenttypes = lt_supportedcontenttypes - it_supportedcompressiontypes = lt_supportedcompressiontypes - it_supportedinputmodes = lt_supportedinputmodes - iv_isrequired = ' ' ). - - INSERT lo_sgmchannelspec INTO TABLE lt_sgmchannelspec. - - lo_trainingspecification = NEW #( iv_trainingimage = cv_container_image - it_supportedtrninstancetypes = lt_supportedtrninstancetypes - it_trainingchannels = lt_sgmchannelspec ). - - "Create algorithm. - ao_sgm->createalgorithm( - iv_algorithmname = lv_algorithm_name - io_trainingspecification = lo_trainingspecification ). - - "Testing list algorithm. - ao_sgm_actions->list_algorithms( - EXPORTING - iv_name_contains = lv_algorithm_name - IMPORTING - oo_result = lo_algorithms_result ). - - "Validation. - DATA(lv_found) = abap_false. - - LOOP AT lo_algorithms_result->get_algorithmsummarylist( ) INTO DATA(lo_algorithms). - IF lo_algorithms->get_algorithmname( ) = lv_algorithm_name. - lv_found = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Algorithm cannot be found| ). - - "Waiter. - lo_des_algorithm_result = ao_sgm->describealgorithm( iv_algorithmname = lv_algorithm_name ). - WHILE lo_des_algorithm_result->get_algorithmstatus( ) <> 'Completed'. - IF sy-index = 30. - EXIT. "maximum 900 seconds - ENDIF. - WAIT UP TO 30 SECONDS. - lo_des_algorithm_result = ao_sgm->describealgorithm( iv_algorithmname = lv_algorithm_name ). - ENDWHILE. - - "Clean up. - ao_sgm->deletealgorithm( - iv_algorithmname = lv_algorithm_name ). - - ENDMETHOD. - -ENDCLASS. diff --git a/sap-abap/services/sagemaker/zcl_aws1_sgm_actions.clas.xml b/sap-abap/services/sagemaker/zcl_aws1_sgm_actions.clas.xml deleted file mode 100644 index 5c556213500..00000000000 --- a/sap-abap/services/sagemaker/zcl_aws1_sgm_actions.clas.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - ZCL_AWS1_SGM_ACTIONS - E - SageMaker Code Example Actions - 1 - X - X - X - X - - - - CREATE_ENDPOINT - E - Create an endpoint in SageMaker. - - - CREATE_MODEL - E - Create a model in SageMaker. - - - CREATE_TRAINING_JOB - E - Create a training job in SageMaker. - - - CREATE_TRANSFORM_JOB - E - Create a tranform job in SageMaker. - - - DELETE_ENDPOINT - E - Create a model in SageMaker. - - - DELETE_MODEL - E - List training jobs in SageMaker. - - - DESCRIBE_TRAINING_JOB - E - Describe training job in SageMaker. - - - LIST_ALGORITHMS - E - List algorithms in SageMaker. - - - LIST_MODELS - E - List training jobs in SageMaker. - - - LIST_NOTEBOOK_INSTANCES - E - List notebook instances in SageMaker. - - - LIST_TRAINING_JOBS - E - List training jobs in SageMaker. - - - - - diff --git a/sap-abap/services/sagemaker/zcl_aws1_sgm_scenario.clas.abap b/sap-abap/services/sagemaker/zcl_aws1_sgm_scenario.clas.abap deleted file mode 100644 index f12a129f586..00000000000 --- a/sap-abap/services/sagemaker/zcl_aws1_sgm_scenario.clas.abap +++ /dev/null @@ -1,259 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS zcl_aws1_sgm_scenario DEFINITION - PUBLIC - FINAL - CREATE PUBLIC . - - PUBLIC SECTION. - - METHODS getting_started_with_sgm - IMPORTING - !iv_training_job_name TYPE /aws1/sgmtrainingjobname - !iv_role_arn TYPE /aws1/sgmrolearn - !iv_trn_data_s3datatype TYPE /aws1/sgms3datatype - !iv_trn_data_s3datadistribution TYPE /aws1/sgms3datadistribution - !iv_trn_data_s3uri TYPE /aws1/sgms3uri - !iv_trn_data_compressiontype TYPE /aws1/sgmcompressiontype - !iv_trn_data_contenttype TYPE /aws1/sgmcontenttype - !iv_val_data_s3datatype TYPE /aws1/sgms3datatype - !iv_val_data_s3datadistribution TYPE /aws1/sgms3datadistribution - !iv_val_data_s3uri TYPE /aws1/sgms3uri - !iv_val_data_compressiontype TYPE /aws1/sgmcompressiontype - !iv_val_data_contenttype TYPE /aws1/sgmcontenttype - !iv_hp_max_depth TYPE /aws1/sgmhyperparametervalue - !iv_hp_scale_pos_weight TYPE /aws1/sgmhyperparametervalue - !iv_hp_num_round TYPE /aws1/sgmhyperparametervalue - !iv_hp_objective TYPE /aws1/sgmhyperparametervalue - !iv_hp_subsample TYPE /aws1/sgmhyperparametervalue - !iv_hp_eval_metric TYPE /aws1/sgmhyperparametervalue - !iv_hp_eta TYPE /aws1/sgmhyperparametervalue - !iv_training_image TYPE /aws1/sgmalgorithmimage - !iv_training_input_mode TYPE /aws1/sgmtraininginputmode - !iv_instance_count TYPE /aws1/sgmtraininginstancecount - !iv_instance_type TYPE /aws1/sgmtraininginstancetype - !iv_volume_sizeingb TYPE /aws1/sgmvolumesizeingb - !iv_s3_output_path TYPE /aws1/sgms3uri - !iv_max_runtime_in_seconds TYPE /aws1/sgmmaxruntimeinseconds - !iv_ep_instance_type TYPE /aws1/sgminstancetype - !iv_ep_initial_instance_count TYPE /aws1/sgminitialtaskcount - !iv_model_name TYPE /aws1/sgmmodelname - !iv_ep_name TYPE /aws1/sgmendpointname - !iv_ep_cfg_name TYPE /aws1/sgmendpointconfigname - !iv_ep_variant_name TYPE /aws1/sgmvariantname - EXPORTING - !oo_ep_output TYPE REF TO /aws1/cl_sgmcreateendptoutput . - PROTECTED SECTION. - PRIVATE SECTION. -ENDCLASS. - - - -CLASS ZCL_AWS1_SGM_SCENARIO IMPLEMENTATION. - - - METHOD getting_started_with_sgm. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sgm) = /aws1/cl_sgm_factory=>create( lo_session ). - - "This example scenario contains the following actions:" - " 1. Model training. " - " 2. Model creation. " - " 3. Create endpoint configuration. " - " 4. Create endpoint. " - " 5. Delete endpoint. " - " 6. Delete endpoint configuration. " - " 7. Delete model. " - - "snippet-start:[sgm.abapv1.getting_started_with_sgm] - - DATA lo_hyperparameters_w TYPE REF TO /aws1/cl_sgmhyperparameters_w. - DATA lo_trn_channel TYPE REF TO /aws1/cl_sgmchannel. - DATA lo_trn_datasource TYPE REF TO /aws1/cl_sgmdatasource. - DATA lo_trn_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. - DATA lo_val_channel TYPE REF TO /aws1/cl_sgmchannel. - DATA lo_val_datasource TYPE REF TO /aws1/cl_sgmdatasource. - DATA lo_val_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. - DATA lo_algorithm_specification TYPE REF TO /aws1/cl_sgmalgorithmspec. - DATA lo_resource_config TYPE REF TO /aws1/cl_sgmresourceconfig. - DATA lo_output_data_config TYPE REF TO /aws1/cl_sgmoutputdataconfig. - DATA lo_stopping_condition TYPE REF TO /aws1/cl_sgmstoppingcondition. - DATA lo_primarycontainer TYPE REF TO /aws1/cl_sgmcontainerdefn. - DATA lo_production_variants TYPE REF TO /aws1/cl_sgmproductionvariant. - DATA lo_ep_config_result TYPE REF TO /aws1/cl_sgmcreateendptcfgout. - DATA lo_training_result TYPE REF TO /aws1/cl_sgmdescrtrnjobrsp. - DATA lt_production_variants TYPE /aws1/cl_sgmproductionvariant=>tt_productionvariantlist. - DATA lt_input_data_config TYPE /aws1/cl_sgmchannel=>tt_inputdataconfig. - DATA lt_hyperparameters TYPE /aws1/cl_sgmhyperparameters_w=>tt_hyperparameters. - DATA lv_model_data_url TYPE /aws1/sgmurl. - - lv_model_data_url = iv_s3_output_path && iv_training_job_name && '/output/model.tar.gz'. - - "Create ABAP internal table for hyperparameters based on input variables." - "These hyperparameters are based on Amazon SageMaker built-in algorithm - XGBoost" - lo_hyperparameters_w = NEW #( iv_value = iv_hp_max_depth ). - INSERT VALUE #( key = 'max_depth' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = iv_hp_eta ). - INSERT VALUE #( key = 'eta' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = iv_hp_eval_metric ). - INSERT VALUE #( key = 'eval_metric' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = iv_hp_scale_pos_weight ). - INSERT VALUE #( key = 'scale_pos_weight' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = iv_hp_subsample ). - INSERT VALUE #( key = 'subsample' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = iv_hp_objective ). - INSERT VALUE #( key = 'objective' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - lo_hyperparameters_w = NEW #( iv_value = iv_hp_num_round ). - INSERT VALUE #( key = 'num_round' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. - - "Create ABAP internal table for data based on input variables." - "Training data." - lo_trn_s3datasource = NEW #( iv_s3datatype = iv_trn_data_s3datatype - iv_s3datadistributiontype = iv_trn_data_s3datadistribution - iv_s3uri = iv_trn_data_s3uri ). - - lo_trn_datasource = NEW #( io_s3datasource = lo_trn_s3datasource ). - - lo_trn_channel = NEW #( iv_channelname = 'train' - io_datasource = lo_trn_datasource - iv_compressiontype = iv_trn_data_compressiontype - iv_contenttype = iv_trn_data_contenttype ). - INSERT lo_trn_channel INTO TABLE lt_input_data_config. - - "Validation data." - lo_val_s3datasource = NEW #( iv_s3datatype = iv_val_data_s3datatype - iv_s3datadistributiontype = iv_val_data_s3datadistribution - iv_s3uri = iv_val_data_s3uri ). - - lo_val_datasource = NEW #( io_s3datasource = lo_val_s3datasource ). - - lo_val_channel = NEW #( iv_channelname = 'validation' - io_datasource = lo_val_datasource - iv_compressiontype = iv_val_data_compressiontype - iv_contenttype = iv_val_data_contenttype ). - INSERT lo_val_channel INTO TABLE lt_input_data_config. - - "Create an ABAP object for algorithm specification based on input variables." - lo_algorithm_specification = NEW #( iv_trainingimage = iv_training_image - iv_traininginputmode = iv_training_input_mode ). - - "Create an ABAP object for resource configuration." - lo_resource_config = NEW #( iv_instancecount = iv_instance_count - iv_instancetype = iv_instance_type - iv_volumesizeingb = iv_volume_sizeingb ). - - "Create an ABAP object for output data configuration." - lo_output_data_config = NEW #( iv_s3outputpath = iv_s3_output_path ). - - "Create an ABAP object for stopping condition." - lo_stopping_condition = NEW #( iv_maxruntimeinseconds = iv_max_runtime_in_seconds ). - - TRY. - lo_sgm->createtrainingjob( - iv_trainingjobname = iv_training_job_name - iv_rolearn = iv_role_arn - it_hyperparameters = lt_hyperparameters - it_inputdataconfig = lt_input_data_config - io_algorithmspecification = lo_algorithm_specification - io_outputdataconfig = lo_output_data_config - io_resourceconfig = lo_resource_config - io_stoppingcondition = lo_stopping_condition ). - MESSAGE 'Training job created.' TYPE 'I'. - CATCH /aws1/cx_sgmresourceinuse. - MESSAGE 'Resource being accessed is in use.' TYPE 'E'. - CATCH /aws1/cx_sgmresourcenotfound. - MESSAGE 'Resource being accessed is not found.' TYPE 'E'. - CATCH /aws1/cx_sgmresourcelimitexcd. - MESSAGE 'You have reached the limit on the number of resources.' TYPE 'E'. - ENDTRY. - - "Wait for training job to be completed." - lo_training_result = lo_sgm->describetrainingjob( iv_trainingjobname = iv_training_job_name ). - WHILE lo_training_result->get_trainingjobstatus( ) <> 'Completed'. - IF sy-index = 30. - EXIT. "Maximum 900 seconds." - ENDIF. - WAIT UP TO 30 SECONDS. - lo_training_result = lo_sgm->describetrainingjob( iv_trainingjobname = iv_training_job_name ). - ENDWHILE. - - "Create ABAP object for the container image based on input variables." - lo_primarycontainer = NEW #( iv_image = iv_training_image - iv_modeldataurl = lv_model_data_url ). - - "Create an Amazon SageMaker model." - TRY. - lo_sgm->createmodel( - iv_executionrolearn = iv_role_arn - iv_modelname = iv_model_name - io_primarycontainer = lo_primarycontainer ). - MESSAGE 'Model created.' TYPE 'I'. - CATCH /aws1/cx_sgmresourcelimitexcd. - MESSAGE 'You have reached the limit on the number of resources.' TYPE 'E'. - ENDTRY. - - "Create an endpoint production variant." - lo_production_variants = NEW #( iv_variantname = iv_ep_variant_name - iv_modelname = iv_model_name - iv_initialinstancecount = iv_ep_initial_instance_count - iv_instancetype = iv_ep_instance_type ). - INSERT lo_production_variants INTO TABLE lt_production_variants. - - TRY. - "Create an endpoint configuration." - lo_ep_config_result = lo_sgm->createendpointconfig( - iv_endpointconfigname = iv_ep_cfg_name - it_productionvariants = lt_production_variants ). - MESSAGE 'Endpoint configuration created.' TYPE 'I'. - - "Create an endpoint." - oo_ep_output = lo_sgm->createendpoint( " oo_ep_output is returned for testing purposes. " - iv_endpointconfigname = iv_ep_cfg_name - iv_endpointname = iv_ep_name ). - MESSAGE 'Endpoint created.' TYPE 'I'. - CATCH /aws1/cx_sgmresourcelimitexcd. - MESSAGE 'You have reached the limit on the number of resources.' TYPE 'E'. - ENDTRY. - - "Wait for endpoint creation to be completed." - DATA(lo_endpoint_result) = lo_sgm->describeendpoint( iv_endpointname = iv_ep_name ). - WHILE lo_endpoint_result->get_endpointstatus( ) <> 'InService'. - IF sy-index = 30. - EXIT. "Maximum 900 seconds." - ENDIF. - WAIT UP TO 30 SECONDS. - lo_endpoint_result = lo_sgm->describeendpoint( iv_endpointname = iv_ep_name ). - ENDWHILE. - - TRY. - "Delete an endpoint." - lo_sgm->deleteendpoint( - iv_endpointname = iv_ep_name ). - MESSAGE 'Endpoint deleted' TYPE 'I'. - - "Delete an endpoint configuration." - lo_sgm->deleteendpointconfig( - iv_endpointconfigname = iv_ep_cfg_name ). - MESSAGE 'Endpoint configuration deleted.' TYPE 'I'. - - "Delete model." - lo_sgm->deletemodel( - iv_modelname = iv_model_name ). - MESSAGE 'Model deleted.' TYPE 'I'. - CATCH /aws1/cx_rt_service_generic INTO DATA(lo_endpointconfig_exception). - DATA(lv_endpointconfig_error) = |"{ lo_endpointconfig_exception->av_err_code }" - { lo_endpointconfig_exception->av_err_msg }|. - MESSAGE lv_endpointconfig_error TYPE 'E'. - ENDTRY. - "snippet-end:[sgm.abapv1.getting_started_with_sgm] - - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/sagemaker/zcl_aws1_sgm_scenario.clas.testclasses.abap b/sap-abap/services/sagemaker/zcl_aws1_sgm_scenario.clas.testclasses.abap deleted file mode 100644 index 4d2e520f27d..00000000000 --- a/sap-abap/services/sagemaker/zcl_aws1_sgm_scenario.clas.testclasses.abap +++ /dev/null @@ -1,321 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS ltc_zcl_aws1_sgm_scenario DEFINITION DEFERRED. -CLASS zcl_aws1_sgm_scenario DEFINITION LOCAL FRIENDS ltc_zcl_aws1_sgm_scenario. - -CLASS ltc_zcl_aws1_sgm_scenario DEFINITION FOR TESTING DURATION LONG RISK LEVEL DANGEROUS. - - PRIVATE SECTION. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA ao_sgm TYPE REF TO /aws1/if_sgm. - DATA ao_s3 TYPE REF TO /aws1/if_s3. - DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. - DATA ao_sgm_scenario TYPE REF TO zcl_aws1_sgm_scenario. - DATA av_lrole TYPE /aws1/sgmrolearn. - - METHODS getting_started_scenario FOR TESTING RAISING /aws1/cx_rt_generic. - METHODS setup RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic. - -ENDCLASS. "ltc_Zcl_Aws1_Sgm_Scenario - - -CLASS ltc_zcl_aws1_sgm_scenario IMPLEMENTATION. - - METHOD setup. - ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). - ao_sgm = /aws1/cl_sgm_factory=>create( ao_session ). - ao_s3 = /aws1/cl_s3_factory=>create( ao_session ). - ao_sgm_scenario = NEW zcl_aws1_sgm_scenario( ). - ENDMETHOD. - - METHOD getting_started_scenario. - - "This test case runs a training job for sales prediction using the built-in algorithm XGBoost. - - - DATA lv_timestamp TYPE timestamp. - DATA lo_ep_output TYPE REF TO /aws1/cl_sgmcreateendptoutput. - DATA lv_endpoint_name TYPE /aws1/sgmendpointname. - DATA lv_endpoint_config_name TYPE /aws1/sgmendpointconfigname. - DATA lv_model_name TYPE /aws1/sgmmodelname. - DATA lv_bucket_name TYPE /aws1/s3_bucketname. - DATA lv_file_content TYPE /aws1/s3_streamingblob. - DATA lv_trn_data_s3uri TYPE /aws1/sgms3uri. - DATA lv_val_data_s3uri TYPE /aws1/sgms3uri. - DATA lv_s3_output_path TYPE /aws1/sgms3uri. - DATA lv_model_key TYPE /aws1/s3_objectkey. - DATA lv_uuid_16 TYPE sysuuid_x16. - - "Define job name. - CONSTANTS cv_training_job_name TYPE /aws1/sgmtrainingjobname VALUE 'code-example-trn-job-'. - - "Define hyperparameters. - CONSTANTS cv_hp_max_depth TYPE /aws1/sgmhyperparametervalue VALUE '3'. - CONSTANTS cv_hp_scale_pos_weight TYPE /aws1/sgmhyperparametervalue VALUE '2.0'. - CONSTANTS cv_hp_num_round TYPE /aws1/sgmhyperparametervalue VALUE '100'. - CONSTANTS cv_hp_objective TYPE /aws1/sgmhyperparametervalue VALUE 'binary:logistic'. - CONSTANTS cv_hp_subsample TYPE /aws1/sgmhyperparametervalue VALUE '0.5'. - CONSTANTS cv_hp_eta TYPE /aws1/sgmhyperparametervalue VALUE '0.1'. - CONSTANTS cv_hp_eval_metric TYPE /aws1/sgmhyperparametervalue VALUE 'auc'. - - "Define training data. - CONSTANTS cv_trn_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. - CONSTANTS cv_trn_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. - CONSTANTS cv_trn_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. - CONSTANTS cv_trn_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. - - "Define validation data. - CONSTANTS cv_val_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. - CONSTANTS cv_val_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. - CONSTANTS cv_val_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. - CONSTANTS cv_val_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. - - "Define training parameters. - "SGM public training image ref to https://docs.aws.amazon.com/sagemaker/latest/dg/ecr-us-east-1.html#xgboost-us-east-1.title - CONSTANTS cv_training_image TYPE /aws1/sgmalgorithmimage VALUE '123456789012.abc.ecr.us-east-1.amazonaws.com/sagemaker-xgboost:1.5-1'. - CONSTANTS cv_training_input_mode TYPE /aws1/sgmtraininginputmode VALUE 'File'. - CONSTANTS cv_instance_count TYPE /aws1/sgmtraininginstancecount VALUE '1'. - CONSTANTS cv_instance_type TYPE /aws1/sgmtraininginstancetype VALUE 'ml.c4.2xlarge'. - CONSTANTS cv_volume_sizeingb TYPE /aws1/sgmvolumesizeingb VALUE '10'. - CONSTANTS cv_max_runtime_in_seconds TYPE /aws1/sgmmaxruntimeinseconds VALUE '1800'. - - "Define model parameters. - CONSTANTS cv_model_name TYPE /aws1/sgmmodelname VALUE 'code-example-sgm-model-'. - - "Define endpoint parameters. - CONSTANTS cv_endpoint_name TYPE /aws1/sgmendpointname VALUE 'code-example-endpoint-'. - CONSTANTS cv_endpoint_config_name TYPE /aws1/sgmendpointconfigname VALUE 'code-example-endpoint-cfg-'. - CONSTANTS cv_endpoint_variant_name TYPE /aws1/sgmvariantname VALUE 'code-example-endpoint-variant-'. - CONSTANTS cv_ep_instance_type TYPE /aws1/sgminstancetype VALUE 'ml.m4.xlarge'. - CONSTANTS cv_ep_initial_instance_count TYPE /aws1/sgminitialtaskcount VALUE '1'. - - "Create training data in Amazon Simple Storage Service (Amazon S3). - CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-sgm-'. - CONSTANTS cv_train_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/train/train.libsvm'. - CONSTANTS cv_val_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/validation/validation.libsvm'. - - "Define role Amazon Resource Name (ARN). - DATA(lt_roles) = ao_session->get_configuration( )->get_logical_iam_roles( ). - READ TABLE lt_roles INDEX 1 INTO DATA(lo_role). " take first role from the logical role mapping - av_lrole = lo_role-iam_role_arn. - - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_bucket_name = cv_bucket_name && lv_uuid_16. - TRANSLATE lv_bucket_name TO LOWER CASE. - - zcl_aws1_ex_utils=>create_bucket( iv_bucket = lv_bucket_name - io_s3 = ao_s3 - io_session = ao_session ). - - lv_trn_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_train_key. - lv_val_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_val_key. - lv_s3_output_path = 's3://' && lv_bucket_name && '/' && 'sagemaker/'. - - lv_model_key = 'sagemaker/' && cv_training_job_name && lv_uuid_16 && '/output/model.tar.gz'. - TRANSLATE lv_model_key TO LOWER CASE. - lv_endpoint_name = cv_endpoint_name && lv_uuid_16. - TRANSLATE lv_endpoint_name TO LOWER CASE. - lv_endpoint_config_name = cv_endpoint_config_name && lv_uuid_16. - TRANSLATE lv_endpoint_config_name TO LOWER CASE. - lv_model_name = cv_model_name && lv_uuid_16. - TRANSLATE lv_model_name TO LOWER CASE. - DATA(lv_training_job_name) = cv_training_job_name && lv_uuid_16. - TRANSLATE lv_training_job_name TO LOWER CASE. - DATA(lv_endpoint_variant_name) = cv_endpoint_variant_name && lv_uuid_16. - TRANSLATE lv_endpoint_variant_name TO LOWER CASE. - - lv_file_content = /aws1/cl_rt_util=>string_to_xstring( - |0 0:75 1:6.4 17:1 25:1 95:1 325:1\n| && - |0 0:59 1:7.3 16:1 19:1 296:1 328:1\n| && - |0 0:66 1:6.6 9:1 25:1 193:1 330:1\n| && - |0 0:64 1:6.9 9:1 21:1 146:1 330:1\n| && - |0 0:65 1:8.699999999999999 9:1 29:1 252:1 325:1\n| && - |0 0:61 1:6.1 14:1 29:1 42:1 325:1\n| && - |0 0:81 1:8.300000000000001 12:1 29:1 166:1 325:1\n| && - |0 0:43 1:3.9 10:1 27:1 310:1 330:1\n| && - |0 0:69 1:6.9 8:1 25:1 95:1 325:1\n| && - |1 0:88 1:8.6 9:1 21:1 204:1 330:1\n| && - |0 0:55 1:7.8 12:1 22:1 140:1 325:1\n| && - |0 0:62 1:6 16:1 29:1 95:1 325:1\n| && - |0 0:66 1:7.8 15:1 19:1 204:1 330:1\n| && - |0 0:85 1:5.8 7:1 19:1 295:1 328:1\n| && - |0 0:80 1:6.8 12:1 29:1 166:1 325:1\n| && - |0 0:70 1:3.6 7:1 28:1 95:1 330:1\n| && - |1 0:81 1:6.2 10:1 27:1 61:1 328:1\n| && - |0 0:77 1:7.1 7:1 30:1 222:1 326:1\n| && - |0 0:39 1:3.1 7:1 27:1 102:1 330:1\n| && - |0 0:55 1:5.7 4:1 21:1 278:1 330:1\n| && - |1 0:87 1:7.6 11:1 19:1 310:1 328:1\n| && - |0 0:62 1:6.2 9:1 25:1 149:1 325:1\n| && - |0 0:80 1:8 4:1 24:1 230:1 325:1\n| && - |0 0:68 1:4.9 7:1 30:1 298:1 330:1\n| && - |0 0:73 1:9 4:1 26:1 204:1 330:1\n| && - |0 0:66 1:7.2 9:1 19:1 204:1 330:1\n| && - |0 0:66 1:8.199999999999999 8:1 26:1 38:1 325:1\n| && - |0 0:86 1:8.199999999999999 4:1 23:1 209:1 325:1\n| && - |0 0:81 1:6.4 8:1 29:1 95:1 325:1\n| && - |0 0:71 1:7.1 5:1 29:1 95:1 325:1\n| && - |0 0:79 1:7.9 5:1 22:1 42:1 325:1\n| && - |1 0:64 1:6.4 9:1 22:1 252:1 330:1\n| && - |0 0:78 1:8.300000000000001 9:1 29:1 42:1 325:1\n| && - |1 0:91 1:9 8:1 19:1 305:1 328:1\n| && - |0 0:84 1:6.8 10:1 29:1 95:1 326:1\n| && - |0 0:85 1:8.199999999999999 7:1 27:1 322:1 328:1\n| && - |0 0:33 1:7 4:1 27:1 166:1 325:1\n| && - |0 0:73 1:3 7:1 27:1 42:1 328:1\n| && - |0 0:81 1:8 6:1 29:1 95:1 325:1\n| && - |0 0:59 1:6.8 2:1 25:1 75:1 325:1\n| && - |0 0:85 1:7.5 9:1 29:1 249:1 325:1\n| && - |0 0:79 1:7.6 5:1 29:1 95:1 325:1\n| && - |0 0:63 1:6.9 10:1 29:1 95:1 325:1\n| && - |1 0:95 1:6.8 10:1 23:1 252:1 325:1\n| && - |0 0:47 1:6.1 6:1 19:1 95:1 330:1\n| && - |0 0:81 1:8.6 14:1 19:1 249:1 328:1\n| && - |0 0:50 1:7 9:1 27:1 193:1 328:1\n| && - |0 0:88 1:7.9 10:1 29:1 95:1 326:1\n| && - |1 0:74 1:6.1 10:1 29:1 166:1 325:1\n| && - |0 0:82 1:8.1 17:1 29:1 95:1 325:1\n| && - |0 0:67 1:7.2 10:1 19:1 95:1 328:1\n| && - |0 0:67 1:6.7 6:1 23:1 307:1 326:1\n| && - |0 0:77 1:7.9 10:1 29:1 95:1 325:1\n| && - |0 0:68 1:5.9 7:1 19:1 61:1 328:1\n| && - |1 0:81 1:7.5 10:1 19:1 310:1 326:1\n| && - |0 0:62 1:7.5 4:1 26:1 278:1 326:1\n| && - |1 0:53 1:6.9 5:1 26:1 149:1 325:1\n| && - |0 0:78 1:8.1 2:1 26:1 315:1 326:1\n| && - |0 0:54 1:5.4 17:1 29:1 79:1 325:1\n| && - |0 0:89 1:8.4 10:1 25:1 252:1 326:1\n| && - |1 0:75 1:5.6 2:1 26:1 209:1 325:1\n| && - |0 0:78 1:8.300000000000001 9:1 29:1 252:1 325:1\n| && - |0 0:75 1:8.199999999999999 7:1 28:1 198:1 325:1\n| && - |0 0:72 1:7 7:1 27:1 256:1 330:1\n| && - |0 0:57 1:4.8 9:1 21:1 71:1 330:1\n| && - |0 0:58 1:5.9 10:1 27:1 204:1 330:1\n| && - |0 0:74 1:8.300000000000001 17:1 28:1 224:1 330:1\n| && - |0 0:48 1:7.1 14:1 26:1 249:1 330:1\n| && - |0 0:82 1:7.3 10:1 22:1 276:1 330:1\n| && - |0 0:66 1:7.4 6:1 25:1 307:1 325:1\n| && - |1 0:70 1:8.699999999999999 9:1 19:1 95:1 325:1\n| && - |0 0:86 1:8.4 7:1 23:1 295:1 326:1\n| && - |0 0:42 1:4.2 17:1 25:1 204:1 330:1\n| && - |0 0:75 1:7.8 4:1 27:1 75:1 325:1\n| && - |0 0:93 1:9.300000000000001 9:1 19:1 71:1 330:1\n| && - |0 0:63 1:7.8 17:1 22:1 279:1 330:1\n| && - |1 0:71 1:5.7 4:1 24:1 193:1 326:1\n| && - |0 0:42 1:5 16:1 19:1 256:1 326:1\n| && - |0 0:53 1:5.2 16:1 22:1 249:1 330:1\n| && - |0 0:64 1:6.4 12:1 19:1 282:1 330:1\n| && - |0 0:60 1:7 14:1 19:1 209:1 325:1\n| && - |0 0:86 1:7.4 16:1 21:1 95:1 328:1\n| && - |0 0:91 1:8.9 17:1 29:1 249:1 325:1\n| && - |1 0:82 1:7.8 10:1 26:1 61:1 328:1\n| && - |1 0:92 1:8.300000000000001 16:1 22:1 95:1 330:1\n| && - |1 0:85 1:8.800000000000001 9:1 26:1 252:1 325:1\n| && - |0 0:79 1:7.5 9:1 29:1 252:1 325:1\n| && - |1 0:61 1:5.3 14:1 28:1 35:1 325:1\n| && - |0 0:75 1:7.7 7:1 28:1 95:1 330:1\n| && - |0 0:68 1:8.5 14:1 29:1 279:1 326:1\n| && - |1 0:67 1:5 16:1 27:1 71:1 328:1\n| && - |0 0:79 1:8.5 12:1 26:1 103:1 330:1\n| && - |0 0:61 1:5.1 16:1 29:1 105:1 330:1\n| && - |1 0:72 1:8.699999999999999 12:1 26:1 71:1 330:1\n| && - |0 0:60 1:6.3 9:1 20:1 307:1 328:1\n| && - |0 0:67 1:7.8 9:1 29:1 39:1 325:1\n| && - |0 0:53 1:5.6 9:1 26:1 189:1 330:1\n| && - |1 0:98 1:7.7 8:1 29:1 42:1 330:1\n| && - |0 0:76 1:6.7 7:1 28:1 75:1 330:1\n| && - |1 0:74 1:5.3 7:1 28:1 95:1 330:1\n| ). - - ao_s3->putobject( - iv_bucket = lv_bucket_name - iv_key = cv_train_key - iv_body = lv_file_content ). - - ao_s3->putobject( - iv_bucket = lv_bucket_name - iv_key = cv_val_key - iv_body = lv_file_content ). - - ao_sgm_scenario->getting_started_with_sgm( - EXPORTING - iv_training_job_name = lv_training_job_name - iv_role_arn = av_lrole - iv_trn_data_s3datatype = cv_trn_data_s3datatype - iv_trn_data_s3datadistribution = cv_trn_data_s3datadistribution - iv_trn_data_s3uri = lv_trn_data_s3uri - iv_trn_data_compressiontype = cv_trn_data_compressiontype - iv_trn_data_contenttype = cv_trn_data_contenttype - iv_val_data_s3datatype = cv_val_data_s3datatype - iv_val_data_s3datadistribution = cv_val_data_s3datadistribution - iv_val_data_s3uri = lv_val_data_s3uri - iv_val_data_compressiontype = cv_val_data_compressiontype - iv_val_data_contenttype = cv_val_data_contenttype - iv_hp_max_depth = cv_hp_max_depth - iv_hp_scale_pos_weight = cv_hp_scale_pos_weight - iv_hp_num_round = cv_hp_num_round - iv_hp_objective = cv_hp_objective - iv_hp_subsample = cv_hp_subsample - iv_hp_eval_metric = cv_hp_eval_metric - iv_hp_eta = cv_hp_eta - iv_training_image = cv_training_image - iv_training_input_mode = cv_training_input_mode - iv_instance_count = cv_instance_count - iv_instance_type = cv_instance_type - iv_volume_sizeingb = cv_volume_sizeingb - iv_s3_output_path = lv_s3_output_path - iv_max_runtime_in_seconds = cv_max_runtime_in_seconds - iv_ep_instance_type = cv_ep_instance_type - iv_ep_initial_instance_count = cv_ep_initial_instance_count - iv_model_name = lv_model_name - iv_ep_name = lv_endpoint_name - iv_ep_cfg_name = lv_endpoint_config_name - iv_ep_variant_name = lv_endpoint_variant_name - IMPORTING - oo_ep_output = lo_ep_output ). - - DATA(lv_found) = abap_false. - - IF lo_ep_output->has_endpointarn( ) = 'X'. - lv_found = abap_true. - ENDIF. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Endpoint not found| ). - - DATA(lo_model_list_result) = ao_sgm->listmodels( - iv_namecontains = lv_model_name ). - lv_found = abap_false. - - "The model should be deleted. - LOOP AT lo_model_list_result->get_models( ) INTO DATA(lo_models). - IF lo_models->get_modelname( ) = lv_model_name. - lv_found = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_false( - act = lv_found - msg = |Model was not deleted| ). - - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = cv_train_key ). - - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = cv_val_key ). - - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = lv_model_key ). - - ao_s3->deletebucket( - iv_bucket = lv_bucket_name ). - - ENDMETHOD. - -ENDCLASS. diff --git a/sap-abap/services/sagemaker/zcl_aws1_sgm_scenario.clas.xml b/sap-abap/services/sagemaker/zcl_aws1_sgm_scenario.clas.xml deleted file mode 100644 index 5cb8ef3f709..00000000000 --- a/sap-abap/services/sagemaker/zcl_aws1_sgm_scenario.clas.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - ZCL_AWS1_SGM_SCENARIO - E - SageMaker Code Example Scenarios - 1 - X - X - X - X - - - - GETTING_STARTED_WITH_SGM - E - Create a training job in SageMaker. - - - - - diff --git a/sap-abap/services/sagemaker/README.md b/sap-abap/services/sgm/README.md similarity index 100% rename from sap-abap/services/sagemaker/README.md rename to sap-abap/services/sgm/README.md diff --git a/sap-abap/services/sns/zcl_aws1_sns_actions.clas.abap b/sap-abap/services/sns/zcl_aws1_sns_actions.clas.abap deleted file mode 100644 index 9d266fd792d..00000000000 --- a/sap-abap/services/sns/zcl_aws1_sns_actions.clas.abap +++ /dev/null @@ -1,226 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS zcl_aws1_sns_actions DEFINITION - PUBLIC - FINAL - CREATE PUBLIC . - - PUBLIC SECTION. - - METHODS create_topic - IMPORTING - !iv_topic_name TYPE /aws1/snstopicname - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_snscreatetopicrsp . - METHODS delete_topic - IMPORTING - !iv_topic_arn TYPE /aws1/snstopicarn . - METHODS get_topic_attributes - IMPORTING - !iv_topic_arn TYPE /aws1/snstopicarn - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_snsgettopicattrsrsp . - METHODS subscribe_email - IMPORTING - !iv_topic_arn TYPE /aws1/snstopicarn - !iv_email_address TYPE /aws1/snsendpoint2 - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_snssubscriberesponse . - METHODS unsubscribe - IMPORTING - !iv_subscription_arn TYPE /aws1/snssubscriptionarn . - METHODS list_subscriptions - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_snslstsubscriptions01 . - METHODS list_topics - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_snslisttopicsresponse . - METHODS publish_to_topic - IMPORTING - !iv_topic_arn TYPE /aws1/snsstring - !iv_message TYPE /aws1/snsmessage - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_snspublishresponse . - METHODS set_topic_attributes - IMPORTING - !iv_topic_arn TYPE /aws1/snstopicarn - !iv_attribute_name TYPE /aws1/snsattributename - !iv_attribute_value TYPE /aws1/snsattributevalue . - PROTECTED SECTION. - PRIVATE SECTION. -ENDCLASS. - - - -CLASS ZCL_AWS1_SNS_ACTIONS IMPLEMENTATION. - - - METHOD create_topic. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sns) = /aws1/cl_sns_factory=>create( lo_session ). - - " snippet-start:[sns.abapv1.create_topic] - TRY. - oo_result = lo_sns->createtopic( iv_name = iv_topic_name ). " oo_result is returned for testing purposes. " - MESSAGE 'SNS topic created' TYPE 'I'. - CATCH /aws1/cx_snstopiclimitexcdex. - MESSAGE 'Unable to create more topics. You have reached the maximum number of topics allowed.' TYPE 'E'. - ENDTRY. - " snippet-end:[sns.abapv1.create_topic] - ENDMETHOD. - - - METHOD delete_topic. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sns) = /aws1/cl_sns_factory=>create( lo_session ). - - " snippet-start:[sns.abapv1.delete_topic] - TRY. - lo_sns->deletetopic( iv_topicarn = iv_topic_arn ). - MESSAGE 'SNS topic deleted.' TYPE 'I'. - CATCH /aws1/cx_snsnotfoundexception. - MESSAGE 'Topic does not exist.' TYPE 'E'. - ENDTRY. - " snippet-end:[sns.abapv1.delete_topic] - ENDMETHOD. - - - METHOD get_topic_attributes. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sns) = /aws1/cl_sns_factory=>create( lo_session ). - - " snippet-start:[sns.abapv1.get_topic_attributes] - TRY. - oo_result = lo_sns->gettopicattributes( iv_topicarn = iv_topic_arn ). " oo_result is returned for testing purposes. " - DATA(lt_attributes) = oo_result->get_attributes( ). - MESSAGE 'Retrieved attributes/properties of a topic.' TYPE 'I'. - CATCH /aws1/cx_snsnotfoundexception. - MESSAGE 'Topic does not exist.' TYPE 'E'. - ENDTRY. - " snippet-end:[sns.abapv1.get_topic_attributes] - ENDMETHOD. - - - METHOD list_subscriptions. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sns) = /aws1/cl_sns_factory=>create( lo_session ). - - " snippet-start:[sns.abapv1.list_subscriptions] - TRY. - oo_result = lo_sns->listsubscriptions( ). " oo_result is returned for testing purposes. " - DATA(lt_subscriptions) = oo_result->get_subscriptions( ). - MESSAGE 'Retrieved list of subscribers.' TYPE 'I'. - CATCH /aws1/cx_rt_generic. - MESSAGE 'Unable to list subscribers.' TYPE 'E'. - ENDTRY. - " snippet-end:[sns.abapv1.list_subscriptions] - ENDMETHOD. - - - METHOD list_topics. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sns) = /aws1/cl_sns_factory=>create( lo_session ). - - " snippet-start:[sns.abapv1.list_topics] - TRY. - oo_result = lo_sns->listtopics( ). " oo_result is returned for testing purposes. " - DATA(lt_topics) = oo_result->get_topics( ). - MESSAGE 'Retrieved list of topics.' TYPE 'I'. - CATCH /aws1/cx_rt_generic. - MESSAGE 'Unable to list topics.' TYPE 'E'. - ENDTRY. - " snippet-end:[sns.abapv1.list_topics] - ENDMETHOD. - - - METHOD publish_to_topic. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sns) = /aws1/cl_sns_factory=>create( lo_session ). - - " snippet-start:[sns.abapv1.publish_to_topic]. - TRY. - oo_result = lo_sns->publish( " oo_result is returned for testing purposes. " - iv_topicarn = iv_topic_arn - iv_message = iv_message ). - MESSAGE 'Message published to SNS topic.' TYPE 'I'. - CATCH /aws1/cx_snsnotfoundexception. - MESSAGE 'Topic does not exist.' TYPE 'E'. - ENDTRY. - " snippet-end:[sns.abapv1.publish_to_topic]. - ENDMETHOD. - - - METHOD set_topic_attributes. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sns) = /aws1/cl_sns_factory=>create( lo_session ). - - " snippet-start:[sns.abapv1.set_topic_attributes] - TRY. - lo_sns->settopicattributes( - iv_topicarn = iv_topic_arn - iv_attributename = iv_attribute_name - iv_attributevalue = iv_attribute_value ). - MESSAGE 'Set/updated SNS topic attributes.' TYPE 'I'. - CATCH /aws1/cx_snsnotfoundexception. - MESSAGE 'Topic does not exist.' TYPE 'E'. - ENDTRY. - " snippet-end:[sns.abapv1.set_topic_attributes] - ENDMETHOD. - - - METHOD subscribe_email. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sns) = /aws1/cl_sns_factory=>create( lo_session ). - - " snippet-start:[sns.abapv1.subscribe_email] - TRY. - oo_result = lo_sns->subscribe( "oo_result is returned for testing purposes." - iv_topicarn = iv_topic_arn - iv_protocol = 'email' - iv_endpoint = iv_email_address - iv_returnsubscriptionarn = abap_true ). - MESSAGE 'Email address subscribed to SNS topic.' TYPE 'I'. - CATCH /aws1/cx_snsnotfoundexception. - MESSAGE 'Topic does not exist.' TYPE 'E'. - CATCH /aws1/cx_snssubscriptionlmte00. - MESSAGE 'Unable to create subscriptions. You have reached the maximum number of subscriptions allowed.' TYPE 'E'. - ENDTRY. - " snippet-end:[sns.abapv1.subscribe_email] - ENDMETHOD. - - - METHOD unsubscribe. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sns) = /aws1/cl_sns_factory=>create( lo_session ). - - " snippet-start:[sns.abapv1.unsubscribe] - TRY. - lo_sns->unsubscribe( iv_subscriptionarn = iv_subscription_arn ). - MESSAGE 'Subscription deleted.' TYPE 'I'. - CATCH /aws1/cx_snsnotfoundexception. - MESSAGE 'Subscription does not exist.' TYPE 'E'. - CATCH /aws1/cx_snsinvalidparameterex. - MESSAGE 'Subscription with "PendingConfirmation" status cannot be deleted/unsubscribed. Confirm subscription before performing unsubscribe operation.' TYPE 'E'. - ENDTRY. - " snippet-end:[sns.abapv1.unsubscribe] - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/sns/zcl_aws1_sns_actions.clas.testclasses.abap b/sap-abap/services/sns/zcl_aws1_sns_actions.clas.testclasses.abap deleted file mode 100644 index 0612829323c..00000000000 --- a/sap-abap/services/sns/zcl_aws1_sns_actions.clas.testclasses.abap +++ /dev/null @@ -1,246 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS ltc_zcl_aws1_sns_actions DEFINITION DEFERRED. -CLASS zcl_aws1_sns_actions DEFINITION LOCAL FRIENDS ltc_zcl_aws1_sns_actions. - -CLASS ltc_zcl_aws1_sns_actions DEFINITION FOR TESTING DURATION SHORT RISK LEVEL DANGEROUS. - - PRIVATE SECTION. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA ao_sns TYPE REF TO /aws1/if_sns. - DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. - DATA ao_sns_actions TYPE REF TO zcl_aws1_sns_actions. - - METHODS: create_topic FOR TESTING RAISING /aws1/cx_rt_generic, - list_topics FOR TESTING RAISING /aws1/cx_rt_generic, - get_topic_attributes FOR TESTING RAISING /aws1/cx_rt_generic, - list_subscriptions FOR TESTING RAISING /aws1/cx_rt_generic, - subscribe_email FOR TESTING RAISING /aws1/cx_rt_generic, - unsubscribe FOR TESTING RAISING /aws1/cx_rt_generic, - delete_topic FOR TESTING RAISING /aws1/cx_rt_generic, - publish_to_topic FOR TESTING RAISING /aws1/cx_rt_generic, - set_topic_attributes FOR TESTING RAISING /aws1/cx_rt_generic. - - METHODS setup RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic. - - METHODS assert_subscription_exists - IMPORTING - iv_topic_arn TYPE /aws1/snstopicarn - iv_subscription_arn TYPE /aws1/snssubscriptionarn - iv_exp TYPE abap_bool - iv_msg TYPE string - RAISING /aws1/cx_rt_generic. - METHODS assert_topic_exists - IMPORTING - iv_topic_arn TYPE /aws1/snstopicarn - iv_exp TYPE abap_bool - iv_msg TYPE string - RAISING /aws1/cx_rt_generic. -ENDCLASS. - -CLASS ltc_zcl_aws1_sns_actions IMPLEMENTATION. - - METHOD setup. - ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). - ao_sns = /aws1/cl_sns_factory=>create( ao_session ). - ao_sns_actions = NEW zcl_aws1_sns_actions( ). - ENDMETHOD. - METHOD create_topic. - CONSTANTS cv_topic_name TYPE /aws1/snstopicname VALUE 'code-example-create-topic'. - DATA(lo_result) = ao_sns_actions->create_topic( cv_topic_name ). - assert_topic_exists( - iv_topic_arn = lo_result->get_topicarn( ) - iv_exp = abap_true - iv_msg = |Topic { cv_topic_name } was not created| ). - ao_sns->deletetopic( iv_topicarn = lo_result->get_topicarn( ) ). - ENDMETHOD. - METHOD delete_topic. - CONSTANTS cv_topic_name TYPE /aws1/snstopicname VALUE 'code-example-delete-topic'. - DATA(lo_result) = ao_sns->createtopic( iv_name = cv_topic_name ). - DATA(lv_topic_arn) = lo_result->get_topicarn( ). - - ao_sns_actions->delete_topic( lv_topic_arn ). - assert_topic_exists( - iv_topic_arn = lv_topic_arn - iv_exp = abap_false - iv_msg = |Topic { cv_topic_name } should have been deleted| ). - ENDMETHOD. - METHOD get_topic_attributes. - CONSTANTS cv_topic_name TYPE /aws1/snstopicname VALUE 'code-example-get-topic-attributes'. - DATA(lo_create_result) = ao_sns->createtopic( iv_name = cv_topic_name ). - DATA(lv_topic_arn) = lo_create_result->get_topicarn( ). - DATA(lo_get_attributes_result) = ao_sns_actions->get_topic_attributes( lv_topic_arn ). - - LOOP AT lo_get_attributes_result->get_attributes( ) INTO DATA(wa_attribute). - IF wa_attribute-key = 'TopicArn' AND wa_attribute-value->get_value( ) = lv_topic_arn. - DATA(lv_found) = abap_true. - ENDIF. - ENDLOOP. - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Couldn't retrive attributes for topic { cv_topic_name }| ). - ao_sns->deletetopic( iv_topicarn = lv_topic_arn ). - ENDMETHOD. - METHOD subscribe_email. - CONSTANTS cv_topic_name TYPE /aws1/snstopicname VALUE 'code-example-subscribe-email'. - CONSTANTS cv_email_address TYPE /aws1/snsendpoint2 VALUE 'dummyemail@example.com'. - - DATA(lo_create_result) = ao_sns->createtopic( iv_name = cv_topic_name ). - DATA(lv_topic_arn) = lo_create_result->get_topicarn( ). - DATA(lo_subscribe_result) = ao_sns_actions->subscribe_email( - iv_topic_arn = lv_topic_arn - iv_email_address = cv_email_address ). - cl_abap_unit_assert=>assert_not_initial( - act = lo_subscribe_result->get_subscriptionarn( ) - msg = |Unable to subcribe email address { cv_email_address } to SNS topic { cv_topic_name }| ). - assert_subscription_exists( - iv_topic_arn = lv_topic_arn - iv_subscription_arn = 'PendingConfirmation' - iv_exp = abap_true - iv_msg = |Email { cv_email_address } should have been subscribed| ). - ao_sns->deletetopic( iv_topicarn = lv_topic_arn ). - ENDMETHOD. - METHOD unsubscribe. - CONSTANTS cv_topic_name TYPE /aws1/snstopicname VALUE 'code-example-unsubscribe'. - CONSTANTS cv_queue_name TYPE /aws1/sqsstring VALUE 'code-example-unsubscribe-queue'. - - DATA(lo_create_result) = ao_sns->createtopic( iv_name = cv_topic_name ). - DATA(lv_topic_arn) = lo_create_result->get_topicarn( ). - - DATA(ao_sqs) = /aws1/cl_sqs_factory=>create( ao_session ). - DATA(lo_create_queue_result) = ao_sqs->createqueue( iv_queuename = cv_queue_name ). - DATA(lv_queue_url) = lo_create_queue_result->get_queueurl( ). - DATA lt_required_attributes TYPE /aws1/cl_sqsattrnamelist_w=>tt_attributenamelist. - APPEND NEW /aws1/cl_sqsattrnamelist_w( iv_value = 'QueueArn' ) TO lt_required_attributes. - DATA(lt_queueattributes) = ao_sqs->getqueueattributes( iv_queueurl = lv_queue_url - it_attributenames = lt_required_attributes )->get_attributes( ). - READ TABLE lt_queueattributes INTO DATA(ls_queueattribute) WITH TABLE KEY key = 'QueueArn'. - DATA(lv_queue_arn) = ls_queueattribute-value->get_value( ). - - DATA(lo_subscribe_result) = ao_sns->subscribe( - iv_topicarn = lv_topic_arn - iv_protocol = 'sqs' - iv_endpoint = lv_queue_arn - iv_returnsubscriptionarn = abap_true ). - DATA(lv_subscription_arn) = lo_subscribe_result->get_subscriptionarn( ). - ao_sns_actions->unsubscribe( lv_subscription_arn ). - assert_subscription_exists( - iv_topic_arn = lv_topic_arn - iv_subscription_arn = lv_subscription_arn - iv_exp = abap_false - iv_msg = |Subscriptionl { lv_subscription_arn } should have been subscribed| ). - ao_sqs->deletequeue( iv_queueurl = lv_queue_url ). - ao_sns->deletetopic( iv_topicarn = lv_topic_arn ). - ENDMETHOD. - METHOD list_subscriptions. - CONSTANTS cv_topic_name TYPE /aws1/snstopicname VALUE 'code-example-list-subscriptions'. - CONSTANTS cv_queue_name TYPE /aws1/sqsstring VALUE 'code-example-list-queue'. - - DATA(lo_create_result) = ao_sns->createtopic( iv_name = cv_topic_name ). - DATA(lv_topic_arn) = lo_create_result->get_topicarn( ). - - DATA(ao_sqs) = /aws1/cl_sqs_factory=>create( ao_session ). - DATA(lo_create_queue_result) = ao_sqs->createqueue( iv_queuename = cv_queue_name ). - DATA(lv_queue_url) = lo_create_queue_result->get_queueurl( ). - DATA lt_required_attributes TYPE /aws1/cl_sqsattrnamelist_w=>tt_attributenamelist. - APPEND NEW /aws1/cl_sqsattrnamelist_w( iv_value = 'QueueArn' ) TO lt_required_attributes. - DATA(lt_queueattributes) = ao_sqs->getqueueattributes( iv_queueurl = lv_queue_url - it_attributenames = lt_required_attributes )->get_attributes( ). - READ TABLE lt_queueattributes INTO DATA(ls_queueattribute) WITH TABLE KEY key = 'QueueArn'. - DATA(lv_queue_arn) = ls_queueattribute-value->get_value( ). - - DATA(lo_subscribe_result) = ao_sns->subscribe( - iv_topicarn = lv_topic_arn - iv_protocol = 'sqs' - iv_endpoint = lv_queue_arn - iv_returnsubscriptionarn = abap_true ). - DATA(lv_subscription_arn) = lo_subscribe_result->get_subscriptionarn( ). - DATA(lo_list_result) = ao_sns_actions->list_subscriptions( ). - cl_abap_unit_assert=>assert_not_initial( - act = lo_list_result->get_subscriptions( ) - msg = |Subscription List should not be empty| ). - ao_sns->unsubscribe( iv_subscriptionarn = lv_subscription_arn ). - ao_sqs->deletequeue( iv_queueurl = lv_queue_url ). - ao_sns->deletetopic( iv_topicarn = lv_topic_arn ). - ENDMETHOD. - METHOD list_topics. - CONSTANTS cv_topic_name TYPE /aws1/snstopicname VALUE 'code-example-list-topics'. - DATA(lo_create_result) = ao_sns->createtopic( iv_name = cv_topic_name ). - DATA(lv_topic_arn) = lo_create_result->get_topicarn( ). - DATA(lo_list_result) = ao_sns_actions->list_topics( ). - - LOOP AT lo_list_result->get_topics( ) INTO DATA(lo_topic). - IF lo_topic->get_topicarn( ) = lv_topic_arn. - DATA(lv_found) = abap_true. - ENDIF. - ENDLOOP. - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Topic { cv_topic_name } should have been included in topic list| ). - ao_sns->deletetopic( iv_topicarn = lv_topic_arn ). - ENDMETHOD. - METHOD publish_to_topic. - CONSTANTS cv_topic_name TYPE /aws1/snstopicname VALUE 'code-example-publish-to-topic'. - CONSTANTS cv_message TYPE /aws1/snsmessage VALUE 'Sample message published to a topic'. - DATA(lo_create_result) = ao_sns->createtopic( iv_name = cv_topic_name ). - DATA(lv_topic_arn) = lo_create_result->get_topicarn( ). - DATA(lo_publish_result) = ao_sns_actions->publish_to_topic( - iv_topic_arn = lv_topic_arn - iv_message = cv_message ). - cl_abap_unit_assert=>assert_not_initial( - act = lo_publish_result->get_messageid( ) - msg = |Failed to publish message SNS topint { lv_topic_arn }| ). - ao_sns->deletetopic( iv_topicarn = lv_topic_arn ). - ENDMETHOD. - METHOD set_topic_attributes. - CONSTANTS cv_topic_name TYPE /aws1/snstopicname VALUE 'code-example-set-topic-attributes'. - CONSTANTS cv_attribute_name TYPE /aws1/snsmessage VALUE 'DisplayName'. - CONSTANTS cv_attribute_value TYPE /aws1/snsattributevalue VALUE 'TestDisplayName'. - DATA(lo_create_result) = ao_sns->createtopic( iv_name = cv_topic_name ). - DATA(lv_topic_arn) = lo_create_result->get_topicarn( ). - DATA(lt_attributes) = ao_sns->gettopicattributes( iv_topicarn = lv_topic_arn )->get_attributes( ). - READ TABLE lt_attributes INTO DATA(ls_attributes) WITH TABLE KEY key = cv_attribute_name. - cl_abap_unit_assert=>assert_initial( - act = ls_attributes-value->get_value( ) - msg = |Display Name for SNS topic { cv_topic_name } should have be empty | ). - ao_sns_actions->set_topic_attributes( - iv_topic_arn = lv_topic_arn - iv_attribute_name = cv_attribute_name - iv_attribute_value = cv_attribute_value ). - CLEAR ls_attributes. - CLEAR lt_attributes. - lt_attributes = ao_sns->gettopicattributes( iv_topicarn = lv_topic_arn )->get_attributes( ). - READ TABLE lt_attributes INTO ls_attributes WITH TABLE KEY key = cv_attribute_name. - cl_abap_unit_assert=>assert_equals( - exp = ls_attributes-value->get_value( ) - act = cv_attribute_value - msg = |{ cv_attribute_name } for topic { cv_topic_name } did not match the expected value { cv_attribute_value }| ). - ao_sns->deletetopic( iv_topicarn = lv_topic_arn ). - ENDMETHOD. - METHOD assert_topic_exists. - - LOOP AT ao_sns->listtopics( )->get_topics( ) INTO DATA(lo_topic). - IF lo_topic->get_topicarn( ) = iv_topic_arn. - DATA(lv_found) = abap_true. - ENDIF. - ENDLOOP. - cl_abap_unit_assert=>assert_equals( - exp = iv_exp - act = lv_found - msg = iv_msg ). - ENDMETHOD. - METHOD assert_subscription_exists. - - LOOP AT ao_sns->listsubscriptionsbytopic( iv_topicarn = iv_topic_arn )->get_subscriptions( ) INTO DATA(lo_subscription). - IF lo_subscription->get_subscriptionarn( ) = iv_subscription_arn. - DATA(lv_found) = abap_true. - ENDIF. - ENDLOOP. - cl_abap_unit_assert=>assert_equals( - exp = iv_exp - act = lv_found - msg = iv_msg ). - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/sns/zcl_aws1_sns_actions.clas.xml b/sap-abap/services/sns/zcl_aws1_sns_actions.clas.xml deleted file mode 100644 index c4b3fd17488..00000000000 --- a/sap-abap/services/sns/zcl_aws1_sns_actions.clas.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - ZCL_AWS1_SNS_ACTIONS - E - SNS Code Example Actions - 1 - X - X - X - X - - - - CREATE_TOPIC - E - Create a topic. - - - DELETE_TOPIC - E - Delete a topic. - - - GET_TOPIC_ATTRIBUTES - E - Get the properties of a topic. - - - LIST_SUBSCRIPTIONS - E - List the subscribers. - - - LIST_TOPICS - E - List SNS topics. - - - PUBLISH_TO_TOPIC - E - Publish to a topic. - - - SET_TOPIC_ATTRIBUTES - E - Set topic attributes. - - - SUBSCRIBE_EMAIL - E - Subscribe an email address to a topic. - - - UNSUBSCRIBE - E - Delete a subscription. - - - - - diff --git a/sap-abap/services/sns/zcl_aws1_sns_scenario.clas.abap b/sap-abap/services/sns/zcl_aws1_sns_scenario.clas.abap deleted file mode 100644 index 5072cea4f1e..00000000000 --- a/sap-abap/services/sns/zcl_aws1_sns_scenario.clas.abap +++ /dev/null @@ -1,94 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS zcl_aws1_sns_scenario DEFINITION - PUBLIC - FINAL - CREATE PUBLIC . - - PUBLIC SECTION. - - METHODS publish_message_to_fifo_topic - IMPORTING - !iv_topic_name TYPE /aws1/snstopicname - !iv_queue_arn TYPE /aws1/sqsstring - EXPORTING - !ov_topic_arn TYPE /aws1/snstopicarn - !ov_subscription_arn TYPE /aws1/snssubscriptionarn - !ov_message_id TYPE /aws1/snsmessageid . - PROTECTED SECTION. - PRIVATE SECTION. -ENDCLASS. - - - -CLASS ZCL_AWS1_SNS_SCENARIO IMPLEMENTATION. - - - METHOD publish_message_to_fifo_topic. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sns) = /aws1/cl_sns_factory=>create( lo_session ). - - " snippet-start:[sns.abapv1.publish_message_to_fifo_queue] - - " Creates a FIFO topic. " - DATA lt_tpc_attributes TYPE /aws1/cl_snstopicattrsmap_w=>tt_topicattributesmap. - DATA ls_tpc_attributes TYPE /aws1/cl_snstopicattrsmap_w=>ts_topicattributesmap_maprow. - ls_tpc_attributes-key = 'FifoTopic'. - ls_tpc_attributes-value = NEW /aws1/cl_snstopicattrsmap_w( iv_value = 'true' ). - INSERT ls_tpc_attributes INTO TABLE lt_tpc_attributes. - - TRY. - DATA(lo_create_result) = lo_sns->createtopic( - iv_name = iv_topic_name - it_attributes = lt_tpc_attributes ). - DATA(lv_topic_arn) = lo_create_result->get_topicarn( ). - ov_topic_arn = lv_topic_arn. " ov_topic_arn is returned for testing purposes. " - MESSAGE 'FIFO topic created' TYPE 'I'. - CATCH /aws1/cx_snstopiclimitexcdex. - MESSAGE 'Unable to create more topics. You have reached the maximum number of topics allowed.' TYPE 'E'. - ENDTRY. - - " Subscribes an endpoint to an Amazon Simple Notification Service (Amazon SNS) topic. " - " Only Amazon Simple Queue Service (Amazon SQS) FIFO queues can be subscribed to an SNS FIFO topic. " - TRY. - DATA(lo_subscribe_result) = lo_sns->subscribe( - iv_topicarn = lv_topic_arn - iv_protocol = 'sqs' - iv_endpoint = iv_queue_arn ). - DATA(lv_subscription_arn) = lo_subscribe_result->get_subscriptionarn( ). - ov_subscription_arn = lv_subscription_arn. " ov_subscription_arn is returned for testing purposes. " - MESSAGE 'SQS queue was subscribed to SNS topic.' TYPE 'I'. - CATCH /aws1/cx_snsnotfoundexception. - MESSAGE 'Topic does not exist.' TYPE 'E'. - CATCH /aws1/cx_snssubscriptionlmte00. - MESSAGE 'Unable to create subscriptions. You have reached the maximum number of subscriptions allowed.' TYPE 'E'. - ENDTRY. - - " Publish message to SNS topic. " - TRY. - DATA lt_msg_attributes TYPE /aws1/cl_snsmessageattrvalue=>tt_messageattributemap. - DATA ls_msg_attributes TYPE /aws1/cl_snsmessageattrvalue=>ts_messageattributemap_maprow. - ls_msg_attributes-key = 'Importance'. - ls_msg_attributes-value = NEW /aws1/cl_snsmessageattrvalue( iv_datatype = 'String' - iv_stringvalue = 'High' ). - INSERT ls_msg_attributes INTO TABLE lt_msg_attributes. - - DATA(lo_result) = lo_sns->publish( - iv_topicarn = lv_topic_arn - iv_message = 'The price of your mobile plan has been increased from $19 to $23' - iv_subject = 'Changes to mobile plan' - iv_messagegroupid = 'Update-2' - iv_messagededuplicationid = 'Update-2.1' - it_messageattributes = lt_msg_attributes ). - ov_message_id = lo_result->get_messageid( ). " ov_message_id is returned for testing purposes. " - MESSAGE 'Message was published to SNS topic.' TYPE 'I'. - CATCH /aws1/cx_snsnotfoundexception. - MESSAGE 'Topic does not exist.' TYPE 'E'. - ENDTRY. - - " snippet-end:[sns.abapv1.publish_message_to_fifo_queue] - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/sns/zcl_aws1_sns_scenario.clas.testclasses.abap b/sap-abap/services/sns/zcl_aws1_sns_scenario.clas.testclasses.abap deleted file mode 100644 index c85833fde4e..00000000000 --- a/sap-abap/services/sns/zcl_aws1_sns_scenario.clas.testclasses.abap +++ /dev/null @@ -1,187 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS ltc_zcl_aws1_sns_scenario DEFINITION DEFERRED. -CLASS zcl_aws1_sns_scenario DEFINITION LOCAL FRIENDS ltc_zcl_aws1_sns_scenario. - -CLASS ltc_zcl_aws1_sns_scenario DEFINITION FOR TESTING DURATION MEDIUM RISK LEVEL DANGEROUS. - - PRIVATE SECTION. - CONSTANTS: cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO', - cv_topic_name TYPE /aws1/snstopicname VALUE 'code-example-scenario-topic.fifo', - cv_queue_name TYPE /aws1/sqsstring VALUE 'code-example-scenario-queue.fifo'. - - DATA ao_sns TYPE REF TO /aws1/if_sns. - DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. - DATA ao_sns_scenario TYPE REF TO zcl_aws1_sns_scenario. - DATA ao_sqs TYPE REF TO /aws1/if_sqs. - - DATA av_topic_arn TYPE /aws1/snstopicarn. - DATA av_queue_arn TYPE /aws1/sqsstring. - DATA av_queue_url TYPE /aws1/sqsstring. - - METHODS fifo_topic_scenario FOR TESTING RAISING /aws1/cx_rt_generic. - - METHODS: setup RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic, - create_and_configure_queue RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic, - verify_message_delivery - IMPORTING iv_message_id TYPE /aws1/snsmessageid - RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic, - delete_queue RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic, - assert_subscription_deleted RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic, - assert_queue_deleted RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic, - assert_topic_deleted RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic. - -ENDCLASS. -CLASS ltc_zcl_aws1_sns_scenario IMPLEMENTATION. - - METHOD setup. - ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). - ao_sns = /aws1/cl_sns_factory=>create( ao_session ). - ao_sns_scenario = NEW zcl_aws1_sns_scenario( ). - ao_sqs = /aws1/cl_sqs_factory=>create( ao_session ). - - ENDMETHOD. - METHOD fifo_topic_scenario. - DATA lv_subscription_arn TYPE /aws1/snssubscriptionarn. - DATA lv_message_id TYPE /aws1/snsmessageid. - - "Create and configure FIFO queue. - create_and_configure_queue( ). - - - - ao_sns_scenario->publish_message_to_fifo_topic( - EXPORTING - iv_topic_name = cv_topic_name - iv_queue_arn = av_queue_arn - IMPORTING - ov_subscription_arn = lv_subscription_arn - ov_topic_arn = av_topic_arn - ov_message_id = lv_message_id ). - - " Verify message delivery (message received by queue). - verify_message_delivery( lv_message_id ). - - " Delete subscription. - ao_sns->unsubscribe( iv_subscriptionarn = lv_subscription_arn ). - assert_subscription_deleted( ). - - "Delete FIFO queue. - delete_queue( ). - assert_queue_deleted( ). - - "Delete Amazon Simple Notification Service (Amazon SNS) topic. - ao_sns->deletetopic( iv_topicarn = av_topic_arn ). - assert_topic_deleted( ). - - ENDMETHOD. - METHOD create_and_configure_queue. - DATA lt_attributes TYPE /aws1/cl_sqsqueueattrmap_w=>tt_queueattributemap. - DATA ls_attribute TYPE /aws1/cl_sqsqueueattrmap_w=>ts_queueattributemap_maprow. - ls_attribute-key = 'FifoQueue'. - ls_attribute-value = NEW /aws1/cl_sqsqueueattrmap_w( iv_value = 'true' ). - INSERT ls_attribute INTO TABLE lt_attributes. - - DATA(lo_create_queue_result) = ao_sqs->createqueue( - iv_queuename = cv_queue_name - it_attributes = lt_attributes ). - av_queue_url = lo_create_queue_result->get_queueurl( ). - cl_abap_unit_assert=>assert_not_initial( - act = av_queue_url - msg = |Failed to create queue { cv_queue_name }| ). - - DATA(lv_policydocument) = |\{ | && - | "Version": "2008-10-17", | && - | "Statement": [ | && - | \{ | && - | "Effect": "Allow", | && - | "Principal": \{ | && - | "Service": "sns.amazonaws.com" | && - | \}, | && - | "Action": "sqs:SendMessage", | && - | "Resource": "arn:aws:sqs:*:*:code-example-scenario-queue.fifo", | && - | "Condition": \{ | && - | "ArnEquals": \{ | && - | "aws:SourceArn": "arn:aws:sns:*:*:code-example-scenario-topic.fifo" | && - | \} | && - | \} | && - | \} | && - | ] | && - |\} |. - - - CLEAR lt_attributes. - CLEAR ls_attribute. - ls_attribute-key = 'Policy'. - ls_attribute-value = NEW /aws1/cl_sqsqueueattrmap_w( iv_value = lv_policydocument ). - INSERT ls_attribute INTO TABLE lt_attributes. - - ao_sqs->setqueueattributes( - iv_queueurl = av_queue_url - it_attributes = lt_attributes ). - - DATA lt_required_attributes TYPE /aws1/cl_sqsattrnamelist_w=>tt_attributenamelist. - APPEND NEW /aws1/cl_sqsattrnamelist_w( iv_value = 'QueueArn' ) TO lt_required_attributes. - DATA(lt_queueattributes) = ao_sqs->getqueueattributes( iv_queueurl = av_queue_url - it_attributenames = lt_required_attributes )->get_attributes( ). - READ TABLE lt_queueattributes INTO DATA(ls_queueattribute) WITH TABLE KEY key = 'QueueArn'. - av_queue_arn = ls_queueattribute-value->get_value( ). - - ENDMETHOD. - METHOD verify_message_delivery. - WAIT UP TO 20 SECONDS. "Making sure that the message is received by the Amazon Simple Queue Service (Amazon SQS) queue. - DATA(lo_result) = ao_sqs->receivemessage( iv_queueurl = av_queue_url ). - - - LOOP AT lo_result->get_messages( ) INTO DATA(lo_message). - IF lo_message->get_body( ) CS iv_message_id. - DATA(lv_found) = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Received message did not match expected body contents| ). - ENDMETHOD. - METHOD delete_queue. - ao_sqs->deletequeue( iv_queueurl = av_queue_url ). - WAIT UP TO 60 SECONDS. "Queue deletion operation takes up to 60 seconds. - ENDMETHOD. - METHOD assert_subscription_deleted. - - LOOP AT ao_sns->listsubscriptionsbytopic( iv_topicarn = av_topic_arn )->get_subscriptions( ) INTO DATA(lo_subscription). - IF lo_subscription->get_endpoint( ) = av_queue_arn AND lo_subscription->get_protocol( ) = 'sqs'. - DATA(lv_found) = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_false( - act = lv_found - msg = |Subscription should have been deleted| ). - ENDMETHOD. - METHOD assert_topic_deleted. - - LOOP AT ao_sns->listtopics( )->get_topics( ) INTO DATA(lo_topic). - IF lo_topic->get_topicarn( ) = av_topic_arn. - DATA(lv_found) = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_false( - act = lv_found - msg = |Topic { cv_topic_name } should have been deleted| ). - ENDMETHOD. - METHOD assert_queue_deleted. - - LOOP AT ao_sqs->listqueues( )->get_queueurls( ) INTO DATA(lo_url). - IF lo_url->get_value( ) = av_queue_url. - DATA(lv_found) = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_false( - act = lv_found - msg = |Queue { cv_queue_name } should have been deleted| ). - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/sns/zcl_aws1_sns_scenario.clas.xml b/sap-abap/services/sns/zcl_aws1_sns_scenario.clas.xml deleted file mode 100644 index 6e2c479edfc..00000000000 --- a/sap-abap/services/sns/zcl_aws1_sns_scenario.clas.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - ZCL_AWS1_SNS_SCENARIO - E - SNS Code Example Scenarios - 1 - X - X - X - X - - - - PUBLISH_MESSAGE_TO_FIFO_TOPIC - E - Create and publish to a FIFO topic. - - - - - diff --git a/sap-abap/services/sqs/zcl_aws1_sqs_actions.clas.abap b/sap-abap/services/sqs/zcl_aws1_sqs_actions.clas.abap deleted file mode 100644 index 45855f60acf..00000000000 --- a/sap-abap/services/sqs/zcl_aws1_sqs_actions.clas.abap +++ /dev/null @@ -1,208 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS zcl_aws1_sqs_actions DEFINITION - PUBLIC - FINAL - CREATE PUBLIC . - - PUBLIC SECTION. - PROTECTED SECTION. - PRIVATE SECTION. - - METHODS create_queue - IMPORTING - !iv_queue_name TYPE /aws1/sqsstring - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_sqscreatequeueresult . - METHODS delete_queue - IMPORTING - !iv_queue_url TYPE /aws1/sqsstring . - METHODS send_message - IMPORTING - !iv_queue_url TYPE /aws1/sqsstring - !iv_message TYPE /aws1/sqsstring - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_sqssendmessageresult . - METHODS receive_message - IMPORTING - !iv_queue_url TYPE /aws1/sqsstring - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_sqsreceivemsgresult . - METHODS get_queue_url - IMPORTING - !iv_queue_name TYPE /aws1/sqsstring - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_sqsgetqueueurlresult . - METHODS list_queues - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_sqslistqueuesresult . - METHODS long_polling_on_msg_receipt - IMPORTING - !iv_queue_url TYPE /aws1/sqsstring - !iv_wait_time TYPE /aws1/sqsinteger - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_sqsreceivemsgresult . - METHODS long_polling_on_create_queue - IMPORTING - !iv_queue_name TYPE /aws1/sqsstring - !iv_wait_time TYPE /aws1/sqsstring - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_sqscreatequeueresult . -ENDCLASS. - - - -CLASS ZCL_AWS1_SQS_ACTIONS IMPLEMENTATION. - - - METHOD create_queue. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sqs) = /aws1/cl_sqs_factory=>create( lo_session ). - - " snippet-start:[sqs.abapv1.create_queue] - TRY. - oo_result = lo_sqs->createqueue( iv_queuename = iv_queue_name ). " oo_result is returned for testing purposes. " - MESSAGE 'SQS queue created.' TYPE 'I'. - CATCH /aws1/cx_sqsqueuedeldrecently. - MESSAGE 'After deleting a queue, wait 60 seconds before creating another queue with the same name.' TYPE 'E'. - CATCH /aws1/cx_sqsqueuenameexists. - MESSAGE 'A queue with this name already exists.' TYPE 'E'. - ENDTRY. - " snippet-end:[sqs.abapv1.create_queue] - ENDMETHOD. - - - METHOD delete_queue. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sqs) = /aws1/cl_sqs_factory=>create( lo_session ). - - " snippet-start:[sqs.abapv1.delete_queue] - TRY. - lo_sqs->deletequeue( iv_queueurl = iv_queue_url ). - MESSAGE 'SQS queue deleted' TYPE 'I'. - ENDTRY. - " snippet-end:[sqs.abapv1.delete_queue] - ENDMETHOD. - - - METHOD get_queue_url. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sqs) = /aws1/cl_sqs_factory=>create( lo_session ). - - " snippet-start:[sqs.abapv1.get_queue_url] - TRY. - oo_result = lo_sqs->getqueueurl( iv_queuename = iv_queue_name ). " oo_result is returned for testing purposes. " - MESSAGE 'Queue URL retrieved.' TYPE 'I'. - CATCH /aws1/cx_sqsqueuedoesnotexist. - MESSAGE 'The requested queue does not exist.' TYPE 'E'. - ENDTRY. - " snippet-end:[sqs.abapv1.get_queue_url] - ENDMETHOD. - - - METHOD list_queues. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sqs) = /aws1/cl_sqs_factory=>create( lo_session ). - - " snippet-start:[sqs.abapv1.list_queues] - TRY. - oo_result = lo_sqs->listqueues( ). " oo_result is returned for testing purposes. " - MESSAGE 'Retrieved list of queues.' TYPE 'I'. - ENDTRY. - " snippet-end:[sqs.abapv1.list_queues] - ENDMETHOD. - - - METHOD long_polling_on_create_queue. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sqs) = /aws1/cl_sqs_factory=>create( lo_session ). - - " snippet-start:[sqs.abapv1.long_polling_on_create_queue] - TRY. - DATA lt_attributes TYPE /aws1/cl_sqsqueueattrmap_w=>tt_queueattributemap. - DATA ls_attribute TYPE /aws1/cl_sqsqueueattrmap_w=>ts_queueattributemap_maprow. - ls_attribute-key = 'ReceiveMessageWaitTimeSeconds'. " Time in seconds for long polling, such as how long the call waits for a message to arrive in the queue before returning. " - ls_attribute-value = NEW /aws1/cl_sqsqueueattrmap_w( iv_value = iv_wait_time ). - INSERT ls_attribute INTO TABLE lt_attributes. - oo_result = lo_sqs->createqueue( " oo_result is returned for testing purposes. " - iv_queuename = iv_queue_name - it_attributes = lt_attributes ). - MESSAGE 'SQS queue created.' TYPE 'I'. - CATCH /aws1/cx_sqsqueuedeldrecently. - MESSAGE 'After deleting a queue, wait 60 seconds before creating another queue with the same name.' TYPE 'E'. - CATCH /aws1/cx_sqsqueuenameexists. - MESSAGE 'A queue with this name already exists.' TYPE 'E'. - ENDTRY. - " snippet-end:[sqs.abapv1.long_polling_on_create_queue] - ENDMETHOD. - - - METHOD long_polling_on_msg_receipt. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sqs) = /aws1/cl_sqs_factory=>create( lo_session ). - - " snippet-start:[sqs.abapv1.long_polling_on_msg_receipt] - TRY. - oo_result = lo_sqs->receivemessage( " oo_result is returned for testing purposes. " - iv_queueurl = iv_queue_url - iv_waittimeseconds = iv_wait_time ). " Time in seconds for long polling, such as how long the call waits for a message to arrive in the queue before returning. " ). - DATA(lt_messages) = oo_result->get_messages( ). - MESSAGE 'Message received from SQS queue.' TYPE 'I'. - CATCH /aws1/cx_sqsoverlimit. - MESSAGE 'Maximum number of in-flight messages reached.' TYPE 'E'. - ENDTRY. - " snippet-end:[sqs.abapv1.long_polling_on_msg_receipt] - ENDMETHOD. - - - METHOD receive_message. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sqs) = /aws1/cl_sqs_factory=>create( lo_session ). - - " snippet-start:[sqs.abapv1.receive_message] - TRY. - oo_result = lo_sqs->receivemessage( iv_queueurl = iv_queue_url ). " oo_result is returned for testing purposes. " - DATA(lt_messages) = oo_result->get_messages( ). - MESSAGE 'Message received from SQS queue.' TYPE 'I'. - CATCH /aws1/cx_sqsoverlimit. - MESSAGE 'Maximum number of in-flight messages reached.' TYPE 'E'. - ENDTRY. - " snippet-end:[sqs.abapv1.receive_message] - ENDMETHOD. - - - METHOD send_message. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_sqs) = /aws1/cl_sqs_factory=>create( lo_session ). - - " snippet-start:[sqs.abapv1.send_message] - TRY. - oo_result = lo_sqs->sendmessage( " oo_result is returned for testing purposes. " - iv_queueurl = iv_queue_url - iv_messagebody = iv_message ). - MESSAGE 'Message sent to SQS queue.' TYPE 'I'. - CATCH /aws1/cx_sqsinvalidmsgconts. - MESSAGE 'Message contains non-valid characters.' TYPE 'E'. - CATCH /aws1/cx_sqsunsupportedop. - MESSAGE 'Operation not supported.' TYPE 'E'. - ENDTRY. - " snippet-end:[sqs.abapv1.send_message] - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/sqs/zcl_aws1_sqs_actions.clas.testclasses.abap b/sap-abap/services/sqs/zcl_aws1_sqs_actions.clas.testclasses.abap deleted file mode 100644 index b934849490d..00000000000 --- a/sap-abap/services/sqs/zcl_aws1_sqs_actions.clas.testclasses.abap +++ /dev/null @@ -1,215 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS ltc_zcl_aws1_sqs_actions DEFINITION DEFERRED. -CLASS zcl_aws1_sqs_actions DEFINITION LOCAL FRIENDS ltc_zcl_aws1_sqs_actions. - -CLASS ltc_zcl_aws1_sqs_actions DEFINITION FOR TESTING DURATION MEDIUM RISK LEVEL DANGEROUS. - - PRIVATE SECTION. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA ao_sqs TYPE REF TO /aws1/if_sqs. - DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. - DATA ao_sqs_actions TYPE REF TO zcl_aws1_sqs_actions. - - METHODS: create_queue FOR TESTING RAISING /aws1/cx_rt_generic, - send_message FOR TESTING RAISING /aws1/cx_rt_generic, - receive_message FOR TESTING RAISING /aws1/cx_rt_generic, - list_queues FOR TESTING RAISING /aws1/cx_rt_generic, - get_queue_url FOR TESTING RAISING /aws1/cx_rt_generic, - delete_queue FOR TESTING RAISING /aws1/cx_rt_generic, - long_polling_on_msg_receipt FOR TESTING RAISING /aws1/cx_rt_generic, - long_polling_on_create_queue FOR TESTING RAISING /aws1/cx_rt_generic. - - METHODS setup RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic. - - METHODS assert_queue_exists - IMPORTING - iv_queue_url TYPE /aws1/sqsstring - iv_msg TYPE string - RAISING /aws1/cx_rt_generic. - - -ENDCLASS. -CLASS ltc_zcl_aws1_sqs_actions IMPLEMENTATION. - - METHOD setup. - ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). - ao_sqs = /aws1/cl_sqs_factory=>create( ao_session ). - ao_sqs_actions = NEW zcl_aws1_sqs_actions( ). - ENDMETHOD. - METHOD create_queue. - CONSTANTS cv_queue_name TYPE /aws1/sqsstring VALUE 'code-example-create-queue'. - DATA(lo_result) = ao_sqs_actions->create_queue( cv_queue_name ). - assert_queue_exists( - iv_queue_url = lo_result->get_queueurl( ) - iv_msg = |Queue { cv_queue_name } was not created| ). - ao_sqs->deletequeue( iv_queueurl = lo_result->get_queueurl( ) ). - ENDMETHOD. - METHOD send_message. - CONSTANTS cv_queue_name TYPE /aws1/sqsstring VALUE 'code-example-send-message'. - CONSTANTS cv_message TYPE /aws1/sqsstring VALUE 'Sample text message to test send message action'. - DATA(lo_create_result) = ao_sqs->createqueue( iv_queuename = cv_queue_name ). - DATA(lo_send_result) = ao_sqs_actions->send_message( - iv_queue_url = lo_create_result->get_queueurl( ) - iv_message = cv_message ). - cl_abap_unit_assert=>assert_not_initial( - act = lo_send_result->get_messageid( ) - msg = |Message sending failed| ). - DATA(lo_receive_result) = ao_sqs->receivemessage( iv_queueurl = lo_create_result->get_queueurl( ) ). - - LOOP AT lo_receive_result->get_messages( ) INTO DATA(lo_message). - IF lo_message->get_messageid( ) = lo_send_result->get_messageid( ) AND lo_message->get_body( ) = cv_message. - DATA(lv_found) = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Did not receive message { cv_message }| ). - ao_sqs->deletequeue( iv_queueurl = lo_create_result->get_queueurl( ) ). - - ENDMETHOD. - METHOD receive_message. - CONSTANTS cv_queue_name TYPE /aws1/sqsstring VALUE 'code-example-receive-message'. - CONSTANTS cv_message TYPE /aws1/sqsstring VALUE 'Sample text message to test receive message action'. - DATA(lo_create_result) = ao_sqs->createqueue( iv_queuename = cv_queue_name ). - DATA(lo_send_result) = ao_sqs->sendmessage( - iv_queueurl = lo_create_result->get_queueurl( ) - iv_messagebody = cv_message ). - DATA(lo_receive_result) = ao_sqs_actions->receive_message( lo_create_result->get_queueurl( ) ). - - LOOP AT lo_receive_result->get_messages( ) INTO DATA(lo_message). - IF lo_message->get_messageid( ) = lo_send_result->get_messageid( ) AND lo_message->get_body( ) = cv_message. - DATA(lv_found) = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Did not receive message { cv_message }| ). - ao_sqs->deletequeue( iv_queueurl = lo_create_result->get_queueurl( ) ). - - ENDMETHOD. - METHOD long_polling_on_msg_receipt. - CONSTANTS cv_queue_name TYPE /aws1/sqsstring VALUE 'code-example-long-polling-on-msg-receipt'. - CONSTANTS cv_message TYPE /aws1/sqsstring VALUE 'Sample text message to test long polling on message receipt'. - CONSTANTS cv_wait_time TYPE /aws1/sqsinteger VALUE 10. - DATA(lo_create_result) = ao_sqs->createqueue( iv_queuename = cv_queue_name ). - DATA(lo_send_result) = ao_sqs->sendmessage( - iv_queueurl = lo_create_result->get_queueurl( ) - iv_messagebody = cv_message ). - DATA(lo_polling_result) = ao_sqs_actions->long_polling_on_msg_receipt( - iv_queue_url = lo_create_result->get_queueurl( ) - iv_wait_time = cv_wait_time ). - - LOOP AT lo_polling_result->get_messages( ) INTO DATA(lo_message). - IF lo_message->get_messageid( ) = lo_send_result->get_messageid( ) AND lo_message->get_body( ) = cv_message. - DATA(lv_found) = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Did not receive message { cv_message }| ). - ao_sqs->deletequeue( iv_queueurl = lo_create_result->get_queueurl( ) ). - - ENDMETHOD. - METHOD long_polling_on_create_queue. - CONSTANTS cv_queue_name TYPE /aws1/sqsstring VALUE 'code-example-long-polling-on-create-queue'. - CONSTANTS cv_wait_time TYPE /aws1/sqsstring VALUE '10'. - DATA(lo_create_result) = ao_sqs_actions->long_polling_on_create_queue( - iv_queue_name = cv_queue_name - iv_wait_time = cv_wait_time ). - assert_queue_exists( - iv_queue_url = lo_create_result->get_queueurl( ) - iv_msg = |Queue { cv_queue_name } was not created| ). - - DATA lt_attributes TYPE /aws1/cl_sqsattrnamelist_w=>tt_attributenamelist. - APPEND NEW /aws1/cl_sqsattrnamelist_w( iv_value = 'ReceiveMessageWaitTimeSeconds' ) TO lt_attributes. - DATA(lo_get_result) = ao_sqs->getqueueattributes( - iv_queueurl = lo_create_result->get_queueurl( ) - it_attributenames = lt_attributes ). - LOOP AT lo_get_result->get_attributes( ) INTO DATA(lo_attribute). - IF lo_attribute-key = 'ReceiveMessageWaitTimeSeconds'. - cl_abap_unit_assert=>assert_equals( - act = cv_wait_time - exp = lo_attribute-value->get_value( ) - msg = |ReceiveMessageWaitTimeSeconds attribute for queue { cv_queue_name } did not match the expected value| ). - ENDIF. - ENDLOOP. - ao_sqs->deletequeue( iv_queueurl = lo_create_result->get_queueurl( ) ). - ENDMETHOD. - METHOD get_queue_url. - CONSTANTS cv_queue_name TYPE /aws1/sqsstring VALUE 'code-example-get-queue-url'. - DATA(lo_create_result) = ao_sqs->createqueue( iv_queuename = cv_queue_name ). - DATA(lo_get_result) = ao_sqs_actions->get_queue_url( cv_queue_name ). - cl_abap_unit_assert=>assert_equals( - act = lo_create_result->get_queueurl( ) - exp = lo_get_result->get_queueurl( ) - msg = |Queue URL { lo_get_result->get_queueurl( ) } did not match expected value { lo_create_result->get_queueurl( ) }| ). - ao_sqs->deletequeue( iv_queueurl = lo_create_result->get_queueurl( ) ). - ENDMETHOD. - METHOD list_queues. - CONSTANTS cv_queue_name TYPE /aws1/sqsstring VALUE 'code-example-list-queues'. - DATA(lo_create_result) = ao_sqs->createqueue( iv_queuename = cv_queue_name ). - - DATA lv_found TYPE abap_bool VALUE abap_false. - DATA lo_result TYPE REF TO /aws1/cl_sqslistqueuesresult. - WHILE lv_found = abap_false AND sy-index <= 6. - WAIT UP TO 10 SECONDS. " Making sure that the queue is ready for use after creation. - lo_result = ao_sqs_actions->list_queues( ). - LOOP AT lo_result->get_queueurls( ) INTO DATA(lo_url). - IF lo_url->get_value( ) = lo_create_result->get_queueurl( ). - lv_found = abap_true. - ENDIF. - ENDLOOP. - ENDWHILE. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Queue { cv_queue_name } should have been included in queue list| ). - ao_sqs->deletequeue( iv_queueurl = lo_create_result->get_queueurl( ) ). - ENDMETHOD. - METHOD delete_queue. - CONSTANTS cv_queue_name TYPE /aws1/sqsstring VALUE 'code-example-delete-queue'. - DATA(lo_create_result) = ao_sqs->createqueue( iv_queuename = cv_queue_name ). - ao_sqs_actions->delete_queue( lo_create_result->get_queueurl( ) ). - - DATA lv_found TYPE abap_bool VALUE abap_true. - DATA lo_list_result TYPE REF TO /aws1/cl_sqslistqueuesresult. - WHILE lv_found = abap_true AND sy-index <= 6. - WAIT UP TO 10 SECONDS. " Queue deletion can take up to 60 seconds. - lv_found = abap_false. - lo_list_result = ao_sqs->listqueues( ). - LOOP AT lo_list_result->get_queueurls( ) INTO DATA(lo_url). - IF lo_url->get_value( ) = lo_create_result->get_queueurl( ). - lv_found = abap_true. - ENDIF. - ENDLOOP. - ENDWHILE. - - cl_abap_unit_assert=>assert_false( - act = lv_found - msg = |Queue { cv_queue_name } should have been deleted| ). - ENDMETHOD. - METHOD assert_queue_exists. - DATA lv_found TYPE abap_bool VALUE abap_false. - DATA lo_result TYPE REF TO /aws1/cl_sqslistqueuesresult. - WHILE lv_found = abap_false AND sy-index <= 6. - WAIT UP TO 10 SECONDS. " Making sure that the queue is ready for use after creation. - lo_result = ao_sqs->listqueues( ). - LOOP AT lo_result->get_queueurls( ) INTO DATA(lo_url). - IF lo_url->get_value( ) = iv_queue_url. - lv_found = abap_true. - ENDIF. - ENDLOOP. - ENDWHILE. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = iv_msg ). - - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/sqs/zcl_aws1_sqs_actions.clas.xml b/sap-abap/services/sqs/zcl_aws1_sqs_actions.clas.xml deleted file mode 100644 index 4299f3f1aa3..00000000000 --- a/sap-abap/services/sqs/zcl_aws1_sqs_actions.clas.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - ZCL_AWS1_SQS_ACTIONS - E - SQS Code Example Actions - 1 - X - X - X - X - - - - CREATE_QUEUE - E - Create a queue. - - - DELETE_QUEUE - E - Delete a queue. - - - GET_QUEUE_URL - E - Retrieve the URL of a queue. - - - LIST_QUEUES - E - Retrieve a list of queues. - - - LONG_POLLING_ON_CREATE_QUEUE - E - Create an SQS queue with long polling enabled. - - - LONG_POLLING_ON_MSG_RECEIPT - E - Enable long polling on a message receipt. - - - RECEIVE_MESSAGE - E - Receive message from a queue. - - - SEND_MESSAGE - E - Sending message to a queue. - - - - - diff --git a/sap-abap/services/textract/README.md b/sap-abap/services/tex/README.md similarity index 100% rename from sap-abap/services/textract/README.md rename to sap-abap/services/tex/README.md diff --git a/sap-abap/services/textract/package.devc.xml b/sap-abap/services/textract/package.devc.xml deleted file mode 100644 index 886a6163a3f..00000000000 --- a/sap-abap/services/textract/package.devc.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - Package for Amazon Textract - - - - diff --git a/sap-abap/services/textract/zcl_aws1_tex_actions.clas.abap b/sap-abap/services/textract/zcl_aws1_tex_actions.clas.abap deleted file mode 100644 index 6affb10d31d..00000000000 --- a/sap-abap/services/textract/zcl_aws1_tex_actions.clas.abap +++ /dev/null @@ -1,368 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 -CLASS zcl_aws1_tex_actions DEFINITION - PUBLIC - FINAL - CREATE PUBLIC . - - PUBLIC SECTION. - - METHODS analyze_document - IMPORTING - !iv_s3object TYPE /aws1/texs3objectname OPTIONAL - !iv_s3bucket TYPE /aws1/texs3bucket OPTIONAL - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_texanalyzedocresponse . - METHODS detect_document_text - IMPORTING - !iv_s3object TYPE /aws1/texs3objectname - !iv_s3bucket TYPE /aws1/texs3bucket - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_texdetectdoctextrsp . - METHODS get_document_analysis - IMPORTING - !iv_jobid TYPE /aws1/texjobid - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_texgetdocalyresponse . - METHODS start_document_analysis - IMPORTING - !iv_s3object TYPE /aws1/texs3objectname - !iv_s3bucket TYPE /aws1/texs3bucket - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_texstartdocalyrsp . - METHODS start_document_text_detection - IMPORTING - !iv_s3object TYPE /aws1/texs3objectname - !iv_s3bucket TYPE /aws1/texs3bucket - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_texstartdoctextdetrsp . - PROTECTED SECTION. - PRIVATE SECTION. -ENDCLASS. - - - -CLASS ZCL_AWS1_TEX_ACTIONS IMPLEMENTATION. - - - METHOD analyze_document. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - - "Textract requires endpoint region to be same as the bucket region. - "Retrieve the region name defined as a logical resource in SDK configuration. - CONSTANTS cv_lbucket TYPE string VALUE 'ZEX_TEX_BUCKET_REGION'. - DATA lv_bucket_region TYPE /aws1/rt_region_id. - lv_bucket_region = lo_session->resolve_lresource( cv_lbucket ). - DATA(lo_tex) = /aws1/cl_tex_factory=>create( - io_session = lo_session - iv_region = lv_bucket_region ). - "snippet-start:[tex.abapv1.analyze_document] - - "Detects text and additional elements, such as forms or tables," - "in a local image file or from in-memory byte data." - "The image must be in PNG or JPG format." - - - "Create ABAP objects for feature type." - "Add TABLES to return information about the tables." - "Add FORMS to return detected form data." - "To perform both types of analysis, add TABLES and FORMS to FeatureTypes." - - DATA(lt_featuretypes) = VALUE /aws1/cl_texfeaturetypes_w=>tt_featuretypes( - ( NEW /aws1/cl_texfeaturetypes_w( iv_value = 'FORMS' ) ) - ( NEW /aws1/cl_texfeaturetypes_w( iv_value = 'TABLES' ) ) ). - - "Create an ABAP object for the Amazon Simple Storage Service (Amazon S3) object." - DATA(lo_s3object) = NEW /aws1/cl_texs3object( iv_bucket = iv_s3bucket - iv_name = iv_s3object ). - - "Create an ABAP object for the document." - DATA(lo_document) = NEW /aws1/cl_texdocument( io_s3object = lo_s3object ). - - "Analyze document stored in Amazon S3." - TRY. - oo_result = lo_tex->analyzedocument( "oo_result is returned for testing purposes." - io_document = lo_document - it_featuretypes = lt_featuretypes ). - LOOP AT oo_result->get_blocks( ) INTO DATA(lo_block). - IF lo_block->get_text( ) = 'INGREDIENTS: POWDERED SUGAR* (CANE SUGAR,'. - MESSAGE 'Found text in the doc: ' && lo_block->get_text( ) TYPE 'I'. - ENDIF. - ENDLOOP. - MESSAGE 'Analyze document completed.' TYPE 'I'. - CATCH /aws1/cx_texaccessdeniedex. - MESSAGE 'You do not have permission to perform this action.' TYPE 'E'. - CATCH /aws1/cx_texbaddocumentex. - MESSAGE 'Amazon Textract is not able to read the document.' TYPE 'E'. - CATCH /aws1/cx_texdocumenttoolargeex. - MESSAGE 'The document is too large.' TYPE 'E'. - CATCH /aws1/cx_texhlquotaexceededex. - MESSAGE 'Human loop quota exceeded.' TYPE 'E'. - CATCH /aws1/cx_texinternalservererr. - MESSAGE 'Internal server error.' TYPE 'E'. - CATCH /aws1/cx_texinvalidparameterex. - MESSAGE 'Request has non-valid parameters.' TYPE 'E'. - - CATCH /aws1/cx_texinvalids3objectex. - MESSAGE 'Amazon S3 object is not valid.' TYPE 'E'. - CATCH /aws1/cx_texprovthruputexcdex. - MESSAGE 'Provisioned throughput exceeded limit.' TYPE 'E'. - CATCH /aws1/cx_texthrottlingex. - MESSAGE 'The request processing exceeded the limit.' TYPE 'E'. - CATCH /aws1/cx_texunsupporteddocex. - MESSAGE 'The document is not supported.' TYPE 'E'. - ENDTRY. - "snippet-end:[tex.abapv1.analyze_document] - ENDMETHOD. - - - METHOD detect_document_text. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - - "Textract requires endpoint region to be same as the bucket region. - "Retrieve the region name defined as a logical resource in SDK configuration. - CONSTANTS cv_lbucket TYPE string VALUE 'ZEX_TEX_BUCKET_REGION'. - DATA lv_bucket_region TYPE /aws1/rt_region_id. - lv_bucket_region = lo_session->resolve_lresource( cv_lbucket ). - DATA(lo_tex) = /aws1/cl_tex_factory=>create( - io_session = lo_session - iv_region = lv_bucket_region ). - - "snippet-start:[tex.abapv1.detect_document_text] - - "Detects text in the input document." - "Amazon Textract can detect lines of text and the words that make up a line of text." - "The input document must be in one of the following image formats: JPEG, PNG, PDF, or TIFF." - - "Create an ABAP object for the Amazon S3 object." - DATA(lo_s3object) = NEW /aws1/cl_texs3object( iv_bucket = iv_s3bucket - iv_name = iv_s3object ). - - "Create an ABAP object for the document." - DATA(lo_document) = NEW /aws1/cl_texdocument( io_s3object = lo_s3object ). - "Analyze document stored in Amazon S3." - TRY. - oo_result = lo_tex->detectdocumenttext( io_document = lo_document ). "oo_result is returned for testing purposes." - LOOP AT oo_result->get_blocks( ) INTO DATA(lo_block). - IF lo_block->get_text( ) = 'INGREDIENTS: POWDERED SUGAR* (CANE SUGAR,'. - MESSAGE 'Found text in the doc: ' && lo_block->get_text( ) TYPE 'I'. - ENDIF. - ENDLOOP. - DATA(lo_metadata) = oo_result->get_documentmetadata( ). - MESSAGE 'The number of pages in the document is ' && lo_metadata->ask_pages( ) TYPE 'I'. - MESSAGE 'Detect document text completed.' TYPE 'I'. - CATCH /aws1/cx_texaccessdeniedex. - MESSAGE 'You do not have permission to perform this action.' TYPE 'E'. - CATCH /aws1/cx_texbaddocumentex. - MESSAGE 'Amazon Textract is not able to read the document.' TYPE 'E'. - CATCH /aws1/cx_texdocumenttoolargeex. - MESSAGE 'The document is too large.' TYPE 'E'. - CATCH /aws1/cx_texinternalservererr. - MESSAGE 'Internal server error.' TYPE 'E'. - CATCH /aws1/cx_texinvalidparameterex. - MESSAGE 'Request has non-valid parameters.' TYPE 'E'. - CATCH /aws1/cx_texinvalids3objectex. - MESSAGE 'Amazon S3 object is not valid.' TYPE 'E'. - CATCH /aws1/cx_texprovthruputexcdex. - MESSAGE 'Provisioned throughput exceeded limit.' TYPE 'E'. - CATCH /aws1/cx_texthrottlingex. - MESSAGE 'The request processing exceeded the limit' TYPE 'E'. - CATCH /aws1/cx_texunsupporteddocex. - MESSAGE 'The document is not supported.' TYPE 'E'. - ENDTRY. - "snippet-end:[tex.abapv1.detect_document_text] - ENDMETHOD. - - - METHOD get_document_analysis. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - - "Textract requires endpoint region to be same as the bucket region. - "Retrieve the region name defined as a logical resource in SDK configuration. - CONSTANTS cv_lbucket TYPE string VALUE 'ZEX_TEX_BUCKET_REGION'. - DATA lv_bucket_region TYPE /aws1/rt_region_id. - lv_bucket_region = lo_session->resolve_lresource( cv_lbucket ). - DATA(lo_tex) = /aws1/cl_tex_factory=>create( - io_session = lo_session - iv_region = lv_bucket_region ). - - "snippet-start:[tex.abapv1.get_document_analysis] - - "Gets the results for an Amazon Textract" - "asynchronous operation that analyzes text in a document." - TRY. - oo_result = lo_tex->getdocumentanalysis( iv_jobid = iv_jobid ). "oo_result is returned for testing purposes." - WHILE oo_result->get_jobstatus( ) <> 'SUCCEEDED'. - IF sy-index = 10. - EXIT. "Maximum 300 seconds. - ENDIF. - WAIT UP TO 30 SECONDS. - oo_result = lo_tex->getdocumentanalysis( iv_jobid = iv_jobid ). - ENDWHILE. - - DATA(lt_blocks) = oo_result->get_blocks( ). - LOOP AT lt_blocks INTO DATA(lo_block). - IF lo_block->get_text( ) = 'INGREDIENTS: POWDERED SUGAR* (CANE SUGAR,'. - MESSAGE 'Found text in the doc: ' && lo_block->get_text( ) TYPE 'I'. - ENDIF. - ENDLOOP. - MESSAGE 'Document analysis retrieved.' TYPE 'I'. - CATCH /aws1/cx_texaccessdeniedex. - MESSAGE 'You do not have permission to perform this action.' TYPE 'E'. - CATCH /aws1/cx_texinternalservererr. - MESSAGE 'Internal server error.' TYPE 'E'. - CATCH /aws1/cx_texinvalidjobidex. - MESSAGE 'Job ID is not valid.' TYPE 'E'. - CATCH /aws1/cx_texinvalidkmskeyex. - MESSAGE 'AWS KMS key is not valid.' TYPE 'E'. - CATCH /aws1/cx_texinvalidparameterex. - MESSAGE 'Request has non-valid parameters.' TYPE 'E'. - CATCH /aws1/cx_texinvalids3objectex. - MESSAGE 'Amazon S3 object is not valid.' TYPE 'E'. - CATCH /aws1/cx_texprovthruputexcdex. - MESSAGE 'Provisioned throughput exceeded limit.' TYPE 'E'. - CATCH /aws1/cx_texthrottlingex. - MESSAGE 'The request processing exceeded the limit.' TYPE 'E'. - ENDTRY. - "snippet-end:[tex.abapv1.get_document_analysis] - - ENDMETHOD. - - - METHOD start_document_analysis. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - - "Textract requires endpoint region to be same as the bucket region. - "Retrieve the region name defined as a logical resource in SDK configuration. - CONSTANTS cv_lbucket TYPE string VALUE 'ZEX_TEX_BUCKET_REGION'. - DATA lv_bucket_region TYPE /aws1/rt_region_id. - lv_bucket_region = lo_session->resolve_lresource( cv_lbucket ). - DATA(lo_tex) = /aws1/cl_tex_factory=>create( - io_session = lo_session - iv_region = lv_bucket_region ). - - "snippet-start:[tex.abapv1.start_document_analysis] - - "Starts the asynchronous analysis of an input document for relationships" - "between detected items such as key-value pairs, tables, and selection elements." - - "Create ABAP objects for feature type." - "Add TABLES to return information about the tables." - "Add FORMS to return detected form data." - "To perform both types of analysis, add TABLES and FORMS to FeatureTypes." - - DATA(lt_featuretypes) = VALUE /aws1/cl_texfeaturetypes_w=>tt_featuretypes( - ( NEW /aws1/cl_texfeaturetypes_w( iv_value = 'FORMS' ) ) - ( NEW /aws1/cl_texfeaturetypes_w( iv_value = 'TABLES' ) ) ). - "Create an ABAP object for the Amazon S3 object." - DATA(lo_s3object) = NEW /aws1/cl_texs3object( iv_bucket = iv_s3bucket - iv_name = iv_s3object ). - "Create an ABAP object for the document." - DATA(lo_documentlocation) = NEW /aws1/cl_texdocumentlocation( io_s3object = lo_s3object ). - - "Start async document analysis." - TRY. - oo_result = lo_tex->startdocumentanalysis( "oo_result is returned for testing purposes." - io_documentlocation = lo_documentlocation - it_featuretypes = lt_featuretypes ). - DATA(lv_jobid) = oo_result->get_jobid( ). - - MESSAGE 'Document analysis started.' TYPE 'I'. - CATCH /aws1/cx_texaccessdeniedex. - MESSAGE 'You do not have permission to perform this action.' TYPE 'E'. - CATCH /aws1/cx_texbaddocumentex. - MESSAGE 'Amazon Textract is not able to read the document.' TYPE 'E'. - CATCH /aws1/cx_texdocumenttoolargeex. - MESSAGE 'The document is too large.' TYPE 'E'. - CATCH /aws1/cx_texidempotentprmmis00. - MESSAGE 'Idempotent parameter mismatch exception.' TYPE 'E'. - CATCH /aws1/cx_texinternalservererr. - MESSAGE 'Internal server error.' TYPE 'E'. - CATCH /aws1/cx_texinvalidkmskeyex. - MESSAGE 'AWS KMS key is not valid.' TYPE 'E'. - CATCH /aws1/cx_texinvalidparameterex. - MESSAGE 'Request has non-valid parameters.' TYPE 'E'. - CATCH /aws1/cx_texinvalids3objectex. - MESSAGE 'Amazon S3 object is not valid.' TYPE 'E'. - CATCH /aws1/cx_texlimitexceededex. - MESSAGE 'An Amazon Textract service limit was exceeded.' TYPE 'E'. - CATCH /aws1/cx_texprovthruputexcdex. - MESSAGE 'Provisioned throughput exceeded limit.' TYPE 'E'. - CATCH /aws1/cx_texthrottlingex. - MESSAGE 'The request processing exceeded the limit.' TYPE 'E'. - CATCH /aws1/cx_texunsupporteddocex. - MESSAGE 'The document is not supported.' TYPE 'E'. - ENDTRY. - "snippet-end:[tex.abapv1.start_document_analysis] - ENDMETHOD. - - - METHOD start_document_text_detection. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - - "Textract requires endpoint region to be same as the bucket region. - "Retrieve the region name defined as a logical resource in SDK configuration. - CONSTANTS cv_lbucket TYPE string VALUE 'ZEX_TEX_BUCKET_REGION'. - DATA lv_bucket_region TYPE /aws1/rt_region_id. - lv_bucket_region = lo_session->resolve_lresource( cv_lbucket ). - DATA(lo_tex) = /aws1/cl_tex_factory=>create( - io_session = lo_session - iv_region = lv_bucket_region ). - - "snippet-start:[tex.abapv1.start_document_text_detection] - - "Starts the asynchronous detection of text in a document." - "Amazon Textract can detect lines of text and the words that make up a line of text." - - "Create an ABAP object for the Amazon S3 object." - DATA(lo_s3object) = NEW /aws1/cl_texs3object( iv_bucket = iv_s3bucket - iv_name = iv_s3object ). - "Create an ABAP object for the document." - DATA(lo_documentlocation) = NEW /aws1/cl_texdocumentlocation( io_s3object = lo_s3object ). - "Start document analysis." - TRY. - oo_result = lo_tex->startdocumenttextdetection( io_documentlocation = lo_documentlocation ). - DATA(lv_jobid) = oo_result->get_jobid( ). "oo_result is returned for testing purposes." - MESSAGE 'Document analysis started.' TYPE 'I'. - CATCH /aws1/cx_texaccessdeniedex. - MESSAGE 'You do not have permission to perform this action.' TYPE 'E'. - CATCH /aws1/cx_texbaddocumentex. - MESSAGE 'Amazon Textract is not able to read the document.' TYPE 'E'. - CATCH /aws1/cx_texdocumenttoolargeex. - MESSAGE 'The document is too large.' TYPE 'E'. - CATCH /aws1/cx_texidempotentprmmis00. - MESSAGE 'Idempotent parameter mismatch exception.' TYPE 'E'. - CATCH /aws1/cx_texinternalservererr. - MESSAGE 'Internal server error.' TYPE 'E'. - CATCH /aws1/cx_texinvalidkmskeyex. - MESSAGE 'AWS KMS key is not valid.' TYPE 'E'. - CATCH /aws1/cx_texinvalidparameterex. - MESSAGE 'Request has non-valid parameters.' TYPE 'E'. - CATCH /aws1/cx_texinvalids3objectex. - MESSAGE 'Amazon S3 object is not valid.' TYPE 'E'. - CATCH /aws1/cx_texlimitexceededex. - MESSAGE 'An Amazon Textract service limit was exceeded.' TYPE 'E'. - CATCH /aws1/cx_texprovthruputexcdex. - MESSAGE 'Provisioned throughput exceeded limit.' TYPE 'E'. - CATCH /aws1/cx_texthrottlingex. - MESSAGE 'The request processing exceeded the limit.' TYPE 'E'. - CATCH /aws1/cx_texunsupporteddocex. - MESSAGE 'The document is not supported.' TYPE 'E'. - ENDTRY. - "snippet-end:[tex.abapv1.start_document_text_detection] - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/textract/zcl_aws1_tex_actions.clas.testclasses.abap b/sap-abap/services/textract/zcl_aws1_tex_actions.clas.testclasses.abap deleted file mode 100644 index d3d34fccbfe..00000000000 --- a/sap-abap/services/textract/zcl_aws1_tex_actions.clas.testclasses.abap +++ /dev/null @@ -1,218 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS ltc_zcl_aws1_tex_actions DEFINITION FOR TESTING DURATION LONG RISK LEVEL DANGEROUS. - - PRIVATE SECTION. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA ao_tex TYPE REF TO /aws1/if_tex. - DATA ao_s3 TYPE REF TO /aws1/if_s3. - DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. - DATA ao_tex_actions TYPE REF TO zcl_aws1_tex_actions. - - METHODS setup RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic. - METHODS analyze_document FOR TESTING. - METHODS detect_document_text FOR TESTING. - METHODS start_document_analysis FOR TESTING. - METHODS start_document_text_detection FOR TESTING. - METHODS get_document_analysis FOR TESTING. - -ENDCLASS. "ltc_Zcl_Aws1_Tex_Actions - - -CLASS ltc_zcl_aws1_tex_actions IMPLEMENTATION. - - METHOD setup. - ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). - - ao_tex = /aws1/cl_tex_factory=>create( - io_session = ao_session - iv_region = 'us-east-1' ). - ao_s3 = /aws1/cl_s3_factory=>create( ao_session ). - ao_tex_actions = NEW zcl_aws1_tex_actions( ). - ENDMETHOD. - - METHOD analyze_document. - - "Using an image from the Public Amazon Berkeley Objects Dataset. - CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'amazon-berkeley-objects'. - CONSTANTS cv_key_name TYPE /aws1/s3_bucketname VALUE 'images/small/e0/e0feb1eb.jpg'. - - "Analyze document. - DATA(lo_output) = ao_tex_actions->analyze_document( - iv_s3object = cv_key_name - iv_s3bucket = cv_bucket_name ). - - "Validation check. - DATA(lv_found) = abap_false. - DATA(lt_blocks) = lo_output->get_blocks( ). - - LOOP AT lt_blocks INTO DATA(lo_block). - IF lo_block->get_text( ) = 'INGREDIENTS: POWDERED SUGAR* (CANE SUGAR,'. - lv_found = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Analyze document failed| ). - - ENDMETHOD. - - - METHOD detect_document_text. - - "Using an image from the Public Amazon Berkeley Objects Dataset. - CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'amazon-berkeley-objects'. - CONSTANTS cv_key_name TYPE /aws1/s3_bucketname VALUE 'images/small/e0/e0feb1eb.jpg'. - - "Testing. - DATA(lo_output) = ao_tex_actions->detect_document_text( - iv_s3object = cv_key_name - iv_s3bucket = cv_bucket_name ). - - "Validation check. - DATA(lv_found) = abap_false. - DATA(lt_blocks) = lo_output->get_blocks( ). - - LOOP AT lt_blocks INTO DATA(lo_block). - IF lo_block->get_text( ) = 'INGREDIENTS: POWDERED SUGAR* (CANE SUGAR,'. - lv_found = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Analyze document failed| ). - - ENDMETHOD. - - METHOD start_document_analysis. - - "Using an image from the Public Amazon Berkeley Objects Dataset. - CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'amazon-berkeley-objects'. - CONSTANTS cv_key_name TYPE /aws1/s3_bucketname VALUE 'images/small/e0/e0feb1eb.jpg'. - - "Testing. - DATA(lo_output) = ao_tex_actions->start_document_analysis( - iv_s3object = cv_key_name - iv_s3bucket = cv_bucket_name ). - - "Wait for job to complete. - DATA(lv_jobid) = lo_output->get_jobid( ). - - DATA(lo_document_analysis_output) = ao_tex->getdocumentanalysis( iv_jobid = lv_jobid ). - WHILE lo_document_analysis_output->get_jobstatus( ) <> 'SUCCEEDED'. - IF sy-index = 10. - EXIT. "Maximum 300 seconds. - ENDIF. - WAIT UP TO 30 SECONDS. - lo_document_analysis_output = ao_tex->getdocumentanalysis( iv_jobid = lv_jobid ). - ENDWHILE. - - "Validation check. - DATA(lv_found) = abap_false. - DATA(lt_blocks) = lo_document_analysis_output->get_blocks( ). - LOOP AT lt_blocks INTO DATA(lo_block). - IF lo_block->get_text( ) = 'INGREDIENTS: POWDERED SUGAR* (CANE SUGAR,'. - lv_found = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Analyze document failed| ). - - ENDMETHOD. - - METHOD start_document_text_detection. - - "Using an image from the Public Amazon Berkeley Objects Dataset. - CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'amazon-berkeley-objects'. - CONSTANTS cv_key_name TYPE /aws1/s3_bucketname VALUE 'images/small/e0/e0feb1eb.jpg'. - - "Testing. - DATA(lo_output) = ao_tex_actions->start_document_text_detection( - iv_s3object = cv_key_name - iv_s3bucket = cv_bucket_name ). - - DATA(lv_jobid) = lo_output->get_jobid( ). - - "Wait for job to complete. - DATA(lo_text_detection_output) = ao_tex->getdocumenttextdetection( iv_jobid = lv_jobid ). - WHILE lo_text_detection_output->get_jobstatus( ) <> 'SUCCEEDED'. - IF sy-index = 10. - EXIT. "Maximum 300 seconds. - ENDIF. - WAIT UP TO 30 SECONDS. - lo_text_detection_output = ao_tex->getdocumenttextdetection( iv_jobid = lv_jobid ). - ENDWHILE. - - "Validation check. - DATA(lv_found) = abap_false. - DATA(lt_blocks) = lo_text_detection_output->get_blocks( ). - LOOP AT lt_blocks INTO DATA(lo_block). - IF lo_block->get_text( ) = 'INGREDIENTS: POWDERED SUGAR* (CANE SUGAR,'. - lv_found = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Analyze document failed| ). - - ENDMETHOD. - - METHOD get_document_analysis. - - "Using an image from the Public Amazon Berkeley Objects Dataset. - CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'amazon-berkeley-objects'. - CONSTANTS cv_key_name TYPE /aws1/s3_bucketname VALUE 'images/small/e0/e0feb1eb.jpg'. - - DATA(lt_featuretypes) = VALUE /aws1/cl_texfeaturetypes_w=>tt_featuretypes( - ( NEW /aws1/cl_texfeaturetypes_w( iv_value = 'FORMS' ) ) - ( NEW /aws1/cl_texfeaturetypes_w( iv_value = 'TABLES' ) ) ). - - "Create a ABAP object for the Amazon Simple Storage Service (Amazon S3) object. - DATA(lo_s3object) = NEW /aws1/cl_texs3object( iv_bucket = cv_bucket_name - iv_name = cv_key_name ). - - "Create a ABAP object for the document. - DATA(lo_documentlocation) = NEW /aws1/cl_texdocumentlocation( io_s3object = lo_s3object ). - - "Start document analysis. - DATA(lo_output) = ao_tex->startdocumentanalysis( - io_documentlocation = lo_documentlocation - it_featuretypes = lt_featuretypes ). - - "Get job ID. - DATA(lv_jobid) = lo_output->get_jobid( ). - - "Testing. - DATA(lo_document_analysis_output) = ao_tex_actions->get_document_analysis( lv_jobid ). - WHILE lo_document_analysis_output->get_jobstatus( ) <> 'SUCCEEDED'. - IF sy-index = 10. - EXIT. "Maximum 300 seconds. - ENDIF. - WAIT UP TO 30 SECONDS. - lo_document_analysis_output = ao_tex_actions->get_document_analysis( lv_jobid ). - ENDWHILE. - - "Validation check. - DATA(lv_found) = abap_false. - DATA(lt_blocks) = lo_document_analysis_output->get_blocks( ). - LOOP AT lt_blocks INTO DATA(lo_block). - IF lo_block->get_text( ) = 'INGREDIENTS: POWDERED SUGAR* (CANE SUGAR,'. - lv_found = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Analyze document failed| ). - - ENDMETHOD. - -ENDCLASS. diff --git a/sap-abap/services/textract/zcl_aws1_tex_actions.clas.xml b/sap-abap/services/textract/zcl_aws1_tex_actions.clas.xml deleted file mode 100644 index 554ce253ea1..00000000000 --- a/sap-abap/services/textract/zcl_aws1_tex_actions.clas.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - ZCL_AWS1_TEX_ACTIONS - E - Amazon Textract Code Example Actions - 1 - X - X - X - X - - - - ANALYZE_DOCUMENT - E - Analyzes an input document for relationships between detects - - - DETECT_DOCUMENT_TEXT - E - Detects text in the input document. - - - GET_DOCUMENT_ANALYSIS - E - Gets the results for an document operation. - - - START_DOCUMENT_ANALYSIS - E - Starts the asynchronous analysis of an input document. - - - START_DOCUMENT_TEXT_DETECTION - E - Starts the asynchronous detection of text in a document. - - - - - diff --git a/sap-abap/services/textract/zcl_aws1_tex_scenario.clas.abap b/sap-abap/services/textract/zcl_aws1_tex_scenario.clas.abap deleted file mode 100644 index 652b904cbbf..00000000000 --- a/sap-abap/services/textract/zcl_aws1_tex_scenario.clas.abap +++ /dev/null @@ -1,113 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 -CLASS zcl_aws1_tex_scenario DEFINITION - PUBLIC - FINAL - CREATE PUBLIC . - - PUBLIC SECTION. - - METHODS getting_started_with_tex - IMPORTING - !iv_s3object TYPE /aws1/texs3objectname - !iv_s3bucket TYPE /aws1/texs3bucket - RETURNING - VALUE(oo_result) TYPE REF TO /aws1/cl_texgetdocalyresponse . - PROTECTED SECTION. - PRIVATE SECTION. -ENDCLASS. - - - -CLASS ZCL_AWS1_TEX_SCENARIO IMPLEMENTATION. - - - METHOD getting_started_with_tex. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - - "Textract requires endpoint region to be same as the bucket region. - "Retrieve the region name defined as a logical resource in SDK configuration. - CONSTANTS cv_lbucket TYPE string VALUE 'ZEX_TEX_BUCKET_REGION'. - DATA lv_bucket_region TYPE /aws1/rt_region_id. - lv_bucket_region = lo_session->resolve_lresource( cv_lbucket ). - DATA(lo_tex) = /aws1/cl_tex_factory=>create( - io_session = lo_session - iv_region = lv_bucket_region ). - " 1. Starts the asynchronous analysis. " - " 2. Wait for the analysis to complete. " - - "snippet-start:[tex.abapv1.getting_started_with_tex] - - "Create ABAP objects for feature type." - "Add TABLES to return information about the tables." - "Add FORMS to return detected form data." - "To perform both types of analysis, add TABLES and FORMS to FeatureTypes." - - DATA(lt_featuretypes) = VALUE /aws1/cl_texfeaturetypes_w=>tt_featuretypes( - ( NEW /aws1/cl_texfeaturetypes_w( iv_value = 'FORMS' ) ) - ( NEW /aws1/cl_texfeaturetypes_w( iv_value = 'TABLES' ) ) ). - - "Create an ABAP object for the Amazon Simple Storage Service (Amazon S3) object." - DATA(lo_s3object) = NEW /aws1/cl_texs3object( iv_bucket = iv_s3bucket - iv_name = iv_s3object ). - - "Create an ABAP object for the document." - DATA(lo_documentlocation) = NEW /aws1/cl_texdocumentlocation( io_s3object = lo_s3object ). - - "Start document analysis." - TRY. - DATA(lo_start_result) = lo_tex->startdocumentanalysis( - io_documentlocation = lo_documentlocation - it_featuretypes = lt_featuretypes ). - MESSAGE 'Document analysis started.' TYPE 'I'. - CATCH /aws1/cx_texaccessdeniedex. - MESSAGE 'You do not have permission to perform this action.' TYPE 'E'. - CATCH /aws1/cx_texbaddocumentex. - MESSAGE 'Amazon Textract is not able to read the document.' TYPE 'E'. - CATCH /aws1/cx_texdocumenttoolargeex. - MESSAGE 'The document is too large.' TYPE 'E'. - CATCH /aws1/cx_texidempotentprmmis00. - MESSAGE 'Idempotent parameter mismatch exception.' TYPE 'E'. - CATCH /aws1/cx_texinternalservererr. - MESSAGE 'Internal server error.' TYPE 'E'. - CATCH /aws1/cx_texinvalidkmskeyex. - MESSAGE 'AWS KMS key is not valid.' TYPE 'E'. - CATCH /aws1/cx_texinvalidparameterex. - MESSAGE 'Request has non-valid parameters.' TYPE 'E'. - CATCH /aws1/cx_texinvalids3objectex. - MESSAGE 'Amazon S3 object is not valid.' TYPE 'E'. - CATCH /aws1/cx_texlimitexceededex. - MESSAGE 'An Amazon Textract service limit was exceeded.' TYPE 'E'. - CATCH /aws1/cx_texprovthruputexcdex. - MESSAGE 'Provisioned throughput exceeded limit.' TYPE 'E'. - CATCH /aws1/cx_texthrottlingex. - MESSAGE 'The request processing exceeded the limit.' TYPE 'E'. - CATCH /aws1/cx_texunsupporteddocex. - MESSAGE 'The document is not supported.' TYPE 'E'. - ENDTRY. - - "Get job ID from the output." - DATA(lv_jobid) = lo_start_result->get_jobid( ). - - "Wait for job to complete." - oo_result = lo_tex->getdocumentanalysis( iv_jobid = lv_jobid ). " oo_result is returned for testing purposes. " - WHILE oo_result->get_jobstatus( ) <> 'SUCCEEDED'. - IF sy-index = 10. - EXIT. "Maximum 300 seconds." - ENDIF. - WAIT UP TO 30 SECONDS. - oo_result = lo_tex->getdocumentanalysis( iv_jobid = lv_jobid ). - ENDWHILE. - - DATA(lt_blocks) = oo_result->get_blocks( ). - LOOP AT lt_blocks INTO DATA(lo_block). - IF lo_block->get_text( ) = 'INGREDIENTS: POWDERED SUGAR* (CANE SUGAR,'. - MESSAGE 'Found text in the doc: ' && lo_block->get_text( ) TYPE 'I'. - ENDIF. - ENDLOOP. - "snippet-end:[tex.abapv1.getting_started_with_tex] - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/textract/zcl_aws1_tex_scenario.clas.testclasses.abap b/sap-abap/services/textract/zcl_aws1_tex_scenario.clas.testclasses.abap deleted file mode 100644 index 8af64023710..00000000000 --- a/sap-abap/services/textract/zcl_aws1_tex_scenario.clas.testclasses.abap +++ /dev/null @@ -1,54 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS ltc_zcl_aws1_tex_scenario DEFINITION FOR TESTING DURATION SHORT RISK LEVEL DANGEROUS. - - PRIVATE SECTION. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA ao_tex TYPE REF TO /aws1/if_tex. - DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. - DATA ao_tex_scenario TYPE REF TO zcl_aws1_tex_scenario. - DATA lv_found TYPE abap_bool VALUE abap_false. - - METHODS setup RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic. - METHODS getting_started_with_tex FOR TESTING. - -ENDCLASS. "ltc_Zcl_Aws1_Tex_Scenario - -CLASS ltc_zcl_aws1_tex_scenario IMPLEMENTATION. - - METHOD setup. - ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). - ao_tex = /aws1/cl_tex_factory=>create( ao_session ). - ao_tex_scenario = NEW zcl_aws1_tex_scenario( ). - ENDMETHOD. - - - METHOD getting_started_with_tex. - - "Using an image from the Public Amazon Berkeley Objects Dataset. - CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'amazon-berkeley-objects'. - CONSTANTS cv_key_name TYPE /aws1/s3_bucketname VALUE 'images/small/e0/e0feb1eb.jpg'. - - "Analyze document. - DATA(lo_output) = ao_tex_scenario->getting_started_with_tex( - iv_s3object = cv_key_name - iv_s3bucket = cv_bucket_name ). - - "Validation check. - DATA(lv_found) = abap_false. - DATA(lt_blocks) = lo_output->get_blocks( ). - LOOP AT lt_blocks INTO DATA(lo_block). - IF lo_block->get_text( ) = 'INGREDIENTS: POWDERED SUGAR* (CANE SUGAR,'. - lv_found = abap_true. - ENDIF. - ENDLOOP. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Analyze document failed| ). - - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/textract/zcl_aws1_tex_scenario.clas.xml b/sap-abap/services/textract/zcl_aws1_tex_scenario.clas.xml deleted file mode 100644 index 1313bae3522..00000000000 --- a/sap-abap/services/textract/zcl_aws1_tex_scenario.clas.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - ZCL_AWS1_TEX_SCENARIO - E - Amazon Textract Code Example Scenario - 1 - X - X - X - X - - - - GETTING_STARTED_WITH_TEX - E - SGM code example scenario. - - - - - diff --git a/sap-abap/services/translate/package.devc.xml b/sap-abap/services/translate/package.devc.xml deleted file mode 100644 index d0a74974eba..00000000000 --- a/sap-abap/services/translate/package.devc.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - Package for Amazon Translate - - - - diff --git a/sap-abap/services/translate/zcl_aws1_xl8_actions.clas.abap b/sap-abap/services/translate/zcl_aws1_xl8_actions.clas.abap deleted file mode 100644 index f74028d201b..00000000000 --- a/sap-abap/services/translate/zcl_aws1_xl8_actions.clas.abap +++ /dev/null @@ -1,219 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS zcl_aws1_xl8_actions DEFINITION - PUBLIC - FINAL - CREATE PUBLIC . - - PUBLIC SECTION. - - METHODS describe_text_translation_job - IMPORTING - !iv_jobid TYPE /aws1/xl8jobid - EXPORTING - !oo_result TYPE REF TO /aws1/cl_xl8dsctextxlatjobrsp . - METHODS list_text_translation_jobs - IMPORTING - !iv_jobname TYPE /aws1/xl8jobname - EXPORTING - !oo_result TYPE REF TO /aws1/cl_xl8lsttextxlatjobsrsp . - METHODS start_text_translation_job - IMPORTING - !iv_sourcelanguagecode TYPE /aws1/xl8languagecodestring OPTIONAL - !iv_targetlanguagecode TYPE /aws1/xl8languagecodestring OPTIONAL - !iv_jobname TYPE /aws1/xl8jobname - !iv_input_data_s3uri TYPE /aws1/xl8s3uri - !iv_input_data_contenttype TYPE /aws1/xl8contenttype - !iv_output_data_s3uri TYPE /aws1/xl8s3uri - !iv_dataaccessrolearn TYPE /aws1/xl8iamrolearn - EXPORTING - !oo_result TYPE REF TO /aws1/cl_xl8strttextxlatjobrsp . - METHODS stop_text_translation_job - IMPORTING - !iv_jobid TYPE /aws1/xl8jobid - EXPORTING - !oo_result TYPE REF TO /aws1/cl_xl8stoptextxlatjobrsp . - METHODS translate_text - IMPORTING - !iv_sourcelanguagecode TYPE /aws1/xl8languagecodestring OPTIONAL - !iv_targetlanguagecode TYPE /aws1/xl8languagecodestring OPTIONAL - !iv_text TYPE /aws1/xl8boundedlengthstring - EXPORTING - !oo_result TYPE REF TO /aws1/cl_xl8translatetextrsp . - PROTECTED SECTION. - PRIVATE SECTION. -ENDCLASS. - - - -CLASS ZCL_AWS1_XL8_ACTIONS IMPLEMENTATION. - - - METHOD describe_text_translation_job. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_xl8) = /aws1/cl_xl8_factory=>create( lo_session ). - - "snippet-start:[xl8.abapv1.describe_text_translation_job] - - "Gets the properties associated with an asynchronous batch translation job." - "Includes properties such as name, ID, status, source and target languages, and input/output Amazon Simple Storage Service (Amazon S3) buckets." - TRY. - oo_result = lo_xl8->describetexttranslationjob( "oo_result is returned for testing purposes." - iv_jobid = iv_jobid ). - MESSAGE 'Job description retrieved.' TYPE 'I'. - CATCH /aws1/cx_xl8internalserverex. - MESSAGE 'An internal server error occurred. Retry your request.' TYPE 'E'. - CATCH /aws1/cx_xl8resourcenotfoundex. - MESSAGE 'The resource you are looking for has not been found.' TYPE 'E'. - CATCH /aws1/cx_xl8toomanyrequestsex. - MESSAGE 'You have made too many requests within a short period of time.' TYPE 'E'. - ENDTRY. - "snippet-end:[xl8.abapv1.describe_text_translation_job] - ENDMETHOD. - - - METHOD list_text_translation_jobs. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_xl8) = /aws1/cl_xl8_factory=>create( lo_session ). - - "snippet-start:[xl8.abapv1.list_text_translation_jobs] - "Gets a list of the batch translation jobs that you have submitted." - - DATA lo_filter TYPE REF TO /aws1/cl_xl8textxlationjobfilt. - - "Create an ABAP object for filtering using jobname." - lo_filter = NEW #( iv_jobname = iv_jobname ). - - TRY. - oo_result = lo_xl8->listtexttranslationjobs( "oo_result is returned for testing purposes." - io_filter = lo_filter ). - MESSAGE 'Jobs retrieved.' TYPE 'I'. - CATCH /aws1/cx_xl8internalserverex. - MESSAGE 'An internal server error occurred. Retry your request.' TYPE 'E'. - CATCH /aws1/cx_xl8invalidfilterex. - MESSAGE 'The filter specified for the operation is not valid. Specify a different filter.' TYPE 'E'. - CATCH /aws1/cx_xl8invalidrequestex. - MESSAGE 'The request that you made is not valid.' TYPE 'E'. - CATCH /aws1/cx_xl8toomanyrequestsex. - MESSAGE 'You have made too many requests within a short period of time.' TYPE 'E'. - ENDTRY. - "snippet-end:[xl8.abapv1.list_text_translation_jobs] - ENDMETHOD. - - - METHOD start_text_translation_job. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_xl8) = /aws1/cl_xl8_factory=>create( lo_session ). - - "snippet-start:[xl8.abapv1.start_text_translation_job] - "Starts an asynchronous batch translation job." - "Use batch translation jobs to translate large volumes of text across multiple documents at once." - - DATA lo_inputdataconfig TYPE REF TO /aws1/cl_xl8inputdataconfig. - DATA lo_outputdataconfig TYPE REF TO /aws1/cl_xl8outputdataconfig. - DATA lt_targetlanguagecodes TYPE /aws1/cl_xl8tgtlanguagecodes00=>tt_targetlanguagecodestrlist. - DATA lo_targetlanguagecodes TYPE REF TO /aws1/cl_xl8tgtlanguagecodes00. - - "Create an ABAP object for the input data config." - lo_inputdataconfig = NEW #( iv_s3uri = iv_input_data_s3uri - iv_contenttype = iv_input_data_contenttype ). - - "Create an ABAP object for the output data config." - lo_outputdataconfig = NEW #( iv_s3uri = iv_output_data_s3uri ). - - "Create an internal table for target languages." - lo_targetlanguagecodes = NEW #( iv_value = iv_targetlanguagecode ). - INSERT lo_targetlanguagecodes INTO TABLE lt_targetlanguagecodes. - - TRY. - oo_result = lo_xl8->starttexttranslationjob( "oo_result is returned for testing purposes." - io_inputdataconfig = lo_inputdataconfig - io_outputdataconfig = lo_outputdataconfig - it_targetlanguagecodes = lt_targetlanguagecodes - iv_dataaccessrolearn = iv_dataaccessrolearn - iv_jobname = iv_jobname - iv_sourcelanguagecode = iv_sourcelanguagecode ). - MESSAGE 'Translation job started.' TYPE 'I'. - CATCH /aws1/cx_xl8internalserverex. - MESSAGE 'An internal server error occurred. Retry your request.' TYPE 'E'. - CATCH /aws1/cx_xl8invparamvalueex. - MESSAGE 'The value of the parameter is not valid.' TYPE 'E'. - CATCH /aws1/cx_xl8invalidrequestex. - MESSAGE 'The request that you made is not valid.' TYPE 'E'. - CATCH /aws1/cx_xl8resourcenotfoundex. - MESSAGE 'The resource you are looking for has not been found.' TYPE 'E'. - CATCH /aws1/cx_xl8toomanyrequestsex. - MESSAGE 'You have made too many requests within a short period of time.' TYPE 'E'. - CATCH /aws1/cx_xl8unsuppedlanguage00. - MESSAGE 'Amazon Translate does not support translation from the language of the source text into the requested target language.' TYPE 'E'. - ENDTRY. - "snippet-end:[xl8.abapv1.start_text_translation_job] - ENDMETHOD. - - - METHOD stop_text_translation_job. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_xl8) = /aws1/cl_xl8_factory=>create( lo_session ). - - "snippet-start:[xl8.abapv1.stop_text_translation_job] - "Stops an asynchronous batch translation job that is in progress." - - TRY. - oo_result = lo_xl8->stoptexttranslationjob( "oo_result is returned for testing purposes." - iv_jobid = iv_jobid ). - MESSAGE 'Translation job stopped.' TYPE 'I'. - CATCH /aws1/cx_xl8internalserverex. - MESSAGE 'An internal server error occurred.' TYPE 'E'. - CATCH /aws1/cx_xl8resourcenotfoundex. - MESSAGE 'The resource you are looking for has not been found.' TYPE 'E'. - CATCH /aws1/cx_xl8toomanyrequestsex. - MESSAGE 'You have made too many requests within a short period of time.' TYPE 'E'. - ENDTRY. - "snippet-end:[xl8.abapv1.stop_text_translation_job] - ENDMETHOD. - - - METHOD translate_text. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_xl8) = /aws1/cl_xl8_factory=>create( lo_session ). - - "snippet-start:[xl8.abapv1.translate_text] - "Translates input text from the source language to the target language." - TRY. - oo_result = lo_xl8->translatetext( "oo_result is returned for testing purposes." - iv_text = iv_text - iv_sourcelanguagecode = iv_sourcelanguagecode - iv_targetlanguagecode = iv_targetlanguagecode ). - MESSAGE 'Translation completed.' TYPE 'I'. - CATCH /aws1/cx_xl8detectedlanguage00. - MESSAGE 'The confidence that Amazon Comprehend accurately detected the source language is low.' TYPE 'E'. - CATCH /aws1/cx_xl8internalserverex. - MESSAGE 'An internal server error occurred.' TYPE 'E'. - CATCH /aws1/cx_xl8invalidrequestex. - MESSAGE 'The request that you made is not valid.' TYPE 'E'. - CATCH /aws1/cx_xl8resourcenotfoundex. - MESSAGE 'The resource you are looking for has not been found.' TYPE 'E'. - CATCH /aws1/cx_xl8serviceunavailex. - MESSAGE 'The Amazon Translate service is temporarily unavailable.' TYPE 'E'. - CATCH /aws1/cx_xl8textsizelmtexcdex. - MESSAGE 'The size of the text you submitted exceeds the size limit. ' TYPE 'E'. - CATCH /aws1/cx_xl8toomanyrequestsex. - MESSAGE 'You have made too many requests within a short period of time.' TYPE 'E'. - CATCH /aws1/cx_xl8unsuppedlanguage00. - MESSAGE 'Amazon Translate does not support translation from the language of the source text into the requested target language. ' TYPE 'E'. - ENDTRY. - "snippet-end:[xl8.abapv1.translate_text] - - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/translate/zcl_aws1_xl8_actions.clas.testclasses.abap b/sap-abap/services/translate/zcl_aws1_xl8_actions.clas.testclasses.abap deleted file mode 100644 index b0aa4329a61..00000000000 --- a/sap-abap/services/translate/zcl_aws1_xl8_actions.clas.testclasses.abap +++ /dev/null @@ -1,455 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS ltc_zcl_aws1_xl8_actions DEFINITION FOR TESTING DURATION LONG RISK LEVEL DANGEROUS. - - PRIVATE SECTION. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-xl8-'. - CONSTANTS cv_input_key TYPE /aws1/s3_objectkey VALUE 'translate/input/input.txt'. - CONSTANTS cv_output_folder TYPE /aws1/s3_objectkey VALUE 'translate/output/'. - CONSTANTS cv_input_folder TYPE /aws1/s3_objectkey VALUE 'translate/input/'. - CONSTANTS cv_input_data_contenttype TYPE /aws1/xl8contenttype VALUE 'text/plain'. - " CONSTANTS cv_output_data_contenttype TYPE /aws1/xl8contenttype VALUE 'text/plain'. - CONSTANTS cv_sourcelanguagecode TYPE /aws1/xl8languagecodestring VALUE 'fr'. - CONSTANTS cv_targetlanguagecode TYPE /aws1/xl8languagecodestring VALUE 'en'. - - DATA ao_xl8 TYPE REF TO /aws1/if_xl8. - DATA ao_s3 TYPE REF TO /aws1/if_s3. - DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. - DATA ao_xl8_actions TYPE REF TO zcl_aws1_xl8_actions. - DATA av_file_content TYPE /aws1/s3_streamingblob. - DATA av_lrole TYPE /aws1/xl8iamrolearn. - - METHODS setup RAISING /aws1/cx_rt_generic. - METHODS translate_text FOR TESTING. - METHODS start_text_translation_job FOR TESTING. - METHODS stop_text_translation_job FOR TESTING. - METHODS describe_text_translation_job FOR TESTING. - METHODS list_text_translation_job FOR TESTING. - METHODS cleanup_s3 - IMPORTING - iv_bucket_name TYPE /aws1/s3_bucketname - RAISING /aws1/cx_rt_generic. - METHODS job_waiter - IMPORTING iv_jobid TYPE /aws1/xl8jobid - iv_jobstatus TYPE /aws1/xl8jobstatus - RAISING /aws1/cx_rt_generic. - - -ENDCLASS. "ltc_Zcl_Aws1_Xl8_Actions - -CLASS ltc_zcl_aws1_xl8_actions IMPLEMENTATION. - - METHOD setup. - ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). - ao_xl8 = /aws1/cl_xl8_factory=>create( ao_session ). - ao_s3 = /aws1/cl_s3_factory=>create( ao_session ). - ao_xl8_actions = NEW zcl_aws1_xl8_actions( ). - - "Translate data. - av_file_content = /aws1/cl_rt_util=>string_to_xstring( - |Que vous cherchiez à replateformer pour réduire les coûts,| && - |à migrer vers SAP S/4HANA ou à adopter l’offre RISE avec SAP, | && - |AWS propose des approches éprouvées, | && - |soutenues par une expérience inégalée dans la prise en charge des clients SAP dans le cloud. | && - |Obtenez plus de flexibilité et de valeur à partir de vos investissements SAP grâce à l'infrastructure cloud la plus sécurisée, | && - |fiable et évolutive au monde, aux plus de 200 services AWS qui vous permettent d'innover, | && - |et aux outils d'automatisation de SAP spécialement conçus, | && - |afin de réduire les risques et de simplifier les opérations. | ). - - "Define role Amazon Resource Name (ARN). - DATA(lt_roles) = ao_session->get_configuration( )->get_logical_iam_roles( ). - READ TABLE lt_roles INDEX 1 INTO DATA(lo_role). " take first role from the logical role mapping - av_lrole = lo_role-iam_role_arn. - - ENDMETHOD. - - METHOD cleanup_s3. - - DATA(lo_list) = ao_s3->listobjectsv2( iv_bucket = iv_bucket_name ). - LOOP AT lo_list->get_contents( ) INTO DATA(lo_object). - ao_s3->deleteobject( - iv_bucket = iv_bucket_name - iv_key = lo_object->get_key( ) ). - ENDLOOP. - - ao_s3->deletebucket( iv_bucket = iv_bucket_name ). - - ENDMETHOD. - - METHOD job_waiter. - - DATA lo_des_translation_result TYPE REF TO /aws1/cl_xl8dsctextxlatjobrsp. - - lo_des_translation_result = ao_xl8->describetexttranslationjob( iv_jobid = iv_jobid ). - WHILE lo_des_translation_result->get_textxlationjobproperties( )->get_jobstatus( ) <> iv_jobstatus. - IF sy-index = 15. - EXIT. "Maximum 50 minutes - ENDIF. - WAIT UP TO 60 SECONDS. - lo_des_translation_result = ao_xl8->describetexttranslationjob( iv_jobid = iv_jobid ). - ENDWHILE. - ENDMETHOD. - - METHOD translate_text. - - DATA lo_output TYPE REF TO /aws1/cl_xl8translatetextrsp. - DATA lv_translatedtext TYPE /aws1/xl8string. - - - CONSTANTS cv_text TYPE /aws1/xl8boundedlengthstring VALUE 'AWS accélère la croissance de la France'. - - "Translate text. - ao_xl8_actions->translate_text( - EXPORTING - iv_text = cv_text - iv_sourcelanguagecode = cv_sourcelanguagecode - iv_targetlanguagecode = cv_targetlanguagecode - IMPORTING - oo_result = lo_output ). - - "Validation check. - DATA(lv_found) = abap_false. - IF lo_output->get_translatedtext( ) = 'AWS accelerates growth in France'. - lv_found = abap_true. - ENDIF. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Translation failed| ). - - "Nothing to clean up. - - ENDMETHOD. - - METHOD start_text_translation_job. - - DATA lv_uuid_16 TYPE sysuuid_x16. - DATA lv_bucket_name TYPE /aws1/s3_bucketname. - DATA lv_translate_job_name TYPE /aws1/xl8jobname. - DATA lv_input_data_s3uri TYPE /aws1/xl8s3uri. - DATA lv_output_data_s3uri TYPE /aws1/xl8s3uri. - DATA lv_output_folder TYPE /aws1/xl8s3uri. - DATA lo_result TYPE REF TO /aws1/cl_xl8strttextxlatjobrsp. - - DATA lv_jobid TYPE /aws1/xl8jobid. - DATA lo_des_translation_result TYPE REF TO /aws1/cl_xl8dsctextxlatjobrsp. - - "Define job name. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_translate_job_name = 'code-example-xl8-job-' && lv_uuid_16. - TRANSLATE lv_translate_job_name TO LOWER CASE. - - "Create training data in Amazon Simple Storage Service (Amazon S3). - lv_bucket_name = cv_bucket_name && lv_uuid_16. - TRANSLATE lv_bucket_name TO LOWER CASE. - zcl_aws1_ex_utils=>create_bucket( iv_bucket = lv_bucket_name - io_s3 = ao_s3 - io_session = ao_session ). - - lv_input_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_input_folder. - lv_output_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_output_folder. - - ao_s3->putobject( - iv_bucket = lv_bucket_name - iv_key = cv_input_key - iv_body = av_file_content ). - - "Testing. - ao_xl8_actions->start_text_translation_job( - EXPORTING - iv_jobname = lv_translate_job_name - iv_dataaccessrolearn = av_lrole - iv_input_data_s3uri = lv_input_data_s3uri - iv_input_data_contenttype = cv_input_data_contenttype - iv_output_data_s3uri = lv_output_data_s3uri - iv_sourcelanguagecode = cv_sourcelanguagecode - iv_targetlanguagecode = cv_targetlanguagecode - IMPORTING - oo_result = lo_result ). - - "Validation. - DATA(lv_found) = abap_false. - IF lo_result->has_jobstatus( ) = 'X'. - lv_found = abap_true. - ENDIF. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Translation job cannot be found| ). - - "Get the job ID. - lv_jobid = lo_result->get_jobid( ). - - "Wait for translate job to complete - job_waiter( iv_jobid = lv_jobid - iv_jobstatus = 'COMPLETED' ). - - "Clean up. - cleanup_s3( lv_bucket_name ). - - ENDMETHOD. - - METHOD stop_text_translation_job. - - DATA lv_uuid_16 TYPE sysuuid_x16. - DATA lv_bucket_name TYPE /aws1/s3_bucketname. - DATA lv_translate_job_name TYPE /aws1/xl8jobname. - DATA lv_input_data_s3uri TYPE /aws1/xl8s3uri. - DATA lv_output_data_s3uri TYPE /aws1/xl8s3uri. - DATA lv_output_folder TYPE /aws1/xl8s3uri. - DATA lo_result TYPE REF TO /aws1/cl_xl8strttextxlatjobrsp. - - DATA lv_jobid TYPE /aws1/xl8jobid. - DATA lo_list_translation_result TYPE REF TO /aws1/cl_xl8lsttextxlatjobsrsp. - DATA lo_inputdataconfig TYPE REF TO /aws1/cl_xl8inputdataconfig. - DATA lo_outputdataconfig TYPE REF TO /aws1/cl_xl8outputdataconfig. - DATA lt_targetlanguagecodes TYPE /aws1/cl_xl8tgtlanguagecodes00=>tt_targetlanguagecodestrlist. - DATA lo_targetlanguagecodes TYPE REF TO /aws1/cl_xl8tgtlanguagecodes00. - DATA lo_des_translation_result TYPE REF TO /aws1/cl_xl8dsctextxlatjobrsp. - - "Define job name. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_translate_job_name = 'code-example-xl8-job-' && lv_uuid_16. - TRANSLATE lv_translate_job_name TO LOWER CASE. - - "Create training data in Amazon S3. - lv_bucket_name = cv_bucket_name && lv_uuid_16. - TRANSLATE lv_bucket_name TO LOWER CASE. - zcl_aws1_ex_utils=>create_bucket( iv_bucket = lv_bucket_name - io_s3 = ao_s3 - io_session = ao_session ). - - - lv_input_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_input_folder. - lv_output_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_output_folder. - - ao_s3->putobject( - iv_bucket = lv_bucket_name - iv_key = cv_input_key - iv_body = av_file_content ). - - "Create an ABAP object for the input data config. - lo_inputdataconfig = NEW #( iv_s3uri = lv_input_data_s3uri - iv_contenttype = cv_input_data_contenttype ). - - "Create an ABAP object for the output data config. - lo_outputdataconfig = NEW #( iv_s3uri = lv_output_data_s3uri ). - - "Create an internal table for target languages. - lo_targetlanguagecodes = NEW #( iv_value = cv_targetlanguagecode ). - INSERT lo_targetlanguagecodes INTO TABLE lt_targetlanguagecodes. - - "Create a translate job. - lo_result = ao_xl8->starttexttranslationjob( - io_inputdataconfig = lo_inputdataconfig - io_outputdataconfig = lo_outputdataconfig - it_targetlanguagecodes = lt_targetlanguagecodes - iv_dataaccessrolearn = av_lrole - iv_jobname = lv_translate_job_name - iv_sourcelanguagecode = cv_sourcelanguagecode ). - - "Get the job ID. - lv_jobid = lo_result->get_jobid( ). - - WAIT UP TO 20 SECONDS. - - "Testing list_text_translation_job. - ao_xl8_actions->stop_text_translation_job( - lv_jobid ). - - "Wait for translate job to stop. - job_waiter( iv_jobid = lv_jobid - iv_jobstatus = 'STOPPED' ). - - "Validation. - DATA(lv_found) = abap_false. - lo_des_translation_result = ao_xl8->describetexttranslationjob( iv_jobid = lv_jobid ). - IF lo_des_translation_result->get_textxlationjobproperties( )->get_jobstatus( ) = 'STOPPED'. - lv_found = abap_true. - ENDIF. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Stop text translation job failed| ). - - "Clean up. - cleanup_s3( lv_bucket_name ). - - ENDMETHOD. - - METHOD describe_text_translation_job. - - DATA lv_uuid_16 TYPE sysuuid_x16. - DATA lv_bucket_name TYPE /aws1/s3_bucketname. - DATA lv_translate_job_name TYPE /aws1/xl8jobname. - DATA lv_input_data_s3uri TYPE /aws1/xl8s3uri. - DATA lv_output_data_s3uri TYPE /aws1/xl8s3uri. - DATA lv_output_folder TYPE /aws1/xl8s3uri. - DATA lo_result TYPE REF TO /aws1/cl_xl8strttextxlatjobrsp. - - DATA lv_jobid TYPE /aws1/xl8jobid. - DATA lo_des_translation_result TYPE REF TO /aws1/cl_xl8dsctextxlatjobrsp. - DATA lo_inputdataconfig TYPE REF TO /aws1/cl_xl8inputdataconfig. - DATA lo_outputdataconfig TYPE REF TO /aws1/cl_xl8outputdataconfig. - DATA lt_targetlanguagecodes TYPE /aws1/cl_xl8tgtlanguagecodes00=>tt_targetlanguagecodestrlist. - DATA lo_targetlanguagecodes TYPE REF TO /aws1/cl_xl8tgtlanguagecodes00. - - "Define job name. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_translate_job_name = 'code-example-xl8-job-' && lv_uuid_16. - TRANSLATE lv_translate_job_name TO LOWER CASE. - - "Create training data in Amazon S3. - lv_bucket_name = cv_bucket_name && lv_uuid_16. - TRANSLATE lv_bucket_name TO LOWER CASE. - zcl_aws1_ex_utils=>create_bucket( iv_bucket = lv_bucket_name - io_s3 = ao_s3 - io_session = ao_session ). - - - lv_input_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_input_folder. - lv_output_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_output_folder. - - ao_s3->putobject( - iv_bucket = lv_bucket_name - iv_key = cv_input_key - iv_body = av_file_content ). - - "Create an ABAP object for the input data config. - lo_inputdataconfig = NEW #( iv_s3uri = lv_input_data_s3uri - iv_contenttype = cv_input_data_contenttype ). - - "Create an ABAP object for the output data config. - lo_outputdataconfig = NEW #( iv_s3uri = lv_output_data_s3uri ). - - "Create an internal table for target languages. - lo_targetlanguagecodes = NEW #( iv_value = cv_targetlanguagecode ). - INSERT lo_targetlanguagecodes INTO TABLE lt_targetlanguagecodes. - - "Create a translate job. - lo_result = ao_xl8->starttexttranslationjob( - io_inputdataconfig = lo_inputdataconfig - io_outputdataconfig = lo_outputdataconfig - it_targetlanguagecodes = lt_targetlanguagecodes - iv_dataaccessrolearn = av_lrole - iv_jobname = lv_translate_job_name - iv_sourcelanguagecode = cv_sourcelanguagecode ). - - "Get the job ID. - lv_jobid = lo_result->get_jobid( ). - - "Testing. - ao_xl8_actions->describe_text_translation_job( EXPORTING iv_jobid = lv_jobid IMPORTING oo_result = lo_des_translation_result ). - WHILE lo_des_translation_result->get_textxlationjobproperties( )->get_jobstatus( ) <> 'COMPLETED'. - IF sy-index = 30. - EXIT. "maximum 30 minutes - ENDIF. - WAIT UP TO 60 SECONDS. - ao_xl8_actions->describe_text_translation_job( EXPORTING iv_jobid = lv_jobid IMPORTING oo_result = lo_des_translation_result ). - ENDWHILE. - - "Validation. - DATA(lv_found) = abap_false. - IF lo_des_translation_result->get_textxlationjobproperties( )->get_jobstatus( ) = 'COMPLETED'. - lv_found = abap_true. - ENDIF. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Describe job failed| ). - - "Clean up. - cleanup_s3( lv_bucket_name ). - - ENDMETHOD. - - METHOD list_text_translation_job. - - DATA lv_uuid_16 TYPE sysuuid_x16. - DATA lv_bucket_name TYPE /aws1/s3_bucketname. - DATA lv_translate_job_name TYPE /aws1/xl8jobname. - DATA lv_input_data_s3uri TYPE /aws1/xl8s3uri. - DATA lv_output_data_s3uri TYPE /aws1/xl8s3uri. - DATA lv_output_folder TYPE /aws1/xl8s3uri. - DATA lo_result TYPE REF TO /aws1/cl_xl8strttextxlatjobrsp. - - DATA lv_jobid TYPE /aws1/xl8jobid. - DATA lo_list_translation_result TYPE REF TO /aws1/cl_xl8lsttextxlatjobsrsp. - DATA lo_inputdataconfig TYPE REF TO /aws1/cl_xl8inputdataconfig. - DATA lo_outputdataconfig TYPE REF TO /aws1/cl_xl8outputdataconfig. - DATA lt_targetlanguagecodes TYPE /aws1/cl_xl8tgtlanguagecodes00=>tt_targetlanguagecodestrlist. - DATA lo_targetlanguagecodes TYPE REF TO /aws1/cl_xl8tgtlanguagecodes00. - DATA lo_des_translation_result TYPE REF TO /aws1/cl_xl8dsctextxlatjobrsp. - - "Define job name. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_translate_job_name = 'code-example-xl8-job-' && lv_uuid_16. - TRANSLATE lv_translate_job_name TO LOWER CASE. - - "Create training data in Amazon S3. - lv_bucket_name = cv_bucket_name && lv_uuid_16. - TRANSLATE lv_bucket_name TO LOWER CASE. - zcl_aws1_ex_utils=>create_bucket( iv_bucket = lv_bucket_name - io_s3 = ao_s3 - io_session = ao_session ). - - - lv_input_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_input_folder. - lv_output_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_output_folder. - - ao_s3->putobject( - iv_bucket = lv_bucket_name - iv_key = cv_input_key - iv_body = av_file_content ). - - "Create an ABAP object for the input data config. - lo_inputdataconfig = NEW #( iv_s3uri = lv_input_data_s3uri - iv_contenttype = cv_input_data_contenttype ). - - "Create an ABAP object for the output data config. - lo_outputdataconfig = NEW #( iv_s3uri = lv_output_data_s3uri ). - - "Create an internal table for target languages. - lo_targetlanguagecodes = NEW #( iv_value = cv_targetlanguagecode ). - INSERT lo_targetlanguagecodes INTO TABLE lt_targetlanguagecodes. - - "Create a translate job. - lo_result = ao_xl8->starttexttranslationjob( - io_inputdataconfig = lo_inputdataconfig - io_outputdataconfig = lo_outputdataconfig - it_targetlanguagecodes = lt_targetlanguagecodes - iv_dataaccessrolearn = av_lrole - iv_jobname = lv_translate_job_name - iv_sourcelanguagecode = cv_sourcelanguagecode ). - - "Get the job ID. - lv_jobid = lo_result->get_jobid( ). - - "Testing list_text_translation_job. - ao_xl8_actions->list_text_translation_jobs( - EXPORTING iv_jobname = lv_translate_job_name - IMPORTING oo_result = lo_list_translation_result ). - - "Validation. - DATA(lv_found) = abap_false. - IF lo_list_translation_result->has_textxlationjobprpslist( ) = 'X'. - lv_found = abap_true. - ENDIF. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |List job failed| ). - - "Wait for translate job to complete. - job_waiter( iv_jobid = lv_jobid - iv_jobstatus = 'COMPLETED' ). - - "Clean up. - cleanup_s3( lv_bucket_name ). - - ENDMETHOD. - -ENDCLASS. diff --git a/sap-abap/services/translate/zcl_aws1_xl8_actions.clas.xml b/sap-abap/services/translate/zcl_aws1_xl8_actions.clas.xml deleted file mode 100644 index df8a6f4add3..00000000000 --- a/sap-abap/services/translate/zcl_aws1_xl8_actions.clas.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - ZCL_AWS1_XL8_ACTIONS - E - Amazon Translate Code Example Actions - 1 - X - X - X - X - - - - DESCRIBE_TEXT_TRANSLATION_JOB - E - Gets the properties associated with an asynchronous job. - - - LIST_TEXT_TRANSLATION_JOBS - E - Gets a list of the batch translation jobs. - - - START_TEXT_TRANSLATION_JOB - E - Starts an asynchronous batch translation job. - - - STOP_TEXT_TRANSLATION_JOB - E - Stops an asynchronous batch translation job that is in progr - - - TRANSLATE_TEXT - E - Translates input text from the source language to the target - - - - - diff --git a/sap-abap/services/translate/zcl_aws1_xl8_scenario.clas.abap b/sap-abap/services/translate/zcl_aws1_xl8_scenario.clas.abap deleted file mode 100644 index 53822a97141..00000000000 --- a/sap-abap/services/translate/zcl_aws1_xl8_scenario.clas.abap +++ /dev/null @@ -1,109 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS zcl_aws1_xl8_scenario DEFINITION - PUBLIC - FINAL - CREATE PUBLIC . - - PUBLIC SECTION. - - METHODS getting_started_with_xl8 - IMPORTING - !iv_sourcelanguagecode TYPE /aws1/xl8languagecodestring OPTIONAL - !iv_targetlanguagecode TYPE /aws1/xl8languagecodestring OPTIONAL - !iv_jobname TYPE /aws1/xl8jobname - !iv_input_data_s3uri TYPE /aws1/xl8s3uri - !iv_input_data_contenttype TYPE /aws1/xl8contenttype - !iv_output_data_s3uri TYPE /aws1/xl8s3uri - !iv_dataaccessrolearn TYPE /aws1/xl8iamrolearn - EXPORTING - !oo_result TYPE REF TO /aws1/cl_xl8dsctextxlatjobrsp . - PROTECTED SECTION. - PRIVATE SECTION. -ENDCLASS. - - - -CLASS ZCL_AWS1_XL8_SCENARIO IMPLEMENTATION. - - - METHOD getting_started_with_xl8. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). - DATA(lo_xl8) = /aws1/cl_xl8_factory=>create( lo_session ). - - "1. Start an asynchronous batch translation job." - "2. Wait for the asynchronous job to complete." - "3. Describe the asynchronous job." - - "snippet-start:[xl8.abapv1.getting_started_with_xl8] - - DATA lo_inputdataconfig TYPE REF TO /aws1/cl_xl8inputdataconfig. - DATA lo_outputdataconfig TYPE REF TO /aws1/cl_xl8outputdataconfig. - DATA lt_targetlanguagecodes TYPE /aws1/cl_xl8tgtlanguagecodes00=>tt_targetlanguagecodestrlist. - DATA lo_targetlanguagecodes TYPE REF TO /aws1/cl_xl8tgtlanguagecodes00. - - "Create an ABAP object for the input data config." - lo_inputdataconfig = NEW #( iv_s3uri = iv_input_data_s3uri - iv_contenttype = iv_input_data_contenttype ). - - "Create an ABAP object for the output data config." - lo_outputdataconfig = NEW #( iv_s3uri = iv_output_data_s3uri ). - - "Create an internal table for target languages." - lo_targetlanguagecodes = NEW #( iv_value = iv_targetlanguagecode ). - INSERT lo_targetlanguagecodes INTO TABLE lt_targetlanguagecodes. - - TRY. - DATA(lo_translationjob_result) = lo_xl8->starttexttranslationjob( - io_inputdataconfig = lo_inputdataconfig - io_outputdataconfig = lo_outputdataconfig - it_targetlanguagecodes = lt_targetlanguagecodes - iv_dataaccessrolearn = iv_dataaccessrolearn - iv_jobname = iv_jobname - iv_sourcelanguagecode = iv_sourcelanguagecode ). - MESSAGE 'Translation job started.' TYPE 'I'. - CATCH /aws1/cx_xl8internalserverex. - MESSAGE 'An internal server error occurred. Retry your request.' TYPE 'E'. - CATCH /aws1/cx_xl8invparamvalueex. - MESSAGE 'The value of the parameter is not valid.' TYPE 'E'. - CATCH /aws1/cx_xl8invalidrequestex. - MESSAGE 'The request that you made is not valid.' TYPE 'E'. - CATCH /aws1/cx_xl8resourcenotfoundex. - MESSAGE 'The resource you are looking for has not been found.' TYPE 'E'. - CATCH /aws1/cx_xl8toomanyrequestsex. - MESSAGE 'You have made too many requests within a short period of time. ' TYPE 'E'. - CATCH /aws1/cx_xl8unsuppedlanguage00. - MESSAGE 'Amazon Translate does not support translation from the language of the source text into the requested target language.' TYPE 'E'. - ENDTRY. - - "Get the job ID." - DATA(lv_jobid) = lo_translationjob_result->get_jobid( ). - - "Wait for translate job to complete." - DATA(lo_des_translation_result) = lo_xl8->describetexttranslationjob( iv_jobid = lv_jobid ). - WHILE lo_des_translation_result->get_textxlationjobproperties( )->get_jobstatus( ) <> 'COMPLETED'. - IF sy-index = 30. - EXIT. "Maximum 900 seconds." - ENDIF. - WAIT UP TO 30 SECONDS. - lo_des_translation_result = lo_xl8->describetexttranslationjob( iv_jobid = lv_jobid ). - ENDWHILE. - - TRY. - oo_result = lo_xl8->describetexttranslationjob( "oo_result is returned for testing purposes." - iv_jobid = lv_jobid ). - MESSAGE 'Job description retrieved.' TYPE 'I'. - CATCH /aws1/cx_xl8internalserverex. - MESSAGE 'An internal server error occurred. Retry your request.' TYPE 'E'. - CATCH /aws1/cx_xl8resourcenotfoundex. - MESSAGE 'The resource you are looking for has not been found.' TYPE 'E'. - CATCH /aws1/cx_xl8toomanyrequestsex. - MESSAGE 'You have made too many requests within a short period of time.' TYPE 'E'. - ENDTRY. - - "snippet-end:[xl8.abapv1.getting_started_with_xl8] - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/translate/zcl_aws1_xl8_scenario.clas.testclasses.abap b/sap-abap/services/translate/zcl_aws1_xl8_scenario.clas.testclasses.abap deleted file mode 100644 index ef166aa4f33..00000000000 --- a/sap-abap/services/translate/zcl_aws1_xl8_scenario.clas.testclasses.abap +++ /dev/null @@ -1,131 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 - -CLASS ltc_zcl_aws1_xl8_scenario DEFINITION FOR TESTING DURATION LONG RISK LEVEL DANGEROUS. - - PRIVATE SECTION. - - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. - - DATA ao_xl8 TYPE REF TO /aws1/if_xl8. - DATA ao_s3 TYPE REF TO /aws1/if_s3. - DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. - DATA ao_xl8_scenario TYPE REF TO zcl_aws1_xl8_scenario. - DATA av_lrole TYPE /aws1/xl8iamrolearn. - DATA av_file_content TYPE /aws1/s3_streamingblob. - - METHODS getting_started_with_xl8 FOR TESTING. - METHODS setup RAISING /aws1/cx_rt_generic zcx_aws1_ex_generic. - - -ENDCLASS. "ltc_Zcl_Aws1_Xl8_Scenario - - -CLASS ltc_zcl_aws1_xl8_scenario IMPLEMENTATION. - - METHOD setup. - ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). - ao_xl8 = /aws1/cl_xl8_factory=>create( ao_session ). - ao_xl8_scenario = NEW zcl_aws1_xl8_scenario( ). - ao_s3 = /aws1/cl_s3_factory=>create( ao_session ). - - "Translate data. - av_file_content = /aws1/cl_rt_util=>string_to_xstring( - |Que vous cherchiez à replateformer pour réduire les coûts,| && - |à migrer vers SAP S/4HANA ou à adopter l’offre RISE avec SAP, | && - |AWS propose des approches éprouvées, | && - |soutenues par une expérience inégalée dans la prise en charge des clients SAP dans le cloud. | && - |Obtenez plus de flexibilité et de valeur à partir de vos investissements SAP grâce à l'infrastructure cloud la plus sécurisée, | && - |fiable et évolutive au monde, aux plus de 200 services AWS qui vous permettent d'innover, | && - |et aux outils d'automatisation de SAP spécialement conçus, | && - |afin de réduire les risques et de simplifier les opérations. | ). - ENDMETHOD. - - METHOD getting_started_with_xl8. - - DATA lv_uuid_16 TYPE sysuuid_x16. - DATA lv_bucket_name TYPE /aws1/s3_bucketname. - DATA lv_translate_job_name TYPE /aws1/xl8jobname. - DATA lv_input_data_s3uri TYPE /aws1/xl8s3uri. - DATA lv_output_data_s3uri TYPE /aws1/xl8s3uri. - DATA lv_output_folder TYPE /aws1/xl8s3uri. - - DATA lv_jobid TYPE /aws1/xl8jobid. - DATA lo_des_translation_result TYPE REF TO /aws1/cl_xl8dsctextxlatjobrsp. - DATA lv_out_key1 TYPE /aws1/s3_objectkey. - DATA lv_out_key2 TYPE /aws1/s3_objectkey. - DATA lv_out_key3 TYPE /aws1/s3_objectkey. - DATA lv_out_key4 TYPE /aws1/s3_objectkey. - DATA lv_out_key5 TYPE /aws1/s3_objectkey. - DATA lv_out_key6 TYPE /aws1/s3_objectkey. - DATA lv_obj1 TYPE /aws1/s3_objectkey. - DATA lv_obj2 TYPE /aws1/s3_objectkey. - DATA lv_obj3 TYPE /aws1/s3_objectkey. - - CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-xl8-'. - CONSTANTS cv_input_key TYPE /aws1/s3_objectkey VALUE 'translate/input/input.txt'. - CONSTANTS cv_output_folder TYPE /aws1/s3_objectkey VALUE 'translate/output/'. - CONSTANTS cv_input_folder TYPE /aws1/s3_objectkey VALUE 'translate/input/'. - CONSTANTS cv_input_data_contenttype TYPE /aws1/xl8contenttype VALUE 'text/plain'. - CONSTANTS cv_output_data_contenttype TYPE /aws1/xl8contenttype VALUE 'text/plain'. - CONSTANTS cv_sourcelanguagecode TYPE /aws1/xl8languagecodestring VALUE 'fr'. - CONSTANTS cv_targetlanguagecode TYPE /aws1/xl8languagecodestring VALUE 'en'. - - "Define role Amazon Resource Name (ARN). - DATA(lt_roles) = ao_session->get_configuration( )->get_logical_iam_roles( ). - READ TABLE lt_roles INDEX 1 INTO DATA(lo_role). " take first role from the logical role mapping - av_lrole = lo_role-iam_role_arn. - - "Define job name. - lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). - lv_translate_job_name = 'code-example-xl8-job-' && lv_uuid_16. - TRANSLATE lv_translate_job_name TO LOWER CASE. - - "Create training data in Amazon Simple Storage Service (Amazon S3). - lv_bucket_name = cv_bucket_name && lv_uuid_16. - TRANSLATE lv_bucket_name TO LOWER CASE. - zcl_aws1_ex_utils=>create_bucket( iv_bucket = lv_bucket_name - io_s3 = ao_s3 - io_session = ao_session ). - lv_input_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_input_folder. - lv_output_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_output_folder. - - ao_s3->putobject( - iv_bucket = lv_bucket_name - iv_key = cv_input_key - iv_body = av_file_content ). - - "Testing. - ao_xl8_scenario->getting_started_with_xl8( - EXPORTING - iv_jobname = lv_translate_job_name - iv_dataaccessrolearn = av_lrole - iv_input_data_s3uri = lv_input_data_s3uri - iv_input_data_contenttype = cv_input_data_contenttype - iv_output_data_s3uri = lv_output_data_s3uri - iv_sourcelanguagecode = cv_sourcelanguagecode - iv_targetlanguagecode = cv_targetlanguagecode - IMPORTING - oo_result = lo_des_translation_result ). - - "Validation. - DATA(lv_found) = abap_false. - IF lo_des_translation_result->get_textxlationjobproperties( )->get_jobstatus( ) = 'COMPLETED'. - lv_found = abap_true. - ENDIF. - - cl_abap_unit_assert=>assert_true( - act = lv_found - msg = |Describe job failed| ). - - "Clean up. - DATA(lo_list) = ao_s3->listobjectsv2( iv_bucket = lv_bucket_name ). - LOOP AT lo_list->get_contents( ) INTO DATA(lo_object). - ao_s3->deleteobject( - iv_bucket = lv_bucket_name - iv_key = lo_object->get_key( ) ). - ENDLOOP. - - ao_s3->deletebucket( iv_bucket = lv_bucket_name ). - ENDMETHOD. -ENDCLASS. diff --git a/sap-abap/services/translate/zcl_aws1_xl8_scenario.clas.xml b/sap-abap/services/translate/zcl_aws1_xl8_scenario.clas.xml deleted file mode 100644 index c8500d29a31..00000000000 --- a/sap-abap/services/translate/zcl_aws1_xl8_scenario.clas.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - ZCL_AWS1_XL8_SCENARIO - E - Amazon Translate Code Example Scenario - 1 - X - X - X - X - - - - GETTING_STARTED_WITH_XL8 - E - Getting started with Amazon Translate. - - - - - diff --git a/sap-abap/services/translate/README.md b/sap-abap/services/xl8/README.md similarity index 100% rename from sap-abap/services/translate/README.md rename to sap-abap/services/xl8/README.md From 38c45c32550c87ad34bdb89f148522de45a92417 Mon Sep 17 00:00:00 2001 From: Deepika Raje Date: Mon, 27 Oct 2025 07:16:47 +0000 Subject: [PATCH 02/11] rename filename from z namespace to /AWXEX/ namesp rename filename from z namespace to /AWXEX/ namespace, update service names to use TLAs, fix code bug, add missing exceptions --- sap-abap/#awsex#.nspc.xml | 15 + .../bdr/#awsex#cl_bdr_actions.clas.abap | 294 ++ ...awsex#cl_bdr_actions.clas.testclasses.abap | 62 + .../bdr/#awsex#cl_bdr_actions.clas.xml | 17 + .../bdz/#awsex#cl_bdz_actions.clas.abap | 80 + ...awsex#cl_bdz_actions.clas.testclasses.abap | 154 ++ .../bdz/#awsex#cl_bdz_actions.clas.xml | 17 + sap-abap/services/bdz/package.devc.xml | 2 +- .../cpd/#awsex#cl_cpd_actions.clas.abap | 48 + ...awsex#cl_cpd_actions.clas.testclasses.abap | 37 + .../cpd/#awsex#cl_cpd_actions.clas.xml | 25 + .../cwt/#awsex#cl_cwt_actions.clas.abap | 200 ++ ...awsex#cl_cwt_actions.clas.testclasses.abap | 574 ++++ .../cwt/#awsex#cl_cwt_actions.clas.xml} | 39 +- .../cwt/#awsex#cl_cwt_scenarios.clas.abap | 109 + ...sex#cl_cwt_scenarios.clas.testclasses.abap | 122 + .../cwt/#awsex#cl_cwt_scenarios.clas.xml | 17 + sap-abap/services/cwt/package.devc.xml | 10 + .../dyn/#awsex#cl_dyn_actions.clas.abap | 371 +++ ...awsex#cl_dyn_actions.clas.testclasses.abap | 344 +++ .../dyn/#awsex#cl_dyn_actions.clas.xml | 79 + .../dyn/#awsex#cl_dyn_scenarios.clas.abap | 215 ++ ...sex#cl_dyn_scenarios.clas.testclasses.abap | 54 + .../dyn/#awsex#cl_dyn_scenarios.clas.xml | 25 + sap-abap/services/dyn/package.devc.xml | 2 +- .../ec2/#awsex#cl_ec2_actions.clas.abap | 573 ++++ ...awsex#cl_ec2_actions.clas.testclasses.abap | 487 ++++ .../ec2/#awsex#cl_ec2_actions.clas.xml | 127 + .../kns/#awsex#cl_kns_actions.clas.abap | 260 ++ ...awsex#cl_kns_actions.clas.testclasses.abap | 518 ++++ .../kns/#awsex#cl_kns_actions.clas.xml | 61 + .../kns/#awsex#cl_kns_scenarios.clas.abap | 157 ++ ...sex#cl_kns_scenarios.clas.testclasses.abap | 90 + .../kns/#awsex#cl_kns_scenarios.clas.xml | 25 + sap-abap/services/kns/package.devc.xml | 10 + .../lmd/#awsex#cl_lmd_actions.clas.abap | 278 ++ ...awsex#cl_lmd_actions.clas.testclasses.abap | 332 +++ .../lmd/#awsex#cl_lmd_actions.clas.xml | 17 + .../lmd/#awsex#cl_lmd_scenarios.clas.abap | 254 ++ ...sex#cl_lmd_scenarios.clas.testclasses.abap | 165 ++ .../lmd/#awsex#cl_lmd_scenarios.clas.xml | 17 + sap-abap/services/lmd/package.devc.xml | 10 + .../s3/#awsex#cl_s3_actions.clas.abap | 243 ++ ...#awsex#cl_s3_actions.clas.testclasses.abap | 320 +++ .../services/s3/#awsex#cl_s3_actions.clas.xml | 17 + .../s3/#awsex#cl_s3_scenarios.clas.abap | 192 ++ ...wsex#cl_s3_scenarios.clas.testclasses.abap | 113 + .../s3/#awsex#cl_s3_scenarios.clas.xml | 17 + .../sgm/#awsex#cl_sgm_actions.clas.abap | 511 ++++ ...awsex#cl_sgm_actions.clas.testclasses.abap | 2453 +++++++++++++++++ .../sgm/#awsex#cl_sgm_actions.clas.xml | 17 + .../sgm/#awsex#cl_sgm_scenarios.clas.abap | 257 ++ ...sex#cl_sgm_scenarios.clas.testclasses.abap | 321 +++ .../sgm/#awsex#cl_sgm_scenarios.clas.xml | 17 + sap-abap/services/sgm/package.devc.xml | 10 + .../sns/#awsex#cl_sns_actions.clas.abap | 232 ++ ...awsex#cl_sns_actions.clas.testclasses.abap | 246 ++ .../sns/#awsex#cl_sns_actions.clas.xml | 17 + .../sns/#awsex#cl_sns_scenarios.clas.abap | 92 + ...sex#cl_sns_scenarios.clas.testclasses.abap | 187 ++ .../sns/#awsex#cl_sns_scenarios.clas.xml | 17 + .../sqs/#awsex#cl_sqs_actions.clas.abap | 213 ++ ...awsex#cl_sqs_actions.clas.testclasses.abap | 215 ++ .../sqs/#awsex#cl_sqs_actions.clas.xml | 17 + .../tex/#awsex#cl_tex_actions.clas.abap | 371 +++ ...awsex#cl_tex_actions.clas.testclasses.abap | 218 ++ .../tex/#awsex#cl_tex_actions.clas.xml | 17 + .../tex/#awsex#cl_tex_scenarios.clas.abap | 112 + ...sex#cl_tex_scenarios.clas.testclasses.abap | 54 + .../tex/#awsex#cl_tex_scenarios.clas.xml | 17 + sap-abap/services/tex/package.devc.xml | 10 + .../xl8/#awsex#cl_xl8_actions.clas.abap | 221 ++ ...awsex#cl_xl8_actions.clas.testclasses.abap | 455 +++ .../xl8/#awsex#cl_xl8_actions.clas.xml | 17 + .../xl8/#awsex#cl_xl8_scenarios.clas.abap | 107 + ...sex#cl_xl8_scenarios.clas.testclasses.abap | 131 + .../xl8/#awsex#cl_xl8_scenarios.clas.xml | 17 + sap-abap/services/xl8/package.devc.xml | 10 + ...ls.clas.abap => #awsex#cl_utils.clas.abap} | 20 +- sap-abap/util/#awsex#cl_utils.clas.xml | 16 + sap-abap/util/#awsex#cx_generic.clas.abap | 50 + ...ic.clas.xml => #awsex#cx_generic.clas.xml} | 2 +- ...x_exc.msag.xml => #awsex#lib_exc.msag.xml} | 4 +- sap-abap/util/zcx_aws1_ex_generic.clas.abap | 50 - 84 files changed, 13829 insertions(+), 87 deletions(-) create mode 100644 sap-abap/#awsex#.nspc.xml create mode 100644 sap-abap/services/bdr/#awsex#cl_bdr_actions.clas.abap create mode 100644 sap-abap/services/bdr/#awsex#cl_bdr_actions.clas.testclasses.abap create mode 100644 sap-abap/services/bdr/#awsex#cl_bdr_actions.clas.xml create mode 100644 sap-abap/services/bdz/#awsex#cl_bdz_actions.clas.abap create mode 100644 sap-abap/services/bdz/#awsex#cl_bdz_actions.clas.testclasses.abap create mode 100644 sap-abap/services/bdz/#awsex#cl_bdz_actions.clas.xml create mode 100644 sap-abap/services/cpd/#awsex#cl_cpd_actions.clas.abap create mode 100644 sap-abap/services/cpd/#awsex#cl_cpd_actions.clas.testclasses.abap create mode 100644 sap-abap/services/cpd/#awsex#cl_cpd_actions.clas.xml create mode 100644 sap-abap/services/cwt/#awsex#cl_cwt_actions.clas.abap create mode 100644 sap-abap/services/cwt/#awsex#cl_cwt_actions.clas.testclasses.abap rename sap-abap/{util/zcl_aws1_ex_utils.clas.xml => services/cwt/#awsex#cl_cwt_actions.clas.xml} (54%) create mode 100644 sap-abap/services/cwt/#awsex#cl_cwt_scenarios.clas.abap create mode 100644 sap-abap/services/cwt/#awsex#cl_cwt_scenarios.clas.testclasses.abap create mode 100644 sap-abap/services/cwt/#awsex#cl_cwt_scenarios.clas.xml create mode 100644 sap-abap/services/cwt/package.devc.xml create mode 100644 sap-abap/services/dyn/#awsex#cl_dyn_actions.clas.abap create mode 100644 sap-abap/services/dyn/#awsex#cl_dyn_actions.clas.testclasses.abap create mode 100644 sap-abap/services/dyn/#awsex#cl_dyn_actions.clas.xml create mode 100644 sap-abap/services/dyn/#awsex#cl_dyn_scenarios.clas.abap create mode 100644 sap-abap/services/dyn/#awsex#cl_dyn_scenarios.clas.testclasses.abap create mode 100644 sap-abap/services/dyn/#awsex#cl_dyn_scenarios.clas.xml create mode 100644 sap-abap/services/ec2/#awsex#cl_ec2_actions.clas.abap create mode 100644 sap-abap/services/ec2/#awsex#cl_ec2_actions.clas.testclasses.abap create mode 100644 sap-abap/services/ec2/#awsex#cl_ec2_actions.clas.xml create mode 100644 sap-abap/services/kns/#awsex#cl_kns_actions.clas.abap create mode 100644 sap-abap/services/kns/#awsex#cl_kns_actions.clas.testclasses.abap create mode 100644 sap-abap/services/kns/#awsex#cl_kns_actions.clas.xml create mode 100644 sap-abap/services/kns/#awsex#cl_kns_scenarios.clas.abap create mode 100644 sap-abap/services/kns/#awsex#cl_kns_scenarios.clas.testclasses.abap create mode 100644 sap-abap/services/kns/#awsex#cl_kns_scenarios.clas.xml create mode 100644 sap-abap/services/kns/package.devc.xml create mode 100644 sap-abap/services/lmd/#awsex#cl_lmd_actions.clas.abap create mode 100644 sap-abap/services/lmd/#awsex#cl_lmd_actions.clas.testclasses.abap create mode 100644 sap-abap/services/lmd/#awsex#cl_lmd_actions.clas.xml create mode 100644 sap-abap/services/lmd/#awsex#cl_lmd_scenarios.clas.abap create mode 100644 sap-abap/services/lmd/#awsex#cl_lmd_scenarios.clas.testclasses.abap create mode 100644 sap-abap/services/lmd/#awsex#cl_lmd_scenarios.clas.xml create mode 100644 sap-abap/services/lmd/package.devc.xml create mode 100644 sap-abap/services/s3/#awsex#cl_s3_actions.clas.abap create mode 100644 sap-abap/services/s3/#awsex#cl_s3_actions.clas.testclasses.abap create mode 100644 sap-abap/services/s3/#awsex#cl_s3_actions.clas.xml create mode 100644 sap-abap/services/s3/#awsex#cl_s3_scenarios.clas.abap create mode 100644 sap-abap/services/s3/#awsex#cl_s3_scenarios.clas.testclasses.abap create mode 100644 sap-abap/services/s3/#awsex#cl_s3_scenarios.clas.xml create mode 100644 sap-abap/services/sgm/#awsex#cl_sgm_actions.clas.abap create mode 100644 sap-abap/services/sgm/#awsex#cl_sgm_actions.clas.testclasses.abap create mode 100644 sap-abap/services/sgm/#awsex#cl_sgm_actions.clas.xml create mode 100644 sap-abap/services/sgm/#awsex#cl_sgm_scenarios.clas.abap create mode 100644 sap-abap/services/sgm/#awsex#cl_sgm_scenarios.clas.testclasses.abap create mode 100644 sap-abap/services/sgm/#awsex#cl_sgm_scenarios.clas.xml create mode 100644 sap-abap/services/sgm/package.devc.xml create mode 100644 sap-abap/services/sns/#awsex#cl_sns_actions.clas.abap create mode 100644 sap-abap/services/sns/#awsex#cl_sns_actions.clas.testclasses.abap create mode 100644 sap-abap/services/sns/#awsex#cl_sns_actions.clas.xml create mode 100644 sap-abap/services/sns/#awsex#cl_sns_scenarios.clas.abap create mode 100644 sap-abap/services/sns/#awsex#cl_sns_scenarios.clas.testclasses.abap create mode 100644 sap-abap/services/sns/#awsex#cl_sns_scenarios.clas.xml create mode 100644 sap-abap/services/sqs/#awsex#cl_sqs_actions.clas.abap create mode 100644 sap-abap/services/sqs/#awsex#cl_sqs_actions.clas.testclasses.abap create mode 100644 sap-abap/services/sqs/#awsex#cl_sqs_actions.clas.xml create mode 100644 sap-abap/services/tex/#awsex#cl_tex_actions.clas.abap create mode 100644 sap-abap/services/tex/#awsex#cl_tex_actions.clas.testclasses.abap create mode 100644 sap-abap/services/tex/#awsex#cl_tex_actions.clas.xml create mode 100644 sap-abap/services/tex/#awsex#cl_tex_scenarios.clas.abap create mode 100644 sap-abap/services/tex/#awsex#cl_tex_scenarios.clas.testclasses.abap create mode 100644 sap-abap/services/tex/#awsex#cl_tex_scenarios.clas.xml create mode 100644 sap-abap/services/tex/package.devc.xml create mode 100644 sap-abap/services/xl8/#awsex#cl_xl8_actions.clas.abap create mode 100644 sap-abap/services/xl8/#awsex#cl_xl8_actions.clas.testclasses.abap create mode 100644 sap-abap/services/xl8/#awsex#cl_xl8_actions.clas.xml create mode 100644 sap-abap/services/xl8/#awsex#cl_xl8_scenarios.clas.abap create mode 100644 sap-abap/services/xl8/#awsex#cl_xl8_scenarios.clas.testclasses.abap create mode 100644 sap-abap/services/xl8/#awsex#cl_xl8_scenarios.clas.xml create mode 100644 sap-abap/services/xl8/package.devc.xml rename sap-abap/util/{zcl_aws1_ex_utils.clas.abap => #awsex#cl_utils.clas.abap} (84%) create mode 100644 sap-abap/util/#awsex#cl_utils.clas.xml create mode 100644 sap-abap/util/#awsex#cx_generic.clas.abap rename sap-abap/util/{zcx_aws1_ex_generic.clas.xml => #awsex#cx_generic.clas.xml} (93%) rename sap-abap/util/{zaws1_ex_exc.msag.xml => #awsex#lib_exc.msag.xml} (86%) delete mode 100644 sap-abap/util/zcx_aws1_ex_generic.clas.abap diff --git a/sap-abap/#awsex#.nspc.xml b/sap-abap/#awsex#.nspc.xml new file mode 100644 index 00000000000..1f50515341c --- /dev/null +++ b/sap-abap/#awsex#.nspc.xml @@ -0,0 +1,15 @@ + + + + + + /AWSEX/ + + + E + AWS EXAMPLE CODE LIBRARY + AWS + + + + diff --git a/sap-abap/services/bdr/#awsex#cl_bdr_actions.clas.abap b/sap-abap/services/bdr/#awsex#cl_bdr_actions.clas.abap new file mode 100644 index 00000000000..2f5cf121f4d --- /dev/null +++ b/sap-abap/services/bdr/#awsex#cl_bdr_actions.clas.abap @@ -0,0 +1,294 @@ +CLASS /awsex/cl_bdr_actions DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + PROTECTED SECTION. + PRIVATE SECTION. + + METHODS prompt_claude_v2 + IMPORTING + !iv_prompt TYPE string + RETURNING + VALUE(ov_answer) TYPE string + RAISING + /aws1/cx_bdrserverexc + /aws1/cx_bdrclientexc + /aws1/cx_rt_technical_generic + /aws1/cx_rt_service_generic + /aws1/cx_rt_no_auth_generic . + METHODS prompt_stable_diffusion + IMPORTING + !iv_prompt TYPE string + RETURNING + VALUE(ov_image) TYPE xstring + RAISING + /aws1/cx_bdrserverexc + /aws1/cx_bdrclientexc + /aws1/cx_rt_technical_generic + /aws1/cx_rt_service_generic + /aws1/cx_rt_no_auth_generic . + METHODS l2_prompt_claude_v2 + IMPORTING + !iv_prompt TYPE string + RETURNING + VALUE(ov_answer) TYPE string + RAISING + /aws1/cx_bdrserverexc + /aws1/cx_bdrclientexc + /aws1/cx_rt_technical_generic + /aws1/cx_rt_service_generic + /aws1/cx_rt_no_auth_generic . + METHODS l2_prompt_stable_diffusion + IMPORTING + !iv_prompt TYPE string + RETURNING + VALUE(ov_image) TYPE xstring + RAISING + /aws1/cx_bdrserverexc + /aws1/cx_bdrclientexc + /aws1/cx_rt_technical_generic + /aws1/cx_rt_service_generic + /aws1/cx_rt_no_auth_generic . + METHODS l2_prompt_claude_v3 + IMPORTING + !iv_prompt TYPE string + RETURNING + VALUE(ov_answer) TYPE string + RAISING + /aws1/cx_bdrserverexc + /aws1/cx_bdrclientexc + /aws1/cx_rt_technical_generic + /aws1/cx_rt_service_generic + /aws1/cx_rt_no_auth_generic + /aws1/cx_bdr_l2_generic . +ENDCLASS. + + + +CLASS /AWSEX/CL_BDR_ACTIONS IMPLEMENTATION. + + + METHOD l2_prompt_claude_v2. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_bdr) = /aws1/cl_bdr_factory=>create( lo_session ). + "snippet-start:[bdr.abapv1.invokemodel_l2_claude_v2] + TRY. + DATA(lo_bdr_l2_claude) = /aws1/cl_bdr_l2_factory=>create_claude_2( lo_bdr ). + " iv_prompt can contain a prompt like 'tell me a joke about Java programmers'. + DATA(lv_answer) = lo_bdr_l2_claude->prompt_for_text( iv_prompt ). + CATCH /aws1/cx_bdraccessdeniedex INTO DATA(lo_ex). + WRITE / lo_ex->get_text( ). + WRITE / |Don't forget to enable model access at https://console.aws.amazon.com/bedrock/home?#/modelaccess|. + + ENDTRY. + "snippet-end:[bdr.abapv1.invokemodel_l2_claude_v2] + ov_answer = lv_answer. + ENDMETHOD. + + + METHOD l2_prompt_claude_v3. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_bdr) = /aws1/cl_bdr_factory=>create( lo_session ). + "snippet-start:[bdr.abapv1.invokemodel_l2_claude_v3] + TRY. + " Choose a model ID from Anthropic that supports the Messages API - currently this is + " Claude v2, Claude v3 and v3.5. For the list of model ID, see: + " https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids.html + + " for the list of models that support the Messages API see: + " https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages.html + DATA(lo_bdr_l2_claude) = /aws1/cl_bdr_l2_factory=>create_anthropic_msg_api( + io_bdr = lo_bdr + iv_model_id = 'anthropic.claude-3-sonnet-20240229-v1:0' ). " choosing Claude v3 Sonnet + " iv_prompt can contain a prompt like 'tell me a joke about Java programmers'. + DATA(lv_answer) = lo_bdr_l2_claude->prompt_for_text( iv_prompt = iv_prompt + iv_max_tokens = 100 ). + CATCH /aws1/cx_bdraccessdeniedex INTO DATA(lo_ex). + WRITE / lo_ex->get_text( ). + WRITE / |Don't forget to enable model access at https://console.aws.amazon.com/bedrock/home?#/modelaccess|. + + ENDTRY. + "snippet-end:[bdr.abapv1.invokemodel_l2_claude_v3] + ov_answer = lv_answer. + ENDMETHOD. + + + METHOD l2_prompt_stable_diffusion. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_bdr) = /aws1/cl_bdr_factory=>create( lo_session ). + "snippet-start:[bdr.abapv1.invokemodel_l2_stable_diffusion] + TRY. + DATA(lo_bdr_l2_sd) = /aws1/cl_bdr_l2_factory=>create_stable_diffusion_xl_1( lo_bdr ). + " iv_prompt contains a prompt like 'Show me a picture of a unicorn reading an enterprise financial report'. + DATA(lv_image) = lo_bdr_l2_sd->text_to_image( iv_prompt ). + CATCH /aws1/cx_bdraccessdeniedex INTO DATA(lo_ex). + WRITE / lo_ex->get_text( ). + WRITE / |Don't forget to enable model access at https://console.aws.amazon.com/bedrock/home?#/modelaccess|. + + ENDTRY. + "snippet-end:[bdr.abapv1.invokemodel_l2_stable_diffusion] + ov_image = lv_image. + + ENDMETHOD. + + + METHOD prompt_claude_v2. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_bdr) = /aws1/cl_bdr_factory=>create( lo_session ). + "snippet-start:[bdr.abapv1.invokemodel_claude_v2] + "Claude V2 Input Parameters should be in a format like this: +* { +* "prompt":"\n\nHuman:\\nTell me a joke\n\nAssistant:\n", +* "max_tokens_to_sample":2048, +* "temperature":0.5, +* "top_k":250, +* "top_p":1.0, +* "stop_sequences":[] +* } + + DATA: BEGIN OF ls_input, + prompt TYPE string, + max_tokens_to_sample TYPE /aws1/rt_shape_integer, + temperature TYPE /aws1/rt_shape_float, + top_k TYPE /aws1/rt_shape_integer, + top_p TYPE /aws1/rt_shape_float, + stop_sequences TYPE /aws1/rt_stringtab, + END OF ls_input. + + "Leave ls_input-stop_sequences empty. + ls_input-prompt = |\n\nHuman:\\n{ iv_prompt }\n\nAssistant:\n|. + ls_input-max_tokens_to_sample = 2048. + ls_input-temperature = '0.5'. + ls_input-top_k = 250. + ls_input-top_p = 1. + + "Serialize into JSON with /ui2/cl_json -- this assumes SAP_UI is installed. + DATA(lv_json) = /ui2/cl_json=>serialize( + data = ls_input + pretty_name = /ui2/cl_json=>pretty_mode-low_case ). + + TRY. + DATA(lo_response) = lo_bdr->invokemodel( + iv_body = /aws1/cl_rt_util=>string_to_xstring( lv_json ) + iv_modelid = 'anthropic.claude-v2' + iv_accept = 'application/json' + iv_contenttype = 'application/json' ). + + "Claude V2 Response format will be: +* { +* "completion": "Knock Knock...", +* "stop_reason": "stop_sequence" +* } + DATA: BEGIN OF ls_response, + completion TYPE string, + stop_reason TYPE string, + END OF ls_response. + + /ui2/cl_json=>deserialize( + EXPORTING jsonx = lo_response->get_body( ) + pretty_name = /ui2/cl_json=>pretty_mode-camel_case + CHANGING data = ls_response ). + + DATA(lv_answer) = ls_response-completion. + CATCH /aws1/cx_bdraccessdeniedex INTO DATA(lo_ex). + WRITE / lo_ex->get_text( ). + WRITE / |Don't forget to enable model access at https://console.aws.amazon.com/bedrock/home?#/modelaccess|. + + ENDTRY. + "snippet-end:[bdr.abapv1.invokemodel_claude_v2] + ov_answer = lv_answer. + ENDMETHOD. + + + METHOD prompt_stable_diffusion. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_bdr) = /aws1/cl_bdr_factory=>create( lo_session ). + "snippet-start:[bdr.abapv1.invokemodel_stable_diffusion] + "Stable Diffusion Input Parameters should be in a format like this: +* { +* "text_prompts": [ +* {"text":"Draw a dolphin with a mustache"}, +* {"text":"Make it photorealistic"} +* ], +* "cfg_scale":10, +* "seed":0, +* "steps":50 +* } + TYPES: BEGIN OF prompt_ts, + text TYPE /aws1/rt_shape_string, + END OF prompt_ts. + + DATA: BEGIN OF ls_input, + text_prompts TYPE STANDARD TABLE OF prompt_ts, + cfg_scale TYPE /aws1/rt_shape_integer, + seed TYPE /aws1/rt_shape_integer, + steps TYPE /aws1/rt_shape_integer, + END OF ls_input. + + APPEND VALUE prompt_ts( text = iv_prompt ) TO ls_input-text_prompts. + ls_input-cfg_scale = 10. + ls_input-seed = 0. "or better, choose a random integer. + ls_input-steps = 50. + + DATA(lv_json) = /ui2/cl_json=>serialize( + data = ls_input + pretty_name = /ui2/cl_json=>pretty_mode-low_case ). + + TRY. + DATA(lo_response) = lo_bdr->invokemodel( + iv_body = /aws1/cl_rt_util=>string_to_xstring( lv_json ) + iv_modelid = 'stability.stable-diffusion-xl-v1' + iv_accept = 'application/json' + iv_contenttype = 'application/json' ). + + "Stable Diffusion Result Format: +* { +* "result": "success", +* "artifacts": [ +* { +* "seed": 0, +* "base64": "iVBORw0KGgoAAAANSUhEUgAAAgAAA.... +* "finishReason": "SUCCESS" +* } +* ] +* } + TYPES: BEGIN OF artifact_ts, + seed TYPE /aws1/rt_shape_integer, + base64 TYPE /aws1/rt_shape_string, + finishreason TYPE /aws1/rt_shape_string, + END OF artifact_ts. + + DATA: BEGIN OF ls_response, + result TYPE /aws1/rt_shape_string, + artifacts TYPE STANDARD TABLE OF artifact_ts, + END OF ls_response. + + /ui2/cl_json=>deserialize( + EXPORTING jsonx = lo_response->get_body( ) + pretty_name = /ui2/cl_json=>pretty_mode-camel_case + CHANGING data = ls_response ). + IF ls_response-artifacts IS NOT INITIAL. + DATA(lv_image) = cl_http_utility=>if_http_utility~decode_x_base64( ls_response-artifacts[ 1 ]-base64 ). + ENDIF. + CATCH /aws1/cx_bdraccessdeniedex INTO DATA(lo_ex). + WRITE / lo_ex->get_text( ). + WRITE / |Don't forget to enable model access at https://console.aws.amazon.com/bedrock/home?#/modelaccess|. + + ENDTRY. + + "snippet-end:[bdr.abapv1.invokemodel_stable_diffusion] + ov_image = lv_image. + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/bdr/#awsex#cl_bdr_actions.clas.testclasses.abap b/sap-abap/services/bdr/#awsex#cl_bdr_actions.clas.testclasses.abap new file mode 100644 index 00000000000..14e25aa4d60 --- /dev/null +++ b/sap-abap/services/bdr/#awsex#cl_bdr_actions.clas.testclasses.abap @@ -0,0 +1,62 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 + +CLASS ltc_awsex_cl_bdr_actions DEFINITION DEFERRED. +CLASS /awsex/cl_bdr_actions DEFINITION LOCAL FRIENDS ltc_awsex_cl_bdr_actions. + +CLASS ltc_awsex_cl_bdr_actions DEFINITION FOR TESTING DURATION LONG RISK LEVEL DANGEROUS. + + PRIVATE SECTION. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA ao_bdr TYPE REF TO /aws1/if_bdr. + DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. + DATA ao_bdr_actions TYPE REF TO /awsex/cl_bdr_actions. + + METHODS test_claude_v2 FOR TESTING RAISING /aws1/cx_rt_generic. + METHODS test_stable_diffusion FOR TESTING RAISING /aws1/cx_rt_generic. + + METHODS test_l2_claude_v2 FOR TESTING RAISING /aws1/cx_rt_generic. + METHODS test_l2_claude_v3 FOR TESTING RAISING /aws1/cx_rt_generic. + METHODS test_l2_stable_diffusion FOR TESTING RAISING /aws1/cx_rt_generic. + + METHODS setup RAISING /aws1/cx_rt_generic. + +ENDCLASS. +CLASS ltc_awsex_cl_bdr_actions IMPLEMENTATION. + + METHOD setup. + ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). + ao_bdr = /aws1/cl_bdr_factory=>create( ao_session ). + ao_bdr_actions = NEW /awsex/cl_bdr_actions( ). + ENDMETHOD. + METHOD test_claude_v2. + DATA(lv_joke) = ao_bdr_actions->prompt_claude_v2( + 'Tell me a joke about ABAP programmers and Java programmers walking into a bar' ). + cl_abap_unit_assert=>assert_not_initial( act = lv_joke ). + ENDMETHOD. + + METHOD test_stable_diffusion. + DATA(lv_joke) = ao_bdr_actions->prompt_stable_diffusion( + 'Show me a picture of a kitten coding in ABAP on an SAP system' ). + cl_abap_unit_assert=>assert_not_initial( act = lv_joke ). + ENDMETHOD. + METHOD test_l2_claude_v2. + DATA(lv_joke) = ao_bdr_actions->l2_prompt_claude_v2( + 'Tell me a joke about ABAP programmers and Java programmers walking into a bar' ). + cl_abap_unit_assert=>assert_not_initial( act = lv_joke ). + ENDMETHOD. + + METHOD test_l2_claude_v3. + DATA(lv_joke) = ao_bdr_actions->l2_prompt_claude_v3( + 'Tell me a joke about ABAP programmers and Java programmers walking into a bar' ). + cl_abap_unit_assert=>assert_not_initial( act = lv_joke ). + ENDMETHOD. + + METHOD test_l2_stable_diffusion. + DATA(lv_joke) = ao_bdr_actions->l2_prompt_stable_diffusion( + 'Show me a picture of a kitten coding in ABAP on an SAP system' ). + cl_abap_unit_assert=>assert_not_initial( act = lv_joke ). + ENDMETHOD. + +ENDCLASS. diff --git a/sap-abap/services/bdr/#awsex#cl_bdr_actions.clas.xml b/sap-abap/services/bdr/#awsex#cl_bdr_actions.clas.xml new file mode 100644 index 00000000000..d18c77cbcb1 --- /dev/null +++ b/sap-abap/services/bdr/#awsex#cl_bdr_actions.clas.xml @@ -0,0 +1,17 @@ + + + + + + /AWSEX/CL_BDR_ACTIONS + E + Amazon Bedrock Runtime Code Example Actions + 1 + X + X + X + X + + + + diff --git a/sap-abap/services/bdz/#awsex#cl_bdz_actions.clas.abap b/sap-abap/services/bdz/#awsex#cl_bdz_actions.clas.abap new file mode 100644 index 00000000000..a518c82457b --- /dev/null +++ b/sap-abap/services/bdz/#awsex#cl_bdz_actions.clas.abap @@ -0,0 +1,80 @@ +CLASS /awsex/cl_bdz_actions DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + METHODS invoke_bedrock_agent + IMPORTING + !io_session TYPE REF TO /aws1/cl_rt_session_base + !iv_agentid TYPE /aws1/bdaid + !iv_agentaliasid TYPE /aws1/bdaagentaliasid + RETURNING + VALUE(ov_answer) TYPE string + RAISING + /aws1/cx_bdzserverexc + /aws1/cx_bdzclientexc + /aws1/cx_rt_technical_generic + /aws1/cx_rt_service_generic + /aws1/cx_rt_no_auth_generic + cx_uuid_error . + PROTECTED SECTION. + PRIVATE SECTION. + +ENDCLASS. + + + +CLASS /AWSEX/CL_BDZ_ACTIONS IMPLEMENTATION. + + + METHOD invoke_bedrock_agent. + DATA(lo_bdz) = /aws1/cl_bdz_factory=>create( io_session ). + + "snippet-start:[bdz.abapv1.invokeagent] + + DATA(lo_result) = lo_bdz->invokeagent( + iv_agentid = iv_agentid + iv_agentaliasid = iv_agentaliasid + iv_enabletrace = abap_true + iv_sessionid = CONV #( cl_system_uuid=>create_uuid_c26_static( ) ) + iv_inputtext = |Let's play "rock, paper, scissors". I choose rock.| ). + DATA(lo_stream) = lo_result->get_completion( ). + TRY. + " loop while there are still events in the stream + WHILE lo_stream->/aws1/if_rt_stream_reader~data_available( ) = abap_true. + DATA(lo_evt) = lo_stream->read( ). + " each /AWS1/CL_BDZRESPONSESTREAM_EV event contains exactly one member + " all others are INITIAL. For each event, process the non-initial + " member if desired + IF lo_evt->get_chunk( ) IS NOT INITIAL. + " Process a Chunk event + DATA(lv_xstr) = lo_evt->get_chunk( )->get_bytes( ). + DATA(lv_answer) = /aws1/cl_rt_util=>xstring_to_string( lv_xstr ). + " the answer says something like "I chose paper, so you lost" + ELSEIF lo_evt->get_files( ) IS NOT INITIAL. + " process a Files event if desired + ELSEIF lo_evt->get_returncontrol( ) IS NOT INITIAL. + " process a ReturnControl event if desired + ELSEIF lo_evt->get_trace( ) IS NOT INITIAL. + " process a Trace event if desired + ENDIF. + ENDWHILE. + " the stream of events can possibly contain an exception + " which will be raised to break the loop + " catch /AWS1/CX_BDZACCESSDENIEDEX. + " catch /AWS1/CX_BDZINTERNALSERVEREX. + " catch /AWS1/CX_BDZMODELNOTREADYEX. + " catch /AWS1/CX_BDZVALIDATIONEX. + " catch /AWS1/CX_BDZTHROTTLINGEX. + " catch /AWS1/CX_BDZDEPENDENCYFAILEDEX. + " catch /AWS1/CX_BDZBADGATEWAYEX. + " catch /AWS1/CX_BDZRESOURCENOTFOUNDEX. + " catch /AWS1/CX_BDZSERVICEQUOTAEXCDEX. + " catch /AWS1/CX_BDZCONFLICTEXCEPTION. + ENDTRY. + "snippet-end:[bdz.abapv1.invokeagent]. + ov_answer = lv_answer. + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/bdz/#awsex#cl_bdz_actions.clas.testclasses.abap b/sap-abap/services/bdz/#awsex#cl_bdz_actions.clas.testclasses.abap new file mode 100644 index 00000000000..da216dc484c --- /dev/null +++ b/sap-abap/services/bdz/#awsex#cl_bdz_actions.clas.testclasses.abap @@ -0,0 +1,154 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 +CLASS ltc_awsex_cl_bdz_actions DEFINITION FOR TESTING + DURATION SHORT + RISK LEVEL DANGEROUS. + PROTECTED SECTION. + METHODS test_invoke_agent FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + + PRIVATE SECTION. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + CONSTANTS cv_bdz_lrole TYPE string VALUE 'YMIT1_BDZ_ROLEARN'. + CONSTANTS cv_foundationmodel TYPE string VALUE 'us.amazon.nova-micro-v1:0'. + CONSTANTS cv_alias TYPE string VALUE 'live'. + CONSTANTS cv_action_group_name TYPE string VALUE 'action_group'. + + DATA av_func_name_fail TYPE /aws1/lmdfunctionname. + DATA ao_alias TYPE REF TO /aws1/cl_bdaagentalias. + DATA ao_bda TYPE REF TO /aws1/if_bda. + DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. + DATA av_bdz_rolearn TYPE /aws1/bdaagentrolearn. + + METHODS setup RAISING /aws1/cx_rt_generic /awsex/cx_generic. + METHODS teardown RAISING /aws1/cx_rt_service_generic /aws1/cx_rt_technical_generic /aws1/cx_rt_generic /awsex/cx_generic. + + METHODS wait_for_agent_status + IMPORTING iv_agentid TYPE string + iv_status TYPE string + RETURNING VALUE(oo_agent) TYPE REF TO /aws1/cl_bdaagent + RAISING /aws1/cx_rt_generic + /awsex/cx_generic. + + METHODS wait_for_agent_alias_status + IMPORTING iv_agentid TYPE string + iv_aliasid TYPE string + iv_status TYPE string + RETURNING VALUE(oo_alias) TYPE REF TO /aws1/cl_bdaagentalias + RAISING /aws1/cx_rt_generic + /awsex/cx_generic. + + METHODS prepare + IMPORTING iv_agentid TYPE string + RETURNING VALUE(oo_agent) TYPE REF TO /aws1/cl_bdaagent + RAISING /aws1/cx_rt_generic /awsex/cx_generic. + +ENDCLASS. + + + +CLASS ltc_awsex_cl_bdz_actions IMPLEMENTATION. + + METHOD setup. + ao_session = /aws1/cl_rt_session_aws=>create( cv_pfl ). + ao_bda = /aws1/cl_bda_factory=>create( ao_session ). + av_bdz_rolearn = ao_session->resolve_lresource( cv_bdz_lrole ). + + DATA(lv_random_string) = /awsex/cl_utils=>get_random_string( ). + + DATA(lv_instruction) = |You are an agent that plays "rock, paper, scissors". Choose rock, | && + |paper, or scissors.. When the human prompts you with | && + |their choice, reveal your choice and declare the winner. |. + + DATA(lo_agent) = ao_bda->createagent( + iv_agentname = |{ /awsex/cl_utils=>cv_asset_prefix }-bdragt-{ lv_random_string }| + iv_foundationmodel = cv_foundationmodel + iv_agentresourcerolearn = av_bdz_rolearn + iv_instruction = lv_instruction )->get_agent( ). + DATA(lv_agentid) = lo_agent->get_agentid( ). + + wait_for_agent_status( iv_agentid = lv_agentid + iv_status = |NOT_PREPARED| ). + + " get draft version + prepare( lv_agentid ). + + ao_alias = ao_bda->createagentalias( iv_agentid = lv_agentid + iv_agentaliasname = cv_alias )->get_agentalias( ). + wait_for_agent_alias_status( iv_agentid = lv_agentid + iv_aliasid = ao_alias->get_agentaliasid( ) + iv_status = |PREPARED| ). + + ENDMETHOD. + + METHOD prepare. + ao_bda->prepareagent( iv_agentid = iv_agentid ). + oo_agent = wait_for_agent_status( iv_agentid = iv_agentid + iv_status = |PREPARED| ). + ENDMETHOD. + + METHOD wait_for_agent_status. + oo_agent = ao_bda->getagent( iv_agentid )->get_agent( ). + WHILE oo_agent->get_agentstatus( ) <> iv_status. + WAIT UP TO 2 SECONDS. + IF sy-index > 20. + RAISE EXCEPTION TYPE /awsex/cx_generic + EXPORTING + av_msg = |Bedrock agent { iv_agentid } never reached status { iv_status }|. + ENDIF. + oo_agent = ao_bda->getagent( iv_agentid )->get_agent( ). + ENDWHILE. + ENDMETHOD. + + METHOD wait_for_agent_alias_status. + oo_alias = ao_bda->getagentalias( iv_agentid = iv_agentid + iv_agentaliasid = iv_aliasid )->get_agentalias( ). + WHILE oo_alias->get_agentaliasstatus( ) <> iv_status. + WAIT UP TO 2 SECONDS. + IF sy-index > 20. + RAISE EXCEPTION TYPE /awsex/cx_generic + EXPORTING + av_msg = |Bedrock agent alias { iv_aliasid } never reached status { iv_status }|. + ENDIF. + oo_alias = ao_bda->getagentalias( iv_agentid = iv_agentid + iv_agentaliasid = iv_aliasid )->get_agentalias( ). + ENDWHILE. + ENDMETHOD. + + + METHOD teardown. + IF ao_alias IS NOT INITIAL. + DATA(lv_agentid) = ao_alias->get_agentid( ). + TRY. + " first delete aliases + DATA(lt_agent_aliases) = ao_bda->listagentaliases( iv_agentid = lv_agentid )->get_agentaliassummaries( ). + LOOP AT lt_agent_aliases INTO DATA(lo_alias). + ao_bda->deleteagentalias( iv_agentid = lv_agentid + iv_agentaliasid = ao_alias->get_agentaliasid( ) ). + ENDLOOP. + DATA(lv_status) = ao_bda->deleteagent( iv_agentid = lv_agentid )->get_agentstatus( ). + WHILE lv_status <> 'DELETED'. + lv_status = ao_bda->getagent( lv_agentid )->get_agent( )->get_agentstatus( ). + ENDWHILE. + CATCH /aws1/cx_bdaresourcenotfoundex. + " it's gone + ENDTRY. + ENDIF. + + ENDMETHOD. + + + METHOD test_invoke_agent. + DATA lv_agentid TYPE string. + DATA lv_agentaliasid TYPE string. + DATA(lo_example) = NEW /awsex/cl_bdz_actions( ). + DATA(lv_result) = lo_example->invoke_bedrock_agent( + io_session = ao_session + iv_agentid = ao_alias->get_agentid( ) + iv_agentaliasid = ao_alias->get_agentaliasid( ) ). + cl_abap_unit_assert=>assert_text_matches( + text = lv_result + pattern = '.*((rock)|(paper)|(scissors)).*' + msg = |Expected "rock", "paper" or "scissors" in the response but got { lv_result }| ). + ENDMETHOD. + +ENDCLASS. diff --git a/sap-abap/services/bdz/#awsex#cl_bdz_actions.clas.xml b/sap-abap/services/bdz/#awsex#cl_bdz_actions.clas.xml new file mode 100644 index 00000000000..4c768a60289 --- /dev/null +++ b/sap-abap/services/bdz/#awsex#cl_bdz_actions.clas.xml @@ -0,0 +1,17 @@ + + + + + + /AWSEX/CL_BDZ_ACTIONS + E + Amazon Bedrock Agents Runtime Code Example Actions + 1 + X + X + X + X + + + + diff --git a/sap-abap/services/bdz/package.devc.xml b/sap-abap/services/bdz/package.devc.xml index 49672e73e44..50e7d3df6dd 100644 --- a/sap-abap/services/bdz/package.devc.xml +++ b/sap-abap/services/bdz/package.devc.xml @@ -3,7 +3,7 @@ - Bedrock Agents Runtime + Package for Bedrock Agents Runtime diff --git a/sap-abap/services/cpd/#awsex#cl_cpd_actions.clas.abap b/sap-abap/services/cpd/#awsex#cl_cpd_actions.clas.abap new file mode 100644 index 00000000000..1d92278f1f5 --- /dev/null +++ b/sap-abap/services/cpd/#awsex#cl_cpd_actions.clas.abap @@ -0,0 +1,48 @@ +class /AWSEX/CL_CPD_ACTIONS definition + public + final + create public . + +public section. + + methods DETECTSENTIMENT + exporting + value(OO_RESULT) type ref to /AWS1/CL_CPDDETECTSENTIMENTRSP + raising + /AWS1/CX_RT_GENERIC . +protected section. +private section. + +ENDCLASS. + + + +CLASS /AWSEX/CL_CPD_ACTIONS IMPLEMENTATION. + + + METHOD DETECTSENTIMENT. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_cpd) = /aws1/cl_cpd_factory=>create( lo_session ). + + DATA(lv_text) = |I love unicorns!| . + DATA(lv_language_code) = |en| . + + + " snippet-start:[cpd.abapv1.detect_sentiment] + TRY. + oo_result = lo_cpd->detectsentiment( + iv_languagecode = lv_language_code + iv_text = lv_text + ). + + MESSAGE |Detected sentiment: { oo_result->get_sentiment( ) }| TYPE 'I'. + + CATCH /aws1/cx_cpdtextsizelmtexcdex INTO DATA(lo_cpdex) . + MESSAGE 'The size of the input text exceeds the limit. Use a smaller document.' TYPE 'E'. + + ENDTRY. + " snippet-end:[cpd.abapv1.detect_sentiment] + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/cpd/#awsex#cl_cpd_actions.clas.testclasses.abap b/sap-abap/services/cpd/#awsex#cl_cpd_actions.clas.testclasses.abap new file mode 100644 index 00000000000..86ee72b05d5 --- /dev/null +++ b/sap-abap/services/cpd/#awsex#cl_cpd_actions.clas.testclasses.abap @@ -0,0 +1,37 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 + +CLASS ltc_awsex_cl_cpd_actions DEFINITION FOR TESTING + DURATION SHORT + RISK LEVEL HARMLESS. + + PRIVATE SECTION. + DATA ao_cpd_actions TYPE REF TO /awsex/cl_cpd_actions. + METHODS: detectsentiment FOR TESTING RAISING /aws1/cx_rt_generic. +ENDCLASS. "ltc_awsex_cl_cpd_actions + + +CLASS ltc_awsex_cl_cpd_actions IMPLEMENTATION. + + METHOD detectsentiment. + ao_cpd_actions = NEW /awsex/cl_cpd_actions( ). + DATA lo_output TYPE REF TO /aws1/cl_cpddetectsentimentrsp. + DATA(lv_expected_output) = |POSITIVE|. + + ao_cpd_actions->detectsentiment( + IMPORTING + oo_result = lo_output ). + + DATA(lv_found) = abap_true. + IF lo_output->has_sentiment( ) = abap_true. + IF lo_output->ask_sentiment( ) = lv_expected_output. + lv_found = abap_true. + ENDIF. + ENDIF. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Sentiment detection failed| ). + ENDMETHOD. + +ENDCLASS. diff --git a/sap-abap/services/cpd/#awsex#cl_cpd_actions.clas.xml b/sap-abap/services/cpd/#awsex#cl_cpd_actions.clas.xml new file mode 100644 index 00000000000..d7461103390 --- /dev/null +++ b/sap-abap/services/cpd/#awsex#cl_cpd_actions.clas.xml @@ -0,0 +1,25 @@ + + + + + + /AWSEX/CL_CPD_ACTIONS + E + Amazon Cmprehend Code Example Actions + 1 + X + X + X + X + + + + DETECTSENTIMENT + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + + + diff --git a/sap-abap/services/cwt/#awsex#cl_cwt_actions.clas.abap b/sap-abap/services/cwt/#awsex#cl_cwt_actions.clas.abap new file mode 100644 index 00000000000..986bd09e93f --- /dev/null +++ b/sap-abap/services/cwt/#awsex#cl_cwt_actions.clas.abap @@ -0,0 +1,200 @@ +CLASS /awsex/cl_cwt_actions DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + METHODS delete_alarms + IMPORTING + !it_alarm_names TYPE /aws1/cl_cwtalarmnames_w=>tt_alarmnames + RAISING + /aws1/cx_rt_generic . + METHODS describe_alarms + IMPORTING + !it_alarm_names TYPE /aws1/cl_cwtalarmnames_w=>tt_alarmnames + EXPORTING + !oo_result TYPE REF TO /aws1/cl_cwtdescralarmsoutput + RAISING + /aws1/cx_rt_generic . + METHODS disable_alarm_actions + IMPORTING + !it_alarm_names TYPE /aws1/cl_cwtalarmnames_w=>tt_alarmnames + RAISING + /aws1/cx_rt_generic . + METHODS enable_alarm_actions + IMPORTING + !it_alarm_names TYPE /aws1/cl_cwtalarmnames_w=>tt_alarmnames + RAISING + /aws1/cx_rt_generic . + METHODS list_metrics + IMPORTING + !iv_namespace TYPE /aws1/cwtnamespace + EXPORTING + !oo_result TYPE REF TO /aws1/cl_cwtlistmetricsoutput + RAISING + /aws1/cx_rt_generic . + METHODS put_metric_alarm + IMPORTING + !iv_alarm_name TYPE /aws1/cwtalarmname + !iv_metric_name TYPE /aws1/cwtmetricname + !iv_namespace TYPE /aws1/cwtnamespace + !iv_comparison_operator TYPE /aws1/cwtcomparisonoperator + !iv_statistic TYPE /aws1/cwtstatistic + !iv_threshold TYPE /aws1/rt_double_as_string + !iv_alarm_description TYPE /aws1/cwtalarmdescription + !iv_actions_enabled TYPE /aws1/cwtactionsenabled + !iv_evaluation_periods TYPE /aws1/cwtevaluationperiods + !it_dimensions TYPE /aws1/cl_cwtdimension=>tt_dimensions + !iv_unit TYPE /aws1/cwtstandardunit + !iv_period TYPE /aws1/cwtperiod + RAISING + /aws1/cx_rt_generic . + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS /AWSEX/CL_CWT_ACTIONS IMPLEMENTATION. + + + METHOD delete_alarms. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_cwt) = /aws1/cl_cwt_factory=>create( lo_session ). + + "snippet-start:[cwt.abapv1.delete_alarms] + TRY. + lo_cwt->deletealarms( + it_alarmnames = it_alarm_names ). + MESSAGE 'Alarms deleted.' TYPE 'I'. + CATCH /aws1/cx_cwtresourcenotfound. + MESSAGE 'Resource being accessed is not found.' TYPE 'E'. + ENDTRY. + "snippet-end:[cwt.abapv1.delete_alarms] + + ENDMETHOD. + + + METHOD describe_alarms. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_cwt) = /aws1/cl_cwt_factory=>create( lo_session ). + + "snippet-start:[cwt.abapv1.describe_alarms] + TRY. + oo_result = lo_cwt->describealarms( " oo_result is returned for testing purposes. " + it_alarmnames = it_alarm_names ). + MESSAGE 'Alarms retrieved.' TYPE 'I'. + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). + DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDTRY. + "snippet-end:[cwt.abapv1.describe_alarms] + + ENDMETHOD. + + + METHOD disable_alarm_actions. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_cwt) = /aws1/cl_cwt_factory=>create( lo_session ). + + "snippet-start:[cwt.abapv1.disable_alarm_actions] + + "Disables actions on the specified alarm. " + TRY. + lo_cwt->disablealarmactions( + it_alarmnames = it_alarm_names ). + MESSAGE 'Alarm actions disabled.' TYPE 'I'. + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). + DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDTRY. + "snippet-end:[cwt.abapv1.disable_alarm_actions] + + ENDMETHOD. + + + METHOD enable_alarm_actions. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_cwt) = /aws1/cl_cwt_factory=>create( lo_session ). + + "snippet-start:[cwt.abapv1.enable_alarm_actions] + + "Enable actions on the specified alarm." + TRY. + lo_cwt->enablealarmactions( + it_alarmnames = it_alarm_names ). + MESSAGE 'Alarm actions enabled.' TYPE 'I'. + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). + DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDTRY. + "snippet-end:[cwt.abapv1.enable_alarm_actions] + + ENDMETHOD. + + + METHOD list_metrics. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_cwt) = /aws1/cl_cwt_factory=>create( lo_session ). + + "snippet-start:[cwt.abapv1.list_metrics] + "The following list-metrics example displays the metrics for Amazon CloudWatch." + TRY. + oo_result = lo_cwt->listmetrics( " oo_result is returned for testing purposes. " + iv_namespace = iv_namespace ). + DATA(lt_metrics) = oo_result->get_metrics( ). + MESSAGE 'Metrics retrieved.' TYPE 'I'. + CATCH /aws1/cx_cwtinvparamvalueex. + MESSAGE 'The specified argument was not valid.' TYPE 'E'. + ENDTRY. + "snippet-end:[cwt.abapv1.list_metrics] + + ENDMETHOD. + + + METHOD put_metric_alarm. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_cwt) = /aws1/cl_cwt_factory=>create( lo_session ). + + "snippet-start:[cwt.abapv1.put_metric_alarm] + TRY. + lo_cwt->putmetricalarm( + iv_alarmname = iv_alarm_name + iv_comparisonoperator = iv_comparison_operator + iv_evaluationperiods = iv_evaluation_periods + iv_metricname = iv_metric_name + iv_namespace = iv_namespace + iv_statistic = iv_statistic + iv_threshold = iv_threshold + iv_actionsenabled = iv_actions_enabled + iv_alarmdescription = iv_alarm_description + iv_unit = iv_unit + iv_period = iv_period + it_dimensions = it_dimensions ). + MESSAGE 'Alarm created.' TYPE 'I'. + CATCH /aws1/cx_cwtlimitexceededfault. + MESSAGE 'The request processing has exceeded the limit' TYPE 'E'. + ENDTRY. + "snippet-end:[cwt.abapv1.put_metric_alarm] + + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/cwt/#awsex#cl_cwt_actions.clas.testclasses.abap b/sap-abap/services/cwt/#awsex#cl_cwt_actions.clas.testclasses.abap new file mode 100644 index 00000000000..42fbac0f113 --- /dev/null +++ b/sap-abap/services/cwt/#awsex#cl_cwt_actions.clas.testclasses.abap @@ -0,0 +1,574 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 + +CLASS ltc_awsex_cl_cwt_actions DEFINITION FOR TESTING DURATION LONG RISK LEVEL DANGEROUS. + + PRIVATE SECTION. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA ao_cwt TYPE REF TO /aws1/if_cwt. + DATA ao_s3 TYPE REF TO /aws1/if_s3. + DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. + DATA ao_cwt_actions TYPE REF TO /awsex/cl_cwt_actions. + DATA lv_time_stamp TYPE timestamp. + DATA lv_found TYPE abap_bool VALUE abap_false. + + METHODS put_metric_alarm FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS delete_alarms FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS describe_alarms FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS enable_alarm_actions FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS disable_alarm_actions FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS list_metrics FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS setup RAISING /aws1/cx_rt_generic /awsex/cx_generic. + +ENDCLASS. "ltc_awsex_cl_cwt_actions + + +CLASS ltc_awsex_cl_cwt_actions IMPLEMENTATION. + + METHOD setup. + ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). + ao_cwt = /aws1/cl_cwt_factory=>create( ao_session ). + ao_s3 = /aws1/cl_s3_factory=>create( ao_session ). + ao_cwt_actions = NEW /awsex/cl_cwt_actions( ). + ENDMETHOD. + + METHOD put_metric_alarm. + + DATA lv_alarm_name TYPE /aws1/cwtalarmname. + DATA lt_alarmnames TYPE /aws1/cl_cwtalarmnames_w=>tt_alarmnames. + DATA lo_alarmname TYPE REF TO /aws1/cl_cwtalarmnames_w. + DATA lt_dimensions TYPE /aws1/cl_cwtdimension=>tt_dimensions. + DATA lo_dimensions TYPE REF TO /aws1/cl_cwtdimension. + DATA lo_alarm_list_result TYPE REF TO /aws1/cl_cwtdescralarmsoutput. + DATA lv_bucket_name TYPE /aws1/s3_bucketname. + DATA lv_uuid_16 TYPE sysuuid_x16. + + CONSTANTS cv_metric_name TYPE /aws1/cwtmetricname VALUE 'NumberOfObjects'. + CONSTANTS cv_namespace TYPE /aws1/cwtnamespace VALUE 'AWS/S3'. + CONSTANTS cv_comparison_operator TYPE /aws1/cwtcomparisonoperator VALUE 'GreaterThanThreshold'. + CONSTANTS cv_statistic TYPE /aws1/cwtstatistic VALUE 'Average'. + CONSTANTS cv_threshold TYPE /aws1/rt_double_as_string VALUE 10. + CONSTANTS cv_alarm_description TYPE /aws1/cwtalarmdescription VALUE 'Alarm when number of objects exceeds 10'. + CONSTANTS cv_actions_enabled TYPE /aws1/cwtactionsenabled VALUE ' '. + CONSTANTS cv_evaluation_periods TYPE /aws1/cwtevaluationperiods VALUE 1. + CONSTANTS cv_unit TYPE /aws1/cwtstandardunit VALUE 'Percent'. + CONSTANTS cv_period TYPE /aws1/cwtperiod VALUE 86400. + CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-cwt-'. + + "Create an Amazon Simple Storage Service (Amazon S3) bucket. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_bucket_name = cv_bucket_name && lv_uuid_16. + TRANSLATE lv_bucket_name TO LOWER CASE. + DATA(lo_s3_actions) = NEW /awsex/cl_s3_actions( ). + /awsex/cl_utils=>create_bucket( iv_bucket = lv_bucket_name + io_s3 = ao_s3 + io_session = ao_session ). + "Define alarm name. + lv_alarm_name = 'code-example-cwt-s3-alarm-' && lv_uuid_16. + TRANSLATE lv_alarm_name TO LOWER CASE. + + "Create Amazon S3 dimensions. + lo_dimensions = NEW #( iv_name = 'StorageType' + iv_value = 'AllStorageTypes' ). + INSERT lo_dimensions INTO TABLE lt_dimensions. + + lo_dimensions = NEW #( iv_name = 'BucketName' + iv_value = lv_bucket_name ). + INSERT lo_dimensions INTO TABLE lt_dimensions. + + ao_cwt_actions->put_metric_alarm( + iv_alarm_name = lv_alarm_name + iv_metric_name = cv_metric_name + iv_namespace = cv_namespace + iv_comparison_operator = cv_comparison_operator + iv_statistic = cv_statistic + iv_threshold = cv_threshold + iv_alarm_description = cv_alarm_description + iv_actions_enabled = cv_actions_enabled + iv_evaluation_periods = cv_evaluation_periods + it_dimensions = lt_dimensions + iv_unit = cv_unit + iv_period = cv_period ). + + "Describe alarm. + lo_alarm_list_result = ao_cwt->describealarms( it_alarmnames = lt_alarmnames ). + + lv_found = abap_false. + + LOOP AT lo_alarm_list_result->get_metricalarms( ) INTO DATA(lo_alarms). + IF lo_alarms->get_alarmname( ) = lv_alarm_name. + lv_found = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Alarm not found| ). + + "Clean up. + lo_alarmname = NEW #( iv_value = lv_alarm_name ). + INSERT lo_alarmname INTO TABLE lt_alarmnames. + + ao_cwt->deletealarms( it_alarmnames = lt_alarmnames ). + + ao_s3->deletebucket( + iv_bucket = lv_bucket_name ). + + ENDMETHOD. + + METHOD delete_alarms. + + DATA lv_alarm_name TYPE /aws1/cwtalarmname. + DATA lt_alarmnames TYPE /aws1/cl_cwtalarmnames_w=>tt_alarmnames. + DATA lo_alarmname TYPE REF TO /aws1/cl_cwtalarmnames_w. + DATA lt_dimensions TYPE /aws1/cl_cwtdimension=>tt_dimensions. + DATA lo_dimensions TYPE REF TO /aws1/cl_cwtdimension. + DATA lo_alarm_list_result TYPE REF TO /aws1/cl_cwtdescralarmsoutput. + DATA lv_bucket_name TYPE /aws1/s3_bucketname. + DATA lv_uuid_16 TYPE sysuuid_x16. + + CONSTANTS cv_metric_name TYPE /aws1/cwtmetricname VALUE 'NumberOfObjects'. + CONSTANTS cv_namespace TYPE /aws1/cwtnamespace VALUE 'AWS/S3'. + CONSTANTS cv_comparison_operator TYPE /aws1/cwtcomparisonoperator VALUE 'GreaterThanThreshold'. + CONSTANTS cv_statistic TYPE /aws1/cwtstatistic VALUE 'Average'. + CONSTANTS cv_threshold TYPE /aws1/rt_double_as_string VALUE 10. + CONSTANTS cv_alarm_description TYPE /aws1/cwtalarmdescription VALUE 'Alarm when number of objects exceeds 10'. + CONSTANTS cv_actions_enabled TYPE /aws1/cwtactionsenabled VALUE ' '. + CONSTANTS cv_evaluation_periods TYPE /aws1/cwtevaluationperiods VALUE 1. + CONSTANTS cv_unit TYPE /aws1/cwtstandardunit VALUE 'Percent'. + CONSTANTS cv_period TYPE /aws1/cwtperiod VALUE 86400. + CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-cwt-'. + + "Create an S3 bucket. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_bucket_name = cv_bucket_name && lv_uuid_16. + TRANSLATE lv_bucket_name TO LOWER CASE. + DATA(lo_s3_actions) = NEW /awsex/cl_s3_actions( ). + /awsex/cl_utils=>create_bucket( iv_bucket = lv_bucket_name + io_s3 = ao_s3 + io_session = ao_session ). + + "Define alarm name. + lv_alarm_name = 'code-example-cwt-s3-alarm-' && lv_uuid_16. + TRANSLATE lv_alarm_name TO LOWER CASE. + + "Create Amazon S3 dimensions. + lo_dimensions = NEW #( iv_name = 'StorageType' + iv_value = 'AllStorageTypes' ). + INSERT lo_dimensions INTO TABLE lt_dimensions. + + lo_dimensions = NEW #( iv_name = 'BucketName' + iv_value = lv_bucket_name ). + INSERT lo_dimensions INTO TABLE lt_dimensions. + + ao_cwt->putmetricalarm( + iv_alarmname = lv_alarm_name + iv_metricname = cv_metric_name + iv_namespace = cv_namespace + iv_comparisonoperator = cv_comparison_operator + iv_statistic = cv_statistic + iv_threshold = cv_threshold + iv_alarmdescription = cv_alarm_description + iv_actionsenabled = cv_actions_enabled + iv_evaluationperiods = cv_evaluation_periods + iv_unit = cv_unit + iv_period = cv_period + it_dimensions = lt_dimensions ). + + "Test delete_alarm. + lo_alarmname = NEW #( iv_value = lv_alarm_name ). + INSERT lo_alarmname INTO TABLE lt_alarmnames. + + ao_cwt_actions->delete_alarms( lt_alarmnames ). + + "Describe alarm. + lo_alarm_list_result = ao_cwt->describealarms( it_alarmnames = lt_alarmnames ). + + "Validation. + lv_found = abap_false. + LOOP AT lo_alarm_list_result->get_metricalarms( ) INTO DATA(lo_alarms). + IF lo_alarms->get_alarmname( ) = lv_alarm_name. + lv_found = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_false( + act = lv_found + msg = |Alarm not deleted| ). + + "Clean up. + ao_s3->deletebucket( + iv_bucket = lv_bucket_name ). + + ENDMETHOD. + + METHOD describe_alarms. + + DATA lv_alarm_name TYPE /aws1/cwtalarmname. + DATA lt_alarmnames TYPE /aws1/cl_cwtalarmnames_w=>tt_alarmnames. + DATA lo_alarmname TYPE REF TO /aws1/cl_cwtalarmnames_w. + DATA lt_dimensions TYPE /aws1/cl_cwtdimension=>tt_dimensions. + DATA lo_dimensions TYPE REF TO /aws1/cl_cwtdimension. + DATA lo_alarm_list_result TYPE REF TO /aws1/cl_cwtdescralarmsoutput. + DATA lv_bucket_name TYPE /aws1/s3_bucketname. + DATA lv_uuid_16 TYPE sysuuid_x16. + + CONSTANTS cv_metric_name TYPE /aws1/cwtmetricname VALUE 'NumberOfObjects'. + CONSTANTS cv_namespace TYPE /aws1/cwtnamespace VALUE 'AWS/S3'. + CONSTANTS cv_comparison_operator TYPE /aws1/cwtcomparisonoperator VALUE 'GreaterThanThreshold'. + CONSTANTS cv_statistic TYPE /aws1/cwtstatistic VALUE 'Average'. + CONSTANTS cv_threshold TYPE /aws1/rt_double_as_string VALUE 10. + CONSTANTS cv_alarm_description TYPE /aws1/cwtalarmdescription VALUE 'Alarm when number of objects exceeds 10'. + CONSTANTS cv_actions_enabled TYPE /aws1/cwtactionsenabled VALUE ' '. + CONSTANTS cv_evaluation_periods TYPE /aws1/cwtevaluationperiods VALUE 1. + CONSTANTS cv_unit TYPE /aws1/cwtstandardunit VALUE 'Percent'. + CONSTANTS cv_period TYPE /aws1/cwtperiod VALUE 86400. + CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-cwt-'. + + "Create an S3 bucket. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_bucket_name = cv_bucket_name && lv_uuid_16. + TRANSLATE lv_bucket_name TO LOWER CASE. + + DATA(lo_s3_actions) = NEW /awsex/cl_s3_actions( ). + /awsex/cl_utils=>create_bucket( iv_bucket = lv_bucket_name + io_s3 = ao_s3 + io_session = ao_session ). + + "Define alarm name. + lv_alarm_name = 'code-example-cwt-s3-alarm-' && lv_uuid_16. + TRANSLATE lv_alarm_name TO LOWER CASE. + + "Create Amazon S3 dimensions. + lo_dimensions = NEW #( iv_name = 'StorageType' + iv_value = 'AllStorageTypes' ). + INSERT lo_dimensions INTO TABLE lt_dimensions. + + lo_dimensions = NEW #( iv_name = 'BucketName' + iv_value = lv_bucket_name ). + INSERT lo_dimensions INTO TABLE lt_dimensions. + + ao_cwt->putmetricalarm( + iv_alarmname = lv_alarm_name + iv_metricname = cv_metric_name + iv_namespace = cv_namespace + iv_comparisonoperator = cv_comparison_operator + iv_statistic = cv_statistic + iv_threshold = cv_threshold + iv_alarmdescription = cv_alarm_description + iv_actionsenabled = cv_actions_enabled + iv_evaluationperiods = cv_evaluation_periods + iv_unit = cv_unit + iv_period = cv_period + it_dimensions = lt_dimensions ). + + "Test describe_alarms. + lo_alarmname = NEW #( iv_value = lv_alarm_name ). + INSERT lo_alarmname INTO TABLE lt_alarmnames. + + ao_cwt_actions->describe_alarms( + EXPORTING it_alarm_names = lt_alarmnames + IMPORTING oo_result = lo_alarm_list_result ). + + "Validation. + lv_found = abap_false. + + LOOP AT lo_alarm_list_result->get_metricalarms( ) INTO DATA(lo_alarms). + IF lo_alarms->get_alarmname( ) = lv_alarm_name. + lv_found = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Alarm not found| ). + + "Clean up. + ao_cwt->deletealarms( it_alarmnames = lt_alarmnames ). + + ao_s3->deletebucket( + iv_bucket = lv_bucket_name ). + + ENDMETHOD. + + METHOD enable_alarm_actions. + + DATA lv_alarm_name TYPE /aws1/cwtalarmname. + DATA lt_alarmnames TYPE /aws1/cl_cwtalarmnames_w=>tt_alarmnames. + DATA lo_alarmname TYPE REF TO /aws1/cl_cwtalarmnames_w. + DATA lt_dimensions TYPE /aws1/cl_cwtdimension=>tt_dimensions. + DATA lo_dimensions TYPE REF TO /aws1/cl_cwtdimension. + DATA lo_alarm_list_result TYPE REF TO /aws1/cl_cwtdescralarmsoutput. + DATA lv_bucket_name TYPE /aws1/s3_bucketname. + DATA lv_uuid_16 TYPE sysuuid_x16. + + CONSTANTS cv_metric_name TYPE /aws1/cwtmetricname VALUE 'NumberOfObjects'. + CONSTANTS cv_namespace TYPE /aws1/cwtnamespace VALUE 'AWS/S3'. + CONSTANTS cv_comparison_operator TYPE /aws1/cwtcomparisonoperator VALUE 'GreaterThanThreshold'. + CONSTANTS cv_statistic TYPE /aws1/cwtstatistic VALUE 'Average'. + CONSTANTS cv_threshold TYPE /aws1/rt_double_as_string VALUE 10. + CONSTANTS cv_alarm_description TYPE /aws1/cwtalarmdescription VALUE 'Alarm when number of objects exceeds 10'. + CONSTANTS cv_actions_enabled TYPE /aws1/cwtactionsenabled VALUE ' '. + CONSTANTS cv_evaluation_periods TYPE /aws1/cwtevaluationperiods VALUE 1. + CONSTANTS cv_unit TYPE /aws1/cwtstandardunit VALUE 'Percent'. + CONSTANTS cv_period TYPE /aws1/cwtperiod VALUE 86400. + CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-cwt-'. + + "Create an S3 bucket. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_bucket_name = cv_bucket_name && lv_uuid_16. + TRANSLATE lv_bucket_name TO LOWER CASE. + + DATA(lo_s3_actions) = NEW /awsex/cl_s3_actions( ). + /awsex/cl_utils=>create_bucket( iv_bucket = lv_bucket_name + io_s3 = ao_s3 + io_session = ao_session ). + + "Define alarm name. + lv_alarm_name = 'code-example-cwt-s3-alarm-' && lv_uuid_16. + TRANSLATE lv_alarm_name TO LOWER CASE. + + "Create Amazon S3 dimensions. + lo_dimensions = NEW #( iv_name = 'StorageType' + iv_value = 'AllStorageTypes' ). + INSERT lo_dimensions INTO TABLE lt_dimensions. + + lo_dimensions = NEW #( iv_name = 'BucketName' + iv_value = lv_bucket_name ). + INSERT lo_dimensions INTO TABLE lt_dimensions. + + ao_cwt->putmetricalarm( + iv_alarmname = lv_alarm_name + iv_metricname = cv_metric_name + iv_namespace = cv_namespace + iv_comparisonoperator = cv_comparison_operator + iv_statistic = cv_statistic + iv_threshold = cv_threshold + iv_alarmdescription = cv_alarm_description + iv_actionsenabled = cv_actions_enabled + iv_evaluationperiods = cv_evaluation_periods + iv_unit = cv_unit + iv_period = cv_period + it_dimensions = lt_dimensions ). + + "Testing enable_alarm_actions. + lo_alarmname = NEW #( iv_value = lv_alarm_name ). + INSERT lo_alarmname INTO TABLE lt_alarmnames. + + ao_cwt_actions->enable_alarm_actions( lt_alarmnames ). + + "Validation. + lo_alarm_list_result = ao_cwt->describealarms( + it_alarmnames = lt_alarmnames ). + + lv_found = abap_false. + + LOOP AT lo_alarm_list_result->get_metricalarms( ) INTO DATA(lo_alarms). + IF lo_alarms->get_actionsenabled( ) = 'X'. + lv_found = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Alarm actions not enabled| ). + + "Clean up. + lo_alarmname = NEW #( iv_value = lv_alarm_name ). + INSERT lo_alarmname INTO TABLE lt_alarmnames. + + ao_cwt->deletealarms( it_alarmnames = lt_alarmnames ). + + ao_s3->deletebucket( + iv_bucket = lv_bucket_name ). + + ENDMETHOD. + + METHOD disable_alarm_actions. + + DATA lv_alarm_name TYPE /aws1/cwtalarmname. + DATA lt_alarmnames TYPE /aws1/cl_cwtalarmnames_w=>tt_alarmnames. + DATA lo_alarmname TYPE REF TO /aws1/cl_cwtalarmnames_w. + DATA lt_dimensions TYPE /aws1/cl_cwtdimension=>tt_dimensions. + DATA lo_dimensions TYPE REF TO /aws1/cl_cwtdimension. + DATA lo_alarm_list_result TYPE REF TO /aws1/cl_cwtdescralarmsoutput. + DATA lv_bucket_name TYPE /aws1/s3_bucketname. + DATA lv_uuid_16 TYPE sysuuid_x16. + + CONSTANTS cv_metric_name TYPE /aws1/cwtmetricname VALUE 'NumberOfObjects'. + CONSTANTS cv_namespace TYPE /aws1/cwtnamespace VALUE 'AWS/S3'. + CONSTANTS cv_comparison_operator TYPE /aws1/cwtcomparisonoperator VALUE 'GreaterThanThreshold'. + CONSTANTS cv_statistic TYPE /aws1/cwtstatistic VALUE 'Average'. + CONSTANTS cv_threshold TYPE /aws1/rt_double_as_string VALUE 10. + CONSTANTS cv_alarm_description TYPE /aws1/cwtalarmdescription VALUE 'Alarm when number of objects exceeds 10'. + CONSTANTS cv_actions_enabled TYPE /aws1/cwtactionsenabled VALUE 'X'. + CONSTANTS cv_evaluation_periods TYPE /aws1/cwtevaluationperiods VALUE 1. + CONSTANTS cv_unit TYPE /aws1/cwtstandardunit VALUE 'Percent'. + CONSTANTS cv_period TYPE /aws1/cwtperiod VALUE 86400. + CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-cwt-'. + + "Create an S3 bucket. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_bucket_name = cv_bucket_name && lv_uuid_16. + TRANSLATE lv_bucket_name TO LOWER CASE. + + DATA(lo_s3_actions) = NEW /awsex/cl_s3_actions( ). + /awsex/cl_utils=>create_bucket( iv_bucket = lv_bucket_name + io_s3 = ao_s3 + io_session = ao_session ). + + "Define alarm name. + lv_alarm_name = 'code-example-cwt-s3-alarm-' && lv_uuid_16. + TRANSLATE lv_alarm_name TO LOWER CASE. + + "Create Amazon S3 dimensions. + lo_dimensions = NEW #( iv_name = 'StorageType' + iv_value = 'AllStorageTypes' ). + INSERT lo_dimensions INTO TABLE lt_dimensions. + + lo_dimensions = NEW #( iv_name = 'BucketName' + iv_value = lv_bucket_name ). + INSERT lo_dimensions INTO TABLE lt_dimensions. + + ao_cwt->putmetricalarm( + iv_alarmname = lv_alarm_name + iv_metricname = cv_metric_name + iv_namespace = cv_namespace + iv_comparisonoperator = cv_comparison_operator + iv_statistic = cv_statistic + iv_threshold = cv_threshold + iv_alarmdescription = cv_alarm_description + iv_actionsenabled = cv_actions_enabled + iv_evaluationperiods = cv_evaluation_periods + iv_unit = cv_unit + iv_period = cv_period + it_dimensions = lt_dimensions ). + + "Testing disable_alarm_actions. + lo_alarmname = NEW #( iv_value = lv_alarm_name ). + INSERT lo_alarmname INTO TABLE lt_alarmnames. + + ao_cwt_actions->disable_alarm_actions( lt_alarmnames ). + + "Validation. + lo_alarm_list_result = ao_cwt->describealarms( + it_alarmnames = lt_alarmnames ). + + lv_found = abap_false. + + LOOP AT lo_alarm_list_result->get_metricalarms( ) INTO DATA(lo_alarms). + IF lo_alarms->get_actionsenabled( ) = ' '. + lv_found = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Alarm actions not disabled| ). + + "Clean up. + lo_alarmname = NEW #( iv_value = lv_alarm_name ). + INSERT lo_alarmname INTO TABLE lt_alarmnames. + + ao_cwt->deletealarms( it_alarmnames = lt_alarmnames ). + + ao_s3->deletebucket( + iv_bucket = lv_bucket_name ). + + ENDMETHOD. + + METHOD list_metrics. + + DATA lv_alarm_name TYPE /aws1/cwtalarmname. + DATA lt_alarmnames TYPE /aws1/cl_cwtalarmnames_w=>tt_alarmnames. + DATA lo_alarmname TYPE REF TO /aws1/cl_cwtalarmnames_w. + DATA lt_dimensions TYPE /aws1/cl_cwtdimension=>tt_dimensions. + DATA lo_dimensions TYPE REF TO /aws1/cl_cwtdimension. + DATA lo_alarm_list_result TYPE REF TO /aws1/cl_cwtdescralarmsoutput. + DATA lv_bucket_name TYPE /aws1/s3_bucketname. + DATA lo_metrics_result TYPE REF TO /aws1/cl_cwtlistmetricsoutput. + DATA lo_list_metrics_result TYPE REF TO /aws1/cl_cwtlistmetricsoutput. + DATA lv_uuid_16 TYPE sysuuid_x16. + DATA lt_metrics TYPE /aws1/cl_cwtmetric=>tt_metrics. + DATA lo_metrics TYPE REF TO /aws1/cl_cwtmetric. + + CONSTANTS cv_metric_name TYPE /aws1/cwtmetricname VALUE 'NumberOfObjects'. + CONSTANTS cv_namespace TYPE /aws1/cwtnamespace VALUE 'AWS/S3'. + CONSTANTS cv_comparison_operator TYPE /aws1/cwtcomparisonoperator VALUE 'GreaterThanThreshold'. + CONSTANTS cv_statistic TYPE /aws1/cwtstatistic VALUE 'Average'. + CONSTANTS cv_threshold TYPE /aws1/rt_double_as_string VALUE 10. + CONSTANTS cv_alarm_description TYPE /aws1/cwtalarmdescription VALUE 'Alarm when number of objects exceeds 10'. + CONSTANTS cv_actions_enabled TYPE /aws1/cwtactionsenabled VALUE 'X'. + CONSTANTS cv_evaluation_periods TYPE /aws1/cwtevaluationperiods VALUE 1. + CONSTANTS cv_unit TYPE /aws1/cwtstandardunit VALUE 'Percent'. + CONSTANTS cv_period TYPE /aws1/cwtperiod VALUE 86400. + CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-cwt-'. + + "Create an S3 bucket. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_bucket_name = cv_bucket_name && lv_uuid_16. + TRANSLATE lv_bucket_name TO LOWER CASE. + + DATA(lo_s3_actions) = NEW /awsex/cl_s3_actions( ). + /awsex/cl_utils=>create_bucket( iv_bucket = lv_bucket_name + io_s3 = ao_s3 + io_session = ao_session ). + + "Define alarm name. + lv_alarm_name = 'code-example-cwt-s3-alarm-' && lv_uuid_16. + TRANSLATE lv_alarm_name TO LOWER CASE. + + "Create Amazon S3 dimensions. + lo_dimensions = NEW #( iv_name = 'StorageType' + iv_value = 'AllStorageTypes' ). + INSERT lo_dimensions INTO TABLE lt_dimensions. + + lo_dimensions = NEW #( iv_name = 'BucketName' + iv_value = lv_bucket_name ). + INSERT lo_dimensions INTO TABLE lt_dimensions. + + ao_cwt->putmetricalarm( + iv_alarmname = lv_alarm_name + iv_metricname = cv_metric_name + iv_namespace = cv_namespace + iv_comparisonoperator = cv_comparison_operator + iv_statistic = cv_statistic + iv_threshold = cv_threshold + iv_alarmdescription = cv_alarm_description + iv_actionsenabled = cv_actions_enabled + iv_evaluationperiods = cv_evaluation_periods + iv_unit = cv_unit + iv_period = cv_period + it_dimensions = lt_dimensions ). + + "Testing list_metrics. + ao_cwt_actions->list_metrics( EXPORTING iv_namespace = 'AWS/S3' IMPORTING oo_result = lo_list_metrics_result ). + lt_metrics = lo_list_metrics_result->get_metrics( ). + + "Validation. + lv_found = abap_false. + + LOOP AT lt_metrics INTO lo_metrics. + IF lo_metrics->get_namespace( ) = 'AWS/S3'. + lv_found = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |No metric found| ). + + "Clean up. + lo_alarmname = NEW #( iv_value = lv_alarm_name ). + INSERT lo_alarmname INTO TABLE lt_alarmnames. + + ao_cwt->deletealarms( it_alarmnames = lt_alarmnames ). + + ao_s3->deletebucket( + iv_bucket = lv_bucket_name ). + + ENDMETHOD. + + +ENDCLASS. diff --git a/sap-abap/util/zcl_aws1_ex_utils.clas.xml b/sap-abap/services/cwt/#awsex#cl_cwt_actions.clas.xml similarity index 54% rename from sap-abap/util/zcl_aws1_ex_utils.clas.xml rename to sap-abap/services/cwt/#awsex#cl_cwt_actions.clas.xml index a6bc1d66923..21474aaa213 100644 --- a/sap-abap/util/zcl_aws1_ex_utils.clas.xml +++ b/sap-abap/services/cwt/#awsex#cl_cwt_actions.clas.xml @@ -3,56 +3,51 @@ - ZCL_AWS1_EX_UTILS + /AWSEX/CL_CWT_ACTIONS E - Misc Utilities] + CloudWatch Code Example Actions 1 X X X + X - CLEANUP_BUCKET + DELETE_ALARMS /AWS1/CX_RT_GENERIC E AWS SDK Generic Exception - CLEANUP_BUCKET - IO_S3 - E - Client for AmazonS3 - - - CLEANUP_BUCKET - IV_BUCKET + DESCRIBE_ALARMS + /AWS1/CX_RT_GENERIC E - Bucket Name + AWS SDK Generic Exception - CREATE_BUCKET + DISABLE_ALARM_ACTIONS /AWS1/CX_RT_GENERIC E AWS SDK Generic Exception - CREATE_BUCKET - IO_S3 + ENABLE_ALARM_ACTIONS + /AWS1/CX_RT_GENERIC E - Client for AmazonS3 + AWS SDK Generic Exception - CREATE_BUCKET - IO_SESSION + LIST_METRICS + /AWS1/CX_RT_GENERIC E - Abstract Interface AWS API Session + AWS SDK Generic Exception - CREATE_BUCKET - IV_BUCKET + PUT_METRIC_ALARM + /AWS1/CX_RT_GENERIC E - Bucket Name + AWS SDK Generic Exception diff --git a/sap-abap/services/cwt/#awsex#cl_cwt_scenarios.clas.abap b/sap-abap/services/cwt/#awsex#cl_cwt_scenarios.clas.abap new file mode 100644 index 00000000000..9a7d315d374 --- /dev/null +++ b/sap-abap/services/cwt/#awsex#cl_cwt_scenarios.clas.abap @@ -0,0 +1,109 @@ +CLASS /awsex/cl_cwt_scenarios DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + METHODS getting_started_with_cwt + IMPORTING + !iv_alarm_name TYPE /aws1/cwtalarmname + !iv_metric_name TYPE /aws1/cwtmetricname + !iv_namespace TYPE /aws1/cwtnamespace + !iv_comparison_operator TYPE /aws1/cwtcomparisonoperator + !iv_statistic TYPE /aws1/cwtstatistic + !iv_threshold TYPE /aws1/rt_double_as_string + !iv_alarm_description TYPE /aws1/cwtalarmdescription + !iv_actions_enabled TYPE /aws1/cwtactionsenabled + !iv_evaluation_periods TYPE /aws1/cwtevaluationperiods + !it_dimensions TYPE /aws1/cl_cwtdimension=>tt_dimensions + !iv_unit TYPE /aws1/cwtstandardunit + !iv_period TYPE /aws1/cwtperiod + EXPORTING + !oo_result TYPE REF TO /aws1/cl_cwtdescralarmsoutput + RAISING + /aws1/cx_rt_generic. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS /AWSEX/CL_CWT_SCENARIOS IMPLEMENTATION. + + + METHOD getting_started_with_cwt. + + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_cwt) = /aws1/cl_cwt_factory=>create( lo_session ). + + "This example scenario contains the following actions:" + " 1. Create an Amazon CloudWatch alarm for the Amazon Simple Storage Service (Amazon S3) bucket " + " 2. Disable the CloudWatch alarm actions " + " 3. Describe the CloudWatch alarm " + " 4. Delete the alarm " + + "snippet-start:[cwt.abapv1.getting_started_with_cwt] + + DATA lt_alarmnames TYPE /aws1/cl_cwtalarmnames_w=>tt_alarmnames. + DATA lo_alarmname TYPE REF TO /aws1/cl_cwtalarmnames_w. + + "Create an alarm" + TRY. + lo_cwt->putmetricalarm( + iv_alarmname = iv_alarm_name + iv_comparisonoperator = iv_comparison_operator + iv_evaluationperiods = iv_evaluation_periods + iv_metricname = iv_metric_name + iv_namespace = iv_namespace + iv_statistic = iv_statistic + iv_threshold = iv_threshold + iv_actionsenabled = iv_actions_enabled + iv_alarmdescription = iv_alarm_description + iv_unit = iv_unit + iv_period = iv_period + it_dimensions = it_dimensions ). + MESSAGE 'Alarm created' TYPE 'I'. + CATCH /aws1/cx_cwtlimitexceededfault. + MESSAGE 'The request processing has exceeded the limit' TYPE 'E'. + ENDTRY. + + "Create an ABAP internal table for the created alarm." + lo_alarmname = NEW #( iv_value = iv_alarm_name ). + INSERT lo_alarmname INTO TABLE lt_alarmnames. + + "Disable alarm actions." + TRY. + lo_cwt->disablealarmactions( + it_alarmnames = lt_alarmnames ). + MESSAGE 'Alarm actions disabled' TYPE 'I'. + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_disablealarm_exception). + DATA(lv_disablealarm_error) = |"{ lo_disablealarm_exception->av_err_code }" - { lo_disablealarm_exception->av_err_msg }|. + MESSAGE lv_disablealarm_error TYPE 'E'. + ENDTRY. + + "Describe alarm using the same ABAP internal table." + TRY. + oo_result = lo_cwt->describealarms( " oo_result is returned for testing purpose " + it_alarmnames = lt_alarmnames ). + MESSAGE 'Alarms retrieved' TYPE 'I'. + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_describealarms_exception). + DATA(lv_describealarms_error) = |"{ lo_describealarms_exception->av_err_code }" - { lo_describealarms_exception->av_err_msg }|. + MESSAGE lv_describealarms_error TYPE 'E'. + ENDTRY. + + "Delete alarm." + TRY. + lo_cwt->deletealarms( + it_alarmnames = lt_alarmnames ). + MESSAGE 'Alarms deleted' TYPE 'I'. + CATCH /aws1/cx_cwtresourcenotfound. + MESSAGE 'Resource being access is not found.' TYPE 'E'. + ENDTRY. + "snippet-end:[cwt.abapv1.getting_started_with_cwt] + + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/cwt/#awsex#cl_cwt_scenarios.clas.testclasses.abap b/sap-abap/services/cwt/#awsex#cl_cwt_scenarios.clas.testclasses.abap new file mode 100644 index 00000000000..75e5725c78c --- /dev/null +++ b/sap-abap/services/cwt/#awsex#cl_cwt_scenarios.clas.testclasses.abap @@ -0,0 +1,122 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 + +CLASS ltc_awsex_cl_cwt_scenario DEFINITION FOR TESTING DURATION LONG RISK LEVEL DANGEROUS. + + PRIVATE SECTION. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE ' ZCODE_DEMO'. + + DATA ao_cwt TYPE REF TO /aws1/if_cwt. + DATA ao_s3 TYPE REF TO /aws1/if_s3. + DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. + DATA ao_cwt_scenario TYPE REF TO /awsex/cl_cwt_scenarios. + + METHODS getting_started_with_cwt FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS setup RAISING /aws1/cx_rt_generic /awsex/cx_generic. +ENDCLASS. "ltc_awsex_cl_cwt_scenario + + +CLASS ltc_awsex_cl_cwt_scenario IMPLEMENTATION. + + METHOD setup. + ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). + ao_cwt = /aws1/cl_cwt_factory=>create( ao_session ). + ao_s3 = /aws1/cl_s3_factory=>create( ao_session ). + ao_cwt_scenario = NEW /awsex/cl_cwt_scenarios( ). + ENDMETHOD. + + METHOD getting_started_with_cwt. + + DATA lv_alarm_name TYPE /aws1/cwtalarmname. + DATA lt_alarmnames TYPE /aws1/cl_cwtalarmnames_w=>tt_alarmnames. + DATA lo_alarmname TYPE REF TO /aws1/cl_cwtalarmnames_w. + DATA lt_dimensions TYPE /aws1/cl_cwtdimension=>tt_dimensions. + DATA lo_dimensions TYPE REF TO /aws1/cl_cwtdimension. + DATA lo_alarm_list_result TYPE REF TO /aws1/cl_cwtdescralarmsoutput. + DATA lv_bucket_name TYPE /aws1/s3_bucketname. + DATA lv_uuid_16 TYPE sysuuid_x16. + DATA lo_result TYPE REF TO /aws1/cl_cwtdescralarmsoutput. + + + CONSTANTS cv_metric_name TYPE /aws1/cwtmetricname VALUE 'NumberOfObjects'. + CONSTANTS cv_namespace TYPE /aws1/cwtnamespace VALUE 'AWS/S3'. + CONSTANTS cv_comparison_operator TYPE /aws1/cwtcomparisonoperator VALUE 'GreaterThanThreshold'. + CONSTANTS cv_statistic TYPE /aws1/cwtstatistic VALUE 'Average'. + CONSTANTS cv_threshold TYPE /aws1/rt_double_as_string VALUE 10. + CONSTANTS cv_alarm_description TYPE /aws1/cwtalarmdescription VALUE 'Alarm when number of objects exceeds 10'. + CONSTANTS cv_actions_enabled TYPE /aws1/cwtactionsenabled VALUE ' '. + CONSTANTS cv_evaluation_periods TYPE /aws1/cwtevaluationperiods VALUE 1. + CONSTANTS cv_unit TYPE /aws1/cwtstandardunit VALUE 'Percent'. + CONSTANTS cv_period TYPE /aws1/cwtperiod VALUE 86400. + CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-cwt-'. + + "Create an Amazon Simple Storage Service (Amazon S3) bucket. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_bucket_name = cv_bucket_name && lv_uuid_16. + TRANSLATE lv_bucket_name TO LOWER CASE. + + DATA(lo_s3_actions) = NEW /awsex/cl_s3_actions( ). + lo_s3_actions->create_bucket( lv_bucket_name ). + + "Define alarm name. + lv_alarm_name = 'code-example-cwt-s3-alarm-' && lv_uuid_16. + TRANSLATE lv_alarm_name TO LOWER CASE. + + "Create Amazon S3 dimensions. + lo_dimensions = NEW #( iv_name = 'StorageType' + iv_value = 'AllStorageTypes' ). + INSERT lo_dimensions INTO TABLE lt_dimensions. + + lo_dimensions = NEW #( iv_name = 'BucketName' + iv_value = lv_bucket_name ). + INSERT lo_dimensions INTO TABLE lt_dimensions. + + ao_cwt_scenario->getting_started_with_cwt( + EXPORTING + iv_alarm_name = lv_alarm_name + iv_metric_name = cv_metric_name + iv_namespace = cv_namespace + iv_comparison_operator = cv_comparison_operator + iv_statistic = cv_statistic + iv_threshold = cv_threshold + iv_alarm_description = cv_alarm_description + iv_actions_enabled = cv_actions_enabled + iv_evaluation_periods = cv_evaluation_periods + it_dimensions = lt_dimensions + iv_unit = cv_unit + iv_period = cv_period + IMPORTING + oo_result = lo_result ). + + "Validation. + DATA(lv_found) = abap_false. + + LOOP AT lo_result->get_metricalarms( ) INTO DATA(lo_alarms). + IF lo_alarms->get_actionsenabled( ) = ' '. + lv_found = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Alarm actions not disabled| ). + + lo_alarmname = NEW #( iv_value = lv_alarm_name ). + INSERT lo_alarmname INTO TABLE lt_alarmnames. + lo_alarm_list_result = ao_cwt->describealarms( it_alarmnames = lt_alarmnames ). + lv_found = abap_false. + LOOP AT lo_alarm_list_result->get_metricalarms( ) INTO lo_alarms. + IF lo_alarms->get_alarmname( ) = lv_alarm_name. + lv_found = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_false( + act = lv_found + msg = |Alarm not deleted| ). + + ao_s3->deletebucket( + iv_bucket = lv_bucket_name ). + + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/cwt/#awsex#cl_cwt_scenarios.clas.xml b/sap-abap/services/cwt/#awsex#cl_cwt_scenarios.clas.xml new file mode 100644 index 00000000000..43930302e74 --- /dev/null +++ b/sap-abap/services/cwt/#awsex#cl_cwt_scenarios.clas.xml @@ -0,0 +1,17 @@ + + + + + + /AWSEX/CL_CWT_SCENARIOS + E + CloudWatch Code Example Scenarios + 1 + X + X + X + X + + + + diff --git a/sap-abap/services/cwt/package.devc.xml b/sap-abap/services/cwt/package.devc.xml new file mode 100644 index 00000000000..7962960c817 --- /dev/null +++ b/sap-abap/services/cwt/package.devc.xml @@ -0,0 +1,10 @@ + + + + + + Package for Amazon CloudWatch + + + + diff --git a/sap-abap/services/dyn/#awsex#cl_dyn_actions.clas.abap b/sap-abap/services/dyn/#awsex#cl_dyn_actions.clas.abap new file mode 100644 index 00000000000..00be4c93d4c --- /dev/null +++ b/sap-abap/services/dyn/#awsex#cl_dyn_actions.clas.abap @@ -0,0 +1,371 @@ +CLASS /awsex/cl_dyn_actions DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + PROTECTED SECTION. + PRIVATE SECTION. + + METHODS create_table + IMPORTING + VALUE(iv_table_name) TYPE /aws1/dyntablename + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_dyncreatetableoutput + RAISING + /aws1/cx_rt_generic . + METHODS describe_table + IMPORTING + VALUE(iv_table_name) TYPE /aws1/dyntablename + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_dyndescrtableoutput + RAISING + /aws1/cx_rt_generic . + METHODS delete_table + IMPORTING + VALUE(iv_table_name) TYPE /aws1/dyntablename + RAISING + /aws1/cx_rt_generic . + METHODS list_tables + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_dynlisttablesoutput + RAISING + /aws1/cx_rt_generic . + METHODS put_item + IMPORTING + VALUE(iv_table_name) TYPE /aws1/dyntablename + VALUE(it_item) TYPE /aws1/cl_dynattributevalue=>tt_putiteminputattributemap + RAISING + /aws1/cx_rt_generic . + METHODS get_item + IMPORTING + VALUE(iv_table_name) TYPE /aws1/dyntablename + !it_key TYPE /aws1/cl_dynattributevalue=>tt_key + RETURNING + VALUE(oo_item) TYPE REF TO /aws1/cl_dyngetitemoutput + RAISING + /aws1/cx_rt_generic . + METHODS update_item + IMPORTING + VALUE(iv_table_name) TYPE /aws1/dyntablename + VALUE(it_item_key) TYPE /aws1/cl_dynattributevalue=>tt_key + VALUE(it_attribute_updates) TYPE /aws1/cl_dynattrvalueupdate=>tt_attributeupdates + RETURNING + VALUE(oo_output) TYPE REF TO /aws1/cl_dynupdateitemoutput + RAISING + /aws1/cx_rt_generic . + METHODS delete_item + IMPORTING + VALUE(iv_table_name) TYPE /aws1/dyntablename + VALUE(it_key_input) TYPE /aws1/cl_dynattributevalue=>tt_key + RAISING + /aws1/cx_rt_generic . + METHODS query_table + IMPORTING + VALUE(iv_table_name) TYPE /aws1/dyntablename + VALUE(iv_year) TYPE numeric + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_dynqueryoutput + RAISING + /aws1/cx_rt_generic . + METHODS scan_items + IMPORTING + VALUE(iv_table_name) TYPE /aws1/dyntablename + !iv_rating TYPE numeric + RETURNING + VALUE(oo_scan_result) TYPE REF TO /aws1/cl_dynscanoutput + RAISING + /aws1/cx_rt_generic . +ENDCLASS. + + + +CLASS /AWSEX/CL_DYN_ACTIONS IMPLEMENTATION. + + + METHOD create_table. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_dyn) = /aws1/cl_dyn_factory=>create( lo_session ). + + " snippet-start:[dyn.abapv1.create_table] + TRY. + DATA(lt_keyschema) = VALUE /aws1/cl_dynkeyschemaelement=>tt_keyschema( + ( NEW /aws1/cl_dynkeyschemaelement( iv_attributename = 'year' + iv_keytype = 'HASH' ) ) + ( NEW /aws1/cl_dynkeyschemaelement( iv_attributename = 'title' + iv_keytype = 'RANGE' ) ) ). + DATA(lt_attributedefinitions) = VALUE /aws1/cl_dynattributedefn=>tt_attributedefinitions( + ( NEW /aws1/cl_dynattributedefn( iv_attributename = 'year' + iv_attributetype = 'N' ) ) + ( NEW /aws1/cl_dynattributedefn( iv_attributename = 'title' + iv_attributetype = 'S' ) ) ). + + " Adjust read/write capacities as desired. + DATA(lo_dynprovthroughput) = NEW /aws1/cl_dynprovthroughput( + iv_readcapacityunits = 5 + iv_writecapacityunits = 5 ). + oo_result = lo_dyn->createtable( + it_keyschema = lt_keyschema + iv_tablename = iv_table_name + it_attributedefinitions = lt_attributedefinitions + io_provisionedthroughput = lo_dynprovthroughput ). + " Table creation can take some time. Wait till table exists before returning. + lo_dyn->get_waiter( )->tableexists( + iv_max_wait_time = 200 + iv_tablename = iv_table_name ). + MESSAGE 'DynamoDB Table' && iv_table_name && 'created.' TYPE 'I'. + " This exception can happen if the table already exists. + CATCH /aws1/cx_dynresourceinuseex INTO DATA(lo_resourceinuseex). + DATA(lv_error) = |"{ lo_resourceinuseex->av_err_code }" - { lo_resourceinuseex->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDTRY. + " snippet-end:[dyn.abapv1.create_table] + ENDMETHOD. + + + METHOD delete_item. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_dyn) = /aws1/cl_dyn_factory=>create( lo_session ). + + " snippet-start:[dyn.abapv1.delete_item] + TRY. + DATA(lo_resp) = lo_dyn->deleteitem( + iv_tablename = iv_table_name + it_key = it_key_input ). + MESSAGE 'Deleted one item.' TYPE 'I'. + CATCH /aws1/cx_dyncondalcheckfaile00. + MESSAGE 'A condition specified in the operation could not be evaluated.' TYPE 'E'. + CATCH /aws1/cx_dynresourcenotfoundex. + MESSAGE 'The table or index does not exist' TYPE 'E'. + CATCH /aws1/cx_dyntransactconflictex. + MESSAGE 'Another transaction is using the item' TYPE 'E'. + ENDTRY. + " snippet-end:[dyn.abapv1.delete_item] + + ENDMETHOD. + + + METHOD delete_table. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_dyn) = /aws1/cl_dyn_factory=>create( lo_session ). + + " snippet-start:[dyn.abapv1.delete_table] + TRY. + lo_dyn->deletetable( iv_tablename = iv_table_name ). + " Wait till the table is actually deleted. + lo_dyn->get_waiter( )->tablenotexists( + iv_max_wait_time = 200 + iv_tablename = iv_table_name ). + MESSAGE 'Table ' && iv_table_name && ' deleted.' TYPE 'I'. + CATCH /aws1/cx_dynresourcenotfoundex. + MESSAGE 'The table ' && iv_table_name && ' does not exist' TYPE 'E'. + CATCH /aws1/cx_dynresourceinuseex. + MESSAGE 'The table cannot be deleted since it is in use' TYPE 'E'. + ENDTRY. + " snippet-end:[dyn.abapv1.delete_table] + ENDMETHOD. + + + METHOD describe_table. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_dyn) = /aws1/cl_dyn_factory=>create( lo_session ). + + " snippet-start:[dyn.abapv1.describe_table] + TRY. + oo_result = lo_dyn->describetable( iv_tablename = iv_table_name ). + DATA(lv_tablename) = oo_result->get_table( )->ask_tablename( ). + DATA(lv_tablearn) = oo_result->get_table( )->ask_tablearn( ). + DATA(lv_tablestatus) = oo_result->get_table( )->ask_tablestatus( ). + DATA(lv_itemcount) = oo_result->get_table( )->ask_itemcount( ). + MESSAGE 'The table name is ' && lv_tablename + && '. The table ARN is ' && lv_tablearn + && '. The tablestatus is ' && lv_tablestatus + && '. Item count is ' && lv_itemcount TYPE 'I'. + CATCH /aws1/cx_dynresourcenotfoundex. + MESSAGE 'The table ' && lv_tablename && ' does not exist' TYPE 'E'. + ENDTRY. + " snippet-end:[dyn.abapv1.describe_table] + + ENDMETHOD. + + + METHOD get_item. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_dyn) = /aws1/cl_dyn_factory=>create( lo_session ). + + " snippet-start:[dyn.abapv1.get_item] + TRY. + oo_item = lo_dyn->getitem( + iv_tablename = iv_table_name + it_key = it_key ). + DATA(lt_attr) = oo_item->get_item( ). + DATA(lo_title) = lt_attr[ key = 'title' ]-value. + DATA(lo_year) = lt_attr[ key = 'year' ]-value. + DATA(lo_rating) = lt_attr[ key = 'rating' ]-value. + MESSAGE 'Movie name is: ' && lo_title->get_s( ) + && 'Movie year is: ' && lo_year->get_n( ) + && 'Moving rating is: ' && lo_rating->get_n( ) TYPE 'I'. + CATCH /aws1/cx_dynresourcenotfoundex. + MESSAGE 'The table or index does not exist' TYPE 'E'. + ENDTRY. + " snippet-end:[dyn.abapv1.get_item] + + ENDMETHOD. + + + METHOD list_tables. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_dyn) = /aws1/cl_dyn_factory=>create( lo_session ). + + " snippet-start:[dyn.abapv1.list_tables] + TRY. + oo_result = lo_dyn->listtables( ). + " You can loop over the oo_result to get table properties like this. + LOOP AT oo_result->get_tablenames( ) INTO DATA(lo_table_name). + DATA(lv_tablename) = lo_table_name->get_value( ). + ENDLOOP. + DATA(lv_tablecount) = lines( oo_result->get_tablenames( ) ). + MESSAGE 'Found ' && lv_tablecount && ' tables' TYPE 'I'. + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). + DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDTRY. + " snippet-end:[dyn.abapv1.list_tables] + + ENDMETHOD. + + + METHOD put_item. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_dyn) = /aws1/cl_dyn_factory=>create( lo_session ). + + " snippet-start:[dyn.abapv1.put_item] + TRY. + DATA(lo_resp) = lo_dyn->putitem( + iv_tablename = iv_table_name + it_item = it_item ). + MESSAGE '1 row inserted into DynamoDB Table' && iv_table_name TYPE 'I'. + CATCH /aws1/cx_dyncondalcheckfaile00. + MESSAGE 'A condition specified in the operation could not be evaluated.' TYPE 'E'. + CATCH /aws1/cx_dynresourcenotfoundex. + MESSAGE 'The table or index does not exist' TYPE 'E'. + CATCH /aws1/cx_dyntransactconflictex. + MESSAGE 'Another transaction is using the item' TYPE 'E'. + ENDTRY. + " snippet-end:[dyn.abapv1.put_item] + + ENDMETHOD. + + + METHOD query_table. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_dyn) = /aws1/cl_dyn_factory=>create( lo_session ). + + " snippet-start:[dyn.abapv1.query_table] + + TRY. + " Query movies for a given year . + DATA(lt_attributelist) = VALUE /aws1/cl_dynattributevalue=>tt_attributevaluelist( + ( NEW /aws1/cl_dynattributevalue( iv_n = |{ iv_year }| ) ) ). + DATA(lt_key_conditions) = VALUE /aws1/cl_dyncondition=>tt_keyconditions( + ( VALUE /aws1/cl_dyncondition=>ts_keyconditions_maprow( + key = 'year' + value = NEW /aws1/cl_dyncondition( + it_attributevaluelist = lt_attributelist + iv_comparisonoperator = |EQ| + ) ) ) ). + oo_result = lo_dyn->query( + iv_tablename = iv_table_name + it_keyconditions = lt_key_conditions ). + DATA(lt_items) = oo_result->get_items( ). + "You can loop over the results to get item attributes. + LOOP AT lt_items INTO DATA(lt_item). + DATA(lo_title) = lt_item[ key = 'title' ]-value. + DATA(lo_year) = lt_item[ key = 'year' ]-value. + ENDLOOP. + DATA(lv_count) = oo_result->get_count( ). + MESSAGE 'Item count is: ' && lv_count TYPE 'I'. + CATCH /aws1/cx_dynresourcenotfoundex. + MESSAGE 'The table or index does not exist' TYPE 'E'. + ENDTRY. + " snippet-end:[dyn.abapv1.query_table] + + ENDMETHOD. + + + METHOD scan_items. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_dyn) = /aws1/cl_dyn_factory=>create( lo_session ). + + " snippet-start:[dyn.abapv1.scan_items] + TRY. + " Scan movies for rating greater than or equal to the rating specified + DATA(lt_attributelist) = VALUE /aws1/cl_dynattributevalue=>tt_attributevaluelist( + ( NEW /aws1/cl_dynattributevalue( iv_n = |{ iv_rating }| ) ) ). + DATA(lt_filter_conditions) = VALUE /aws1/cl_dyncondition=>tt_filterconditionmap( + ( VALUE /aws1/cl_dyncondition=>ts_filterconditionmap_maprow( + key = 'rating' + value = NEW /aws1/cl_dyncondition( + it_attributevaluelist = lt_attributelist + iv_comparisonoperator = |GE| + ) ) ) ). + oo_scan_result = lo_dyn->scan( iv_tablename = iv_table_name + it_scanfilter = lt_filter_conditions ). + DATA(lt_items) = oo_scan_result->get_items( ). + LOOP AT lt_items INTO DATA(lo_item). + " You can loop over to get individual attributes. + DATA(lo_title) = lo_item[ key = 'title' ]-value. + DATA(lo_year) = lo_item[ key = 'year' ]-value. + ENDLOOP. + DATA(lv_count) = oo_scan_result->get_count( ). + MESSAGE 'Found ' && lv_count && ' items' TYPE 'I'. + CATCH /aws1/cx_dynresourcenotfoundex. + MESSAGE 'The table or index does not exist' TYPE 'E'. + ENDTRY. + " snippet-end:[dyn.abapv1.scan_items] + + ENDMETHOD. + + + METHOD update_item. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_dyn) = /aws1/cl_dyn_factory=>create( lo_session ). + + " snippet-start:[dyn.abapv1.update_item] + TRY. + oo_output = lo_dyn->updateitem( + iv_tablename = iv_table_name + it_key = it_item_key + it_attributeupdates = it_attribute_updates ). + MESSAGE '1 item updated in DynamoDB Table' && iv_table_name TYPE 'I'. + CATCH /aws1/cx_dyncondalcheckfaile00. + MESSAGE 'A condition specified in the operation could not be evaluated.' TYPE 'E'. + CATCH /aws1/cx_dynresourcenotfoundex. + MESSAGE 'The table or index does not exist' TYPE 'E'. + CATCH /aws1/cx_dyntransactconflictex. + MESSAGE 'Another transaction is using the item' TYPE 'E'. + ENDTRY. + " snippet-end:[dyn.abapv1.update_item] + + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/dyn/#awsex#cl_dyn_actions.clas.testclasses.abap b/sap-abap/services/dyn/#awsex#cl_dyn_actions.clas.testclasses.abap new file mode 100644 index 00000000000..f9ef1a1e592 --- /dev/null +++ b/sap-abap/services/dyn/#awsex#cl_dyn_actions.clas.testclasses.abap @@ -0,0 +1,344 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 + +CLASS ltc_awsex_cl_dyn_actions DEFINITION DEFERRED. +CLASS /awsex/cl_dyn_actions DEFINITION LOCAL FRIENDS ltc_awsex_cl_dyn_actions. + +CLASS ltc_awsex_cl_dyn_actions DEFINITION FOR TESTING + DURATION LONG + RISK LEVEL DANGEROUS. + + PROTECTED SECTION. + METHODS: create_table FOR TESTING RAISING /aws1/cx_rt_generic, + describe_table FOR TESTING RAISING /aws1/cx_rt_generic, + list_tables FOR TESTING RAISING /aws1/cx_rt_generic, + put_item FOR TESTING RAISING /aws1/cx_rt_generic, + get_item FOR TESTING RAISING /aws1/cx_rt_generic, + query_table FOR TESTING RAISING /aws1/cx_rt_generic, + scan_items FOR TESTING RAISING /aws1/cx_rt_generic, + update_item FOR TESTING RAISING /aws1/cx_rt_generic, + delete_item FOR TESTING RAISING /aws1/cx_rt_generic, + delete_table FOR TESTING RAISING /aws1/cx_rt_generic. + + PRIVATE SECTION. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA ao_dyn TYPE REF TO /aws1/if_dyn. + DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. + DATA ao_dyn_actions TYPE REF TO /awsex/cl_dyn_actions. + DATA av_table_name TYPE /aws1/dyntablename. + + METHODS setup RAISING /aws1/cx_rt_generic. + METHODS teardown RAISING /aws1/cx_rt_generic. + + METHODS put_item_local + IMPORTING iv_title TYPE string + iv_year TYPE numeric + iv_rating TYPE numeric + RAISING /aws1/cx_rt_generic. + METHODS delete_table_local RAISING /aws1/cx_rt_generic. + METHODS create_table_local RAISING /aws1/cx_rt_generic. + METHODS assert_table_exists RAISING /aws1/cx_rt_generic. + METHODS assert_table_notexists RAISING /aws1/cx_rt_generic. + METHODS query_table_local + IMPORTING iv_year TYPE numeric + RETURNING VALUE(ot_items) TYPE /aws1/cl_dynattributevalue=>tt_itemlist + RAISING /aws1/cx_rt_generic. + +ENDCLASS. + +CLASS ltc_awsex_cl_dyn_actions IMPLEMENTATION. + + METHOD setup. + ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). + ao_dyn = /aws1/cl_dyn_factory=>create( ao_session ). + ao_dyn_actions = NEW /awsex/cl_dyn_actions( ). + av_table_name = |code-example-create-table|. + ENDMETHOD. + + METHOD teardown. + delete_table_local( ). + ENDMETHOD. + + METHOD create_table. + DATA(lo_table) = ao_dyn_actions->create_table( av_table_name ). + assert_table_exists( ). + MESSAGE 'create_table successful' TYPE 'I'. + ENDMETHOD. + + METHOD describe_table. + create_table_local( ). + DATA(lo_table_description) = ao_dyn_actions->describe_table( + av_table_name ). + DATA(lv_returned_tablename) = lo_table_description->get_table( )->ask_tablename( ). + cl_abap_unit_assert=>assert_equals( + exp = av_table_name + act = lv_returned_tablename + msg = |Expected the table name to be { av_table_name } but found { lv_returned_tablename }| ). + MESSAGE 'describe_table successful' TYPE 'I'. + ENDMETHOD. + + METHOD list_tables. + create_table_local( ). + DATA(lo_tables) = ao_dyn_actions->list_tables( ). + + LOOP AT lo_tables->get_tablenames( ) INTO DATA(lo_table_name). + IF lo_table_name->get_value( ) = av_table_name. + DATA(lv_found) = abap_true. + ENDIF. + ENDLOOP. + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |List table is successful| ). + MESSAGE 'list_tables successful' TYPE 'I'. + ENDMETHOD. + + METHOD put_item. + create_table_local( ). + DATA(lt_item) = VALUE /aws1/cl_dynattributevalue=>tt_putiteminputattributemap( + ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( + key = 'title' value = NEW /aws1/cl_dynattributevalue( iv_s = 'Jaws' ) ) ) + ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( + key = 'year' value = NEW /aws1/cl_dynattributevalue( iv_n = '1975' ) ) ) + ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( + key = 'rating' value = NEW /aws1/cl_dynattributevalue( iv_n = '7.8' ) ) ) ). + ao_dyn_actions->put_item( iv_table_name = av_table_name + it_item = lt_item ). + DATA(lt_items) = query_table_local( '1975' ). + READ TABLE lt_items INTO DATA(lt_attributes) INDEX 1. + DATA(lo_rating) = lt_attributes[ key = 'rating' ]-value. + DATA(lv_rating) = lo_rating->ask_n( ). + cl_abap_unit_assert=>assert_equals( exp = |7.8| + act = lv_rating + msg = |Expected rating 7.5, found { lv_rating } | ). + MESSAGE 'put_item successful' TYPE 'I'. + ENDMETHOD. + + METHOD get_item. + create_table_local( ). + put_item_local( iv_title = 'Jaws' + iv_year = 1975 + iv_rating = '7.5' ). + DATA(lo_item) = ao_dyn_actions->get_item( iv_table_name = av_table_name + it_key = VALUE /aws1/cl_dynattributevalue=>tt_key( + ( VALUE /aws1/cl_dynattributevalue=>ts_key_maprow( + key = 'title' value = NEW /aws1/cl_dynattributevalue( iv_s = 'Jaws' ) ) ) + ( VALUE /aws1/cl_dynattributevalue=>ts_key_maprow( + key = 'year' value = NEW /aws1/cl_dynattributevalue( iv_n = '1975' ) ) ) + ) ). + DATA(lt_attributes) = lo_item->get_item( ). + DATA(lo_rating) = lt_attributes[ key = 'rating' ]-value. + DATA(lv_rating) = lo_rating->ask_n( ). + cl_abap_unit_assert=>assert_equals( exp = |7.5| + act = lv_rating + msg = |Expected rating 7.5, found { lv_rating } | ). + MESSAGE 'get_item successful' TYPE 'I'. + ENDMETHOD. + + METHOD query_table. + create_table_local( ). + put_item_local( iv_title = 'Jaws' + iv_year = 1975 + iv_rating = '7.5' ). + put_item_local( iv_title = 'Star Wars' + iv_year = 1979 + iv_rating = '8.1' ). + put_item_local( iv_title = 'Barbie' + iv_year = 2023 + iv_rating = '7.9' ). + DATA(lo_query_result) = ao_dyn_actions->query_table( iv_table_name = av_table_name + iv_year = 1975 ). + READ TABLE lo_query_result->get_items( ) INTO DATA(lt_item) INDEX 1. + DATA(lo_title) = lt_item[ key = 'title' ]-value. + DATA(lv_title) = lo_title->ask_s( ). + cl_abap_unit_assert=>assert_equals( exp = |Jaws| + act = lv_title + msg = |Expected title Jaws, found { lv_title }| ). + MESSAGE 'query_table successful' TYPE 'I'. + ENDMETHOD. + + METHOD scan_items. + create_table_local( ). + put_item_local( iv_title = 'Jaws' + iv_year = 1975 + iv_rating = '7.5' ). + put_item_local( iv_title = 'Star Wars' + iv_year = 1979 + iv_rating = '8.1' ). + put_item_local( iv_title = 'Barbie' + iv_year = 2023 + iv_rating = '7.8' ). + " Scan table for rating higher than 7.8 + DATA(lo_scan_result) = ao_dyn_actions->scan_items( iv_table_name = av_table_name + iv_rating = '7.8' ). + DATA(lv_count) = lo_scan_result->get_count( ). + cl_abap_unit_assert=>assert_equals( exp = |2| + act = lv_count + msg = |Expected count 3, found { |lv_count| }| ). + MESSAGE 'scan_item successful' TYPE 'I'. + ENDMETHOD. + + METHOD update_item. + create_table_local( ). + put_item_local( iv_title = 'Jaws' + iv_year = 1975 + iv_rating = '7.5' ). + put_item_local( iv_title = 'Star Wars' + iv_year = 1979 + iv_rating = '8.1' ). + DATA(lt_attributeupdates) = VALUE /aws1/cl_dynattrvalueupdate=>tt_attributeupdates( + ( VALUE /aws1/cl_dynattrvalueupdate=>ts_attributeupdates_maprow( + key = 'rating' value = NEW /aws1/cl_dynattrvalueupdate( + io_value = NEW /aws1/cl_dynattributevalue( iv_n = '7.6' ) + iv_action = |PUT| ) ) ) ). + DATA(lt_key) = VALUE /aws1/cl_dynattributevalue=>tt_key( + ( VALUE /aws1/cl_dynattributevalue=>ts_key_maprow( + key = 'title' value = NEW /aws1/cl_dynattributevalue( iv_s = 'Jaws' ) ) ) + ( VALUE /aws1/cl_dynattributevalue=>ts_key_maprow( + key = 'year' value = NEW /aws1/cl_dynattributevalue( iv_n = '1975' ) ) ) ). + DATA(lo_resp) = ao_dyn_actions->update_item( + iv_table_name = av_table_name + it_item_key = lt_key + it_attribute_updates = lt_attributeupdates ). + " Use query item to verify that the update was successful. + DATA(lt_attributelist) = VALUE /aws1/cl_dynattributevalue=>tt_attributevaluelist( + ( NEW /aws1/cl_dynattributevalue( iv_n = '1975' ) ) ). + DATA(lt_key_conditions) = VALUE /aws1/cl_dyncondition=>tt_keyconditions( + ( VALUE /aws1/cl_dyncondition=>ts_keyconditions_maprow( + key = 'year' + value = NEW /aws1/cl_dyncondition( + it_attributevaluelist = lt_attributelist + iv_comparisonoperator = |EQ| + ) ) ) ). + DATA(lt_items) = query_table_local( 1975 ). + READ TABLE lt_items INTO DATA(lt_item) INDEX 1. + DATA(lo_rating) = lt_item[ key = 'rating' ]-value. + DATA(lv_rating) = lo_rating->ask_n( ). + cl_abap_unit_assert=>assert_equals( exp = |7.6| + act = lv_rating + msg = |Expected ratig 7.6, found { lv_rating }| ). + MESSAGE 'update_item successful' TYPE 'I'. + ENDMETHOD. + + METHOD delete_item. + create_table_local( ). + put_item_local( iv_title = 'Jaws' + iv_year = 1975 + iv_rating = '7.5' ). + put_item_local( iv_title = 'Star Wars' + iv_year = 1975 + iv_rating = '8.1' ). + DATA(lt_key) = VALUE /aws1/cl_dynattributevalue=>tt_key( + ( VALUE /aws1/cl_dynattributevalue=>ts_key_maprow( + key = 'title' value = NEW /aws1/cl_dynattributevalue( iv_s = 'Jaws' ) ) ) + ( VALUE /aws1/cl_dynattributevalue=>ts_key_maprow( + key = 'year' value = NEW /aws1/cl_dynattributevalue( iv_n = '1975' ) ) ) ). + ao_dyn_actions->delete_item( iv_table_name = av_table_name + it_key_input = lt_key ). + DATA(lt_items) = query_table_local( '1975' ). + DATA(lv_count) = lines( lt_items ). + cl_abap_unit_assert=>assert_equals( exp = |1| + act = lv_count + msg = |Expected count 1, found { |lv_count| }| ). + MESSAGE 'delete_item successful' TYPE 'I'. + ENDMETHOD. + + METHOD delete_table. + create_table_local( ). + ao_dyn_actions->delete_table( av_table_name ). + assert_table_notexists( ). + MESSAGE 'delete_table successful' TYPE 'I'. + ENDMETHOD. + + METHOD assert_table_exists. + DATA(lv_status) = ao_dyn->describetable( iv_tablename = av_table_name )->get_table( )->get_tablestatus( ). + lv_status = ao_dyn->describetable( iv_tablename = av_table_name )->get_table( )->get_tablestatus( ). + cl_abap_unit_assert=>assert_equals( + exp = lv_status + act = 'ACTIVE' + msg = |Expected the table to be in 'ACTIVE' status but received { lv_status }| ). + ENDMETHOD. + + METHOD assert_table_notexists. + TRY. + DATA(lv_status) = ao_dyn->describetable( iv_tablename = av_table_name )->get_table( )->get_tablestatus( ). + /aws1/cl_rt_assert_abap=>assert_missed_exception( iv_exception = |/AWS1/CX_RT_SERVICE_GENERIC| ). + CATCH /aws1/cx_rt_service_generic. + "ignore. expected since the table does not exist + ENDTRY. + ENDMETHOD. + + METHOD delete_table_local. + TRY. + DATA(lo_resp) = ao_dyn->deletetable( av_table_name ). + ao_dyn->get_waiter( )->tablenotexists( + iv_max_wait_time = 200 + iv_tablename = av_table_name ). + CATCH /aws1/cx_dynresourcenotfoundex. + ENDTRY. + ENDMETHOD. + + METHOD put_item_local. + DATA(lt_item) = VALUE /aws1/cl_dynattributevalue=>tt_putiteminputattributemap( + ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( + key = 'title' value = NEW /aws1/cl_dynattributevalue( iv_s = iv_title ) ) ) + ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( + key = 'year' value = NEW /aws1/cl_dynattributevalue( iv_n = |{ iv_year }| ) ) ) + ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( + key = 'rating' value = NEW /aws1/cl_dynattributevalue( iv_n = |{ iv_rating }| ) ) ) ). + ao_dyn->putitem( iv_tablename = av_table_name + it_item = lt_item ). + ENDMETHOD. + + METHOD create_table_local. + TRY. + DATA(lt_keyschema) = VALUE /aws1/cl_dynkeyschemaelement=>tt_keyschema( + ( NEW /aws1/cl_dynkeyschemaelement( iv_attributename = 'year' + iv_keytype = 'HASH' ) ) + ( NEW /aws1/cl_dynkeyschemaelement( iv_attributename = 'title' + iv_keytype = 'RANGE' ) ) ). + DATA(lt_attributedefinitions) = VALUE /aws1/cl_dynattributedefn=>tt_attributedefinitions( + ( NEW /aws1/cl_dynattributedefn( iv_attributename = 'year' + iv_attributetype = 'N' ) ) + ( NEW /aws1/cl_dynattributedefn( iv_attributename = 'title' + iv_attributetype = 'S' ) ) ). + + " Adjust read/write capacities as desired. + DATA(lo_dynprovthroughput) = NEW /aws1/cl_dynprovthroughput( + iv_readcapacityunits = 5 + iv_writecapacityunits = 5 ). + ao_dyn->createtable( + it_keyschema = lt_keyschema + iv_tablename = av_table_name + it_attributedefinitions = lt_attributedefinitions + io_provisionedthroughput = lo_dynprovthroughput ). + ao_dyn->get_waiter( )->tableexists( + iv_max_wait_time = 200 + iv_tablename = av_table_name ). + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_genericex). + DATA(lv_error) = |"{ lo_genericex->av_err_code }" - { lo_genericex->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDTRY. + ENDMETHOD. + + METHOD query_table_local. + TRY. + DATA(lt_attributelist) = VALUE /aws1/cl_dynattributevalue=>tt_attributevaluelist( + ( NEW /aws1/cl_dynattributevalue( iv_n = |{ iv_year }| ) ) ). + DATA(lt_key_conditions) = VALUE /aws1/cl_dyncondition=>tt_keyconditions( + ( VALUE /aws1/cl_dyncondition=>ts_keyconditions_maprow( + key = 'year' + value = NEW /aws1/cl_dyncondition( + it_attributevaluelist = lt_attributelist + iv_comparisonoperator = |EQ| + ) ) ) ). + DATA(lo_result) = ao_dyn->query( + iv_tablename = av_table_name + it_keyconditions = lt_key_conditions ). + ot_items = lo_result->get_items( ). + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_genericex). + DATA(lv_error) = |"{ lo_genericex->av_err_code }" - { lo_genericex->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDTRY. + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/dyn/#awsex#cl_dyn_actions.clas.xml b/sap-abap/services/dyn/#awsex#cl_dyn_actions.clas.xml new file mode 100644 index 00000000000..08fe36bfdb7 --- /dev/null +++ b/sap-abap/services/dyn/#awsex#cl_dyn_actions.clas.xml @@ -0,0 +1,79 @@ + + + + + + /AWSEX/CL_DYN_ACTIONS + E + DynamoDB Code Example Actions + 1 + X + X + X + X + + + + CREATE_TABLE + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + DELETE_ITEM + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + DELETE_TABLE + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + DESCRIBE_TABLE + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + GET_ITEM + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + LIST_TABLES + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + PUT_ITEM + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + QUERY_TABLE + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + SCAN_ITEMS + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + UPDATE_ITEM + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + + + diff --git a/sap-abap/services/dyn/#awsex#cl_dyn_scenarios.clas.abap b/sap-abap/services/dyn/#awsex#cl_dyn_scenarios.clas.abap new file mode 100644 index 00000000000..8e2ccb5a57e --- /dev/null +++ b/sap-abap/services/dyn/#awsex#cl_dyn_scenarios.clas.abap @@ -0,0 +1,215 @@ +CLASS /awsex/cl_dyn_scenarios DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + PROTECTED SECTION. + PRIVATE SECTION. + + METHODS getting_started_with_tables + IMPORTING + VALUE(iv_table_name) TYPE /aws1/dyntablename + RAISING + /aws1/cx_rt_generic . +ENDCLASS. + + + +CLASS /AWSEX/CL_DYN_SCENARIOS IMPLEMENTATION. + + + METHOD getting_started_with_tables. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + " snippet-start:[dyn.abapv1.getting_started_with_tables] + " Create an Amazon Dynamo DB table. + + TRY. + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_dyn) = /aws1/cl_dyn_factory=>create( lo_session ). + DATA(lt_keyschema) = VALUE /aws1/cl_dynkeyschemaelement=>tt_keyschema( + ( NEW /aws1/cl_dynkeyschemaelement( iv_attributename = 'year' + iv_keytype = 'HASH' ) ) + ( NEW /aws1/cl_dynkeyschemaelement( iv_attributename = 'title' + iv_keytype = 'RANGE' ) ) ). + DATA(lt_attributedefinitions) = VALUE /aws1/cl_dynattributedefn=>tt_attributedefinitions( + ( NEW /aws1/cl_dynattributedefn( iv_attributename = 'year' + iv_attributetype = 'N' ) ) + ( NEW /aws1/cl_dynattributedefn( iv_attributename = 'title' + iv_attributetype = 'S' ) ) ). + + " Adjust read/write capacities as desired. + DATA(lo_dynprovthroughput) = NEW /aws1/cl_dynprovthroughput( + iv_readcapacityunits = 5 + iv_writecapacityunits = 5 ). + DATA(oo_result) = lo_dyn->createtable( + it_keyschema = lt_keyschema + iv_tablename = iv_table_name + it_attributedefinitions = lt_attributedefinitions + io_provisionedthroughput = lo_dynprovthroughput ). + " Table creation can take some time. Wait till table exists before returning. + lo_dyn->get_waiter( )->tableexists( + iv_max_wait_time = 200 + iv_tablename = iv_table_name ). + MESSAGE 'DynamoDB Table' && iv_table_name && 'created.' TYPE 'I'. + " It throws exception if the table already exists. + CATCH /aws1/cx_dynresourceinuseex INTO DATA(lo_resourceinuseex). + DATA(lv_error) = |"{ lo_resourceinuseex->av_err_code }" - { lo_resourceinuseex->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDTRY. + + " Describe table + TRY. + DATA(lo_table) = lo_dyn->describetable( iv_tablename = iv_table_name ). + DATA(lv_tablename) = lo_table->get_table( )->ask_tablename( ). + MESSAGE 'The table name is ' && lv_tablename TYPE 'I'. + CATCH /aws1/cx_dynresourcenotfoundex. + MESSAGE 'The table does not exist' TYPE 'E'. + ENDTRY. + + " Put items into the table. + TRY. + DATA(lo_resp_putitem) = lo_dyn->putitem( + iv_tablename = iv_table_name + it_item = VALUE /aws1/cl_dynattributevalue=>tt_putiteminputattributemap( + ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( + key = 'title' value = NEW /aws1/cl_dynattributevalue( iv_s = 'Jaws' ) ) ) + ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( + key = 'year' value = NEW /aws1/cl_dynattributevalue( iv_n = |{ '1975' }| ) ) ) + ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( + key = 'rating' value = NEW /aws1/cl_dynattributevalue( iv_n = |{ '7.5' }| ) ) ) + ) ). + lo_resp_putitem = lo_dyn->putitem( + iv_tablename = iv_table_name + it_item = VALUE /aws1/cl_dynattributevalue=>tt_putiteminputattributemap( + ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( + key = 'title' value = NEW /aws1/cl_dynattributevalue( iv_s = 'Star Wars' ) ) ) + ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( + key = 'year' value = NEW /aws1/cl_dynattributevalue( iv_n = |{ '1978' }| ) ) ) + ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( + key = 'rating' value = NEW /aws1/cl_dynattributevalue( iv_n = |{ '8.1' }| ) ) ) + ) ). + lo_resp_putitem = lo_dyn->putitem( + iv_tablename = iv_table_name + it_item = VALUE /aws1/cl_dynattributevalue=>tt_putiteminputattributemap( + ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( + key = 'title' value = NEW /aws1/cl_dynattributevalue( iv_s = 'Speed' ) ) ) + ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( + key = 'year' value = NEW /aws1/cl_dynattributevalue( iv_n = |{ '1994' }| ) ) ) + ( VALUE /aws1/cl_dynattributevalue=>ts_putiteminputattrmap_maprow( + key = 'rating' value = NEW /aws1/cl_dynattributevalue( iv_n = |{ '7.9' }| ) ) ) + ) ). + " TYPE REF TO /AWSEX/CL_AWS1_dyn_PUT_ITEM_OUTPUT + MESSAGE '3 rows inserted into DynamoDB Table' && iv_table_name TYPE 'I'. + CATCH /aws1/cx_dyncondalcheckfaile00. + MESSAGE 'A condition specified in the operation could not be evaluated.' TYPE 'E'. + CATCH /aws1/cx_dynresourcenotfoundex. + MESSAGE 'The table or index does not exist' TYPE 'E'. + CATCH /aws1/cx_dyntransactconflictex. + MESSAGE 'Another transaction is using the item' TYPE 'E'. + ENDTRY. + + " Get item from table. + TRY. + DATA(lo_resp_getitem) = lo_dyn->getitem( + iv_tablename = iv_table_name + it_key = VALUE /aws1/cl_dynattributevalue=>tt_key( + ( VALUE /aws1/cl_dynattributevalue=>ts_key_maprow( + key = 'title' value = NEW /aws1/cl_dynattributevalue( iv_s = 'Jaws' ) ) ) + ( VALUE /aws1/cl_dynattributevalue=>ts_key_maprow( + key = 'year' value = NEW /aws1/cl_dynattributevalue( iv_n = '1975' ) ) ) + ) ). + DATA(lt_attr) = lo_resp_getitem->get_item( ). + DATA(lo_title) = lt_attr[ key = 'title' ]-value. + DATA(lo_year) = lt_attr[ key = 'year' ]-value. + DATA(lo_rating) = lt_attr[ key = 'year' ]-value. + MESSAGE 'Movie name is: ' && lo_title->get_s( ) TYPE 'I'. + MESSAGE 'Movie year is: ' && lo_year->get_n( ) TYPE 'I'. + MESSAGE 'Movie rating is: ' && lo_rating->get_n( ) TYPE 'I'. + CATCH /aws1/cx_dynresourcenotfoundex. + MESSAGE 'The table or index does not exist' TYPE 'E'. + ENDTRY. + + " Query item from table. + TRY. + DATA(lt_attributelist) = VALUE /aws1/cl_dynattributevalue=>tt_attributevaluelist( + ( NEW /aws1/cl_dynattributevalue( iv_n = '1975' ) ) ). + DATA(lt_keyconditions) = VALUE /aws1/cl_dyncondition=>tt_keyconditions( + ( VALUE /aws1/cl_dyncondition=>ts_keyconditions_maprow( + key = 'year' + value = NEW /aws1/cl_dyncondition( + it_attributevaluelist = lt_attributelist + iv_comparisonoperator = |EQ| + ) ) ) ). + DATA(lo_query_result) = lo_dyn->query( + iv_tablename = iv_table_name + it_keyconditions = lt_keyconditions ). + DATA(lt_items) = lo_query_result->get_items( ). + READ TABLE lo_query_result->get_items( ) INTO DATA(lt_item) INDEX 1. + lo_title = lt_item[ key = 'title' ]-value. + lo_year = lt_item[ key = 'year' ]-value. + lo_rating = lt_item[ key = 'rating' ]-value. + MESSAGE 'Movie name is: ' && lo_title->get_s( ) TYPE 'I'. + MESSAGE 'Movie year is: ' && lo_year->get_n( ) TYPE 'I'. + MESSAGE 'Movie rating is: ' && lo_rating->get_n( ) TYPE 'I'. + CATCH /aws1/cx_dynresourcenotfoundex. + MESSAGE 'The table or index does not exist' TYPE 'E'. + ENDTRY. + + " Scan items from table. + TRY. + DATA(lo_scan_result) = lo_dyn->scan( iv_tablename = iv_table_name ). + lt_items = lo_scan_result->get_items( ). + " Read the first item and display the attributes. + READ TABLE lo_query_result->get_items( ) INTO lt_item INDEX 1. + lo_title = lt_item[ key = 'title' ]-value. + lo_year = lt_item[ key = 'year' ]-value. + lo_rating = lt_item[ key = 'rating' ]-value. + MESSAGE 'Movie name is: ' && lo_title->get_s( ) TYPE 'I'. + MESSAGE 'Movie year is: ' && lo_year->get_n( ) TYPE 'I'. + MESSAGE 'Movie rating is: ' && lo_rating->get_n( ) TYPE 'I'. + CATCH /aws1/cx_dynresourcenotfoundex. + MESSAGE 'The table or index does not exist' TYPE 'E'. + ENDTRY. + + " Update items from table. + TRY. + DATA(lt_attributeupdates) = VALUE /aws1/cl_dynattrvalueupdate=>tt_attributeupdates( + ( VALUE /aws1/cl_dynattrvalueupdate=>ts_attributeupdates_maprow( + key = 'rating' value = NEW /aws1/cl_dynattrvalueupdate( + io_value = NEW /aws1/cl_dynattributevalue( iv_n = '7.6' ) + iv_action = |PUT| ) ) ) ). + DATA(lt_key) = VALUE /aws1/cl_dynattributevalue=>tt_key( + ( VALUE /aws1/cl_dynattributevalue=>ts_key_maprow( + key = 'year' value = NEW /aws1/cl_dynattributevalue( iv_n = '1975' ) ) ) + ( VALUE /aws1/cl_dynattributevalue=>ts_key_maprow( + key = 'title' value = NEW /aws1/cl_dynattributevalue( iv_s = '1980' ) ) ) ). + DATA(lo_resp) = lo_dyn->updateitem( + iv_tablename = iv_table_name + it_key = lt_key + it_attributeupdates = lt_attributeupdates ). + MESSAGE '1 item updated in DynamoDB Table' && iv_table_name TYPE 'I'. + CATCH /aws1/cx_dyncondalcheckfaile00. + MESSAGE 'A condition specified in the operation could not be evaluated.' TYPE 'E'. + CATCH /aws1/cx_dynresourcenotfoundex. + MESSAGE 'The table or index does not exist' TYPE 'E'. + CATCH /aws1/cx_dyntransactconflictex. + MESSAGE 'Another transaction is using the item' TYPE 'E'. + ENDTRY. + + " Delete table. + TRY. + lo_dyn->deletetable( iv_tablename = iv_table_name ). + lo_dyn->get_waiter( )->tablenotexists( + iv_max_wait_time = 200 + iv_tablename = iv_table_name ). + MESSAGE 'DynamoDB Table deleted.' TYPE 'I'. + CATCH /aws1/cx_dynresourcenotfoundex. + MESSAGE 'The table or index does not exist' TYPE 'E'. + CATCH /aws1/cx_dynresourceinuseex. + MESSAGE 'The table cannot be deleted as it is in use' TYPE 'E'. + ENDTRY. + " snippet-end:[dyn.abapv1.getting_started_with_tables] + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/dyn/#awsex#cl_dyn_scenarios.clas.testclasses.abap b/sap-abap/services/dyn/#awsex#cl_dyn_scenarios.clas.testclasses.abap new file mode 100644 index 00000000000..39c40b01951 --- /dev/null +++ b/sap-abap/services/dyn/#awsex#cl_dyn_scenarios.clas.testclasses.abap @@ -0,0 +1,54 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 + +CLASS ltc_awsex_cl_dyn_scenario DEFINITION DEFERRED. +CLASS /awsex/cl_dyn_scenarios DEFINITION LOCAL FRIENDS ltc_awsex_cl_dyn_scenario. + +CLASS ltc_awsex_cl_dyn_scenario DEFINITION FOR TESTING + DURATION LONG + RISK LEVEL DANGEROUS. + + PROTECTED SECTION. + METHODS test_dyn FOR TESTING RAISING /aws1/cx_rt_generic. + + PRIVATE SECTION. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA ao_dyn TYPE REF TO /aws1/if_dyn. + DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. + DATA ao_dyn_scenario TYPE REF TO /awsex/cl_dyn_scenarios. + DATA av_table_name TYPE /aws1/dyntablename. + + METHODS setup RAISING /aws1/cx_rt_generic. + + METHODS assert_table_not_exist + IMPORTING iv_table_name TYPE string + RAISING /aws1/cx_rt_generic. + +ENDCLASS. + +CLASS ltc_awsex_cl_dyn_scenario IMPLEMENTATION. + + METHOD setup. + ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). + ao_dyn = /aws1/cl_dyn_factory=>create( ao_session ). + ao_dyn_scenario = NEW /awsex/cl_dyn_scenarios( ). + ENDMETHOD. + + METHOD test_dyn. + DATA(av_table_name) = |code-example-getting-startted-with-tables|. + ao_dyn_scenario->getting_started_with_tables( av_table_name ). + assert_table_not_exist( av_table_name ). + ENDMETHOD. + + METHOD assert_table_not_exist. + TRY. + DATA(lv_status) = ao_dyn->describetable( iv_tablename = iv_table_name )->get_table( )->get_tablestatus( ). + " expecting an exception + /aws1/cl_rt_assert_abap=>assert_missed_exception( iv_exception = |/AWS1/CX_DYNRESOURCENOTFOUNDEX| ). + CATCH /aws1/cx_dynresourcenotfoundex. + " good, it is deleted + ENDTRY. + ENDMETHOD. + +ENDCLASS. diff --git a/sap-abap/services/dyn/#awsex#cl_dyn_scenarios.clas.xml b/sap-abap/services/dyn/#awsex#cl_dyn_scenarios.clas.xml new file mode 100644 index 00000000000..1960e9afb24 --- /dev/null +++ b/sap-abap/services/dyn/#awsex#cl_dyn_scenarios.clas.xml @@ -0,0 +1,25 @@ + + + + + + /AWSEX/CL_DYN_SCENARIOS + E + DynamoDB Code Example Scenarios + 1 + X + X + X + X + + + + GETTING_STARTED_WITH_TABLES + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + + + diff --git a/sap-abap/services/dyn/package.devc.xml b/sap-abap/services/dyn/package.devc.xml index fa92507edf9..95cb6208cab 100644 --- a/sap-abap/services/dyn/package.devc.xml +++ b/sap-abap/services/dyn/package.devc.xml @@ -3,7 +3,7 @@ - Package for Amazon Dynamo DB + Package for Amazon DynamoDB diff --git a/sap-abap/services/ec2/#awsex#cl_ec2_actions.clas.abap b/sap-abap/services/ec2/#awsex#cl_ec2_actions.clas.abap new file mode 100644 index 00000000000..326bc6d8d81 --- /dev/null +++ b/sap-abap/services/ec2/#awsex#cl_ec2_actions.clas.abap @@ -0,0 +1,573 @@ +CLASS /awsex/cl_ec2_actions DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + PROTECTED SECTION. + PRIVATE SECTION. + + METHODS allocate_address + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_ec2allocateaddressrs + RAISING + /aws1/cx_rt_generic . + METHODS create_instance + IMPORTING + !iv_ami_id TYPE /aws1/ec2imageid + !iv_tag_value TYPE /aws1/ec2string + !iv_subnet_id TYPE /aws1/ec2subnetid + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_ec2reservation + RAISING + /aws1/cx_rt_generic . + METHODS create_key_pair + IMPORTING + !iv_key_name TYPE /aws1/ec2string + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_ec2keypair + RAISING + /aws1/cx_rt_generic . + METHODS create_security_group + IMPORTING + !iv_security_group_name TYPE /aws1/ec2string + !iv_vpc_id TYPE /aws1/ec2vpcid + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_ec2createsecgrouprslt + RAISING + /aws1/cx_rt_generic . + METHODS delete_security_group + IMPORTING + !iv_security_group_id TYPE /aws1/ec2securitygroupid + RAISING + /aws1/cx_rt_generic . + METHODS delete_key_pair + IMPORTING + !iv_key_name TYPE /aws1/ec2keypairname + RAISING + /aws1/cx_rt_generic . + METHODS describe_addresses + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_ec2descraddressesrslt + RAISING + /aws1/cx_rt_generic . + METHODS describe_instances + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_ec2descrinstsresult + RAISING + /aws1/cx_rt_generic . + METHODS describe_key_pairs + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_ec2descrkeypairsrslt + RAISING + /aws1/cx_rt_generic . + METHODS describe_regions + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_ec2descrregionsresult + RAISING + /aws1/cx_rt_generic . + METHODS describe_security_groups + IMPORTING + !iv_group_id TYPE /aws1/ec2securitygroupid + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_ec2descrsecgroupsrslt + RAISING + /aws1/cx_rt_generic . + METHODS monitor_instance + IMPORTING + !iv_instance_id TYPE /aws1/ec2instanceid + RAISING + /aws1/cx_rt_generic . + METHODS reboot_instance + IMPORTING + !iv_instance_id TYPE /aws1/ec2instanceid + RAISING + /aws1/cx_rt_generic . + METHODS release_address + IMPORTING + !iv_allocation_id TYPE /aws1/ec2allocationid + RAISING + /aws1/cx_rt_generic . + METHODS start_instance + IMPORTING + !iv_instance_id TYPE /aws1/ec2instanceid + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_ec2startinstsresult + RAISING + /aws1/cx_rt_generic . + METHODS stop_instance + IMPORTING + !iv_instance_id TYPE /aws1/ec2instanceid + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_ec2stopinstsresult + RAISING + /aws1/cx_rt_generic . + METHODS associate_address + IMPORTING + !iv_instance_id TYPE /aws1/ec2instanceid + !iv_allocation_id TYPE /aws1/ec2allocationid + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_ec2assocaddressresult + RAISING + /aws1/cx_rt_generic . + METHODS describe_availability_zones + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_ec2describeazsresult + RAISING + /aws1/cx_rt_generic . +ENDCLASS. + + + +CLASS /AWSEX/CL_EC2_ACTIONS IMPLEMENTATION. + + + METHOD allocate_address. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). + + " snippet-start:[ec2.abapv1.allocate_address] + TRY. + oo_result = lo_ec2->allocateaddress( iv_domain = 'vpc' ). " oo_result is returned for testing purposes. " + MESSAGE 'Allocated an Elastic IP address.' TYPE 'I'. + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). + DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDTRY. + " snippet-end:[ec2.abapv1.allocate_address] + ENDMETHOD. + + + METHOD associate_address. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). + + " snippet-start:[ec2.abapv1.associate_address] + TRY. + oo_result = lo_ec2->associateaddress( " oo_result is returned for testing purposes. " + iv_allocationid = iv_allocation_id + iv_instanceid = iv_instance_id ). + MESSAGE 'Associated an Elastic IP address with an EC2 instance.' TYPE 'I'. + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). + DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDTRY. + " snippet-end:[ec2.abapv1.associate_address] + ENDMETHOD. + + + METHOD create_instance. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). + + " snippet-start:[ec2.abapv1.create_instance] + + " Create tags for resource created during instance launch. " + DATA lt_tagspecifications TYPE /aws1/cl_ec2tagspecification=>tt_tagspecificationlist. + DATA ls_tagspecifications LIKE LINE OF lt_tagspecifications. + ls_tagspecifications = NEW /aws1/cl_ec2tagspecification( + iv_resourcetype = 'instance' + it_tags = VALUE /aws1/cl_ec2tag=>tt_taglist( + ( NEW /aws1/cl_ec2tag( iv_key = 'Name' iv_value = iv_tag_value ) ) + ) ). + APPEND ls_tagspecifications TO lt_tagspecifications. + + TRY. + " Create/launch Amazon Elastic Compute Cloud (Amazon EC2) instance. " + oo_result = lo_ec2->runinstances( " oo_result is returned for testing purposes. " + iv_imageid = iv_ami_id + iv_instancetype = 't3.micro' + iv_maxcount = 1 + iv_mincount = 1 + it_tagspecifications = lt_tagspecifications + iv_subnetid = iv_subnet_id ). + MESSAGE 'EC2 instance created.' TYPE 'I'. + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). + DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDTRY. + " snippet-end:[ec2.abapv1.create_instance] + ENDMETHOD. + + + METHOD create_key_pair. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). + + " snippet-start:[ec2.abapv1.create_key_pair] + TRY. + oo_result = lo_ec2->createkeypair( iv_keyname = iv_key_name ). " oo_result is returned for testing purposes. " + MESSAGE 'Amazon EC2 key pair created.' TYPE 'I'. + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). + DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDTRY. + " snippet-end:[ec2.abapv1.create_key_pair] + ENDMETHOD. + + + METHOD create_security_group. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). + + " snippet-start:[ec2.abapv1.create_security_group] + TRY. + oo_result = lo_ec2->createsecuritygroup( " oo_result is returned for testing purposes. " + iv_description = 'Security group example' + iv_groupname = iv_security_group_name + iv_vpcid = iv_vpc_id ). + MESSAGE 'Security group created.' TYPE 'I'. + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). + DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDTRY. + " snippet-end:[ec2.abapv1.create_security_group] + ENDMETHOD. + + + METHOD delete_key_pair. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). + + " snippet-start:[ec2.abapv1.delete_key_pair] + TRY. + lo_ec2->deletekeypair( iv_keyname = iv_key_name ). + MESSAGE 'Amazon EC2 key pair deleted.' TYPE 'I'. + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). + DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDTRY. + " snippet-end:[ec2.abapv1.delete_key_pair] + ENDMETHOD. + + + METHOD delete_security_group. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). + + " snippet-start:[ec2.abapv1.delete_security_group] + TRY. + lo_ec2->deletesecuritygroup( iv_groupid = iv_security_group_id ). + MESSAGE 'Security group deleted.' TYPE 'I'. + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). + DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDTRY. + " snippet-end:[ec2.abapv1.delete_security_group] + ENDMETHOD. + + + METHOD describe_addresses. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). + + " snippet-start:[ec2.abapv1.describe_addresses] + TRY. + oo_result = lo_ec2->describeaddresses( ). " oo_result is returned for testing purposes. " + DATA(lt_addresses) = oo_result->get_addresses( ). + MESSAGE 'Retrieved information about Elastic IP addresses.' TYPE 'I'. + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). + DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDTRY. + " snippet-end:[ec2.abapv1.describe_addresses] + ENDMETHOD. + + + METHOD describe_availability_zones. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). + + " snippet-start:[ec2.abapv1.describe_availability_zones] + TRY. + oo_result = lo_ec2->describeavailabilityzones( ). " oo_result is returned for testing purposes. " + DATA(lt_zones) = oo_result->get_availabilityzones( ). + MESSAGE 'Retrieved information about Availability Zones.' TYPE 'I'. + + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). + DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDTRY. + + " snippet-end:[ec2.abapv1.describe_availability_zones] + ENDMETHOD. + + + METHOD describe_instances. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). + + " snippet-start:[ec2.abapv1.describe_instances] + TRY. + oo_result = lo_ec2->describeinstances( ). " oo_result is returned for testing purposes. " + + " Retrieving details of EC2 instances. " + DATA: lv_istance_id TYPE /aws1/ec2string, + lv_status TYPE /aws1/ec2instancestatename, + lv_instance_type TYPE /aws1/ec2instancetype, + lv_image_id TYPE /aws1/ec2string. + LOOP AT oo_result->get_reservations( ) INTO DATA(lo_reservation). + LOOP AT lo_reservation->get_instances( ) INTO DATA(lo_instance). + lv_istance_id = lo_instance->get_instanceid( ). + lv_status = lo_instance->get_state( )->get_name( ). + lv_instance_type = lo_instance->get_instancetype( ). + lv_image_id = lo_instance->get_imageid( ). + ENDLOOP. + ENDLOOP. + MESSAGE 'Retrieved information about EC2 instances.' TYPE 'I'. + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). + DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDTRY. + " snippet-end:[ec2.abapv1.describe_instances] + ENDMETHOD. + + + METHOD describe_key_pairs. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). + + " snippet-start:[ec2.abapv1.describe_key_pairs] + TRY. + oo_result = lo_ec2->describekeypairs( ). " oo_result is returned for testing purposes. " + DATA(lt_key_pairs) = oo_result->get_keypairs( ). + MESSAGE 'Retrieved information about key pairs.' TYPE 'I'. + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). + DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDTRY. + " snippet-end:[ec2.abapv1.describe_key_pairs] + ENDMETHOD. + + + METHOD describe_regions. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). + + " snippet-start:[ec2.abapv1.describe_regions] + TRY. + oo_result = lo_ec2->describeregions( ). " oo_result is returned for testing purposes. " + DATA(lt_regions) = oo_result->get_regions( ). + MESSAGE 'Retrieved information about Regions.' TYPE 'I'. + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). + DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDTRY. + + " snippet-end:[ec2.abapv1.describe_regions] + ENDMETHOD. + + + METHOD describe_security_groups. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). + + " snippet-start:[ec2.abapv1.describe_security_groups] + TRY. + DATA lt_group_ids TYPE /aws1/cl_ec2groupidstrlist_w=>tt_groupidstringlist. + APPEND NEW /aws1/cl_ec2groupidstrlist_w( iv_value = iv_group_id ) TO lt_group_ids. + oo_result = lo_ec2->describesecuritygroups( it_groupids = lt_group_ids ). " oo_result is returned for testing purposes. " + DATA(lt_security_groups) = oo_result->get_securitygroups( ). + MESSAGE 'Retrieved information about security groups.' TYPE 'I'. + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). + DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDTRY. + " snippet-end:[ec2.abapv1.describe_security_groups] + ENDMETHOD. + + + METHOD monitor_instance. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). + + " snippet-start:[ec2.abapv1.monitor_instance] + + DATA lt_instance_ids TYPE /aws1/cl_ec2instidstringlist_w=>tt_instanceidstringlist. + APPEND NEW /aws1/cl_ec2instidstringlist_w( iv_value = iv_instance_id ) TO lt_instance_ids. + + "Perform dry run" + TRY. + " DryRun is set to true. This checks for the required permissions to monitor the instance without actually making the request. " + lo_ec2->monitorinstances( + it_instanceids = lt_instance_ids + iv_dryrun = abap_true ). + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). + " If the error code returned is `DryRunOperation`, then you have the required permissions to monitor this instance. " + IF lo_exception->av_err_code = 'DryRunOperation'. + MESSAGE 'Dry run to enable detailed monitoring completed.' TYPE 'I'. + " DryRun is set to false to enable detailed monitoring. " + lo_ec2->monitorinstances( + it_instanceids = lt_instance_ids + iv_dryrun = abap_false ). + MESSAGE 'Detailed monitoring enabled.' TYPE 'I'. + " If the error code returned is `UnauthorizedOperation`, then you don't have the required permissions to monitor this instance. " + ELSEIF lo_exception->av_err_code = 'UnauthorizedOperation'. + MESSAGE 'Dry run to enable detailed monitoring failed. User does not have the permissions to monitor the instance.' TYPE 'E'. + ELSE. + DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDIF. + ENDTRY. + " snippet-end:[ec2.abapv1.monitor_instance] + ENDMETHOD. + + + METHOD reboot_instance. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). + + " snippet-start:[ec2.abapv1.reboot_instance] + DATA lt_instance_ids TYPE /aws1/cl_ec2instidstringlist_w=>tt_instanceidstringlist. + APPEND NEW /aws1/cl_ec2instidstringlist_w( iv_value = iv_instance_id ) TO lt_instance_ids. + + "Perform dry run" + TRY. + " DryRun is set to true. This checks for the required permissions to reboot the instance without actually making the request. " + lo_ec2->rebootinstances( + it_instanceids = lt_instance_ids + iv_dryrun = abap_true ). + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). + " If the error code returned is `DryRunOperation`, then you have the required permissions to reboot this instance. " + IF lo_exception->av_err_code = 'DryRunOperation'. + MESSAGE 'Dry run to reboot instance completed.' TYPE 'I'. + " DryRun is set to false to make a reboot request. " + lo_ec2->rebootinstances( + it_instanceids = lt_instance_ids + iv_dryrun = abap_false ). + MESSAGE 'Instance rebooted.' TYPE 'I'. + " If the error code returned is `UnauthorizedOperation`, then you don't have the required permissions to reboot this instance. " + ELSEIF lo_exception->av_err_code = 'UnauthorizedOperation'. + MESSAGE 'Dry run to reboot instance failed. User does not have permissions to reboot the instance.' TYPE 'E'. + ELSE. + DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDIF. + ENDTRY. + " snippet-end:[ec2.abapv1.reboot_instance] + ENDMETHOD. + + + METHOD release_address. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). + + " snippet-start:[ec2.abapv1.release_address] + TRY. + lo_ec2->releaseaddress( iv_allocationid = iv_allocation_id ). + MESSAGE 'Elastic IP address released.' TYPE 'I'. + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). + DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDTRY. + " snippet-end:[ec2.abapv1.release_address] + ENDMETHOD. + + + METHOD start_instance. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). + + " snippet-start:[ec2.abapv1.start_instance] + + DATA lt_instance_ids TYPE /aws1/cl_ec2instidstringlist_w=>tt_instanceidstringlist. + APPEND NEW /aws1/cl_ec2instidstringlist_w( iv_value = iv_instance_id ) TO lt_instance_ids. + + "Perform dry run" + TRY. + " DryRun is set to true. This checks for the required permissions to start the instance without actually making the request. " + lo_ec2->startinstances( + it_instanceids = lt_instance_ids + iv_dryrun = abap_true ). + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). + " If the error code returned is `DryRunOperation`, then you have the required permissions to start this instance. " + IF lo_exception->av_err_code = 'DryRunOperation'. + MESSAGE 'Dry run to start instance completed.' TYPE 'I'. + " DryRun is set to false to start instance. " + oo_result = lo_ec2->startinstances( " oo_result is returned for testing purposes. " + it_instanceids = lt_instance_ids + iv_dryrun = abap_false ). + MESSAGE 'Successfully started the EC2 instance.' TYPE 'I'. + " If the error code returned is `UnauthorizedOperation`, then you don't have the required permissions to start this instance. " + ELSEIF lo_exception->av_err_code = 'UnauthorizedOperation'. + MESSAGE 'Dry run to start instance failed. User does not have permissions to start the instance.' TYPE 'E'. + ELSE. + DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDIF. + ENDTRY. + " snippet-end:[ec2.abapv1.start_instance] + ENDMETHOD. + + + METHOD stop_instance. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_ec2) = /aws1/cl_ec2_factory=>create( lo_session ). + + " snippet-start:[ec2.abapv1.stop_instance] + + DATA lt_instance_ids TYPE /aws1/cl_ec2instidstringlist_w=>tt_instanceidstringlist. + APPEND NEW /aws1/cl_ec2instidstringlist_w( iv_value = iv_instance_id ) TO lt_instance_ids. + + "Perform dry run" + TRY. + " DryRun is set to true. This checks for the required permissions to stop the instance without actually making the request. " + lo_ec2->stopinstances( + it_instanceids = lt_instance_ids + iv_dryrun = abap_true ). + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). + " If the error code returned is `DryRunOperation`, then you have the required permissions to stop this instance. " + IF lo_exception->av_err_code = 'DryRunOperation'. + MESSAGE 'Dry run to stop instance completed.' TYPE 'I'. + " DryRun is set to false to stop instance. " + oo_result = lo_ec2->stopinstances( " oo_result is returned for testing purposes. " + it_instanceids = lt_instance_ids + iv_dryrun = abap_false ). + MESSAGE 'Successfully stopped the EC2 instance.' TYPE 'I'. + " If the error code returned is `UnauthorizedOperation`, then you don't have the required permissions to stop this instance. " + ELSEIF lo_exception->av_err_code = 'UnauthorizedOperation'. + MESSAGE 'Dry run to stop instance failed. User does not have permissions to stop the instance.' TYPE 'E'. + ELSE. + DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDIF. + ENDTRY. + " snippet-end:[ec2.abapv1.stop_instance] + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/ec2/#awsex#cl_ec2_actions.clas.testclasses.abap b/sap-abap/services/ec2/#awsex#cl_ec2_actions.clas.testclasses.abap new file mode 100644 index 00000000000..c05812d515d --- /dev/null +++ b/sap-abap/services/ec2/#awsex#cl_ec2_actions.clas.testclasses.abap @@ -0,0 +1,487 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 + +CLASS ltc_awsex_cl_ec2_actions DEFINITION DEFERRED. +CLASS /awsex/cl_ec2_actions DEFINITION LOCAL FRIENDS ltc_awsex_cl_ec2_actions. + +CLASS ltc_awsex_cl_ec2_actions DEFINITION FOR TESTING DURATION LONG RISK LEVEL DANGEROUS. + + PRIVATE SECTION. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + CLASS-DATA ao_ec2 TYPE REF TO /aws1/if_ec2. + CLASS-DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. + CLASS-DATA ao_ec2_actions TYPE REF TO /awsex/cl_ec2_actions. + CLASS-DATA av_vpc_id TYPE /aws1/ec2string. + CLASS-DATA av_subnet_id TYPE /aws1/ec2string. + CLASS-DATA at_instance_id TYPE TABLE OF /aws1/ec2string. " table of instance IDs to terminate + CLASS-DATA av_instance_id TYPE /aws1/ec2string. " main instance Id for tests + + METHODS: allocate_address FOR TESTING RAISING /aws1/cx_rt_generic, + associate_address FOR TESTING RAISING /aws1/cx_rt_generic, + create_instance FOR TESTING RAISING /aws1/cx_rt_generic, + create_key_pair FOR TESTING RAISING /aws1/cx_rt_generic, + create_security_group FOR TESTING RAISING /aws1/cx_rt_generic, + delete_security_group FOR TESTING RAISING /aws1/cx_rt_generic, + delete_key_pair FOR TESTING RAISING /aws1/cx_rt_generic, + describe_addresses FOR TESTING RAISING /aws1/cx_rt_generic, + describe_instances FOR TESTING RAISING /aws1/cx_rt_generic, + describe_key_pairs FOR TESTING RAISING /aws1/cx_rt_generic, + describe_regions FOR TESTING RAISING /aws1/cx_rt_generic, + describe_availability_zones FOR TESTING RAISING /aws1/cx_rt_generic, + describe_security_groups FOR TESTING RAISING /aws1/cx_rt_generic, + monitor_instance FOR TESTING RAISING /aws1/cx_rt_generic, + reboot_instance FOR TESTING RAISING /aws1/cx_rt_generic, + release_address FOR TESTING RAISING /aws1/cx_rt_generic, + start_instances FOR TESTING RAISING /aws1/cx_rt_generic, + stop_instances FOR TESTING RAISING /aws1/cx_rt_generic. + + CLASS-METHODS class_setup RAISING /aws1/cx_rt_generic /awsex/cx_generic. + CLASS-METHODS class_teardown RAISING /aws1/cx_rt_generic /awsex/cx_generic. + + + CLASS-METHODS: + get_ami_id + RETURNING VALUE(ov_ami_id) TYPE /aws1/ec2string + RAISING /aws1/cx_rt_generic, + wait_until_status_change + IMPORTING iv_required_status TYPE string + iv_instance_id TYPE string + RETURNING VALUE(ov_current_status) TYPE string + RAISING /aws1/cx_rt_generic, + run_instance + IMPORTING iv_subnet_id TYPE /aws1/ec2subnetid + RETURNING VALUE(ov_instance_id) TYPE /aws1/ec2string + RAISING /aws1/cx_rt_generic, + terminate_instance + IMPORTING iv_instance_id TYPE /aws1/ec2string + RAISING /aws1/cx_rt_generic. + +ENDCLASS. + +CLASS ltc_awsex_cl_ec2_actions IMPLEMENTATION. + + METHOD class_setup. + ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). + ao_ec2 = /aws1/cl_ec2_factory=>create( ao_session ). + ao_ec2_actions = NEW /awsex/cl_ec2_actions( ). + av_vpc_id = ao_ec2->createvpc( iv_cidrblock = '10.10.0.0/16' )->get_vpc( )->get_vpcid( ). + av_subnet_id = ao_ec2->createsubnet( iv_vpcid = av_vpc_id + iv_cidrblock = '10.10.0.0/24' )->get_subnet( )->get_subnetid( ). + av_instance_id = run_instance( av_subnet_id ). + + ENDMETHOD. + + METHOD class_teardown. + LOOP AT at_instance_id ASSIGNING FIELD-SYMBOL(). + terminate_instance( ). + ENDLOOP. + + DO 4 TIMES. + TRY. + ao_ec2->deletesubnet( iv_subnetid = av_subnet_id ). + EXIT. " exit the loop + CATCH /aws1/cx_ec2clientexc INTO DATA(lo_ex). + IF lo_ex->get_text( ) CS 'dependencies'. + WAIT UP TO 15 SECONDS. + ELSE. + RAISE EXCEPTION lo_ex. + ENDIF. + + ENDTRY. + ENDDO. + DO 4 TIMES. + TRY. + ao_ec2->deletevpc( iv_vpcid = av_vpc_id ). + CATCH /aws1/cx_ec2clientexc INTO lo_ex. + IF lo_ex->av_err_code = 'DependencyViolation'. + WAIT UP TO 15 SECONDS. + ELSEIF lo_ex->av_err_code = 'InvalidVpcID.NotFound'. + EXIT. + ELSE. + RAISE EXCEPTION lo_ex. + ENDIF. + ENDTRY. + ENDDO. + ENDMETHOD. + + METHOD allocate_address. + DATA(lo_result) = ao_ec2_actions->allocate_address( ). + + cl_abap_unit_assert=>assert_not_initial( + act = lo_result->get_allocationid( ) + msg = |Failed to allocate an Elastic IP address| ). + + ao_ec2->releaseaddress( iv_allocationid = lo_result->get_allocationid( ) ). + + ENDMETHOD. + METHOD associate_address. + DATA(lv_internet_gateway_id) = ao_ec2->createinternetgateway( )->get_internetgateway( )->get_internetgatewayid( ). + ao_ec2->attachinternetgateway( iv_internetgatewayid = lv_internet_gateway_id + iv_vpcid = av_vpc_id ). + wait_until_status_change( iv_instance_id = av_instance_id + iv_required_status = 'running' ). + DATA(lv_allocation_id) = ao_ec2->allocateaddress( iv_domain = 'vpc' )->get_allocationid( ). + + DATA(lo_result) = ao_ec2_actions->associate_address( + iv_instance_id = av_instance_id + iv_allocation_id = lv_allocation_id ). + + cl_abap_unit_assert=>assert_not_initial( + act = lo_result->get_associationid( ) + msg = |Failed to associate Elastic IP address with EC2 instancce| ). + + ao_ec2->disassociateaddress( iv_associationid = lo_result->get_associationid( ) ). + ao_ec2->releaseaddress( iv_allocationid = lv_allocation_id ). + ao_ec2->detachinternetgateway( iv_internetgatewayid = lv_internet_gateway_id + iv_vpcid = av_vpc_id ). + ao_ec2->deleteinternetgateway( iv_internetgatewayid = lv_internet_gateway_id ). + ENDMETHOD. + METHOD describe_addresses. + DATA(lv_internet_gateway_id) = ao_ec2->createinternetgateway( )->get_internetgateway( )->get_internetgatewayid( ). + ao_ec2->attachinternetgateway( iv_internetgatewayid = lv_internet_gateway_id + iv_vpcid = av_vpc_id ). + wait_until_status_change( iv_instance_id = av_instance_id + iv_required_status = 'running' ). + + DATA(lo_allocate_result) = ao_ec2->allocateaddress( iv_domain = 'vpc' ). + DATA(lo_associate_result) = ao_ec2->associateaddress( iv_allocationid = lo_allocate_result->get_allocationid( ) + iv_instanceid = av_instance_id ). + + DATA(lo_describe_result) = ao_ec2_actions->describe_addresses( ). + + LOOP AT lo_describe_result->get_addresses( ) INTO DATA(lo_address). + IF lo_address->get_instanceid( ) = av_instance_id AND lo_address->get_publicip( ) = lo_allocate_result->get_publicip( ). + DATA(lv_found) = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Elastic IP address associated with EC2 instance should have been included in the address list| ). + + ao_ec2->disassociateaddress( iv_associationid = lo_associate_result->get_associationid( ) ). + ao_ec2->releaseaddress( iv_allocationid = lo_allocate_result->get_allocationid( ) ). + ao_ec2->detachinternetgateway( iv_internetgatewayid = lv_internet_gateway_id + iv_vpcid = av_vpc_id ). + ao_ec2->deleteinternetgateway( iv_internetgatewayid = lv_internet_gateway_id ). + ENDMETHOD. + METHOD release_address. + DATA(lv_internet_gateway_id) = ao_ec2->createinternetgateway( )->get_internetgateway( )->get_internetgatewayid( ). + ao_ec2->attachinternetgateway( iv_internetgatewayid = lv_internet_gateway_id + iv_vpcid = av_vpc_id ). + wait_until_status_change( iv_instance_id = av_instance_id + iv_required_status = 'running' ). + + DATA(lo_allocate_result) = ao_ec2->allocateaddress( iv_domain = 'vpc' ). + DATA(lo_associate_result) = ao_ec2->associateaddress( iv_allocationid = lo_allocate_result->get_allocationid( ) + iv_instanceid = av_instance_id ). + + ao_ec2->disassociateaddress( iv_associationid = lo_associate_result->get_associationid( ) ). + ao_ec2_actions->release_address( lo_allocate_result->get_allocationid( ) ). + + DATA(lo_describe_result) = ao_ec2_actions->describe_addresses( ). + + LOOP AT lo_describe_result->get_addresses( ) INTO DATA(lo_address). + IF lo_address->get_publicip( ) = lo_allocate_result->get_publicip( ). + DATA(lv_found) = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_false( + act = lv_found + msg = |Elastic IP address should have been released| ). + + ao_ec2->detachinternetgateway( iv_internetgatewayid = lv_internet_gateway_id + iv_vpcid = av_vpc_id ). + ao_ec2->deleteinternetgateway( iv_internetgatewayid = lv_internet_gateway_id ). + ENDMETHOD. + METHOD create_instance. + DATA(lo_create_result) = ao_ec2_actions->create_instance( + iv_ami_id = get_ami_id( ) + iv_tag_value = 'code-example-create-instance' + iv_subnet_id = av_subnet_id ). + READ TABLE lo_create_result->get_instances( ) INTO DATA(lo_instance) INDEX 1. + DATA(lv_current_status) = wait_until_status_change( iv_instance_id = lo_instance->get_instanceid( ) + iv_required_status = 'running' ). + + cl_abap_unit_assert=>assert_equals( + act = lv_current_status + exp = 'running' + msg = |EC2 instance { lo_instance->get_instanceid( ) } should have been in 'running' state| ). + APPEND lo_instance->get_instanceid( ) TO at_instance_id. + ENDMETHOD. + METHOD monitor_instance. + ao_ec2_actions->monitor_instance( av_instance_id ). + WAIT UP TO 5 SECONDS. + DATA(lo_describe_result) = ao_ec2->describeinstances( + it_instanceids = VALUE /aws1/cl_ec2instidstringlist_w=>tt_instanceidstringlist( + ( NEW /aws1/cl_ec2instidstringlist_w( av_instance_id ) ) + ) ). + READ TABLE lo_describe_result->get_reservations( ) INTO DATA(lo_reservation) INDEX 1. + READ TABLE lo_reservation->get_instances( ) INTO DATA(lo_describe_instance) INDEX 1. + cl_abap_unit_assert=>assert_equals( + exp = lo_describe_instance->get_monitoring( )->get_state( ) + act = 'enabled' + msg = |Detailed monitoring should have been enabled| ). + ENDMETHOD. + METHOD reboot_instance. + wait_until_status_change( iv_instance_id = av_instance_id + iv_required_status = 'running' ). + ao_ec2_actions->reboot_instance( av_instance_id ). + DATA(lv_current_status) = wait_until_status_change( iv_instance_id = av_instance_id + iv_required_status = 'running' ). + + cl_abap_unit_assert=>assert_equals( + exp = lv_current_status + act = 'running' + msg = |Failed to reboot the specified instance| ). + ENDMETHOD. + METHOD start_instances. + ao_ec2->stopinstances( + it_instanceids = VALUE /aws1/cl_ec2instidstringlist_w=>tt_instanceidstringlist( + ( NEW /aws1/cl_ec2instidstringlist_w( av_instance_id ) ) + ) ). + wait_until_status_change( iv_instance_id = av_instance_id + iv_required_status = 'stopped' ). + + DATA(lo_start_result) = ao_ec2_actions->start_instance( av_instance_id ). + READ TABLE lo_start_result->get_startinginstances( ) INTO DATA(lo_start_instance) INDEX 1. + cl_abap_unit_assert=>assert_equals( + exp = lo_start_instance->get_currentstate( )->get_name( ) + act = 'pending' + msg = |Instance should have been in 'pending' state when a request is made to start a stopped instance| ). + + DATA(lv_current_status) = wait_until_status_change( iv_instance_id = av_instance_id + iv_required_status = 'running' ). + cl_abap_unit_assert=>assert_equals( + exp = lv_current_status + act = 'running' + msg = |Failed to start a stopped instance| ). + ENDMETHOD. + METHOD stop_instances. + DATA(lo_start_result) = ao_ec2_actions->start_instance( av_instance_id ). + wait_until_status_change( iv_instance_id = av_instance_id + iv_required_status = 'running' ). + DATA(lo_stop_result) = ao_ec2_actions->stop_instance( av_instance_id ). + READ TABLE lo_stop_result->get_stoppinginstances( ) INTO DATA(lo_stop_instance) INDEX 1. + cl_abap_unit_assert=>assert_equals( + exp = lo_stop_instance->get_currentstate( )->get_name( ) + act = 'stopping' + msg = |Instance should have been in 'stopping' state when a request is made to stop a running instance| ). + + DATA(lv_current_status) = wait_until_status_change( iv_instance_id = av_instance_id + iv_required_status = 'stopped' ). + cl_abap_unit_assert=>assert_equals( + exp = lv_current_status + act = 'stopped' + msg = |Failed to stop a running instance| ). + + ENDMETHOD. + METHOD describe_instances. + DATA(lo_describe_result) = ao_ec2_actions->describe_instances( ). + READ TABLE lo_describe_result->get_reservations( ) INTO DATA(lo_reservation) INDEX 1. + cl_abap_unit_assert=>assert_not_initial( + act = lo_reservation->get_instances( ) + msg = |Instance List should not be empty| ). + ENDMETHOD. + METHOD create_key_pair. + CONSTANTS cv_key_name TYPE /aws1/ec2string VALUE 'code-example-create-key-pair'. + DATA(lo_result) = ao_ec2_actions->create_key_pair( cv_key_name ). + cl_abap_unit_assert=>assert_not_initial( + act = lo_result->get_keypairid( ) + msg = |Failed to create key pair { cv_key_name }| ). + + + IF lo_result->get_keyfingerprint( ) IS NOT INITIAL AND lo_result->get_keymaterial( ) IS NOT INITIAL AND lo_result->get_keyname( ) = cv_key_name. + DATA(lv_has_details) = abap_true. + ENDIF. + + cl_abap_unit_assert=>assert_true( + act = lv_has_details + msg = |The response object for key pair { cv_key_name } does not contain the required elements| ). + + ao_ec2->deletekeypair( iv_keyname = cv_key_name ). + ENDMETHOD. + METHOD delete_key_pair. + CONSTANTS cv_key_name TYPE /aws1/ec2string VALUE 'code-example-delete-key-pair'. + ao_ec2->createkeypair( iv_keyname = cv_key_name ). + ao_ec2_actions->delete_key_pair( cv_key_name ). + DATA(lo_result) = ao_ec2->describekeypairs( ). + + + LOOP AT lo_result->get_keypairs( ) INTO DATA(lo_key_pair). + IF lo_key_pair->get_keyname( ) = cv_key_name. + DATA(lv_found) = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_false( + act = lv_found + msg = |Key Pair { cv_key_name } should have been deleted| ). + ENDMETHOD. + METHOD describe_key_pairs. + CONSTANTS cv_key_name TYPE /aws1/ec2string VALUE 'code-example-describe-key-pairs'. + ao_ec2->createkeypair( iv_keyname = cv_key_name ). + DATA(lo_result) = ao_ec2_actions->describe_key_pairs( ). + + + LOOP AT lo_result->get_keypairs( ) INTO DATA(lo_key_pair). + IF lo_key_pair->get_keyname( ) = cv_key_name. + DATA(lv_found) = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Key Pair { cv_key_name } should have been included in key pair list| ). + ao_ec2->deletekeypair( iv_keyname = cv_key_name ). + ENDMETHOD. + METHOD describe_regions. + DATA(lo_result) = ao_ec2_actions->describe_regions( ). + cl_abap_unit_assert=>assert_not_initial( + act = lo_result->get_regions( ) + msg = |Failed to retrieve list of regions| ). + ENDMETHOD. + METHOD describe_availability_zones. + DATA(lo_result) = ao_ec2_actions->describe_availability_zones( ). + cl_abap_unit_assert=>assert_not_initial( + act = lo_result->get_availabilityzones( ) + msg = |Failed to retrieve list of availability zones| ). + ENDMETHOD. + METHOD create_security_group. + CONSTANTS cv_security_group_name TYPE /aws1/ec2string VALUE 'code-example-create-security-group'. + DATA(lo_create_result) = ao_ec2_actions->create_security_group( iv_security_group_name = cv_security_group_name + iv_vpc_id = av_vpc_id ). + DATA(lo_describe_result) = ao_ec2->describesecuritygroups( + it_groupids = VALUE /aws1/cl_ec2groupidstrlist_w=>tt_groupidstringlist( + ( NEW /aws1/cl_ec2groupidstrlist_w( lo_create_result->get_groupid( ) ) ) + ) ). + + + LOOP AT lo_describe_result->get_securitygroups( ) INTO DATA(lo_security_group). + IF lo_security_group->get_groupname( ) = cv_security_group_name. + DATA(lv_found) = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Failed to create security group { cv_security_group_name }| ). + + ao_ec2->deletesecuritygroup( iv_groupid = lo_create_result->get_groupid( ) ). + ENDMETHOD. + METHOD delete_security_group. + CONSTANTS cv_security_group_name TYPE /aws1/ec2string VALUE 'code-example-delete-security-group'. + DATA(lo_create_result) = ao_ec2->createsecuritygroup( + iv_groupname = cv_security_group_name + iv_description = |security group for delete_security_group test| + iv_vpcid = av_vpc_id ). + ao_ec2_actions->delete_security_group( lo_create_result->get_groupid( ) ). + DATA(lo_describe_result) = ao_ec2->describesecuritygroups( + it_filters = VALUE /aws1/cl_ec2filter=>tt_filterlist( + ( NEW /aws1/cl_ec2filter( + iv_name = 'vpc-id' + it_values = VALUE /aws1/cl_ec2valuestringlist_w=>tt_valuestringlist( + ( NEW /aws1/cl_ec2valuestringlist_w( av_vpc_id ) ) + ) + ) ) + ) ). + + + LOOP AT lo_describe_result->get_securitygroups( ) INTO DATA(lo_security_group). + IF lo_security_group->get_groupname( ) = cv_security_group_name. + DATA(lv_found) = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_false( + act = lv_found + msg = |Security Group { cv_security_group_name } should have been deleted| ). + + ENDMETHOD. + METHOD describe_security_groups. + CONSTANTS cv_security_group_name TYPE /aws1/ec2string VALUE 'code-example-describe-security-groups'. + DATA(lo_create_result) = ao_ec2->createsecuritygroup( + iv_groupname = cv_security_group_name + iv_description = |security group for describe_security_groups test| + iv_vpcid = av_vpc_id ). + + DATA(lo_describe_result) = ao_ec2_actions->describe_security_groups( lo_create_result->get_groupid( ) ). + + LOOP AT lo_describe_result->get_securitygroups( ) INTO DATA(lo_security_group). + IF lo_security_group->get_groupname( ) = cv_security_group_name. + DATA(lv_found) = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Security Group { cv_security_group_name } should have been included in security group list| ). + + ao_ec2->deletesecuritygroup( iv_groupid = lo_create_result->get_groupid( ) ). + ENDMETHOD. + METHOD get_ami_id. + CONSTANTS: cv_ami_name TYPE string VALUE 'amzn2-ami-kernel-5.10-hvm*', + cv_architecture TYPE string VALUE 'x86_64'. + TYPES: BEGIN OF ty_ami, + cdate TYPE string, + image TYPE REF TO /aws1/cl_ec2image, + END OF ty_ami. + DATA(lt_images) = ao_ec2->describeimages( + it_filters = VALUE /aws1/cl_ec2filter=>tt_filterlist( + ( NEW /aws1/cl_ec2filter( + iv_name = 'name' + it_values = VALUE /aws1/cl_ec2valuestringlist_w=>tt_valuestringlist( + ( NEW /aws1/cl_ec2valuestringlist_w( cv_ami_name ) ) + ) ) ) + ( NEW /aws1/cl_ec2filter( + iv_name = 'architecture' + it_values = VALUE /aws1/cl_ec2valuestringlist_w=>tt_valuestringlist( + ( NEW /aws1/cl_ec2valuestringlist_w( cv_architecture ) ) + ) ) ) + ) + )->get_images( ). + DATA lt_ami TYPE TABLE OF ty_ami. + LOOP AT lt_images ASSIGNING FIELD-SYMBOL(). + APPEND VALUE ty_ami( cdate = ->get_creationdate( ) image = ) TO lt_ami. + ENDLOOP. + SORT lt_ami BY cdate DESCENDING. + READ TABLE lt_ami INTO DATA(lo_ami) INDEX 1. + ov_ami_id = lo_ami-image->get_imageid( ). + ENDMETHOD. + METHOD wait_until_status_change. + DO 96 TIMES. + WAIT UP TO 5 SECONDS. + DATA(lo_describe_result) = ao_ec2->describeinstances( + it_instanceids = VALUE /aws1/cl_ec2instidstringlist_w=>tt_instanceidstringlist( + ( NEW /aws1/cl_ec2instidstringlist_w( iv_instance_id ) ) + ) ). + READ TABLE lo_describe_result->get_reservations( ) INTO DATA(lo_reservation) INDEX 1. + READ TABLE lo_reservation->get_instances( ) INTO DATA(lo_describe_instance) INDEX 1. + IF lo_describe_instance->get_state( )->get_name( ) = iv_required_status. + EXIT. + ENDIF. + ENDDO. + ov_current_status = lo_describe_instance->get_state( )->get_name( ). + ENDMETHOD. + METHOD run_instance. + DATA(lo_create_result) = ao_ec2->runinstances( + iv_imageid = get_ami_id( ) + iv_instancetype = 't3.micro' + iv_maxcount = 1 + iv_mincount = 1 + iv_subnetid = iv_subnet_id ). + READ TABLE lo_create_result->get_instances( ) INTO DATA(lo_instance) INDEX 1. + ov_instance_id = lo_instance->get_instanceid( ). + APPEND ov_instance_id TO at_instance_id. + ENDMETHOD. + METHOD terminate_instance. + ao_ec2->terminateinstances00( + it_instanceids = VALUE /aws1/cl_ec2instidstringlist_w=>tt_instanceidstringlist( + ( NEW /aws1/cl_ec2instidstringlist_w( iv_instance_id ) ) + ) ). + wait_until_status_change( iv_instance_id = iv_instance_id + iv_required_status = 'terminated' ). + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/ec2/#awsex#cl_ec2_actions.clas.xml b/sap-abap/services/ec2/#awsex#cl_ec2_actions.clas.xml new file mode 100644 index 00000000000..0e16dd6ac0a --- /dev/null +++ b/sap-abap/services/ec2/#awsex#cl_ec2_actions.clas.xml @@ -0,0 +1,127 @@ + + + + + + /AWSEX/CL_EC2_ACTIONS + E + EC2 Code Example Actions + 1 + X + X + X + X + + + + ALLOCATE_ADDRESS + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + ASSOCIATE_ADDRESS + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + CREATE_INSTANCE + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + CREATE_KEY_PAIR + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + CREATE_SECURITY_GROUP + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + DELETE_KEY_PAIR + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + DELETE_SECURITY_GROUP + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + DESCRIBE_ADDRESSES + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + DESCRIBE_AVAILABILITY_ZONES + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + DESCRIBE_INSTANCES + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + DESCRIBE_KEY_PAIRS + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + DESCRIBE_REGIONS + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + DESCRIBE_SECURITY_GROUPS + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + MONITOR_INSTANCE + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + REBOOT_INSTANCE + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + RELEASE_ADDRESS + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + START_INSTANCE + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + STOP_INSTANCE + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + + + diff --git a/sap-abap/services/kns/#awsex#cl_kns_actions.clas.abap b/sap-abap/services/kns/#awsex#cl_kns_actions.clas.abap new file mode 100644 index 00000000000..10d51232542 --- /dev/null +++ b/sap-abap/services/kns/#awsex#cl_kns_actions.clas.abap @@ -0,0 +1,260 @@ +CLASS /awsex/cl_kns_actions DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + METHODS create_stream + IMPORTING + !iv_stream_name TYPE /aws1/knsstreamname + !iv_shard_count TYPE /aws1/knspositiveintegerobject + RAISING + /aws1/cx_rt_generic . + METHODS delete_stream + IMPORTING + !iv_stream_name TYPE /aws1/knsstreamname + RAISING + /aws1/cx_rt_generic . + METHODS describe_stream + IMPORTING + !iv_stream_name TYPE /aws1/knsstreamname + EXPORTING + !oo_result TYPE REF TO /aws1/cl_knsdescrstreamoutput + RAISING + /aws1/cx_rt_generic . + METHODS get_records + IMPORTING + !iv_shard_iterator TYPE /aws1/knssharditerator + EXPORTING + !oo_result TYPE REF TO /aws1/cl_knsgetrecordsoutput + RAISING + /aws1/cx_rt_generic . + METHODS list_streams + IMPORTING + !iv_limit TYPE /aws1/knsliststreamsinputlimit + EXPORTING + !oo_result TYPE REF TO /aws1/cl_knsliststreamsoutput + RAISING + /aws1/cx_rt_generic . + METHODS put_record + IMPORTING + !iv_stream_name TYPE /aws1/knsstreamname + !iv_data TYPE /aws1/knsdata + !iv_partition_key TYPE /aws1/knspartitionkey + EXPORTING + !oo_result TYPE REF TO /aws1/cl_knsputrecordoutput + RAISING + /aws1/cx_rt_generic . + METHODS register_stream_consumer + IMPORTING + !iv_stream_arn TYPE /aws1/knsstreamarn + !iv_consumer_name TYPE /aws1/knsconsumername + EXPORTING + !oo_result TYPE REF TO /aws1/cl_knsregstreamconsout + RAISING + /aws1/cx_rt_generic . + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS /AWSEX/CL_KNS_ACTIONS IMPLEMENTATION. + + + METHOD create_stream. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_kns) = /aws1/cl_kns_factory=>create( lo_session ). + + "snippet-start:[kns.abapv1.create_stream] + TRY. + lo_kns->createstream( + iv_streamname = iv_stream_name + iv_shardcount = iv_shard_count ). + MESSAGE 'Stream created.' TYPE 'I'. + CATCH /aws1/cx_knsinvalidargumentex. + MESSAGE 'The specified argument was not valid.' TYPE 'E'. + CATCH /aws1/cx_knslimitexceededex. + MESSAGE 'The request processing has failed because of a limit exceed exception.' TYPE 'E'. + CATCH /aws1/cx_knsresourceinuseex. + MESSAGE 'The request processing has failed because the resource is in use.' TYPE 'E'. + ENDTRY. + "snippet-end:[kns.abapv1.create_stream] + + ENDMETHOD. + + + METHOD delete_stream. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_kns) = /aws1/cl_kns_factory=>create( lo_session ). + + "snippet-start:[kns.abapv1.delete_stream] + TRY. + lo_kns->deletestream( + iv_streamname = iv_stream_name ). + MESSAGE 'Stream deleted.' TYPE 'I'. + CATCH /aws1/cx_knslimitexceededex. + MESSAGE 'The request processing has failed because of a limit exceed exception.' TYPE 'E'. + CATCH /aws1/cx_knsresourceinuseex. + MESSAGE 'The request processing has failed because the resource is in use.' TYPE 'E'. + ENDTRY. + "snippet-end:[kns.abapv1.delete_stream] + + ENDMETHOD. + + + METHOD describe_stream. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_kns) = /aws1/cl_kns_factory=>create( lo_session ). + + "snippet-start:[kns.abapv1.describe_stream] + TRY. + oo_result = lo_kns->describestream( + iv_streamname = iv_stream_name ). + DATA(lt_stream_description) = oo_result->get_streamdescription( ). + MESSAGE 'Streams retrieved.' TYPE 'I'. + CATCH /aws1/cx_knslimitexceededex. + MESSAGE 'The request processing has failed because of a limit exceed exception.' TYPE 'E'. + CATCH /aws1/cx_knsresourcenotfoundex. + MESSAGE 'Resource being accessed is not found.' TYPE 'E'. + ENDTRY. + "snippet-end:[kns.abapv1.describe_stream] + + + + ENDMETHOD. + + + METHOD get_records. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_kns) = /aws1/cl_kns_factory=>create( lo_session ). + + "snippet-start:[kns.abapv1.get_records] + TRY. + oo_result = lo_kns->getrecords( " oo_result is returned for testing purposes. " + iv_sharditerator = iv_shard_iterator ). + DATA(lt_records) = oo_result->get_records( ). + MESSAGE 'Record retrieved.' TYPE 'I'. + CATCH /aws1/cx_knsexpirediteratorex. + MESSAGE 'Iterator expired.' TYPE 'E'. + CATCH /aws1/cx_knsinvalidargumentex. + MESSAGE 'The specified argument was not valid.' TYPE 'E'. + CATCH /aws1/cx_knskmsaccessdeniedex. + MESSAGE 'You do not have permission to perform this AWS KMS action.' TYPE 'E'. + CATCH /aws1/cx_knskmsdisabledex. + MESSAGE 'KMS key used is disabled.' TYPE 'E'. + CATCH /aws1/cx_knskmsinvalidstateex. + MESSAGE 'KMS key used is in an invalid state. ' TYPE 'E'. + CATCH /aws1/cx_knskmsnotfoundex. + MESSAGE 'KMS key used is not found.' TYPE 'E'. + CATCH /aws1/cx_knskmsoptinrequired. + MESSAGE 'KMS key option is required.' TYPE 'E'. + CATCH /aws1/cx_knskmsthrottlingex. + MESSAGE 'The rate of requests to AWS KMS is exceeding the request quotas.' TYPE 'E'. + CATCH /aws1/cx_knsprovthruputexcdex. + MESSAGE 'The request rate for the stream is too high, or the requested data is too large for the available throughput.' TYPE 'E'. + CATCH /aws1/cx_knsresourcenotfoundex. + MESSAGE 'Resource being accessed is not found.' TYPE 'E'. + ENDTRY. + "snippet-end:[kns.abapv1.get_records] + + ENDMETHOD. + + + METHOD list_streams. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_kns) = /aws1/cl_kns_factory=>create( lo_session ). + + "snippet-start:[kns.abapv1.list_streams] + TRY. + oo_result = lo_kns->liststreams( " oo_result is returned for testing purposes. " + "Set Limit to specify that a maximum of streams should be returned." + iv_limit = iv_limit ). + DATA(lt_streams) = oo_result->get_streamnames( ). + MESSAGE 'Streams listed.' TYPE 'I'. + CATCH /aws1/cx_knslimitexceededex. + MESSAGE 'The request processing has failed because of a limit exceed exception.' TYPE 'E'. + ENDTRY. + "snippet-end:[kns.abapv1.list_streams] + + ENDMETHOD. + + + METHOD put_record. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_kns) = /aws1/cl_kns_factory=>create( lo_session ). + + "snippet-start:[kns.abapv1.put_record] + TRY. + oo_result = lo_kns->putrecord( " oo_result is returned for testing purposes. " + iv_streamname = iv_stream_name + iv_data = iv_data + iv_partitionkey = iv_partition_key ). + MESSAGE 'Record created.' TYPE 'I'. + CATCH /aws1/cx_knsinvalidargumentex. + MESSAGE 'The specified argument was not valid.' TYPE 'E'. + CATCH /aws1/cx_knskmsaccessdeniedex. + MESSAGE 'You do not have permission to perform this AWS KMS action.' TYPE 'E'. + CATCH /aws1/cx_knskmsdisabledex. + MESSAGE 'KMS key used is disabled.' TYPE 'E'. + CATCH /aws1/cx_knskmsinvalidstateex. + MESSAGE 'KMS key used is in an invalid state. ' TYPE 'E'. + CATCH /aws1/cx_knskmsnotfoundex. + MESSAGE 'KMS key used is not found.' TYPE 'E'. + CATCH /aws1/cx_knskmsoptinrequired. + MESSAGE 'KMS key option is required.' TYPE 'E'. + CATCH /aws1/cx_knskmsthrottlingex. + MESSAGE 'The rate of requests to AWS KMS is exceeding the request quotas.' TYPE 'E'. + CATCH /aws1/cx_knsprovthruputexcdex. + MESSAGE 'The request rate for the stream is too high, or the requested data is too large for the available throughput.' TYPE 'E'. + CATCH /aws1/cx_knsresourcenotfoundex. + MESSAGE 'Resource being accessed is not found.' TYPE 'E'. + ENDTRY. + "snippet-end:[kns.abapv1.put_record] + ENDMETHOD. + + + METHOD register_stream_consumer. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_kns) = /aws1/cl_kns_factory=>create( lo_session ). + + "snippet-start:[kns.abapv1.register_stream_consumer] + TRY. + oo_result = lo_kns->registerstreamconsumer( " oo_result is returned for testing purposes. " + iv_streamarn = iv_stream_arn + iv_consumername = iv_consumer_name ). + MESSAGE 'Stream consumer registered.' TYPE 'I'. + CATCH /aws1/cx_knsinvalidargumentex. + MESSAGE 'The specified argument was not valid.' TYPE 'E'. + CATCH /aws1/cx_sgmresourcelimitexcd. + MESSAGE 'You have reached the limit on the number of resources.' TYPE 'E'. + CATCH /aws1/cx_sgmresourceinuse. + MESSAGE 'Resource being accessed is in use.' TYPE 'E'. + CATCH /aws1/cx_sgmresourcenotfound. + MESSAGE 'Resource being accessed is not found.' TYPE 'E'. + ENDTRY. + "snippet-end:[kns.abapv1.register_stream_consumer] + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/kns/#awsex#cl_kns_actions.clas.testclasses.abap b/sap-abap/services/kns/#awsex#cl_kns_actions.clas.testclasses.abap new file mode 100644 index 00000000000..5828c2e0316 --- /dev/null +++ b/sap-abap/services/kns/#awsex#cl_kns_actions.clas.testclasses.abap @@ -0,0 +1,518 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 + +CLASS ltc_awsex_cl_kns_actions DEFINITION FOR TESTING DURATION LONG RISK LEVEL DANGEROUS. + + PRIVATE SECTION. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA ao_kns TYPE REF TO /aws1/if_kns. + DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. + DATA ao_kns_actions TYPE REF TO /awsex/cl_kns_actions. + + METHODS setup RAISING /aws1/cx_rt_generic. + METHODS create_stream FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS delete_stream FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS list_streams FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS describe_stream FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS put_record FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS get_records FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS register_stream_consumer FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + +ENDCLASS. "ltc_awsex_cl_kns_actions + + +CLASS ltc_awsex_cl_kns_actions IMPLEMENTATION. + + METHOD setup. + ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). + ao_kns = /aws1/cl_kns_factory=>create( ao_session ). + ao_kns_actions = NEW /awsex/cl_kns_actions( ). + ENDMETHOD. + + METHOD create_stream. + + DATA lv_stream_name TYPE /aws1/knsstreamname. + DATA lo_stream_describe_result TYPE REF TO /aws1/cl_knsdescrstreamoutput. + DATA lo_stream_description TYPE REF TO /aws1/cl_knsstreamdescription. + DATA lv_stream_status TYPE /aws1/knsstreamstatus. + + DATA lv_uuid_16 TYPE sysuuid_x16. + + CONSTANTS cv_shard_count TYPE /aws1/knspositiveintegerobject VALUE 1. + + "Define stream name. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_stream_name = 'code-example-kns-stream-' && lv_uuid_16. + TRANSLATE lv_stream_name TO LOWER CASE. + + "Testing. + ao_kns_actions->create_stream( + iv_stream_name = lv_stream_name + iv_shard_count = cv_shard_count ). + + "Wait for stream to become active. + lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). + lo_stream_description = lo_stream_describe_result->get_streamdescription( ). + WHILE lo_stream_description->get_streamstatus( ) <> 'ACTIVE'. + IF sy-index = 30. + EXIT. "maximum 5 minutes + ENDIF. + WAIT UP TO 10 SECONDS. + lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). + lo_stream_description = lo_stream_describe_result->get_streamdescription( ). + ENDWHILE. + + "Testing. + DATA(lv_found) = abap_false. + IF lo_stream_description->get_streamstatus( ) = 'ACTIVE'. + lv_found = abap_true. + ENDIF. + + "Validation. + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Stream cannot be found| ). + + "Clean up. + ao_kns->deletestream( + iv_streamname = lv_stream_name ). + + ENDMETHOD. + + + METHOD delete_stream. + + DATA lv_stream_name TYPE /aws1/knsstreamname. + DATA lo_stream_describe_result TYPE REF TO /aws1/cl_knsdescrstreamoutput. + DATA lo_stream_list_result TYPE REF TO /aws1/cl_knsliststreamsoutput. + DATA lo_stream_description TYPE REF TO /aws1/cl_knsstreamdescription. + DATA lv_stream_status TYPE /aws1/knsstreamstatus. + + DATA lv_uuid_16 TYPE sysuuid_x16. + + CONSTANTS cv_shard_count TYPE /aws1/knspositiveintegerobject VALUE 1. + + "Define name. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_stream_name = 'code-example-kns-stream-' && lv_uuid_16. + TRANSLATE lv_stream_name TO LOWER CASE. + + "Create stream. + ao_kns->createstream( + iv_streamname = lv_stream_name + iv_shardcount = cv_shard_count ). + + "Wait for stream to become active. + lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). + lo_stream_description = lo_stream_describe_result->get_streamdescription( ). + WHILE lo_stream_description->get_streamstatus( ) <> 'ACTIVE'. + IF sy-index = 30. + EXIT. "maximum 5 minutes + ENDIF. + WAIT UP TO 10 SECONDS. + lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). + lo_stream_description = lo_stream_describe_result->get_streamdescription( ). + ENDWHILE. + + "Testing. + ao_kns_actions->delete_stream( + lv_stream_name ). + + "Confirm deletion. + DATA(lv_found) = abap_true. + lo_stream_list_result = ao_kns->liststreams( iv_exclusivestartstreamname = lv_stream_name ). + + IF lo_stream_list_result->has_streamnames( ) = 'X'. + lv_found = abap_false. + ENDIF. + + cl_abap_unit_assert=>assert_false( + act = lv_found + msg = |Stream not deleted| ). + + "Nothing to clean up. + + ENDMETHOD. + + METHOD list_streams. + + DATA lv_stream_name TYPE /aws1/knsstreamname. + DATA lo_stream_describe_result TYPE REF TO /aws1/cl_knsdescrstreamoutput. + DATA lo_stream_description TYPE REF TO /aws1/cl_knsstreamdescription. + DATA lo_stream_list_result TYPE REF TO /aws1/cl_knsliststreamsoutput. + DATA lv_stream_status TYPE /aws1/knsstreamstatus. + + DATA lv_uuid_16 TYPE sysuuid_x16. + + CONSTANTS cv_shard_count TYPE /aws1/knspositiveintegerobject VALUE 1. + CONSTANTS cv_limit TYPE /aws1/knsliststreamsinputlimit VALUE 20. + + "Define stream. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_stream_name = 'code-example-kns-stream-' && lv_uuid_16. + TRANSLATE lv_stream_name TO LOWER CASE. + + "Create stream. + ao_kns->createstream( + iv_streamname = lv_stream_name + iv_shardcount = cv_shard_count ). + + "Wait for stream to become active. + lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). + lo_stream_description = lo_stream_describe_result->get_streamdescription( ). + WHILE lo_stream_description->get_streamstatus( ) <> 'ACTIVE'. + IF sy-index = 30. + EXIT. "maximum 5 minutes + ENDIF. + WAIT UP TO 10 SECONDS. + lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). + lo_stream_description = lo_stream_describe_result->get_streamdescription( ). + ENDWHILE. + + "Testing. + ao_kns_actions->list_streams( EXPORTING iv_limit = cv_limit IMPORTING oo_result = lo_stream_list_result ). + + "Validation. + DATA(lv_found) = abap_false. + + IF lo_stream_list_result->has_streamnames( ) = 'X'. + lv_found = abap_true. + ENDIF. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Stream not found| ). + + "Clean up. + ao_kns->deletestream( + iv_streamname = lv_stream_name ). + + ENDMETHOD. + + METHOD describe_stream. + + DATA lv_stream_name TYPE /aws1/knsstreamname. + DATA lo_stream_describe_result TYPE REF TO /aws1/cl_knsdescrstreamoutput. + DATA lo_stream_description TYPE REF TO /aws1/cl_knsstreamdescription. + DATA lo_stream_list_result TYPE REF TO /aws1/cl_knsliststreamsoutput. + DATA lv_stream_status TYPE /aws1/knsstreamstatus. + + DATA lv_uuid_16 TYPE sysuuid_x16. + + CONSTANTS cv_shard_count TYPE /aws1/knspositiveintegerobject VALUE 1. + + "Define name. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_stream_name = 'code-example-kns-stream-' && lv_uuid_16. + TRANSLATE lv_stream_name TO LOWER CASE. + + "Create stream. + ao_kns->createstream( + iv_streamname = lv_stream_name + iv_shardcount = cv_shard_count ). + + "Wait for stream to become active. + lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). + lo_stream_description = lo_stream_describe_result->get_streamdescription( ). + WHILE lo_stream_description->get_streamstatus( ) <> 'ACTIVE'. + IF sy-index = 30. + EXIT. "maximum 5 minutes + ENDIF. + WAIT UP TO 10 SECONDS. + lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). + lo_stream_description = lo_stream_describe_result->get_streamdescription( ). + ENDWHILE. + + "Testing. + ao_kns_actions->describe_stream( EXPORTING iv_stream_name = lv_stream_name IMPORTING oo_result = lo_stream_describe_result ). + + "Validation. + DATA(lv_found) = abap_false. + + lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). + lo_stream_description = lo_stream_describe_result->get_streamdescription( ). + IF lo_stream_description->get_streamstatus( ) = 'ACTIVE'. + lv_found = abap_true. + ENDIF. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Stream not found| ). + + "Clean up. + ao_kns->deletestream( + iv_streamname = lv_stream_name ). + + ENDMETHOD. + + METHOD put_record. + + DATA lo_stream_describe_result TYPE REF TO /aws1/cl_knsdescrstreamoutput. + DATA lo_stream_description TYPE REF TO /aws1/cl_knsstreamdescription. + DATA lv_stream_status TYPE /aws1/knsstreamstatus. + DATA lo_put_record_output TYPE REF TO /aws1/cl_knsputrecordoutput. + DATA lo_get_record_output TYPE REF TO /aws1/cl_knsgetrecordsoutput. + DATA lo_sharditerator TYPE REF TO /aws1/cl_knsgetsharditerator01. + DATA lt_record_list TYPE /aws1/cl_knsrecord=>tt_recordlist. + DATA lv_record_data TYPE /aws1/knsdata. + DATA lv_stream_name TYPE /aws1/knsstreamname. + DATA lv_shardid TYPE /aws1/knsshardid. + + DATA lv_uuid_16 TYPE sysuuid_x16. + DATA(lv_data) = /aws1/cl_rt_util=>string_to_xstring( + `{` && + `"word": "This",` && + `"word": "is"` && + `"word": "a"` && + `"word": "code"` && + `"word": "example"` && + `}` ). + + CONSTANTS cv_shard_count TYPE /aws1/knspositiveintegerobject VALUE 1. + CONSTANTS cv_partition_key TYPE /aws1/knspartitionkey VALUE '123'. + CONSTANTS cv_sharditeratortype TYPE /aws1/knssharditeratortype VALUE 'TRIM_HORIZON'. + + "Define name. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_stream_name = 'code-example-kns-stream-' && lv_uuid_16. + TRANSLATE lv_stream_name TO LOWER CASE. + + "Create stream. + ao_kns->createstream( + iv_streamname = lv_stream_name + iv_shardcount = cv_shard_count ). + + "Wait for stream to become active. + lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). + lo_stream_description = lo_stream_describe_result->get_streamdescription( ). + WHILE lo_stream_description->get_streamstatus( ) <> 'ACTIVE'. + IF sy-index = 30. + EXIT. "maximum 5 minutes + ENDIF. + WAIT UP TO 10 SECONDS. + lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). + lo_stream_description = lo_stream_describe_result->get_streamdescription( ). + ENDWHILE. + + "Testing. + ao_kns_actions->put_record( EXPORTING iv_stream_name = lv_stream_name + iv_data = lv_data + iv_partition_key = cv_partition_key IMPORTING oo_result = lo_put_record_output ). + + "Get the shard ID. + lv_shardid = lo_put_record_output->get_shardid( ). + + "Get the shard iterator using the shard ID. + lo_sharditerator = ao_kns->getsharditerator( + iv_shardid = lv_shardid + iv_sharditeratortype = cv_sharditeratortype + iv_streamname = lv_stream_name ). + + "Get the record using the shard iterator. + lo_get_record_output = ao_kns->getrecords( + iv_sharditerator = lo_sharditerator->get_sharditerator( ) ). + + lt_record_list = lo_get_record_output->get_records( ). + LOOP AT lt_record_list INTO DATA(lo_record). + lv_record_data = lo_record->get_data( ). + ENDLOOP. + + "Validation. + DATA(lv_found) = abap_false. + + IF lv_record_data = lv_data. + lv_found = abap_true. + ENDIF. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Record not found| ). + + "Clean up. + ao_kns->deletestream( + iv_streamname = lv_stream_name ). + + ENDMETHOD. + + METHOD get_records. + + DATA lo_stream_describe_result TYPE REF TO /aws1/cl_knsdescrstreamoutput. + DATA lo_stream_description TYPE REF TO /aws1/cl_knsstreamdescription. + DATA lv_stream_status TYPE /aws1/knsstreamstatus. + DATA lo_put_record_output TYPE REF TO /aws1/cl_knsputrecordoutput. + DATA lo_get_record_output TYPE REF TO /aws1/cl_knsgetrecordsoutput. + DATA lo_sharditerator TYPE REF TO /aws1/cl_knsgetsharditerator01. + DATA lt_record_list TYPE /aws1/cl_knsrecord=>tt_recordlist. + DATA lv_record_data TYPE /aws1/knsdata. + DATA lv_stream_name TYPE /aws1/knsstreamname. + DATA lv_shardid TYPE /aws1/knsshardid. + + DATA lv_uuid_16 TYPE sysuuid_x16. + DATA(lv_data) = /aws1/cl_rt_util=>string_to_xstring( + `{` && + `"word": "This",` && + `"word": "is"` && + `"word": "a"` && + `"word": "code"` && + `"word": "example"` && + `}` ). + + CONSTANTS cv_shard_count TYPE /aws1/knspositiveintegerobject VALUE 1. + CONSTANTS cv_partition_key TYPE /aws1/knspartitionkey VALUE '123'. + CONSTANTS cv_sharditeratortype TYPE /aws1/knssharditeratortype VALUE 'TRIM_HORIZON'. + + "Define name. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_stream_name = 'code-example-kns-stream-' && lv_uuid_16. + TRANSLATE lv_stream_name TO LOWER CASE. + + "Create stream. + ao_kns->createstream( + iv_streamname = lv_stream_name + iv_shardcount = cv_shard_count ). + + "Wait for stream to become active. + lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). + lo_stream_description = lo_stream_describe_result->get_streamdescription( ). + + WHILE lo_stream_description->get_streamstatus( ) <> 'ACTIVE'. + IF sy-index = 30. + EXIT. "maximum 5 minutes + ENDIF. + WAIT UP TO 10 SECONDS. + lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). + lo_stream_description = lo_stream_describe_result->get_streamdescription( ). + ENDWHILE. + + "Create a record. + lo_put_record_output = ao_kns->putrecord( + iv_streamname = lv_stream_name + iv_data = lv_data + iv_partitionkey = cv_partition_key ). + + "Get the shard ID. + lv_shardid = lo_put_record_output->get_shardid( ). + + "Get the shard iterator. + lo_sharditerator = ao_kns->getsharditerator( + iv_shardid = lv_shardid + iv_sharditeratortype = cv_sharditeratortype + iv_streamname = lv_stream_name ). + + "Testing. + ao_kns_actions->get_records( EXPORTING iv_shard_iterator = lo_sharditerator->get_sharditerator( ) IMPORTING oo_result = lo_get_record_output ). + + "Get records. + lt_record_list = lo_get_record_output->get_records( ). + + LOOP AT lt_record_list INTO DATA(lo_record). + lv_record_data = lo_record->get_data( ). + ENDLOOP. + + "Validation. + DATA(lv_found) = abap_false. + IF lv_record_data = lv_data. + lv_found = abap_true. + ENDIF. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Record not found| ). + + "Clean up. + ao_kns->deletestream( + iv_streamname = lv_stream_name ). + + ENDMETHOD. + + METHOD register_stream_consumer. + + DATA lo_stream_describe_result TYPE REF TO /aws1/cl_knsdescrstreamoutput. + DATA lo_stream_description TYPE REF TO /aws1/cl_knsstreamdescription. + DATA lv_stream_status TYPE /aws1/knsstreamstatus. + DATA lo_put_record_output TYPE REF TO /aws1/cl_knsputrecordoutput. + DATA lo_get_record_output TYPE REF TO /aws1/cl_knsgetrecordsoutput. + DATA lo_sharditerator TYPE REF TO /aws1/cl_knsgetsharditerator01. + DATA lo_knsregstreamconsout TYPE REF TO /aws1/cl_knsregstreamconsout. + DATA lt_record_list TYPE /aws1/cl_knsrecord=>tt_recordlist. + DATA lv_record_data TYPE /aws1/knsdata. + DATA lv_stream_name TYPE /aws1/knsstreamname. + DATA lv_consumer_name TYPE /aws1/knsconsumername. + DATA lv_shardid TYPE /aws1/knsshardid. + DATA lv_stream_arn TYPE /aws1/knsstreamarn. + + DATA lo_knsliststreamconsout TYPE REF TO /aws1/cl_knsliststreamconsout. + DATA lo_knsconsumer TYPE REF TO /aws1/cl_knsconsumer. + DATA lv_uuid_16 TYPE sysuuid_x16. + + CONSTANTS cv_shard_count TYPE /aws1/knspositiveintegerobject VALUE 1. + CONSTANTS cv_partition_key TYPE /aws1/knspartitionkey VALUE '123'. + CONSTANTS cv_sharditeratortype TYPE /aws1/knssharditeratortype VALUE 'TRIM_HORIZON'. + + DATA(lv_data) = /aws1/cl_rt_util=>string_to_xstring( + `{` && + `"word": "This",` && + `"word": "is"` && + `"word": "a"` && + `"word": "code"` && + `"word": "example"` && + `}` ). + + "Define name. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_stream_name = 'code-example-kns-stream-' && lv_uuid_16. + TRANSLATE lv_stream_name TO LOWER CASE. + lv_consumer_name = 'code-example-kns-consumer-' && lv_uuid_16. + TRANSLATE lv_consumer_name TO LOWER CASE. + + "Create stream. + ao_kns->createstream( + iv_streamname = lv_stream_name + iv_shardcount = cv_shard_count ). + + "Wait for stream to become active. + lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). + lo_stream_description = lo_stream_describe_result->get_streamdescription( ). + WHILE lo_stream_description->get_streamstatus( ) <> 'ACTIVE'. + IF sy-index = 30. + EXIT. "maximum 5 minutes + ENDIF. + WAIT UP TO 10 SECONDS. + lo_stream_describe_result = ao_kns->describestream( iv_streamname = lv_stream_name ). + lo_stream_description = lo_stream_describe_result->get_streamdescription( ). + ENDWHILE. + + "Get stream Amazon Resource Name (ARN). + lv_stream_arn = lo_stream_description->get_streamarn( ). + + "Testing. + ao_kns_actions->register_stream_consumer( EXPORTING iv_consumer_name = lv_consumer_name + iv_stream_arn = lv_stream_arn IMPORTING oo_result = lo_knsregstreamconsout ). + + "Validation. + DATA(lv_found) = abap_false. + + lo_knsliststreamconsout = ao_kns->liststreamconsumers( + iv_streamarn = lv_stream_arn ). + lo_knsconsumer = lo_knsregstreamconsout->get_consumer( ). + + IF lo_knsconsumer->get_consumername( ) = lv_consumer_name. + lv_found = abap_true. + ENDIF. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Record not found| ). + + "Clean up. + ao_kns->deregisterstreamconsumer( + iv_streamarn = lv_stream_arn + iv_consumername = lv_consumer_name ). + + ao_kns->deletestream( + iv_streamname = lv_stream_name ). + ENDMETHOD. + +ENDCLASS. diff --git a/sap-abap/services/kns/#awsex#cl_kns_actions.clas.xml b/sap-abap/services/kns/#awsex#cl_kns_actions.clas.xml new file mode 100644 index 00000000000..63d47dcbb3e --- /dev/null +++ b/sap-abap/services/kns/#awsex#cl_kns_actions.clas.xml @@ -0,0 +1,61 @@ + + + + + + /AWSEX/CL_KNS_ACTIONS + E + Kinesis Code Example Actions + 1 + X + X + X + X + + + + CREATE_STREAM + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + DELETE_STREAM + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + DESCRIBE_STREAM + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + GET_RECORDS + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + LIST_STREAMS + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + PUT_RECORD + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + REGISTER_STREAM_CONSUMER + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + + + diff --git a/sap-abap/services/kns/#awsex#cl_kns_scenarios.clas.abap b/sap-abap/services/kns/#awsex#cl_kns_scenarios.clas.abap new file mode 100644 index 00000000000..c2ec856ad7b --- /dev/null +++ b/sap-abap/services/kns/#awsex#cl_kns_scenarios.clas.abap @@ -0,0 +1,157 @@ +CLASS /awsex/cl_kns_scenarios DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + METHODS getting_started_with_kns + IMPORTING + !iv_stream_name TYPE /aws1/knsstreamname + !iv_partition_key TYPE /aws1/knspartitionkey + !iv_data TYPE /aws1/knsdata + !iv_shard_count TYPE /aws1/knspositiveintegerobject + !iv_sharditeratortype TYPE /aws1/knssharditeratortype + EXPORTING + !oo_result TYPE REF TO /aws1/cl_knsgetrecordsoutput + RAISING + /aws1/cx_rt_generic . + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS /AWSEX/CL_KNS_SCENARIOS IMPLEMENTATION. + + + METHOD getting_started_with_kns. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_kns) = /aws1/cl_kns_factory=>create( lo_session ). + + "This example scenario contains the following actions:" + " 1. Create a stream. " + " 2. Put a record in a stream. " + " 3. Create a shard iterator. " + " 4. Read the record. " + " 5. Delete the stream. " + + "snippet-start:[kns.abapv1.getting_started_with_kns] + + DATA lo_stream_describe_result TYPE REF TO /aws1/cl_knsdescrstreamoutput. + DATA lo_stream_description TYPE REF TO /aws1/cl_knsstreamdescription. + DATA lo_sharditerator TYPE REF TO /aws1/cl_knsgetsharditerator01. + DATA lo_record_result TYPE REF TO /aws1/cl_knsputrecordoutput. + + "Create stream." + TRY. + lo_kns->createstream( + iv_streamname = iv_stream_name + iv_shardcount = iv_shard_count ). + MESSAGE 'Stream created.' TYPE 'I'. + CATCH /aws1/cx_knsinvalidargumentex. + MESSAGE 'The specified argument was not valid.' TYPE 'E'. + CATCH /aws1/cx_knslimitexceededex. + MESSAGE 'The request processing has failed because of a limit exceeded exception.' TYPE 'E'. + CATCH /aws1/cx_knsresourceinuseex. + MESSAGE 'The request processing has failed because the resource is in use.' TYPE 'E'. + ENDTRY. + + "Wait for stream to becomes active." + lo_stream_describe_result = lo_kns->describestream( iv_streamname = iv_stream_name ). + lo_stream_description = lo_stream_describe_result->get_streamdescription( ). + WHILE lo_stream_description->get_streamstatus( ) <> 'ACTIVE'. + IF sy-index = 30. + EXIT. "maximum 5 minutes" + ENDIF. + WAIT UP TO 10 SECONDS. + lo_stream_describe_result = lo_kns->describestream( iv_streamname = iv_stream_name ). + lo_stream_description = lo_stream_describe_result->get_streamdescription( ). + ENDWHILE. + + "Create record." + TRY. + lo_record_result = lo_kns->putrecord( + iv_streamname = iv_stream_name + iv_data = iv_data + iv_partitionkey = iv_partition_key ). + MESSAGE 'Record created.' TYPE 'I'. + CATCH /aws1/cx_knsinvalidargumentex. + MESSAGE 'The specified argument was not valid.' TYPE 'E'. + CATCH /aws1/cx_knskmsaccessdeniedex. + MESSAGE 'You do not have permission to perform this AWS KMS action.' TYPE 'E'. + CATCH /aws1/cx_knskmsdisabledex. + MESSAGE 'KMS key used is disabled.' TYPE 'E'. + CATCH /aws1/cx_knskmsinvalidstateex. + MESSAGE 'KMS key used is in an invalid state. ' TYPE 'E'. + CATCH /aws1/cx_knskmsnotfoundex. + MESSAGE 'KMS key used is not found.' TYPE 'E'. + CATCH /aws1/cx_knskmsoptinrequired. + MESSAGE 'KMS key option is required.' TYPE 'E'. + CATCH /aws1/cx_knskmsthrottlingex. + MESSAGE 'The rate of requests to AWS KMS is exceeding the request quotas.' TYPE 'E'. + CATCH /aws1/cx_knsprovthruputexcdex. + MESSAGE 'The request rate for the stream is too high, or the requested data is too large for the available throughput.' TYPE 'E'. + CATCH /aws1/cx_knsresourcenotfoundex. + MESSAGE 'Resource being accessed is not found.' TYPE 'E'. + ENDTRY. + + "Create a shard iterator in order to read the record." + TRY. + lo_sharditerator = lo_kns->getsharditerator( + iv_shardid = lo_record_result->get_shardid( ) + iv_sharditeratortype = iv_sharditeratortype + iv_streamname = iv_stream_name ). + MESSAGE 'Shard iterator created.' TYPE 'I'. + CATCH /aws1/cx_knsinvalidargumentex. + MESSAGE 'The specified argument was not valid.' TYPE 'E'. + CATCH /aws1/cx_knsprovthruputexcdex. + MESSAGE 'The request rate for the stream is too high, or the requested data is too large for the available throughput.' TYPE 'E'. + CATCH /aws1/cx_sgmresourcenotfound. + MESSAGE 'Resource being accessed is not found.' TYPE 'E'. + ENDTRY. + + "Read the record." + TRY. + oo_result = lo_kns->getrecords( " oo_result is returned for testing purposes. " + iv_sharditerator = lo_sharditerator->get_sharditerator( ) ). + MESSAGE 'Shard iterator created.' TYPE 'I'. + CATCH /aws1/cx_knsexpirediteratorex. + MESSAGE 'Iterator expired.' TYPE 'E'. + CATCH /aws1/cx_knsinvalidargumentex. + MESSAGE 'The specified argument was not valid.' TYPE 'E'. + CATCH /aws1/cx_knskmsaccessdeniedex. + MESSAGE 'You do not have permission to perform this AWS KMS action.' TYPE 'E'. + CATCH /aws1/cx_knskmsdisabledex. + MESSAGE 'KMS key used is disabled.' TYPE 'E'. + CATCH /aws1/cx_knskmsinvalidstateex. + MESSAGE 'KMS key used is in an invalid state. ' TYPE 'E'. + CATCH /aws1/cx_knskmsnotfoundex. + MESSAGE 'KMS key used is not found.' TYPE 'E'. + CATCH /aws1/cx_knskmsoptinrequired. + MESSAGE 'KMS key option is required.' TYPE 'E'. + CATCH /aws1/cx_knskmsthrottlingex. + MESSAGE 'The rate of requests to AWS KMS is exceeding the request quotas.' TYPE 'E'. + CATCH /aws1/cx_knsprovthruputexcdex. + MESSAGE 'The request rate for the stream is too high, or the requested data is too large for the available throughput.' TYPE 'E'. + CATCH /aws1/cx_knsresourcenotfoundex. + MESSAGE 'Resource being accessed is not found.' TYPE 'E'. + ENDTRY. + + "Delete stream." + TRY. + lo_kns->deletestream( + iv_streamname = iv_stream_name ). + MESSAGE 'Stream deleted.' TYPE 'I'. + CATCH /aws1/cx_knslimitexceededex. + MESSAGE 'The request processing has failed because of a limit exceeded exception.' TYPE 'E'. + CATCH /aws1/cx_knsresourceinuseex. + MESSAGE 'The request processing has failed because the resource is in use.' TYPE 'E'. + ENDTRY. + "snippet-end:[kns.abapv1.getting_started_with_kns] + + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/kns/#awsex#cl_kns_scenarios.clas.testclasses.abap b/sap-abap/services/kns/#awsex#cl_kns_scenarios.clas.testclasses.abap new file mode 100644 index 00000000000..3a2750029cf --- /dev/null +++ b/sap-abap/services/kns/#awsex#cl_kns_scenarios.clas.testclasses.abap @@ -0,0 +1,90 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0"" + +CLASS ltc_awsex_cl_kns_scenario DEFINITION FOR TESTING DURATION SHORT RISK LEVEL DANGEROUS. + + PRIVATE SECTION. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA ao_kns TYPE REF TO /aws1/if_kns. + DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. + DATA ao_kns_scenario TYPE REF TO /awsex/cl_kns_scenarios. + DATA lv_found TYPE abap_bool VALUE abap_false. + + METHODS getting_started_with_kns FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS setup RAISING /aws1/cx_rt_generic /awsex/cx_generic. + +ENDCLASS. "ltc_awsex_cl_kns_scenario + + +CLASS ltc_awsex_cl_kns_scenario IMPLEMENTATION. + + METHOD setup. + ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). + ao_kns = /aws1/cl_kns_factory=>create( ao_session ). + ao_kns_scenario = NEW /awsex/cl_kns_scenarios( ). + ENDMETHOD. + + METHOD getting_started_with_kns. + + DATA lo_get_record_output TYPE REF TO /aws1/cl_knsgetrecordsoutput. + DATA lt_record_list TYPE /aws1/cl_knsrecord=>tt_recordlist. + DATA lv_record_data TYPE /aws1/knsdata. + DATA lv_stream_name TYPE /aws1/knsstreamname. + DATA lv_shardid TYPE /aws1/knsshardid. + + DATA(lv_data) = /aws1/cl_rt_util=>string_to_xstring( + `{` && + `"word": "This",` && + `"word": "is"` && + `"word": "a"` && + `"word": "code"` && + `"word": "example"` && + `}` ). + + CONSTANTS cv_shard_count TYPE /aws1/knspositiveintegerobject VALUE 1. + CONSTANTS cv_partition_key TYPE /aws1/knspartitionkey VALUE '123'. + CONSTANTS cv_sharditeratortype TYPE /aws1/knssharditeratortype VALUE 'TRIM_HORIZON'. + + "Define name. + DATA(lv_uuid_16) = cl_system_uuid=>create_uuid_x16_static( ). + lv_stream_name = 'code-example-kns-stream-' && lv_uuid_16. + TRANSLATE lv_stream_name TO LOWER CASE. + + ao_kns_scenario->getting_started_with_kns( + EXPORTING + iv_stream_name = lv_stream_name + iv_shard_count = cv_shard_count + iv_partition_key = cv_partition_key + iv_sharditeratortype = cv_sharditeratortype + iv_data = lv_data + IMPORTING + oo_result = lo_get_record_output ). + + lt_record_list = lo_get_record_output->get_records( ). + + "Validation. + LOOP AT lt_record_list INTO DATA(lo_record). + lv_record_data = lo_record->get_data( ). + ENDLOOP. + + IF lv_record_data = lv_data. + DATA(lv_found) = abap_true. + ENDIF. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Record not found| ). + + lv_found = abap_true. + IF ao_kns->liststreams( iv_exclusivestartstreamname = lv_stream_name )->has_streamnames( ) = 'X'. + lv_found = abap_false. + ENDIF. + + cl_abap_unit_assert=>assert_false( + act = lv_found + msg = |Stream not deleted| ). + ENDMETHOD. + +ENDCLASS. diff --git a/sap-abap/services/kns/#awsex#cl_kns_scenarios.clas.xml b/sap-abap/services/kns/#awsex#cl_kns_scenarios.clas.xml new file mode 100644 index 00000000000..d107b139638 --- /dev/null +++ b/sap-abap/services/kns/#awsex#cl_kns_scenarios.clas.xml @@ -0,0 +1,25 @@ + + + + + + /AWSEX/CL_KNS_SCENARIOS + E + Kinesis Code Example Scenarios + 1 + X + X + X + X + + + + GETTING_STARTED_WITH_KNS + /AWS1/CX_RT_GENERIC + E + AWS SDK Generic Exception + + + + + diff --git a/sap-abap/services/kns/package.devc.xml b/sap-abap/services/kns/package.devc.xml new file mode 100644 index 00000000000..f465ebf6d25 --- /dev/null +++ b/sap-abap/services/kns/package.devc.xml @@ -0,0 +1,10 @@ + + + + + + Package for Amazon Kinesis + + + + diff --git a/sap-abap/services/lmd/#awsex#cl_lmd_actions.clas.abap b/sap-abap/services/lmd/#awsex#cl_lmd_actions.clas.abap new file mode 100644 index 00000000000..7c3c66d309b --- /dev/null +++ b/sap-abap/services/lmd/#awsex#cl_lmd_actions.clas.abap @@ -0,0 +1,278 @@ +CLASS /awsex/cl_lmd_actions DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + PROTECTED SECTION. + PRIVATE SECTION. + + METHODS create_function + IMPORTING + !iv_function_name TYPE /aws1/lmdfunctionname + !iv_role_arn TYPE /aws1/lmdrolearn + !iv_handler TYPE /aws1/lmdhandler + !io_zip_file TYPE REF TO /aws1/cl_lmdfunctioncode + RAISING /aws1/cx_rt_generic. + METHODS get_function + IMPORTING + !iv_function_name TYPE /aws1/lmdnamespacedfuncname + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_lmdgetfuncresponse + RAISING /aws1/cx_rt_generic. + METHODS list_functions + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_lmdlistfuncsresponse + RAISING /aws1/cx_rt_generic. + METHODS invoke_function + IMPORTING + !iv_function_name TYPE /aws1/lmdnamespacedfuncname + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_lmdinvocationresponse + RAISING /aws1/cx_rt_generic. + METHODS update_function_code + IMPORTING + !iv_function_name TYPE /aws1/lmdfunctionname + !io_zip_file TYPE /aws1/lmdblob + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_lmdfunctionconf + RAISING /aws1/cx_rt_generic. + METHODS update_function_configuration + IMPORTING + !iv_function_name TYPE /aws1/lmdruntime + !iv_runtime TYPE /aws1/lmdhandler + !iv_memory_size TYPE /aws1/lmdmemorysize + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_lmdfunctionconf + RAISING /aws1/cx_rt_generic. + METHODS delete_function + IMPORTING + !iv_function_name TYPE /aws1/lmdfunctionname + RAISING /aws1/cx_rt_generic. +ENDCLASS. + + + +CLASS /AWSEX/CL_LMD_ACTIONS IMPLEMENTATION. + + + METHOD create_function. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_lmd) = /aws1/cl_lmd_factory=>create( lo_session ). + + " snippet-start:[lmd.abapv1.create_function] + TRY. + lo_lmd->createfunction( + iv_functionname = iv_function_name + iv_runtime = `python3.9` + iv_role = iv_role_arn + iv_handler = iv_handler + io_code = io_zip_file + iv_description = 'AWS Lambda code example' ). + MESSAGE 'Lambda function created.' TYPE 'I'. + CATCH /aws1/cx_lmdcodesigningcfgno00. + MESSAGE 'Code signing configuration does not exist.' TYPE 'E'. + CATCH /aws1/cx_lmdcodestorageexcdex. + MESSAGE 'Maximum total code size per account exceeded.' TYPE 'E'. + CATCH /aws1/cx_lmdcodeverification00. + MESSAGE 'Code signature failed one or more validation checks for signature mismatch or expiration.' TYPE 'E'. + CATCH /aws1/cx_lmdinvalidcodesigex. + MESSAGE 'Code signature failed the integrity check.' TYPE 'E'. + CATCH /aws1/cx_lmdinvparamvalueex. + MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. + CATCH /aws1/cx_lmdresourceconflictex. + MESSAGE 'Resource already exists or another operation is in progress.' TYPE 'E'. + CATCH /aws1/cx_lmdresourcenotfoundex. + MESSAGE 'The requested resource does not exist.' TYPE 'E'. + CATCH /aws1/cx_lmdserviceexception. + MESSAGE 'An internal problem was encountered by the AWS Lambda service.' TYPE 'E'. + CATCH /aws1/cx_lmdtoomanyrequestsex. + MESSAGE 'The maximum request throughput was reached.' TYPE 'E'. + ENDTRY. + " snippet-end:[lmd.abapv1.create_function] + ENDMETHOD. + + + METHOD delete_function. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_lmd) = /aws1/cl_lmd_factory=>create( lo_session ). + + " snippet-start:[lmd.abapv1.delete_function] + TRY. + lo_lmd->deletefunction( iv_functionname = iv_function_name ). + MESSAGE 'Lambda function deleted.' TYPE 'I'. + CATCH /aws1/cx_lmdinvparamvalueex. + MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. + CATCH /aws1/cx_lmdresourceconflictex. + MESSAGE 'Resource already exists or another operation is in progress.' TYPE 'E'. + CATCH /aws1/cx_lmdresourcenotfoundex. + MESSAGE 'The requested resource does not exist.' TYPE 'E'. + CATCH /aws1/cx_lmdserviceexception. + MESSAGE 'An internal problem was encountered by the AWS Lambda service.' TYPE 'E'. + CATCH /aws1/cx_lmdtoomanyrequestsex. + MESSAGE 'The maximum request throughput was reached.' TYPE 'E'. + ENDTRY. + " snippet-end:[lmd.abapv1.delete_function] + ENDMETHOD. + + + METHOD get_function. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_lmd) = /aws1/cl_lmd_factory=>create( lo_session ). + + " snippet-start:[lmd.abapv1.get_function] + TRY. + oo_result = lo_lmd->getfunction( iv_functionname = iv_function_name ). " oo_result is returned for testing purposes. " + MESSAGE 'Lambda function information retrieved.' TYPE 'I'. + CATCH /aws1/cx_lmdinvparamvalueex. + MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. + CATCH /aws1/cx_lmdserviceexception. + MESSAGE 'An internal problem was encountered by the AWS Lambda service.' TYPE 'E'. + CATCH /aws1/cx_lmdtoomanyrequestsex. + MESSAGE 'The maximum request throughput was reached.' TYPE 'E'. + ENDTRY. + " snippet-end:[lmd.abapv1.get_function] + ENDMETHOD. + + + METHOD invoke_function. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_lmd) = /aws1/cl_lmd_factory=>create( lo_session ). + + " snippet-start:[lmd.abapv1.invoke_function] + TRY. + DATA(lv_json) = /aws1/cl_rt_util=>string_to_xstring( + `{` && + `"action": "increment",` && + `"number": 10` && + `}` ). + oo_result = lo_lmd->invoke( " oo_result is returned for testing purposes. " + iv_functionname = iv_function_name + iv_payload = lv_json ). + MESSAGE 'Lambda function invoked.' TYPE 'I'. + CATCH /aws1/cx_lmdinvparamvalueex. + MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. + CATCH /aws1/cx_lmdinvrequestcontex. + MESSAGE 'Unable to parse request body as JSON.' TYPE 'E'. + CATCH /aws1/cx_lmdinvalidzipfileex. + MESSAGE 'The deployment package could not be unzipped.' TYPE 'E'. + CATCH /aws1/cx_lmdrequesttoolargeex. + MESSAGE 'Invoke request body JSON input limit was exceeded by the request payload.' TYPE 'E'. + CATCH /aws1/cx_lmdresourceconflictex. + MESSAGE 'Resource already exists or another operation is in progress.' TYPE 'E'. + CATCH /aws1/cx_lmdresourcenotfoundex. + MESSAGE 'The requested resource does not exist.' TYPE 'E'. + CATCH /aws1/cx_lmdserviceexception. + MESSAGE 'An internal problem was encountered by the AWS Lambda service.' TYPE 'E'. + CATCH /aws1/cx_lmdtoomanyrequestsex. + MESSAGE 'The maximum request throughput was reached.' TYPE 'E'. + CATCH /aws1/cx_lmdunsuppedmediatyp00. + MESSAGE 'Invoke request body does not have JSON as its content type.' TYPE 'E'. + ENDTRY. + " snippet-end:[lmd.abapv1.invoke_function] + ENDMETHOD. + + + METHOD list_functions. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_lmd) = /aws1/cl_lmd_factory=>create( lo_session ). + + " snippet-start:[lmd.abapv1.list_functions] + TRY. + oo_result = lo_lmd->listfunctions( ). " oo_result is returned for testing purposes. " + DATA(lt_functions) = oo_result->get_functions( ). + MESSAGE 'Retrieved list of Lambda functions.' TYPE 'I'. + CATCH /aws1/cx_lmdinvparamvalueex. + MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. + CATCH /aws1/cx_lmdserviceexception. + MESSAGE 'An internal problem was encountered by the AWS Lambda service.' TYPE 'E'. + CATCH /aws1/cx_lmdtoomanyrequestsex. + MESSAGE 'The maximum request throughput was reached.' TYPE 'E'. + ENDTRY. + " snippet-end:[lmd.abapv1.list_functions] + ENDMETHOD. + + + METHOD update_function_code. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_lmd) = /aws1/cl_lmd_factory=>create( lo_session ). + + " snippet-start:[lmd.abapv1.update_function_code] + TRY. + oo_result = lo_lmd->updatefunctioncode( " oo_result is returned for testing purposes. " + iv_functionname = iv_function_name + iv_zipfile = io_zip_file ). + + MESSAGE 'Lambda function code updated.' TYPE 'I'. + CATCH /aws1/cx_lmdcodesigningcfgno00. + MESSAGE 'Code signing configuration does not exist.' TYPE 'E'. + CATCH /aws1/cx_lmdcodestorageexcdex. + MESSAGE 'Maximum total code size per account exceeded.' TYPE 'E'. + CATCH /aws1/cx_lmdcodeverification00. + MESSAGE 'Code signature failed one or more validation checks for signature mismatch or expiration.' TYPE 'E'. + CATCH /aws1/cx_lmdinvalidcodesigex. + MESSAGE 'Code signature failed the integrity check.' TYPE 'E'. + CATCH /aws1/cx_lmdinvparamvalueex. + MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. + CATCH /aws1/cx_lmdresourceconflictex. + MESSAGE 'Resource already exists or another operation is in progress.' TYPE 'E'. + CATCH /aws1/cx_lmdresourcenotfoundex. + MESSAGE 'The requested resource does not exist.' TYPE 'E'. + CATCH /aws1/cx_lmdserviceexception. + MESSAGE 'An internal problem was encountered by the AWS Lambda service.' TYPE 'E'. + CATCH /aws1/cx_lmdtoomanyrequestsex. + MESSAGE 'The maximum request throughput was reached.' TYPE 'E'. + ENDTRY. + " snippet-end:[lmd.abapv1.update_function_code] + ENDMETHOD. + + + METHOD update_function_configuration. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_lmd) = /aws1/cl_lmd_factory=>create( lo_session ). + + " snippet-start:[lmd.abapv1.update_function_configuration] + TRY. + oo_result = lo_lmd->updatefunctionconfiguration( " oo_result is returned for testing purposes. " + iv_functionname = iv_function_name + iv_runtime = iv_runtime + iv_description = 'Updated Lambda function' + iv_memorysize = iv_memory_size ). + + MESSAGE 'Lambda function configuration/settings updated.' TYPE 'I'. + CATCH /aws1/cx_lmdcodesigningcfgno00. + MESSAGE 'Code signing configuration does not exist.' TYPE 'E'. + CATCH /aws1/cx_lmdcodeverification00. + MESSAGE 'Code signature failed one or more validation checks for signature mismatch or expiration.' TYPE 'E'. + CATCH /aws1/cx_lmdinvalidcodesigex. + MESSAGE 'Code signature failed the integrity check.' TYPE 'E'. + CATCH /aws1/cx_lmdinvparamvalueex. + MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. + CATCH /aws1/cx_lmdresourceconflictex. + MESSAGE 'Resource already exists or another operation is in progress.' TYPE 'E'. + CATCH /aws1/cx_lmdresourcenotfoundex. + MESSAGE 'The requested resource does not exist.' TYPE 'E'. + CATCH /aws1/cx_lmdserviceexception. + MESSAGE 'An internal problem was encountered by the AWS Lambda service.' TYPE 'E'. + CATCH /aws1/cx_lmdtoomanyrequestsex. + MESSAGE 'The maximum request throughput was reached.' TYPE 'E'. + ENDTRY. + " snippet-end:[lmd.abapv1.update_function_configuration] + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/lmd/#awsex#cl_lmd_actions.clas.testclasses.abap b/sap-abap/services/lmd/#awsex#cl_lmd_actions.clas.testclasses.abap new file mode 100644 index 00000000000..481d22a1113 --- /dev/null +++ b/sap-abap/services/lmd/#awsex#cl_lmd_actions.clas.testclasses.abap @@ -0,0 +1,332 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 + +CLASS ltc_awsex_cl_lmd_actions DEFINITION DEFERRED. +CLASS /awsex/cl_lmd_actions DEFINITION LOCAL FRIENDS ltc_awsex_cl_lmd_actions. + +CLASS ltc_awsex_cl_lmd_actions DEFINITION FOR TESTING DURATION SHORT RISK LEVEL DANGEROUS. + + PRIVATE SECTION. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA ao_lmd TYPE REF TO /aws1/if_lmd. + DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. + DATA ao_lmd_actions TYPE REF TO /awsex/cl_lmd_actions. + DATA av_lrole TYPE /aws1/lmdrolearn. + CONSTANTS cv_create_function_name TYPE /aws1/lmdfunctionname VALUE 'code-example-create-function'. + CONSTANTS cv_misc_function_name TYPE /aws1/lmdfunctionname VALUE 'code-example-misce-function'. + CONSTANTS cv_del_function_name TYPE /aws1/lmdfunctionname VALUE 'code-example-delete-function'. + + METHODS: create_function FOR TESTING RAISING /aws1/cx_rt_generic, + get_function FOR TESTING RAISING /aws1/cx_rt_generic, + list_functions FOR TESTING RAISING /aws1/cx_rt_generic, + invoke_function FOR TESTING RAISING /aws1/cx_rt_generic, + update_function_code FOR TESTING RAISING /aws1/cx_rt_generic, + update_function_configuration FOR TESTING RAISING /aws1/cx_rt_generic, + delete_function FOR TESTING RAISING /aws1/cx_rt_generic. + + METHODS setup RAISING /aws1/cx_rt_generic /awsex/cx_generic. + METHODS teardown RAISING /aws1/cx_rt_generic /awsex/cx_generic. + METHODS: + create_code + RETURNING VALUE(oo_code) TYPE REF TO /aws1/cl_lmdfunctioncode + RAISING /aws1/cx_rt_generic, + update_code + RETURNING VALUE(oo_code) TYPE /aws1/lmdblob + RAISING /aws1/cx_rt_generic, + create_lambda_function + IMPORTING iv_function_name TYPE /aws1/lmdfunctionname + RAISING /aws1/cx_rt_generic, + verify_lambda_state + IMPORTING iv_function_name TYPE /aws1/lmdfunctionname + RAISING /aws1/cx_rt_generic, + assert_lambda_result + IMPORTING + iv_payload TYPE /aws1/lmdblob + iv_exp TYPE i + RAISING /aws1/cx_rt_generic. + +ENDCLASS. + +CLASS ltc_awsex_cl_lmd_actions IMPLEMENTATION. + + METHOD setup. + ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). + ao_lmd = /aws1/cl_lmd_factory=>create( ao_session ). + ao_lmd_actions = NEW /awsex/cl_lmd_actions( ). + + DATA(lt_roles) = ao_session->get_configuration( )->get_logical_iam_roles( ). + READ TABLE lt_roles INDEX 1 INTO DATA(lo_role). " use the first role we find in the profile, as our lambda role + av_lrole = lo_role-iam_role_arn. + + create_lambda_function( cv_misc_function_name ). + + ENDMETHOD. + METHOD teardown. + TRY. + ao_lmd->deletefunction( iv_functionname = cv_misc_function_name ). + CATCH /aws1/cx_lmdresourcenotfoundex. + ENDTRY. + TRY. + ao_lmd->deletefunction( iv_functionname = cv_create_function_name ). + CATCH /aws1/cx_lmdresourcenotfoundex. + ENDTRY. + TRY. + ao_lmd->deletefunction( iv_functionname = cv_create_function_name ). + CATCH /aws1/cx_lmdresourcenotfoundex. + ENDTRY. + ENDMETHOD. + + METHOD create_function. + ao_lmd_actions->create_function( + iv_function_name = cv_create_function_name + iv_role_arn = av_lrole + iv_handler = |lambda_function.lambda_handler| + io_zip_file = create_code( ) ). + DATA(lv_function_arn) = ao_lmd->getfunctionconfiguration( iv_functionname = cv_create_function_name )->get_functionarn( ). + cl_abap_unit_assert=>assert_not_initial( + act = lv_function_arn + msg = |Failed to create Lambda function { cv_create_function_name }| ). + ENDMETHOD. + METHOD create_code. + DATA(lo_zip) = NEW cl_abap_zip( ). + DATA(lv_code) = + |import logging\n| && + |import json\n| && + |\n| && + |logger = logging.getLogger()\n| && + |logger.setLevel(logging.INFO)\n| && + |\n| && + |def lambda_handler(event, context):\n| && + | # TODO implement\n| && + | action = event.get('action')\n| && + | if action == 'increment':\n| && + | result = event.get('number', 0) + 1\n| && + | logger.info('Calculated result of %s', result)\n| && + | else:\n| && + | logger.error("%s is not a valid action.", action)\n| && + | return \{\n| && + | 'statusCode': 200,\n| && + | 'body': json.dumps(result)\n| && + | \}\n|. + + DATA(lv_xcode) = /aws1/cl_rt_util=>string_to_xstring( lv_code ). + lo_zip->add( name = 'lambda_function.py' + content = lv_xcode ). + DATA(lv_xzip) = lo_zip->save( ). + oo_code = NEW /aws1/cl_lmdfunctioncode( iv_zipfile = lv_xzip ). + ENDMETHOD. + METHOD get_function. + DATA(lo_result) = ao_lmd_actions->get_function( cv_misc_function_name ). + + cl_abap_unit_assert=>assert_not_initial( + act = lo_result + msg = |Failed to retrieve information about Lambda function { cv_misc_function_name }| ). + + cl_abap_unit_assert=>assert_equals( + exp = cv_misc_function_name + act = lo_result->get_configuration( )->get_functionname( ) + msg = |Lambda function name did not match expected value { cv_misc_function_name }| ). + + cl_abap_unit_assert=>assert_equals( + exp = `lambda_function.lambda_handler` + act = lo_result->get_configuration( )->get_handler( ) + msg = |Handler did not match expected value| ). + + cl_abap_unit_assert=>assert_equals( + exp = av_lrole + act = lo_result->get_configuration( )->get_role( ) + msg = |Function's execution role did not match expected value { av_lrole }| ). + + cl_abap_unit_assert=>assert_equals( + exp = `python3.9` + act = lo_result->get_configuration( )->get_runtime( ) + msg = |Function's runtime did not match expected value | ). + + cl_abap_unit_assert=>assert_not_initial( + act = lo_result->get_code( )->get_location( ) + msg = |Failed to retrieve value of Lambda location/URL| ). + ENDMETHOD. + METHOD create_lambda_function. + ao_lmd->createfunction( + iv_functionname = iv_function_name + iv_runtime = `python3.9` + iv_role = av_lrole + iv_handler = `lambda_function.lambda_handler` + io_code = create_code( ) ). + ENDMETHOD. + METHOD list_functions. + DATA(lo_result) = ao_lmd_actions->list_functions( ). + + + cl_abap_unit_assert=>assert_number_between( + number = lines( lo_result->get_functions( ) ) + lower = 1 + upper = 1000000 + msg = |At least one function should have been found by ListFunctions| ). + ENDMETHOD. + METHOD invoke_function. + CONSTANTS cv_function_name TYPE /aws1/lmdfunctionname VALUE 'code-example-invoke-function'. + create_lambda_function( cv_function_name ). + verify_lambda_state( cv_function_name ). + + DATA(lo_result) = ao_lmd_actions->invoke_function( cv_function_name ). + + cl_abap_unit_assert=>assert_initial( + act = lo_result->get_functionerror( ) + msg = |Invoke function call failed with error { lo_result->get_functionerror( ) }| ). + + assert_lambda_result( + iv_payload = lo_result->ask_payload( ) + iv_exp = 11 ). + + ao_lmd->deletefunction( iv_functionname = cv_function_name ). + + ENDMETHOD. + METHOD verify_lambda_state. + WHILE ao_lmd->getfunction( iv_functionname = iv_function_name )->get_configuration( )->ask_state( ) <> 'Active'. + IF sy-index = 10. + EXIT. + ENDIF. + WAIT UP TO 1 SECONDS. + ENDWHILE. + ENDMETHOD. + METHOD assert_lambda_result. + DATA(lo_doc) = cl_ixml=>create( )->create_document( ). + CALL TRANSFORMATION id + SOURCE XML iv_payload + RESULT XML lo_doc. + + DATA(lo_iter) = lo_doc->get_first_child( )->get_children( )->create_iterator( ). + DATA(lo_node) = lo_iter->get_next( ). + + + WHILE lo_node IS NOT INITIAL. + DATA(lv_name) = lo_node->get_attributes( )->get_named_item_ns( name = 'name' )->get_value( ). + IF lv_name = 'body'. + DATA(lv_value) = lo_node->get_value( ). + ENDIF. + lo_node = lo_iter->get_next( ). + ENDWHILE. + + cl_abap_unit_assert=>assert_equals( + exp = iv_exp + act = lv_value + msg = |Invoke function response ({ lv_value }) was not as expected ({ iv_exp })| ). + ENDMETHOD. + + METHOD update_function_code. + + verify_lambda_state( cv_misc_function_name ). + + DATA(lo_update_result) = ao_lmd_actions->update_function_code( + iv_function_name = cv_misc_function_name + io_zip_file = update_code( ) ). + WAIT UP TO 10 SECONDS. + + cl_abap_unit_assert=>assert_not_initial( + act = lo_update_result + msg = |Failed to update Lambda function code| ). + + DATA(lv_json) = /aws1/cl_rt_util=>string_to_xstring( + `{` && + `"action": "decrement",` && + `"number": 10` && + `}` ). + + DATA(lo_invoke_result) = ao_lmd->invoke( + iv_functionname = cv_misc_function_name + iv_payload = lv_json ). + + cl_abap_unit_assert=>assert_initial( + act = lo_invoke_result->get_functionerror( ) + msg = |Invoke function call failed with error { lo_invoke_result->get_functionerror( ) }| ). + + assert_lambda_result( + iv_payload = lo_invoke_result->ask_payload( ) + iv_exp = 9 ). + ENDMETHOD. + METHOD update_code. + DATA(lo_zip) = NEW cl_abap_zip( ). + DATA(lv_code) = + |import logging\n| && + |import json\n| && + |\n| && + |logger = logging.getLogger()\n| && + |logger.setLevel(logging.INFO)\n| && + |\n| && + |def lambda_handler(event, context):\n| && + | # TODO implement\n| && + | action = event.get('action')\n| && + | if action == 'increment':\n| && + | result = event.get('number', 0) + 1\n| && + | logger.info('Calculated result of %s', result)\n| && + | elif action == 'decrement':\n| && + | result = event.get('number', 0) - 1\n| && + | logger.info('Calculated result of %s', result)\n| && + | else:\n| && + | logger.error("%s is not a valid action.", action)\n| && + | return \{\n| && + | 'statusCode': 200,\n| && + | 'body': json.dumps(result)\n| && + | \}\n|. + + + DATA(lv_xcode) = /aws1/cl_rt_util=>string_to_xstring( lv_code ). + lo_zip->add( name = 'lambda_function.py' + content = lv_xcode ). + oo_code = lo_zip->save( ). + ENDMETHOD. + METHOD update_function_configuration. + verify_lambda_state( cv_misc_function_name ). + + DATA(lo_result) = ao_lmd_actions->update_function_configuration( + iv_function_name = cv_misc_function_name + iv_runtime = `python3.9` + iv_memory_size = 150 ). + + cl_abap_unit_assert=>assert_not_initial( + act = lo_result + msg = |Failed to update Lambda function configuration| ). + + cl_abap_unit_assert=>assert_equals( + exp = `lambda_function.lambda_handler` + act = lo_result->get_handler( ) + msg = |Handler did not match expected value| ). + + cl_abap_unit_assert=>assert_equals( + exp = av_lrole + act = lo_result->get_role( ) + msg = |Function's execution role did not match expected value { av_lrole }| ). + + cl_abap_unit_assert=>assert_equals( + exp = `python3.9` + act = lo_result->get_runtime( ) + msg = |Function's runtime did not match expected value | ). + + cl_abap_unit_assert=>assert_equals( + exp = 'updated lambda function' + act = to_lower( lo_result->get_description( ) ) + msg = |Function's description did not match expected value | ). + + cl_abap_unit_assert=>assert_equals( + exp = 150 + act = lo_result->get_memorysize( ) + msg = |Function memory did not match expected value| ). + ENDMETHOD. + METHOD delete_function. + create_lambda_function( cv_del_function_name ). + ao_lmd_actions->delete_function( cv_del_function_name ). + + TRY. + ao_lmd->getfunction( iv_functionname = cv_del_function_name ). + " should not reach here + cl_abap_unit_assert=>assert_true( + act = abap_false + msg = |Function { cv_del_function_name } should have been deleted| ). + CATCH /aws1/cx_lmdresourcenotfoundex. + " expected this exception + ENDTRY. + + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/lmd/#awsex#cl_lmd_actions.clas.xml b/sap-abap/services/lmd/#awsex#cl_lmd_actions.clas.xml new file mode 100644 index 00000000000..b803ebece2c --- /dev/null +++ b/sap-abap/services/lmd/#awsex#cl_lmd_actions.clas.xml @@ -0,0 +1,17 @@ + + + + + + /AWSEX/CL_LMD_ACTIONS + E + Lambda Code Example Actions + 1 + X + X + X + X + + + + diff --git a/sap-abap/services/lmd/#awsex#cl_lmd_scenarios.clas.abap b/sap-abap/services/lmd/#awsex#cl_lmd_scenarios.clas.abap new file mode 100644 index 00000000000..d9870cef977 --- /dev/null +++ b/sap-abap/services/lmd/#awsex#cl_lmd_scenarios.clas.abap @@ -0,0 +1,254 @@ +CLASS /awsex/cl_lmd_scenarios DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + PROTECTED SECTION. + PRIVATE SECTION. + + METHODS getting_started_with_functions + IMPORTING + !iv_role_name TYPE /aws1/iamrolenametype + !iv_function_name TYPE /aws1/lmdfunctionname + !iv_handler TYPE /aws1/lmdhandler + !io_initial_zip_file TYPE REF TO /aws1/cl_lmdfunctioncode + !io_updated_zip_file TYPE /aws1/lmdblob + EXPORTING + !ov_updated_invoke_payload TYPE /aws1/lmdblob + !ov_initial_invoke_payload TYPE /aws1/lmdblob + RAISING /aws1/cx_rt_generic. +ENDCLASS. + + + +CLASS /AWSEX/CL_LMD_SCENARIOS IMPLEMENTATION. + + + METHOD getting_started_with_functions. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_iam) = /aws1/cl_iam_factory=>create( lo_session ). + DATA(lo_lmd) = /aws1/cl_lmd_factory=>create( lo_session ). + DATA lo_exception TYPE REF TO /aws1/cx_rt_service_generic. + + "snippet-start:[lmd.abapv1.getting_started_with_functions] + + TRY. + "Create an AWS Identity and Access Management (IAM) role that grants AWS Lambda permission to write to logs." + DATA(lv_policy_document) = `{` && + `"Version":"2012-10-17",` && + `"Statement": [` && + `{` && + `"Effect": "Allow",` && + `"Action": [` && + `"sts:AssumeRole"` && + `],` && + `"Principal": {` && + `"Service": [` && + `"lambda.amazonaws.com"` && + `]` && + `}` && + `}` && + `]` && + `}`. + TRY. + DATA(lo_create_role_output) = lo_iam->createrole( + iv_rolename = iv_role_name + iv_assumerolepolicydocument = lv_policy_document + iv_description = 'Grant lambda permission to write to logs' ). + DATA(lv_role_arn) = lo_create_role_output->get_role( )->get_arn( ). + MESSAGE 'IAM role created.' TYPE 'I'. + WAIT UP TO 10 SECONDS. " Make sure that the IAM role is ready for use. " + CATCH /aws1/cx_iamentityalrdyexex. + DATA(lo_role) = lo_iam->getrole( iv_rolename = iv_role_name ). + lv_role_arn = lo_role->get_role( )->get_arn( ). + CATCH /aws1/cx_iaminvalidinputex. + MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. + CATCH /aws1/cx_iammalformedplydocex. + MESSAGE 'Policy document in the request is malformed.' TYPE 'E'. + ENDTRY. + + TRY. + lo_iam->attachrolepolicy( + iv_rolename = iv_role_name + iv_policyarn = 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole' ). + MESSAGE 'Attached policy to the IAM role.' TYPE 'I'. + CATCH /aws1/cx_iaminvalidinputex. + MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. + CATCH /aws1/cx_iamnosuchentityex. + MESSAGE 'The requested resource entity does not exist.' TYPE 'E'. + CATCH /aws1/cx_iamplynotattachableex. + MESSAGE 'Service role policies can only be attached to the service-linked role for their service.' TYPE 'E'. + CATCH /aws1/cx_iamunmodableentityex. + MESSAGE 'Service that depends on the service-linked role is not modifiable.' TYPE 'E'. + ENDTRY. + + " Create a Lambda function and upload handler code. " + " Lambda function performs 'increment' action on a number. " + TRY. + lo_lmd->createfunction( + iv_functionname = iv_function_name + iv_runtime = `python3.9` + iv_role = lv_role_arn + iv_handler = iv_handler + io_code = io_initial_zip_file + iv_description = 'AWS Lambda code example' ). + MESSAGE 'Lambda function created.' TYPE 'I'. + CATCH /aws1/cx_lmdcodestorageexcdex. + MESSAGE 'Maximum total code size per account exceeded.' TYPE 'E'. + CATCH /aws1/cx_lmdinvparamvalueex. + MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. + CATCH /aws1/cx_lmdresourcenotfoundex. + MESSAGE 'The requested resource does not exist.' TYPE 'E'. + ENDTRY. + + " Verify the function is in Active state " + WHILE lo_lmd->getfunction( iv_functionname = iv_function_name )->get_configuration( )->ask_state( ) <> 'Active'. + IF sy-index = 10. + EXIT. " Maximum 10 seconds. " + ENDIF. + WAIT UP TO 1 SECONDS. + ENDWHILE. + + "Invoke the function with a single parameter and get results." + TRY. + DATA(lv_json) = /aws1/cl_rt_util=>string_to_xstring( + `{` && + `"action": "increment",` && + `"number": 10` && + `}` ). + DATA(lo_initial_invoke_output) = lo_lmd->invoke( + iv_functionname = iv_function_name + iv_payload = lv_json ). + ov_initial_invoke_payload = lo_initial_invoke_output->get_payload( ). " ov_initial_invoke_payload is returned for testing purposes. " + DATA(lo_writer_json) = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ). + CALL TRANSFORMATION id SOURCE XML ov_initial_invoke_payload RESULT XML lo_writer_json. + DATA(lv_result) = cl_abap_codepage=>convert_from( lo_writer_json->get_output( ) ). + MESSAGE 'Lambda function invoked.' TYPE 'I'. + CATCH /aws1/cx_lmdinvparamvalueex. + MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. + CATCH /aws1/cx_lmdinvrequestcontex. + MESSAGE 'Unable to parse request body as JSON.' TYPE 'E'. + CATCH /aws1/cx_lmdresourcenotfoundex. + MESSAGE 'The requested resource does not exist.' TYPE 'E'. + CATCH /aws1/cx_lmdunsuppedmediatyp00. + MESSAGE 'Invoke request body does not have JSON as its content type.' TYPE 'E'. + ENDTRY. + + " Update the function code and configure its Lambda environment with an environment variable. " + " Lambda function is updated to perform 'decrement' action also. " + TRY. + lo_lmd->updatefunctioncode( + iv_functionname = iv_function_name + iv_zipfile = io_updated_zip_file ). + WAIT UP TO 10 SECONDS. " Make sure that the update is completed. " + MESSAGE 'Lambda function code updated.' TYPE 'I'. + CATCH /aws1/cx_lmdcodestorageexcdex. + MESSAGE 'Maximum total code size per account exceeded.' TYPE 'E'. + CATCH /aws1/cx_lmdinvparamvalueex. + MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. + CATCH /aws1/cx_lmdresourcenotfoundex. + MESSAGE 'The requested resource does not exist.' TYPE 'E'. + ENDTRY. + + TRY. + DATA lt_variables TYPE /aws1/cl_lmdenvironmentvaria00=>tt_environmentvariables. + DATA ls_variable LIKE LINE OF lt_variables. + ls_variable-key = 'LOG_LEVEL'. + ls_variable-value = NEW /aws1/cl_lmdenvironmentvaria00( iv_value = 'info' ). + INSERT ls_variable INTO TABLE lt_variables. + + lo_lmd->updatefunctionconfiguration( + iv_functionname = iv_function_name + io_environment = NEW /aws1/cl_lmdenvironment( it_variables = lt_variables ) ). + WAIT UP TO 10 SECONDS. " Make sure that the update is completed. " + MESSAGE 'Lambda function configuration/settings updated.' TYPE 'I'. + CATCH /aws1/cx_lmdinvparamvalueex. + MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. + CATCH /aws1/cx_lmdresourceconflictex. + MESSAGE 'Resource already exists or another operation is in progress.' TYPE 'E'. + CATCH /aws1/cx_lmdresourcenotfoundex. + MESSAGE 'The requested resource does not exist.' TYPE 'E'. + ENDTRY. + + "Invoke the function with new parameters and get results. Display the execution log that's returned from the invocation." + TRY. + lv_json = /aws1/cl_rt_util=>string_to_xstring( + `{` && + `"action": "decrement",` && + `"number": 10` && + `}` ). + DATA(lo_updated_invoke_output) = lo_lmd->invoke( + iv_functionname = iv_function_name + iv_payload = lv_json ). + ov_updated_invoke_payload = lo_updated_invoke_output->get_payload( ). " ov_updated_invoke_payload is returned for testing purposes. " + lo_writer_json = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ). + CALL TRANSFORMATION id SOURCE XML ov_updated_invoke_payload RESULT XML lo_writer_json. + lv_result = cl_abap_codepage=>convert_from( lo_writer_json->get_output( ) ). + MESSAGE 'Lambda function invoked.' TYPE 'I'. + CATCH /aws1/cx_lmdinvparamvalueex. + MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. + CATCH /aws1/cx_lmdinvrequestcontex. + MESSAGE 'Unable to parse request body as JSON.' TYPE 'E'. + CATCH /aws1/cx_lmdresourcenotfoundex. + MESSAGE 'The requested resource does not exist.' TYPE 'E'. + CATCH /aws1/cx_lmdunsuppedmediatyp00. + MESSAGE 'Invoke request body does not have JSON as its content type.' TYPE 'E'. + ENDTRY. + + " List the functions for your account. " + TRY. + DATA(lo_list_output) = lo_lmd->listfunctions( ). + DATA(lt_functions) = lo_list_output->get_functions( ). + MESSAGE 'Retrieved list of Lambda functions.' TYPE 'I'. + CATCH /aws1/cx_lmdinvparamvalueex. + MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. + ENDTRY. + + " Delete the Lambda function. " + TRY. + lo_lmd->deletefunction( iv_functionname = iv_function_name ). + MESSAGE 'Lambda function deleted.' TYPE 'I'. + CATCH /aws1/cx_lmdinvparamvalueex. + MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. + CATCH /aws1/cx_lmdresourcenotfoundex. + MESSAGE 'The requested resource does not exist.' TYPE 'W'. + ENDTRY. + + " Detach role policy. " + TRY. + lo_iam->detachrolepolicy( + iv_rolename = iv_role_name + iv_policyarn = 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole' ). + MESSAGE 'Detached policy from the IAM role.' TYPE 'I'. + CATCH /aws1/cx_iaminvalidinputex. + MESSAGE 'The request contains a non-valid parameter.' TYPE 'E'. + CATCH /aws1/cx_iamnosuchentityex. + MESSAGE 'The requested resource entity does not exist.' TYPE 'W'. + CATCH /aws1/cx_iamplynotattachableex. + MESSAGE 'Service role policies can only be attached to the service-linked role for their service.' TYPE 'E'. + CATCH /aws1/cx_iamunmodableentityex. + MESSAGE 'Service that depends on the service-linked role is not modifiable.' TYPE 'E'. + ENDTRY. + + " Delete the IAM role. " + TRY. + lo_iam->deleterole( iv_rolename = iv_role_name ). + MESSAGE 'IAM role deleted.' TYPE 'I'. + CATCH /aws1/cx_iamnosuchentityex. + MESSAGE 'The requested resource entity does not exist.' TYPE 'W'. + CATCH /aws1/cx_iamunmodableentityex. + MESSAGE 'Service that depends on the service-linked role is not modifiable.' TYPE 'E'. + ENDTRY. + + CATCH /aws1/cx_rt_service_generic INTO lo_exception. + DATA(lv_error) = lo_exception->get_longtext( ). + MESSAGE lv_error TYPE 'E'. + ENDTRY. + "snippet-end:[lmd.abapv1.getting_started_with_functions] + + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/lmd/#awsex#cl_lmd_scenarios.clas.testclasses.abap b/sap-abap/services/lmd/#awsex#cl_lmd_scenarios.clas.testclasses.abap new file mode 100644 index 00000000000..828ab8aee91 --- /dev/null +++ b/sap-abap/services/lmd/#awsex#cl_lmd_scenarios.clas.testclasses.abap @@ -0,0 +1,165 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 + +CLASS ltc_awsex_cl_lmd_scenario DEFINITION DEFERRED. +CLASS /awsex/cl_lmd_scenarios DEFINITION LOCAL FRIENDS ltc_awsex_cl_lmd_scenario. + +CLASS ltc_awsex_cl_lmd_scenario DEFINITION FOR TESTING DURATION SHORT RISK LEVEL DANGEROUS. + + PRIVATE SECTION. + CONSTANTS: cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO', + cv_function_name TYPE /aws1/lmdfunctionname VALUE 'code-example-function-scenario'. + + DATA ao_lmd TYPE REF TO /aws1/if_lmd. + DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. + DATA ao_lmd_scenario TYPE REF TO /awsex/cl_lmd_scenarios. + + METHODS getting_started_scenario FOR TESTING RAISING /aws1/cx_rt_generic. + + METHODS: setup RAISING /aws1/cx_rt_generic /awsex/cx_generic, + teardown RAISING /aws1/cx_rt_generic /awsex/cx_generic, + create_code + RETURNING VALUE(oo_code) TYPE REF TO /aws1/cl_lmdfunctioncode + RAISING /aws1/cx_rt_generic, + update_code + RETURNING VALUE(oo_code) TYPE /aws1/lmdblob + RAISING /aws1/cx_rt_generic, + assert_lambda_result + IMPORTING + iv_payload TYPE /aws1/lmdblob + iv_exp TYPE i + RAISING /aws1/cx_rt_generic. + +ENDCLASS. + +CLASS ltc_awsex_cl_lmd_scenario IMPLEMENTATION. + + METHOD setup. + ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). + ao_lmd = /aws1/cl_lmd_factory=>create( ao_session ). + ao_lmd_scenario = NEW /awsex/cl_lmd_scenarios( ). + + ENDMETHOD. + METHOD teardown. + TRY. + ao_lmd->deletefunction( iv_functionname = cv_function_name ). + CATCH cx_root. + ENDTRY. + ENDMETHOD. + + METHOD getting_started_scenario. + DATA lv_initial_invoke_payload TYPE /aws1/lmdblob. + DATA lv_updated_invoke_payload TYPE /aws1/lmdblob. + ao_lmd_scenario->getting_started_with_functions( + EXPORTING + iv_role_name = 'code-example-lambda-role-write-logs' + iv_function_name = cv_function_name + iv_handler = |lambda_function.lambda_handler| + io_initial_zip_file = create_code( ) + io_updated_zip_file = update_code( ) + IMPORTING + ov_initial_invoke_payload = lv_initial_invoke_payload + ov_updated_invoke_payload = lv_updated_invoke_payload ). + assert_lambda_result( + iv_payload = lv_initial_invoke_payload + iv_exp = 11 ). + + assert_lambda_result( + iv_payload = lv_updated_invoke_payload + iv_exp = 9 ). + + + LOOP AT ao_lmd->listfunctions( )->get_functions( ) INTO DATA(lo_function). + IF lo_function->get_functionname( ) = cv_function_name. + DATA(lv_found) = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_false( + act = lv_found + msg = |Function { cv_function_name } should have been deleted| ). + + ENDMETHOD. + METHOD create_code. + DATA(lo_zip) = NEW cl_abap_zip( ). + DATA(lv_code) = + |import logging\n| && + |import json\n| && + |\n| && + |logger = logging.getLogger()\n| && + |logger.setLevel(logging.INFO)\n| && + |\n| && + |def lambda_handler(event, context):\n| && + | # TODO implement\n| && + | action = event.get('action')\n| && + | if action == 'increment':\n| && + | result = event.get('number', 0) + 1\n| && + | logger.info('Calculated result of %s', result)\n| && + | else:\n| && + | logger.error("%s is not a valid action.", action)\n| && + | return \{\n| && + | 'statusCode': 200,\n| && + | 'body': json.dumps(result)\n| && + | \}\n|. + + DATA(lv_xcode) = /aws1/cl_rt_util=>string_to_xstring( lv_code ). + lo_zip->add( name = 'lambda_function.py' + content = lv_xcode ). + DATA(lv_xzip) = lo_zip->save( ). + oo_code = NEW /aws1/cl_lmdfunctioncode( iv_zipfile = lv_xzip ). + ENDMETHOD. + METHOD update_code. + DATA(lo_zip) = NEW cl_abap_zip( ). + DATA(lv_code) = + |import logging\n| && + |import json\n| && + |\n| && + |logger = logging.getLogger()\n| && + |logger.setLevel(logging.INFO)\n| && + |\n| && + |def lambda_handler(event, context):\n| && + | # TODO implement\n| && + | action = event.get('action')\n| && + | if action == 'increment':\n| && + | result = event.get('number', 0) + 1\n| && + | logger.info('Calculated result of %s', result)\n| && + | elif action == 'decrement':\n| && + | result = event.get('number', 0) - 1\n| && + | logger.info('Calculated result of %s', result)\n| && + | else:\n| && + | logger.error("%s is not a valid action.", action)\n| && + | return \{\n| && + | 'statusCode': 200,\n| && + | 'body': json.dumps(result)\n| && + | \}\n|. + + + DATA(lv_xcode) = /aws1/cl_rt_util=>string_to_xstring( lv_code ). + lo_zip->add( name = 'lambda_function.py' + content = lv_xcode ). + oo_code = lo_zip->save( ). + ENDMETHOD. + METHOD assert_lambda_result. + DATA(lo_doc) = cl_ixml=>create( )->create_document( ). + CALL TRANSFORMATION id + SOURCE XML iv_payload + RESULT XML lo_doc. + + DATA(lo_iter) = lo_doc->get_first_child( )->get_children( )->create_iterator( ). + DATA(lo_node) = lo_iter->get_next( ). + + + WHILE lo_node IS NOT INITIAL. + DATA(lv_name) = lo_node->get_attributes( )->get_named_item_ns( name = 'name' )->get_value( ). + IF lv_name = 'body'. + DATA(lv_value) = lo_node->get_value( ). + ENDIF. + lo_node = lo_iter->get_next( ). + ENDWHILE. + + cl_abap_unit_assert=>assert_equals( + exp = iv_exp + act = lv_value + msg = |Invoke function response ({ lv_value }) was not as expected ({ iv_exp })| ). + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/lmd/#awsex#cl_lmd_scenarios.clas.xml b/sap-abap/services/lmd/#awsex#cl_lmd_scenarios.clas.xml new file mode 100644 index 00000000000..58b8817b942 --- /dev/null +++ b/sap-abap/services/lmd/#awsex#cl_lmd_scenarios.clas.xml @@ -0,0 +1,17 @@ + + + + + + /AWSEX/CL_LMD_SCENARIOS + E + Lambda Code Example Scenarios + 1 + X + X + X + X + + + + diff --git a/sap-abap/services/lmd/package.devc.xml b/sap-abap/services/lmd/package.devc.xml new file mode 100644 index 00000000000..e71a89f3fc1 --- /dev/null +++ b/sap-abap/services/lmd/package.devc.xml @@ -0,0 +1,10 @@ + + + + + + Package for AWS Lambda + + + + diff --git a/sap-abap/services/s3/#awsex#cl_s3_actions.clas.abap b/sap-abap/services/s3/#awsex#cl_s3_actions.clas.abap new file mode 100644 index 00000000000..330e4399d39 --- /dev/null +++ b/sap-abap/services/s3/#awsex#cl_s3_actions.clas.abap @@ -0,0 +1,243 @@ +CLASS /awsex/cl_s3_actions DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + METHODS create_bucket + IMPORTING + !iv_bucket_name TYPE /aws1/s3_bucketname + RAISING /aws1/cx_rt_generic. + METHODS put_object + IMPORTING + !iv_bucket_name TYPE /aws1/s3_bucketname + !iv_file_name TYPE /aws1/s3_objectkey + RAISING /aws1/cx_rt_generic. + METHODS get_object + IMPORTING + !iv_bucket_name TYPE /aws1/s3_bucketname + !iv_object_key TYPE /aws1/s3_objectkey + EXPORTING + !oo_result TYPE REF TO /aws1/cl_s3_getobjectoutput + RAISING /aws1/cx_rt_generic. + METHODS copy_object + IMPORTING + !iv_dest_bucket TYPE /aws1/s3_bucketname + !iv_dest_object TYPE /aws1/s3_objectkey + !iv_src_bucket TYPE /aws1/s3_bucketname + !iv_src_object TYPE /aws1/s3_objectkey + RAISING /aws1/cx_rt_generic. + METHODS list_objects + IMPORTING + !iv_bucket_name TYPE /aws1/s3_bucketname + EXPORTING + !oo_result TYPE REF TO /aws1/cl_s3_listobjectsoutput + RAISING /aws1/cx_rt_generic. + METHODS delete_object + IMPORTING + !iv_bucket_name TYPE /aws1/s3_bucketname + !iv_object_key TYPE /aws1/s3_objectkey + RAISING /aws1/cx_rt_generic. + METHODS delete_bucket + IMPORTING + !iv_bucket_name TYPE /aws1/s3_bucketname + RAISING /aws1/cx_rt_generic. + METHODS list_objects_v2 + IMPORTING + !iv_bucket_name TYPE /aws1/s3_bucketname + EXPORTING + !oo_result TYPE REF TO /aws1/cl_s3_listobjsv2output + RAISING /aws1/cx_rt_generic. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS /AWSEX/CL_S3_ACTIONS IMPLEMENTATION. + + + METHOD copy_object. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ). + + "snippet-start:[s3.abapv1.copy_object] + TRY. + lo_s3->copyobject( + iv_bucket = iv_dest_bucket + iv_key = iv_dest_object + iv_copysource = |{ iv_src_bucket }/{ iv_src_object }| ). + MESSAGE 'Object copied to another bucket.' TYPE 'I'. + CATCH /aws1/cx_s3_nosuchbucket. + MESSAGE 'Bucket does not exist.' TYPE 'E'. + CATCH /aws1/cx_s3_nosuchkey. + MESSAGE 'Object key does not exist.' TYPE 'E'. + ENDTRY. + "snippet-end:[s3.abapv1.copy_object] + ENDMETHOD. + + + METHOD create_bucket. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ). + + " snippet-start:[s3.abapv1.create_bucket] + TRY. + " determine our region from our session + DATA(lv_region) = CONV /aws1/s3_bucketlocationcnstrnt( lo_session->get_region( ) ). + DATA lo_constraint TYPE REF TO /aws1/cl_s3_createbucketconf. + " When in the us-east-1 region, you must not specify a constraint + " In all other regions, specify the region as the constraint + IF lv_region = 'us-east-1'. + CLEAR lo_constraint. + ELSE. + lo_constraint = NEW /aws1/cl_s3_createbucketconf( lv_region ). + ENDIF. + + lo_s3->createbucket( + iv_bucket = iv_bucket_name + io_createbucketconfiguration = lo_constraint ). + MESSAGE 'S3 bucket created.' TYPE 'I'. + CATCH /aws1/cx_s3_bucketalrdyexists. + MESSAGE 'Bucket name already exists.' TYPE 'E'. + CATCH /aws1/cx_s3_bktalrdyownedbyyou. + MESSAGE 'Bucket already exists and is owned by you.' TYPE 'E'. + ENDTRY. + " snippet-end:[s3.abapv1.create_bucket] + ENDMETHOD. + + + METHOD delete_bucket. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ). + + "snippet-start:[s3.abapv1.delete_bucket] + TRY. + + lo_s3->deletebucket( + iv_bucket = iv_bucket_name ). + MESSAGE 'Deleted S3 bucket.' TYPE 'I'. + CATCH /aws1/cx_s3_nosuchbucket. + MESSAGE 'Bucket does not exist.' TYPE 'E'. + ENDTRY. + "snippet-end:[s3.abapv1.delete_bucket] + + ENDMETHOD. + + + METHOD delete_object. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ). + + "snippet-start:[s3.abapv1.delete_object] + TRY. + lo_s3->deleteobject( + iv_bucket = iv_bucket_name + iv_key = iv_object_key ). + MESSAGE 'Object deleted from S3 bucket.' TYPE 'I'. + CATCH /aws1/cx_s3_nosuchbucket. + MESSAGE 'Bucket does not exist.' TYPE 'E'. + ENDTRY. + "snippet-end:[s3.abapv1.delete_object] + ENDMETHOD. + + + METHOD get_object. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ). + + "snippet-start:[s3.abapv1.get_object] + TRY. + oo_result = lo_s3->getobject( " oo_result is returned for testing purposes. " + iv_bucket = iv_bucket_name + iv_key = iv_object_key ). + DATA(lv_object_data) = oo_result->get_body( ). + MESSAGE 'Object retrieved from S3 bucket.' TYPE 'I'. + CATCH /aws1/cx_s3_nosuchbucket. + MESSAGE 'Bucket does not exist.' TYPE 'E'. + CATCH /aws1/cx_s3_nosuchkey. + MESSAGE 'Object key does not exist.' TYPE 'E'. + ENDTRY. + "snippet-end:[s3.abapv1.get_object] + + ENDMETHOD. + + + METHOD list_objects. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ). + + "snippet-start:[s3.abapv1.list_objects] + TRY. + oo_result = lo_s3->listobjects( " oo_result is returned for testing purposes. " + iv_bucket = iv_bucket_name ). + MESSAGE 'Retrieved list of objects in S3 bucket.' TYPE 'I'. + CATCH /aws1/cx_s3_nosuchbucket. + MESSAGE 'Bucket does not exist.' TYPE 'E'. + ENDTRY. + "snippet-end:[s3.abapv1.list_objects] + ENDMETHOD. + + + METHOD list_objects_v2. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ). + + "snippet-start:[s3.abapv1.list_objects_v2] + TRY. + oo_result = lo_s3->listobjectsv2( " oo_result is returned for testing purposes. " + iv_bucket = iv_bucket_name ). + MESSAGE 'Retrieved list of objects in S3 bucket.' TYPE 'I'. + CATCH /aws1/cx_s3_nosuchbucket. + MESSAGE 'Bucket does not exist.' TYPE 'E'. + ENDTRY. + "snippet-end:[s3.abapv1.list_objects_v2] + ENDMETHOD. + + + METHOD put_object. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ). + + "snippet-start:[s3.abapv1.put_object] + + "Get contents of file from application server." + DATA lv_body TYPE xstring. + OPEN DATASET iv_file_name FOR INPUT IN BINARY MODE. + READ DATASET iv_file_name INTO lv_body. + CLOSE DATASET iv_file_name. + + "Upload/put an object to an S3 bucket." + TRY. + lo_s3->putobject( + iv_bucket = iv_bucket_name + iv_key = iv_file_name + iv_body = lv_body ). + MESSAGE 'Object uploaded to S3 bucket.' TYPE 'I'. + CATCH /aws1/cx_s3_nosuchbucket. + MESSAGE 'Bucket does not exist.' TYPE 'E'. + ENDTRY. + + "snippet-end:[s3.abapv1.put_object] + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/s3/#awsex#cl_s3_actions.clas.testclasses.abap b/sap-abap/services/s3/#awsex#cl_s3_actions.clas.testclasses.abap new file mode 100644 index 00000000000..9a05032ac30 --- /dev/null +++ b/sap-abap/services/s3/#awsex#cl_s3_actions.clas.testclasses.abap @@ -0,0 +1,320 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 + +CLASS ltc_awsex_cl_s3_actions DEFINITION DEFERRED. +CLASS /awsex/cl_s3_actions DEFINITION LOCAL FRIENDS ltc_awsex_cl_s3_actions. + +CLASS ltc_awsex_cl_s3_actions DEFINITION FOR TESTING DURATION SHORT RISK LEVEL DANGEROUS. + + PRIVATE SECTION. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + + CLASS-DATA av_bucket TYPE /aws1/s3_bucketname. + CLASS-DATA av_bucket_create TYPE /aws1/s3_bucketname. + CLASS-DATA av_bucket_delete TYPE /aws1/s3_bucketname. + CLASS-DATA av_src_bucket TYPE /aws1/s3_bucketname. + CLASS-DATA av_dest_bucket TYPE /aws1/s3_bucketname. + + CLASS-DATA ao_s3 TYPE REF TO /aws1/if_s3. + CLASS-DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. + CLASS-DATA ao_s3_actions TYPE REF TO /awsex/cl_s3_actions. + + METHODS: create_bucket FOR TESTING RAISING /aws1/cx_rt_generic, + put_object FOR TESTING RAISING /aws1/cx_rt_generic, + get_object FOR TESTING RAISING /aws1/cx_rt_generic, + copy_object FOR TESTING RAISING /aws1/cx_rt_generic, + list_objects FOR TESTING RAISING /aws1/cx_rt_generic, + list_objects_v2 FOR TESTING RAISING /aws1/cx_rt_generic, + delete_object FOR TESTING RAISING /aws1/cx_rt_generic, + delete_bucket FOR TESTING RAISING /aws1/cx_rt_generic. + + CLASS-METHODS class_setup RAISING /aws1/cx_rt_generic /awsex/cx_generic. + CLASS-METHODS class_teardown RAISING /aws1/cx_rt_generic /awsex/cx_generic. + + METHODS assert_bucket_exists + IMPORTING + iv_bucket TYPE /aws1/s3_bucketname + iv_exp TYPE abap_bool + iv_msg TYPE string + RAISING /aws1/cx_rt_generic. + METHODS create_file IMPORTING iv_file TYPE /aws1/s3_objectkey. + METHODS get_file_data + IMPORTING + iv_file TYPE /aws1/s3_objectkey + RETURNING + VALUE(ov_file_data) TYPE /aws1/s3_streamingblob. + METHODS delete_file IMPORTING iv_file TYPE /aws1/s3_objectkey. + METHODS put_file_in_bucket + IMPORTING + iv_bucket TYPE /aws1/s3_bucketname + iv_file TYPE /aws1/s3_objectkey + RAISING /aws1/cx_rt_generic. +ENDCLASS. + +CLASS ltc_awsex_cl_s3_actions IMPLEMENTATION. + + METHOD class_setup. + ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). + ao_s3 = /aws1/cl_s3_factory=>create( ao_session ). + ao_s3_actions = NEW /awsex/cl_s3_actions( ). + + DATA(lv_acct) = ao_session->get_account_id( ). + av_bucket = |sap-abap-s3-demo-bucket-{ lv_acct }|. + av_src_bucket = |sap-abap-s3-demo-copy-object-src-bucket-{ lv_acct }|. + av_dest_bucket = |sap-abap-s3-demo-copy-object-dst-bucket-{ lv_acct }|. + av_bucket_delete = |sap-abap-s3-demo-bucket-delete-{ lv_acct }|. + av_bucket_create = |sap-abap-s3-demo-bucket-create-{ lv_acct }|. + ao_s3_actions->create_bucket( av_bucket ). + ao_s3_actions->create_bucket( av_src_bucket ). + ao_s3_actions->create_bucket( av_dest_bucket ). + ao_s3_actions->create_bucket( av_bucket_delete ). + + + ENDMETHOD. + METHOD class_teardown. + /awsex/cl_utils=>cleanup_bucket( io_s3 = ao_s3 + iv_bucket = av_bucket ). + /awsex/cl_utils=>cleanup_bucket( io_s3 = ao_s3 + iv_bucket = av_bucket_create ). + /awsex/cl_utils=>cleanup_bucket( io_s3 = ao_s3 + iv_bucket = av_bucket_delete ). + /awsex/cl_utils=>cleanup_bucket( io_s3 = ao_s3 + iv_bucket = av_src_bucket ). + /awsex/cl_utils=>cleanup_bucket( io_s3 = ao_s3 + iv_bucket = av_dest_bucket ). + ENDMETHOD. + + METHOD create_bucket. + ao_s3_actions->create_bucket( av_bucket_create ). + + assert_bucket_exists( + iv_bucket = av_bucket + iv_exp = abap_true + iv_msg = |Bucket { av_bucket_create } was not created| ). + + ENDMETHOD. + METHOD put_object. + CONSTANTS cv_file TYPE /aws1/s3_objectkey VALUE 'put_object_ex_file'. + create_file( cv_file ). + + ao_s3_actions->put_object( + iv_bucket_name = av_bucket + iv_file_name = cv_file ). + + cl_abap_unit_assert=>assert_equals( + exp = get_file_data( iv_file = cv_file ) + act = ao_s3->getobject( iv_bucket = av_bucket iv_key = cv_file )->get_body( ) + msg = |Object { cv_file } did not match expected value| ). + + ao_s3->deleteobject( iv_bucket = av_bucket + iv_key = cv_file ). + delete_file( cv_file ). + + ENDMETHOD. + METHOD create_file. + DATA lv_param TYPE btcxpgpar. + lv_param = |if=/dev/random of={ iv_file } bs=1M count=1 iflag=fullblock|. + CALL FUNCTION 'SXPG_COMMAND_EXECUTE' + EXPORTING + commandname = 'DB24DD' + additional_parameters = lv_param + operatingsystem = 'ANYOS' + EXCEPTIONS + OTHERS = 15. + /aws1/cl_rt_assert_abap=>assert_subrc( iv_exp = 0 + iv_msg = |Could not create { iv_file }| ). + ENDMETHOD. + METHOD get_file_data. + "Get file content. + OPEN DATASET iv_file FOR INPUT IN BINARY MODE. + READ DATASET iv_file INTO ov_file_data. + CLOSE DATASET iv_file. + ENDMETHOD. + METHOD delete_file. + DELETE DATASET iv_file. + cl_abap_unit_assert=>assert_equals( + exp = sy-subrc + act = 0 + msg = |Could not delete { iv_file }| ). + ENDMETHOD. + METHOD get_object. + CONSTANTS cv_file TYPE /aws1/s3_objectkey VALUE 'get_object_ex_file'. + DATA lo_result TYPE REF TO /aws1/cl_s3_getobjectoutput. + create_file( cv_file ). + + put_file_in_bucket( iv_bucket = av_bucket + iv_file = cv_file ). + + + ao_s3_actions->get_object( + EXPORTING + iv_bucket_name = av_bucket + iv_object_key = cv_file + IMPORTING + oo_result = lo_result ). + + cl_abap_unit_assert=>assert_equals( + exp = get_file_data( iv_file = cv_file ) + act = lo_result->get_body( ) + msg = |Object { cv_file } did not match expected value| ). + + ao_s3->deleteobject( iv_bucket = av_bucket + iv_key = cv_file ). + delete_file( cv_file ). + + ENDMETHOD. + METHOD put_file_in_bucket. + ao_s3->putobject( + iv_bucket = iv_bucket + iv_key = iv_file + iv_body = get_file_data( iv_file = iv_file ) ). + ENDMETHOD. + METHOD copy_object. + CONSTANTS cv_src_file TYPE /aws1/s3_objectkey VALUE 'copy_object_ex_file'. + CONSTANTS cv_dest_file TYPE /aws1/s3_objectkey VALUE 'copied_object_ex_file'. + + + create_file( cv_src_file ). + put_file_in_bucket( iv_bucket = av_src_bucket + iv_file = cv_src_file ). + + ao_s3_actions->copy_object( + iv_dest_bucket = av_dest_bucket + iv_dest_object = cv_dest_file + iv_src_bucket = av_src_bucket + iv_src_object = cv_src_file ). + + cl_abap_unit_assert=>assert_equals( + exp = get_file_data( iv_file = cv_src_file ) + act = ao_s3->getobject( iv_bucket = av_dest_bucket iv_key = cv_dest_file )->get_body( ) + msg = |Object { cv_dest_file } did not match expected value| ). + + ao_s3->deleteobject( iv_bucket = av_src_bucket + iv_key = cv_src_file ). + ao_s3->deletebucket( iv_bucket = av_src_bucket ). + delete_file( cv_src_file ). + + ao_s3->deleteobject( iv_bucket = av_dest_bucket + iv_key = cv_dest_file ). + ao_s3->deletebucket( iv_bucket = av_dest_bucket ). + delete_file( cv_dest_file ). + + ENDMETHOD. + METHOD list_objects. + CONSTANTS cv_file TYPE /aws1/s3_objectkey VALUE 'list_objects_ex_file1'. + create_file( cv_file ). + + put_file_in_bucket( iv_bucket = av_bucket + iv_file = cv_file ). + + DATA lo_list TYPE REF TO /aws1/cl_s3_listobjectsoutput. + ao_s3_actions->list_objects( + EXPORTING + iv_bucket_name = av_bucket + IMPORTING + oo_result = lo_list ). + + + LOOP AT lo_list->get_contents( ) INTO DATA(lo_object). + IF lo_object->get_key( ) = cv_file. + DATA(lv_found) = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Could not find object { cv_file } in the list| ). + + ao_s3->deleteobject( iv_bucket = av_bucket + iv_key = cv_file ). + delete_file( cv_file ). + + ENDMETHOD. + + METHOD list_objects_v2. + CONSTANTS cv_file TYPE /aws1/s3_objectkey VALUE 'list_objects_ex_file1'. + create_file( cv_file ). + + put_file_in_bucket( iv_bucket = av_bucket + iv_file = cv_file ). + + DATA lo_list TYPE REF TO /aws1/cl_s3_listobjsv2output. + ao_s3_actions->list_objects_v2( + EXPORTING + iv_bucket_name = av_bucket + IMPORTING + oo_result = lo_list ). + + + LOOP AT lo_list->get_contents( ) INTO DATA(lo_object). + IF lo_object->get_key( ) = cv_file. + DATA(lv_found) = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Could not find object { cv_file } in the list| ). + + ao_s3->deleteobject( iv_bucket = av_bucket + iv_key = cv_file ). + delete_file( cv_file ). + + ENDMETHOD. + METHOD delete_object. + CONSTANTS cv_file1 TYPE /aws1/s3_objectkey VALUE 'delete_object_ex_file1'. + CONSTANTS cv_file2 TYPE /aws1/s3_objectkey VALUE 'delete_object_ex_file2'. + create_file( cv_file1 ). + create_file( cv_file2 ). + + put_file_in_bucket( iv_bucket = av_bucket + iv_file = cv_file1 ). + put_file_in_bucket( iv_bucket = av_bucket + iv_file = cv_file2 ). + + ao_s3_actions->delete_object( iv_bucket_name = av_bucket + iv_object_key = cv_file1 ). + ao_s3_actions->delete_object( iv_bucket_name = av_bucket + iv_object_key = cv_file2 ). + + DATA(lo_list) = ao_s3->listobjects( iv_bucket = av_bucket ). + cl_abap_unit_assert=>assert_equals( + exp = lines( lo_list->get_contents( ) ) + act = 0 + msg = |Could not delete all objects in bucket { av_bucket }| ). + + delete_file( cv_file1 ). + delete_file( cv_file2 ). + + ENDMETHOD. + METHOD delete_bucket. + ao_s3_actions->delete_bucket( av_bucket_delete ). + assert_bucket_exists( + iv_exp = abap_false + iv_bucket = av_bucket_delete + iv_msg = |Bucket { av_bucket_delete } should have been deleted| ). + + + ENDMETHOD. + METHOD assert_bucket_exists. + DATA(lv_found) = abap_true. + TRY. + ao_s3->headbucket( iv_bucket = av_bucket_delete ). + CATCH /aws1/cx_s3_nosuchbucket INTO DATA(lo_ex). + lv_found = abap_false. + CATCH /aws1/cx_s3_clientexc INTO DATA(lo_ex2). + IF lo_ex2->av_http_code = 404. + lv_found = abap_false. + ELSE. + RAISE EXCEPTION lo_ex2. + ENDIF. + ENDTRY. + cl_abap_unit_assert=>assert_equals( + act = lv_found + exp = iv_exp + msg = iv_msg ). + + ENDMETHOD. + +ENDCLASS. diff --git a/sap-abap/services/s3/#awsex#cl_s3_actions.clas.xml b/sap-abap/services/s3/#awsex#cl_s3_actions.clas.xml new file mode 100644 index 00000000000..49c3d2e5670 --- /dev/null +++ b/sap-abap/services/s3/#awsex#cl_s3_actions.clas.xml @@ -0,0 +1,17 @@ + + + + + + /AWSEX/CL_S3_ACTIONS + E + Amazon S3 Code Example Actions + 1 + X + X + X + X + + + + diff --git a/sap-abap/services/s3/#awsex#cl_s3_scenarios.clas.abap b/sap-abap/services/s3/#awsex#cl_s3_scenarios.clas.abap new file mode 100644 index 00000000000..2db3288dceb --- /dev/null +++ b/sap-abap/services/s3/#awsex#cl_s3_scenarios.clas.abap @@ -0,0 +1,192 @@ +CLASS /awsex/cl_s3_scenarios DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + METHODS getting_started_with_s3 + IMPORTING + !iv_bucket_name TYPE /aws1/s3_bucketname + !iv_key TYPE /aws1/s3_objectkey + !iv_copy_to_folder TYPE /aws1/s3_bucketname + RAISING + /aws1/cx_rt_service_generic + /aws1/cx_rt_technical_generic + /aws1/cx_rt_no_auth_generic . + METHODS presigner_get + IMPORTING + !iv_bucket_name TYPE /aws1/s3_bucketname + !iv_key TYPE /aws1/s3_objectkey + RETURNING + VALUE(ov_url) TYPE string + RAISING + /aws1/cx_rt_service_generic + /aws1/cx_rt_technical_generic + /aws1/cx_rt_no_auth_generic . + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS /AWSEX/CL_S3_SCENARIOS IMPLEMENTATION. + + + METHOD getting_started_with_s3. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + "snippet-start:[s3.abapv1.getting_started_with_s3] + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ). + + " Create an Amazon Simple Storage Service (Amazon S3) bucket. " + TRY. + " determine our region from our session + DATA(lv_region) = CONV /aws1/s3_bucketlocationcnstrnt( lo_session->get_region( ) ). + DATA lo_constraint TYPE REF TO /aws1/cl_s3_createbucketconf. + " When in the us-east-1 region, you must not specify a constraint + " In all other regions, specify the region as the constraint + IF lv_region = 'us-east-1'. + CLEAR lo_constraint. + ELSE. + lo_constraint = NEW /aws1/cl_s3_createbucketconf( lv_region ). + ENDIF. + + lo_s3->createbucket( + iv_bucket = iv_bucket_name + io_createbucketconfiguration = lo_constraint ). + MESSAGE 'S3 bucket created.' TYPE 'I'. + CATCH /aws1/cx_s3_bucketalrdyexists. + MESSAGE 'Bucket name already exists.' TYPE 'E'. + CATCH /aws1/cx_s3_bktalrdyownedbyyou. + MESSAGE 'Bucket already exists and is owned by you.' TYPE 'E'. + ENDTRY. + + + "Upload an object to an S3 bucket." + TRY. + "Get contents of file from application server." + DATA lv_file_content TYPE xstring. + OPEN DATASET iv_key FOR INPUT IN BINARY MODE. + READ DATASET iv_key INTO lv_file_content. + CLOSE DATASET iv_key. + + lo_s3->putobject( + iv_bucket = iv_bucket_name + iv_key = iv_key + iv_body = lv_file_content ). + MESSAGE 'Object uploaded to S3 bucket.' TYPE 'I'. + CATCH /aws1/cx_s3_nosuchbucket. + MESSAGE 'Bucket does not exist.' TYPE 'E'. + ENDTRY. + + " Get an object from a bucket. " + TRY. + DATA(lo_result) = lo_s3->getobject( + iv_bucket = iv_bucket_name + iv_key = iv_key ). + DATA(lv_object_data) = lo_result->get_body( ). + MESSAGE 'Object retrieved from S3 bucket.' TYPE 'I'. + CATCH /aws1/cx_s3_nosuchbucket. + MESSAGE 'Bucket does not exist.' TYPE 'E'. + CATCH /aws1/cx_s3_nosuchkey. + MESSAGE 'Object key does not exist.' TYPE 'E'. + ENDTRY. + + " Copy an object to a subfolder in a bucket. " + TRY. + lo_s3->copyobject( + iv_bucket = iv_bucket_name + iv_key = |{ iv_copy_to_folder }/{ iv_key }| + iv_copysource = |{ iv_bucket_name }/{ iv_key }| ). + MESSAGE 'Object copied to a subfolder.' TYPE 'I'. + CATCH /aws1/cx_s3_nosuchbucket. + MESSAGE 'Bucket does not exist.' TYPE 'E'. + CATCH /aws1/cx_s3_nosuchkey. + MESSAGE 'Object key does not exist.' TYPE 'E'. + ENDTRY. + + " List objects in the bucket. " + TRY. + DATA(lo_list) = lo_s3->listobjects( + iv_bucket = iv_bucket_name ). + MESSAGE 'Retrieved list of objects in S3 bucket.' TYPE 'I'. + CATCH /aws1/cx_s3_nosuchbucket. + MESSAGE 'Bucket does not exist.' TYPE 'E'. + ENDTRY. + DATA text TYPE string VALUE 'Object List - '. + DATA lv_object_key TYPE /aws1/s3_objectkey. + LOOP AT lo_list->get_contents( ) INTO DATA(lo_object). + lv_object_key = lo_object->get_key( ). + CONCATENATE lv_object_key ', ' INTO text. + ENDLOOP. + MESSAGE text TYPE'I'. + + " Delete the objects in a bucket. " + TRY. + lo_s3->deleteobject( + iv_bucket = iv_bucket_name + iv_key = iv_key ). + lo_s3->deleteobject( + iv_bucket = iv_bucket_name + iv_key = |{ iv_copy_to_folder }/{ iv_key }| ). + MESSAGE 'Objects deleted from S3 bucket.' TYPE 'I'. + CATCH /aws1/cx_s3_nosuchbucket. + MESSAGE 'Bucket does not exist.' TYPE 'E'. + ENDTRY. + + + " Delete the bucket. " + TRY. + lo_s3->deletebucket( + iv_bucket = iv_bucket_name ). + MESSAGE 'Deleted S3 bucket.' TYPE 'I'. + CATCH /aws1/cx_s3_nosuchbucket. + MESSAGE 'Bucket does not exist.' TYPE 'E'. + ENDTRY. + "snippet-end:[s3.abapv1.getting_started_with_s3] + + ENDMETHOD. + + + METHOD presigner_get. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + "snippet-start:[s3.abapv1.s3_presigned_url_get] + " iv_bucket_name is the bucket name + " iv_key is the object name like "myfile.txt" + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ). + + "Upload a nice Hello World file to an S3 bucket." + TRY. + DATA(lv_contents) = cl_abap_codepage=>convert_to( 'Hello, World' ). + lo_s3->putobject( + iv_bucket = iv_bucket_name + iv_key = iv_key + iv_body = lv_contents + iv_contenttype = 'text/plain' ). + MESSAGE 'Object uploaded to S3 bucket.' TYPE 'I'. + CATCH /aws1/cx_s3_nosuchbucket. + MESSAGE 'Bucket does not exist.' TYPE 'E'. + ENDTRY. + + " now generate a presigned URL with a 600-second expiration + DATA(lo_presigner) = lo_s3->get_presigner( iv_expires_sec = 600 ). + " the presigner getobject() method has the same signature as + " lo_s3->getobject(), but it doesn't actually make the call. + " to the service. It just prepares a presigned URL for a future call + DATA(lo_presigned_req) = lo_presigner->getobject( + iv_bucket = iv_bucket_name + iv_key = iv_key ). + + " You can provide this URL to a web page, user, email etc so they + " can retrieve the file. The URL will expire in 10 minutes. + ov_url = lo_presigned_req->get_url( ). + "snippet-end:[s3.abapv1.s3_presigned_url_get] + + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/s3/#awsex#cl_s3_scenarios.clas.testclasses.abap b/sap-abap/services/s3/#awsex#cl_s3_scenarios.clas.testclasses.abap new file mode 100644 index 00000000000..06129937dc4 --- /dev/null +++ b/sap-abap/services/s3/#awsex#cl_s3_scenarios.clas.testclasses.abap @@ -0,0 +1,113 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 + +CLASS ltc_awsex_cl_s3_scenario DEFINITION DEFERRED. +CLASS /awsex/cl_s3_scenarios DEFINITION LOCAL FRIENDS ltc_awsex_cl_s3_scenario. + +CLASS ltc_awsex_cl_s3_scenario DEFINITION FOR TESTING DURATION SHORT RISK LEVEL DANGEROUS. + + PRIVATE SECTION. + CONSTANTS: cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO', + cv_file TYPE /aws1/s3_objectkey VALUE 's3_scenario_ex_file', + cv_copy_to_folder TYPE /aws1/s3_bucketname VALUE 'code-example-scenario-folder'. + + DATA av_bucket TYPE /aws1/s3_bucketname. + + DATA ao_s3 TYPE REF TO /aws1/if_s3. + DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. + DATA ao_s3_scenario TYPE REF TO /awsex/cl_s3_scenarios. + + METHODS getting_started_scenario FOR TESTING RAISING /aws1/cx_rt_generic. + METHODS presigner_get_scenario FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS setup RAISING /aws1/cx_rt_generic /awsex/cx_generic. + METHODS teardown RAISING /aws1/cx_rt_generic /awsex/cx_generic. + +ENDCLASS. + +CLASS ltc_awsex_cl_s3_scenario IMPLEMENTATION. + + METHOD setup. + DATA lv_param TYPE btcxpgpar. + ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). + DATA(lv_acct) = ao_session->get_account_id( ). + av_bucket = |sap-abap-s3-scenario-bucket-{ lv_acct }|. + + ao_s3 = /aws1/cl_s3_factory=>create( ao_session ). + ao_s3_scenario = NEW /awsex/cl_s3_scenarios( ). + + + lv_param = |if=/dev/random of={ cv_file } bs=1M count=1 iflag=fullblock|. + CALL FUNCTION 'SXPG_COMMAND_EXECUTE' + EXPORTING + commandname = 'DB24DD' + additional_parameters = lv_param + operatingsystem = 'ANYOS' + EXCEPTIONS + OTHERS = 15. + /aws1/cl_rt_assert_abap=>assert_subrc( iv_exp = 0 + iv_msg = |Could not create { cv_file }| ). + + ENDMETHOD. + + METHOD teardown. + /awsex/cl_utils=>cleanup_bucket( io_s3 = ao_s3 + iv_bucket = av_bucket ). + + ENDMETHOD. + + + + METHOD getting_started_scenario. + ao_s3_scenario->getting_started_with_s3( + iv_bucket_name = av_bucket + iv_key = cv_file + iv_copy_to_folder = cv_copy_to_folder ). + + + LOOP AT ao_s3->listbuckets( )->get_buckets( ) INTO DATA(lo_bucket). + IF lo_bucket->get_name( ) = av_bucket. + DATA(lv_found) = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_equals( + exp = abap_false + act = lv_found + msg = |Bucket { av_bucket } should have been deleted| ). + ENDMETHOD. + + METHOD presigner_get_scenario. + " we don't show the customer the bucket creation in this scenario. + " So we'll create a separate bucket just for this scenario + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ). + + DATA(lv_region) = CONV /aws1/s3_bucketlocationcnstrnt( lo_session->get_region( ) ). + DATA lo_constraint TYPE REF TO /aws1/cl_s3_createbucketconf. + IF lv_region = 'us-east-1'. + CLEAR lo_constraint. + ELSE. + lo_constraint = NEW /aws1/cl_s3_createbucketconf( lv_region ). + ENDIF. + + DATA(lv_uuid) = cl_system_uuid=>if_system_uuid_static~create_uuid_c32( ). + TRANSLATE lv_uuid TO LOWER CASE. + DATA(lv_bucket_name) = |sap-abap-s3-scenario-presigner-{ lv_uuid }|. + + lo_s3->createbucket( + iv_bucket = lv_bucket_name + io_createbucketconfiguration = lo_constraint ). + + + DATA(lv_url) = ao_s3_scenario->presigner_get( + iv_bucket_name = lv_bucket_name + iv_key = cv_file ). + ASSERT lv_url IS NOT INITIAL. + + " cleanup + lo_s3->deleteobject( iv_bucket = lv_bucket_name iv_key = cv_file ). + lo_s3->deletebucket( iv_bucket = lv_bucket_name ). + + ENDMETHOD. + +ENDCLASS. diff --git a/sap-abap/services/s3/#awsex#cl_s3_scenarios.clas.xml b/sap-abap/services/s3/#awsex#cl_s3_scenarios.clas.xml new file mode 100644 index 00000000000..37ea067b7d0 --- /dev/null +++ b/sap-abap/services/s3/#awsex#cl_s3_scenarios.clas.xml @@ -0,0 +1,17 @@ + + + + + + /AWSEX/CL_S3_SCENARIOS + E + Amazon S3 Code Example Scenarios + 1 + X + X + X + X + + + + diff --git a/sap-abap/services/sgm/#awsex#cl_sgm_actions.clas.abap b/sap-abap/services/sgm/#awsex#cl_sgm_actions.clas.abap new file mode 100644 index 00000000000..752f282dada --- /dev/null +++ b/sap-abap/services/sgm/#awsex#cl_sgm_actions.clas.abap @@ -0,0 +1,511 @@ +CLASS /awsex/cl_sgm_actions DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + METHODS create_endpoint + IMPORTING + !iv_model_name TYPE /aws1/sgmmodelname + !iv_endpoint_name TYPE /aws1/sgmendpointname + !iv_endpoint_config_name TYPE /aws1/sgmendpointconfigname + !iv_instance_type TYPE /aws1/sgminstancetype + !iv_initial_instance_count TYPE /aws1/sgminitialtaskcount + !iv_variant_name TYPE /aws1/sgmvariantname + EXPORTING + !oo_result TYPE REF TO /aws1/cl_sgmcreateendptoutput + RAISING /aws1/cx_rt_generic. + METHODS create_model + IMPORTING + !iv_model_name TYPE /aws1/sgmmodelname + !iv_execution_role_arn TYPE /aws1/sgmrolearn + !iv_model_data_url TYPE /aws1/sgmurl + !iv_container_image TYPE /aws1/sgmcontainermode + EXPORTING + !oo_result TYPE REF TO /aws1/cl_sgmcreatemodeloutput + RAISING /aws1/cx_rt_generic. + METHODS create_training_job + IMPORTING + !iv_training_job_name TYPE /aws1/sgmtrainingjobname + !iv_role_arn TYPE /aws1/sgmrolearn + !iv_trn_data_s3datatype TYPE /aws1/sgms3datatype + !iv_trn_data_s3datadistribution TYPE /aws1/sgms3datadistribution + !iv_trn_data_s3uri TYPE /aws1/sgms3uri + !iv_trn_data_compressiontype TYPE /aws1/sgmcompressiontype + !iv_trn_data_contenttype TYPE /aws1/sgmcontenttype + !iv_val_data_s3datatype TYPE /aws1/sgms3datatype + !iv_val_data_s3datadistribution TYPE /aws1/sgms3datadistribution + !iv_val_data_s3uri TYPE /aws1/sgms3uri + !iv_val_data_compressiontype TYPE /aws1/sgmcompressiontype + !iv_val_data_contenttype TYPE /aws1/sgmcontenttype + !iv_hp_max_depth TYPE /aws1/sgmhyperparametervalue + !iv_hp_scale_pos_weight TYPE /aws1/sgmhyperparametervalue + !iv_hp_num_round TYPE /aws1/sgmhyperparametervalue + !iv_hp_objective TYPE /aws1/sgmhyperparametervalue + !iv_hp_subsample TYPE /aws1/sgmhyperparametervalue + !iv_hp_eval_metric TYPE /aws1/sgmhyperparametervalue + !iv_hp_eta TYPE /aws1/sgmhyperparametervalue + !iv_training_image TYPE /aws1/sgmalgorithmimage + !iv_training_input_mode TYPE /aws1/sgmtraininginputmode + !iv_instance_count TYPE /aws1/sgmtraininginstancecount + !iv_instance_type TYPE /aws1/sgmtraininginstancetype + !iv_volume_sizeingb TYPE /aws1/sgmvolumesizeingb + !iv_s3_output_path TYPE /aws1/sgms3uri + !iv_max_runtime_in_seconds TYPE /aws1/sgmmaxruntimeinseconds + EXPORTING + !oo_result TYPE REF TO /aws1/cl_sgmcreatetrnjobrsp + RAISING /aws1/cx_rt_generic. + METHODS create_transform_job + IMPORTING + !iv_tf_job_name TYPE /aws1/sgmtransformjobname + !iv_tf_data_s3datatype TYPE /aws1/sgms3datatype + !iv_tf_data_s3uri TYPE /aws1/sgms3uri + !iv_tf_data_compressiontype TYPE /aws1/sgmcompressiontype + !iv_tf_data_contenttype TYPE /aws1/sgmcontenttype + !iv_instance_count TYPE /aws1/sgmtraininginstancecount + !iv_instance_type TYPE /aws1/sgmtraininginstancetype + !iv_s3_output_path TYPE /aws1/sgms3uri + !iv_tf_model_name TYPE /aws1/sgmmodelname + EXPORTING + !oo_result TYPE REF TO /aws1/cl_sgmcretransformjobrsp + RAISING /aws1/cx_rt_generic. + METHODS delete_endpoint + IMPORTING + !iv_endpoint_name TYPE /aws1/sgmendpointname + !iv_endpoint_config_name TYPE /aws1/sgmendpointconfigname + RAISING /aws1/cx_rt_generic. + METHODS delete_model + IMPORTING + !iv_model_name TYPE /aws1/sgmmodelname + RAISING /aws1/cx_rt_generic. + METHODS describe_training_job + IMPORTING + !iv_training_job_name TYPE /aws1/sgmtrainingjobname + EXPORTING + !oo_result TYPE REF TO /aws1/cl_sgmdescrtrnjobrsp + RAISING /aws1/cx_rt_generic. + METHODS list_algorithms + IMPORTING + !iv_name_contains TYPE /aws1/sgmnamecontains + EXPORTING + !oo_result TYPE REF TO /aws1/cl_sgmlistalgsoutput + RAISING /aws1/cx_rt_generic. + METHODS list_models + IMPORTING + !iv_name_contains TYPE /aws1/sgmmodelnamecontains + EXPORTING + !oo_result TYPE REF TO /aws1/cl_sgmlistmodelsoutput + RAISING /aws1/cx_rt_generic. + METHODS list_notebook_instances + IMPORTING + !iv_name_contains TYPE /aws1/sgmnotebookinstnamecon00 + EXPORTING + !oo_result TYPE REF TO /aws1/cl_sgmlstnotebookinsts01 + RAISING /aws1/cx_rt_generic. + METHODS list_training_jobs + IMPORTING + !iv_name_contains TYPE /aws1/sgmtrainingjobname + !iv_max_results TYPE /aws1/sgmmaxresults + EXPORTING + !oo_result TYPE REF TO /aws1/cl_sgmlisttrnjobsrsp + RAISING /aws1/cx_rt_generic. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS /AWSEX/CL_SGM_ACTIONS IMPLEMENTATION. + + + METHOD create_endpoint. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sgm) = /aws1/cl_sgm_factory=>create( lo_session ). + + "snippet-start:[sgm.abapv1.create_endpoint] + + DATA lt_production_variants TYPE /aws1/cl_sgmproductionvariant=>tt_productionvariantlist. + DATA lo_production_variants TYPE REF TO /aws1/cl_sgmproductionvariant. + DATA oo_ep_config_result TYPE REF TO /aws1/cl_sgmcreateendptcfgout. + + "Create a production variant as an ABAP object." + "Identifies a model that you want to host and the resources chosen to deploy for hosting it." + lo_production_variants = NEW #( iv_variantname = iv_variant_name + iv_modelname = iv_model_name + iv_initialinstancecount = iv_initial_instance_count + iv_instancetype = iv_instance_type ). + + INSERT lo_production_variants INTO TABLE lt_production_variants. + + "Create an endpoint configuration." + TRY. + oo_ep_config_result = lo_sgm->createendpointconfig( + iv_endpointconfigname = iv_endpoint_config_name + it_productionvariants = lt_production_variants ). + MESSAGE 'Endpoint configuration created.' TYPE 'I'. + CATCH /aws1/cx_sgmresourcelimitexcd. + MESSAGE 'You have reached the limit on the number of resources.' TYPE 'E'. + ENDTRY. + + "Create an endpoint." + TRY. + oo_result = lo_sgm->createendpoint( " oo_result is returned for testing purposes. " + iv_endpointconfigname = iv_endpoint_config_name + iv_endpointname = iv_endpoint_name ). + MESSAGE 'Endpoint created.' TYPE 'I'. + CATCH /aws1/cx_sgmresourcelimitexcd. + MESSAGE 'You have reached the limit on the number of resources.' TYPE 'E'. + ENDTRY. + + "snippet-end:[sgm.abapv1.create_endpoint] + + ENDMETHOD. + + + METHOD create_model. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sgm) = /aws1/cl_sgm_factory=>create( lo_session ). + + "snippet-start:[sgm.abapv1.create_model] + + DATA lo_primarycontainer TYPE REF TO /aws1/cl_sgmcontainerdefn. + + "Create an ABAP object for the container image based on input variables." + lo_primarycontainer = NEW #( iv_image = iv_container_image + iv_modeldataurl = iv_model_data_url ). + + "Create an Amazon SageMaker model." + TRY. + oo_result = lo_sgm->createmodel( " oo_result is returned for testing purposes. " + iv_executionrolearn = iv_execution_role_arn + iv_modelname = iv_model_name + io_primarycontainer = lo_primarycontainer ). + MESSAGE 'Model created.' TYPE 'I'. + CATCH /aws1/cx_sgmresourcelimitexcd. + MESSAGE 'You have reached the limit on the number of resources.' TYPE 'E'. + ENDTRY. + "snippet-end:[sgm.abapv1.create_model] + ENDMETHOD. + + + METHOD create_training_job. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sgm) = /aws1/cl_sgm_factory=>create( lo_session ). + + "snippet-start:[sgm.abapv1.create_training_job] + + DATA lo_hyperparameters_w TYPE REF TO /aws1/cl_sgmhyperparameters_w. + DATA lt_hyperparameters TYPE /aws1/cl_sgmhyperparameters_w=>tt_hyperparameters. + DATA lt_input_data_config TYPE /aws1/cl_sgmchannel=>tt_inputdataconfig. + DATA lo_trn_channel TYPE REF TO /aws1/cl_sgmchannel. + DATA lo_trn_datasource TYPE REF TO /aws1/cl_sgmdatasource. + DATA lo_trn_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. + DATA lo_val_channel TYPE REF TO /aws1/cl_sgmchannel. + DATA lo_val_datasource TYPE REF TO /aws1/cl_sgmdatasource. + DATA lo_val_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. + DATA lo_algorithm_specification TYPE REF TO /aws1/cl_sgmalgorithmspec. + DATA lo_resource_config TYPE REF TO /aws1/cl_sgmresourceconfig. + DATA lo_output_data_config TYPE REF TO /aws1/cl_sgmoutputdataconfig. + DATA lo_stopping_condition TYPE REF TO /aws1/cl_sgmstoppingcondition. + + "Create ABAP internal table for hyperparameters based on input variables." + "These hyperparameters are based on the Amazon SageMaker built-in algorithm, XGBoost." + lo_hyperparameters_w = NEW #( iv_value = iv_hp_max_depth ). + INSERT VALUE #( key = 'max_depth' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = iv_hp_eta ). + INSERT VALUE #( key = 'eta' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = iv_hp_eval_metric ). + INSERT VALUE #( key = 'eval_metric' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = iv_hp_scale_pos_weight ). + INSERT VALUE #( key = 'scale_pos_weight' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = iv_hp_subsample ). + INSERT VALUE #( key = 'subsample' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = iv_hp_objective ). + INSERT VALUE #( key = 'objective' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = iv_hp_num_round ). + INSERT VALUE #( key = 'num_round' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + "Create ABAP objects for training data sources." + lo_trn_s3datasource = NEW #( iv_s3datatype = iv_trn_data_s3datatype + iv_s3datadistributiontype = iv_trn_data_s3datadistribution + iv_s3uri = iv_trn_data_s3uri ). + + lo_trn_datasource = NEW #( io_s3datasource = lo_trn_s3datasource ). + + lo_trn_channel = NEW #( iv_channelname = 'train' + io_datasource = lo_trn_datasource + iv_compressiontype = iv_trn_data_compressiontype + iv_contenttype = iv_trn_data_contenttype ). + + INSERT lo_trn_channel INTO TABLE lt_input_data_config. + + "Create ABAP objects for validation data sources." + lo_val_s3datasource = NEW #( iv_s3datatype = iv_val_data_s3datatype + iv_s3datadistributiontype = iv_val_data_s3datadistribution + iv_s3uri = iv_val_data_s3uri ). + + lo_val_datasource = NEW #( io_s3datasource = lo_val_s3datasource ). + + lo_val_channel = NEW #( iv_channelname = 'validation' + io_datasource = lo_val_datasource + iv_compressiontype = iv_val_data_compressiontype + iv_contenttype = iv_val_data_contenttype ). + + INSERT lo_val_channel INTO TABLE lt_input_data_config. + + "Create an ABAP object for algorithm specification." + lo_algorithm_specification = NEW #( iv_trainingimage = iv_training_image + iv_traininginputmode = iv_training_input_mode ). + + "Create an ABAP object for resource configuration." + lo_resource_config = NEW #( iv_instancecount = iv_instance_count + iv_instancetype = iv_instance_type + iv_volumesizeingb = iv_volume_sizeingb ). + + "Create an ABAP object for output data configuration." + lo_output_data_config = NEW #( iv_s3outputpath = iv_s3_output_path ). + + "Create an ABAP object for stopping condition." + lo_stopping_condition = NEW #( iv_maxruntimeinseconds = iv_max_runtime_in_seconds ). + + "Create a training job." + TRY. + oo_result = lo_sgm->createtrainingjob( " oo_result is returned for testing purposes. " + iv_trainingjobname = iv_training_job_name + iv_rolearn = iv_role_arn + it_hyperparameters = lt_hyperparameters + it_inputdataconfig = lt_input_data_config + io_algorithmspecification = lo_algorithm_specification + io_outputdataconfig = lo_output_data_config + io_resourceconfig = lo_resource_config + io_stoppingcondition = lo_stopping_condition ). + MESSAGE 'Training job created.' TYPE 'I'. + CATCH /aws1/cx_sgmresourceinuse. + MESSAGE 'Resource being accessed is in use.' TYPE 'E'. + CATCH /aws1/cx_sgmresourcenotfound. + MESSAGE 'Resource being accessed is not found.' TYPE 'E'. + CATCH /aws1/cx_sgmresourcelimitexcd. + MESSAGE 'You have reached the limit on the number of resources.' TYPE 'E'. + ENDTRY. + "snippet-end:[sgm.abapv1.create_training_job] + + ENDMETHOD. + + + METHOD create_transform_job. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sgm) = /aws1/cl_sgm_factory=>create( lo_session ). + + "snippet-start:[sgm.abapv1.create_transform_job] + + DATA lo_transforminput TYPE REF TO /aws1/cl_sgmtransforminput. + DATA lo_transformoutput TYPE REF TO /aws1/cl_sgmtransformoutput. + DATA lo_transformresources TYPE REF TO /aws1/cl_sgmtransformresources. + DATA lo_datasource TYPE REF TO /aws1/cl_sgmtransformdatasrc. + DATA lo_s3datasource TYPE REF TO /aws1/cl_sgmtransforms3datasrc. + + "Create an ABAP object for an Amazon Simple Storage Service (Amazon S3) data source." + lo_s3datasource = NEW #( iv_s3uri = iv_tf_data_s3uri + iv_s3datatype = iv_tf_data_s3datatype ). + + "Create an ABAP object for data source." + lo_datasource = NEW #( io_s3datasource = lo_s3datasource ). + + "Create an ABAP object for transform data source." + lo_transforminput = NEW #( io_datasource = lo_datasource + iv_contenttype = iv_tf_data_contenttype + iv_compressiontype = iv_tf_data_compressiontype ). + + "Create an ABAP object for resource configuration." + lo_transformresources = NEW #( iv_instancecount = iv_instance_count + iv_instancetype = iv_instance_type ). + + "Create an ABAP object for output data configuration." + lo_transformoutput = NEW #( iv_s3outputpath = iv_s3_output_path ). + + "Create a transform job." + TRY. + oo_result = lo_sgm->createtransformjob( " oo_result is returned for testing purposes. " + iv_modelname = iv_tf_model_name + iv_transformjobname = iv_tf_job_name + io_transforminput = lo_transforminput + io_transformoutput = lo_transformoutput + io_transformresources = lo_transformresources ). + MESSAGE 'Transform job created.' TYPE 'I'. + CATCH /aws1/cx_sgmresourceinuse. + MESSAGE 'Resource being accessed is in use.' TYPE 'E'. + CATCH /aws1/cx_sgmresourcenotfound. + MESSAGE 'Resource being accessed is not found.' TYPE 'E'. + CATCH /aws1/cx_sgmresourcelimitexcd. + MESSAGE 'You have reached the limit on the number of resources.' TYPE 'E'. + ENDTRY. + "snippet-end:[sgm.abapv1.create_transform_job] + + ENDMETHOD. + + + METHOD delete_endpoint. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sgm) = /aws1/cl_sgm_factory=>create( lo_session ). + + "snippet-start:[sgm.abapv1.delete_endpoint] + "Delete an endpoint." + TRY. + lo_sgm->deleteendpoint( + iv_endpointname = iv_endpoint_name ). + MESSAGE 'Endpoint configuration deleted.' TYPE 'I'. + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_endpoint_exception). + DATA(lv_endpoint_error) = |"{ lo_endpoint_exception->av_err_code }" - { lo_endpoint_exception->av_err_msg }|. + MESSAGE lv_endpoint_error TYPE 'E'. + ENDTRY. + + "Delete an endpoint configuration." + TRY. + lo_sgm->deleteendpointconfig( + iv_endpointconfigname = iv_endpoint_config_name ). + MESSAGE 'Endpoint deleted.' TYPE 'I'. + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_endpointconfig_exception). + DATA(lv_endpointconfig_error) = |"{ lo_endpointconfig_exception->av_err_code }" - { lo_endpointconfig_exception->av_err_msg }|. + MESSAGE lv_endpointconfig_error TYPE 'E'. + ENDTRY. + "snippet-end:[sgm.abapv1.delete_endpoint] + + ENDMETHOD. + + + METHOD delete_model. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sgm) = /aws1/cl_sgm_factory=>create( lo_session ). + + "snippet-start:[sgm.abapv1.delete_model] + TRY. + lo_sgm->deletemodel( + iv_modelname = iv_model_name ). + MESSAGE 'Model deleted.' TYPE 'I'. + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). + DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDTRY. + "snippet-end:[sgm.abapv1.delete_model] + + + ENDMETHOD. + + + METHOD describe_training_job. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sgm) = /aws1/cl_sgm_factory=>create( lo_session ). + + "snippet-start:[sgm.abapv1.describe_training_job] + TRY. + oo_result = lo_sgm->describetrainingjob( " oo_result is returned for testing purposes. " + iv_trainingjobname = iv_training_job_name ). + MESSAGE 'Retrieved description of training job.' TYPE 'I'. + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). + DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDTRY. + "snippet-end:[sgm.abapv1.describe_training_job] + + ENDMETHOD. + + + METHOD list_algorithms. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sgm) = /aws1/cl_sgm_factory=>create( lo_session ). + + "snippet-start:[sgm.abapv1.list_algorithms] + TRY. + oo_result = lo_sgm->listalgorithms( " oo_result is returned for testing purposes. " + iv_namecontains = iv_name_contains ). + MESSAGE 'Retrieved list of algorithms.' TYPE 'I'. + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). + DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDTRY. + "snippet-end:[sgm.abapv1.list_algorithms] + + ENDMETHOD. + + + METHOD list_models. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sgm) = /aws1/cl_sgm_factory=>create( lo_session ). + + "snippet-start:[sgm.abapv1.list_models] + TRY. + oo_result = lo_sgm->listmodels( " oo_result is returned for testing purposes. " + iv_namecontains = iv_name_contains ). + MESSAGE 'Retrieved list of models.' TYPE 'I'. + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). + DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDTRY. + "snippet-end:[sgm.abapv1.list_models] + + ENDMETHOD. + + + METHOD list_notebook_instances. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sgm) = /aws1/cl_sgm_factory=>create( lo_session ). + + "snippet-start:[sgm.abapv1.list_notebook_instances] + TRY. + oo_result = lo_sgm->listnotebookinstances( " oo_result is returned for testing purposes. " + iv_namecontains = iv_name_contains ). + MESSAGE 'Retrieved list of notebook instances.' TYPE 'I'. + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). + DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDTRY. + "snippet-end:[sgm.abapv1.list_notebook_instances] + ENDMETHOD. + + + METHOD list_training_jobs. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sgm) = /aws1/cl_sgm_factory=>create( lo_session ). + + "snippet-start:[sgm.abapv1.list_training_jobs] + TRY. + oo_result = lo_sgm->listtrainingjobs( " oo_result is returned for testing purposes. " + iv_namecontains = iv_name_contains + iv_maxresults = iv_max_results ). + MESSAGE 'Retrieved list of training jobs.' TYPE 'I'. + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_exception). + DATA(lv_error) = |"{ lo_exception->av_err_code }" - { lo_exception->av_err_msg }|. + MESSAGE lv_error TYPE 'E'. + ENDTRY. + "snippet-end:[sgm.abapv1.list_training_jobs] + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/sgm/#awsex#cl_sgm_actions.clas.testclasses.abap b/sap-abap/services/sgm/#awsex#cl_sgm_actions.clas.testclasses.abap new file mode 100644 index 00000000000..27336f911c5 --- /dev/null +++ b/sap-abap/services/sgm/#awsex#cl_sgm_actions.clas.testclasses.abap @@ -0,0 +1,2453 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 + +CLASS ltc_awsex_cl_sgm_actions DEFINITION FOR TESTING DURATION LONG RISK LEVEL DANGEROUS. + + PRIVATE SECTION. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA ao_sgm TYPE REF TO /aws1/if_sgm. + DATA ao_s3 TYPE REF TO /aws1/if_s3. + DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. + DATA ao_sgm_actions TYPE REF TO /awsex/cl_sgm_actions. + DATA av_lrole TYPE /aws1/sgmrolearn. + DATA av_file_content TYPE /aws1/s3_streamingblob. + + METHODS setup RAISING /aws1/cx_rt_generic /awsex/cx_generic. + METHODS list_training_jobs FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS list_notebook_instances FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS list_models FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS list_algorithms FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS create_model FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS create_endpoint FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS create_transform_job FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS create_training_job FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS delete_endpoint FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS delete_model FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS describe_training_job FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + +ENDCLASS. "ltc_awsex_cl_sgm_actions + + +CLASS ltc_awsex_cl_sgm_actions IMPLEMENTATION. + METHOD setup. + ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). + ao_sgm = /aws1/cl_sgm_factory=>create( ao_session ). + ao_s3 = /aws1/cl_s3_factory=>create( ao_session ). + ao_sgm_actions = NEW /awsex/cl_sgm_actions( ). + + "Training data. + av_file_content = /aws1/cl_rt_util=>string_to_xstring( + |0 0:75 1:6.4 17:1 25:1 95:1 325:1\n| && + |0 0:59 1:7.3 16:1 19:1 296:1 328:1\n| && + |0 0:66 1:6.6 9:1 25:1 193:1 330:1\n| && + |0 0:64 1:6.9 9:1 21:1 146:1 330:1\n| && + |0 0:65 1:8.699999999999999 9:1 29:1 252:1 325:1\n| && + |0 0:61 1:6.1 14:1 29:1 42:1 325:1\n| && + |0 0:81 1:8.300000000000001 12:1 29:1 166:1 325:1\n| && + |0 0:43 1:3.9 10:1 27:1 310:1 330:1\n| && + |0 0:69 1:6.9 8:1 25:1 95:1 325:1\n| && + |1 0:88 1:8.6 9:1 21:1 204:1 330:1\n| && + |0 0:55 1:7.8 12:1 22:1 140:1 325:1\n| && + |0 0:62 1:6 16:1 29:1 95:1 325:1\n| && + |0 0:66 1:7.8 15:1 19:1 204:1 330:1\n| && + |0 0:85 1:5.8 7:1 19:1 295:1 328:1\n| && + |0 0:80 1:6.8 12:1 29:1 166:1 325:1\n| && + |0 0:70 1:3.6 7:1 28:1 95:1 330:1\n| && + |1 0:81 1:6.2 10:1 27:1 61:1 328:1\n| && + |0 0:77 1:7.1 7:1 30:1 222:1 326:1\n| && + |0 0:39 1:3.1 7:1 27:1 102:1 330:1\n| && + |0 0:55 1:5.7 4:1 21:1 278:1 330:1\n| && + |1 0:87 1:7.6 11:1 19:1 310:1 328:1\n| && + |0 0:62 1:6.2 9:1 25:1 149:1 325:1\n| && + |0 0:80 1:8 4:1 24:1 230:1 325:1\n| && + |0 0:68 1:4.9 7:1 30:1 298:1 330:1\n| && + |0 0:73 1:9 4:1 26:1 204:1 330:1\n| && + |0 0:66 1:7.2 9:1 19:1 204:1 330:1\n| && + |0 0:66 1:8.199999999999999 8:1 26:1 38:1 325:1\n| && + |0 0:86 1:8.199999999999999 4:1 23:1 209:1 325:1\n| && + |0 0:81 1:6.4 8:1 29:1 95:1 325:1\n| && + |0 0:71 1:7.1 5:1 29:1 95:1 325:1\n| && + |0 0:79 1:7.9 5:1 22:1 42:1 325:1\n| && + |1 0:64 1:6.4 9:1 22:1 252:1 330:1\n| && + |0 0:78 1:8.300000000000001 9:1 29:1 42:1 325:1\n| && + |1 0:91 1:9 8:1 19:1 305:1 328:1\n| && + |0 0:84 1:6.8 10:1 29:1 95:1 326:1\n| && + |0 0:85 1:8.199999999999999 7:1 27:1 322:1 328:1\n| && + |0 0:33 1:7 4:1 27:1 166:1 325:1\n| && + |0 0:73 1:3 7:1 27:1 42:1 328:1\n| && + |0 0:81 1:8 6:1 29:1 95:1 325:1\n| && + |0 0:59 1:6.8 2:1 25:1 75:1 325:1\n| && + |0 0:85 1:7.5 9:1 29:1 249:1 325:1\n| && + |0 0:79 1:7.6 5:1 29:1 95:1 325:1\n| && + |0 0:63 1:6.9 10:1 29:1 95:1 325:1\n| && + |1 0:95 1:6.8 10:1 23:1 252:1 325:1\n| && + |0 0:47 1:6.1 6:1 19:1 95:1 330:1\n| && + |0 0:81 1:8.6 14:1 19:1 249:1 328:1\n| && + |0 0:50 1:7 9:1 27:1 193:1 328:1\n| && + |0 0:88 1:7.9 10:1 29:1 95:1 326:1\n| && + |1 0:74 1:6.1 10:1 29:1 166:1 325:1\n| && + |0 0:82 1:8.1 17:1 29:1 95:1 325:1\n| && + |0 0:67 1:7.2 10:1 19:1 95:1 328:1\n| && + |0 0:67 1:6.7 6:1 23:1 307:1 326:1\n| && + |0 0:77 1:7.9 10:1 29:1 95:1 325:1\n| && + |0 0:68 1:5.9 7:1 19:1 61:1 328:1\n| && + |1 0:81 1:7.5 10:1 19:1 310:1 326:1\n| && + |0 0:62 1:7.5 4:1 26:1 278:1 326:1\n| && + |1 0:53 1:6.9 5:1 26:1 149:1 325:1\n| && + |0 0:78 1:8.1 2:1 26:1 315:1 326:1\n| && + |0 0:54 1:5.4 17:1 29:1 79:1 325:1\n| && + |0 0:89 1:8.4 10:1 25:1 252:1 326:1\n| && + |1 0:75 1:5.6 2:1 26:1 209:1 325:1\n| && + |0 0:78 1:8.300000000000001 9:1 29:1 252:1 325:1\n| && + |0 0:75 1:8.199999999999999 7:1 28:1 198:1 325:1\n| && + |0 0:72 1:7 7:1 27:1 256:1 330:1\n| && + |0 0:57 1:4.8 9:1 21:1 71:1 330:1\n| && + |0 0:58 1:5.9 10:1 27:1 204:1 330:1\n| && + |0 0:74 1:8.300000000000001 17:1 28:1 224:1 330:1\n| && + |0 0:48 1:7.1 14:1 26:1 249:1 330:1\n| && + |0 0:82 1:7.3 10:1 22:1 276:1 330:1\n| && + |0 0:66 1:7.4 6:1 25:1 307:1 325:1\n| && + |1 0:70 1:8.699999999999999 9:1 19:1 95:1 325:1\n| && + |0 0:86 1:8.4 7:1 23:1 295:1 326:1\n| && + |0 0:42 1:4.2 17:1 25:1 204:1 330:1\n| && + |0 0:75 1:7.8 4:1 27:1 75:1 325:1\n| && + |0 0:93 1:9.300000000000001 9:1 19:1 71:1 330:1\n| && + |0 0:63 1:7.8 17:1 22:1 279:1 330:1\n| && + |1 0:71 1:5.7 4:1 24:1 193:1 326:1\n| && + |0 0:42 1:5 16:1 19:1 256:1 326:1\n| && + |0 0:53 1:5.2 16:1 22:1 249:1 330:1\n| && + |0 0:64 1:6.4 12:1 19:1 282:1 330:1\n| && + |0 0:60 1:7 14:1 19:1 209:1 325:1\n| && + |0 0:86 1:7.4 16:1 21:1 95:1 328:1\n| && + |0 0:91 1:8.9 17:1 29:1 249:1 325:1\n| && + |1 0:82 1:7.8 10:1 26:1 61:1 328:1\n| && + |1 0:92 1:8.300000000000001 16:1 22:1 95:1 330:1\n| && + |1 0:85 1:8.800000000000001 9:1 26:1 252:1 325:1\n| && + |0 0:79 1:7.5 9:1 29:1 252:1 325:1\n| && + |1 0:61 1:5.3 14:1 28:1 35:1 325:1\n| && + |0 0:75 1:7.7 7:1 28:1 95:1 330:1\n| && + |0 0:68 1:8.5 14:1 29:1 279:1 326:1\n| && + |1 0:67 1:5 16:1 27:1 71:1 328:1\n| && + |0 0:79 1:8.5 12:1 26:1 103:1 330:1\n| && + |0 0:61 1:5.1 16:1 29:1 105:1 330:1\n| && + |1 0:72 1:8.699999999999999 12:1 26:1 71:1 330:1\n| && + |0 0:60 1:6.3 9:1 20:1 307:1 328:1\n| && + |0 0:67 1:7.8 9:1 29:1 39:1 325:1\n| && + |0 0:53 1:5.6 9:1 26:1 189:1 330:1\n| && + |1 0:98 1:7.7 8:1 29:1 42:1 330:1\n| && + |0 0:76 1:6.7 7:1 28:1 75:1 330:1\n| && + |1 0:74 1:5.3 7:1 28:1 95:1 330:1\n| ). + + ENDMETHOD. + + METHOD create_training_job. + + DATA lo_result TYPE REF TO /aws1/cl_sgmcreatetrnjobrsp. + DATA lv_training_job_name TYPE /aws1/sgmtrainingjobname. + + DATA lv_bucket_name TYPE /aws1/s3_bucketname. + DATA lv_file_content TYPE /aws1/s3_streamingblob. + DATA lv_trn_data_s3uri TYPE /aws1/sgms3uri. + DATA lv_val_data_s3uri TYPE /aws1/sgms3uri. + DATA lv_s3_output_path TYPE /aws1/sgms3uri. + DATA lv_model_key TYPE /aws1/s3_objectkey. + DATA lo_training_result TYPE REF TO /aws1/cl_sgmdescrtrnjobrsp. + DATA lv_uuid_16 TYPE sysuuid_x16. + + "Define hyperparameters. + CONSTANTS cv_hp_max_depth TYPE /aws1/sgmhyperparametervalue VALUE '3'. + CONSTANTS cv_hp_scale_pos_weight TYPE /aws1/sgmhyperparametervalue VALUE '2.0'. + CONSTANTS cv_hp_num_round TYPE /aws1/sgmhyperparametervalue VALUE '100'. + CONSTANTS cv_hp_objective TYPE /aws1/sgmhyperparametervalue VALUE 'binary:logistic'. + CONSTANTS cv_hp_subsample TYPE /aws1/sgmhyperparametervalue VALUE '0.5'. + CONSTANTS cv_hp_eta TYPE /aws1/sgmhyperparametervalue VALUE '0.1'. + CONSTANTS cv_hp_eval_metric TYPE /aws1/sgmhyperparametervalue VALUE 'auc'. + + "Define training data. + CONSTANTS cv_trn_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. + CONSTANTS cv_trn_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. + CONSTANTS cv_trn_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. + CONSTANTS cv_trn_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. + + "Define validation data. + CONSTANTS cv_val_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. + CONSTANTS cv_val_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. + CONSTANTS cv_val_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. + CONSTANTS cv_val_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. + + "Define training parameters. + CONSTANTS cv_training_image TYPE /aws1/sgmalgorithmimage VALUE '246618743249.dkr.ecr.us-west-2.amazonaws.com/sagemaker-xgboost:1.5-1'. + CONSTANTS cv_training_input_mode TYPE /aws1/sgmtraininginputmode VALUE 'File'. + CONSTANTS cv_instance_count TYPE /aws1/sgmtraininginstancecount VALUE '1'. + CONSTANTS cv_instance_type TYPE /aws1/sgmtraininginstancetype VALUE 'ml.c4.2xlarge'. + CONSTANTS cv_volume_sizeingb TYPE /aws1/sgmvolumesizeingb VALUE '10'. + CONSTANTS cv_max_runtime_in_seconds TYPE /aws1/sgmmaxruntimeinseconds VALUE '1800'. + CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-sgm-'. + CONSTANTS cv_train_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/train/train.libsvm'. + CONSTANTS cv_val_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/validation/validation.libsvm'. + + "Define role Amazon Resource Name (ARN). + DATA(lt_roles) = ao_session->get_configuration( )->get_logical_iam_roles( ). + READ TABLE lt_roles INDEX 1 INTO DATA(lo_role). " take first role from the logical role mapping + av_lrole = lo_role-iam_role_arn. + + "Define job name. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_training_job_name = 'code-example-trn-job-' && lv_uuid_16. + TRANSLATE lv_training_job_name TO LOWER CASE. + + "Create training data in Amazon Simple Storage Service (Amazon S3). + lv_bucket_name = cv_bucket_name && lv_uuid_16. + TRANSLATE lv_bucket_name TO LOWER CASE. + /awsex/cl_utils=>create_bucket( iv_bucket = lv_bucket_name + io_s3 = ao_s3 + io_session = ao_session ). + + + lv_trn_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_train_key. + lv_val_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_val_key. + lv_s3_output_path = 's3://' && lv_bucket_name && '/' && 'sagemaker/'. + lv_model_key = 'sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. + + ao_s3->putobject( + iv_bucket = lv_bucket_name + iv_key = cv_train_key + iv_body = av_file_content ). + + ao_s3->putobject( + iv_bucket = lv_bucket_name + iv_key = cv_val_key + iv_body = av_file_content ). + + "Testing. + ao_sgm_actions->create_training_job( + EXPORTING + iv_training_job_name = lv_training_job_name + iv_role_arn = av_lrole + iv_trn_data_s3datatype = cv_trn_data_s3datatype + iv_trn_data_s3datadistribution = cv_trn_data_s3datadistribution + iv_trn_data_s3uri = lv_trn_data_s3uri + iv_trn_data_compressiontype = cv_trn_data_compressiontype + iv_trn_data_contenttype = cv_trn_data_contenttype + iv_val_data_s3datatype = cv_val_data_s3datatype + iv_val_data_s3datadistribution = cv_val_data_s3datadistribution + iv_val_data_s3uri = lv_val_data_s3uri + iv_val_data_compressiontype = cv_val_data_compressiontype + iv_val_data_contenttype = cv_val_data_contenttype + iv_hp_max_depth = cv_hp_max_depth + iv_hp_scale_pos_weight = cv_hp_scale_pos_weight + iv_hp_num_round = cv_hp_num_round + iv_hp_objective = cv_hp_objective + iv_hp_subsample = cv_hp_subsample + iv_hp_eval_metric = cv_hp_eval_metric + iv_hp_eta = cv_hp_eta + iv_training_image = cv_training_image + iv_training_input_mode = cv_training_input_mode + iv_instance_count = cv_instance_count + iv_instance_type = cv_instance_type + iv_volume_sizeingb = cv_volume_sizeingb + iv_s3_output_path = lv_s3_output_path + iv_max_runtime_in_seconds = cv_max_runtime_in_seconds + IMPORTING + oo_result = lo_result ). + + DATA(lv_found) = abap_false. + IF lo_result->has_trainingjobarn( ) = 'X'. + lv_found = abap_true. + ENDIF. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Training Job cannot be found| ). + + "Wait for training job to be completed. + lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). + WHILE lo_training_result->get_trainingjobstatus( ) <> 'Completed'. + IF sy-index = 30. + EXIT. "maximum 900 seconds + ENDIF. + WAIT UP TO 30 SECONDS. + lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). + ENDWHILE. + + "Clean up. + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = cv_train_key ). + + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = cv_val_key ). + + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = lv_model_key ). + + ao_s3->deletebucket( + iv_bucket = lv_bucket_name ). + + ENDMETHOD. + + METHOD list_training_jobs. + + DATA lo_hyperparameters_w TYPE REF TO /aws1/cl_sgmhyperparameters_w. + DATA lt_hyperparameters TYPE /aws1/cl_sgmhyperparameters_w=>tt_hyperparameters. + DATA lt_input_data_config TYPE /aws1/cl_sgmchannel=>tt_inputdataconfig. + DATA lo_trn_channel TYPE REF TO /aws1/cl_sgmchannel. + DATA lo_trn_datasource TYPE REF TO /aws1/cl_sgmdatasource. + DATA lo_trn_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. + DATA lo_val_channel TYPE REF TO /aws1/cl_sgmchannel. + DATA lo_val_datasource TYPE REF TO /aws1/cl_sgmdatasource. + DATA lo_val_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. + DATA lo_output_data_config TYPE REF TO /aws1/cl_sgmoutputdataconfig. + DATA lo_resource_config TYPE REF TO /aws1/cl_sgmresourceconfig. + DATA lo_algorithm_specification TYPE REF TO /aws1/cl_sgmalgorithmspec. + DATA lo_list_result TYPE REF TO /aws1/cl_sgmlisttrnjobsrsp. + DATA lo_stopping_condition TYPE REF TO /aws1/cl_sgmstoppingcondition. + DATA lv_training_job_name TYPE /aws1/sgmtrainingjobname. + + DATA lv_bucket_name TYPE /aws1/s3_bucketname. + DATA lv_file_content TYPE /aws1/s3_streamingblob. + DATA lv_trn_data_s3uri TYPE /aws1/sgms3uri. + DATA lv_val_data_s3uri TYPE /aws1/sgms3uri. + DATA lv_s3_output_path TYPE /aws1/sgms3uri. + DATA lv_model_key TYPE /aws1/s3_objectkey. + DATA lo_training_result TYPE REF TO /aws1/cl_sgmdescrtrnjobrsp. + DATA lv_uuid_16 TYPE sysuuid_x16. + + "Create training data in Amazon S3. + CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-sgm-'. + CONSTANTS cv_train_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/train/train.libsvm'. + CONSTANTS cv_val_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/validation/validation.libsvm'. + + "Define hyperparameters. + CONSTANTS cv_hp_max_depth TYPE /aws1/sgmhyperparametervalue VALUE '3'. + CONSTANTS cv_hp_scale_pos_weight TYPE /aws1/sgmhyperparametervalue VALUE '2.0'. + CONSTANTS cv_hp_num_round TYPE /aws1/sgmhyperparametervalue VALUE '100'. + CONSTANTS cv_hp_objective TYPE /aws1/sgmhyperparametervalue VALUE 'binary:logistic'. + CONSTANTS cv_hp_subsample TYPE /aws1/sgmhyperparametervalue VALUE '0.5'. + CONSTANTS cv_hp_eta TYPE /aws1/sgmhyperparametervalue VALUE '0.1'. + CONSTANTS cv_hp_eval_metric TYPE /aws1/sgmhyperparametervalue VALUE 'auc'. + + "Define training data. + CONSTANTS cv_trn_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. + CONSTANTS cv_trn_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. + CONSTANTS cv_trn_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. + CONSTANTS cv_trn_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. + + "Define validation data. + CONSTANTS cv_val_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. + CONSTANTS cv_val_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. + CONSTANTS cv_val_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. + CONSTANTS cv_val_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. + + "Define training parameters. + CONSTANTS cv_training_image TYPE /aws1/sgmalgorithmimage VALUE '246618743249.dkr.ecr.us-west-2.amazonaws.com/sagemaker-xgboost:1.5-1'. + CONSTANTS cv_training_input_mode TYPE /aws1/sgmtraininginputmode VALUE 'File'. + CONSTANTS cv_instance_count TYPE /aws1/sgmtraininginstancecount VALUE '1'. + CONSTANTS cv_instance_type TYPE /aws1/sgmtraininginstancetype VALUE 'ml.c4.2xlarge'. + CONSTANTS cv_volume_sizeingb TYPE /aws1/sgmvolumesizeingb VALUE '10'. + CONSTANTS cv_max_runtime_in_seconds TYPE /aws1/sgmmaxruntimeinseconds VALUE '1800'. + CONSTANTS cv_max_results TYPE /aws1/sgmmaxresults VALUE '1'. + + "Define role ARN. + DATA(lt_roles) = ao_session->get_configuration( )->get_logical_iam_roles( ). + READ TABLE lt_roles INDEX 1 INTO DATA(lo_role). " take first role from the logical role mapping + av_lrole = lo_role-iam_role_arn. + + "Define job name. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_training_job_name = 'code-example-trn-job-' && lv_uuid_16. + TRANSLATE lv_training_job_name TO LOWER CASE. + + "Create training data in Amazon S3. + lv_bucket_name = cv_bucket_name && lv_uuid_16. + TRANSLATE lv_bucket_name TO LOWER CASE. + /awsex/cl_utils=>create_bucket( iv_bucket = lv_bucket_name + io_s3 = ao_s3 + io_session = ao_session ). + + + lv_trn_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_train_key. + lv_val_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_val_key. + lv_s3_output_path = 's3://' && lv_bucket_name && '/' && 'sagemaker/'. + lv_model_key = 'sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. + + ao_s3->putobject( + iv_bucket = lv_bucket_name + iv_key = cv_train_key + iv_body = av_file_content ). + + ao_s3->putobject( + iv_bucket = lv_bucket_name + iv_key = cv_val_key + iv_body = av_file_content ). + + "Create ABAP internal table for hyperparameters based on input variables. + lo_hyperparameters_w = NEW #( iv_value = cv_hp_max_depth ). + INSERT VALUE #( key = 'max_depth' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_eta ). + INSERT VALUE #( key = 'eta' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_eval_metric ). + INSERT VALUE #( key = 'eval_metric' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_scale_pos_weight ). + INSERT VALUE #( key = 'scale_pos_weight' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_subsample ). + INSERT VALUE #( key = 'subsample' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_objective ). + INSERT VALUE #( key = 'objective' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_num_round ). + INSERT VALUE #( key = 'num_round' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + "Create ABAP objects for data based on input variables. + "Training data. + lo_trn_s3datasource = NEW #( iv_s3datatype = cv_trn_data_s3datatype + iv_s3datadistributiontype = cv_trn_data_s3datadistribution + iv_s3uri = lv_trn_data_s3uri ). + + lo_trn_datasource = NEW #( io_s3datasource = lo_trn_s3datasource ). + + lo_trn_channel = NEW #( iv_channelname = 'train' + io_datasource = lo_trn_datasource + iv_compressiontype = cv_trn_data_compressiontype + iv_contenttype = cv_trn_data_contenttype ). + + INSERT lo_trn_channel INTO TABLE lt_input_data_config. + + "Validation data. + lo_val_s3datasource = NEW #( iv_s3datatype = cv_val_data_s3datatype + iv_s3datadistributiontype = cv_val_data_s3datadistribution + iv_s3uri = lv_val_data_s3uri ). + + lo_val_datasource = NEW #( io_s3datasource = lo_val_s3datasource ). + + lo_val_channel = NEW #( iv_channelname = 'validation' + io_datasource = lo_val_datasource + iv_compressiontype = cv_val_data_compressiontype + iv_contenttype = cv_val_data_contenttype ). + + INSERT lo_val_channel INTO TABLE lt_input_data_config. + + "Create an ABAP object for algorithm specification based on input variables. + lo_algorithm_specification = NEW #( iv_trainingimage = cv_training_image + iv_traininginputmode = cv_training_input_mode ). + + "Create an ABAP object for resource configuration. + lo_resource_config = NEW #( iv_instancecount = cv_instance_count + iv_instancetype = cv_instance_type + iv_volumesizeingb = cv_volume_sizeingb ). + + "Create an ABAP object for output data configuration. + lo_output_data_config = NEW #( iv_s3outputpath = lv_s3_output_path ). + + "Create an ABAP object for stopping condition. + lo_stopping_condition = NEW #( iv_maxruntimeinseconds = cv_max_runtime_in_seconds ). + + "Create a training job. + ao_sgm->createtrainingjob( + iv_trainingjobname = lv_training_job_name + iv_rolearn = av_lrole + it_hyperparameters = lt_hyperparameters + it_inputdataconfig = lt_input_data_config + io_algorithmspecification = lo_algorithm_specification + io_outputdataconfig = lo_output_data_config + io_resourceconfig = lo_resource_config + io_stoppingcondition = lo_stopping_condition ). + + "Testing. + ao_sgm_actions->list_training_jobs( + EXPORTING + iv_name_contains = lv_training_job_name + iv_max_results = cv_max_results + IMPORTING + oo_result = lo_list_result ). + + "Validation. + DATA(lv_found) = abap_false. + LOOP AT lo_list_result->get_trainingjobsummaries( ) INTO DATA(lo_job). + IF lo_job->has_trainingjobname( ) = 'X'. + lv_found = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Training job cannot be found| ). + + "Wait for training job to be completed. + lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). + WHILE lo_training_result->get_trainingjobstatus( ) <> 'Completed'. + IF sy-index = 30. + EXIT. "maximum 900 seconds + ENDIF. + WAIT UP TO 30 SECONDS. + lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). + ENDWHILE. + + "Clean up. + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = cv_train_key ). + + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = cv_val_key ). + + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = lv_model_key ). + + ao_s3->deletebucket( + iv_bucket = lv_bucket_name ). + + ENDMETHOD. + + METHOD describe_training_job. + + DATA lv_training_job_name TYPE /aws1/sgmtrainingjobname. + DATA lo_hyperparameters_w TYPE REF TO /aws1/cl_sgmhyperparameters_w. + DATA lt_hyperparameters TYPE /aws1/cl_sgmhyperparameters_w=>tt_hyperparameters. + DATA lt_input_data_config TYPE /aws1/cl_sgmchannel=>tt_inputdataconfig. + DATA lo_trn_channel TYPE REF TO /aws1/cl_sgmchannel. + DATA lo_trn_datasource TYPE REF TO /aws1/cl_sgmdatasource. + DATA lo_trn_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. + DATA lo_val_channel TYPE REF TO /aws1/cl_sgmchannel. + DATA lo_val_datasource TYPE REF TO /aws1/cl_sgmdatasource. + DATA lo_val_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. + DATA lo_stopping_condition TYPE REF TO /aws1/cl_sgmstoppingcondition. + DATA lo_algorithm_specification TYPE REF TO /aws1/cl_sgmalgorithmspec. + DATA lo_resource_config TYPE REF TO /aws1/cl_sgmresourceconfig. + DATA lo_output_data_config TYPE REF TO /aws1/cl_sgmoutputdataconfig. + DATA lo_list_result TYPE REF TO /aws1/cl_sgmdescrtrnjobrsp. + + DATA lv_bucket_name TYPE /aws1/s3_bucketname. + DATA lv_file_content TYPE /aws1/s3_streamingblob. + DATA lv_trn_data_s3uri TYPE /aws1/sgms3uri. + DATA lv_val_data_s3uri TYPE /aws1/sgms3uri. + DATA lv_s3_output_path TYPE /aws1/sgms3uri. + DATA lv_model_key TYPE /aws1/s3_objectkey. + DATA lo_training_result TYPE REF TO /aws1/cl_sgmdescrtrnjobrsp. + DATA lv_uuid_16 TYPE sysuuid_x16. + + "Define hyperparameters. + CONSTANTS cv_hp_max_depth TYPE /aws1/sgmhyperparametervalue VALUE '3'. + CONSTANTS cv_hp_scale_pos_weight TYPE /aws1/sgmhyperparametervalue VALUE '2.0'. + CONSTANTS cv_hp_num_round TYPE /aws1/sgmhyperparametervalue VALUE '100'. + CONSTANTS cv_hp_objective TYPE /aws1/sgmhyperparametervalue VALUE 'binary:logistic'. + CONSTANTS cv_hp_subsample TYPE /aws1/sgmhyperparametervalue VALUE '0.5'. + CONSTANTS cv_hp_eta TYPE /aws1/sgmhyperparametervalue VALUE '0.1'. + CONSTANTS cv_hp_eval_metric TYPE /aws1/sgmhyperparametervalue VALUE 'auc'. + + "Define training data. + CONSTANTS cv_trn_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. + CONSTANTS cv_trn_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. + CONSTANTS cv_trn_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. + CONSTANTS cv_trn_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. + + "Define validation data. + CONSTANTS cv_val_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. + CONSTANTS cv_val_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. + CONSTANTS cv_val_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. + CONSTANTS cv_val_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. + + "Define training parameters. + CONSTANTS cv_training_image TYPE /aws1/sgmalgorithmimage VALUE '246618743249.dkr.ecr.us-west-2.amazonaws.com/sagemaker-xgboost:1.5-1'. + CONSTANTS cv_training_input_mode TYPE /aws1/sgmtraininginputmode VALUE 'File'. + CONSTANTS cv_instance_count TYPE /aws1/sgmtraininginstancecount VALUE '1'. + CONSTANTS cv_instance_type TYPE /aws1/sgmtraininginstancetype VALUE 'ml.c4.2xlarge'. + CONSTANTS cv_volume_sizeingb TYPE /aws1/sgmvolumesizeingb VALUE '10'. + CONSTANTS cv_max_runtime_in_seconds TYPE /aws1/sgmmaxruntimeinseconds VALUE '1800'. + CONSTANTS cv_job_status TYPE /aws1/sgmtrainingjobstatus VALUE 'InProgress'. + CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-sgm-'. + CONSTANTS cv_train_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/train/train.libsvm'. + CONSTANTS cv_val_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/validation/validation.libsvm'. + + "Define role ARN. + DATA(lt_roles) = ao_session->get_configuration( )->get_logical_iam_roles( ). + READ TABLE lt_roles INDEX 1 INTO DATA(lo_role). " take first role from the logical role mapping + av_lrole = lo_role-iam_role_arn. + + "Define job name. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_training_job_name = 'code-example-trn-job-' && lv_uuid_16. + TRANSLATE lv_training_job_name TO LOWER CASE. + + "Create training data in Amazon S3. + lv_bucket_name = cv_bucket_name && lv_uuid_16. + TRANSLATE lv_bucket_name TO LOWER CASE. + /awsex/cl_utils=>create_bucket( iv_bucket = lv_bucket_name + io_s3 = ao_s3 + io_session = ao_session ). + + + lv_trn_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_train_key. + lv_val_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_val_key. + lv_s3_output_path = 's3://' && lv_bucket_name && '/' && 'sagemaker/'. + lv_model_key = 'sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. + + ao_s3->putobject( + iv_bucket = lv_bucket_name + iv_key = cv_train_key + iv_body = av_file_content ). + + ao_s3->putobject( + iv_bucket = lv_bucket_name + iv_key = cv_val_key + iv_body = av_file_content ). + + "Create ABAP internal table for hyperparameters based on input variables. + lo_hyperparameters_w = NEW #( iv_value = cv_hp_max_depth ). + INSERT VALUE #( key = 'max_depth' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_eta ). + INSERT VALUE #( key = 'eta' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_eval_metric ). + INSERT VALUE #( key = 'eval_metric' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_scale_pos_weight ). + INSERT VALUE #( key = 'scale_pos_weight' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_subsample ). + INSERT VALUE #( key = 'subsample' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_objective ). + INSERT VALUE #( key = 'objective' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_num_round ). + INSERT VALUE #( key = 'num_round' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + "Create ABAP objects for data based on input variables. + "Training data. + lo_trn_s3datasource = NEW #( iv_s3datatype = cv_trn_data_s3datatype + iv_s3datadistributiontype = cv_trn_data_s3datadistribution + iv_s3uri = lv_trn_data_s3uri ). + + lo_trn_datasource = NEW #( io_s3datasource = lo_trn_s3datasource ). + + lo_trn_channel = NEW #( iv_channelname = 'train' + io_datasource = lo_trn_datasource + iv_compressiontype = cv_trn_data_compressiontype + iv_contenttype = cv_trn_data_contenttype ). + + INSERT lo_trn_channel INTO TABLE lt_input_data_config. + + "Validation data. + lo_val_s3datasource = NEW #( iv_s3datatype = cv_val_data_s3datatype + iv_s3datadistributiontype = cv_val_data_s3datadistribution + iv_s3uri = lv_val_data_s3uri ). + + lo_val_datasource = NEW #( io_s3datasource = lo_val_s3datasource ). + + lo_val_channel = NEW #( iv_channelname = 'validation' + io_datasource = lo_val_datasource + iv_compressiontype = cv_val_data_compressiontype + iv_contenttype = cv_val_data_contenttype ). + + INSERT lo_val_channel INTO TABLE lt_input_data_config. + + "Create an ABAP object for algorithm specification based on input variables. + lo_algorithm_specification = NEW #( iv_trainingimage = cv_training_image + iv_traininginputmode = cv_training_input_mode ). + + "Create an ABAP object for resource configuration. + lo_resource_config = NEW #( iv_instancecount = cv_instance_count + iv_instancetype = cv_instance_type + iv_volumesizeingb = cv_volume_sizeingb ). + + "Create an ABAP object for output data configuration. + lo_output_data_config = NEW #( iv_s3outputpath = lv_s3_output_path ). + + "Create an ABAP object for stopping condition. + lo_stopping_condition = NEW #( iv_maxruntimeinseconds = cv_max_runtime_in_seconds ). + + "Create a training job. + ao_sgm->createtrainingjob( + iv_trainingjobname = lv_training_job_name + iv_rolearn = av_lrole + it_hyperparameters = lt_hyperparameters + it_inputdataconfig = lt_input_data_config + io_algorithmspecification = lo_algorithm_specification + io_outputdataconfig = lo_output_data_config + io_resourceconfig = lo_resource_config + io_stoppingcondition = lo_stopping_condition ). + + "Testing describe training job method. + ao_sgm_actions->describe_training_job( EXPORTING iv_training_job_name = lv_training_job_name IMPORTING oo_result = lo_list_result ). + + DATA(lv_found) = abap_false. + + IF lo_list_result->get_trainingjobstatus( ) = cv_job_status. + lv_found = abap_true. + ENDIF. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Training job status is incorrect| ). + + "Wait for training job to be completed. + lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). + WHILE lo_training_result->get_trainingjobstatus( ) <> 'Completed'. + IF sy-index = 30. + EXIT. "maximum 900 seconds + ENDIF. + WAIT UP TO 30 SECONDS. + lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). + ENDWHILE. + + "Clean up. + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = cv_train_key ). + + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = cv_val_key ). + + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = lv_model_key ). + + ao_s3->deletebucket( + iv_bucket = lv_bucket_name ). + + ENDMETHOD. + + METHOD create_model. + + DATA lo_hyperparameters_w TYPE REF TO /aws1/cl_sgmhyperparameters_w. + DATA lt_hyperparameters TYPE /aws1/cl_sgmhyperparameters_w=>tt_hyperparameters. + DATA lt_input_data_config TYPE /aws1/cl_sgmchannel=>tt_inputdataconfig. + DATA lo_trn_channel TYPE REF TO /aws1/cl_sgmchannel. + DATA lo_trn_datasource TYPE REF TO /aws1/cl_sgmdatasource. + DATA lo_trn_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. + DATA lo_val_channel TYPE REF TO /aws1/cl_sgmchannel. + DATA lo_val_datasource TYPE REF TO /aws1/cl_sgmdatasource. + DATA lo_val_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. + DATA lo_output_data_config TYPE REF TO /aws1/cl_sgmoutputdataconfig. + DATA lo_resource_config TYPE REF TO /aws1/cl_sgmresourceconfig. + DATA lo_algorithm_specification TYPE REF TO /aws1/cl_sgmalgorithmspec. + DATA lo_list_result TYPE REF TO /aws1/cl_sgmlisttrnjobsrsp. + DATA lo_stopping_condition TYPE REF TO /aws1/cl_sgmstoppingcondition. + DATA lv_training_job_name TYPE /aws1/sgmtrainingjobname. + + DATA lo_result TYPE REF TO /aws1/cl_sgmcreatemodeloutput. + DATA lv_model_name TYPE /aws1/sgmmodelname. + DATA lv_model_data_url TYPE /aws1/sgmurl. + DATA lv_bucket_name TYPE /aws1/s3_bucketname. + DATA lv_file_content TYPE /aws1/s3_streamingblob. + DATA lv_trn_data_s3uri TYPE /aws1/sgms3uri. + DATA lv_val_data_s3uri TYPE /aws1/sgms3uri. + DATA lv_s3_output_path TYPE /aws1/sgms3uri. + DATA lv_model_key TYPE /aws1/s3_objectkey. + DATA lo_training_result TYPE REF TO /aws1/cl_sgmdescrtrnjobrsp. + DATA lv_uuid_16 TYPE sysuuid_x16. + + "Define Amazon S3 parameters for data. + CONSTANTS cv_container_image TYPE /aws1/sgmcontainerimage VALUE '246618743249.dkr.ecr.us-west-2.amazonaws.com/sagemaker-xgboost:1.5-1'. + CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-sgm-'. + CONSTANTS cv_train_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/train/train.libsvm'. + CONSTANTS cv_val_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/validation/validation.libsvm'. + + "Define hyperparameters. + CONSTANTS cv_hp_max_depth TYPE /aws1/sgmhyperparametervalue VALUE '3'. + CONSTANTS cv_hp_scale_pos_weight TYPE /aws1/sgmhyperparametervalue VALUE '2.0'. + CONSTANTS cv_hp_num_round TYPE /aws1/sgmhyperparametervalue VALUE '100'. + CONSTANTS cv_hp_objective TYPE /aws1/sgmhyperparametervalue VALUE 'binary:logistic'. + CONSTANTS cv_hp_subsample TYPE /aws1/sgmhyperparametervalue VALUE '0.5'. + CONSTANTS cv_hp_eta TYPE /aws1/sgmhyperparametervalue VALUE '0.1'. + CONSTANTS cv_hp_eval_metric TYPE /aws1/sgmhyperparametervalue VALUE 'auc'. + + "Define training data. + CONSTANTS cv_trn_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. + CONSTANTS cv_trn_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. + CONSTANTS cv_trn_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. + CONSTANTS cv_trn_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. + + "Define validation data. + CONSTANTS cv_val_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. + CONSTANTS cv_val_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. + CONSTANTS cv_val_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. + CONSTANTS cv_val_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. + + "Define training parameters. + CONSTANTS cv_training_image TYPE /aws1/sgmalgorithmimage VALUE '246618743249.dkr.ecr.us-west-2.amazonaws.com/sagemaker-xgboost:1.5-1'. + CONSTANTS cv_training_input_mode TYPE /aws1/sgmtraininginputmode VALUE 'File'. + CONSTANTS cv_instance_count TYPE /aws1/sgmtraininginstancecount VALUE '1'. + CONSTANTS cv_instance_type TYPE /aws1/sgmtraininginstancetype VALUE 'ml.c4.2xlarge'. + CONSTANTS cv_volume_sizeingb TYPE /aws1/sgmvolumesizeingb VALUE '10'. + CONSTANTS cv_max_runtime_in_seconds TYPE /aws1/sgmmaxruntimeinseconds VALUE '1800'. + CONSTANTS cv_max_results TYPE /aws1/sgmmaxresults VALUE '1'. + + "Define role ARN. + DATA(lt_roles) = ao_session->get_configuration( )->get_logical_iam_roles( ). + READ TABLE lt_roles INDEX 1 INTO DATA(lo_role). " take first role from the logical role mapping + av_lrole = lo_role-iam_role_arn. + + "Define job name. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_training_job_name = 'code-example-trn-job-' && lv_uuid_16. + TRANSLATE lv_training_job_name TO LOWER CASE. + + "Define model name. + lv_model_name = 'code-example-model-' && lv_uuid_16. + TRANSLATE lv_model_name TO LOWER CASE. + + "Create training data in Amazon S3. + lv_bucket_name = cv_bucket_name && lv_uuid_16. + TRANSLATE lv_bucket_name TO LOWER CASE. + /awsex/cl_utils=>create_bucket( iv_bucket = lv_bucket_name + io_s3 = ao_s3 + io_session = ao_session ). + + + lv_trn_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_train_key. + lv_val_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_val_key. + lv_s3_output_path = 's3://' && lv_bucket_name && '/' && 'sagemaker/'. + lv_model_key = 'sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. + lv_model_data_url = 's3://' && lv_bucket_name && '/sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. + + + ao_s3->putobject( + iv_bucket = lv_bucket_name + iv_key = cv_train_key + iv_body = av_file_content ). + + ao_s3->putobject( + iv_bucket = lv_bucket_name + iv_key = cv_val_key + iv_body = av_file_content ). + + "Create ABAP internal table for hyperparameters based on input variables. + lo_hyperparameters_w = NEW #( iv_value = cv_hp_max_depth ). + INSERT VALUE #( key = 'max_depth' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_eta ). + INSERT VALUE #( key = 'eta' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_eval_metric ). + INSERT VALUE #( key = 'eval_metric' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_scale_pos_weight ). + INSERT VALUE #( key = 'scale_pos_weight' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_subsample ). + INSERT VALUE #( key = 'subsample' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_objective ). + INSERT VALUE #( key = 'objective' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_num_round ). + INSERT VALUE #( key = 'num_round' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + "Create ABAP objects for data based on input variables. + "Training data. + lo_trn_s3datasource = NEW #( iv_s3datatype = cv_trn_data_s3datatype + iv_s3datadistributiontype = cv_trn_data_s3datadistribution + iv_s3uri = lv_trn_data_s3uri ). + + lo_trn_datasource = NEW #( io_s3datasource = lo_trn_s3datasource ). + + lo_trn_channel = NEW #( iv_channelname = 'train' + io_datasource = lo_trn_datasource + iv_compressiontype = cv_trn_data_compressiontype + iv_contenttype = cv_trn_data_contenttype ). + + INSERT lo_trn_channel INTO TABLE lt_input_data_config. + + "Validation data. + lo_val_s3datasource = NEW #( iv_s3datatype = cv_val_data_s3datatype + iv_s3datadistributiontype = cv_val_data_s3datadistribution + iv_s3uri = lv_val_data_s3uri ). + + lo_val_datasource = NEW #( io_s3datasource = lo_val_s3datasource ). + + lo_val_channel = NEW #( iv_channelname = 'validation' + io_datasource = lo_val_datasource + iv_compressiontype = cv_val_data_compressiontype + iv_contenttype = cv_val_data_contenttype ). + + INSERT lo_val_channel INTO TABLE lt_input_data_config. + + "Create an ABAP object for algorithm specification based on input variables. + lo_algorithm_specification = NEW #( iv_trainingimage = cv_training_image + iv_traininginputmode = cv_training_input_mode ). + + "Create an ABAP object for resource configuration. + lo_resource_config = NEW #( iv_instancecount = cv_instance_count + iv_instancetype = cv_instance_type + iv_volumesizeingb = cv_volume_sizeingb ). + + "Create an ABAP object for output data configuration. + lo_output_data_config = NEW #( iv_s3outputpath = lv_s3_output_path ). + + "Create an ABAP object for stopping condition. + lo_stopping_condition = NEW #( iv_maxruntimeinseconds = cv_max_runtime_in_seconds ). + + "Create a training job. + ao_sgm->createtrainingjob( + iv_trainingjobname = lv_training_job_name + iv_rolearn = av_lrole + it_hyperparameters = lt_hyperparameters + it_inputdataconfig = lt_input_data_config + io_algorithmspecification = lo_algorithm_specification + io_outputdataconfig = lo_output_data_config + io_resourceconfig = lo_resource_config + io_stoppingcondition = lo_stopping_condition ). + + "Wait for training job to be completed. + lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). + WHILE lo_training_result->get_trainingjobstatus( ) <> 'Completed'. + IF sy-index = 30. + EXIT. "maximum 900 seconds + ENDIF. + WAIT UP TO 30 SECONDS. + lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). + ENDWHILE. + + "Test the create_model method. + ao_sgm_actions->create_model( EXPORTING iv_model_name = lv_model_name + iv_execution_role_arn = av_lrole + iv_model_data_url = lv_model_data_url + iv_container_image = cv_container_image IMPORTING oo_result = lo_result ). + + DATA(lv_found) = abap_false. + + IF lo_result->has_modelarn( ) = 'X'. + lv_found = abap_true. + ENDIF. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Model cannot be found| ). + + "Clean up. + ao_sgm->deletemodel( + iv_modelname = lv_model_name ). + + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = cv_train_key ). + + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = cv_val_key ). + + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = lv_model_key ). + + ao_s3->deletebucket( + iv_bucket = lv_bucket_name ). + + ENDMETHOD. + + METHOD list_models. + + DATA lo_hyperparameters_w TYPE REF TO /aws1/cl_sgmhyperparameters_w. + DATA lt_hyperparameters TYPE /aws1/cl_sgmhyperparameters_w=>tt_hyperparameters. + DATA lt_input_data_config TYPE /aws1/cl_sgmchannel=>tt_inputdataconfig. + DATA lo_trn_channel TYPE REF TO /aws1/cl_sgmchannel. + DATA lo_trn_datasource TYPE REF TO /aws1/cl_sgmdatasource. + DATA lo_trn_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. + DATA lo_val_channel TYPE REF TO /aws1/cl_sgmchannel. + DATA lo_val_datasource TYPE REF TO /aws1/cl_sgmdatasource. + DATA lo_val_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. + DATA lo_output_data_config TYPE REF TO /aws1/cl_sgmoutputdataconfig. + DATA lo_resource_config TYPE REF TO /aws1/cl_sgmresourceconfig. + DATA lo_algorithm_specification TYPE REF TO /aws1/cl_sgmalgorithmspec. + DATA lo_list_result TYPE REF TO /aws1/cl_sgmlisttrnjobsrsp. + DATA lo_stopping_condition TYPE REF TO /aws1/cl_sgmstoppingcondition. + DATA lv_training_job_name TYPE /aws1/sgmtrainingjobname. + + DATA lo_result TYPE REF TO /aws1/cl_sgmcreatemodeloutput. + DATA lv_model_name TYPE /aws1/sgmmodelname. + DATA lv_model_data_url TYPE /aws1/sgmurl. + DATA lv_bucket_name TYPE /aws1/s3_bucketname. + DATA lv_file_content TYPE /aws1/s3_streamingblob. + DATA lv_trn_data_s3uri TYPE /aws1/sgms3uri. + DATA lv_val_data_s3uri TYPE /aws1/sgms3uri. + DATA lv_s3_output_path TYPE /aws1/sgms3uri. + DATA lv_model_key TYPE /aws1/s3_objectkey. + DATA lo_training_result TYPE REF TO /aws1/cl_sgmdescrtrnjobrsp. + DATA lo_primarycontainer TYPE REF TO /aws1/cl_sgmcontainerdefn. + DATA lo_model_list_result TYPE REF TO /aws1/cl_sgmlistmodelsoutput. + DATA lv_uuid_16 TYPE sysuuid_x16. + + "Define Amazon S3 parameters. + CONSTANTS cv_container_image TYPE /aws1/sgmcontainerimage VALUE '246618743249.dkr.ecr.us-west-2.amazonaws.com/sagemaker-xgboost:1.5-1'. + CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-sgm-'. + CONSTANTS cv_train_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/train/train.libsvm'. + CONSTANTS cv_val_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/validation/validation.libsvm'. + + "Define hyperparameters. + CONSTANTS cv_hp_max_depth TYPE /aws1/sgmhyperparametervalue VALUE '3'. + CONSTANTS cv_hp_scale_pos_weight TYPE /aws1/sgmhyperparametervalue VALUE '2.0'. + CONSTANTS cv_hp_num_round TYPE /aws1/sgmhyperparametervalue VALUE '100'. + CONSTANTS cv_hp_objective TYPE /aws1/sgmhyperparametervalue VALUE 'binary:logistic'. + CONSTANTS cv_hp_subsample TYPE /aws1/sgmhyperparametervalue VALUE '0.5'. + CONSTANTS cv_hp_eta TYPE /aws1/sgmhyperparametervalue VALUE '0.1'. + CONSTANTS cv_hp_eval_metric TYPE /aws1/sgmhyperparametervalue VALUE 'auc'. + + "Define training data. + CONSTANTS cv_trn_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. + CONSTANTS cv_trn_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. + CONSTANTS cv_trn_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. + CONSTANTS cv_trn_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. + + "Define validation data. + CONSTANTS cv_val_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. + CONSTANTS cv_val_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. + CONSTANTS cv_val_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. + CONSTANTS cv_val_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. + + "Define training parameters. + CONSTANTS cv_training_image TYPE /aws1/sgmalgorithmimage VALUE '246618743249.dkr.ecr.us-west-2.amazonaws.com/sagemaker-xgboost:1.5-1'. + CONSTANTS cv_training_input_mode TYPE /aws1/sgmtraininginputmode VALUE 'File'. + CONSTANTS cv_instance_count TYPE /aws1/sgmtraininginstancecount VALUE '1'. + CONSTANTS cv_instance_type TYPE /aws1/sgmtraininginstancetype VALUE 'ml.c4.2xlarge'. + CONSTANTS cv_volume_sizeingb TYPE /aws1/sgmvolumesizeingb VALUE '10'. + CONSTANTS cv_max_runtime_in_seconds TYPE /aws1/sgmmaxruntimeinseconds VALUE '1800'. + CONSTANTS cv_max_results TYPE /aws1/sgmmaxresults VALUE '1'. + + "Define role ARN. + DATA(lt_roles) = ao_session->get_configuration( )->get_logical_iam_roles( ). + READ TABLE lt_roles INDEX 1 INTO DATA(lo_role). " take first role from the logical role mapping + av_lrole = lo_role-iam_role_arn. + + "Define job name. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_training_job_name = 'code-example-trn-job-' && lv_uuid_16. + TRANSLATE lv_training_job_name TO LOWER CASE. + + "Define model name. + lv_model_name = 'code-example-model-' && lv_uuid_16. + TRANSLATE lv_model_name TO LOWER CASE. + + "Create training data in Amazon S3. + lv_bucket_name = cv_bucket_name && lv_uuid_16. + TRANSLATE lv_bucket_name TO LOWER CASE. + /awsex/cl_utils=>create_bucket( iv_bucket = lv_bucket_name + io_s3 = ao_s3 + io_session = ao_session ). + + + lv_trn_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_train_key. + lv_val_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_val_key. + lv_s3_output_path = 's3://' && lv_bucket_name && '/' && 'sagemaker/'. + lv_model_key = 'sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. + lv_model_data_url = 's3://' && lv_bucket_name && '/sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. + + ao_s3->putobject( + iv_bucket = lv_bucket_name + iv_key = cv_train_key + iv_body = av_file_content ). + + ao_s3->putobject( + iv_bucket = lv_bucket_name + iv_key = cv_val_key + iv_body = av_file_content ). + + "Create ABAP internal table for hyperparameters based on input variables. + lo_hyperparameters_w = NEW #( iv_value = cv_hp_max_depth ). + INSERT VALUE #( key = 'max_depth' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_eta ). + INSERT VALUE #( key = 'eta' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_eval_metric ). + INSERT VALUE #( key = 'eval_metric' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_scale_pos_weight ). + INSERT VALUE #( key = 'scale_pos_weight' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_subsample ). + INSERT VALUE #( key = 'subsample' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_objective ). + INSERT VALUE #( key = 'objective' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_num_round ). + INSERT VALUE #( key = 'num_round' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + "Create ABAP objects for data based on input variables. + "Training data. + lo_trn_s3datasource = NEW #( iv_s3datatype = cv_trn_data_s3datatype + iv_s3datadistributiontype = cv_trn_data_s3datadistribution + iv_s3uri = lv_trn_data_s3uri ). + + lo_trn_datasource = NEW #( io_s3datasource = lo_trn_s3datasource ). + + lo_trn_channel = NEW #( iv_channelname = 'train' + io_datasource = lo_trn_datasource + iv_compressiontype = cv_trn_data_compressiontype + iv_contenttype = cv_trn_data_contenttype ). + + INSERT lo_trn_channel INTO TABLE lt_input_data_config. + + "Validation data. + lo_val_s3datasource = NEW #( iv_s3datatype = cv_val_data_s3datatype + iv_s3datadistributiontype = cv_val_data_s3datadistribution + iv_s3uri = lv_val_data_s3uri ). + + lo_val_datasource = NEW #( io_s3datasource = lo_val_s3datasource ). + + lo_val_channel = NEW #( iv_channelname = 'validation' + io_datasource = lo_val_datasource + iv_compressiontype = cv_val_data_compressiontype + iv_contenttype = cv_val_data_contenttype ). + + INSERT lo_val_channel INTO TABLE lt_input_data_config. + + "Create an ABAP object for algorithm specification based on input variables. + lo_algorithm_specification = NEW #( iv_trainingimage = cv_training_image + iv_traininginputmode = cv_training_input_mode ). + + "Create an ABAP object for resource configuration. + lo_resource_config = NEW #( iv_instancecount = cv_instance_count + iv_instancetype = cv_instance_type + iv_volumesizeingb = cv_volume_sizeingb ). + + "Create an ABAP object for output data configuration. + lo_output_data_config = NEW #( iv_s3outputpath = lv_s3_output_path ). + + "Create an ABAP object for stopping condition. + lo_stopping_condition = NEW #( iv_maxruntimeinseconds = cv_max_runtime_in_seconds ). + + "Run method to create a training job. + ao_sgm->createtrainingjob( + iv_trainingjobname = lv_training_job_name + iv_rolearn = av_lrole + it_hyperparameters = lt_hyperparameters + it_inputdataconfig = lt_input_data_config + io_algorithmspecification = lo_algorithm_specification + io_outputdataconfig = lo_output_data_config + io_resourceconfig = lo_resource_config + io_stoppingcondition = lo_stopping_condition ). + + "Wait for training job to be completed. + lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). + WHILE lo_training_result->get_trainingjobstatus( ) <> 'Completed'. + IF sy-index = 30. + EXIT. "maximum 900 seconds + ENDIF. + WAIT UP TO 30 SECONDS. + lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). + ENDWHILE. + + "Create an ABAP internal table for the container image based on input variables. + lo_primarycontainer = NEW #( iv_image = cv_container_image + iv_modeldataurl = lv_model_data_url ). + + "Create a new model via so_sgm. + ao_sgm->createmodel( iv_modelname = lv_model_name + iv_executionrolearn = av_lrole + io_primarycontainer = lo_primarycontainer ). + + "Call list_models via so_sgm_actions. + ao_sgm_actions->list_models( EXPORTING iv_name_contains = lv_model_name IMPORTING oo_result = lo_model_list_result ). + + DATA(lv_found) = abap_false. + + LOOP AT lo_model_list_result->get_models( ) INTO DATA(lo_models). + IF lo_models->get_modelname( ) = lv_model_name. + lv_found = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Model cannot be found| ). + + "Clean up. + ao_sgm->deletemodel( + iv_modelname = lv_model_name ). + + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = cv_train_key ). + + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = cv_val_key ). + + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = lv_model_key ). + + ao_s3->deletebucket( + iv_bucket = lv_bucket_name ). + + ENDMETHOD. + + METHOD delete_model. + + DATA lo_hyperparameters_w TYPE REF TO /aws1/cl_sgmhyperparameters_w. + DATA lt_hyperparameters TYPE /aws1/cl_sgmhyperparameters_w=>tt_hyperparameters. + DATA lt_input_data_config TYPE /aws1/cl_sgmchannel=>tt_inputdataconfig. + DATA lo_trn_channel TYPE REF TO /aws1/cl_sgmchannel. + DATA lo_trn_datasource TYPE REF TO /aws1/cl_sgmdatasource. + DATA lo_trn_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. + DATA lo_val_channel TYPE REF TO /aws1/cl_sgmchannel. + DATA lo_val_datasource TYPE REF TO /aws1/cl_sgmdatasource. + DATA lo_val_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. + DATA lo_output_data_config TYPE REF TO /aws1/cl_sgmoutputdataconfig. + DATA lo_resource_config TYPE REF TO /aws1/cl_sgmresourceconfig. + DATA lo_algorithm_specification TYPE REF TO /aws1/cl_sgmalgorithmspec. + DATA lo_list_result TYPE REF TO /aws1/cl_sgmlisttrnjobsrsp. + DATA lo_stopping_condition TYPE REF TO /aws1/cl_sgmstoppingcondition. + DATA lv_training_job_name TYPE /aws1/sgmtrainingjobname. + + DATA lo_result TYPE REF TO /aws1/cl_sgmcreatemodeloutput. + DATA lv_model_name TYPE /aws1/sgmmodelname. + DATA lv_model_data_url TYPE /aws1/sgmurl. + DATA lv_bucket_name TYPE /aws1/s3_bucketname. + DATA lv_file_content TYPE /aws1/s3_streamingblob. + DATA lv_trn_data_s3uri TYPE /aws1/sgms3uri. + DATA lv_val_data_s3uri TYPE /aws1/sgms3uri. + DATA lv_s3_output_path TYPE /aws1/sgms3uri. + DATA lv_model_key TYPE /aws1/s3_objectkey. + DATA lo_training_result TYPE REF TO /aws1/cl_sgmdescrtrnjobrsp. + DATA lo_primarycontainer TYPE REF TO /aws1/cl_sgmcontainerdefn. + DATA lo_model_list_result TYPE REF TO /aws1/cl_sgmlistmodelsoutput. + DATA lv_uuid_16 TYPE sysuuid_x16. + + "Define Amazon S3 parameters. + CONSTANTS cv_container_image TYPE /aws1/sgmcontainerimage VALUE '246618743249.dkr.ecr.us-west-2.amazonaws.com/sagemaker-xgboost:1.5-1'. + CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-sgm-'. + CONSTANTS cv_train_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/train/train.libsvm'. + CONSTANTS cv_val_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/validation/validation.libsvm'. + + "Define hyperparameters. + CONSTANTS cv_hp_max_depth TYPE /aws1/sgmhyperparametervalue VALUE '3'. + CONSTANTS cv_hp_scale_pos_weight TYPE /aws1/sgmhyperparametervalue VALUE '2.0'. + CONSTANTS cv_hp_num_round TYPE /aws1/sgmhyperparametervalue VALUE '100'. + CONSTANTS cv_hp_objective TYPE /aws1/sgmhyperparametervalue VALUE 'binary:logistic'. + CONSTANTS cv_hp_subsample TYPE /aws1/sgmhyperparametervalue VALUE '0.5'. + CONSTANTS cv_hp_eta TYPE /aws1/sgmhyperparametervalue VALUE '0.1'. + CONSTANTS cv_hp_eval_metric TYPE /aws1/sgmhyperparametervalue VALUE 'auc'. + + "Define training data. + CONSTANTS cv_trn_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. + CONSTANTS cv_trn_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. + CONSTANTS cv_trn_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. + CONSTANTS cv_trn_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. + + "Define validation data. + CONSTANTS cv_val_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. + CONSTANTS cv_val_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. + CONSTANTS cv_val_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. + CONSTANTS cv_val_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. + + "Define training parameters. + CONSTANTS cv_training_image TYPE /aws1/sgmalgorithmimage VALUE '246618743249.dkr.ecr.us-west-2.amazonaws.com/sagemaker-xgboost:1.5-1'. + CONSTANTS cv_training_input_mode TYPE /aws1/sgmtraininginputmode VALUE 'File'. + CONSTANTS cv_instance_count TYPE /aws1/sgmtraininginstancecount VALUE '1'. + CONSTANTS cv_instance_type TYPE /aws1/sgmtraininginstancetype VALUE 'ml.c4.2xlarge'. + CONSTANTS cv_volume_sizeingb TYPE /aws1/sgmvolumesizeingb VALUE '10'. + CONSTANTS cv_max_runtime_in_seconds TYPE /aws1/sgmmaxruntimeinseconds VALUE '1800'. + CONSTANTS cv_max_results TYPE /aws1/sgmmaxresults VALUE '1'. + + "Define role ARN. + DATA(lt_roles) = ao_session->get_configuration( )->get_logical_iam_roles( ). + READ TABLE lt_roles INDEX 1 INTO DATA(lo_role). " take first role from the logical role mapping + av_lrole = lo_role-iam_role_arn. + + "Define job name. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_training_job_name = 'code-example-trn-job-' && lv_uuid_16. + TRANSLATE lv_training_job_name TO LOWER CASE. + + "Define model name. + lv_model_name = 'code-example-model-' && lv_uuid_16. + TRANSLATE lv_model_name TO LOWER CASE. + + "Create training data in Amazon S3. + lv_bucket_name = cv_bucket_name && lv_uuid_16. + TRANSLATE lv_bucket_name TO LOWER CASE. + /awsex/cl_utils=>create_bucket( iv_bucket = lv_bucket_name + io_s3 = ao_s3 + io_session = ao_session ). + + + lv_trn_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_train_key. + lv_val_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_val_key. + lv_s3_output_path = 's3://' && lv_bucket_name && '/' && 'sagemaker/'. + lv_model_key = 'sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. + lv_model_data_url = 's3://' && lv_bucket_name && '/sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. + + ao_s3->putobject( + iv_bucket = lv_bucket_name + iv_key = cv_train_key + iv_body = av_file_content ). + + ao_s3->putobject( + iv_bucket = lv_bucket_name + iv_key = cv_val_key + iv_body = av_file_content ). + + "Create ABAP internal table for hyperparameters based on input variables. + lo_hyperparameters_w = NEW #( iv_value = cv_hp_max_depth ). + INSERT VALUE #( key = 'max_depth' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_eta ). + INSERT VALUE #( key = 'eta' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_eval_metric ). + INSERT VALUE #( key = 'eval_metric' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_scale_pos_weight ). + INSERT VALUE #( key = 'scale_pos_weight' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_subsample ). + INSERT VALUE #( key = 'subsample' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_objective ). + INSERT VALUE #( key = 'objective' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_num_round ). + INSERT VALUE #( key = 'num_round' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + "Create ABAP objects for data based on input variables. + "Training data. + lo_trn_s3datasource = NEW #( iv_s3datatype = cv_trn_data_s3datatype + iv_s3datadistributiontype = cv_trn_data_s3datadistribution + iv_s3uri = lv_trn_data_s3uri ). + + lo_trn_datasource = NEW #( io_s3datasource = lo_trn_s3datasource ). + + lo_trn_channel = NEW #( iv_channelname = 'train' + io_datasource = lo_trn_datasource + iv_compressiontype = cv_trn_data_compressiontype + iv_contenttype = cv_trn_data_contenttype ). + + INSERT lo_trn_channel INTO TABLE lt_input_data_config. + + "Validation data. + lo_val_s3datasource = NEW #( iv_s3datatype = cv_val_data_s3datatype + iv_s3datadistributiontype = cv_val_data_s3datadistribution + iv_s3uri = lv_val_data_s3uri ). + + lo_val_datasource = NEW #( io_s3datasource = lo_val_s3datasource ). + + lo_val_channel = NEW #( iv_channelname = 'validation' + io_datasource = lo_val_datasource + iv_compressiontype = cv_val_data_compressiontype + iv_contenttype = cv_val_data_contenttype ). + + INSERT lo_val_channel INTO TABLE lt_input_data_config. + + "Create an ABAP object for algorithm specification based on input variables. + lo_algorithm_specification = NEW #( iv_trainingimage = cv_training_image + iv_traininginputmode = cv_training_input_mode ). + + "Create an ABAP object for resource configuration. + lo_resource_config = NEW #( iv_instancecount = cv_instance_count + iv_instancetype = cv_instance_type + iv_volumesizeingb = cv_volume_sizeingb ). + + "Create an ABAP object for output data configuration. + lo_output_data_config = NEW #( iv_s3outputpath = lv_s3_output_path ). + + "Create an ABAP object for stopping condition. + lo_stopping_condition = NEW #( iv_maxruntimeinseconds = cv_max_runtime_in_seconds ). + + "Create a training job. + ao_sgm->createtrainingjob( + iv_trainingjobname = lv_training_job_name + iv_rolearn = av_lrole + it_hyperparameters = lt_hyperparameters + it_inputdataconfig = lt_input_data_config + io_algorithmspecification = lo_algorithm_specification + io_outputdataconfig = lo_output_data_config + io_resourceconfig = lo_resource_config + io_stoppingcondition = lo_stopping_condition ). + + "Wait for training job to be completed. + lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). + WHILE lo_training_result->get_trainingjobstatus( ) <> 'Completed'. + IF sy-index = 30. + EXIT. "maximum 900 seconds + ENDIF. + WAIT UP TO 30 SECONDS. + lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). + ENDWHILE. + + "Create an ABAP internal table for the container image based on input variables. + lo_primarycontainer = NEW #( iv_image = cv_container_image + iv_modeldataurl = lv_model_data_url ). + + "Create a new model via so_sgm. + ao_sgm->createmodel( iv_modelname = lv_model_name + iv_executionrolearn = av_lrole + io_primarycontainer = lo_primarycontainer ). + + "Test the ao_sgm_actions delete_model method. + ao_sgm_actions->delete_model( lv_model_name ). + + "List the deleted model via so_sgm. + lo_model_list_result = ao_sgm->listmodels( + iv_namecontains = lv_model_name ). + + DATA(lv_found) = abap_false. + + "The model should be deleted. + LOOP AT lo_model_list_result->get_models( ) INTO DATA(lo_models). + IF lo_models->get_modelname( ) = lv_model_name. + lv_found = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_false( + act = lv_found + msg = |Model was not deleted| ). + + "Clean up. + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = cv_train_key ). + + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = cv_val_key ). + + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = lv_model_key ). + + ao_s3->deletebucket( + iv_bucket = lv_bucket_name ). + + ENDMETHOD. + + METHOD create_endpoint. + + DATA lo_hyperparameters_w TYPE REF TO /aws1/cl_sgmhyperparameters_w. + DATA lt_hyperparameters TYPE /aws1/cl_sgmhyperparameters_w=>tt_hyperparameters. + DATA lt_input_data_config TYPE /aws1/cl_sgmchannel=>tt_inputdataconfig. + DATA lo_trn_channel TYPE REF TO /aws1/cl_sgmchannel. + DATA lo_trn_datasource TYPE REF TO /aws1/cl_sgmdatasource. + DATA lo_trn_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. + DATA lo_val_channel TYPE REF TO /aws1/cl_sgmchannel. + DATA lo_val_datasource TYPE REF TO /aws1/cl_sgmdatasource. + DATA lo_val_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. + DATA lo_output_data_config TYPE REF TO /aws1/cl_sgmoutputdataconfig. + DATA lo_resource_config TYPE REF TO /aws1/cl_sgmresourceconfig. + DATA lo_algorithm_specification TYPE REF TO /aws1/cl_sgmalgorithmspec. + DATA lo_list_result TYPE REF TO /aws1/cl_sgmlisttrnjobsrsp. + DATA lo_stopping_condition TYPE REF TO /aws1/cl_sgmstoppingcondition. + DATA lv_training_job_name TYPE /aws1/sgmtrainingjobname. + + DATA lo_result TYPE REF TO /aws1/cl_sgmcreatemodeloutput. + DATA lv_model_name TYPE /aws1/sgmmodelname. + DATA lv_model_data_url TYPE /aws1/sgmurl. + DATA lv_bucket_name TYPE /aws1/s3_bucketname. + DATA lv_file_content TYPE /aws1/s3_streamingblob. + DATA lv_trn_data_s3uri TYPE /aws1/sgms3uri. + DATA lv_val_data_s3uri TYPE /aws1/sgms3uri. + DATA lv_s3_output_path TYPE /aws1/sgms3uri. + DATA lv_model_key TYPE /aws1/s3_objectkey. + DATA lo_training_result TYPE REF TO /aws1/cl_sgmdescrtrnjobrsp. + DATA lo_primarycontainer TYPE REF TO /aws1/cl_sgmcontainerdefn. + DATA lo_model_list_result TYPE REF TO /aws1/cl_sgmlistmodelsoutput. + DATA lv_endpoint_name TYPE /aws1/sgmendpointname. + DATA lv_endpoint_config_name TYPE /aws1/sgmendpointconfigname. + DATA lv_endpoint_variant_name TYPE /aws1/sgmvariantname. + DATA lo_endpoint_output TYPE REF TO /aws1/cl_sgmcreateendptoutput. + DATA lo_endpoint_result TYPE REF TO /aws1/cl_sgmdescrendptoutput. + DATA lv_uuid_16 TYPE sysuuid_x16. + + "Define Amazon S3 parameters. + CONSTANTS cv_container_image TYPE /aws1/sgmcontainerimage VALUE '246618743249.dkr.ecr.us-west-2.amazonaws.com/sagemaker-xgboost:1.5-1'. + CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-sgm-'. + CONSTANTS cv_train_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/train/train.libsvm'. + CONSTANTS cv_val_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/validation/validation.libsvm'. + + "Define hyperparameters. + CONSTANTS cv_hp_max_depth TYPE /aws1/sgmhyperparametervalue VALUE '3'. + CONSTANTS cv_hp_scale_pos_weight TYPE /aws1/sgmhyperparametervalue VALUE '2.0'. + CONSTANTS cv_hp_num_round TYPE /aws1/sgmhyperparametervalue VALUE '100'. + CONSTANTS cv_hp_objective TYPE /aws1/sgmhyperparametervalue VALUE 'binary:logistic'. + CONSTANTS cv_hp_subsample TYPE /aws1/sgmhyperparametervalue VALUE '0.5'. + CONSTANTS cv_hp_eta TYPE /aws1/sgmhyperparametervalue VALUE '0.1'. + CONSTANTS cv_hp_eval_metric TYPE /aws1/sgmhyperparametervalue VALUE 'auc'. + + "Define training data. + CONSTANTS cv_trn_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. + CONSTANTS cv_trn_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. + CONSTANTS cv_trn_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. + CONSTANTS cv_trn_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. + + "Define validation data. + CONSTANTS cv_val_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. + CONSTANTS cv_val_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. + CONSTANTS cv_val_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. + CONSTANTS cv_val_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. + + "Define training parameters. + CONSTANTS cv_training_image TYPE /aws1/sgmalgorithmimage VALUE '246618743249.dkr.ecr.us-west-2.amazonaws.com/sagemaker-xgboost:1.5-1'. + CONSTANTS cv_training_input_mode TYPE /aws1/sgmtraininginputmode VALUE 'File'. + CONSTANTS cv_instance_count TYPE /aws1/sgmtraininginstancecount VALUE '1'. + CONSTANTS cv_instance_type TYPE /aws1/sgmtraininginstancetype VALUE 'ml.c4.2xlarge'. + CONSTANTS cv_volume_sizeingb TYPE /aws1/sgmvolumesizeingb VALUE '10'. + CONSTANTS cv_max_runtime_in_seconds TYPE /aws1/sgmmaxruntimeinseconds VALUE '1800'. + CONSTANTS cv_max_results TYPE /aws1/sgmmaxresults VALUE '1'. + + "Define endpoint parameters. + CONSTANTS cv_ep_instance_type TYPE /aws1/sgminstancetype VALUE 'ml.m4.xlarge'. + CONSTANTS cv_ep_initial_instance_count TYPE /aws1/sgminitialtaskcount VALUE '1'. + + "Define role ARN. + DATA(lt_roles) = ao_session->get_configuration( )->get_logical_iam_roles( ). + READ TABLE lt_roles INDEX 1 INTO DATA(lo_role). " take first role from the logical role mapping + av_lrole = lo_role-iam_role_arn. + + "Define job name. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_training_job_name = 'code-example-trn-job-' && lv_uuid_16. + TRANSLATE lv_training_job_name TO LOWER CASE. + + "Define model name. + lv_model_name = 'code-example-model-' && lv_uuid_16. + TRANSLATE lv_model_name TO LOWER CASE. + + "Define endpoint name. + lv_endpoint_name = 'code-example-endpoint-' && lv_uuid_16. + lv_endpoint_config_name = 'code-example-endpoint-cfg-' && lv_uuid_16. + lv_endpoint_variant_name = 'code-example-endpoint-variant-' && lv_uuid_16. + + "Create training data in Amazon S3. + lv_bucket_name = cv_bucket_name && lv_uuid_16. + TRANSLATE lv_bucket_name TO LOWER CASE. + /awsex/cl_utils=>create_bucket( iv_bucket = lv_bucket_name + io_s3 = ao_s3 + io_session = ao_session ). + + + lv_trn_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_train_key. + lv_val_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_val_key. + lv_s3_output_path = 's3://' && lv_bucket_name && '/' && 'sagemaker/'. + lv_model_key = 'sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. + lv_model_data_url = 's3://' && lv_bucket_name && '/sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. + + ao_s3->putobject( + iv_bucket = lv_bucket_name + iv_key = cv_train_key + iv_body = av_file_content ). + + ao_s3->putobject( + iv_bucket = lv_bucket_name + iv_key = cv_val_key + iv_body = av_file_content ). + + "Create ABAP internal table for hyperparameters based on input variables. + lo_hyperparameters_w = NEW #( iv_value = cv_hp_max_depth ). + INSERT VALUE #( key = 'max_depth' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_eta ). + INSERT VALUE #( key = 'eta' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_eval_metric ). + INSERT VALUE #( key = 'eval_metric' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_scale_pos_weight ). + INSERT VALUE #( key = 'scale_pos_weight' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_subsample ). + INSERT VALUE #( key = 'subsample' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_objective ). + INSERT VALUE #( key = 'objective' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_num_round ). + INSERT VALUE #( key = 'num_round' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + "Create ABAP objects for data based on input variables. + "Training data. + lo_trn_s3datasource = NEW #( iv_s3datatype = cv_trn_data_s3datatype + iv_s3datadistributiontype = cv_trn_data_s3datadistribution + iv_s3uri = lv_trn_data_s3uri ). + + lo_trn_datasource = NEW #( io_s3datasource = lo_trn_s3datasource ). + + lo_trn_channel = NEW #( iv_channelname = 'train' + io_datasource = lo_trn_datasource + iv_compressiontype = cv_trn_data_compressiontype + iv_contenttype = cv_trn_data_contenttype ). + + INSERT lo_trn_channel INTO TABLE lt_input_data_config. + + "Validation data. + lo_val_s3datasource = NEW #( iv_s3datatype = cv_val_data_s3datatype + iv_s3datadistributiontype = cv_val_data_s3datadistribution + iv_s3uri = lv_val_data_s3uri ). + + lo_val_datasource = NEW #( io_s3datasource = lo_val_s3datasource ). + + lo_val_channel = NEW #( iv_channelname = 'validation' + io_datasource = lo_val_datasource + iv_compressiontype = cv_val_data_compressiontype + iv_contenttype = cv_val_data_contenttype ). + + INSERT lo_val_channel INTO TABLE lt_input_data_config. + + "Create an ABAP object for algorithm specification based on input variables. + lo_algorithm_specification = NEW #( iv_trainingimage = cv_training_image + iv_traininginputmode = cv_training_input_mode ). + + "Create an ABAP object for resource configuration. + lo_resource_config = NEW #( iv_instancecount = cv_instance_count + iv_instancetype = cv_instance_type + iv_volumesizeingb = cv_volume_sizeingb ). + + "Create an ABAP object for output data configuration. + lo_output_data_config = NEW #( iv_s3outputpath = lv_s3_output_path ). + + "Create an ABAP object for stopping condition. + lo_stopping_condition = NEW #( iv_maxruntimeinseconds = cv_max_runtime_in_seconds ). + + "Run method to create a training job. + ao_sgm->createtrainingjob( + iv_trainingjobname = lv_training_job_name + iv_rolearn = av_lrole + it_hyperparameters = lt_hyperparameters + it_inputdataconfig = lt_input_data_config + io_algorithmspecification = lo_algorithm_specification + io_outputdataconfig = lo_output_data_config + io_resourceconfig = lo_resource_config + io_stoppingcondition = lo_stopping_condition ). + + "Wait for training job to be completed. + lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). + WHILE lo_training_result->get_trainingjobstatus( ) <> 'Completed'. + IF sy-index = 30. + EXIT. "maximum 900 seconds + ENDIF. + WAIT UP TO 30 SECONDS. + lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). + ENDWHILE. + + "Create an ABAP internal table for the container image based on input variables. + lo_primarycontainer = NEW #( iv_image = cv_container_image + iv_modeldataurl = lv_model_data_url ). + + "Create a new model via so_sgm. + ao_sgm->createmodel( iv_modelname = lv_model_name + iv_executionrolearn = av_lrole + io_primarycontainer = lo_primarycontainer ). + + "Test the create_endpoint method. + ao_sgm_actions->create_endpoint( EXPORTING iv_model_name = lv_model_name + iv_endpoint_config_name = lv_endpoint_config_name + iv_endpoint_name = lv_endpoint_name + iv_instance_type = cv_ep_instance_type + iv_variant_name = lv_endpoint_variant_name + iv_initial_instance_count = cv_ep_initial_instance_count IMPORTING oo_result = lo_endpoint_output ). + + DATA(lv_found) = abap_false. + + IF lo_endpoint_output->has_endpointarn( ) = 'X'. + lv_found = abap_true. + ENDIF. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Endpoint not found| ). + + "Wait for endpoint creation to be completed. + lo_endpoint_result = ao_sgm->describeendpoint( iv_endpointname = lv_endpoint_name ). + WHILE lo_endpoint_result->get_endpointstatus( ) <> 'InService'. + IF sy-index = 30. + EXIT. "maximum 900 seconds + ENDIF. + WAIT UP TO 30 SECONDS. + lo_endpoint_result = ao_sgm->describeendpoint( iv_endpointname = lv_endpoint_name ). + ENDWHILE. + + "Clean up. + ao_sgm->deleteendpoint( + iv_endpointname = lv_endpoint_name ). + + ao_sgm->deleteendpointconfig( + iv_endpointconfigname = lv_endpoint_config_name ). + + ao_sgm->deletemodel( + iv_modelname = lv_model_name ). + + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = cv_train_key ). + + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = cv_val_key ). + + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = lv_model_key ). + + ao_s3->deletebucket( + iv_bucket = lv_bucket_name ). + + ENDMETHOD. + + METHOD delete_endpoint. + + DATA lo_hyperparameters_w TYPE REF TO /aws1/cl_sgmhyperparameters_w. + DATA lt_hyperparameters TYPE /aws1/cl_sgmhyperparameters_w=>tt_hyperparameters. + DATA lt_input_data_config TYPE /aws1/cl_sgmchannel=>tt_inputdataconfig. + DATA lo_trn_channel TYPE REF TO /aws1/cl_sgmchannel. + DATA lo_trn_datasource TYPE REF TO /aws1/cl_sgmdatasource. + DATA lo_trn_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. + DATA lo_val_channel TYPE REF TO /aws1/cl_sgmchannel. + DATA lo_val_datasource TYPE REF TO /aws1/cl_sgmdatasource. + DATA lo_val_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. + DATA lo_output_data_config TYPE REF TO /aws1/cl_sgmoutputdataconfig. + DATA lo_resource_config TYPE REF TO /aws1/cl_sgmresourceconfig. + DATA lo_algorithm_specification TYPE REF TO /aws1/cl_sgmalgorithmspec. + DATA lo_list_result TYPE REF TO /aws1/cl_sgmlisttrnjobsrsp. + DATA lo_stopping_condition TYPE REF TO /aws1/cl_sgmstoppingcondition. + DATA lv_training_job_name TYPE /aws1/sgmtrainingjobname. + + DATA lo_result TYPE REF TO /aws1/cl_sgmcreatemodeloutput. + DATA lv_model_name TYPE /aws1/sgmmodelname. + DATA lv_model_data_url TYPE /aws1/sgmurl. + DATA lv_bucket_name TYPE /aws1/s3_bucketname. + DATA lv_file_content TYPE /aws1/s3_streamingblob. + DATA lv_trn_data_s3uri TYPE /aws1/sgms3uri. + DATA lv_val_data_s3uri TYPE /aws1/sgms3uri. + DATA lv_s3_output_path TYPE /aws1/sgms3uri. + DATA lv_model_key TYPE /aws1/s3_objectkey. + DATA lo_training_result TYPE REF TO /aws1/cl_sgmdescrtrnjobrsp. + DATA lo_primarycontainer TYPE REF TO /aws1/cl_sgmcontainerdefn. + DATA lo_model_list_result TYPE REF TO /aws1/cl_sgmlistmodelsoutput. + DATA lv_endpoint_name TYPE /aws1/sgmendpointname. + DATA lv_endpoint_config_name TYPE /aws1/sgmendpointconfigname. + DATA lv_endpoint_variant_name TYPE /aws1/sgmvariantname. + DATA lo_endpoint_output TYPE REF TO /aws1/cl_sgmcreateendptoutput. + DATA lo_endpoint_result TYPE REF TO /aws1/cl_sgmdescrendptoutput. + DATA lo_endpoint_list_result TYPE REF TO /aws1/cl_sgmlistendptsoutput. + DATA lv_uuid_16 TYPE sysuuid_x16. + + "Define Amazon S3 parameters. + CONSTANTS cv_container_image TYPE /aws1/sgmcontainerimage VALUE '246618743249.dkr.ecr.us-west-2.amazonaws.com/sagemaker-xgboost:1.5-1'. + CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-sgm-'. + CONSTANTS cv_train_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/train/train.libsvm'. + CONSTANTS cv_val_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/validation/validation.libsvm'. + + "Define hyperparameters. + CONSTANTS cv_hp_max_depth TYPE /aws1/sgmhyperparametervalue VALUE '3'. + CONSTANTS cv_hp_scale_pos_weight TYPE /aws1/sgmhyperparametervalue VALUE '2.0'. + CONSTANTS cv_hp_num_round TYPE /aws1/sgmhyperparametervalue VALUE '100'. + CONSTANTS cv_hp_objective TYPE /aws1/sgmhyperparametervalue VALUE 'binary:logistic'. + CONSTANTS cv_hp_subsample TYPE /aws1/sgmhyperparametervalue VALUE '0.5'. + CONSTANTS cv_hp_eta TYPE /aws1/sgmhyperparametervalue VALUE '0.1'. + CONSTANTS cv_hp_eval_metric TYPE /aws1/sgmhyperparametervalue VALUE 'auc'. + + "Define training data. + CONSTANTS cv_trn_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. + CONSTANTS cv_trn_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. + CONSTANTS cv_trn_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. + CONSTANTS cv_trn_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. + + "Define validation data. + CONSTANTS cv_val_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. + CONSTANTS cv_val_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. + CONSTANTS cv_val_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. + CONSTANTS cv_val_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. + + "Define training parameters. + CONSTANTS cv_training_image TYPE /aws1/sgmalgorithmimage VALUE '246618743249.dkr.ecr.us-west-2.amazonaws.com/sagemaker-xgboost:1.5-1'. + CONSTANTS cv_training_input_mode TYPE /aws1/sgmtraininginputmode VALUE 'File'. + CONSTANTS cv_instance_count TYPE /aws1/sgmtraininginstancecount VALUE '1'. + CONSTANTS cv_instance_type TYPE /aws1/sgmtraininginstancetype VALUE 'ml.c4.2xlarge'. + CONSTANTS cv_volume_sizeingb TYPE /aws1/sgmvolumesizeingb VALUE '10'. + CONSTANTS cv_max_runtime_in_seconds TYPE /aws1/sgmmaxruntimeinseconds VALUE '1800'. + CONSTANTS cv_max_results TYPE /aws1/sgmmaxresults VALUE '1'. + + "Define endpoint parameters. + CONSTANTS cv_ep_instance_type TYPE /aws1/sgminstancetype VALUE 'ml.m4.xlarge'. + CONSTANTS cv_ep_initial_instance_count TYPE /aws1/sgminitialtaskcount VALUE '1'. + + "Define role ARN. + DATA(lt_roles) = ao_session->get_configuration( )->get_logical_iam_roles( ). + READ TABLE lt_roles INDEX 1 INTO DATA(lo_role). " take first role from the logical role mapping + av_lrole = lo_role-iam_role_arn. + + "Define job name. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_training_job_name = 'code-example-trn-job-' && lv_uuid_16. + TRANSLATE lv_training_job_name TO LOWER CASE. + + "Define model name. + lv_model_name = 'code-example-model-' && lv_uuid_16. + TRANSLATE lv_model_name TO LOWER CASE. + + "Define endpoint name. + lv_endpoint_name = 'code-example-endpoint-' && lv_uuid_16. + lv_endpoint_config_name = 'code-example-endpoint-cfg-' && lv_uuid_16. + lv_endpoint_variant_name = 'code-example-endpoint-variant-' && lv_uuid_16. + + "Create training data in Amazon S3. + lv_bucket_name = cv_bucket_name && lv_uuid_16. + TRANSLATE lv_bucket_name TO LOWER CASE. + /awsex/cl_utils=>create_bucket( iv_bucket = lv_bucket_name + io_s3 = ao_s3 + io_session = ao_session ). + + + lv_trn_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_train_key. + lv_val_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_val_key. + lv_s3_output_path = 's3://' && lv_bucket_name && '/' && 'sagemaker/'. + lv_model_key = 'sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. + lv_model_data_url = 's3://' && lv_bucket_name && '/sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. + + ao_s3->putobject( + iv_bucket = lv_bucket_name + iv_key = cv_train_key + iv_body = av_file_content ). + + ao_s3->putobject( + iv_bucket = lv_bucket_name + iv_key = cv_val_key + iv_body = av_file_content ). + + "Create ABAP internal table for hyperparameters based on input variables. + lo_hyperparameters_w = NEW #( iv_value = cv_hp_max_depth ). + INSERT VALUE #( key = 'max_depth' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_eta ). + INSERT VALUE #( key = 'eta' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_eval_metric ). + INSERT VALUE #( key = 'eval_metric' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_scale_pos_weight ). + INSERT VALUE #( key = 'scale_pos_weight' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_subsample ). + INSERT VALUE #( key = 'subsample' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_objective ). + INSERT VALUE #( key = 'objective' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_num_round ). + INSERT VALUE #( key = 'num_round' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + "Create ABAP objects for data based on input variables. + "Training data. + lo_trn_s3datasource = NEW #( iv_s3datatype = cv_trn_data_s3datatype + iv_s3datadistributiontype = cv_trn_data_s3datadistribution + iv_s3uri = lv_trn_data_s3uri ). + + lo_trn_datasource = NEW #( io_s3datasource = lo_trn_s3datasource ). + + lo_trn_channel = NEW #( iv_channelname = 'train' + io_datasource = lo_trn_datasource + iv_compressiontype = cv_trn_data_compressiontype + iv_contenttype = cv_trn_data_contenttype ). + + INSERT lo_trn_channel INTO TABLE lt_input_data_config. + + "Validation data. + lo_val_s3datasource = NEW #( iv_s3datatype = cv_val_data_s3datatype + iv_s3datadistributiontype = cv_val_data_s3datadistribution + iv_s3uri = lv_val_data_s3uri ). + + lo_val_datasource = NEW #( io_s3datasource = lo_val_s3datasource ). + + lo_val_channel = NEW #( iv_channelname = 'validation' + io_datasource = lo_val_datasource + iv_compressiontype = cv_val_data_compressiontype + iv_contenttype = cv_val_data_contenttype ). + + INSERT lo_val_channel INTO TABLE lt_input_data_config. + + "Create an ABAP object for algorithm specification based on input variables. + lo_algorithm_specification = NEW #( iv_trainingimage = cv_training_image + iv_traininginputmode = cv_training_input_mode ). + + "Create an ABAP object for resource configuration. + lo_resource_config = NEW #( iv_instancecount = cv_instance_count + iv_instancetype = cv_instance_type + iv_volumesizeingb = cv_volume_sizeingb ). + + "Create an ABAP object for output data configuration. + lo_output_data_config = NEW #( iv_s3outputpath = lv_s3_output_path ). + + "Create an ABAP object for stopping condition. + lo_stopping_condition = NEW #( iv_maxruntimeinseconds = cv_max_runtime_in_seconds ). + + "Run method to create a training job. + ao_sgm->createtrainingjob( + iv_trainingjobname = lv_training_job_name + iv_rolearn = av_lrole + it_hyperparameters = lt_hyperparameters + it_inputdataconfig = lt_input_data_config + io_algorithmspecification = lo_algorithm_specification + io_outputdataconfig = lo_output_data_config + io_resourceconfig = lo_resource_config + io_stoppingcondition = lo_stopping_condition ). + + "Wait for training job to be completed. + lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). + WHILE lo_training_result->get_trainingjobstatus( ) <> 'Completed'. + IF sy-index = 30. + EXIT. "maximum 900 seconds + ENDIF. + WAIT UP TO 30 SECONDS. + lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). + ENDWHILE. + + "Create an ABAP internal table for the container image based on input variables. + lo_primarycontainer = NEW #( iv_image = cv_container_image + iv_modeldataurl = lv_model_data_url ). + + "Create a new model via so_sgm. + ao_sgm->createmodel( iv_modelname = lv_model_name + iv_executionrolearn = av_lrole + io_primarycontainer = lo_primarycontainer ). + + "Create an endpoint. + DATA lt_production_variants TYPE /aws1/cl_sgmproductionvariant=>tt_productionvariantlist. + DATA lo_production_variants TYPE REF TO /aws1/cl_sgmproductionvariant. + DATA lo_ep_config_result TYPE REF TO /aws1/cl_sgmcreateendptcfgout. + + + lo_production_variants = NEW #( iv_variantname = lv_endpoint_variant_name + iv_modelname = lv_model_name + iv_initialinstancecount = cv_ep_initial_instance_count + iv_instancetype = cv_ep_instance_type ). + + INSERT lo_production_variants INTO TABLE lt_production_variants. + + "Create an endpoint configuration. + lo_ep_config_result = ao_sgm->createendpointconfig( + iv_endpointconfigname = lv_endpoint_config_name + it_productionvariants = lt_production_variants ). + + "Create an endpoint. + lo_endpoint_output = ao_sgm->createendpoint( + iv_endpointconfigname = lv_endpoint_config_name + iv_endpointname = lv_endpoint_name ). + + DATA(lv_found) = abap_false. + + IF lo_endpoint_output->has_endpointarn( ) = 'X'. + lv_found = abap_true. + ENDIF. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Endpoint not found| ). + + "Wait for endpoint creation to be completed. + lo_endpoint_result = ao_sgm->describeendpoint( iv_endpointname = lv_endpoint_name ). + WHILE lo_endpoint_result->get_endpointstatus( ) <> 'InService'. + IF sy-index = 30. + EXIT. "maximum 900 seconds + ENDIF. + WAIT UP TO 30 SECONDS. + lo_endpoint_result = ao_sgm->describeendpoint( iv_endpointname = lv_endpoint_name ). + ENDWHILE. + + "Testing. + ao_sgm_actions->delete_endpoint( + iv_endpoint_name = lv_endpoint_name + iv_endpoint_config_name = lv_endpoint_config_name ). + + WAIT UP TO 30 SECONDS. + + "Check if endpoint exists. + lo_endpoint_list_result = ao_sgm->listendpoints( + iv_namecontains = lv_endpoint_name ). + + lv_found = abap_false. + + "The endpoint should be deleted. + LOOP AT lo_endpoint_list_result->get_endpoints( ) INTO DATA(lo_endpoints). + IF lo_endpoints->get_endpointname( ) = lv_endpoint_name. + lv_found = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_false( + act = lv_found + msg = |Endpoint was not deleted| ). + + "Cleaning up via ao_sgm. + ao_sgm->deletemodel( + iv_modelname = lv_model_name ). + + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = cv_train_key ). + + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = cv_val_key ). + + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = lv_model_key ). + + ao_s3->deletebucket( + iv_bucket = lv_bucket_name ). + + + ENDMETHOD. + + METHOD list_notebook_instances. + + DATA lo_list_result TYPE REF TO /aws1/cl_sgmlstnotebookinsts01. + DATA lv_notebook_name TYPE /aws1/sgmnotebookinstancename. + DATA lo_notebook_result TYPE REF TO /aws1/cl_sgmdscnotebookinstout. + + DATA lv_uuid_16 TYPE sysuuid_x16. + + CONSTANTS cv_instancetype TYPE /aws1/sgminstancetype VALUE 'ml.t3.medium'. + + "Define ARN. + DATA(lt_roles) = ao_session->get_configuration( )->get_logical_iam_roles( ). + READ TABLE lt_roles INDEX 1 INTO DATA(lo_role). " take first role from the logical role mapping + av_lrole = lo_role-iam_role_arn. + + "Define notebook name. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_notebook_name = 'code-example-sgm-notebook-' && lv_uuid_16. + + "Create a notebook instance. + ao_sgm->createnotebookinstance( + iv_notebookinstancename = lv_notebook_name + iv_instancetype = cv_instancetype + iv_rolearn = av_lrole ). + + "Waiter. + lo_notebook_result = ao_sgm->describenotebookinstance( iv_notebookinstancename = lv_notebook_name ). + WHILE lo_notebook_result->get_notebookinstancestatus( ) <> 'InService'. + IF sy-index = 30. + EXIT. "maximum 900 seconds + ENDIF. + WAIT UP TO 30 SECONDS. + lo_notebook_result = ao_sgm->describenotebookinstance( iv_notebookinstancename = lv_notebook_name ). + ENDWHILE. + + " Test the list notebook instance. + ao_sgm_actions->list_notebook_instances( + EXPORTING + iv_name_contains = lv_notebook_name + IMPORTING + oo_result = lo_list_result ). + + DATA(lv_found) = abap_false. + + LOOP AT lo_list_result->get_notebookinstances( ) INTO DATA(lo_notebook). + IF lo_notebook->get_notebookinstancename( ) = lv_notebook_name. + lv_found = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Notebook cannot be found| ). + + "Stop notebook instance before deletion. + ao_sgm->stopnotebookinstance( + iv_notebookinstancename = lv_notebook_name ). + + "Waiter. + lo_notebook_result = ao_sgm->describenotebookinstance( iv_notebookinstancename = lv_notebook_name ). + WHILE lo_notebook_result->get_notebookinstancestatus( ) <> 'Stopped'. + IF sy-index = 30. + EXIT. "maximum 10 minutes + ENDIF. + WAIT UP TO 30 SECONDS. + lo_notebook_result = ao_sgm->describenotebookinstance( iv_notebookinstancename = lv_notebook_name ). + ENDWHILE. + + "Delete notebook. + ao_sgm->deletenotebookinstance( + iv_notebookinstancename = lv_notebook_name ). + + ENDMETHOD. + + METHOD create_transform_job. + + DATA lo_hyperparameters_w TYPE REF TO /aws1/cl_sgmhyperparameters_w. + DATA lt_hyperparameters TYPE /aws1/cl_sgmhyperparameters_w=>tt_hyperparameters. + DATA lt_input_data_config TYPE /aws1/cl_sgmchannel=>tt_inputdataconfig. + DATA lo_trn_channel TYPE REF TO /aws1/cl_sgmchannel. + DATA lo_trn_datasource TYPE REF TO /aws1/cl_sgmdatasource. + DATA lo_trn_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. + DATA lo_val_channel TYPE REF TO /aws1/cl_sgmchannel. + DATA lo_val_datasource TYPE REF TO /aws1/cl_sgmdatasource. + DATA lo_val_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. + DATA lo_output_data_config TYPE REF TO /aws1/cl_sgmoutputdataconfig. + DATA lo_resource_config TYPE REF TO /aws1/cl_sgmresourceconfig. + DATA lo_algorithm_specification TYPE REF TO /aws1/cl_sgmalgorithmspec. + DATA lo_list_result TYPE REF TO /aws1/cl_sgmlisttrnjobsrsp. + DATA lo_stopping_condition TYPE REF TO /aws1/cl_sgmstoppingcondition. + DATA lv_training_job_name TYPE /aws1/sgmtrainingjobname. + + DATA lo_result TYPE REF TO /aws1/cl_sgmcreatemodeloutput. + DATA lv_model_name TYPE /aws1/sgmmodelname. + DATA lv_model_data_url TYPE /aws1/sgmurl. + DATA lv_bucket_name TYPE /aws1/s3_bucketname. + DATA lv_file_content TYPE /aws1/s3_streamingblob. + DATA lv_trn_data_s3uri TYPE /aws1/sgms3uri. + DATA lv_val_data_s3uri TYPE /aws1/sgms3uri. + DATA lv_s3_output_path TYPE /aws1/sgms3uri. + DATA lv_s3_transform_output_path TYPE /aws1/sgms3uri. + DATA lv_model_key TYPE /aws1/s3_objectkey. + DATA lo_training_result TYPE REF TO /aws1/cl_sgmdescrtrnjobrsp. + DATA lo_primarycontainer TYPE REF TO /aws1/cl_sgmcontainerdefn. + DATA lo_model_list_result TYPE REF TO /aws1/cl_sgmlistmodelsoutput. + DATA lo_tf_result TYPE REF TO /aws1/cl_sgmcretransformjobrsp. + DATA lv_transform_job_name TYPE /aws1/sgmtransformjobname. + DATA lv_transform_data_s3uri TYPE /aws1/sgms3uri. + DATA lv_uuid_16 TYPE sysuuid_x16. + + "Define Amazon S3 parameters. + CONSTANTS cv_container_image TYPE /aws1/sgmcontainerimage VALUE '246618743249.dkr.ecr.us-west-2.amazonaws.com/sagemaker-xgboost:1.5-1'. + CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-sgm-'. + CONSTANTS cv_transform_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/transform/transform.libsvm'. + CONSTANTS cv_train_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/train/train.libsvm'. + CONSTANTS cv_val_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/validation/validation.libsvm'. + + "Define hyperparameters. + CONSTANTS cv_hp_max_depth TYPE /aws1/sgmhyperparametervalue VALUE '3'. + CONSTANTS cv_hp_scale_pos_weight TYPE /aws1/sgmhyperparametervalue VALUE '2.0'. + CONSTANTS cv_hp_num_round TYPE /aws1/sgmhyperparametervalue VALUE '100'. + CONSTANTS cv_hp_objective TYPE /aws1/sgmhyperparametervalue VALUE 'binary:logistic'. + CONSTANTS cv_hp_subsample TYPE /aws1/sgmhyperparametervalue VALUE '0.5'. + CONSTANTS cv_hp_eta TYPE /aws1/sgmhyperparametervalue VALUE '0.1'. + CONSTANTS cv_hp_eval_metric TYPE /aws1/sgmhyperparametervalue VALUE 'auc'. + + "Define training data. + CONSTANTS cv_trn_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. + CONSTANTS cv_trn_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. + CONSTANTS cv_trn_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. + CONSTANTS cv_trn_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. + + "Define validation data. + CONSTANTS cv_val_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. + CONSTANTS cv_val_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. + CONSTANTS cv_val_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. + CONSTANTS cv_val_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. + + "Define training parameters. + CONSTANTS cv_training_image TYPE /aws1/sgmalgorithmimage VALUE '246618743249.dkr.ecr.us-west-2.amazonaws.com/sagemaker-xgboost:1.5-1'. + CONSTANTS cv_training_input_mode TYPE /aws1/sgmtraininginputmode VALUE 'File'. + CONSTANTS cv_instance_count TYPE /aws1/sgmtraininginstancecount VALUE '1'. + CONSTANTS cv_instance_type TYPE /aws1/sgmtraininginstancetype VALUE 'ml.c4.2xlarge'. + CONSTANTS cv_volume_sizeingb TYPE /aws1/sgmvolumesizeingb VALUE '10'. + CONSTANTS cv_max_runtime_in_seconds TYPE /aws1/sgmmaxruntimeinseconds VALUE '1800'. + CONSTANTS cv_max_results TYPE /aws1/sgmmaxresults VALUE '1'. + + "Define transform data. + CONSTANTS cv_tf_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. + CONSTANTS cv_tf_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. + CONSTANTS cv_tf_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. + + "Define transform parameters. + CONSTANTS cv_tf_instance_count TYPE /aws1/sgmtraininginstancecount VALUE '1'. + CONSTANTS cv_tf_instance_type TYPE /aws1/sgmtraininginstancetype VALUE 'ml.c4.2xlarge'. + + "Define role ARN. + DATA(lt_roles) = ao_session->get_configuration( )->get_logical_iam_roles( ). + READ TABLE lt_roles INDEX 1 INTO DATA(lo_role). " take first role from the logical role mapping + av_lrole = lo_role-iam_role_arn. + + "Define job name. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_training_job_name = 'code-example-trn-job-' && lv_uuid_16. + TRANSLATE lv_training_job_name TO LOWER CASE. + + "Define model name. + lv_model_name = 'code-example-model-' && lv_uuid_16. + TRANSLATE lv_model_name TO LOWER CASE. + + "Define job name. + lv_transform_job_name = 'code-example-transform-job-' && lv_uuid_16. + TRANSLATE lv_transform_job_name TO LOWER CASE. + + "Create training data in Amazon S3. + lv_bucket_name = cv_bucket_name && lv_uuid_16. + TRANSLATE lv_bucket_name TO LOWER CASE. + /awsex/cl_utils=>create_bucket( iv_bucket = lv_bucket_name + io_s3 = ao_s3 + io_session = ao_session ). + + + lv_trn_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_train_key. + lv_val_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_val_key. + lv_transform_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_transform_key. + lv_s3_output_path = 's3://' && lv_bucket_name && '/' && 'sagemaker/'. + lv_s3_transform_output_path = 's3://' && lv_bucket_name && '/' && 'sagemaker/transform/'. + lv_model_key = 'sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. + lv_model_data_url = 's3://' && lv_bucket_name && '/sagemaker/' && lv_training_job_name && '/output/model.tar.gz'. + + ao_s3->putobject( + iv_bucket = lv_bucket_name + iv_key = cv_train_key + iv_body = av_file_content ). + + ao_s3->putobject( + iv_bucket = lv_bucket_name + iv_key = cv_val_key + iv_body = av_file_content ). + + ao_s3->putobject( + iv_bucket = lv_bucket_name + iv_key = cv_transform_key + iv_body = av_file_content ). + + "Create ABAP internal table for hyperparameters based on input variables. + lo_hyperparameters_w = NEW #( iv_value = cv_hp_max_depth ). + INSERT VALUE #( key = 'max_depth' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_eta ). + INSERT VALUE #( key = 'eta' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_eval_metric ). + INSERT VALUE #( key = 'eval_metric' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_scale_pos_weight ). + INSERT VALUE #( key = 'scale_pos_weight' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_subsample ). + INSERT VALUE #( key = 'subsample' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_objective ). + INSERT VALUE #( key = 'objective' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = cv_hp_num_round ). + INSERT VALUE #( key = 'num_round' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + "Create ABAP internal table for data based on input variables. + "Training data. + lo_trn_s3datasource = NEW #( iv_s3datatype = cv_trn_data_s3datatype + iv_s3datadistributiontype = cv_trn_data_s3datadistribution + iv_s3uri = lv_trn_data_s3uri ). + + lo_trn_datasource = NEW #( io_s3datasource = lo_trn_s3datasource ). + + lo_trn_channel = NEW #( iv_channelname = 'train' + io_datasource = lo_trn_datasource + iv_compressiontype = cv_trn_data_compressiontype + iv_contenttype = cv_trn_data_contenttype ). + + INSERT lo_trn_channel INTO TABLE lt_input_data_config. + + "Validation data. + lo_val_s3datasource = NEW #( iv_s3datatype = cv_val_data_s3datatype + iv_s3datadistributiontype = cv_val_data_s3datadistribution + iv_s3uri = lv_val_data_s3uri ). + + lo_val_datasource = NEW #( io_s3datasource = lo_val_s3datasource ). + + lo_val_channel = NEW #( iv_channelname = 'validation' + io_datasource = lo_val_datasource + iv_compressiontype = cv_val_data_compressiontype + iv_contenttype = cv_val_data_contenttype ). + + INSERT lo_val_channel INTO TABLE lt_input_data_config. + + "Create an ABAP object for algorithm specification based on input variables. + lo_algorithm_specification = NEW #( iv_trainingimage = cv_training_image + iv_traininginputmode = cv_training_input_mode ). + + "Create an ABAP object for resource configuration. + lo_resource_config = NEW #( iv_instancecount = cv_instance_count + iv_instancetype = cv_instance_type + iv_volumesizeingb = cv_volume_sizeingb ). + + "Create an ABAP object for output data configuration. + lo_output_data_config = NEW #( iv_s3outputpath = lv_s3_output_path ). + + "Create an ABAP object for stopping condition. + lo_stopping_condition = NEW #( iv_maxruntimeinseconds = cv_max_runtime_in_seconds ). + + "Create a training job. + ao_sgm->createtrainingjob( + iv_trainingjobname = lv_training_job_name + iv_rolearn = av_lrole + it_hyperparameters = lt_hyperparameters + it_inputdataconfig = lt_input_data_config + io_algorithmspecification = lo_algorithm_specification + io_outputdataconfig = lo_output_data_config + io_resourceconfig = lo_resource_config + io_stoppingcondition = lo_stopping_condition ). + + "Wait for training job to be completed. + lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). + WHILE lo_training_result->get_trainingjobstatus( ) <> 'Completed'. + IF sy-index = 30. + EXIT. "maximum 900 seconds + ENDIF. + WAIT UP TO 30 SECONDS. + lo_training_result = ao_sgm->describetrainingjob( iv_trainingjobname = lv_training_job_name ). + ENDWHILE. + + "Create an ABAP object for the container image based on input variables. + lo_primarycontainer = NEW #( iv_image = cv_container_image + iv_modeldataurl = lv_model_data_url ). + + "Create a new model. + ao_sgm->createmodel( iv_modelname = lv_model_name + iv_executionrolearn = av_lrole + io_primarycontainer = lo_primarycontainer ). + + ao_sgm_actions->create_transform_job( + EXPORTING + iv_tf_model_name = lv_model_name + iv_tf_job_name = lv_transform_job_name + iv_tf_data_s3datatype = cv_tf_data_s3datatype + iv_tf_data_s3uri = lv_transform_data_s3uri + iv_tf_data_compressiontype = cv_tf_data_compressiontype + iv_tf_data_contenttype = cv_tf_data_contenttype + iv_instance_count = cv_tf_instance_count + iv_instance_type = cv_tf_instance_type + iv_s3_output_path = lv_s3_transform_output_path + IMPORTING + oo_result = lo_tf_result ). + + DATA(lv_found) = abap_false. + + IF lo_tf_result->has_transformjobarn( ) = 'X'. + lv_found = abap_true. + ENDIF. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Transform Job cannot be found| ). + + "Transform jobs and logs cannot be deleted and are retained indefinitely. + + "Clean up. + ao_sgm->deletemodel( + iv_modelname = lv_model_name ). + + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = cv_train_key ). + + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = cv_val_key ). + + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = cv_transform_key ). + + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = lv_model_key ). + + ao_s3->deletebucket( + iv_bucket = lv_bucket_name ). + + ENDMETHOD. + + METHOD list_algorithms. + + DATA lv_algorithm_name TYPE /aws1/sgmentityname. + DATA lo_trainingspecification TYPE REF TO /aws1/cl_sgmtrainingspec. + DATA lo_sgmchannelspec TYPE REF TO /aws1/cl_sgmchannelspec. + DATA lt_sgmchannelspec TYPE /aws1/cl_sgmchannelspec=>tt_channelspecifications. + DATA lo_sgmtrninstancetypes_w TYPE REF TO /aws1/cl_sgmtrninstancetypes_w. + DATA lt_supportedtrninstancetypes TYPE /aws1/cl_sgmtrninstancetypes_w=>tt_traininginstancetypes. + DATA lo_algorithms_result TYPE REF TO /aws1/cl_sgmlistalgsoutput. + DATA lv_instance_type TYPE /aws1/sgmtraininginstancetype. + DATA lo_sgmcontenttypes_w TYPE REF TO /aws1/cl_sgmcontenttypes_w. + DATA lt_supportedcontenttypes TYPE /aws1/cl_sgmcontenttypes_w=>tt_contenttypes. + DATA lo_sgmcompressiontypes_w TYPE REF TO /aws1/cl_sgmcompressiontypes_w. + DATA lt_supportedcompressiontypes TYPE /aws1/cl_sgmcompressiontypes_w=>tt_compressiontypes. + DATA lo_supportedinputmodes TYPE REF TO /aws1/cl_sgminputmodes_w. + DATA lt_supportedinputmodes TYPE /aws1/cl_sgminputmodes_w=>tt_inputmodes. + DATA lo_des_algorithm_result TYPE REF TO /aws1/cl_sgmdescribealgoutput. + + DATA lv_uuid_16 TYPE sysuuid_x16. + + CONSTANTS cv_container_image TYPE /aws1/sgmcontainerimage VALUE '246618743249.dkr.ecr.us-west-2.amazonaws.com/sagemaker-xgboost:1.5-1'. + + "Define name. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_algorithm_name = 'code-example-algorithm-' && lv_uuid_16. + TRANSLATE lv_algorithm_name TO LOWER CASE. + + "Define training specification. + lo_sgmtrninstancetypes_w = NEW #( iv_value = 'ml.m5.large' ). + INSERT lo_sgmtrninstancetypes_w INTO TABLE lt_supportedtrninstancetypes. + + lo_sgmcontenttypes_w = NEW #( iv_value = 'S3Prefix' ). + INSERT lo_sgmcontenttypes_w INTO TABLE lt_supportedcontenttypes. + + lo_sgmcompressiontypes_w = NEW #( iv_value = 'None' ). + INSERT lo_sgmcompressiontypes_w INTO TABLE lt_supportedcompressiontypes. + + lo_supportedinputmodes = NEW #( iv_value = 'File' ). + INSERT lo_supportedinputmodes INTO TABLE lt_supportedinputmodes. + + lo_sgmchannelspec = NEW #( iv_name = 'train' + it_supportedcontenttypes = lt_supportedcontenttypes + it_supportedcompressiontypes = lt_supportedcompressiontypes + it_supportedinputmodes = lt_supportedinputmodes + iv_isrequired = ' ' ). + + INSERT lo_sgmchannelspec INTO TABLE lt_sgmchannelspec. + + lo_trainingspecification = NEW #( iv_trainingimage = cv_container_image + it_supportedtrninstancetypes = lt_supportedtrninstancetypes + it_trainingchannels = lt_sgmchannelspec ). + + "Create algorithm. + ao_sgm->createalgorithm( + iv_algorithmname = lv_algorithm_name + io_trainingspecification = lo_trainingspecification ). + + "Testing list algorithm. + ao_sgm_actions->list_algorithms( + EXPORTING + iv_name_contains = lv_algorithm_name + IMPORTING + oo_result = lo_algorithms_result ). + + "Validation. + DATA(lv_found) = abap_false. + + LOOP AT lo_algorithms_result->get_algorithmsummarylist( ) INTO DATA(lo_algorithms). + IF lo_algorithms->get_algorithmname( ) = lv_algorithm_name. + lv_found = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Algorithm cannot be found| ). + + "Waiter. + lo_des_algorithm_result = ao_sgm->describealgorithm( iv_algorithmname = lv_algorithm_name ). + WHILE lo_des_algorithm_result->get_algorithmstatus( ) <> 'Completed'. + IF sy-index = 30. + EXIT. "maximum 900 seconds + ENDIF. + WAIT UP TO 30 SECONDS. + lo_des_algorithm_result = ao_sgm->describealgorithm( iv_algorithmname = lv_algorithm_name ). + ENDWHILE. + + "Clean up. + ao_sgm->deletealgorithm( + iv_algorithmname = lv_algorithm_name ). + + ENDMETHOD. + +ENDCLASS. diff --git a/sap-abap/services/sgm/#awsex#cl_sgm_actions.clas.xml b/sap-abap/services/sgm/#awsex#cl_sgm_actions.clas.xml new file mode 100644 index 00000000000..246a901a9e0 --- /dev/null +++ b/sap-abap/services/sgm/#awsex#cl_sgm_actions.clas.xml @@ -0,0 +1,17 @@ + + + + + + /AWSEX/CL_SGM_ACTIONS + E + SageMaker Code Example Actions + 1 + X + X + X + X + + + + diff --git a/sap-abap/services/sgm/#awsex#cl_sgm_scenarios.clas.abap b/sap-abap/services/sgm/#awsex#cl_sgm_scenarios.clas.abap new file mode 100644 index 00000000000..d8c8ff28407 --- /dev/null +++ b/sap-abap/services/sgm/#awsex#cl_sgm_scenarios.clas.abap @@ -0,0 +1,257 @@ +CLASS /awsex/cl_sgm_scenarios DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + METHODS getting_started_with_sgm + IMPORTING + !iv_training_job_name TYPE /aws1/sgmtrainingjobname + !iv_role_arn TYPE /aws1/sgmrolearn + !iv_trn_data_s3datatype TYPE /aws1/sgms3datatype + !iv_trn_data_s3datadistribution TYPE /aws1/sgms3datadistribution + !iv_trn_data_s3uri TYPE /aws1/sgms3uri + !iv_trn_data_compressiontype TYPE /aws1/sgmcompressiontype + !iv_trn_data_contenttype TYPE /aws1/sgmcontenttype + !iv_val_data_s3datatype TYPE /aws1/sgms3datatype + !iv_val_data_s3datadistribution TYPE /aws1/sgms3datadistribution + !iv_val_data_s3uri TYPE /aws1/sgms3uri + !iv_val_data_compressiontype TYPE /aws1/sgmcompressiontype + !iv_val_data_contenttype TYPE /aws1/sgmcontenttype + !iv_hp_max_depth TYPE /aws1/sgmhyperparametervalue + !iv_hp_scale_pos_weight TYPE /aws1/sgmhyperparametervalue + !iv_hp_num_round TYPE /aws1/sgmhyperparametervalue + !iv_hp_objective TYPE /aws1/sgmhyperparametervalue + !iv_hp_subsample TYPE /aws1/sgmhyperparametervalue + !iv_hp_eval_metric TYPE /aws1/sgmhyperparametervalue + !iv_hp_eta TYPE /aws1/sgmhyperparametervalue + !iv_training_image TYPE /aws1/sgmalgorithmimage + !iv_training_input_mode TYPE /aws1/sgmtraininginputmode + !iv_instance_count TYPE /aws1/sgmtraininginstancecount + !iv_instance_type TYPE /aws1/sgmtraininginstancetype + !iv_volume_sizeingb TYPE /aws1/sgmvolumesizeingb + !iv_s3_output_path TYPE /aws1/sgms3uri + !iv_max_runtime_in_seconds TYPE /aws1/sgmmaxruntimeinseconds + !iv_ep_instance_type TYPE /aws1/sgminstancetype + !iv_ep_initial_instance_count TYPE /aws1/sgminitialtaskcount + !iv_model_name TYPE /aws1/sgmmodelname + !iv_ep_name TYPE /aws1/sgmendpointname + !iv_ep_cfg_name TYPE /aws1/sgmendpointconfigname + !iv_ep_variant_name TYPE /aws1/sgmvariantname + EXPORTING + !oo_ep_output TYPE REF TO /aws1/cl_sgmcreateendptoutput + RAISING /aws1/cx_rt_generic. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS /AWSEX/CL_SGM_SCENARIOS IMPLEMENTATION. + + + METHOD getting_started_with_sgm. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sgm) = /aws1/cl_sgm_factory=>create( lo_session ). + + "This example scenario contains the following actions:" + " 1. Model training. " + " 2. Model creation. " + " 3. Create endpoint configuration. " + " 4. Create endpoint. " + " 5. Delete endpoint. " + " 6. Delete endpoint configuration. " + " 7. Delete model. " + + "snippet-start:[sgm.abapv1.getting_started_with_sgm] + + DATA lo_hyperparameters_w TYPE REF TO /aws1/cl_sgmhyperparameters_w. + DATA lo_trn_channel TYPE REF TO /aws1/cl_sgmchannel. + DATA lo_trn_datasource TYPE REF TO /aws1/cl_sgmdatasource. + DATA lo_trn_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. + DATA lo_val_channel TYPE REF TO /aws1/cl_sgmchannel. + DATA lo_val_datasource TYPE REF TO /aws1/cl_sgmdatasource. + DATA lo_val_s3datasource TYPE REF TO /aws1/cl_sgms3datasource. + DATA lo_algorithm_specification TYPE REF TO /aws1/cl_sgmalgorithmspec. + DATA lo_resource_config TYPE REF TO /aws1/cl_sgmresourceconfig. + DATA lo_output_data_config TYPE REF TO /aws1/cl_sgmoutputdataconfig. + DATA lo_stopping_condition TYPE REF TO /aws1/cl_sgmstoppingcondition. + DATA lo_primarycontainer TYPE REF TO /aws1/cl_sgmcontainerdefn. + DATA lo_production_variants TYPE REF TO /aws1/cl_sgmproductionvariant. + DATA lo_ep_config_result TYPE REF TO /aws1/cl_sgmcreateendptcfgout. + DATA lo_training_result TYPE REF TO /aws1/cl_sgmdescrtrnjobrsp. + DATA lt_production_variants TYPE /aws1/cl_sgmproductionvariant=>tt_productionvariantlist. + DATA lt_input_data_config TYPE /aws1/cl_sgmchannel=>tt_inputdataconfig. + DATA lt_hyperparameters TYPE /aws1/cl_sgmhyperparameters_w=>tt_hyperparameters. + DATA lv_model_data_url TYPE /aws1/sgmurl. + + lv_model_data_url = iv_s3_output_path && iv_training_job_name && '/output/model.tar.gz'. + + "Create ABAP internal table for hyperparameters based on input variables." + "These hyperparameters are based on Amazon SageMaker built-in algorithm - XGBoost" + lo_hyperparameters_w = NEW #( iv_value = iv_hp_max_depth ). + INSERT VALUE #( key = 'max_depth' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = iv_hp_eta ). + INSERT VALUE #( key = 'eta' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = iv_hp_eval_metric ). + INSERT VALUE #( key = 'eval_metric' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = iv_hp_scale_pos_weight ). + INSERT VALUE #( key = 'scale_pos_weight' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = iv_hp_subsample ). + INSERT VALUE #( key = 'subsample' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = iv_hp_objective ). + INSERT VALUE #( key = 'objective' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + lo_hyperparameters_w = NEW #( iv_value = iv_hp_num_round ). + INSERT VALUE #( key = 'num_round' value = lo_hyperparameters_w ) INTO TABLE lt_hyperparameters. + + "Create ABAP internal table for data based on input variables." + "Training data." + lo_trn_s3datasource = NEW #( iv_s3datatype = iv_trn_data_s3datatype + iv_s3datadistributiontype = iv_trn_data_s3datadistribution + iv_s3uri = iv_trn_data_s3uri ). + + lo_trn_datasource = NEW #( io_s3datasource = lo_trn_s3datasource ). + + lo_trn_channel = NEW #( iv_channelname = 'train' + io_datasource = lo_trn_datasource + iv_compressiontype = iv_trn_data_compressiontype + iv_contenttype = iv_trn_data_contenttype ). + INSERT lo_trn_channel INTO TABLE lt_input_data_config. + + "Validation data." + lo_val_s3datasource = NEW #( iv_s3datatype = iv_val_data_s3datatype + iv_s3datadistributiontype = iv_val_data_s3datadistribution + iv_s3uri = iv_val_data_s3uri ). + + lo_val_datasource = NEW #( io_s3datasource = lo_val_s3datasource ). + + lo_val_channel = NEW #( iv_channelname = 'validation' + io_datasource = lo_val_datasource + iv_compressiontype = iv_val_data_compressiontype + iv_contenttype = iv_val_data_contenttype ). + INSERT lo_val_channel INTO TABLE lt_input_data_config. + + "Create an ABAP object for algorithm specification based on input variables." + lo_algorithm_specification = NEW #( iv_trainingimage = iv_training_image + iv_traininginputmode = iv_training_input_mode ). + + "Create an ABAP object for resource configuration." + lo_resource_config = NEW #( iv_instancecount = iv_instance_count + iv_instancetype = iv_instance_type + iv_volumesizeingb = iv_volume_sizeingb ). + + "Create an ABAP object for output data configuration." + lo_output_data_config = NEW #( iv_s3outputpath = iv_s3_output_path ). + + "Create an ABAP object for stopping condition." + lo_stopping_condition = NEW #( iv_maxruntimeinseconds = iv_max_runtime_in_seconds ). + + TRY. + lo_sgm->createtrainingjob( + iv_trainingjobname = iv_training_job_name + iv_rolearn = iv_role_arn + it_hyperparameters = lt_hyperparameters + it_inputdataconfig = lt_input_data_config + io_algorithmspecification = lo_algorithm_specification + io_outputdataconfig = lo_output_data_config + io_resourceconfig = lo_resource_config + io_stoppingcondition = lo_stopping_condition ). + MESSAGE 'Training job created.' TYPE 'I'. + CATCH /aws1/cx_sgmresourceinuse. + MESSAGE 'Resource being accessed is in use.' TYPE 'E'. + CATCH /aws1/cx_sgmresourcenotfound. + MESSAGE 'Resource being accessed is not found.' TYPE 'E'. + CATCH /aws1/cx_sgmresourcelimitexcd. + MESSAGE 'You have reached the limit on the number of resources.' TYPE 'E'. + ENDTRY. + + "Wait for training job to be completed." + lo_training_result = lo_sgm->describetrainingjob( iv_trainingjobname = iv_training_job_name ). + WHILE lo_training_result->get_trainingjobstatus( ) <> 'Completed'. + IF sy-index = 30. + EXIT. "Maximum 900 seconds." + ENDIF. + WAIT UP TO 30 SECONDS. + lo_training_result = lo_sgm->describetrainingjob( iv_trainingjobname = iv_training_job_name ). + ENDWHILE. + + "Create ABAP object for the container image based on input variables." + lo_primarycontainer = NEW #( iv_image = iv_training_image + iv_modeldataurl = lv_model_data_url ). + + "Create an Amazon SageMaker model." + TRY. + lo_sgm->createmodel( + iv_executionrolearn = iv_role_arn + iv_modelname = iv_model_name + io_primarycontainer = lo_primarycontainer ). + MESSAGE 'Model created.' TYPE 'I'. + CATCH /aws1/cx_sgmresourcelimitexcd. + MESSAGE 'You have reached the limit on the number of resources.' TYPE 'E'. + ENDTRY. + + "Create an endpoint production variant." + lo_production_variants = NEW #( iv_variantname = iv_ep_variant_name + iv_modelname = iv_model_name + iv_initialinstancecount = iv_ep_initial_instance_count + iv_instancetype = iv_ep_instance_type ). + INSERT lo_production_variants INTO TABLE lt_production_variants. + + TRY. + "Create an endpoint configuration." + lo_ep_config_result = lo_sgm->createendpointconfig( + iv_endpointconfigname = iv_ep_cfg_name + it_productionvariants = lt_production_variants ). + MESSAGE 'Endpoint configuration created.' TYPE 'I'. + + "Create an endpoint." + oo_ep_output = lo_sgm->createendpoint( " oo_ep_output is returned for testing purposes. " + iv_endpointconfigname = iv_ep_cfg_name + iv_endpointname = iv_ep_name ). + MESSAGE 'Endpoint created.' TYPE 'I'. + CATCH /aws1/cx_sgmresourcelimitexcd. + MESSAGE 'You have reached the limit on the number of resources.' TYPE 'E'. + ENDTRY. + + "Wait for endpoint creation to be completed." + DATA(lo_endpoint_result) = lo_sgm->describeendpoint( iv_endpointname = iv_ep_name ). + WHILE lo_endpoint_result->get_endpointstatus( ) <> 'InService'. + IF sy-index = 30. + EXIT. "Maximum 900 seconds." + ENDIF. + WAIT UP TO 30 SECONDS. + lo_endpoint_result = lo_sgm->describeendpoint( iv_endpointname = iv_ep_name ). + ENDWHILE. + + TRY. + "Delete an endpoint." + lo_sgm->deleteendpoint( + iv_endpointname = iv_ep_name ). + MESSAGE 'Endpoint deleted' TYPE 'I'. + + "Delete an endpoint configuration." + lo_sgm->deleteendpointconfig( + iv_endpointconfigname = iv_ep_cfg_name ). + MESSAGE 'Endpoint configuration deleted.' TYPE 'I'. + + "Delete model." + lo_sgm->deletemodel( + iv_modelname = iv_model_name ). + MESSAGE 'Model deleted.' TYPE 'I'. + CATCH /aws1/cx_rt_service_generic INTO DATA(lo_endpointconfig_exception). + DATA(lv_endpointconfig_error) = |"{ lo_endpointconfig_exception->av_err_code }" - { lo_endpointconfig_exception->av_err_msg }|. + MESSAGE lv_endpointconfig_error TYPE 'E'. + ENDTRY. + "snippet-end:[sgm.abapv1.getting_started_with_sgm] + + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/sgm/#awsex#cl_sgm_scenarios.clas.testclasses.abap b/sap-abap/services/sgm/#awsex#cl_sgm_scenarios.clas.testclasses.abap new file mode 100644 index 00000000000..7d9775959c1 --- /dev/null +++ b/sap-abap/services/sgm/#awsex#cl_sgm_scenarios.clas.testclasses.abap @@ -0,0 +1,321 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 + +CLASS ltc_awsex_cl_sgm_scenario DEFINITION DEFERRED. +CLASS /awsex/cl_sgm_scenarios DEFINITION LOCAL FRIENDS ltc_awsex_cl_sgm_scenario. + +CLASS ltc_awsex_cl_sgm_scenario DEFINITION FOR TESTING DURATION LONG RISK LEVEL DANGEROUS. + + PRIVATE SECTION. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA ao_sgm TYPE REF TO /aws1/if_sgm. + DATA ao_s3 TYPE REF TO /aws1/if_s3. + DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. + DATA ao_sgm_scenario TYPE REF TO /awsex/cl_sgm_scenarios. + DATA av_lrole TYPE /aws1/sgmrolearn. + + METHODS getting_started_scenario FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS setup RAISING /aws1/cx_rt_generic /awsex/cx_generic. + +ENDCLASS. "ltc_awsex_cl_sgm_scenario + + +CLASS ltc_awsex_cl_sgm_scenario IMPLEMENTATION. + + METHOD setup. + ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). + ao_sgm = /aws1/cl_sgm_factory=>create( ao_session ). + ao_s3 = /aws1/cl_s3_factory=>create( ao_session ). + ao_sgm_scenario = NEW /awsex/cl_sgm_scenarios( ). + ENDMETHOD. + + METHOD getting_started_scenario. + + "This test case runs a training job for sales prediction using the built-in algorithm XGBoost. + + + DATA lv_timestamp TYPE timestamp. + DATA lo_ep_output TYPE REF TO /aws1/cl_sgmcreateendptoutput. + DATA lv_endpoint_name TYPE /aws1/sgmendpointname. + DATA lv_endpoint_config_name TYPE /aws1/sgmendpointconfigname. + DATA lv_model_name TYPE /aws1/sgmmodelname. + DATA lv_bucket_name TYPE /aws1/s3_bucketname. + DATA lv_file_content TYPE /aws1/s3_streamingblob. + DATA lv_trn_data_s3uri TYPE /aws1/sgms3uri. + DATA lv_val_data_s3uri TYPE /aws1/sgms3uri. + DATA lv_s3_output_path TYPE /aws1/sgms3uri. + DATA lv_model_key TYPE /aws1/s3_objectkey. + DATA lv_uuid_16 TYPE sysuuid_x16. + + "Define job name. + CONSTANTS cv_training_job_name TYPE /aws1/sgmtrainingjobname VALUE 'code-example-trn-job-'. + + "Define hyperparameters. + CONSTANTS cv_hp_max_depth TYPE /aws1/sgmhyperparametervalue VALUE '3'. + CONSTANTS cv_hp_scale_pos_weight TYPE /aws1/sgmhyperparametervalue VALUE '2.0'. + CONSTANTS cv_hp_num_round TYPE /aws1/sgmhyperparametervalue VALUE '100'. + CONSTANTS cv_hp_objective TYPE /aws1/sgmhyperparametervalue VALUE 'binary:logistic'. + CONSTANTS cv_hp_subsample TYPE /aws1/sgmhyperparametervalue VALUE '0.5'. + CONSTANTS cv_hp_eta TYPE /aws1/sgmhyperparametervalue VALUE '0.1'. + CONSTANTS cv_hp_eval_metric TYPE /aws1/sgmhyperparametervalue VALUE 'auc'. + + "Define training data. + CONSTANTS cv_trn_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. + CONSTANTS cv_trn_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. + CONSTANTS cv_trn_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. + CONSTANTS cv_trn_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. + + "Define validation data. + CONSTANTS cv_val_data_s3datatype TYPE /aws1/sgms3datatype VALUE 'S3Prefix'. + CONSTANTS cv_val_data_s3datadistribution TYPE /aws1/sgms3datadistribution VALUE 'FullyReplicated'. + CONSTANTS cv_val_data_compressiontype TYPE /aws1/sgmcompressiontype VALUE 'None'. + CONSTANTS cv_val_data_contenttype TYPE /aws1/sgmcontenttype VALUE 'libsvm'. + + "Define training parameters. + "SGM public training image ref to https://docs.aws.amazon.com/sagemaker/latest/dg/ecr-us-east-1.html#xgboost-us-east-1.title + CONSTANTS cv_training_image TYPE /aws1/sgmalgorithmimage VALUE '246618743249.dkr.ecr.us-west-2.amazonaws.com/sagemaker-xgboost:1.5-1'. + CONSTANTS cv_training_input_mode TYPE /aws1/sgmtraininginputmode VALUE 'File'. + CONSTANTS cv_instance_count TYPE /aws1/sgmtraininginstancecount VALUE '1'. + CONSTANTS cv_instance_type TYPE /aws1/sgmtraininginstancetype VALUE 'ml.c4.2xlarge'. + CONSTANTS cv_volume_sizeingb TYPE /aws1/sgmvolumesizeingb VALUE '10'. + CONSTANTS cv_max_runtime_in_seconds TYPE /aws1/sgmmaxruntimeinseconds VALUE '1800'. + + "Define model parameters. + CONSTANTS cv_model_name TYPE /aws1/sgmmodelname VALUE 'code-example-sgm-model-'. + + "Define endpoint parameters. + CONSTANTS cv_endpoint_name TYPE /aws1/sgmendpointname VALUE 'code-example-endpoint-'. + CONSTANTS cv_endpoint_config_name TYPE /aws1/sgmendpointconfigname VALUE 'code-example-endpoint-cfg-'. + CONSTANTS cv_endpoint_variant_name TYPE /aws1/sgmvariantname VALUE 'code-example-endpoint-variant-'. + CONSTANTS cv_ep_instance_type TYPE /aws1/sgminstancetype VALUE 'ml.m4.xlarge'. + CONSTANTS cv_ep_initial_instance_count TYPE /aws1/sgminitialtaskcount VALUE '1'. + + "Create training data in Amazon Simple Storage Service (Amazon S3). + CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-sgm-'. + CONSTANTS cv_train_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/train/train.libsvm'. + CONSTANTS cv_val_key TYPE /aws1/s3_objectkey VALUE 'sagemaker/validation/validation.libsvm'. + + "Define role Amazon Resource Name (ARN). + DATA(lt_roles) = ao_session->get_configuration( )->get_logical_iam_roles( ). + READ TABLE lt_roles INDEX 1 INTO DATA(lo_role). " take first role from the logical role mapping + av_lrole = lo_role-iam_role_arn. + + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_bucket_name = cv_bucket_name && lv_uuid_16. + TRANSLATE lv_bucket_name TO LOWER CASE. + + /awsex/cl_utils=>create_bucket( iv_bucket = lv_bucket_name + io_s3 = ao_s3 + io_session = ao_session ). + + lv_trn_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_train_key. + lv_val_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_val_key. + lv_s3_output_path = 's3://' && lv_bucket_name && '/' && 'sagemaker/'. + + lv_model_key = 'sagemaker/' && cv_training_job_name && lv_uuid_16 && '/output/model.tar.gz'. + TRANSLATE lv_model_key TO LOWER CASE. + lv_endpoint_name = cv_endpoint_name && lv_uuid_16. + TRANSLATE lv_endpoint_name TO LOWER CASE. + lv_endpoint_config_name = cv_endpoint_config_name && lv_uuid_16. + TRANSLATE lv_endpoint_config_name TO LOWER CASE. + lv_model_name = cv_model_name && lv_uuid_16. + TRANSLATE lv_model_name TO LOWER CASE. + DATA(lv_training_job_name) = cv_training_job_name && lv_uuid_16. + TRANSLATE lv_training_job_name TO LOWER CASE. + DATA(lv_endpoint_variant_name) = cv_endpoint_variant_name && lv_uuid_16. + TRANSLATE lv_endpoint_variant_name TO LOWER CASE. + + lv_file_content = /aws1/cl_rt_util=>string_to_xstring( + |0 0:75 1:6.4 17:1 25:1 95:1 325:1\n| && + |0 0:59 1:7.3 16:1 19:1 296:1 328:1\n| && + |0 0:66 1:6.6 9:1 25:1 193:1 330:1\n| && + |0 0:64 1:6.9 9:1 21:1 146:1 330:1\n| && + |0 0:65 1:8.699999999999999 9:1 29:1 252:1 325:1\n| && + |0 0:61 1:6.1 14:1 29:1 42:1 325:1\n| && + |0 0:81 1:8.300000000000001 12:1 29:1 166:1 325:1\n| && + |0 0:43 1:3.9 10:1 27:1 310:1 330:1\n| && + |0 0:69 1:6.9 8:1 25:1 95:1 325:1\n| && + |1 0:88 1:8.6 9:1 21:1 204:1 330:1\n| && + |0 0:55 1:7.8 12:1 22:1 140:1 325:1\n| && + |0 0:62 1:6 16:1 29:1 95:1 325:1\n| && + |0 0:66 1:7.8 15:1 19:1 204:1 330:1\n| && + |0 0:85 1:5.8 7:1 19:1 295:1 328:1\n| && + |0 0:80 1:6.8 12:1 29:1 166:1 325:1\n| && + |0 0:70 1:3.6 7:1 28:1 95:1 330:1\n| && + |1 0:81 1:6.2 10:1 27:1 61:1 328:1\n| && + |0 0:77 1:7.1 7:1 30:1 222:1 326:1\n| && + |0 0:39 1:3.1 7:1 27:1 102:1 330:1\n| && + |0 0:55 1:5.7 4:1 21:1 278:1 330:1\n| && + |1 0:87 1:7.6 11:1 19:1 310:1 328:1\n| && + |0 0:62 1:6.2 9:1 25:1 149:1 325:1\n| && + |0 0:80 1:8 4:1 24:1 230:1 325:1\n| && + |0 0:68 1:4.9 7:1 30:1 298:1 330:1\n| && + |0 0:73 1:9 4:1 26:1 204:1 330:1\n| && + |0 0:66 1:7.2 9:1 19:1 204:1 330:1\n| && + |0 0:66 1:8.199999999999999 8:1 26:1 38:1 325:1\n| && + |0 0:86 1:8.199999999999999 4:1 23:1 209:1 325:1\n| && + |0 0:81 1:6.4 8:1 29:1 95:1 325:1\n| && + |0 0:71 1:7.1 5:1 29:1 95:1 325:1\n| && + |0 0:79 1:7.9 5:1 22:1 42:1 325:1\n| && + |1 0:64 1:6.4 9:1 22:1 252:1 330:1\n| && + |0 0:78 1:8.300000000000001 9:1 29:1 42:1 325:1\n| && + |1 0:91 1:9 8:1 19:1 305:1 328:1\n| && + |0 0:84 1:6.8 10:1 29:1 95:1 326:1\n| && + |0 0:85 1:8.199999999999999 7:1 27:1 322:1 328:1\n| && + |0 0:33 1:7 4:1 27:1 166:1 325:1\n| && + |0 0:73 1:3 7:1 27:1 42:1 328:1\n| && + |0 0:81 1:8 6:1 29:1 95:1 325:1\n| && + |0 0:59 1:6.8 2:1 25:1 75:1 325:1\n| && + |0 0:85 1:7.5 9:1 29:1 249:1 325:1\n| && + |0 0:79 1:7.6 5:1 29:1 95:1 325:1\n| && + |0 0:63 1:6.9 10:1 29:1 95:1 325:1\n| && + |1 0:95 1:6.8 10:1 23:1 252:1 325:1\n| && + |0 0:47 1:6.1 6:1 19:1 95:1 330:1\n| && + |0 0:81 1:8.6 14:1 19:1 249:1 328:1\n| && + |0 0:50 1:7 9:1 27:1 193:1 328:1\n| && + |0 0:88 1:7.9 10:1 29:1 95:1 326:1\n| && + |1 0:74 1:6.1 10:1 29:1 166:1 325:1\n| && + |0 0:82 1:8.1 17:1 29:1 95:1 325:1\n| && + |0 0:67 1:7.2 10:1 19:1 95:1 328:1\n| && + |0 0:67 1:6.7 6:1 23:1 307:1 326:1\n| && + |0 0:77 1:7.9 10:1 29:1 95:1 325:1\n| && + |0 0:68 1:5.9 7:1 19:1 61:1 328:1\n| && + |1 0:81 1:7.5 10:1 19:1 310:1 326:1\n| && + |0 0:62 1:7.5 4:1 26:1 278:1 326:1\n| && + |1 0:53 1:6.9 5:1 26:1 149:1 325:1\n| && + |0 0:78 1:8.1 2:1 26:1 315:1 326:1\n| && + |0 0:54 1:5.4 17:1 29:1 79:1 325:1\n| && + |0 0:89 1:8.4 10:1 25:1 252:1 326:1\n| && + |1 0:75 1:5.6 2:1 26:1 209:1 325:1\n| && + |0 0:78 1:8.300000000000001 9:1 29:1 252:1 325:1\n| && + |0 0:75 1:8.199999999999999 7:1 28:1 198:1 325:1\n| && + |0 0:72 1:7 7:1 27:1 256:1 330:1\n| && + |0 0:57 1:4.8 9:1 21:1 71:1 330:1\n| && + |0 0:58 1:5.9 10:1 27:1 204:1 330:1\n| && + |0 0:74 1:8.300000000000001 17:1 28:1 224:1 330:1\n| && + |0 0:48 1:7.1 14:1 26:1 249:1 330:1\n| && + |0 0:82 1:7.3 10:1 22:1 276:1 330:1\n| && + |0 0:66 1:7.4 6:1 25:1 307:1 325:1\n| && + |1 0:70 1:8.699999999999999 9:1 19:1 95:1 325:1\n| && + |0 0:86 1:8.4 7:1 23:1 295:1 326:1\n| && + |0 0:42 1:4.2 17:1 25:1 204:1 330:1\n| && + |0 0:75 1:7.8 4:1 27:1 75:1 325:1\n| && + |0 0:93 1:9.300000000000001 9:1 19:1 71:1 330:1\n| && + |0 0:63 1:7.8 17:1 22:1 279:1 330:1\n| && + |1 0:71 1:5.7 4:1 24:1 193:1 326:1\n| && + |0 0:42 1:5 16:1 19:1 256:1 326:1\n| && + |0 0:53 1:5.2 16:1 22:1 249:1 330:1\n| && + |0 0:64 1:6.4 12:1 19:1 282:1 330:1\n| && + |0 0:60 1:7 14:1 19:1 209:1 325:1\n| && + |0 0:86 1:7.4 16:1 21:1 95:1 328:1\n| && + |0 0:91 1:8.9 17:1 29:1 249:1 325:1\n| && + |1 0:82 1:7.8 10:1 26:1 61:1 328:1\n| && + |1 0:92 1:8.300000000000001 16:1 22:1 95:1 330:1\n| && + |1 0:85 1:8.800000000000001 9:1 26:1 252:1 325:1\n| && + |0 0:79 1:7.5 9:1 29:1 252:1 325:1\n| && + |1 0:61 1:5.3 14:1 28:1 35:1 325:1\n| && + |0 0:75 1:7.7 7:1 28:1 95:1 330:1\n| && + |0 0:68 1:8.5 14:1 29:1 279:1 326:1\n| && + |1 0:67 1:5 16:1 27:1 71:1 328:1\n| && + |0 0:79 1:8.5 12:1 26:1 103:1 330:1\n| && + |0 0:61 1:5.1 16:1 29:1 105:1 330:1\n| && + |1 0:72 1:8.699999999999999 12:1 26:1 71:1 330:1\n| && + |0 0:60 1:6.3 9:1 20:1 307:1 328:1\n| && + |0 0:67 1:7.8 9:1 29:1 39:1 325:1\n| && + |0 0:53 1:5.6 9:1 26:1 189:1 330:1\n| && + |1 0:98 1:7.7 8:1 29:1 42:1 330:1\n| && + |0 0:76 1:6.7 7:1 28:1 75:1 330:1\n| && + |1 0:74 1:5.3 7:1 28:1 95:1 330:1\n| ). + + ao_s3->putobject( + iv_bucket = lv_bucket_name + iv_key = cv_train_key + iv_body = lv_file_content ). + + ao_s3->putobject( + iv_bucket = lv_bucket_name + iv_key = cv_val_key + iv_body = lv_file_content ). + + ao_sgm_scenario->getting_started_with_sgm( + EXPORTING + iv_training_job_name = lv_training_job_name + iv_role_arn = av_lrole + iv_trn_data_s3datatype = cv_trn_data_s3datatype + iv_trn_data_s3datadistribution = cv_trn_data_s3datadistribution + iv_trn_data_s3uri = lv_trn_data_s3uri + iv_trn_data_compressiontype = cv_trn_data_compressiontype + iv_trn_data_contenttype = cv_trn_data_contenttype + iv_val_data_s3datatype = cv_val_data_s3datatype + iv_val_data_s3datadistribution = cv_val_data_s3datadistribution + iv_val_data_s3uri = lv_val_data_s3uri + iv_val_data_compressiontype = cv_val_data_compressiontype + iv_val_data_contenttype = cv_val_data_contenttype + iv_hp_max_depth = cv_hp_max_depth + iv_hp_scale_pos_weight = cv_hp_scale_pos_weight + iv_hp_num_round = cv_hp_num_round + iv_hp_objective = cv_hp_objective + iv_hp_subsample = cv_hp_subsample + iv_hp_eval_metric = cv_hp_eval_metric + iv_hp_eta = cv_hp_eta + iv_training_image = cv_training_image + iv_training_input_mode = cv_training_input_mode + iv_instance_count = cv_instance_count + iv_instance_type = cv_instance_type + iv_volume_sizeingb = cv_volume_sizeingb + iv_s3_output_path = lv_s3_output_path + iv_max_runtime_in_seconds = cv_max_runtime_in_seconds + iv_ep_instance_type = cv_ep_instance_type + iv_ep_initial_instance_count = cv_ep_initial_instance_count + iv_model_name = lv_model_name + iv_ep_name = lv_endpoint_name + iv_ep_cfg_name = lv_endpoint_config_name + iv_ep_variant_name = lv_endpoint_variant_name + IMPORTING + oo_ep_output = lo_ep_output ). + + DATA(lv_found) = abap_false. + + IF lo_ep_output->has_endpointarn( ) = 'X'. + lv_found = abap_true. + ENDIF. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Endpoint not found| ). + + DATA(lo_model_list_result) = ao_sgm->listmodels( + iv_namecontains = lv_model_name ). + lv_found = abap_false. + + "The model should be deleted. + LOOP AT lo_model_list_result->get_models( ) INTO DATA(lo_models). + IF lo_models->get_modelname( ) = lv_model_name. + lv_found = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_false( + act = lv_found + msg = |Model was not deleted| ). + + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = cv_train_key ). + + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = cv_val_key ). + + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = lv_model_key ). + + ao_s3->deletebucket( + iv_bucket = lv_bucket_name ). + + ENDMETHOD. + +ENDCLASS. diff --git a/sap-abap/services/sgm/#awsex#cl_sgm_scenarios.clas.xml b/sap-abap/services/sgm/#awsex#cl_sgm_scenarios.clas.xml new file mode 100644 index 00000000000..050b9da835a --- /dev/null +++ b/sap-abap/services/sgm/#awsex#cl_sgm_scenarios.clas.xml @@ -0,0 +1,17 @@ + + + + + + /AWSEX/CL_SGM_SCENARIOS + E + SageMaker Code Example Scenarios + 1 + X + X + X + X + + + + diff --git a/sap-abap/services/sgm/package.devc.xml b/sap-abap/services/sgm/package.devc.xml new file mode 100644 index 00000000000..8b29a8e1f19 --- /dev/null +++ b/sap-abap/services/sgm/package.devc.xml @@ -0,0 +1,10 @@ + + + + + + Package for Amazon Sagemaker + + + + diff --git a/sap-abap/services/sns/#awsex#cl_sns_actions.clas.abap b/sap-abap/services/sns/#awsex#cl_sns_actions.clas.abap new file mode 100644 index 00000000000..93e12f78bd6 --- /dev/null +++ b/sap-abap/services/sns/#awsex#cl_sns_actions.clas.abap @@ -0,0 +1,232 @@ +CLASS /awsex/cl_sns_actions DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + METHODS create_topic + IMPORTING + !iv_topic_name TYPE /aws1/snstopicname + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_snscreatetopicrsp + RAISING /aws1/cx_rt_generic. + METHODS delete_topic + IMPORTING + !iv_topic_arn TYPE /aws1/snstopicarn + RAISING /aws1/cx_rt_generic. + METHODS get_topic_attributes + IMPORTING + !iv_topic_arn TYPE /aws1/snstopicarn + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_snsgettopicattrsrsp + RAISING /aws1/cx_rt_generic. + METHODS subscribe_email + IMPORTING + !iv_topic_arn TYPE /aws1/snstopicarn + !iv_email_address TYPE /aws1/snsendpoint2 + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_snssubscriberesponse + RAISING /aws1/cx_rt_generic. + METHODS unsubscribe + IMPORTING + !iv_subscription_arn TYPE /aws1/snssubscriptionarn + RAISING /aws1/cx_rt_generic. + METHODS list_subscriptions + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_snslstsubscriptions01 + RAISING /aws1/cx_rt_generic. + METHODS list_topics + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_snslisttopicsresponse + RAISING /aws1/cx_rt_generic. + METHODS publish_to_topic + IMPORTING + !iv_topic_arn TYPE /aws1/snsstring + !iv_message TYPE /aws1/snsmessage + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_snspublishresponse + RAISING /aws1/cx_rt_generic. + METHODS set_topic_attributes + IMPORTING + !iv_topic_arn TYPE /aws1/snstopicarn + !iv_attribute_name TYPE /aws1/snsattributename + !iv_attribute_value TYPE /aws1/snsattributevalue + RAISING /aws1/cx_rt_generic. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS /AWSEX/CL_SNS_ACTIONS IMPLEMENTATION. + + + METHOD create_topic. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sns) = /aws1/cl_sns_factory=>create( lo_session ). + + " snippet-start:[sns.abapv1.create_topic] + TRY. + oo_result = lo_sns->createtopic( iv_name = iv_topic_name ). " oo_result is returned for testing purposes. " + MESSAGE 'SNS topic created' TYPE 'I'. + CATCH /aws1/cx_snstopiclimitexcdex. + MESSAGE 'Unable to create more topics. You have reached the maximum number of topics allowed.' TYPE 'E'. + ENDTRY. + " snippet-end:[sns.abapv1.create_topic] + ENDMETHOD. + + + METHOD delete_topic. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sns) = /aws1/cl_sns_factory=>create( lo_session ). + + " snippet-start:[sns.abapv1.delete_topic] + TRY. + lo_sns->deletetopic( iv_topicarn = iv_topic_arn ). + MESSAGE 'SNS topic deleted.' TYPE 'I'. + CATCH /aws1/cx_snsnotfoundexception. + MESSAGE 'Topic does not exist.' TYPE 'E'. + ENDTRY. + " snippet-end:[sns.abapv1.delete_topic] + ENDMETHOD. + + + METHOD get_topic_attributes. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sns) = /aws1/cl_sns_factory=>create( lo_session ). + + " snippet-start:[sns.abapv1.get_topic_attributes] + TRY. + oo_result = lo_sns->gettopicattributes( iv_topicarn = iv_topic_arn ). " oo_result is returned for testing purposes. " + DATA(lt_attributes) = oo_result->get_attributes( ). + MESSAGE 'Retrieved attributes/properties of a topic.' TYPE 'I'. + CATCH /aws1/cx_snsnotfoundexception. + MESSAGE 'Topic does not exist.' TYPE 'E'. + ENDTRY. + " snippet-end:[sns.abapv1.get_topic_attributes] + ENDMETHOD. + + + METHOD list_subscriptions. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sns) = /aws1/cl_sns_factory=>create( lo_session ). + + " snippet-start:[sns.abapv1.list_subscriptions] + TRY. + oo_result = lo_sns->listsubscriptions( ). " oo_result is returned for testing purposes. " + DATA(lt_subscriptions) = oo_result->get_subscriptions( ). + MESSAGE 'Retrieved list of subscribers.' TYPE 'I'. + CATCH /aws1/cx_rt_generic. + MESSAGE 'Unable to list subscribers.' TYPE 'E'. + ENDTRY. + " snippet-end:[sns.abapv1.list_subscriptions] + ENDMETHOD. + + + METHOD list_topics. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sns) = /aws1/cl_sns_factory=>create( lo_session ). + + " snippet-start:[sns.abapv1.list_topics] + TRY. + oo_result = lo_sns->listtopics( ). " oo_result is returned for testing purposes. " + DATA(lt_topics) = oo_result->get_topics( ). + MESSAGE 'Retrieved list of topics.' TYPE 'I'. + CATCH /aws1/cx_rt_generic. + MESSAGE 'Unable to list topics.' TYPE 'E'. + ENDTRY. + " snippet-end:[sns.abapv1.list_topics] + ENDMETHOD. + + + METHOD publish_to_topic. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sns) = /aws1/cl_sns_factory=>create( lo_session ). + + " snippet-start:[sns.abapv1.publish_to_topic]. + TRY. + oo_result = lo_sns->publish( " oo_result is returned for testing purposes. " + iv_topicarn = iv_topic_arn + iv_message = iv_message ). + MESSAGE 'Message published to SNS topic.' TYPE 'I'. + CATCH /aws1/cx_snsnotfoundexception. + MESSAGE 'Topic does not exist.' TYPE 'E'. + ENDTRY. + " snippet-end:[sns.abapv1.publish_to_topic]. + ENDMETHOD. + + + METHOD set_topic_attributes. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sns) = /aws1/cl_sns_factory=>create( lo_session ). + + " snippet-start:[sns.abapv1.set_topic_attributes] + TRY. + lo_sns->settopicattributes( + iv_topicarn = iv_topic_arn + iv_attributename = iv_attribute_name + iv_attributevalue = iv_attribute_value ). + MESSAGE 'Set/updated SNS topic attributes.' TYPE 'I'. + CATCH /aws1/cx_snsnotfoundexception. + MESSAGE 'Topic does not exist.' TYPE 'E'. + ENDTRY. + " snippet-end:[sns.abapv1.set_topic_attributes] + ENDMETHOD. + + + METHOD subscribe_email. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sns) = /aws1/cl_sns_factory=>create( lo_session ). + + " snippet-start:[sns.abapv1.subscribe_email] + TRY. + oo_result = lo_sns->subscribe( "oo_result is returned for testing purposes." + iv_topicarn = iv_topic_arn + iv_protocol = 'email' + iv_endpoint = iv_email_address + iv_returnsubscriptionarn = abap_true ). + MESSAGE 'Email address subscribed to SNS topic.' TYPE 'I'. + CATCH /aws1/cx_snsnotfoundexception. + MESSAGE 'Topic does not exist.' TYPE 'E'. + CATCH /aws1/cx_snssubscriptionlmte00. + MESSAGE 'Unable to create subscriptions. You have reached the maximum number of subscriptions allowed.' TYPE 'E'. + ENDTRY. + " snippet-end:[sns.abapv1.subscribe_email] + ENDMETHOD. + + + METHOD unsubscribe. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sns) = /aws1/cl_sns_factory=>create( lo_session ). + + " snippet-start:[sns.abapv1.unsubscribe] + TRY. + lo_sns->unsubscribe( iv_subscriptionarn = iv_subscription_arn ). + MESSAGE 'Subscription deleted.' TYPE 'I'. + CATCH /aws1/cx_snsnotfoundexception. + MESSAGE 'Subscription does not exist.' TYPE 'E'. + CATCH /aws1/cx_snsinvalidparameterex. + MESSAGE 'Subscription with "PendingConfirmation" status cannot be deleted/unsubscribed. Confirm subscription before performing unsubscribe operation.' TYPE 'E'. + ENDTRY. + " snippet-end:[sns.abapv1.unsubscribe] + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/sns/#awsex#cl_sns_actions.clas.testclasses.abap b/sap-abap/services/sns/#awsex#cl_sns_actions.clas.testclasses.abap new file mode 100644 index 00000000000..91f934c2159 --- /dev/null +++ b/sap-abap/services/sns/#awsex#cl_sns_actions.clas.testclasses.abap @@ -0,0 +1,246 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 + +CLASS ltc_awsex_cl_sns_actions DEFINITION DEFERRED. +CLASS /awsex/cl_sns_actions DEFINITION LOCAL FRIENDS ltc_awsex_cl_sns_actions. + +CLASS ltc_awsex_cl_sns_actions DEFINITION FOR TESTING DURATION SHORT RISK LEVEL DANGEROUS. + + PRIVATE SECTION. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA ao_sns TYPE REF TO /aws1/if_sns. + DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. + DATA ao_sns_actions TYPE REF TO /awsex/cl_sns_actions. + + METHODS: create_topic FOR TESTING RAISING /aws1/cx_rt_generic, + list_topics FOR TESTING RAISING /aws1/cx_rt_generic, + get_topic_attributes FOR TESTING RAISING /aws1/cx_rt_generic, + list_subscriptions FOR TESTING RAISING /aws1/cx_rt_generic, + subscribe_email FOR TESTING RAISING /aws1/cx_rt_generic, + unsubscribe FOR TESTING RAISING /aws1/cx_rt_generic, + delete_topic FOR TESTING RAISING /aws1/cx_rt_generic, + publish_to_topic FOR TESTING RAISING /aws1/cx_rt_generic, + set_topic_attributes FOR TESTING RAISING /aws1/cx_rt_generic. + + METHODS setup RAISING /aws1/cx_rt_generic /awsex/cx_generic. + + METHODS assert_subscription_exists + IMPORTING + iv_topic_arn TYPE /aws1/snstopicarn + iv_subscription_arn TYPE /aws1/snssubscriptionarn + iv_exp TYPE abap_bool + iv_msg TYPE string + RAISING /aws1/cx_rt_generic. + METHODS assert_topic_exists + IMPORTING + iv_topic_arn TYPE /aws1/snstopicarn + iv_exp TYPE abap_bool + iv_msg TYPE string + RAISING /aws1/cx_rt_generic. +ENDCLASS. + +CLASS ltc_awsex_cl_sns_actions IMPLEMENTATION. + + METHOD setup. + ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). + ao_sns = /aws1/cl_sns_factory=>create( ao_session ). + ao_sns_actions = NEW /awsex/cl_sns_actions( ). + ENDMETHOD. + METHOD create_topic. + CONSTANTS cv_topic_name TYPE /aws1/snstopicname VALUE 'code-example-create-topic'. + DATA(lo_result) = ao_sns_actions->create_topic( cv_topic_name ). + assert_topic_exists( + iv_topic_arn = lo_result->get_topicarn( ) + iv_exp = abap_true + iv_msg = |Topic { cv_topic_name } was not created| ). + ao_sns->deletetopic( iv_topicarn = lo_result->get_topicarn( ) ). + ENDMETHOD. + METHOD delete_topic. + CONSTANTS cv_topic_name TYPE /aws1/snstopicname VALUE 'code-example-delete-topic'. + DATA(lo_result) = ao_sns->createtopic( iv_name = cv_topic_name ). + DATA(lv_topic_arn) = lo_result->get_topicarn( ). + + ao_sns_actions->delete_topic( lv_topic_arn ). + assert_topic_exists( + iv_topic_arn = lv_topic_arn + iv_exp = abap_false + iv_msg = |Topic { cv_topic_name } should have been deleted| ). + ENDMETHOD. + METHOD get_topic_attributes. + CONSTANTS cv_topic_name TYPE /aws1/snstopicname VALUE 'code-example-get-topic-attributes'. + DATA(lo_create_result) = ao_sns->createtopic( iv_name = cv_topic_name ). + DATA(lv_topic_arn) = lo_create_result->get_topicarn( ). + DATA(lo_get_attributes_result) = ao_sns_actions->get_topic_attributes( lv_topic_arn ). + + LOOP AT lo_get_attributes_result->get_attributes( ) INTO DATA(wa_attribute). + IF wa_attribute-key = 'TopicArn' AND wa_attribute-value->get_value( ) = lv_topic_arn. + DATA(lv_found) = abap_true. + ENDIF. + ENDLOOP. + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Couldn't retrive attributes for topic { cv_topic_name }| ). + ao_sns->deletetopic( iv_topicarn = lv_topic_arn ). + ENDMETHOD. + METHOD subscribe_email. + CONSTANTS cv_topic_name TYPE /aws1/snstopicname VALUE 'code-example-subscribe-email'. + CONSTANTS cv_email_address TYPE /aws1/snsendpoint2 VALUE 'dummyemail@example.com'. + + DATA(lo_create_result) = ao_sns->createtopic( iv_name = cv_topic_name ). + DATA(lv_topic_arn) = lo_create_result->get_topicarn( ). + DATA(lo_subscribe_result) = ao_sns_actions->subscribe_email( + iv_topic_arn = lv_topic_arn + iv_email_address = cv_email_address ). + cl_abap_unit_assert=>assert_not_initial( + act = lo_subscribe_result->get_subscriptionarn( ) + msg = |Unable to subcribe email address { cv_email_address } to SNS topic { cv_topic_name }| ). + assert_subscription_exists( + iv_topic_arn = lv_topic_arn + iv_subscription_arn = 'PendingConfirmation' + iv_exp = abap_true + iv_msg = |Email { cv_email_address } should have been subscribed| ). + ao_sns->deletetopic( iv_topicarn = lv_topic_arn ). + ENDMETHOD. + METHOD unsubscribe. + CONSTANTS cv_topic_name TYPE /aws1/snstopicname VALUE 'code-example-unsubscribe'. + CONSTANTS cv_queue_name TYPE /aws1/sqsstring VALUE 'code-example-unsubscribe-queue'. + + DATA(lo_create_result) = ao_sns->createtopic( iv_name = cv_topic_name ). + DATA(lv_topic_arn) = lo_create_result->get_topicarn( ). + + DATA(ao_sqs) = /aws1/cl_sqs_factory=>create( ao_session ). + DATA(lo_create_queue_result) = ao_sqs->createqueue( iv_queuename = cv_queue_name ). + DATA(lv_queue_url) = lo_create_queue_result->get_queueurl( ). + DATA lt_required_attributes TYPE /aws1/cl_sqsattrnamelist_w=>tt_attributenamelist. + APPEND NEW /aws1/cl_sqsattrnamelist_w( iv_value = 'QueueArn' ) TO lt_required_attributes. + DATA(lt_queueattributes) = ao_sqs->getqueueattributes( iv_queueurl = lv_queue_url + it_attributenames = lt_required_attributes )->get_attributes( ). + READ TABLE lt_queueattributes INTO DATA(ls_queueattribute) WITH TABLE KEY key = 'QueueArn'. + DATA(lv_queue_arn) = ls_queueattribute-value->get_value( ). + + DATA(lo_subscribe_result) = ao_sns->subscribe( + iv_topicarn = lv_topic_arn + iv_protocol = 'sqs' + iv_endpoint = lv_queue_arn + iv_returnsubscriptionarn = abap_true ). + DATA(lv_subscription_arn) = lo_subscribe_result->get_subscriptionarn( ). + ao_sns_actions->unsubscribe( lv_subscription_arn ). + assert_subscription_exists( + iv_topic_arn = lv_topic_arn + iv_subscription_arn = lv_subscription_arn + iv_exp = abap_false + iv_msg = |Subscriptionl { lv_subscription_arn } should have been subscribed| ). + ao_sqs->deletequeue( iv_queueurl = lv_queue_url ). + ao_sns->deletetopic( iv_topicarn = lv_topic_arn ). + ENDMETHOD. + METHOD list_subscriptions. + CONSTANTS cv_topic_name TYPE /aws1/snstopicname VALUE 'code-example-list-subscriptions'. + CONSTANTS cv_queue_name TYPE /aws1/sqsstring VALUE 'code-example-list-queue'. + + DATA(lo_create_result) = ao_sns->createtopic( iv_name = cv_topic_name ). + DATA(lv_topic_arn) = lo_create_result->get_topicarn( ). + + DATA(ao_sqs) = /aws1/cl_sqs_factory=>create( ao_session ). + DATA(lo_create_queue_result) = ao_sqs->createqueue( iv_queuename = cv_queue_name ). + DATA(lv_queue_url) = lo_create_queue_result->get_queueurl( ). + DATA lt_required_attributes TYPE /aws1/cl_sqsattrnamelist_w=>tt_attributenamelist. + APPEND NEW /aws1/cl_sqsattrnamelist_w( iv_value = 'QueueArn' ) TO lt_required_attributes. + DATA(lt_queueattributes) = ao_sqs->getqueueattributes( iv_queueurl = lv_queue_url + it_attributenames = lt_required_attributes )->get_attributes( ). + READ TABLE lt_queueattributes INTO DATA(ls_queueattribute) WITH TABLE KEY key = 'QueueArn'. + DATA(lv_queue_arn) = ls_queueattribute-value->get_value( ). + + DATA(lo_subscribe_result) = ao_sns->subscribe( + iv_topicarn = lv_topic_arn + iv_protocol = 'sqs' + iv_endpoint = lv_queue_arn + iv_returnsubscriptionarn = abap_true ). + DATA(lv_subscription_arn) = lo_subscribe_result->get_subscriptionarn( ). + DATA(lo_list_result) = ao_sns_actions->list_subscriptions( ). + cl_abap_unit_assert=>assert_not_initial( + act = lo_list_result->get_subscriptions( ) + msg = |Subscription List should not be empty| ). + ao_sns->unsubscribe( iv_subscriptionarn = lv_subscription_arn ). + ao_sqs->deletequeue( iv_queueurl = lv_queue_url ). + ao_sns->deletetopic( iv_topicarn = lv_topic_arn ). + ENDMETHOD. + METHOD list_topics. + CONSTANTS cv_topic_name TYPE /aws1/snstopicname VALUE 'code-example-list-topics'. + DATA(lo_create_result) = ao_sns->createtopic( iv_name = cv_topic_name ). + DATA(lv_topic_arn) = lo_create_result->get_topicarn( ). + DATA(lo_list_result) = ao_sns_actions->list_topics( ). + + LOOP AT lo_list_result->get_topics( ) INTO DATA(lo_topic). + IF lo_topic->get_topicarn( ) = lv_topic_arn. + DATA(lv_found) = abap_true. + ENDIF. + ENDLOOP. + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Topic { cv_topic_name } should have been included in topic list| ). + ao_sns->deletetopic( iv_topicarn = lv_topic_arn ). + ENDMETHOD. + METHOD publish_to_topic. + CONSTANTS cv_topic_name TYPE /aws1/snstopicname VALUE 'code-example-publish-to-topic'. + CONSTANTS cv_message TYPE /aws1/snsmessage VALUE 'Sample message published to a topic'. + DATA(lo_create_result) = ao_sns->createtopic( iv_name = cv_topic_name ). + DATA(lv_topic_arn) = lo_create_result->get_topicarn( ). + DATA(lo_publish_result) = ao_sns_actions->publish_to_topic( + iv_topic_arn = lv_topic_arn + iv_message = cv_message ). + cl_abap_unit_assert=>assert_not_initial( + act = lo_publish_result->get_messageid( ) + msg = |Failed to publish message SNS topint { lv_topic_arn }| ). + ao_sns->deletetopic( iv_topicarn = lv_topic_arn ). + ENDMETHOD. + METHOD set_topic_attributes. + CONSTANTS cv_topic_name TYPE /aws1/snstopicname VALUE 'code-example-set-topic-attributes'. + CONSTANTS cv_attribute_name TYPE /aws1/snsmessage VALUE 'DisplayName'. + CONSTANTS cv_attribute_value TYPE /aws1/snsattributevalue VALUE 'TestDisplayName'. + DATA(lo_create_result) = ao_sns->createtopic( iv_name = cv_topic_name ). + DATA(lv_topic_arn) = lo_create_result->get_topicarn( ). + DATA(lt_attributes) = ao_sns->gettopicattributes( iv_topicarn = lv_topic_arn )->get_attributes( ). + READ TABLE lt_attributes INTO DATA(ls_attributes) WITH TABLE KEY key = cv_attribute_name. + cl_abap_unit_assert=>assert_initial( + act = ls_attributes-value->get_value( ) + msg = |Display Name for SNS topic { cv_topic_name } should have be empty | ). + ao_sns_actions->set_topic_attributes( + iv_topic_arn = lv_topic_arn + iv_attribute_name = cv_attribute_name + iv_attribute_value = cv_attribute_value ). + CLEAR ls_attributes. + CLEAR lt_attributes. + lt_attributes = ao_sns->gettopicattributes( iv_topicarn = lv_topic_arn )->get_attributes( ). + READ TABLE lt_attributes INTO ls_attributes WITH TABLE KEY key = cv_attribute_name. + cl_abap_unit_assert=>assert_equals( + exp = ls_attributes-value->get_value( ) + act = cv_attribute_value + msg = |{ cv_attribute_name } for topic { cv_topic_name } did not match the expected value { cv_attribute_value }| ). + ao_sns->deletetopic( iv_topicarn = lv_topic_arn ). + ENDMETHOD. + METHOD assert_topic_exists. + + LOOP AT ao_sns->listtopics( )->get_topics( ) INTO DATA(lo_topic). + IF lo_topic->get_topicarn( ) = iv_topic_arn. + DATA(lv_found) = abap_true. + ENDIF. + ENDLOOP. + cl_abap_unit_assert=>assert_equals( + exp = iv_exp + act = lv_found + msg = iv_msg ). + ENDMETHOD. + METHOD assert_subscription_exists. + + LOOP AT ao_sns->listsubscriptionsbytopic( iv_topicarn = iv_topic_arn )->get_subscriptions( ) INTO DATA(lo_subscription). + IF lo_subscription->get_subscriptionarn( ) = iv_subscription_arn. + DATA(lv_found) = abap_true. + ENDIF. + ENDLOOP. + cl_abap_unit_assert=>assert_equals( + exp = iv_exp + act = lv_found + msg = iv_msg ). + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/sns/#awsex#cl_sns_actions.clas.xml b/sap-abap/services/sns/#awsex#cl_sns_actions.clas.xml new file mode 100644 index 00000000000..4147e76ed30 --- /dev/null +++ b/sap-abap/services/sns/#awsex#cl_sns_actions.clas.xml @@ -0,0 +1,17 @@ + + + + + + /AWSEX/CL_SNS_ACTIONS + E + SNS Code Example Actions + 1 + X + X + X + X + + + + diff --git a/sap-abap/services/sns/#awsex#cl_sns_scenarios.clas.abap b/sap-abap/services/sns/#awsex#cl_sns_scenarios.clas.abap new file mode 100644 index 00000000000..023ce898fef --- /dev/null +++ b/sap-abap/services/sns/#awsex#cl_sns_scenarios.clas.abap @@ -0,0 +1,92 @@ +CLASS /awsex/cl_sns_scenarios DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + METHODS publish_message_to_fifo_topic + IMPORTING + !iv_topic_name TYPE /aws1/snstopicname + !iv_queue_arn TYPE /aws1/sqsstring + EXPORTING + !ov_topic_arn TYPE /aws1/snstopicarn + !ov_subscription_arn TYPE /aws1/snssubscriptionarn + !ov_message_id TYPE /aws1/snsmessageid + RAISING /aws1/cx_rt_generic. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS /AWSEX/CL_SNS_SCENARIOS IMPLEMENTATION. + + + METHOD publish_message_to_fifo_topic. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sns) = /aws1/cl_sns_factory=>create( lo_session ). + + " snippet-start:[sns.abapv1.publish_message_to_fifo_queue] + + " Creates a FIFO topic. " + DATA lt_tpc_attributes TYPE /aws1/cl_snstopicattrsmap_w=>tt_topicattributesmap. + DATA ls_tpc_attributes TYPE /aws1/cl_snstopicattrsmap_w=>ts_topicattributesmap_maprow. + ls_tpc_attributes-key = 'FifoTopic'. + ls_tpc_attributes-value = NEW /aws1/cl_snstopicattrsmap_w( iv_value = 'true' ). + INSERT ls_tpc_attributes INTO TABLE lt_tpc_attributes. + + TRY. + DATA(lo_create_result) = lo_sns->createtopic( + iv_name = iv_topic_name + it_attributes = lt_tpc_attributes ). + DATA(lv_topic_arn) = lo_create_result->get_topicarn( ). + ov_topic_arn = lv_topic_arn. " ov_topic_arn is returned for testing purposes. " + MESSAGE 'FIFO topic created' TYPE 'I'. + CATCH /aws1/cx_snstopiclimitexcdex. + MESSAGE 'Unable to create more topics. You have reached the maximum number of topics allowed.' TYPE 'E'. + ENDTRY. + + " Subscribes an endpoint to an Amazon Simple Notification Service (Amazon SNS) topic. " + " Only Amazon Simple Queue Service (Amazon SQS) FIFO queues can be subscribed to an SNS FIFO topic. " + TRY. + DATA(lo_subscribe_result) = lo_sns->subscribe( + iv_topicarn = lv_topic_arn + iv_protocol = 'sqs' + iv_endpoint = iv_queue_arn ). + DATA(lv_subscription_arn) = lo_subscribe_result->get_subscriptionarn( ). + ov_subscription_arn = lv_subscription_arn. " ov_subscription_arn is returned for testing purposes. " + MESSAGE 'SQS queue was subscribed to SNS topic.' TYPE 'I'. + CATCH /aws1/cx_snsnotfoundexception. + MESSAGE 'Topic does not exist.' TYPE 'E'. + CATCH /aws1/cx_snssubscriptionlmte00. + MESSAGE 'Unable to create subscriptions. You have reached the maximum number of subscriptions allowed.' TYPE 'E'. + ENDTRY. + + " Publish message to SNS topic. " + TRY. + DATA lt_msg_attributes TYPE /aws1/cl_snsmessageattrvalue=>tt_messageattributemap. + DATA ls_msg_attributes TYPE /aws1/cl_snsmessageattrvalue=>ts_messageattributemap_maprow. + ls_msg_attributes-key = 'Importance'. + ls_msg_attributes-value = NEW /aws1/cl_snsmessageattrvalue( iv_datatype = 'String' + iv_stringvalue = 'High' ). + INSERT ls_msg_attributes INTO TABLE lt_msg_attributes. + + DATA(lo_result) = lo_sns->publish( + iv_topicarn = lv_topic_arn + iv_message = 'The price of your mobile plan has been increased from $19 to $23' + iv_subject = 'Changes to mobile plan' + iv_messagegroupid = 'Update-2' + iv_messagededuplicationid = 'Update-2.1' + it_messageattributes = lt_msg_attributes ). + ov_message_id = lo_result->get_messageid( ). " ov_message_id is returned for testing purposes. " + MESSAGE 'Message was published to SNS topic.' TYPE 'I'. + CATCH /aws1/cx_snsnotfoundexception. + MESSAGE 'Topic does not exist.' TYPE 'E'. + ENDTRY. + + " snippet-end:[sns.abapv1.publish_message_to_fifo_queue] + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/sns/#awsex#cl_sns_scenarios.clas.testclasses.abap b/sap-abap/services/sns/#awsex#cl_sns_scenarios.clas.testclasses.abap new file mode 100644 index 00000000000..34ae0d57632 --- /dev/null +++ b/sap-abap/services/sns/#awsex#cl_sns_scenarios.clas.testclasses.abap @@ -0,0 +1,187 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 + +CLASS ltc_awsex_cl_sns_scenario DEFINITION DEFERRED. +CLASS /awsex/cl_sns_scenarios DEFINITION LOCAL FRIENDS ltc_awsex_cl_sns_scenario. + +CLASS ltc_awsex_cl_sns_scenario DEFINITION FOR TESTING DURATION MEDIUM RISK LEVEL DANGEROUS. + + PRIVATE SECTION. + CONSTANTS: cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO', + cv_topic_name TYPE /aws1/snstopicname VALUE 'code-example-scenario-topic.fifo', + cv_queue_name TYPE /aws1/sqsstring VALUE 'code-example-scenario-queue.fifo'. + + DATA ao_sns TYPE REF TO /aws1/if_sns. + DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. + DATA ao_sns_scenario TYPE REF TO /awsex/cl_sns_scenarios. + DATA ao_sqs TYPE REF TO /aws1/if_sqs. + + DATA av_topic_arn TYPE /aws1/snstopicarn. + DATA av_queue_arn TYPE /aws1/sqsstring. + DATA av_queue_url TYPE /aws1/sqsstring. + + METHODS fifo_topic_scenario FOR TESTING RAISING /aws1/cx_rt_generic /awsex/cx_generic. + + METHODS: setup RAISING /aws1/cx_rt_generic /awsex/cx_generic, + create_and_configure_queue RAISING /aws1/cx_rt_generic /awsex/cx_generic, + verify_message_delivery + IMPORTING iv_message_id TYPE /aws1/snsmessageid + RAISING /aws1/cx_rt_generic /awsex/cx_generic, + delete_queue RAISING /aws1/cx_rt_generic /awsex/cx_generic, + assert_subscription_deleted RAISING /aws1/cx_rt_generic /awsex/cx_generic, + assert_queue_deleted RAISING /aws1/cx_rt_generic /awsex/cx_generic, + assert_topic_deleted RAISING /aws1/cx_rt_generic /awsex/cx_generic. + +ENDCLASS. +CLASS ltc_awsex_cl_sns_scenario IMPLEMENTATION. + + METHOD setup. + ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). + ao_sns = /aws1/cl_sns_factory=>create( ao_session ). + ao_sns_scenario = NEW /awsex/cl_sns_scenarios( ). + ao_sqs = /aws1/cl_sqs_factory=>create( ao_session ). + + ENDMETHOD. + METHOD fifo_topic_scenario. + DATA lv_subscription_arn TYPE /aws1/snssubscriptionarn. + DATA lv_message_id TYPE /aws1/snsmessageid. + + "Create and configure FIFO queue. + create_and_configure_queue( ). + + + + ao_sns_scenario->publish_message_to_fifo_topic( + EXPORTING + iv_topic_name = cv_topic_name + iv_queue_arn = av_queue_arn + IMPORTING + ov_subscription_arn = lv_subscription_arn + ov_topic_arn = av_topic_arn + ov_message_id = lv_message_id ). + + " Verify message delivery (message received by queue). + verify_message_delivery( lv_message_id ). + + " Delete subscription. + ao_sns->unsubscribe( iv_subscriptionarn = lv_subscription_arn ). + assert_subscription_deleted( ). + + "Delete FIFO queue. + delete_queue( ). + assert_queue_deleted( ). + + "Delete Amazon Simple Notification Service (Amazon SNS) topic. + ao_sns->deletetopic( iv_topicarn = av_topic_arn ). + assert_topic_deleted( ). + + ENDMETHOD. + METHOD create_and_configure_queue. + DATA lt_attributes TYPE /aws1/cl_sqsqueueattrmap_w=>tt_queueattributemap. + DATA ls_attribute TYPE /aws1/cl_sqsqueueattrmap_w=>ts_queueattributemap_maprow. + ls_attribute-key = 'FifoQueue'. + ls_attribute-value = NEW /aws1/cl_sqsqueueattrmap_w( iv_value = 'true' ). + INSERT ls_attribute INTO TABLE lt_attributes. + + DATA(lo_create_queue_result) = ao_sqs->createqueue( + iv_queuename = cv_queue_name + it_attributes = lt_attributes ). + av_queue_url = lo_create_queue_result->get_queueurl( ). + cl_abap_unit_assert=>assert_not_initial( + act = av_queue_url + msg = |Failed to create queue { cv_queue_name }| ). + + DATA(lv_policydocument) = |\{ | && + | "Version": "2008-10-17", | && + | "Statement": [ | && + | \{ | && + | "Effect": "Allow", | && + | "Principal": \{ | && + | "Service": "sns.amazonaws.com" | && + | \}, | && + | "Action": "sqs:SendMessage", | && + | "Resource": "arn:aws:sqs:*:*:code-example-scenario-queue.fifo", | && + | "Condition": \{ | && + | "ArnEquals": \{ | && + | "aws:SourceArn": "arn:aws:sns:*:*:code-example-scenario-topic.fifo" | && + | \} | && + | \} | && + | \} | && + | ] | && + |\} |. + + + CLEAR lt_attributes. + CLEAR ls_attribute. + ls_attribute-key = 'Policy'. + ls_attribute-value = NEW /aws1/cl_sqsqueueattrmap_w( iv_value = lv_policydocument ). + INSERT ls_attribute INTO TABLE lt_attributes. + + ao_sqs->setqueueattributes( + iv_queueurl = av_queue_url + it_attributes = lt_attributes ). + + DATA lt_required_attributes TYPE /aws1/cl_sqsattrnamelist_w=>tt_attributenamelist. + APPEND NEW /aws1/cl_sqsattrnamelist_w( iv_value = 'QueueArn' ) TO lt_required_attributes. + DATA(lt_queueattributes) = ao_sqs->getqueueattributes( iv_queueurl = av_queue_url + it_attributenames = lt_required_attributes )->get_attributes( ). + READ TABLE lt_queueattributes INTO DATA(ls_queueattribute) WITH TABLE KEY key = 'QueueArn'. + av_queue_arn = ls_queueattribute-value->get_value( ). + + ENDMETHOD. + METHOD verify_message_delivery. + WAIT UP TO 20 SECONDS. "Making sure that the message is received by the Amazon Simple Queue Service (Amazon SQS) queue. + DATA(lo_result) = ao_sqs->receivemessage( iv_queueurl = av_queue_url ). + + + LOOP AT lo_result->get_messages( ) INTO DATA(lo_message). + IF lo_message->get_body( ) CS iv_message_id. + DATA(lv_found) = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Received message did not match expected body contents| ). + ENDMETHOD. + METHOD delete_queue. + ao_sqs->deletequeue( iv_queueurl = av_queue_url ). + WAIT UP TO 60 SECONDS. "Queue deletion operation takes up to 60 seconds. + ENDMETHOD. + METHOD assert_subscription_deleted. + + LOOP AT ao_sns->listsubscriptionsbytopic( iv_topicarn = av_topic_arn )->get_subscriptions( ) INTO DATA(lo_subscription). + IF lo_subscription->get_endpoint( ) = av_queue_arn AND lo_subscription->get_protocol( ) = 'sqs'. + DATA(lv_found) = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_false( + act = lv_found + msg = |Subscription should have been deleted| ). + ENDMETHOD. + METHOD assert_topic_deleted. + + LOOP AT ao_sns->listtopics( )->get_topics( ) INTO DATA(lo_topic). + IF lo_topic->get_topicarn( ) = av_topic_arn. + DATA(lv_found) = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_false( + act = lv_found + msg = |Topic { cv_topic_name } should have been deleted| ). + ENDMETHOD. + METHOD assert_queue_deleted. + + LOOP AT ao_sqs->listqueues( )->get_queueurls( ) INTO DATA(lo_url). + IF lo_url->get_value( ) = av_queue_url. + DATA(lv_found) = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_false( + act = lv_found + msg = |Queue { cv_queue_name } should have been deleted| ). + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/sns/#awsex#cl_sns_scenarios.clas.xml b/sap-abap/services/sns/#awsex#cl_sns_scenarios.clas.xml new file mode 100644 index 00000000000..d85e6d42d09 --- /dev/null +++ b/sap-abap/services/sns/#awsex#cl_sns_scenarios.clas.xml @@ -0,0 +1,17 @@ + + + + + + /AWSEX/CL_SNS_SCENARIOS + E + SNS Code Example Scenarios + 1 + X + X + X + X + + + + diff --git a/sap-abap/services/sqs/#awsex#cl_sqs_actions.clas.abap b/sap-abap/services/sqs/#awsex#cl_sqs_actions.clas.abap new file mode 100644 index 00000000000..15c9b9f5b39 --- /dev/null +++ b/sap-abap/services/sqs/#awsex#cl_sqs_actions.clas.abap @@ -0,0 +1,213 @@ +CLASS /awsex/cl_sqs_actions DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + PROTECTED SECTION. + PRIVATE SECTION. + + METHODS create_queue + IMPORTING + !iv_queue_name TYPE /aws1/sqsstring + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_sqscreatequeueresult + RAISING /aws1/cx_rt_generic. + METHODS delete_queue + IMPORTING + !iv_queue_url TYPE /aws1/sqsstring + RAISING /aws1/cx_rt_generic. + METHODS send_message + IMPORTING + !iv_queue_url TYPE /aws1/sqsstring + !iv_message TYPE /aws1/sqsstring + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_sqssendmessageresult + RAISING /aws1/cx_rt_generic. + METHODS receive_message + IMPORTING + !iv_queue_url TYPE /aws1/sqsstring + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_sqsreceivemsgresult + RAISING /aws1/cx_rt_generic. + METHODS get_queue_url + IMPORTING + !iv_queue_name TYPE /aws1/sqsstring + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_sqsgetqueueurlresult + RAISING /aws1/cx_rt_generic. + METHODS list_queues + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_sqslistqueuesresult + RAISING /aws1/cx_rt_generic. + METHODS long_polling_on_msg_receipt + IMPORTING + !iv_queue_url TYPE /aws1/sqsstring + !iv_wait_time TYPE /aws1/sqsinteger + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_sqsreceivemsgresult + RAISING /aws1/cx_rt_generic. + METHODS long_polling_on_create_queue + IMPORTING + !iv_queue_name TYPE /aws1/sqsstring + !iv_wait_time TYPE /aws1/sqsstring + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_sqscreatequeueresult + RAISING /aws1/cx_rt_generic. +ENDCLASS. + + + +CLASS /AWSEX/CL_SQS_ACTIONS IMPLEMENTATION. + + + METHOD create_queue. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sqs) = /aws1/cl_sqs_factory=>create( lo_session ). + + " snippet-start:[sqs.abapv1.create_queue] + TRY. + oo_result = lo_sqs->createqueue( iv_queuename = iv_queue_name ). " oo_result is returned for testing purposes. " + MESSAGE 'SQS queue created.' TYPE 'I'. + CATCH /aws1/cx_sqsqueuedeldrecently. + MESSAGE 'After deleting a queue, wait 60 seconds before creating another queue with the same name.' TYPE 'E'. + CATCH /aws1/cx_sqsqueuenameexists. + MESSAGE 'A queue with this name already exists.' TYPE 'E'. + ENDTRY. + " snippet-end:[sqs.abapv1.create_queue] + ENDMETHOD. + + + METHOD delete_queue. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sqs) = /aws1/cl_sqs_factory=>create( lo_session ). + + " snippet-start:[sqs.abapv1.delete_queue] + TRY. + lo_sqs->deletequeue( iv_queueurl = iv_queue_url ). + MESSAGE 'SQS queue deleted' TYPE 'I'. + ENDTRY. + " snippet-end:[sqs.abapv1.delete_queue] + ENDMETHOD. + + + METHOD get_queue_url. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sqs) = /aws1/cl_sqs_factory=>create( lo_session ). + + " snippet-start:[sqs.abapv1.get_queue_url] + TRY. + oo_result = lo_sqs->getqueueurl( iv_queuename = iv_queue_name ). " oo_result is returned for testing purposes. " + MESSAGE 'Queue URL retrieved.' TYPE 'I'. + CATCH /aws1/cx_sqsqueuedoesnotexist. + MESSAGE 'The requested queue does not exist.' TYPE 'E'. + ENDTRY. + " snippet-end:[sqs.abapv1.get_queue_url] + ENDMETHOD. + + + METHOD list_queues. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sqs) = /aws1/cl_sqs_factory=>create( lo_session ). + + " snippet-start:[sqs.abapv1.list_queues] + TRY. + oo_result = lo_sqs->listqueues( ). " oo_result is returned for testing purposes. " + MESSAGE 'Retrieved list of queues.' TYPE 'I'. + ENDTRY. + " snippet-end:[sqs.abapv1.list_queues] + ENDMETHOD. + + + METHOD long_polling_on_create_queue. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sqs) = /aws1/cl_sqs_factory=>create( lo_session ). + + " snippet-start:[sqs.abapv1.long_polling_on_create_queue] + TRY. + DATA lt_attributes TYPE /aws1/cl_sqsqueueattrmap_w=>tt_queueattributemap. + DATA ls_attribute TYPE /aws1/cl_sqsqueueattrmap_w=>ts_queueattributemap_maprow. + ls_attribute-key = 'ReceiveMessageWaitTimeSeconds'. " Time in seconds for long polling, such as how long the call waits for a message to arrive in the queue before returning. " + ls_attribute-value = NEW /aws1/cl_sqsqueueattrmap_w( iv_value = iv_wait_time ). + INSERT ls_attribute INTO TABLE lt_attributes. + oo_result = lo_sqs->createqueue( " oo_result is returned for testing purposes. " + iv_queuename = iv_queue_name + it_attributes = lt_attributes ). + MESSAGE 'SQS queue created.' TYPE 'I'. + CATCH /aws1/cx_sqsqueuedeldrecently. + MESSAGE 'After deleting a queue, wait 60 seconds before creating another queue with the same name.' TYPE 'E'. + CATCH /aws1/cx_sqsqueuenameexists. + MESSAGE 'A queue with this name already exists.' TYPE 'E'. + ENDTRY. + " snippet-end:[sqs.abapv1.long_polling_on_create_queue] + ENDMETHOD. + + + METHOD long_polling_on_msg_receipt. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sqs) = /aws1/cl_sqs_factory=>create( lo_session ). + + " snippet-start:[sqs.abapv1.long_polling_on_msg_receipt] + TRY. + oo_result = lo_sqs->receivemessage( " oo_result is returned for testing purposes. " + iv_queueurl = iv_queue_url + iv_waittimeseconds = iv_wait_time ). " Time in seconds for long polling, such as how long the call waits for a message to arrive in the queue before returning. " ). + DATA(lt_messages) = oo_result->get_messages( ). + MESSAGE 'Message received from SQS queue.' TYPE 'I'. + CATCH /aws1/cx_sqsoverlimit. + MESSAGE 'Maximum number of in-flight messages reached.' TYPE 'E'. + ENDTRY. + " snippet-end:[sqs.abapv1.long_polling_on_msg_receipt] + ENDMETHOD. + + + METHOD receive_message. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sqs) = /aws1/cl_sqs_factory=>create( lo_session ). + + " snippet-start:[sqs.abapv1.receive_message] + TRY. + oo_result = lo_sqs->receivemessage( iv_queueurl = iv_queue_url ). " oo_result is returned for testing purposes. " + DATA(lt_messages) = oo_result->get_messages( ). + MESSAGE 'Message received from SQS queue.' TYPE 'I'. + CATCH /aws1/cx_sqsoverlimit. + MESSAGE 'Maximum number of in-flight messages reached.' TYPE 'E'. + ENDTRY. + " snippet-end:[sqs.abapv1.receive_message] + ENDMETHOD. + + + METHOD send_message. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_sqs) = /aws1/cl_sqs_factory=>create( lo_session ). + + " snippet-start:[sqs.abapv1.send_message] + TRY. + oo_result = lo_sqs->sendmessage( " oo_result is returned for testing purposes. " + iv_queueurl = iv_queue_url + iv_messagebody = iv_message ). + MESSAGE 'Message sent to SQS queue.' TYPE 'I'. + CATCH /aws1/cx_sqsinvalidmsgconts. + MESSAGE 'Message contains non-valid characters.' TYPE 'E'. + CATCH /aws1/cx_sqsunsupportedop. + MESSAGE 'Operation not supported.' TYPE 'E'. + ENDTRY. + " snippet-end:[sqs.abapv1.send_message] + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/sqs/#awsex#cl_sqs_actions.clas.testclasses.abap b/sap-abap/services/sqs/#awsex#cl_sqs_actions.clas.testclasses.abap new file mode 100644 index 00000000000..9457d1a03e4 --- /dev/null +++ b/sap-abap/services/sqs/#awsex#cl_sqs_actions.clas.testclasses.abap @@ -0,0 +1,215 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 + +CLASS ltc_awsex_cl_sqs_actions DEFINITION DEFERRED. +CLASS /awsex/cl_sqs_actions DEFINITION LOCAL FRIENDS ltc_awsex_cl_sqs_actions. + +CLASS ltc_awsex_cl_sqs_actions DEFINITION FOR TESTING DURATION MEDIUM RISK LEVEL DANGEROUS. + + PRIVATE SECTION. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA ao_sqs TYPE REF TO /aws1/if_sqs. + DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. + DATA ao_sqs_actions TYPE REF TO /awsex/cl_sqs_actions. + + METHODS: create_queue FOR TESTING RAISING /aws1/cx_rt_generic, + send_message FOR TESTING RAISING /aws1/cx_rt_generic, + receive_message FOR TESTING RAISING /aws1/cx_rt_generic, + list_queues FOR TESTING RAISING /aws1/cx_rt_generic, + get_queue_url FOR TESTING RAISING /aws1/cx_rt_generic, + delete_queue FOR TESTING RAISING /aws1/cx_rt_generic, + long_polling_on_msg_receipt FOR TESTING RAISING /aws1/cx_rt_generic, + long_polling_on_create_queue FOR TESTING RAISING /aws1/cx_rt_generic. + + METHODS setup RAISING /aws1/cx_rt_generic /awsex/cx_generic. + + METHODS assert_queue_exists + IMPORTING + iv_queue_url TYPE /aws1/sqsstring + iv_msg TYPE string + RAISING /aws1/cx_rt_generic. + + +ENDCLASS. +CLASS ltc_awsex_cl_sqs_actions IMPLEMENTATION. + + METHOD setup. + ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). + ao_sqs = /aws1/cl_sqs_factory=>create( ao_session ). + ao_sqs_actions = NEW /awsex/cl_sqs_actions( ). + ENDMETHOD. + METHOD create_queue. + CONSTANTS cv_queue_name TYPE /aws1/sqsstring VALUE 'code-example-create-queue'. + DATA(lo_result) = ao_sqs_actions->create_queue( cv_queue_name ). + assert_queue_exists( + iv_queue_url = lo_result->get_queueurl( ) + iv_msg = |Queue { cv_queue_name } was not created| ). + ao_sqs->deletequeue( iv_queueurl = lo_result->get_queueurl( ) ). + ENDMETHOD. + METHOD send_message. + CONSTANTS cv_queue_name TYPE /aws1/sqsstring VALUE 'code-example-send-message'. + CONSTANTS cv_message TYPE /aws1/sqsstring VALUE 'Sample text message to test send message action'. + DATA(lo_create_result) = ao_sqs->createqueue( iv_queuename = cv_queue_name ). + DATA(lo_send_result) = ao_sqs_actions->send_message( + iv_queue_url = lo_create_result->get_queueurl( ) + iv_message = cv_message ). + cl_abap_unit_assert=>assert_not_initial( + act = lo_send_result->get_messageid( ) + msg = |Message sending failed| ). + DATA(lo_receive_result) = ao_sqs->receivemessage( iv_queueurl = lo_create_result->get_queueurl( ) ). + + LOOP AT lo_receive_result->get_messages( ) INTO DATA(lo_message). + IF lo_message->get_messageid( ) = lo_send_result->get_messageid( ) AND lo_message->get_body( ) = cv_message. + DATA(lv_found) = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Did not receive message { cv_message }| ). + ao_sqs->deletequeue( iv_queueurl = lo_create_result->get_queueurl( ) ). + + ENDMETHOD. + METHOD receive_message. + CONSTANTS cv_queue_name TYPE /aws1/sqsstring VALUE 'code-example-receive-message'. + CONSTANTS cv_message TYPE /aws1/sqsstring VALUE 'Sample text message to test receive message action'. + DATA(lo_create_result) = ao_sqs->createqueue( iv_queuename = cv_queue_name ). + DATA(lo_send_result) = ao_sqs->sendmessage( + iv_queueurl = lo_create_result->get_queueurl( ) + iv_messagebody = cv_message ). + DATA(lo_receive_result) = ao_sqs_actions->receive_message( lo_create_result->get_queueurl( ) ). + + LOOP AT lo_receive_result->get_messages( ) INTO DATA(lo_message). + IF lo_message->get_messageid( ) = lo_send_result->get_messageid( ) AND lo_message->get_body( ) = cv_message. + DATA(lv_found) = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Did not receive message { cv_message }| ). + ao_sqs->deletequeue( iv_queueurl = lo_create_result->get_queueurl( ) ). + + ENDMETHOD. + METHOD long_polling_on_msg_receipt. + CONSTANTS cv_queue_name TYPE /aws1/sqsstring VALUE 'code-example-long-polling-on-msg-receipt'. + CONSTANTS cv_message TYPE /aws1/sqsstring VALUE 'Sample text message to test long polling on message receipt'. + CONSTANTS cv_wait_time TYPE /aws1/sqsinteger VALUE 10. + DATA(lo_create_result) = ao_sqs->createqueue( iv_queuename = cv_queue_name ). + DATA(lo_send_result) = ao_sqs->sendmessage( + iv_queueurl = lo_create_result->get_queueurl( ) + iv_messagebody = cv_message ). + DATA(lo_polling_result) = ao_sqs_actions->long_polling_on_msg_receipt( + iv_queue_url = lo_create_result->get_queueurl( ) + iv_wait_time = cv_wait_time ). + + LOOP AT lo_polling_result->get_messages( ) INTO DATA(lo_message). + IF lo_message->get_messageid( ) = lo_send_result->get_messageid( ) AND lo_message->get_body( ) = cv_message. + DATA(lv_found) = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Did not receive message { cv_message }| ). + ao_sqs->deletequeue( iv_queueurl = lo_create_result->get_queueurl( ) ). + + ENDMETHOD. + METHOD long_polling_on_create_queue. + CONSTANTS cv_queue_name TYPE /aws1/sqsstring VALUE 'code-example-long-polling-on-create-queue'. + CONSTANTS cv_wait_time TYPE /aws1/sqsstring VALUE '10'. + DATA(lo_create_result) = ao_sqs_actions->long_polling_on_create_queue( + iv_queue_name = cv_queue_name + iv_wait_time = cv_wait_time ). + assert_queue_exists( + iv_queue_url = lo_create_result->get_queueurl( ) + iv_msg = |Queue { cv_queue_name } was not created| ). + + DATA lt_attributes TYPE /aws1/cl_sqsattrnamelist_w=>tt_attributenamelist. + APPEND NEW /aws1/cl_sqsattrnamelist_w( iv_value = 'ReceiveMessageWaitTimeSeconds' ) TO lt_attributes. + DATA(lo_get_result) = ao_sqs->getqueueattributes( + iv_queueurl = lo_create_result->get_queueurl( ) + it_attributenames = lt_attributes ). + LOOP AT lo_get_result->get_attributes( ) INTO DATA(lo_attribute). + IF lo_attribute-key = 'ReceiveMessageWaitTimeSeconds'. + cl_abap_unit_assert=>assert_equals( + act = cv_wait_time + exp = lo_attribute-value->get_value( ) + msg = |ReceiveMessageWaitTimeSeconds attribute for queue { cv_queue_name } did not match the expected value| ). + ENDIF. + ENDLOOP. + ao_sqs->deletequeue( iv_queueurl = lo_create_result->get_queueurl( ) ). + ENDMETHOD. + METHOD get_queue_url. + CONSTANTS cv_queue_name TYPE /aws1/sqsstring VALUE 'code-example-get-queue-url'. + DATA(lo_create_result) = ao_sqs->createqueue( iv_queuename = cv_queue_name ). + DATA(lo_get_result) = ao_sqs_actions->get_queue_url( cv_queue_name ). + cl_abap_unit_assert=>assert_equals( + act = lo_create_result->get_queueurl( ) + exp = lo_get_result->get_queueurl( ) + msg = |Queue URL { lo_get_result->get_queueurl( ) } did not match expected value { lo_create_result->get_queueurl( ) }| ). + ao_sqs->deletequeue( iv_queueurl = lo_create_result->get_queueurl( ) ). + ENDMETHOD. + METHOD list_queues. + CONSTANTS cv_queue_name TYPE /aws1/sqsstring VALUE 'code-example-list-queues'. + DATA(lo_create_result) = ao_sqs->createqueue( iv_queuename = cv_queue_name ). + + DATA lv_found TYPE abap_bool VALUE abap_false. + DATA lo_result TYPE REF TO /aws1/cl_sqslistqueuesresult. + WHILE lv_found = abap_false AND sy-index <= 6. + WAIT UP TO 10 SECONDS. " Making sure that the queue is ready for use after creation. + lo_result = ao_sqs_actions->list_queues( ). + LOOP AT lo_result->get_queueurls( ) INTO DATA(lo_url). + IF lo_url->get_value( ) = lo_create_result->get_queueurl( ). + lv_found = abap_true. + ENDIF. + ENDLOOP. + ENDWHILE. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Queue { cv_queue_name } should have been included in queue list| ). + ao_sqs->deletequeue( iv_queueurl = lo_create_result->get_queueurl( ) ). + ENDMETHOD. + METHOD delete_queue. + CONSTANTS cv_queue_name TYPE /aws1/sqsstring VALUE 'code-example-delete-queue'. + DATA(lo_create_result) = ao_sqs->createqueue( iv_queuename = cv_queue_name ). + ao_sqs_actions->delete_queue( lo_create_result->get_queueurl( ) ). + + DATA lv_found TYPE abap_bool VALUE abap_true. + DATA lo_list_result TYPE REF TO /aws1/cl_sqslistqueuesresult. + WHILE lv_found = abap_true AND sy-index <= 6. + WAIT UP TO 10 SECONDS. " Queue deletion can take up to 60 seconds. + lv_found = abap_false. + lo_list_result = ao_sqs->listqueues( ). + LOOP AT lo_list_result->get_queueurls( ) INTO DATA(lo_url). + IF lo_url->get_value( ) = lo_create_result->get_queueurl( ). + lv_found = abap_true. + ENDIF. + ENDLOOP. + ENDWHILE. + + cl_abap_unit_assert=>assert_false( + act = lv_found + msg = |Queue { cv_queue_name } should have been deleted| ). + ENDMETHOD. + METHOD assert_queue_exists. + DATA lv_found TYPE abap_bool VALUE abap_false. + DATA lo_result TYPE REF TO /aws1/cl_sqslistqueuesresult. + WHILE lv_found = abap_false AND sy-index <= 6. + WAIT UP TO 10 SECONDS. " Making sure that the queue is ready for use after creation. + lo_result = ao_sqs->listqueues( ). + LOOP AT lo_result->get_queueurls( ) INTO DATA(lo_url). + IF lo_url->get_value( ) = iv_queue_url. + lv_found = abap_true. + ENDIF. + ENDLOOP. + ENDWHILE. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = iv_msg ). + + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/sqs/#awsex#cl_sqs_actions.clas.xml b/sap-abap/services/sqs/#awsex#cl_sqs_actions.clas.xml new file mode 100644 index 00000000000..6e494d99b73 --- /dev/null +++ b/sap-abap/services/sqs/#awsex#cl_sqs_actions.clas.xml @@ -0,0 +1,17 @@ + + + + + + /AWSEX/CL_SQS_ACTIONS + E + SQS Code Example Actions + 1 + X + X + X + X + + + + diff --git a/sap-abap/services/tex/#awsex#cl_tex_actions.clas.abap b/sap-abap/services/tex/#awsex#cl_tex_actions.clas.abap new file mode 100644 index 00000000000..ee4f1b0abba --- /dev/null +++ b/sap-abap/services/tex/#awsex#cl_tex_actions.clas.abap @@ -0,0 +1,371 @@ +CLASS /awsex/cl_tex_actions DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + METHODS analyze_document + IMPORTING + !iv_s3object TYPE /aws1/texs3objectname OPTIONAL + !iv_s3bucket TYPE /aws1/texs3bucket OPTIONAL + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_texanalyzedocresponse + RAISING /aws1/cx_rt_generic. + METHODS detect_document_text + IMPORTING + !iv_s3object TYPE /aws1/texs3objectname + !iv_s3bucket TYPE /aws1/texs3bucket + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_texdetectdoctextrsp + RAISING /aws1/cx_rt_generic. + METHODS get_document_analysis + IMPORTING + !iv_jobid TYPE /aws1/texjobid + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_texgetdocalyresponse + RAISING /aws1/cx_rt_generic. + METHODS start_document_analysis + IMPORTING + !iv_s3object TYPE /aws1/texs3objectname + !iv_s3bucket TYPE /aws1/texs3bucket + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_texstartdocalyrsp + RAISING /aws1/cx_rt_generic. + METHODS start_document_text_detection + IMPORTING + !iv_s3object TYPE /aws1/texs3objectname + !iv_s3bucket TYPE /aws1/texs3bucket + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_texstartdoctextdetrsp + RAISING /aws1/cx_rt_generic. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS /AWSEX/CL_TEX_ACTIONS IMPLEMENTATION. + + + METHOD analyze_document. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + + "Textract requires endpoint region to be same as the bucket region. + "Retrieve the region name defined as a logical resource in SDK configuration. + CONSTANTS cv_lbucket TYPE string VALUE 'ZEX_TEX_BUCKET_REGION'. + DATA lv_bucket_region TYPE /aws1/rt_region_id. + lv_bucket_region = lo_session->resolve_lresource( cv_lbucket ). + DATA(lo_tex) = /aws1/cl_tex_factory=>create( + io_session = lo_session + iv_region = lv_bucket_region ). + "snippet-start:[tex.abapv1.analyze_document] + + "Detects text and additional elements, such as forms or tables," + "in a local image file or from in-memory byte data." + "The image must be in PNG or JPG format." + + + "Create ABAP objects for feature type." + "Add TABLES to return information about the tables." + "Add FORMS to return detected form data." + "To perform both types of analysis, add TABLES and FORMS to FeatureTypes." + + DATA(lt_featuretypes) = VALUE /aws1/cl_texfeaturetypes_w=>tt_featuretypes( + ( NEW /aws1/cl_texfeaturetypes_w( iv_value = 'FORMS' ) ) + ( NEW /aws1/cl_texfeaturetypes_w( iv_value = 'TABLES' ) ) ). + + "Create an ABAP object for the Amazon Simple Storage Service (Amazon S3) object." + DATA(lo_s3object) = NEW /aws1/cl_texs3object( iv_bucket = iv_s3bucket + iv_name = iv_s3object ). + + "Create an ABAP object for the document." + DATA(lo_document) = NEW /aws1/cl_texdocument( io_s3object = lo_s3object ). + + "Analyze document stored in Amazon S3." + TRY. + oo_result = lo_tex->analyzedocument( "oo_result is returned for testing purposes." + io_document = lo_document + it_featuretypes = lt_featuretypes ). + LOOP AT oo_result->get_blocks( ) INTO DATA(lo_block). + IF lo_block->get_text( ) = 'INGREDIENTS: POWDERED SUGAR* (CANE SUGAR,'. + MESSAGE 'Found text in the doc: ' && lo_block->get_text( ) TYPE 'I'. + ENDIF. + ENDLOOP. + MESSAGE 'Analyze document completed.' TYPE 'I'. + CATCH /aws1/cx_texaccessdeniedex. + MESSAGE 'You do not have permission to perform this action.' TYPE 'E'. + CATCH /aws1/cx_texbaddocumentex. + MESSAGE 'Amazon Textract is not able to read the document.' TYPE 'E'. + CATCH /aws1/cx_texdocumenttoolargeex. + MESSAGE 'The document is too large.' TYPE 'E'. + CATCH /aws1/cx_texhlquotaexceededex. + MESSAGE 'Human loop quota exceeded.' TYPE 'E'. + CATCH /aws1/cx_texinternalservererr. + MESSAGE 'Internal server error.' TYPE 'E'. + CATCH /aws1/cx_texinvalidparameterex. + MESSAGE 'Request has non-valid parameters.' TYPE 'E'. + + CATCH /aws1/cx_texinvalids3objectex. + MESSAGE 'Amazon S3 object is not valid.' TYPE 'E'. + CATCH /aws1/cx_texprovthruputexcdex. + MESSAGE 'Provisioned throughput exceeded limit.' TYPE 'E'. + CATCH /aws1/cx_texthrottlingex. + MESSAGE 'The request processing exceeded the limit.' TYPE 'E'. + CATCH /aws1/cx_texunsupporteddocex. + MESSAGE 'The document is not supported.' TYPE 'E'. + ENDTRY. + "snippet-end:[tex.abapv1.analyze_document] + ENDMETHOD. + + + METHOD detect_document_text. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + + "Textract requires endpoint region to be same as the bucket region. + "Retrieve the region name defined as a logical resource in SDK configuration. + CONSTANTS cv_lbucket TYPE string VALUE 'ZEX_TEX_BUCKET_REGION'. + DATA lv_bucket_region TYPE /aws1/rt_region_id. + lv_bucket_region = lo_session->resolve_lresource( cv_lbucket ). + DATA(lo_tex) = /aws1/cl_tex_factory=>create( + io_session = lo_session + iv_region = lv_bucket_region ). + + "snippet-start:[tex.abapv1.detect_document_text] + + "Detects text in the input document." + "Amazon Textract can detect lines of text and the words that make up a line of text." + "The input document must be in one of the following image formats: JPEG, PNG, PDF, or TIFF." + + "Create an ABAP object for the Amazon S3 object." + DATA(lo_s3object) = NEW /aws1/cl_texs3object( iv_bucket = iv_s3bucket + iv_name = iv_s3object ). + + "Create an ABAP object for the document." + DATA(lo_document) = NEW /aws1/cl_texdocument( io_s3object = lo_s3object ). + "Analyze document stored in Amazon S3." + TRY. + oo_result = lo_tex->detectdocumenttext( io_document = lo_document ). "oo_result is returned for testing purposes." + LOOP AT oo_result->get_blocks( ) INTO DATA(lo_block). + IF lo_block->get_text( ) = 'INGREDIENTS: POWDERED SUGAR* (CANE SUGAR,'. + MESSAGE 'Found text in the doc: ' && lo_block->get_text( ) TYPE 'I'. + ENDIF. + ENDLOOP. + DATA(lo_metadata) = oo_result->get_documentmetadata( ). + MESSAGE 'The number of pages in the document is ' && lo_metadata->ask_pages( ) TYPE 'I'. + MESSAGE 'Detect document text completed.' TYPE 'I'. + CATCH /aws1/cx_texaccessdeniedex. + MESSAGE 'You do not have permission to perform this action.' TYPE 'E'. + CATCH /aws1/cx_texbaddocumentex. + MESSAGE 'Amazon Textract is not able to read the document.' TYPE 'E'. + CATCH /aws1/cx_texdocumenttoolargeex. + MESSAGE 'The document is too large.' TYPE 'E'. + CATCH /aws1/cx_texinternalservererr. + MESSAGE 'Internal server error.' TYPE 'E'. + CATCH /aws1/cx_texinvalidparameterex. + MESSAGE 'Request has non-valid parameters.' TYPE 'E'. + CATCH /aws1/cx_texinvalids3objectex. + MESSAGE 'Amazon S3 object is not valid.' TYPE 'E'. + CATCH /aws1/cx_texprovthruputexcdex. + MESSAGE 'Provisioned throughput exceeded limit.' TYPE 'E'. + CATCH /aws1/cx_texthrottlingex. + MESSAGE 'The request processing exceeded the limit' TYPE 'E'. + CATCH /aws1/cx_texunsupporteddocex. + MESSAGE 'The document is not supported.' TYPE 'E'. + ENDTRY. + "snippet-end:[tex.abapv1.detect_document_text] + ENDMETHOD. + + + METHOD get_document_analysis. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + + "Textract requires endpoint region to be same as the bucket region. + "Retrieve the region name defined as a logical resource in SDK configuration. + CONSTANTS cv_lbucket TYPE string VALUE 'ZEX_TEX_BUCKET_REGION'. + DATA lv_bucket_region TYPE /aws1/rt_region_id. + lv_bucket_region = lo_session->resolve_lresource( cv_lbucket ). + DATA(lo_tex) = /aws1/cl_tex_factory=>create( + io_session = lo_session + iv_region = lv_bucket_region ). + + "snippet-start:[tex.abapv1.get_document_analysis] + + "Gets the results for an Amazon Textract" + "asynchronous operation that analyzes text in a document." + TRY. + oo_result = lo_tex->getdocumentanalysis( iv_jobid = iv_jobid ). "oo_result is returned for testing purposes." + WHILE oo_result->get_jobstatus( ) <> 'SUCCEEDED'. + IF sy-index = 10. + EXIT. "Maximum 300 seconds. + ENDIF. + WAIT UP TO 30 SECONDS. + oo_result = lo_tex->getdocumentanalysis( iv_jobid = iv_jobid ). + ENDWHILE. + + DATA(lt_blocks) = oo_result->get_blocks( ). + LOOP AT lt_blocks INTO DATA(lo_block). + IF lo_block->get_text( ) = 'INGREDIENTS: POWDERED SUGAR* (CANE SUGAR,'. + MESSAGE 'Found text in the doc: ' && lo_block->get_text( ) TYPE 'I'. + ENDIF. + ENDLOOP. + MESSAGE 'Document analysis retrieved.' TYPE 'I'. + CATCH /aws1/cx_texaccessdeniedex. + MESSAGE 'You do not have permission to perform this action.' TYPE 'E'. + CATCH /aws1/cx_texinternalservererr. + MESSAGE 'Internal server error.' TYPE 'E'. + CATCH /aws1/cx_texinvalidjobidex. + MESSAGE 'Job ID is not valid.' TYPE 'E'. + CATCH /aws1/cx_texinvalidkmskeyex. + MESSAGE 'AWS KMS key is not valid.' TYPE 'E'. + CATCH /aws1/cx_texinvalidparameterex. + MESSAGE 'Request has non-valid parameters.' TYPE 'E'. + CATCH /aws1/cx_texinvalids3objectex. + MESSAGE 'Amazon S3 object is not valid.' TYPE 'E'. + CATCH /aws1/cx_texprovthruputexcdex. + MESSAGE 'Provisioned throughput exceeded limit.' TYPE 'E'. + CATCH /aws1/cx_texthrottlingex. + MESSAGE 'The request processing exceeded the limit.' TYPE 'E'. + ENDTRY. + "snippet-end:[tex.abapv1.get_document_analysis] + + ENDMETHOD. + + + METHOD start_document_analysis. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + + "Textract requires endpoint region to be same as the bucket region. + "Retrieve the region name defined as a logical resource in SDK configuration. + CONSTANTS cv_lbucket TYPE string VALUE 'ZEX_TEX_BUCKET_REGION'. + DATA lv_bucket_region TYPE /aws1/rt_region_id. + lv_bucket_region = lo_session->resolve_lresource( cv_lbucket ). + DATA(lo_tex) = /aws1/cl_tex_factory=>create( + io_session = lo_session + iv_region = lv_bucket_region ). + + "snippet-start:[tex.abapv1.start_document_analysis] + + "Starts the asynchronous analysis of an input document for relationships" + "between detected items such as key-value pairs, tables, and selection elements." + + "Create ABAP objects for feature type." + "Add TABLES to return information about the tables." + "Add FORMS to return detected form data." + "To perform both types of analysis, add TABLES and FORMS to FeatureTypes." + + DATA(lt_featuretypes) = VALUE /aws1/cl_texfeaturetypes_w=>tt_featuretypes( + ( NEW /aws1/cl_texfeaturetypes_w( iv_value = 'FORMS' ) ) + ( NEW /aws1/cl_texfeaturetypes_w( iv_value = 'TABLES' ) ) ). + "Create an ABAP object for the Amazon S3 object." + DATA(lo_s3object) = NEW /aws1/cl_texs3object( iv_bucket = iv_s3bucket + iv_name = iv_s3object ). + "Create an ABAP object for the document." + DATA(lo_documentlocation) = NEW /aws1/cl_texdocumentlocation( io_s3object = lo_s3object ). + + "Start async document analysis." + TRY. + oo_result = lo_tex->startdocumentanalysis( "oo_result is returned for testing purposes." + io_documentlocation = lo_documentlocation + it_featuretypes = lt_featuretypes ). + DATA(lv_jobid) = oo_result->get_jobid( ). + + MESSAGE 'Document analysis started.' TYPE 'I'. + CATCH /aws1/cx_texaccessdeniedex. + MESSAGE 'You do not have permission to perform this action.' TYPE 'E'. + CATCH /aws1/cx_texbaddocumentex. + MESSAGE 'Amazon Textract is not able to read the document.' TYPE 'E'. + CATCH /aws1/cx_texdocumenttoolargeex. + MESSAGE 'The document is too large.' TYPE 'E'. + CATCH /aws1/cx_texidempotentprmmis00. + MESSAGE 'Idempotent parameter mismatch exception.' TYPE 'E'. + CATCH /aws1/cx_texinternalservererr. + MESSAGE 'Internal server error.' TYPE 'E'. + CATCH /aws1/cx_texinvalidkmskeyex. + MESSAGE 'AWS KMS key is not valid.' TYPE 'E'. + CATCH /aws1/cx_texinvalidparameterex. + MESSAGE 'Request has non-valid parameters.' TYPE 'E'. + CATCH /aws1/cx_texinvalids3objectex. + MESSAGE 'Amazon S3 object is not valid.' TYPE 'E'. + CATCH /aws1/cx_texlimitexceededex. + MESSAGE 'An Amazon Textract service limit was exceeded.' TYPE 'E'. + CATCH /aws1/cx_texprovthruputexcdex. + MESSAGE 'Provisioned throughput exceeded limit.' TYPE 'E'. + CATCH /aws1/cx_texthrottlingex. + MESSAGE 'The request processing exceeded the limit.' TYPE 'E'. + CATCH /aws1/cx_texunsupporteddocex. + MESSAGE 'The document is not supported.' TYPE 'E'. + ENDTRY. + "snippet-end:[tex.abapv1.start_document_analysis] + ENDMETHOD. + + + METHOD start_document_text_detection. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + + "Textract requires endpoint region to be same as the bucket region. + "Retrieve the region name defined as a logical resource in SDK configuration. + CONSTANTS cv_lbucket TYPE string VALUE 'ZEX_TEX_BUCKET_REGION'. + DATA lv_bucket_region TYPE /aws1/rt_region_id. + lv_bucket_region = lo_session->resolve_lresource( cv_lbucket ). + DATA(lo_tex) = /aws1/cl_tex_factory=>create( + io_session = lo_session + iv_region = lv_bucket_region ). + + "snippet-start:[tex.abapv1.start_document_text_detection] + + "Starts the asynchronous detection of text in a document." + "Amazon Textract can detect lines of text and the words that make up a line of text." + + "Create an ABAP object for the Amazon S3 object." + DATA(lo_s3object) = NEW /aws1/cl_texs3object( iv_bucket = iv_s3bucket + iv_name = iv_s3object ). + "Create an ABAP object for the document." + DATA(lo_documentlocation) = NEW /aws1/cl_texdocumentlocation( io_s3object = lo_s3object ). + "Start document analysis." + TRY. + oo_result = lo_tex->startdocumenttextdetection( io_documentlocation = lo_documentlocation ). + DATA(lv_jobid) = oo_result->get_jobid( ). "oo_result is returned for testing purposes." + MESSAGE 'Document analysis started.' TYPE 'I'. + CATCH /aws1/cx_texaccessdeniedex. + MESSAGE 'You do not have permission to perform this action.' TYPE 'E'. + CATCH /aws1/cx_texbaddocumentex. + MESSAGE 'Amazon Textract is not able to read the document.' TYPE 'E'. + CATCH /aws1/cx_texdocumenttoolargeex. + MESSAGE 'The document is too large.' TYPE 'E'. + CATCH /aws1/cx_texidempotentprmmis00. + MESSAGE 'Idempotent parameter mismatch exception.' TYPE 'E'. + CATCH /aws1/cx_texinternalservererr. + MESSAGE 'Internal server error.' TYPE 'E'. + CATCH /aws1/cx_texinvalidkmskeyex. + MESSAGE 'AWS KMS key is not valid.' TYPE 'E'. + CATCH /aws1/cx_texinvalidparameterex. + MESSAGE 'Request has non-valid parameters.' TYPE 'E'. + CATCH /aws1/cx_texinvalids3objectex. + MESSAGE 'Amazon S3 object is not valid.' TYPE 'E'. + CATCH /aws1/cx_texlimitexceededex. + MESSAGE 'An Amazon Textract service limit was exceeded.' TYPE 'E'. + CATCH /aws1/cx_texprovthruputexcdex. + MESSAGE 'Provisioned throughput exceeded limit.' TYPE 'E'. + CATCH /aws1/cx_texthrottlingex. + MESSAGE 'The request processing exceeded the limit.' TYPE 'E'. + CATCH /aws1/cx_texunsupporteddocex. + MESSAGE 'The document is not supported.' TYPE 'E'. + ENDTRY. + "snippet-end:[tex.abapv1.start_document_text_detection] + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/tex/#awsex#cl_tex_actions.clas.testclasses.abap b/sap-abap/services/tex/#awsex#cl_tex_actions.clas.testclasses.abap new file mode 100644 index 00000000000..5e8cf9aa59d --- /dev/null +++ b/sap-abap/services/tex/#awsex#cl_tex_actions.clas.testclasses.abap @@ -0,0 +1,218 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 + +CLASS ltc_awsex_cl_tex_actions DEFINITION FOR TESTING DURATION LONG RISK LEVEL DANGEROUS. + + PRIVATE SECTION. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA ao_tex TYPE REF TO /aws1/if_tex. + DATA ao_s3 TYPE REF TO /aws1/if_s3. + DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. + DATA ao_tex_actions TYPE REF TO /awsex/cl_tex_actions. + + METHODS setup RAISING /aws1/cx_rt_generic /awsex/cx_generic. + METHODS analyze_document FOR TESTING RAISING /aws1/cx_rt_generic. + METHODS detect_document_text FOR TESTING RAISING /aws1/cx_rt_generic. + METHODS start_document_analysis FOR TESTING RAISING /aws1/cx_rt_generic. + METHODS start_document_text_detection FOR TESTING RAISING /aws1/cx_rt_generic. + METHODS get_document_analysis FOR TESTING RAISING /aws1/cx_rt_generic. + +ENDCLASS. "ltc_awsex_cl_tex_actions + + +CLASS ltc_awsex_cl_tex_actions IMPLEMENTATION. + + METHOD setup. + ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). + + ao_tex = /aws1/cl_tex_factory=>create( + io_session = ao_session + iv_region = 'us-east-1' ). + ao_s3 = /aws1/cl_s3_factory=>create( ao_session ). + ao_tex_actions = NEW /awsex/cl_tex_actions( ). + ENDMETHOD. + + METHOD analyze_document. + + "Using an image from the Public Amazon Berkeley Objects Dataset. + CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'amazon-berkeley-objects'. + CONSTANTS cv_key_name TYPE /aws1/s3_bucketname VALUE 'images/small/e0/e0feb1eb.jpg'. + + "Analyze document. + DATA(lo_output) = ao_tex_actions->analyze_document( + iv_s3object = cv_key_name + iv_s3bucket = cv_bucket_name ). + + "Validation check. + DATA(lv_found) = abap_false. + DATA(lt_blocks) = lo_output->get_blocks( ). + + LOOP AT lt_blocks INTO DATA(lo_block). + IF lo_block->get_text( ) = 'INGREDIENTS: POWDERED SUGAR* (CANE SUGAR,'. + lv_found = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Analyze document failed| ). + + ENDMETHOD. + + + METHOD detect_document_text. + + "Using an image from the Public Amazon Berkeley Objects Dataset. + CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'amazon-berkeley-objects'. + CONSTANTS cv_key_name TYPE /aws1/s3_bucketname VALUE 'images/small/e0/e0feb1eb.jpg'. + + "Testing. + DATA(lo_output) = ao_tex_actions->detect_document_text( + iv_s3object = cv_key_name + iv_s3bucket = cv_bucket_name ). + + "Validation check. + DATA(lv_found) = abap_false. + DATA(lt_blocks) = lo_output->get_blocks( ). + + LOOP AT lt_blocks INTO DATA(lo_block). + IF lo_block->get_text( ) = 'INGREDIENTS: POWDERED SUGAR* (CANE SUGAR,'. + lv_found = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Analyze document failed| ). + + ENDMETHOD. + + METHOD start_document_analysis. + + "Using an image from the Public Amazon Berkeley Objects Dataset. + CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'amazon-berkeley-objects'. + CONSTANTS cv_key_name TYPE /aws1/s3_bucketname VALUE 'images/small/e0/e0feb1eb.jpg'. + + "Testing. + DATA(lo_output) = ao_tex_actions->start_document_analysis( + iv_s3object = cv_key_name + iv_s3bucket = cv_bucket_name ). + + "Wait for job to complete. + DATA(lv_jobid) = lo_output->get_jobid( ). + + DATA(lo_document_analysis_output) = ao_tex->getdocumentanalysis( iv_jobid = lv_jobid ). + WHILE lo_document_analysis_output->get_jobstatus( ) <> 'SUCCEEDED'. + IF sy-index = 10. + EXIT. "Maximum 300 seconds. + ENDIF. + WAIT UP TO 30 SECONDS. + lo_document_analysis_output = ao_tex->getdocumentanalysis( iv_jobid = lv_jobid ). + ENDWHILE. + + "Validation check. + DATA(lv_found) = abap_false. + DATA(lt_blocks) = lo_document_analysis_output->get_blocks( ). + LOOP AT lt_blocks INTO DATA(lo_block). + IF lo_block->get_text( ) = 'INGREDIENTS: POWDERED SUGAR* (CANE SUGAR,'. + lv_found = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Analyze document failed| ). + + ENDMETHOD. + + METHOD start_document_text_detection. + + "Using an image from the Public Amazon Berkeley Objects Dataset. + CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'amazon-berkeley-objects'. + CONSTANTS cv_key_name TYPE /aws1/s3_bucketname VALUE 'images/small/e0/e0feb1eb.jpg'. + + "Testing. + DATA(lo_output) = ao_tex_actions->start_document_text_detection( + iv_s3object = cv_key_name + iv_s3bucket = cv_bucket_name ). + + DATA(lv_jobid) = lo_output->get_jobid( ). + + "Wait for job to complete. + DATA(lo_text_detection_output) = ao_tex->getdocumenttextdetection( iv_jobid = lv_jobid ). + WHILE lo_text_detection_output->get_jobstatus( ) <> 'SUCCEEDED'. + IF sy-index = 10. + EXIT. "Maximum 300 seconds. + ENDIF. + WAIT UP TO 30 SECONDS. + lo_text_detection_output = ao_tex->getdocumenttextdetection( iv_jobid = lv_jobid ). + ENDWHILE. + + "Validation check. + DATA(lv_found) = abap_false. + DATA(lt_blocks) = lo_text_detection_output->get_blocks( ). + LOOP AT lt_blocks INTO DATA(lo_block). + IF lo_block->get_text( ) = 'INGREDIENTS: POWDERED SUGAR* (CANE SUGAR,'. + lv_found = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Analyze document failed| ). + + ENDMETHOD. + + METHOD get_document_analysis. + + "Using an image from the Public Amazon Berkeley Objects Dataset. + CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'amazon-berkeley-objects'. + CONSTANTS cv_key_name TYPE /aws1/s3_bucketname VALUE 'images/small/e0/e0feb1eb.jpg'. + + DATA(lt_featuretypes) = VALUE /aws1/cl_texfeaturetypes_w=>tt_featuretypes( + ( NEW /aws1/cl_texfeaturetypes_w( iv_value = 'FORMS' ) ) + ( NEW /aws1/cl_texfeaturetypes_w( iv_value = 'TABLES' ) ) ). + + "Create a ABAP object for the Amazon Simple Storage Service (Amazon S3) object. + DATA(lo_s3object) = NEW /aws1/cl_texs3object( iv_bucket = cv_bucket_name + iv_name = cv_key_name ). + + "Create a ABAP object for the document. + DATA(lo_documentlocation) = NEW /aws1/cl_texdocumentlocation( io_s3object = lo_s3object ). + + "Start document analysis. + DATA(lo_output) = ao_tex->startdocumentanalysis( + io_documentlocation = lo_documentlocation + it_featuretypes = lt_featuretypes ). + + "Get job ID. + DATA(lv_jobid) = lo_output->get_jobid( ). + + "Testing. + DATA(lo_document_analysis_output) = ao_tex_actions->get_document_analysis( lv_jobid ). + WHILE lo_document_analysis_output->get_jobstatus( ) <> 'SUCCEEDED'. + IF sy-index = 10. + EXIT. "Maximum 300 seconds. + ENDIF. + WAIT UP TO 30 SECONDS. + lo_document_analysis_output = ao_tex_actions->get_document_analysis( lv_jobid ). + ENDWHILE. + + "Validation check. + DATA(lv_found) = abap_false. + DATA(lt_blocks) = lo_document_analysis_output->get_blocks( ). + LOOP AT lt_blocks INTO DATA(lo_block). + IF lo_block->get_text( ) = 'INGREDIENTS: POWDERED SUGAR* (CANE SUGAR,'. + lv_found = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Analyze document failed| ). + + ENDMETHOD. + +ENDCLASS. diff --git a/sap-abap/services/tex/#awsex#cl_tex_actions.clas.xml b/sap-abap/services/tex/#awsex#cl_tex_actions.clas.xml new file mode 100644 index 00000000000..820563ede7c --- /dev/null +++ b/sap-abap/services/tex/#awsex#cl_tex_actions.clas.xml @@ -0,0 +1,17 @@ + + + + + + /AWSEX/CL_TEX_ACTIONS + E + Amazon Textract Code Example Actions + 1 + X + X + X + X + + + + diff --git a/sap-abap/services/tex/#awsex#cl_tex_scenarios.clas.abap b/sap-abap/services/tex/#awsex#cl_tex_scenarios.clas.abap new file mode 100644 index 00000000000..215ebf7b6c9 --- /dev/null +++ b/sap-abap/services/tex/#awsex#cl_tex_scenarios.clas.abap @@ -0,0 +1,112 @@ +CLASS /awsex/cl_tex_scenarios DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + METHODS getting_started_with_tex + IMPORTING + !iv_s3object TYPE /aws1/texs3objectname + !iv_s3bucket TYPE /aws1/texs3bucket + RETURNING + VALUE(oo_result) TYPE REF TO /aws1/cl_texgetdocalyresponse + RAISING /aws1/cx_rt_generic. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS /AWSEX/CL_TEX_SCENARIOS IMPLEMENTATION. + + + METHOD getting_started_with_tex. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + + "Textract requires endpoint region to be same as the bucket region. + "Retrieve the region name defined as a logical resource in SDK configuration. + CONSTANTS cv_lbucket TYPE string VALUE 'ZEX_TEX_BUCKET_REGION'. + DATA lv_bucket_region TYPE /aws1/rt_region_id. + lv_bucket_region = lo_session->resolve_lresource( cv_lbucket ). + DATA(lo_tex) = /aws1/cl_tex_factory=>create( + io_session = lo_session + iv_region = lv_bucket_region ). + " 1. Starts the asynchronous analysis. " + " 2. Wait for the analysis to complete. " + + "snippet-start:[tex.abapv1.getting_started_with_tex] + + "Create ABAP objects for feature type." + "Add TABLES to return information about the tables." + "Add FORMS to return detected form data." + "To perform both types of analysis, add TABLES and FORMS to FeatureTypes." + + DATA(lt_featuretypes) = VALUE /aws1/cl_texfeaturetypes_w=>tt_featuretypes( + ( NEW /aws1/cl_texfeaturetypes_w( iv_value = 'FORMS' ) ) + ( NEW /aws1/cl_texfeaturetypes_w( iv_value = 'TABLES' ) ) ). + + "Create an ABAP object for the Amazon Simple Storage Service (Amazon S3) object." + DATA(lo_s3object) = NEW /aws1/cl_texs3object( iv_bucket = iv_s3bucket + iv_name = iv_s3object ). + + "Create an ABAP object for the document." + DATA(lo_documentlocation) = NEW /aws1/cl_texdocumentlocation( io_s3object = lo_s3object ). + + "Start document analysis." + TRY. + DATA(lo_start_result) = lo_tex->startdocumentanalysis( + io_documentlocation = lo_documentlocation + it_featuretypes = lt_featuretypes ). + MESSAGE 'Document analysis started.' TYPE 'I'. + CATCH /aws1/cx_texaccessdeniedex. + MESSAGE 'You do not have permission to perform this action.' TYPE 'E'. + CATCH /aws1/cx_texbaddocumentex. + MESSAGE 'Amazon Textract is not able to read the document.' TYPE 'E'. + CATCH /aws1/cx_texdocumenttoolargeex. + MESSAGE 'The document is too large.' TYPE 'E'. + CATCH /aws1/cx_texidempotentprmmis00. + MESSAGE 'Idempotent parameter mismatch exception.' TYPE 'E'. + CATCH /aws1/cx_texinternalservererr. + MESSAGE 'Internal server error.' TYPE 'E'. + CATCH /aws1/cx_texinvalidkmskeyex. + MESSAGE 'AWS KMS key is not valid.' TYPE 'E'. + CATCH /aws1/cx_texinvalidparameterex. + MESSAGE 'Request has non-valid parameters.' TYPE 'E'. + CATCH /aws1/cx_texinvalids3objectex. + MESSAGE 'Amazon S3 object is not valid.' TYPE 'E'. + CATCH /aws1/cx_texlimitexceededex. + MESSAGE 'An Amazon Textract service limit was exceeded.' TYPE 'E'. + CATCH /aws1/cx_texprovthruputexcdex. + MESSAGE 'Provisioned throughput exceeded limit.' TYPE 'E'. + CATCH /aws1/cx_texthrottlingex. + MESSAGE 'The request processing exceeded the limit.' TYPE 'E'. + CATCH /aws1/cx_texunsupporteddocex. + MESSAGE 'The document is not supported.' TYPE 'E'. + ENDTRY. + + "Get job ID from the output." + DATA(lv_jobid) = lo_start_result->get_jobid( ). + + "Wait for job to complete." + oo_result = lo_tex->getdocumentanalysis( iv_jobid = lv_jobid ). " oo_result is returned for testing purposes. " + WHILE oo_result->get_jobstatus( ) <> 'SUCCEEDED'. + IF sy-index = 10. + EXIT. "Maximum 300 seconds." + ENDIF. + WAIT UP TO 30 SECONDS. + oo_result = lo_tex->getdocumentanalysis( iv_jobid = lv_jobid ). + ENDWHILE. + + DATA(lt_blocks) = oo_result->get_blocks( ). + LOOP AT lt_blocks INTO DATA(lo_block). + IF lo_block->get_text( ) = 'INGREDIENTS: POWDERED SUGAR* (CANE SUGAR,'. + MESSAGE 'Found text in the doc: ' && lo_block->get_text( ) TYPE 'I'. + ENDIF. + ENDLOOP. + "snippet-end:[tex.abapv1.getting_started_with_tex] + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/tex/#awsex#cl_tex_scenarios.clas.testclasses.abap b/sap-abap/services/tex/#awsex#cl_tex_scenarios.clas.testclasses.abap new file mode 100644 index 00000000000..b9114d5817c --- /dev/null +++ b/sap-abap/services/tex/#awsex#cl_tex_scenarios.clas.testclasses.abap @@ -0,0 +1,54 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 + +CLASS ltc_awsex_cl_tex_scenario DEFINITION FOR TESTING DURATION SHORT RISK LEVEL DANGEROUS. + + PRIVATE SECTION. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA ao_tex TYPE REF TO /aws1/if_tex. + DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. + DATA ao_tex_scenario TYPE REF TO /awsex/cl_tex_scenarios. + DATA lv_found TYPE abap_bool VALUE abap_false. + + METHODS setup RAISING /aws1/cx_rt_generic /awsex/cx_generic. + METHODS getting_started_with_tex FOR TESTING RAISING /aws1/cx_rt_generic. + +ENDCLASS. "ltc_awsex_cl_tex_scenario + +CLASS ltc_awsex_cl_tex_scenario IMPLEMENTATION. + + METHOD setup. + ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). + ao_tex = /aws1/cl_tex_factory=>create( ao_session ). + ao_tex_scenario = NEW /awsex/cl_tex_scenarios( ). + ENDMETHOD. + + + METHOD getting_started_with_tex. + + "Using an image from the Public Amazon Berkeley Objects Dataset. + CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'amazon-berkeley-objects'. + CONSTANTS cv_key_name TYPE /aws1/s3_bucketname VALUE 'images/small/e0/e0feb1eb.jpg'. + + "Analyze document. + DATA(lo_output) = ao_tex_scenario->getting_started_with_tex( + iv_s3object = cv_key_name + iv_s3bucket = cv_bucket_name ). + + "Validation check. + DATA(lv_found) = abap_false. + DATA(lt_blocks) = lo_output->get_blocks( ). + LOOP AT lt_blocks INTO DATA(lo_block). + IF lo_block->get_text( ) = 'INGREDIENTS: POWDERED SUGAR* (CANE SUGAR,'. + lv_found = abap_true. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Analyze document failed| ). + + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/tex/#awsex#cl_tex_scenarios.clas.xml b/sap-abap/services/tex/#awsex#cl_tex_scenarios.clas.xml new file mode 100644 index 00000000000..f4c963a94f7 --- /dev/null +++ b/sap-abap/services/tex/#awsex#cl_tex_scenarios.clas.xml @@ -0,0 +1,17 @@ + + + + + + /AWSEX/CL_TEX_SCENARIOS + E + Amazon Textract Code Example Scenarios + 1 + X + X + X + X + + + + diff --git a/sap-abap/services/tex/package.devc.xml b/sap-abap/services/tex/package.devc.xml new file mode 100644 index 00000000000..886a6163a3f --- /dev/null +++ b/sap-abap/services/tex/package.devc.xml @@ -0,0 +1,10 @@ + + + + + + Package for Amazon Textract + + + + diff --git a/sap-abap/services/xl8/#awsex#cl_xl8_actions.clas.abap b/sap-abap/services/xl8/#awsex#cl_xl8_actions.clas.abap new file mode 100644 index 00000000000..c65e7921273 --- /dev/null +++ b/sap-abap/services/xl8/#awsex#cl_xl8_actions.clas.abap @@ -0,0 +1,221 @@ +CLASS /awsex/cl_xl8_actions DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + METHODS describe_text_translation_job + IMPORTING + !iv_jobid TYPE /aws1/xl8jobid + EXPORTING + !oo_result TYPE REF TO /aws1/cl_xl8dsctextxlatjobrsp + RAISING /aws1/cx_rt_generic. + METHODS list_text_translation_jobs + IMPORTING + !iv_jobname TYPE /aws1/xl8jobname + EXPORTING + !oo_result TYPE REF TO /aws1/cl_xl8lsttextxlatjobsrsp + RAISING /aws1/cx_rt_generic. + METHODS start_text_translation_job + IMPORTING + !iv_sourcelanguagecode TYPE /aws1/xl8languagecodestring OPTIONAL + !iv_targetlanguagecode TYPE /aws1/xl8languagecodestring OPTIONAL + !iv_jobname TYPE /aws1/xl8jobname + !iv_input_data_s3uri TYPE /aws1/xl8s3uri + !iv_input_data_contenttype TYPE /aws1/xl8contenttype + !iv_output_data_s3uri TYPE /aws1/xl8s3uri + !iv_dataaccessrolearn TYPE /aws1/xl8iamrolearn + EXPORTING + !oo_result TYPE REF TO /aws1/cl_xl8strttextxlatjobrsp + RAISING /aws1/cx_rt_generic. + METHODS stop_text_translation_job + IMPORTING + !iv_jobid TYPE /aws1/xl8jobid + EXPORTING + !oo_result TYPE REF TO /aws1/cl_xl8stoptextxlatjobrsp + RAISING /aws1/cx_rt_generic. + METHODS translate_text + IMPORTING + !iv_sourcelanguagecode TYPE /aws1/xl8languagecodestring OPTIONAL + !iv_targetlanguagecode TYPE /aws1/xl8languagecodestring OPTIONAL + !iv_text TYPE /aws1/xl8boundedlengthstring + EXPORTING + !oo_result TYPE REF TO /aws1/cl_xl8translatetextrsp + RAISING /aws1/cx_rt_generic. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS /AWSEX/CL_XL8_ACTIONS IMPLEMENTATION. + + + METHOD describe_text_translation_job. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_xl8) = /aws1/cl_xl8_factory=>create( lo_session ). + + "snippet-start:[xl8.abapv1.describe_text_translation_job] + + "Gets the properties associated with an asynchronous batch translation job." + "Includes properties such as name, ID, status, source and target languages, and input/output Amazon Simple Storage Service (Amazon S3) buckets." + TRY. + oo_result = lo_xl8->describetexttranslationjob( "oo_result is returned for testing purposes." + iv_jobid = iv_jobid ). + MESSAGE 'Job description retrieved.' TYPE 'I'. + CATCH /aws1/cx_xl8internalserverex. + MESSAGE 'An internal server error occurred. Retry your request.' TYPE 'E'. + CATCH /aws1/cx_xl8resourcenotfoundex. + MESSAGE 'The resource you are looking for has not been found.' TYPE 'E'. + CATCH /aws1/cx_xl8toomanyrequestsex. + MESSAGE 'You have made too many requests within a short period of time.' TYPE 'E'. + ENDTRY. + "snippet-end:[xl8.abapv1.describe_text_translation_job] + ENDMETHOD. + + + METHOD list_text_translation_jobs. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_xl8) = /aws1/cl_xl8_factory=>create( lo_session ). + + "snippet-start:[xl8.abapv1.list_text_translation_jobs] + "Gets a list of the batch translation jobs that you have submitted." + + DATA lo_filter TYPE REF TO /aws1/cl_xl8textxlationjobfilt. + + "Create an ABAP object for filtering using jobname." + lo_filter = NEW #( iv_jobname = iv_jobname ). + + TRY. + oo_result = lo_xl8->listtexttranslationjobs( "oo_result is returned for testing purposes." + io_filter = lo_filter ). + MESSAGE 'Jobs retrieved.' TYPE 'I'. + CATCH /aws1/cx_xl8internalserverex. + MESSAGE 'An internal server error occurred. Retry your request.' TYPE 'E'. + CATCH /aws1/cx_xl8invalidfilterex. + MESSAGE 'The filter specified for the operation is not valid. Specify a different filter.' TYPE 'E'. + CATCH /aws1/cx_xl8invalidrequestex. + MESSAGE 'The request that you made is not valid.' TYPE 'E'. + CATCH /aws1/cx_xl8toomanyrequestsex. + MESSAGE 'You have made too many requests within a short period of time.' TYPE 'E'. + ENDTRY. + "snippet-end:[xl8.abapv1.list_text_translation_jobs] + ENDMETHOD. + + + METHOD start_text_translation_job. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_xl8) = /aws1/cl_xl8_factory=>create( lo_session ). + + "snippet-start:[xl8.abapv1.start_text_translation_job] + "Starts an asynchronous batch translation job." + "Use batch translation jobs to translate large volumes of text across multiple documents at once." + + DATA lo_inputdataconfig TYPE REF TO /aws1/cl_xl8inputdataconfig. + DATA lo_outputdataconfig TYPE REF TO /aws1/cl_xl8outputdataconfig. + DATA lt_targetlanguagecodes TYPE /aws1/cl_xl8tgtlanguagecodes00=>tt_targetlanguagecodestrlist. + DATA lo_targetlanguagecodes TYPE REF TO /aws1/cl_xl8tgtlanguagecodes00. + + "Create an ABAP object for the input data config." + lo_inputdataconfig = NEW #( iv_s3uri = iv_input_data_s3uri + iv_contenttype = iv_input_data_contenttype ). + + "Create an ABAP object for the output data config." + lo_outputdataconfig = NEW #( iv_s3uri = iv_output_data_s3uri ). + + "Create an internal table for target languages." + lo_targetlanguagecodes = NEW #( iv_value = iv_targetlanguagecode ). + INSERT lo_targetlanguagecodes INTO TABLE lt_targetlanguagecodes. + + TRY. + oo_result = lo_xl8->starttexttranslationjob( "oo_result is returned for testing purposes." + io_inputdataconfig = lo_inputdataconfig + io_outputdataconfig = lo_outputdataconfig + it_targetlanguagecodes = lt_targetlanguagecodes + iv_dataaccessrolearn = iv_dataaccessrolearn + iv_jobname = iv_jobname + iv_sourcelanguagecode = iv_sourcelanguagecode ). + MESSAGE 'Translation job started.' TYPE 'I'. + CATCH /aws1/cx_xl8internalserverex. + MESSAGE 'An internal server error occurred. Retry your request.' TYPE 'E'. + CATCH /aws1/cx_xl8invparamvalueex. + MESSAGE 'The value of the parameter is not valid.' TYPE 'E'. + CATCH /aws1/cx_xl8invalidrequestex. + MESSAGE 'The request that you made is not valid.' TYPE 'E'. + CATCH /aws1/cx_xl8resourcenotfoundex. + MESSAGE 'The resource you are looking for has not been found.' TYPE 'E'. + CATCH /aws1/cx_xl8toomanyrequestsex. + MESSAGE 'You have made too many requests within a short period of time.' TYPE 'E'. + CATCH /aws1/cx_xl8unsuppedlanguage00. + MESSAGE 'Amazon Translate does not support translation from the language of the source text into the requested target language.' TYPE 'E'. + ENDTRY. + "snippet-end:[xl8.abapv1.start_text_translation_job] + ENDMETHOD. + + + METHOD stop_text_translation_job. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_xl8) = /aws1/cl_xl8_factory=>create( lo_session ). + + "snippet-start:[xl8.abapv1.stop_text_translation_job] + "Stops an asynchronous batch translation job that is in progress." + + TRY. + oo_result = lo_xl8->stoptexttranslationjob( "oo_result is returned for testing purposes." + iv_jobid = iv_jobid ). + MESSAGE 'Translation job stopped.' TYPE 'I'. + CATCH /aws1/cx_xl8internalserverex. + MESSAGE 'An internal server error occurred.' TYPE 'E'. + CATCH /aws1/cx_xl8resourcenotfoundex. + MESSAGE 'The resource you are looking for has not been found.' TYPE 'E'. + CATCH /aws1/cx_xl8toomanyrequestsex. + MESSAGE 'You have made too many requests within a short period of time.' TYPE 'E'. + ENDTRY. + "snippet-end:[xl8.abapv1.stop_text_translation_job] + ENDMETHOD. + + + METHOD translate_text. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_xl8) = /aws1/cl_xl8_factory=>create( lo_session ). + + "snippet-start:[xl8.abapv1.translate_text] + "Translates input text from the source language to the target language." + TRY. + oo_result = lo_xl8->translatetext( "oo_result is returned for testing purposes." + iv_text = iv_text + iv_sourcelanguagecode = iv_sourcelanguagecode + iv_targetlanguagecode = iv_targetlanguagecode ). + MESSAGE 'Translation completed.' TYPE 'I'. + CATCH /aws1/cx_xl8detectedlanguage00. + MESSAGE 'The confidence that Amazon Comprehend accurately detected the source language is low.' TYPE 'E'. + CATCH /aws1/cx_xl8internalserverex. + MESSAGE 'An internal server error occurred.' TYPE 'E'. + CATCH /aws1/cx_xl8invalidrequestex. + MESSAGE 'The request that you made is not valid.' TYPE 'E'. + CATCH /aws1/cx_xl8resourcenotfoundex. + MESSAGE 'The resource you are looking for has not been found.' TYPE 'E'. + CATCH /aws1/cx_xl8serviceunavailex. + MESSAGE 'The Amazon Translate service is temporarily unavailable.' TYPE 'E'. + CATCH /aws1/cx_xl8textsizelmtexcdex. + MESSAGE 'The size of the text you submitted exceeds the size limit. ' TYPE 'E'. + CATCH /aws1/cx_xl8toomanyrequestsex. + MESSAGE 'You have made too many requests within a short period of time.' TYPE 'E'. + CATCH /aws1/cx_xl8unsuppedlanguage00. + MESSAGE 'Amazon Translate does not support translation from the language of the source text into the requested target language. ' TYPE 'E'. + ENDTRY. + "snippet-end:[xl8.abapv1.translate_text] + + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/xl8/#awsex#cl_xl8_actions.clas.testclasses.abap b/sap-abap/services/xl8/#awsex#cl_xl8_actions.clas.testclasses.abap new file mode 100644 index 00000000000..94310af646a --- /dev/null +++ b/sap-abap/services/xl8/#awsex#cl_xl8_actions.clas.testclasses.abap @@ -0,0 +1,455 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 + +CLASS ltc_awsex_cl_xl8_actions DEFINITION FOR TESTING DURATION LONG RISK LEVEL DANGEROUS. + + PRIVATE SECTION. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-xl8-'. + CONSTANTS cv_input_key TYPE /aws1/s3_objectkey VALUE 'translate/input/input.txt'. + CONSTANTS cv_output_folder TYPE /aws1/s3_objectkey VALUE 'translate/output/'. + CONSTANTS cv_input_folder TYPE /aws1/s3_objectkey VALUE 'translate/input/'. + CONSTANTS cv_input_data_contenttype TYPE /aws1/xl8contenttype VALUE 'text/plain'. + " CONSTANTS cv_output_data_contenttype TYPE /aws1/xl8contenttype VALUE 'text/plain'. + CONSTANTS cv_sourcelanguagecode TYPE /aws1/xl8languagecodestring VALUE 'fr'. + CONSTANTS cv_targetlanguagecode TYPE /aws1/xl8languagecodestring VALUE 'en'. + + DATA ao_xl8 TYPE REF TO /aws1/if_xl8. + DATA ao_s3 TYPE REF TO /aws1/if_s3. + DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. + DATA ao_xl8_actions TYPE REF TO /awsex/cl_xl8_actions. + DATA av_file_content TYPE /aws1/s3_streamingblob. + DATA av_lrole TYPE /aws1/xl8iamrolearn. + + METHODS setup RAISING /aws1/cx_rt_generic. + METHODS translate_text FOR TESTING RAISING /aws1/cx_rt_generic. + METHODS start_text_translation_job FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS stop_text_translation_job FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS describe_text_translation_job FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS list_text_translation_job FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS cleanup_s3 + IMPORTING + iv_bucket_name TYPE /aws1/s3_bucketname + RAISING /aws1/cx_rt_generic. + METHODS job_waiter + IMPORTING iv_jobid TYPE /aws1/xl8jobid + iv_jobstatus TYPE /aws1/xl8jobstatus + RAISING /aws1/cx_rt_generic. + + +ENDCLASS. "ltc_awsex_cl_xl8_actions + +CLASS ltc_awsex_cl_xl8_actions IMPLEMENTATION. + + METHOD setup. + ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). + ao_xl8 = /aws1/cl_xl8_factory=>create( ao_session ). + ao_s3 = /aws1/cl_s3_factory=>create( ao_session ). + ao_xl8_actions = NEW /awsex/cl_xl8_actions( ). + + "Translate data. + av_file_content = /aws1/cl_rt_util=>string_to_xstring( + |Que vous cherchiez à replateformer pour réduire les coûts,| && + |à migrer vers SAP S/4HANA ou à adopter l’offre RISE avec SAP, | && + |AWS propose des approches éprouvées, | && + |soutenues par une expérience inégalée dans la prise en charge des clients SAP dans le cloud. | && + |Obtenez plus de flexibilité et de valeur à partir de vos investissements SAP grâce à l'infrastructure cloud la plus sécurisée, | && + |fiable et évolutive au monde, aux plus de 200 services AWS qui vous permettent d'innover, | && + |et aux outils d'automatisation de SAP spécialement conçus, | && + |afin de réduire les risques et de simplifier les opérations. | ). + + "Define role Amazon Resource Name (ARN). + DATA(lt_roles) = ao_session->get_configuration( )->get_logical_iam_roles( ). + READ TABLE lt_roles INDEX 1 INTO DATA(lo_role). " take first role from the logical role mapping + av_lrole = lo_role-iam_role_arn. + + ENDMETHOD. + + METHOD cleanup_s3. + + DATA(lo_list) = ao_s3->listobjectsv2( iv_bucket = iv_bucket_name ). + LOOP AT lo_list->get_contents( ) INTO DATA(lo_object). + ao_s3->deleteobject( + iv_bucket = iv_bucket_name + iv_key = lo_object->get_key( ) ). + ENDLOOP. + + ao_s3->deletebucket( iv_bucket = iv_bucket_name ). + + ENDMETHOD. + + METHOD job_waiter. + + DATA lo_des_translation_result TYPE REF TO /aws1/cl_xl8dsctextxlatjobrsp. + + lo_des_translation_result = ao_xl8->describetexttranslationjob( iv_jobid = iv_jobid ). + WHILE lo_des_translation_result->get_textxlationjobproperties( )->get_jobstatus( ) <> iv_jobstatus. + IF sy-index = 15. + EXIT. "Maximum 50 minutes + ENDIF. + WAIT UP TO 60 SECONDS. + lo_des_translation_result = ao_xl8->describetexttranslationjob( iv_jobid = iv_jobid ). + ENDWHILE. + ENDMETHOD. + + METHOD translate_text. + + DATA lo_output TYPE REF TO /aws1/cl_xl8translatetextrsp. + DATA lv_translatedtext TYPE /aws1/xl8string. + + + CONSTANTS cv_text TYPE /aws1/xl8boundedlengthstring VALUE 'AWS accélère la croissance de la France'. + + "Translate text. + ao_xl8_actions->translate_text( + EXPORTING + iv_text = cv_text + iv_sourcelanguagecode = cv_sourcelanguagecode + iv_targetlanguagecode = cv_targetlanguagecode + IMPORTING + oo_result = lo_output ). + + "Validation check. + DATA(lv_found) = abap_false. + IF lo_output->get_translatedtext( ) = 'AWS accelerates growth in France'. + lv_found = abap_true. + ENDIF. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Translation failed| ). + + "Nothing to clean up. + + ENDMETHOD. + + METHOD start_text_translation_job. + + DATA lv_uuid_16 TYPE sysuuid_x16. + DATA lv_bucket_name TYPE /aws1/s3_bucketname. + DATA lv_translate_job_name TYPE /aws1/xl8jobname. + DATA lv_input_data_s3uri TYPE /aws1/xl8s3uri. + DATA lv_output_data_s3uri TYPE /aws1/xl8s3uri. + DATA lv_output_folder TYPE /aws1/xl8s3uri. + DATA lo_result TYPE REF TO /aws1/cl_xl8strttextxlatjobrsp. + + DATA lv_jobid TYPE /aws1/xl8jobid. + DATA lo_des_translation_result TYPE REF TO /aws1/cl_xl8dsctextxlatjobrsp. + + "Define job name. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_translate_job_name = 'code-example-xl8-job-' && lv_uuid_16. + TRANSLATE lv_translate_job_name TO LOWER CASE. + + "Create training data in Amazon Simple Storage Service (Amazon S3). + lv_bucket_name = cv_bucket_name && lv_uuid_16. + TRANSLATE lv_bucket_name TO LOWER CASE. + /awsex/cl_utils=>create_bucket( iv_bucket = lv_bucket_name + io_s3 = ao_s3 + io_session = ao_session ). + + lv_input_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_input_folder. + lv_output_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_output_folder. + + ao_s3->putobject( + iv_bucket = lv_bucket_name + iv_key = cv_input_key + iv_body = av_file_content ). + + "Testing. + ao_xl8_actions->start_text_translation_job( + EXPORTING + iv_jobname = lv_translate_job_name + iv_dataaccessrolearn = av_lrole + iv_input_data_s3uri = lv_input_data_s3uri + iv_input_data_contenttype = cv_input_data_contenttype + iv_output_data_s3uri = lv_output_data_s3uri + iv_sourcelanguagecode = cv_sourcelanguagecode + iv_targetlanguagecode = cv_targetlanguagecode + IMPORTING + oo_result = lo_result ). + + "Validation. + DATA(lv_found) = abap_false. + IF lo_result->has_jobstatus( ) = 'X'. + lv_found = abap_true. + ENDIF. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Translation job cannot be found| ). + + "Get the job ID. + lv_jobid = lo_result->get_jobid( ). + + "Wait for translate job to complete + job_waiter( iv_jobid = lv_jobid + iv_jobstatus = 'COMPLETED' ). + + "Clean up. + cleanup_s3( lv_bucket_name ). + + ENDMETHOD. + + METHOD stop_text_translation_job. + + DATA lv_uuid_16 TYPE sysuuid_x16. + DATA lv_bucket_name TYPE /aws1/s3_bucketname. + DATA lv_translate_job_name TYPE /aws1/xl8jobname. + DATA lv_input_data_s3uri TYPE /aws1/xl8s3uri. + DATA lv_output_data_s3uri TYPE /aws1/xl8s3uri. + DATA lv_output_folder TYPE /aws1/xl8s3uri. + DATA lo_result TYPE REF TO /aws1/cl_xl8strttextxlatjobrsp. + + DATA lv_jobid TYPE /aws1/xl8jobid. + DATA lo_list_translation_result TYPE REF TO /aws1/cl_xl8lsttextxlatjobsrsp. + DATA lo_inputdataconfig TYPE REF TO /aws1/cl_xl8inputdataconfig. + DATA lo_outputdataconfig TYPE REF TO /aws1/cl_xl8outputdataconfig. + DATA lt_targetlanguagecodes TYPE /aws1/cl_xl8tgtlanguagecodes00=>tt_targetlanguagecodestrlist. + DATA lo_targetlanguagecodes TYPE REF TO /aws1/cl_xl8tgtlanguagecodes00. + DATA lo_des_translation_result TYPE REF TO /aws1/cl_xl8dsctextxlatjobrsp. + + "Define job name. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_translate_job_name = 'code-example-xl8-job-' && lv_uuid_16. + TRANSLATE lv_translate_job_name TO LOWER CASE. + + "Create training data in Amazon S3. + lv_bucket_name = cv_bucket_name && lv_uuid_16. + TRANSLATE lv_bucket_name TO LOWER CASE. + /awsex/cl_utils=>create_bucket( iv_bucket = lv_bucket_name + io_s3 = ao_s3 + io_session = ao_session ). + + + lv_input_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_input_folder. + lv_output_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_output_folder. + + ao_s3->putobject( + iv_bucket = lv_bucket_name + iv_key = cv_input_key + iv_body = av_file_content ). + + "Create an ABAP object for the input data config. + lo_inputdataconfig = NEW #( iv_s3uri = lv_input_data_s3uri + iv_contenttype = cv_input_data_contenttype ). + + "Create an ABAP object for the output data config. + lo_outputdataconfig = NEW #( iv_s3uri = lv_output_data_s3uri ). + + "Create an internal table for target languages. + lo_targetlanguagecodes = NEW #( iv_value = cv_targetlanguagecode ). + INSERT lo_targetlanguagecodes INTO TABLE lt_targetlanguagecodes. + + "Create a translate job. + lo_result = ao_xl8->starttexttranslationjob( + io_inputdataconfig = lo_inputdataconfig + io_outputdataconfig = lo_outputdataconfig + it_targetlanguagecodes = lt_targetlanguagecodes + iv_dataaccessrolearn = av_lrole + iv_jobname = lv_translate_job_name + iv_sourcelanguagecode = cv_sourcelanguagecode ). + + "Get the job ID. + lv_jobid = lo_result->get_jobid( ). + + WAIT UP TO 20 SECONDS. + + "Testing list_text_translation_job. + ao_xl8_actions->stop_text_translation_job( + lv_jobid ). + + "Wait for translate job to stop. + job_waiter( iv_jobid = lv_jobid + iv_jobstatus = 'STOPPED' ). + + "Validation. + DATA(lv_found) = abap_false. + lo_des_translation_result = ao_xl8->describetexttranslationjob( iv_jobid = lv_jobid ). + IF lo_des_translation_result->get_textxlationjobproperties( )->get_jobstatus( ) = 'STOPPED'. + lv_found = abap_true. + ENDIF. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Stop text translation job failed| ). + + "Clean up. + cleanup_s3( lv_bucket_name ). + + ENDMETHOD. + + METHOD describe_text_translation_job. + + DATA lv_uuid_16 TYPE sysuuid_x16. + DATA lv_bucket_name TYPE /aws1/s3_bucketname. + DATA lv_translate_job_name TYPE /aws1/xl8jobname. + DATA lv_input_data_s3uri TYPE /aws1/xl8s3uri. + DATA lv_output_data_s3uri TYPE /aws1/xl8s3uri. + DATA lv_output_folder TYPE /aws1/xl8s3uri. + DATA lo_result TYPE REF TO /aws1/cl_xl8strttextxlatjobrsp. + + DATA lv_jobid TYPE /aws1/xl8jobid. + DATA lo_des_translation_result TYPE REF TO /aws1/cl_xl8dsctextxlatjobrsp. + DATA lo_inputdataconfig TYPE REF TO /aws1/cl_xl8inputdataconfig. + DATA lo_outputdataconfig TYPE REF TO /aws1/cl_xl8outputdataconfig. + DATA lt_targetlanguagecodes TYPE /aws1/cl_xl8tgtlanguagecodes00=>tt_targetlanguagecodestrlist. + DATA lo_targetlanguagecodes TYPE REF TO /aws1/cl_xl8tgtlanguagecodes00. + + "Define job name. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_translate_job_name = 'code-example-xl8-job-' && lv_uuid_16. + TRANSLATE lv_translate_job_name TO LOWER CASE. + + "Create training data in Amazon S3. + lv_bucket_name = cv_bucket_name && lv_uuid_16. + TRANSLATE lv_bucket_name TO LOWER CASE. + /awsex/cl_utils=>create_bucket( iv_bucket = lv_bucket_name + io_s3 = ao_s3 + io_session = ao_session ). + + + lv_input_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_input_folder. + lv_output_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_output_folder. + + ao_s3->putobject( + iv_bucket = lv_bucket_name + iv_key = cv_input_key + iv_body = av_file_content ). + + "Create an ABAP object for the input data config. + lo_inputdataconfig = NEW #( iv_s3uri = lv_input_data_s3uri + iv_contenttype = cv_input_data_contenttype ). + + "Create an ABAP object for the output data config. + lo_outputdataconfig = NEW #( iv_s3uri = lv_output_data_s3uri ). + + "Create an internal table for target languages. + lo_targetlanguagecodes = NEW #( iv_value = cv_targetlanguagecode ). + INSERT lo_targetlanguagecodes INTO TABLE lt_targetlanguagecodes. + + "Create a translate job. + lo_result = ao_xl8->starttexttranslationjob( + io_inputdataconfig = lo_inputdataconfig + io_outputdataconfig = lo_outputdataconfig + it_targetlanguagecodes = lt_targetlanguagecodes + iv_dataaccessrolearn = av_lrole + iv_jobname = lv_translate_job_name + iv_sourcelanguagecode = cv_sourcelanguagecode ). + + "Get the job ID. + lv_jobid = lo_result->get_jobid( ). + + "Testing. + ao_xl8_actions->describe_text_translation_job( EXPORTING iv_jobid = lv_jobid IMPORTING oo_result = lo_des_translation_result ). + WHILE lo_des_translation_result->get_textxlationjobproperties( )->get_jobstatus( ) <> 'COMPLETED'. + IF sy-index = 30. + EXIT. "maximum 30 minutes + ENDIF. + WAIT UP TO 60 SECONDS. + ao_xl8_actions->describe_text_translation_job( EXPORTING iv_jobid = lv_jobid IMPORTING oo_result = lo_des_translation_result ). + ENDWHILE. + + "Validation. + DATA(lv_found) = abap_false. + IF lo_des_translation_result->get_textxlationjobproperties( )->get_jobstatus( ) = 'COMPLETED'. + lv_found = abap_true. + ENDIF. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Describe job failed| ). + + "Clean up. + cleanup_s3( lv_bucket_name ). + + ENDMETHOD. + + METHOD list_text_translation_job. + + DATA lv_uuid_16 TYPE sysuuid_x16. + DATA lv_bucket_name TYPE /aws1/s3_bucketname. + DATA lv_translate_job_name TYPE /aws1/xl8jobname. + DATA lv_input_data_s3uri TYPE /aws1/xl8s3uri. + DATA lv_output_data_s3uri TYPE /aws1/xl8s3uri. + DATA lv_output_folder TYPE /aws1/xl8s3uri. + DATA lo_result TYPE REF TO /aws1/cl_xl8strttextxlatjobrsp. + + DATA lv_jobid TYPE /aws1/xl8jobid. + DATA lo_list_translation_result TYPE REF TO /aws1/cl_xl8lsttextxlatjobsrsp. + DATA lo_inputdataconfig TYPE REF TO /aws1/cl_xl8inputdataconfig. + DATA lo_outputdataconfig TYPE REF TO /aws1/cl_xl8outputdataconfig. + DATA lt_targetlanguagecodes TYPE /aws1/cl_xl8tgtlanguagecodes00=>tt_targetlanguagecodestrlist. + DATA lo_targetlanguagecodes TYPE REF TO /aws1/cl_xl8tgtlanguagecodes00. + DATA lo_des_translation_result TYPE REF TO /aws1/cl_xl8dsctextxlatjobrsp. + + "Define job name. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_translate_job_name = 'code-example-xl8-job-' && lv_uuid_16. + TRANSLATE lv_translate_job_name TO LOWER CASE. + + "Create training data in Amazon S3. + lv_bucket_name = cv_bucket_name && lv_uuid_16. + TRANSLATE lv_bucket_name TO LOWER CASE. + /awsex/cl_utils=>create_bucket( iv_bucket = lv_bucket_name + io_s3 = ao_s3 + io_session = ao_session ). + + + lv_input_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_input_folder. + lv_output_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_output_folder. + + ao_s3->putobject( + iv_bucket = lv_bucket_name + iv_key = cv_input_key + iv_body = av_file_content ). + + "Create an ABAP object for the input data config. + lo_inputdataconfig = NEW #( iv_s3uri = lv_input_data_s3uri + iv_contenttype = cv_input_data_contenttype ). + + "Create an ABAP object for the output data config. + lo_outputdataconfig = NEW #( iv_s3uri = lv_output_data_s3uri ). + + "Create an internal table for target languages. + lo_targetlanguagecodes = NEW #( iv_value = cv_targetlanguagecode ). + INSERT lo_targetlanguagecodes INTO TABLE lt_targetlanguagecodes. + + "Create a translate job. + lo_result = ao_xl8->starttexttranslationjob( + io_inputdataconfig = lo_inputdataconfig + io_outputdataconfig = lo_outputdataconfig + it_targetlanguagecodes = lt_targetlanguagecodes + iv_dataaccessrolearn = av_lrole + iv_jobname = lv_translate_job_name + iv_sourcelanguagecode = cv_sourcelanguagecode ). + + "Get the job ID. + lv_jobid = lo_result->get_jobid( ). + + "Testing list_text_translation_job. + ao_xl8_actions->list_text_translation_jobs( + EXPORTING iv_jobname = lv_translate_job_name + IMPORTING oo_result = lo_list_translation_result ). + + "Validation. + DATA(lv_found) = abap_false. + IF lo_list_translation_result->has_textxlationjobprpslist( ) = 'X'. + lv_found = abap_true. + ENDIF. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |List job failed| ). + + "Wait for translate job to complete. + job_waiter( iv_jobid = lv_jobid + iv_jobstatus = 'COMPLETED' ). + + "Clean up. + cleanup_s3( lv_bucket_name ). + + ENDMETHOD. + +ENDCLASS. diff --git a/sap-abap/services/xl8/#awsex#cl_xl8_actions.clas.xml b/sap-abap/services/xl8/#awsex#cl_xl8_actions.clas.xml new file mode 100644 index 00000000000..1f819f95ba5 --- /dev/null +++ b/sap-abap/services/xl8/#awsex#cl_xl8_actions.clas.xml @@ -0,0 +1,17 @@ + + + + + + /AWSEX/CL_XL8_ACTIONS + E + Amazon Translate Code Example Actions + 1 + X + X + X + X + + + + diff --git a/sap-abap/services/xl8/#awsex#cl_xl8_scenarios.clas.abap b/sap-abap/services/xl8/#awsex#cl_xl8_scenarios.clas.abap new file mode 100644 index 00000000000..09fe723d372 --- /dev/null +++ b/sap-abap/services/xl8/#awsex#cl_xl8_scenarios.clas.abap @@ -0,0 +1,107 @@ +CLASS /awsex/cl_xl8_scenarios DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + METHODS getting_started_with_xl8 + IMPORTING + !iv_sourcelanguagecode TYPE /aws1/xl8languagecodestring OPTIONAL + !iv_targetlanguagecode TYPE /aws1/xl8languagecodestring OPTIONAL + !iv_jobname TYPE /aws1/xl8jobname + !iv_input_data_s3uri TYPE /aws1/xl8s3uri + !iv_input_data_contenttype TYPE /aws1/xl8contenttype + !iv_output_data_s3uri TYPE /aws1/xl8s3uri + !iv_dataaccessrolearn TYPE /aws1/xl8iamrolearn + EXPORTING + !oo_result TYPE REF TO /aws1/cl_xl8dsctextxlatjobrsp + RAISING /aws1/cx_rt_generic. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS /AWSEX/CL_XL8_SCENARIOS IMPLEMENTATION. + + + METHOD getting_started_with_xl8. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_xl8) = /aws1/cl_xl8_factory=>create( lo_session ). + + "1. Start an asynchronous batch translation job." + "2. Wait for the asynchronous job to complete." + "3. Describe the asynchronous job." + + "snippet-start:[xl8.abapv1.getting_started_with_xl8] + + DATA lo_inputdataconfig TYPE REF TO /aws1/cl_xl8inputdataconfig. + DATA lo_outputdataconfig TYPE REF TO /aws1/cl_xl8outputdataconfig. + DATA lt_targetlanguagecodes TYPE /aws1/cl_xl8tgtlanguagecodes00=>tt_targetlanguagecodestrlist. + DATA lo_targetlanguagecodes TYPE REF TO /aws1/cl_xl8tgtlanguagecodes00. + + "Create an ABAP object for the input data config." + lo_inputdataconfig = NEW #( iv_s3uri = iv_input_data_s3uri + iv_contenttype = iv_input_data_contenttype ). + + "Create an ABAP object for the output data config." + lo_outputdataconfig = NEW #( iv_s3uri = iv_output_data_s3uri ). + + "Create an internal table for target languages." + lo_targetlanguagecodes = NEW #( iv_value = iv_targetlanguagecode ). + INSERT lo_targetlanguagecodes INTO TABLE lt_targetlanguagecodes. + + TRY. + DATA(lo_translationjob_result) = lo_xl8->starttexttranslationjob( + io_inputdataconfig = lo_inputdataconfig + io_outputdataconfig = lo_outputdataconfig + it_targetlanguagecodes = lt_targetlanguagecodes + iv_dataaccessrolearn = iv_dataaccessrolearn + iv_jobname = iv_jobname + iv_sourcelanguagecode = iv_sourcelanguagecode ). + MESSAGE 'Translation job started.' TYPE 'I'. + CATCH /aws1/cx_xl8internalserverex. + MESSAGE 'An internal server error occurred. Retry your request.' TYPE 'E'. + CATCH /aws1/cx_xl8invparamvalueex. + MESSAGE 'The value of the parameter is not valid.' TYPE 'E'. + CATCH /aws1/cx_xl8invalidrequestex. + MESSAGE 'The request that you made is not valid.' TYPE 'E'. + CATCH /aws1/cx_xl8resourcenotfoundex. + MESSAGE 'The resource you are looking for has not been found.' TYPE 'E'. + CATCH /aws1/cx_xl8toomanyrequestsex. + MESSAGE 'You have made too many requests within a short period of time. ' TYPE 'E'. + CATCH /aws1/cx_xl8unsuppedlanguage00. + MESSAGE 'Amazon Translate does not support translation from the language of the source text into the requested target language.' TYPE 'E'. + ENDTRY. + + "Get the job ID." + DATA(lv_jobid) = lo_translationjob_result->get_jobid( ). + + "Wait for translate job to complete." + DATA(lo_des_translation_result) = lo_xl8->describetexttranslationjob( iv_jobid = lv_jobid ). + WHILE lo_des_translation_result->get_textxlationjobproperties( )->get_jobstatus( ) <> 'COMPLETED'. + IF sy-index = 30. + EXIT. "Maximum 900 seconds." + ENDIF. + WAIT UP TO 30 SECONDS. + lo_des_translation_result = lo_xl8->describetexttranslationjob( iv_jobid = lv_jobid ). + ENDWHILE. + + TRY. + oo_result = lo_xl8->describetexttranslationjob( "oo_result is returned for testing purposes." + iv_jobid = lv_jobid ). + MESSAGE 'Job description retrieved.' TYPE 'I'. + CATCH /aws1/cx_xl8internalserverex. + MESSAGE 'An internal server error occurred. Retry your request.' TYPE 'E'. + CATCH /aws1/cx_xl8resourcenotfoundex. + MESSAGE 'The resource you are looking for has not been found.' TYPE 'E'. + CATCH /aws1/cx_xl8toomanyrequestsex. + MESSAGE 'You have made too many requests within a short period of time.' TYPE 'E'. + ENDTRY. + + "snippet-end:[xl8.abapv1.getting_started_with_xl8] + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/xl8/#awsex#cl_xl8_scenarios.clas.testclasses.abap b/sap-abap/services/xl8/#awsex#cl_xl8_scenarios.clas.testclasses.abap new file mode 100644 index 00000000000..3dacde613f3 --- /dev/null +++ b/sap-abap/services/xl8/#awsex#cl_xl8_scenarios.clas.testclasses.abap @@ -0,0 +1,131 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 + +CLASS ltc_awsex_cl_xl8_scenario DEFINITION FOR TESTING DURATION LONG RISK LEVEL DANGEROUS. + + PRIVATE SECTION. + + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA ao_xl8 TYPE REF TO /aws1/if_xl8. + DATA ao_s3 TYPE REF TO /aws1/if_s3. + DATA ao_session TYPE REF TO /aws1/cl_rt_session_base. + DATA ao_xl8_scenario TYPE REF TO /awsex/cl_xl8_scenarios. + DATA av_lrole TYPE /aws1/xl8iamrolearn. + DATA av_file_content TYPE /aws1/s3_streamingblob. + + METHODS getting_started_with_xl8 FOR TESTING RAISING /aws1/cx_rt_generic cx_uuid_error. + METHODS setup RAISING /aws1/cx_rt_generic /awsex/cx_generic. + + +ENDCLASS. "ltc_awsex_cl_xl8_scenario + + +CLASS ltc_awsex_cl_xl8_scenario IMPLEMENTATION. + + METHOD setup. + ao_session = /aws1/cl_rt_session_aws=>create( iv_profile_id = cv_pfl ). + ao_xl8 = /aws1/cl_xl8_factory=>create( ao_session ). + ao_xl8_scenario = NEW /awsex/cl_xl8_scenarios( ). + ao_s3 = /aws1/cl_s3_factory=>create( ao_session ). + + "Translate data. + av_file_content = /aws1/cl_rt_util=>string_to_xstring( + |Que vous cherchiez à replateformer pour réduire les coûts,| && + |à migrer vers SAP S/4HANA ou à adopter l’offre RISE avec SAP, | && + |AWS propose des approches éprouvées, | && + |soutenues par une expérience inégalée dans la prise en charge des clients SAP dans le cloud. | && + |Obtenez plus de flexibilité et de valeur à partir de vos investissements SAP grâce à l'infrastructure cloud la plus sécurisée, | && + |fiable et évolutive au monde, aux plus de 200 services AWS qui vous permettent d'innover, | && + |et aux outils d'automatisation de SAP spécialement conçus, | && + |afin de réduire les risques et de simplifier les opérations. | ). + ENDMETHOD. + + METHOD getting_started_with_xl8. + + DATA lv_uuid_16 TYPE sysuuid_x16. + DATA lv_bucket_name TYPE /aws1/s3_bucketname. + DATA lv_translate_job_name TYPE /aws1/xl8jobname. + DATA lv_input_data_s3uri TYPE /aws1/xl8s3uri. + DATA lv_output_data_s3uri TYPE /aws1/xl8s3uri. + DATA lv_output_folder TYPE /aws1/xl8s3uri. + + DATA lv_jobid TYPE /aws1/xl8jobid. + DATA lo_des_translation_result TYPE REF TO /aws1/cl_xl8dsctextxlatjobrsp. + DATA lv_out_key1 TYPE /aws1/s3_objectkey. + DATA lv_out_key2 TYPE /aws1/s3_objectkey. + DATA lv_out_key3 TYPE /aws1/s3_objectkey. + DATA lv_out_key4 TYPE /aws1/s3_objectkey. + DATA lv_out_key5 TYPE /aws1/s3_objectkey. + DATA lv_out_key6 TYPE /aws1/s3_objectkey. + DATA lv_obj1 TYPE /aws1/s3_objectkey. + DATA lv_obj2 TYPE /aws1/s3_objectkey. + DATA lv_obj3 TYPE /aws1/s3_objectkey. + + CONSTANTS cv_bucket_name TYPE /aws1/s3_bucketname VALUE 'code-example-xl8-'. + CONSTANTS cv_input_key TYPE /aws1/s3_objectkey VALUE 'translate/input/input.txt'. + CONSTANTS cv_output_folder TYPE /aws1/s3_objectkey VALUE 'translate/output/'. + CONSTANTS cv_input_folder TYPE /aws1/s3_objectkey VALUE 'translate/input/'. + CONSTANTS cv_input_data_contenttype TYPE /aws1/xl8contenttype VALUE 'text/plain'. + CONSTANTS cv_output_data_contenttype TYPE /aws1/xl8contenttype VALUE 'text/plain'. + CONSTANTS cv_sourcelanguagecode TYPE /aws1/xl8languagecodestring VALUE 'fr'. + CONSTANTS cv_targetlanguagecode TYPE /aws1/xl8languagecodestring VALUE 'en'. + + "Define role Amazon Resource Name (ARN). + DATA(lt_roles) = ao_session->get_configuration( )->get_logical_iam_roles( ). + READ TABLE lt_roles INDEX 1 INTO DATA(lo_role). " take first role from the logical role mapping + av_lrole = lo_role-iam_role_arn. + + "Define job name. + lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ). + lv_translate_job_name = 'code-example-xl8-job-' && lv_uuid_16. + TRANSLATE lv_translate_job_name TO LOWER CASE. + + "Create training data in Amazon Simple Storage Service (Amazon S3). + lv_bucket_name = cv_bucket_name && lv_uuid_16. + TRANSLATE lv_bucket_name TO LOWER CASE. + /awsex/cl_utils=>create_bucket( iv_bucket = lv_bucket_name + io_s3 = ao_s3 + io_session = ao_session ). + lv_input_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_input_folder. + lv_output_data_s3uri = 's3://' && lv_bucket_name && '/' && cv_output_folder. + + ao_s3->putobject( + iv_bucket = lv_bucket_name + iv_key = cv_input_key + iv_body = av_file_content ). + + "Testing. + ao_xl8_scenario->getting_started_with_xl8( + EXPORTING + iv_jobname = lv_translate_job_name + iv_dataaccessrolearn = av_lrole + iv_input_data_s3uri = lv_input_data_s3uri + iv_input_data_contenttype = cv_input_data_contenttype + iv_output_data_s3uri = lv_output_data_s3uri + iv_sourcelanguagecode = cv_sourcelanguagecode + iv_targetlanguagecode = cv_targetlanguagecode + IMPORTING + oo_result = lo_des_translation_result ). + + "Validation. + DATA(lv_found) = abap_false. + IF lo_des_translation_result->get_textxlationjobproperties( )->get_jobstatus( ) = 'COMPLETED'. + lv_found = abap_true. + ENDIF. + + cl_abap_unit_assert=>assert_true( + act = lv_found + msg = |Describe job failed| ). + + "Clean up. + DATA(lo_list) = ao_s3->listobjectsv2( iv_bucket = lv_bucket_name ). + LOOP AT lo_list->get_contents( ) INTO DATA(lo_object). + ao_s3->deleteobject( + iv_bucket = lv_bucket_name + iv_key = lo_object->get_key( ) ). + ENDLOOP. + + ao_s3->deletebucket( iv_bucket = lv_bucket_name ). + ENDMETHOD. +ENDCLASS. diff --git a/sap-abap/services/xl8/#awsex#cl_xl8_scenarios.clas.xml b/sap-abap/services/xl8/#awsex#cl_xl8_scenarios.clas.xml new file mode 100644 index 00000000000..475e3107318 --- /dev/null +++ b/sap-abap/services/xl8/#awsex#cl_xl8_scenarios.clas.xml @@ -0,0 +1,17 @@ + + + + + + /AWSEX/CL_XL8_SCENARIOS + E + Amazon Translate Code Example Scenarios + 1 + X + X + X + X + + + + diff --git a/sap-abap/services/xl8/package.devc.xml b/sap-abap/services/xl8/package.devc.xml new file mode 100644 index 00000000000..d0a74974eba --- /dev/null +++ b/sap-abap/services/xl8/package.devc.xml @@ -0,0 +1,10 @@ + + + + + + Package for Amazon Translate + + + + diff --git a/sap-abap/util/zcl_aws1_ex_utils.clas.abap b/sap-abap/util/#awsex#cl_utils.clas.abap similarity index 84% rename from sap-abap/util/zcl_aws1_ex_utils.clas.abap rename to sap-abap/util/#awsex#cl_utils.clas.abap index 53ff256d81e..4a51ae06829 100644 --- a/sap-abap/util/zcl_aws1_ex_utils.clas.abap +++ b/sap-abap/util/#awsex#cl_utils.clas.abap @@ -1,6 +1,6 @@ " Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. " SPDX-License-Identifier: Apache-2.0 -CLASS zcl_aws1_ex_utils DEFINITION +CLASS /awsex/cl_utils DEFINITION PUBLIC FINAL CREATE PUBLIC . @@ -11,27 +11,27 @@ CLASS zcl_aws1_ex_utils DEFINITION CLASS-METHODS get_random_string RETURNING - VALUE(ov_str) TYPE string . + VALUE(ov_str) TYPE string . CLASS-METHODS cleanup_bucket IMPORTING - !iv_bucket TYPE /aws1/s3_bucketname - !io_s3 TYPE REF TO /aws1/if_s3 + !iv_bucket TYPE /aws1/s3_bucketname + !io_s3 TYPE REF TO /aws1/if_s3 RAISING - /aws1/cx_rt_generic . + /aws1/cx_rt_generic . CLASS-METHODS create_bucket IMPORTING - !iv_bucket TYPE /aws1/s3_bucketname - !io_s3 TYPE REF TO /aws1/if_s3 - !io_session TYPE REF TO /aws1/cl_rt_session_base + !iv_bucket TYPE /aws1/s3_bucketname + !io_s3 TYPE REF TO /aws1/if_s3 + !io_session TYPE REF TO /aws1/cl_rt_session_base RAISING - /aws1/cx_rt_generic . + /aws1/cx_rt_generic . PROTECTED SECTION. PRIVATE SECTION. ENDCLASS. -CLASS ZCL_AWS1_EX_UTILS IMPLEMENTATION. +CLASS /AWSEX/CL_UTILS IMPLEMENTATION. METHOD cleanup_bucket. diff --git a/sap-abap/util/#awsex#cl_utils.clas.xml b/sap-abap/util/#awsex#cl_utils.clas.xml new file mode 100644 index 00000000000..3a8dd7c3f34 --- /dev/null +++ b/sap-abap/util/#awsex#cl_utils.clas.xml @@ -0,0 +1,16 @@ + + + + + + /AWSEX/CL_UTILS + E + Misc Utilities + 1 + X + X + X + + + + diff --git a/sap-abap/util/#awsex#cx_generic.clas.abap b/sap-abap/util/#awsex#cx_generic.clas.abap new file mode 100644 index 00000000000..092a1f5cc5d --- /dev/null +++ b/sap-abap/util/#awsex#cx_generic.clas.abap @@ -0,0 +1,50 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 +CLASS /awsex/cx_generic DEFINITION + PUBLIC + INHERITING FROM cx_static_check + CREATE PUBLIC . + + PUBLIC SECTION. + + INTERFACES if_t100_message . + + CONSTANTS: + BEGIN OF /awsex/cx_generic, + msgid TYPE symsgid VALUE '/AWSEX/LIB_EXC', + msgno TYPE symsgno VALUE '001', + attr1 TYPE scx_attrname VALUE 'AV_MSG', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF /awsex/cx_generic . + DATA av_msg TYPE string . + + METHODS constructor + IMPORTING + !textid LIKE if_t100_message=>t100key OPTIONAL + !previous LIKE previous OPTIONAL + !av_msg TYPE string OPTIONAL . +protected section. +private section. +ENDCLASS. + + + +CLASS /AWSEX/CX_GENERIC IMPLEMENTATION. + + + method CONSTRUCTOR. +CALL METHOD SUPER->CONSTRUCTOR +EXPORTING +PREVIOUS = PREVIOUS +. +me->AV_MSG = AV_MSG . +clear me->textid. +if textid is initial. + IF_T100_MESSAGE~T100KEY = /AWSEX/CX_GENERIC . +else. + IF_T100_MESSAGE~T100KEY = TEXTID. +endif. + endmethod. +ENDCLASS. diff --git a/sap-abap/util/zcx_aws1_ex_generic.clas.xml b/sap-abap/util/#awsex#cx_generic.clas.xml similarity index 93% rename from sap-abap/util/zcx_aws1_ex_generic.clas.xml rename to sap-abap/util/#awsex#cx_generic.clas.xml index ad698969deb..0fb232f9ed9 100644 --- a/sap-abap/util/zcx_aws1_ex_generic.clas.xml +++ b/sap-abap/util/#awsex#cx_generic.clas.xml @@ -3,7 +3,7 @@ - ZCX_AWS1_EX_GENERIC + /AWSEX/CX_GENERIC E Generic example exception 40 diff --git a/sap-abap/util/zaws1_ex_exc.msag.xml b/sap-abap/util/#awsex#lib_exc.msag.xml similarity index 86% rename from sap-abap/util/zaws1_ex_exc.msag.xml rename to sap-abap/util/#awsex#lib_exc.msag.xml index 91df9f7f706..eb91af085a5 100644 --- a/sap-abap/util/zaws1_ex_exc.msag.xml +++ b/sap-abap/util/#awsex#lib_exc.msag.xml @@ -3,14 +3,14 @@ - ZAWS1_EX_EXC + /AWSEX/LIB_EXC E Example Exceptions E - ZAWS1_EX_EXC + /AWSEX/LIB_EXC 001 &1 diff --git a/sap-abap/util/zcx_aws1_ex_generic.clas.abap b/sap-abap/util/zcx_aws1_ex_generic.clas.abap deleted file mode 100644 index 384424c8212..00000000000 --- a/sap-abap/util/zcx_aws1_ex_generic.clas.abap +++ /dev/null @@ -1,50 +0,0 @@ -" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -" SPDX-License-Identifier: Apache-2.0 -class ZCX_AWS1_EX_GENERIC definition - public - inheriting from CX_STATIC_CHECK - create public . - -public section. - - interfaces IF_T100_MESSAGE . - - constants: - begin of ZCX_AWS1_EX_GENERIC, - msgid type symsgid value 'ZAWS1_EX_EXC', - msgno type symsgno value '001', - attr1 type scx_attrname value 'AV_MSG', - attr2 type scx_attrname value '', - attr3 type scx_attrname value '', - attr4 type scx_attrname value '', - end of ZCX_AWS1_EX_GENERIC . - data AV_MSG type STRING . - - methods CONSTRUCTOR - importing - !TEXTID like IF_T100_MESSAGE=>T100KEY optional - !PREVIOUS like PREVIOUS optional - !AV_MSG type STRING optional . -protected section. -private section. -ENDCLASS. - - - -CLASS ZCX_AWS1_EX_GENERIC IMPLEMENTATION. - - - method CONSTRUCTOR. -CALL METHOD SUPER->CONSTRUCTOR -EXPORTING -PREVIOUS = PREVIOUS -. -me->AV_MSG = AV_MSG . -clear me->textid. -if textid is initial. - IF_T100_MESSAGE~T100KEY = ZCX_AWS1_EX_GENERIC . -else. - IF_T100_MESSAGE~T100KEY = TEXTID. -endif. - endmethod. -ENDCLASS. From c12d50525db9cefbe3b98b37dcc1286dcfb7a5bc Mon Sep 17 00:00:00 2001 From: Deepika Raje Date: Mon, 27 Oct 2025 10:25:13 +0000 Subject: [PATCH 03/11] Correct the profile name --- .../services/cwt/#awsex#cl_cwt_scenarios.clas.testclasses.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sap-abap/services/cwt/#awsex#cl_cwt_scenarios.clas.testclasses.abap b/sap-abap/services/cwt/#awsex#cl_cwt_scenarios.clas.testclasses.abap index 75e5725c78c..2fed2b694b4 100644 --- a/sap-abap/services/cwt/#awsex#cl_cwt_scenarios.clas.testclasses.abap +++ b/sap-abap/services/cwt/#awsex#cl_cwt_scenarios.clas.testclasses.abap @@ -4,7 +4,7 @@ CLASS ltc_awsex_cl_cwt_scenario DEFINITION FOR TESTING DURATION LONG RISK LEVEL DANGEROUS. PRIVATE SECTION. - CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE ' ZCODE_DEMO'. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. DATA ao_cwt TYPE REF TO /aws1/if_cwt. DATA ao_s3 TYPE REF TO /aws1/if_s3. From f8fb95807e2cbd1dcb3d30cb6d08824ed283d085 Mon Sep 17 00:00:00 2001 From: Deepika Raje <111320602+dpkaraje@users.noreply.github.com> Date: Mon, 27 Oct 2025 03:56:53 -0700 Subject: [PATCH 04/11] Update cloudwatch_metadata.yaml --- .doc_gen/metadata/cloudwatch_metadata.yaml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.doc_gen/metadata/cloudwatch_metadata.yaml b/.doc_gen/metadata/cloudwatch_metadata.yaml index f819c059657..a6c95baf845 100644 --- a/.doc_gen/metadata/cloudwatch_metadata.yaml +++ b/.doc_gen/metadata/cloudwatch_metadata.yaml @@ -108,7 +108,7 @@ cloudwatch_DeleteAlarms: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/cloudwatch + github: sap-abap/services/cwt excerpts: - description: snippet_tags: @@ -240,7 +240,7 @@ cloudwatch_DescribeAlarms: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/cloudwatch + github: sap-abap/services/cwt excerpts: - description: snippet_tags: @@ -421,7 +421,7 @@ cloudwatch_DisableAlarmActions: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/cloudwatch + github: sap-abap/services/cwt excerpts: - description: snippet_tags: @@ -503,7 +503,7 @@ cloudwatch_EnableAlarmActions: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/cloudwatch + github: sap-abap/services/cwt excerpts: - description: snippet_tags: @@ -742,7 +742,7 @@ cloudwatch_ListMetrics: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/cloudwatch + github: sap-abap/services/cwt excerpts: - description: snippet_tags: @@ -896,7 +896,7 @@ cloudwatch_PutMetricAlarm: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/cloudwatch + github: sap-abap/services/cwt excerpts: - description: snippet_tags: @@ -1120,7 +1120,7 @@ cloudwatch_Scenario_GettingStarted: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/cloudwatch + github: sap-abap/services/cwt excerpts: - description: snippet_tags: From 7a4c86ed319420504d58c0670e48ba35f63670a9 Mon Sep 17 00:00:00 2001 From: Deepika Raje <111320602+dpkaraje@users.noreply.github.com> Date: Mon, 27 Oct 2025 03:58:11 -0700 Subject: [PATCH 05/11] Update kinesis_metadata.yaml --- .doc_gen/metadata/kinesis_metadata.yaml | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/.doc_gen/metadata/kinesis_metadata.yaml b/.doc_gen/metadata/kinesis_metadata.yaml index ce2e79dcfcd..db3d3f53249 100644 --- a/.doc_gen/metadata/kinesis_metadata.yaml +++ b/.doc_gen/metadata/kinesis_metadata.yaml @@ -39,7 +39,7 @@ kinesis_CreateStream: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/kinesis + github: sap-abap/services/kns excerpts: - description: snippet_tags: @@ -82,7 +82,7 @@ kinesis_DescribeStream: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/kinesis + github: sap-abap/services/kns excerpts: - description: snippet_tags: @@ -124,7 +124,7 @@ kinesis_ListStreams: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/kinesis + github: sap-abap/services/kns excerpts: - description: snippet_tags: @@ -185,7 +185,7 @@ kinesis_DeleteStream: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/kinesis + github: sap-abap/services/kns excerpts: - description: snippet_tags: @@ -224,7 +224,7 @@ kinesis_PutRecord: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/kinesis + github: sap-abap/services/kns excerpts: - description: snippet_tags: @@ -269,7 +269,7 @@ kinesis_GetRecords: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/kinesis + github: sap-abap/services/kns excerpts: - description: snippet_tags: @@ -290,7 +290,7 @@ kinesis_RegisterStreamConsumer: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/kinesis + github: sap-abap/services/kns excerpts: - description: snippet_tags: @@ -320,10 +320,11 @@ kinesis_Scenario_GettingStarted: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/kinesis + github: sap-abap/services/kns excerpts: - description: snippet_tags: - kns.abapv1.getting_started_with_kns services: kinesis: {CreateStream, PutRecord, GetShardIterator, GetRecords, DeleteStream} + From 4554a64a8f57e02cc2efbef16945657632a0a11a Mon Sep 17 00:00:00 2001 From: Deepika Raje <111320602+dpkaraje@users.noreply.github.com> Date: Mon, 27 Oct 2025 03:59:26 -0700 Subject: [PATCH 06/11] Update lambda_metadata.yaml --- .doc_gen/metadata/lambda_metadata.yaml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.doc_gen/metadata/lambda_metadata.yaml b/.doc_gen/metadata/lambda_metadata.yaml index 3c97190cf4e..2c8bef1e6f1 100644 --- a/.doc_gen/metadata/lambda_metadata.yaml +++ b/.doc_gen/metadata/lambda_metadata.yaml @@ -147,7 +147,7 @@ lambda_CreateFunction: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/lambda + github: sap-abap/services/lmd excerpts: - description: snippet_tags: @@ -261,7 +261,7 @@ lambda_DeleteFunction: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/lambda + github: sap-abap/services/lmd excerpts: - description: snippet_tags: @@ -373,7 +373,7 @@ lambda_Invoke: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/lambda + github: sap-abap/services/lmd excerpts: - description: snippet_tags: @@ -478,7 +478,7 @@ lambda_GetFunction: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/lambda + github: sap-abap/services/lmd excerpts: - description: snippet_tags: @@ -572,7 +572,7 @@ lambda_UpdateFunctionCode: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/lambda + github: sap-abap/services/lmd excerpts: - description: snippet_tags: @@ -675,7 +675,7 @@ lambda_UpdateFunctionConfiguration: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/lambda + github: sap-abap/services/lmd excerpts: - description: snippet_tags: @@ -770,7 +770,7 @@ lambda_ListFunctions: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/lambda + github: sap-abap/services/lmd excerpts: - description: snippet_tags: @@ -943,7 +943,7 @@ lambda_Scenario_GettingStartedFunctions: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/lambda + github: sap-abap/services/lmd excerpts: - description: snippet_tags: From 5bdf9b2c51395fe075e50ac4abf46e820ad84efa Mon Sep 17 00:00:00 2001 From: Deepika Raje <111320602+dpkaraje@users.noreply.github.com> Date: Mon, 27 Oct 2025 04:00:14 -0700 Subject: [PATCH 07/11] Update sagemaker_metadata.yaml --- .doc_gen/metadata/sagemaker_metadata.yaml | 24 +++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.doc_gen/metadata/sagemaker_metadata.yaml b/.doc_gen/metadata/sagemaker_metadata.yaml index 17051273411..a6b090ae609 100644 --- a/.doc_gen/metadata/sagemaker_metadata.yaml +++ b/.doc_gen/metadata/sagemaker_metadata.yaml @@ -229,7 +229,7 @@ sagemaker_ListNotebookInstances: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/sagemaker + github: sap-abap/services/sgm excerpts: - description: snippet_tags: @@ -249,7 +249,7 @@ sagemaker_ListTrainingJobs: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/sagemaker + github: sap-abap/services/sgm excerpts: - description: snippet_tags: @@ -261,7 +261,7 @@ sagemaker_CreateEndpoint: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/sagemaker + github: sap-abap/services/sgm excerpts: - description: snippet_tags: @@ -273,7 +273,7 @@ sagemaker_CreateModel: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/sagemaker + github: sap-abap/services/sgm excerpts: - description: snippet_tags: @@ -285,7 +285,7 @@ sagemaker_CreateTrainingJob: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/sagemaker + github: sap-abap/services/sgm excerpts: - description: snippet_tags: @@ -297,7 +297,7 @@ sagemaker_CreateTransformJob: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/sagemaker + github: sap-abap/services/sgm excerpts: - description: snippet_tags: @@ -309,7 +309,7 @@ sagemaker_DeleteEndpoint: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/sagemaker + github: sap-abap/services/sgm excerpts: - description: snippet_tags: @@ -321,7 +321,7 @@ sagemaker_DeleteModel: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/sagemaker + github: sap-abap/services/sgm excerpts: - description: snippet_tags: @@ -333,7 +333,7 @@ sagemaker_DescribeTrainingJob: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/sagemaker + github: sap-abap/services/sgm excerpts: - description: snippet_tags: @@ -345,7 +345,7 @@ sagemaker_ListAlgorithms: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/sagemaker + github: sap-abap/services/sgm excerpts: - description: snippet_tags: @@ -357,7 +357,7 @@ sagemaker_ListModels: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/sagemaker + github: sap-abap/services/sgm excerpts: - description: snippet_tags: @@ -376,7 +376,7 @@ sagemaker_Scenario_GettingStarted: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/sagemaker + github: sap-abap/services/sgm excerpts: - description: snippet_tags: From 21668c97e4c0424c52465c0427fd6790822a44e1 Mon Sep 17 00:00:00 2001 From: Deepika Raje <111320602+dpkaraje@users.noreply.github.com> Date: Mon, 27 Oct 2025 04:01:06 -0700 Subject: [PATCH 08/11] Update textract_metadata.yaml --- .doc_gen/metadata/textract_metadata.yaml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.doc_gen/metadata/textract_metadata.yaml b/.doc_gen/metadata/textract_metadata.yaml index be403f92053..3550bca577e 100644 --- a/.doc_gen/metadata/textract_metadata.yaml +++ b/.doc_gen/metadata/textract_metadata.yaml @@ -22,7 +22,7 @@ textract_AnalyzeDocument: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/textract + github: sap-abap/services/tex sdkguide: excerpts: - description: @@ -56,7 +56,7 @@ textract_DetectDocumentText: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/textract + github: sap-abap/services/tex sdkguide: excerpts: - description: @@ -87,7 +87,7 @@ textract_StartDocumentAnalysis: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/textract + github: sap-abap/services/tex sdkguide: excerpts: - description: @@ -110,7 +110,7 @@ textract_StartDocumentTextDetection: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/textract + github: sap-abap/services/tex sdkguide: excerpts: - description: @@ -133,7 +133,7 @@ textract_GetDocumentAnalysis: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/textract + github: sap-abap/services/tex sdkguide: excerpts: - description: @@ -152,10 +152,11 @@ textract_Scenario_GettingStarted: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/textract + github: sap-abap/services/tex excerpts: - description: snippet_tags: - tex.abapv1.getting_started_with_tex services: textract: {StartDocumentAnalysis, GetDocumentAnalysis} + From 8db525fe576acf40c7b4b478e1c07a0099f61ab5 Mon Sep 17 00:00:00 2001 From: Deepika Raje <111320602+dpkaraje@users.noreply.github.com> Date: Mon, 27 Oct 2025 04:01:45 -0700 Subject: [PATCH 09/11] Update translate_metadata.yaml --- .doc_gen/metadata/translate_metadata.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.doc_gen/metadata/translate_metadata.yaml b/.doc_gen/metadata/translate_metadata.yaml index 17c5a6d6aa7..92ab02c1f60 100644 --- a/.doc_gen/metadata/translate_metadata.yaml +++ b/.doc_gen/metadata/translate_metadata.yaml @@ -12,7 +12,7 @@ translate_StartTextTranslationJob: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/translate + github: sap-abap/services/xl8 excerpts: - description: snippet_tags: @@ -33,7 +33,7 @@ translate_DescribeTextTranslationJob: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/translate + github: sap-abap/services/xl8 excerpts: - description: snippet_tags: @@ -54,7 +54,7 @@ translate_ListTextTranslationJobs: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/translate + github: sap-abap/services/xl8 excerpts: - description: snippet_tags: @@ -75,7 +75,7 @@ translate_StopTextTranslationJob: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/translate + github: sap-abap/services/xl8 excerpts: - description: snippet_tags: @@ -96,7 +96,7 @@ translate_TranslateText: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/translate + github: sap-abap/services/xl8 excerpts: - description: snippet_tags: @@ -115,7 +115,7 @@ translate_Scenario_GettingStarted: SAP ABAP: versions: - sdk_version: 1 - github: sap-abap/services/translate + github: sap-abap/services/xl8 excerpts: - description: snippet_tags: From c6a40bc9e315834e830b41e09fb56ba0d64c299a Mon Sep 17 00:00:00 2001 From: Deepika Raje <111320602+dpkaraje@users.noreply.github.com> Date: Mon, 27 Oct 2025 04:10:25 -0700 Subject: [PATCH 10/11] Update config.py --- .tools/readmes/config.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.tools/readmes/config.py b/.tools/readmes/config.py index 35bd076a6ac..8c1e5d652b2 100644 --- a/.tools/readmes/config.py +++ b/.tools/readmes/config.py @@ -198,7 +198,13 @@ "bedrock-runtime": "sap-abap/services/bdr", "bedrock-agent-runtime": "sap-abap/services/bdz", "comprehend": "sap-abap/services/cpd", + "cloudwatch": "sap-abap/services/cwt", "dynamodb": "sap-abap/services/dyn", + "kinesis": "sap-abap/services/kns", + "lambda": "sap-abap/services/lmd", + "sagemaker": "sap-abap/services/sgm", + "textract": "sap-abap/services/tex", + "translate": "sap-abap/services/xl8", }, } }, From 387b538b1f3ab4f24db2ea17782895d650cc476f Mon Sep 17 00:00:00 2001 From: Deepika Raje Date: Mon, 27 Oct 2025 22:16:28 +0000 Subject: [PATCH 11/11] Add copyright information --- .../bdr/#awsex#cl_bdr_actions.clas.abap | 2 ++ ...awsex#cl_bdr_actions.clas.testclasses.abap | 1 - .../bdz/#awsex#cl_bdz_actions.clas.abap | 2 ++ .../cpd/#awsex#cl_cpd_actions.clas.abap | 32 ++++++++++--------- ...awsex#cl_cpd_actions.clas.testclasses.abap | 1 - .../cwt/#awsex#cl_cwt_actions.clas.abap | 2 ++ ...awsex#cl_cwt_actions.clas.testclasses.abap | 1 - .../cwt/#awsex#cl_cwt_scenarios.clas.abap | 2 ++ .../dyn/#awsex#cl_dyn_actions.clas.abap | 2 ++ ...awsex#cl_dyn_actions.clas.testclasses.abap | 1 - .../dyn/#awsex#cl_dyn_scenarios.clas.abap | 2 ++ .../ec2/#awsex#cl_ec2_actions.clas.abap | 2 ++ ...awsex#cl_ec2_actions.clas.testclasses.abap | 1 - .../kns/#awsex#cl_kns_actions.clas.abap | 2 ++ ...awsex#cl_kns_actions.clas.testclasses.abap | 1 - .../kns/#awsex#cl_kns_scenarios.clas.abap | 2 ++ ...sex#cl_kns_scenarios.clas.testclasses.abap | 1 - .../lmd/#awsex#cl_lmd_actions.clas.abap | 2 ++ ...awsex#cl_lmd_actions.clas.testclasses.abap | 1 - .../lmd/#awsex#cl_lmd_scenarios.clas.abap | 2 ++ ...sex#cl_lmd_scenarios.clas.testclasses.abap | 1 - .../s3/#awsex#cl_s3_actions.clas.abap | 2 ++ ...#awsex#cl_s3_actions.clas.testclasses.abap | 1 - .../s3/#awsex#cl_s3_scenarios.clas.abap | 2 ++ ...wsex#cl_s3_scenarios.clas.testclasses.abap | 1 - .../sgm/#awsex#cl_sgm_actions.clas.abap | 2 ++ ...awsex#cl_sgm_actions.clas.testclasses.abap | 1 - .../sgm/#awsex#cl_sgm_scenarios.clas.abap | 2 ++ ...sex#cl_sgm_scenarios.clas.testclasses.abap | 1 - .../sns/#awsex#cl_sns_actions.clas.abap | 2 ++ ...awsex#cl_sns_actions.clas.testclasses.abap | 1 - .../sns/#awsex#cl_sns_scenarios.clas.abap | 2 ++ .../sqs/#awsex#cl_sqs_actions.clas.abap | 2 ++ .../tex/#awsex#cl_tex_actions.clas.abap | 2 ++ .../tex/#awsex#cl_tex_scenarios.clas.abap | 2 ++ .../xl8/#awsex#cl_xl8_actions.clas.abap | 2 ++ ...awsex#cl_xl8_actions.clas.testclasses.abap | 1 - .../xl8/#awsex#cl_xl8_scenarios.clas.abap | 2 ++ ...sex#cl_xl8_scenarios.clas.testclasses.abap | 1 - 39 files changed, 61 insertions(+), 31 deletions(-) diff --git a/sap-abap/services/bdr/#awsex#cl_bdr_actions.clas.abap b/sap-abap/services/bdr/#awsex#cl_bdr_actions.clas.abap index 2f5cf121f4d..da21a621194 100644 --- a/sap-abap/services/bdr/#awsex#cl_bdr_actions.clas.abap +++ b/sap-abap/services/bdr/#awsex#cl_bdr_actions.clas.abap @@ -1,3 +1,5 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 CLASS /awsex/cl_bdr_actions DEFINITION PUBLIC FINAL diff --git a/sap-abap/services/bdr/#awsex#cl_bdr_actions.clas.testclasses.abap b/sap-abap/services/bdr/#awsex#cl_bdr_actions.clas.testclasses.abap index 14e25aa4d60..db876475054 100644 --- a/sap-abap/services/bdr/#awsex#cl_bdr_actions.clas.testclasses.abap +++ b/sap-abap/services/bdr/#awsex#cl_bdr_actions.clas.testclasses.abap @@ -1,6 +1,5 @@ " Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. " SPDX-License-Identifier: Apache-2.0 - CLASS ltc_awsex_cl_bdr_actions DEFINITION DEFERRED. CLASS /awsex/cl_bdr_actions DEFINITION LOCAL FRIENDS ltc_awsex_cl_bdr_actions. diff --git a/sap-abap/services/bdz/#awsex#cl_bdz_actions.clas.abap b/sap-abap/services/bdz/#awsex#cl_bdz_actions.clas.abap index a518c82457b..19b5909b8ce 100644 --- a/sap-abap/services/bdz/#awsex#cl_bdz_actions.clas.abap +++ b/sap-abap/services/bdz/#awsex#cl_bdz_actions.clas.abap @@ -1,3 +1,5 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 CLASS /awsex/cl_bdz_actions DEFINITION PUBLIC FINAL diff --git a/sap-abap/services/cpd/#awsex#cl_cpd_actions.clas.abap b/sap-abap/services/cpd/#awsex#cl_cpd_actions.clas.abap index 1d92278f1f5..ad71881417e 100644 --- a/sap-abap/services/cpd/#awsex#cl_cpd_actions.clas.abap +++ b/sap-abap/services/cpd/#awsex#cl_cpd_actions.clas.abap @@ -1,17 +1,19 @@ -class /AWSEX/CL_CPD_ACTIONS definition - public - final - create public . - -public section. - - methods DETECTSENTIMENT - exporting - value(OO_RESULT) type ref to /AWS1/CL_CPDDETECTSENTIMENTRSP - raising - /AWS1/CX_RT_GENERIC . -protected section. -private section. +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 +CLASS /awsex/cl_cpd_actions DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + METHODS detectsentiment + EXPORTING + VALUE(oo_result) TYPE REF TO /aws1/cl_cpddetectsentimentrsp + RAISING + /aws1/cx_rt_generic . + PROTECTED SECTION. + PRIVATE SECTION. ENDCLASS. @@ -20,7 +22,7 @@ ENDCLASS. CLASS /AWSEX/CL_CPD_ACTIONS IMPLEMENTATION. - METHOD DETECTSENTIMENT. + METHOD detectsentiment. CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). diff --git a/sap-abap/services/cpd/#awsex#cl_cpd_actions.clas.testclasses.abap b/sap-abap/services/cpd/#awsex#cl_cpd_actions.clas.testclasses.abap index 86ee72b05d5..20cd9561531 100644 --- a/sap-abap/services/cpd/#awsex#cl_cpd_actions.clas.testclasses.abap +++ b/sap-abap/services/cpd/#awsex#cl_cpd_actions.clas.testclasses.abap @@ -1,6 +1,5 @@ " Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. " SPDX-License-Identifier: Apache-2.0 - CLASS ltc_awsex_cl_cpd_actions DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. diff --git a/sap-abap/services/cwt/#awsex#cl_cwt_actions.clas.abap b/sap-abap/services/cwt/#awsex#cl_cwt_actions.clas.abap index 986bd09e93f..47bfd8fe9b0 100644 --- a/sap-abap/services/cwt/#awsex#cl_cwt_actions.clas.abap +++ b/sap-abap/services/cwt/#awsex#cl_cwt_actions.clas.abap @@ -1,3 +1,5 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 CLASS /awsex/cl_cwt_actions DEFINITION PUBLIC FINAL diff --git a/sap-abap/services/cwt/#awsex#cl_cwt_actions.clas.testclasses.abap b/sap-abap/services/cwt/#awsex#cl_cwt_actions.clas.testclasses.abap index 42fbac0f113..28cf623a728 100644 --- a/sap-abap/services/cwt/#awsex#cl_cwt_actions.clas.testclasses.abap +++ b/sap-abap/services/cwt/#awsex#cl_cwt_actions.clas.testclasses.abap @@ -1,6 +1,5 @@ " Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. " SPDX-License-Identifier: Apache-2.0 - CLASS ltc_awsex_cl_cwt_actions DEFINITION FOR TESTING DURATION LONG RISK LEVEL DANGEROUS. PRIVATE SECTION. diff --git a/sap-abap/services/cwt/#awsex#cl_cwt_scenarios.clas.abap b/sap-abap/services/cwt/#awsex#cl_cwt_scenarios.clas.abap index 9a7d315d374..55a601e8e3b 100644 --- a/sap-abap/services/cwt/#awsex#cl_cwt_scenarios.clas.abap +++ b/sap-abap/services/cwt/#awsex#cl_cwt_scenarios.clas.abap @@ -1,3 +1,5 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 CLASS /awsex/cl_cwt_scenarios DEFINITION PUBLIC FINAL diff --git a/sap-abap/services/dyn/#awsex#cl_dyn_actions.clas.abap b/sap-abap/services/dyn/#awsex#cl_dyn_actions.clas.abap index 00be4c93d4c..8ff0c6db227 100644 --- a/sap-abap/services/dyn/#awsex#cl_dyn_actions.clas.abap +++ b/sap-abap/services/dyn/#awsex#cl_dyn_actions.clas.abap @@ -1,3 +1,5 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 CLASS /awsex/cl_dyn_actions DEFINITION PUBLIC FINAL diff --git a/sap-abap/services/dyn/#awsex#cl_dyn_actions.clas.testclasses.abap b/sap-abap/services/dyn/#awsex#cl_dyn_actions.clas.testclasses.abap index f9ef1a1e592..652cedc63bf 100644 --- a/sap-abap/services/dyn/#awsex#cl_dyn_actions.clas.testclasses.abap +++ b/sap-abap/services/dyn/#awsex#cl_dyn_actions.clas.testclasses.abap @@ -1,6 +1,5 @@ " Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. " SPDX-License-Identifier: Apache-2.0 - CLASS ltc_awsex_cl_dyn_actions DEFINITION DEFERRED. CLASS /awsex/cl_dyn_actions DEFINITION LOCAL FRIENDS ltc_awsex_cl_dyn_actions. diff --git a/sap-abap/services/dyn/#awsex#cl_dyn_scenarios.clas.abap b/sap-abap/services/dyn/#awsex#cl_dyn_scenarios.clas.abap index 8e2ccb5a57e..e68578d9e64 100644 --- a/sap-abap/services/dyn/#awsex#cl_dyn_scenarios.clas.abap +++ b/sap-abap/services/dyn/#awsex#cl_dyn_scenarios.clas.abap @@ -1,3 +1,5 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 CLASS /awsex/cl_dyn_scenarios DEFINITION PUBLIC FINAL diff --git a/sap-abap/services/ec2/#awsex#cl_ec2_actions.clas.abap b/sap-abap/services/ec2/#awsex#cl_ec2_actions.clas.abap index 326bc6d8d81..c11af6877b3 100644 --- a/sap-abap/services/ec2/#awsex#cl_ec2_actions.clas.abap +++ b/sap-abap/services/ec2/#awsex#cl_ec2_actions.clas.abap @@ -1,3 +1,5 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 CLASS /awsex/cl_ec2_actions DEFINITION PUBLIC FINAL diff --git a/sap-abap/services/ec2/#awsex#cl_ec2_actions.clas.testclasses.abap b/sap-abap/services/ec2/#awsex#cl_ec2_actions.clas.testclasses.abap index c05812d515d..d1c86978e45 100644 --- a/sap-abap/services/ec2/#awsex#cl_ec2_actions.clas.testclasses.abap +++ b/sap-abap/services/ec2/#awsex#cl_ec2_actions.clas.testclasses.abap @@ -1,6 +1,5 @@ " Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. " SPDX-License-Identifier: Apache-2.0 - CLASS ltc_awsex_cl_ec2_actions DEFINITION DEFERRED. CLASS /awsex/cl_ec2_actions DEFINITION LOCAL FRIENDS ltc_awsex_cl_ec2_actions. diff --git a/sap-abap/services/kns/#awsex#cl_kns_actions.clas.abap b/sap-abap/services/kns/#awsex#cl_kns_actions.clas.abap index 10d51232542..a06688438aa 100644 --- a/sap-abap/services/kns/#awsex#cl_kns_actions.clas.abap +++ b/sap-abap/services/kns/#awsex#cl_kns_actions.clas.abap @@ -1,3 +1,5 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 CLASS /awsex/cl_kns_actions DEFINITION PUBLIC FINAL diff --git a/sap-abap/services/kns/#awsex#cl_kns_actions.clas.testclasses.abap b/sap-abap/services/kns/#awsex#cl_kns_actions.clas.testclasses.abap index 5828c2e0316..10e777b58ec 100644 --- a/sap-abap/services/kns/#awsex#cl_kns_actions.clas.testclasses.abap +++ b/sap-abap/services/kns/#awsex#cl_kns_actions.clas.testclasses.abap @@ -1,6 +1,5 @@ " Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. " SPDX-License-Identifier: Apache-2.0 - CLASS ltc_awsex_cl_kns_actions DEFINITION FOR TESTING DURATION LONG RISK LEVEL DANGEROUS. PRIVATE SECTION. diff --git a/sap-abap/services/kns/#awsex#cl_kns_scenarios.clas.abap b/sap-abap/services/kns/#awsex#cl_kns_scenarios.clas.abap index c2ec856ad7b..2efded48d6c 100644 --- a/sap-abap/services/kns/#awsex#cl_kns_scenarios.clas.abap +++ b/sap-abap/services/kns/#awsex#cl_kns_scenarios.clas.abap @@ -1,3 +1,5 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 CLASS /awsex/cl_kns_scenarios DEFINITION PUBLIC FINAL diff --git a/sap-abap/services/kns/#awsex#cl_kns_scenarios.clas.testclasses.abap b/sap-abap/services/kns/#awsex#cl_kns_scenarios.clas.testclasses.abap index 3a2750029cf..de018a40a77 100644 --- a/sap-abap/services/kns/#awsex#cl_kns_scenarios.clas.testclasses.abap +++ b/sap-abap/services/kns/#awsex#cl_kns_scenarios.clas.testclasses.abap @@ -1,6 +1,5 @@ " Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. " SPDX-License-Identifier: Apache-2.0"" - CLASS ltc_awsex_cl_kns_scenario DEFINITION FOR TESTING DURATION SHORT RISK LEVEL DANGEROUS. PRIVATE SECTION. diff --git a/sap-abap/services/lmd/#awsex#cl_lmd_actions.clas.abap b/sap-abap/services/lmd/#awsex#cl_lmd_actions.clas.abap index 7c3c66d309b..fa7db957df8 100644 --- a/sap-abap/services/lmd/#awsex#cl_lmd_actions.clas.abap +++ b/sap-abap/services/lmd/#awsex#cl_lmd_actions.clas.abap @@ -1,3 +1,5 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 CLASS /awsex/cl_lmd_actions DEFINITION PUBLIC FINAL diff --git a/sap-abap/services/lmd/#awsex#cl_lmd_actions.clas.testclasses.abap b/sap-abap/services/lmd/#awsex#cl_lmd_actions.clas.testclasses.abap index 481d22a1113..0bb404eb4a0 100644 --- a/sap-abap/services/lmd/#awsex#cl_lmd_actions.clas.testclasses.abap +++ b/sap-abap/services/lmd/#awsex#cl_lmd_actions.clas.testclasses.abap @@ -1,6 +1,5 @@ " Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. " SPDX-License-Identifier: Apache-2.0 - CLASS ltc_awsex_cl_lmd_actions DEFINITION DEFERRED. CLASS /awsex/cl_lmd_actions DEFINITION LOCAL FRIENDS ltc_awsex_cl_lmd_actions. diff --git a/sap-abap/services/lmd/#awsex#cl_lmd_scenarios.clas.abap b/sap-abap/services/lmd/#awsex#cl_lmd_scenarios.clas.abap index d9870cef977..8b1be20dd15 100644 --- a/sap-abap/services/lmd/#awsex#cl_lmd_scenarios.clas.abap +++ b/sap-abap/services/lmd/#awsex#cl_lmd_scenarios.clas.abap @@ -1,3 +1,5 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 CLASS /awsex/cl_lmd_scenarios DEFINITION PUBLIC FINAL diff --git a/sap-abap/services/lmd/#awsex#cl_lmd_scenarios.clas.testclasses.abap b/sap-abap/services/lmd/#awsex#cl_lmd_scenarios.clas.testclasses.abap index 828ab8aee91..980f93316c0 100644 --- a/sap-abap/services/lmd/#awsex#cl_lmd_scenarios.clas.testclasses.abap +++ b/sap-abap/services/lmd/#awsex#cl_lmd_scenarios.clas.testclasses.abap @@ -1,6 +1,5 @@ " Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. " SPDX-License-Identifier: Apache-2.0 - CLASS ltc_awsex_cl_lmd_scenario DEFINITION DEFERRED. CLASS /awsex/cl_lmd_scenarios DEFINITION LOCAL FRIENDS ltc_awsex_cl_lmd_scenario. diff --git a/sap-abap/services/s3/#awsex#cl_s3_actions.clas.abap b/sap-abap/services/s3/#awsex#cl_s3_actions.clas.abap index 330e4399d39..451c322d992 100644 --- a/sap-abap/services/s3/#awsex#cl_s3_actions.clas.abap +++ b/sap-abap/services/s3/#awsex#cl_s3_actions.clas.abap @@ -1,3 +1,5 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 CLASS /awsex/cl_s3_actions DEFINITION PUBLIC FINAL diff --git a/sap-abap/services/s3/#awsex#cl_s3_actions.clas.testclasses.abap b/sap-abap/services/s3/#awsex#cl_s3_actions.clas.testclasses.abap index 9a05032ac30..b589b5b17e7 100644 --- a/sap-abap/services/s3/#awsex#cl_s3_actions.clas.testclasses.abap +++ b/sap-abap/services/s3/#awsex#cl_s3_actions.clas.testclasses.abap @@ -1,6 +1,5 @@ " Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. " SPDX-License-Identifier: Apache-2.0 - CLASS ltc_awsex_cl_s3_actions DEFINITION DEFERRED. CLASS /awsex/cl_s3_actions DEFINITION LOCAL FRIENDS ltc_awsex_cl_s3_actions. diff --git a/sap-abap/services/s3/#awsex#cl_s3_scenarios.clas.abap b/sap-abap/services/s3/#awsex#cl_s3_scenarios.clas.abap index 2db3288dceb..fa2e50fc53a 100644 --- a/sap-abap/services/s3/#awsex#cl_s3_scenarios.clas.abap +++ b/sap-abap/services/s3/#awsex#cl_s3_scenarios.clas.abap @@ -1,3 +1,5 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 CLASS /awsex/cl_s3_scenarios DEFINITION PUBLIC FINAL diff --git a/sap-abap/services/s3/#awsex#cl_s3_scenarios.clas.testclasses.abap b/sap-abap/services/s3/#awsex#cl_s3_scenarios.clas.testclasses.abap index 06129937dc4..bc64f47f1dd 100644 --- a/sap-abap/services/s3/#awsex#cl_s3_scenarios.clas.testclasses.abap +++ b/sap-abap/services/s3/#awsex#cl_s3_scenarios.clas.testclasses.abap @@ -1,6 +1,5 @@ " Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. " SPDX-License-Identifier: Apache-2.0 - CLASS ltc_awsex_cl_s3_scenario DEFINITION DEFERRED. CLASS /awsex/cl_s3_scenarios DEFINITION LOCAL FRIENDS ltc_awsex_cl_s3_scenario. diff --git a/sap-abap/services/sgm/#awsex#cl_sgm_actions.clas.abap b/sap-abap/services/sgm/#awsex#cl_sgm_actions.clas.abap index 752f282dada..e78d72ddd4b 100644 --- a/sap-abap/services/sgm/#awsex#cl_sgm_actions.clas.abap +++ b/sap-abap/services/sgm/#awsex#cl_sgm_actions.clas.abap @@ -1,3 +1,5 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 CLASS /awsex/cl_sgm_actions DEFINITION PUBLIC FINAL diff --git a/sap-abap/services/sgm/#awsex#cl_sgm_actions.clas.testclasses.abap b/sap-abap/services/sgm/#awsex#cl_sgm_actions.clas.testclasses.abap index 27336f911c5..a227283c008 100644 --- a/sap-abap/services/sgm/#awsex#cl_sgm_actions.clas.testclasses.abap +++ b/sap-abap/services/sgm/#awsex#cl_sgm_actions.clas.testclasses.abap @@ -1,6 +1,5 @@ " Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. " SPDX-License-Identifier: Apache-2.0 - CLASS ltc_awsex_cl_sgm_actions DEFINITION FOR TESTING DURATION LONG RISK LEVEL DANGEROUS. PRIVATE SECTION. diff --git a/sap-abap/services/sgm/#awsex#cl_sgm_scenarios.clas.abap b/sap-abap/services/sgm/#awsex#cl_sgm_scenarios.clas.abap index d8c8ff28407..81bdc78ca15 100644 --- a/sap-abap/services/sgm/#awsex#cl_sgm_scenarios.clas.abap +++ b/sap-abap/services/sgm/#awsex#cl_sgm_scenarios.clas.abap @@ -1,3 +1,5 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 CLASS /awsex/cl_sgm_scenarios DEFINITION PUBLIC FINAL diff --git a/sap-abap/services/sgm/#awsex#cl_sgm_scenarios.clas.testclasses.abap b/sap-abap/services/sgm/#awsex#cl_sgm_scenarios.clas.testclasses.abap index 7d9775959c1..35c0eab4aaf 100644 --- a/sap-abap/services/sgm/#awsex#cl_sgm_scenarios.clas.testclasses.abap +++ b/sap-abap/services/sgm/#awsex#cl_sgm_scenarios.clas.testclasses.abap @@ -1,6 +1,5 @@ " Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. " SPDX-License-Identifier: Apache-2.0 - CLASS ltc_awsex_cl_sgm_scenario DEFINITION DEFERRED. CLASS /awsex/cl_sgm_scenarios DEFINITION LOCAL FRIENDS ltc_awsex_cl_sgm_scenario. diff --git a/sap-abap/services/sns/#awsex#cl_sns_actions.clas.abap b/sap-abap/services/sns/#awsex#cl_sns_actions.clas.abap index 93e12f78bd6..e8b8aaebb51 100644 --- a/sap-abap/services/sns/#awsex#cl_sns_actions.clas.abap +++ b/sap-abap/services/sns/#awsex#cl_sns_actions.clas.abap @@ -1,3 +1,5 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 CLASS /awsex/cl_sns_actions DEFINITION PUBLIC FINAL diff --git a/sap-abap/services/sns/#awsex#cl_sns_actions.clas.testclasses.abap b/sap-abap/services/sns/#awsex#cl_sns_actions.clas.testclasses.abap index 91f934c2159..78c3b8840d9 100644 --- a/sap-abap/services/sns/#awsex#cl_sns_actions.clas.testclasses.abap +++ b/sap-abap/services/sns/#awsex#cl_sns_actions.clas.testclasses.abap @@ -1,6 +1,5 @@ " Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. " SPDX-License-Identifier: Apache-2.0 - CLASS ltc_awsex_cl_sns_actions DEFINITION DEFERRED. CLASS /awsex/cl_sns_actions DEFINITION LOCAL FRIENDS ltc_awsex_cl_sns_actions. diff --git a/sap-abap/services/sns/#awsex#cl_sns_scenarios.clas.abap b/sap-abap/services/sns/#awsex#cl_sns_scenarios.clas.abap index 023ce898fef..d05074d8b90 100644 --- a/sap-abap/services/sns/#awsex#cl_sns_scenarios.clas.abap +++ b/sap-abap/services/sns/#awsex#cl_sns_scenarios.clas.abap @@ -1,3 +1,5 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 CLASS /awsex/cl_sns_scenarios DEFINITION PUBLIC FINAL diff --git a/sap-abap/services/sqs/#awsex#cl_sqs_actions.clas.abap b/sap-abap/services/sqs/#awsex#cl_sqs_actions.clas.abap index 15c9b9f5b39..41ab666f5bc 100644 --- a/sap-abap/services/sqs/#awsex#cl_sqs_actions.clas.abap +++ b/sap-abap/services/sqs/#awsex#cl_sqs_actions.clas.abap @@ -1,3 +1,5 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 CLASS /awsex/cl_sqs_actions DEFINITION PUBLIC FINAL diff --git a/sap-abap/services/tex/#awsex#cl_tex_actions.clas.abap b/sap-abap/services/tex/#awsex#cl_tex_actions.clas.abap index ee4f1b0abba..803ddc68bbc 100644 --- a/sap-abap/services/tex/#awsex#cl_tex_actions.clas.abap +++ b/sap-abap/services/tex/#awsex#cl_tex_actions.clas.abap @@ -1,3 +1,5 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 CLASS /awsex/cl_tex_actions DEFINITION PUBLIC FINAL diff --git a/sap-abap/services/tex/#awsex#cl_tex_scenarios.clas.abap b/sap-abap/services/tex/#awsex#cl_tex_scenarios.clas.abap index 215ebf7b6c9..62d953ac5a9 100644 --- a/sap-abap/services/tex/#awsex#cl_tex_scenarios.clas.abap +++ b/sap-abap/services/tex/#awsex#cl_tex_scenarios.clas.abap @@ -1,3 +1,5 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 CLASS /awsex/cl_tex_scenarios DEFINITION PUBLIC FINAL diff --git a/sap-abap/services/xl8/#awsex#cl_xl8_actions.clas.abap b/sap-abap/services/xl8/#awsex#cl_xl8_actions.clas.abap index c65e7921273..65b18ffd4a2 100644 --- a/sap-abap/services/xl8/#awsex#cl_xl8_actions.clas.abap +++ b/sap-abap/services/xl8/#awsex#cl_xl8_actions.clas.abap @@ -1,3 +1,5 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 CLASS /awsex/cl_xl8_actions DEFINITION PUBLIC FINAL diff --git a/sap-abap/services/xl8/#awsex#cl_xl8_actions.clas.testclasses.abap b/sap-abap/services/xl8/#awsex#cl_xl8_actions.clas.testclasses.abap index 94310af646a..3a39d0e2ae7 100644 --- a/sap-abap/services/xl8/#awsex#cl_xl8_actions.clas.testclasses.abap +++ b/sap-abap/services/xl8/#awsex#cl_xl8_actions.clas.testclasses.abap @@ -1,6 +1,5 @@ " Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. " SPDX-License-Identifier: Apache-2.0 - CLASS ltc_awsex_cl_xl8_actions DEFINITION FOR TESTING DURATION LONG RISK LEVEL DANGEROUS. PRIVATE SECTION. diff --git a/sap-abap/services/xl8/#awsex#cl_xl8_scenarios.clas.abap b/sap-abap/services/xl8/#awsex#cl_xl8_scenarios.clas.abap index 09fe723d372..23720bc2e0a 100644 --- a/sap-abap/services/xl8/#awsex#cl_xl8_scenarios.clas.abap +++ b/sap-abap/services/xl8/#awsex#cl_xl8_scenarios.clas.abap @@ -1,3 +1,5 @@ +" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +" SPDX-License-Identifier: Apache-2.0 CLASS /awsex/cl_xl8_scenarios DEFINITION PUBLIC FINAL diff --git a/sap-abap/services/xl8/#awsex#cl_xl8_scenarios.clas.testclasses.abap b/sap-abap/services/xl8/#awsex#cl_xl8_scenarios.clas.testclasses.abap index 3dacde613f3..107e2bac541 100644 --- a/sap-abap/services/xl8/#awsex#cl_xl8_scenarios.clas.testclasses.abap +++ b/sap-abap/services/xl8/#awsex#cl_xl8_scenarios.clas.testclasses.abap @@ -1,6 +1,5 @@ " Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. " SPDX-License-Identifier: Apache-2.0 - CLASS ltc_awsex_cl_xl8_scenario DEFINITION FOR TESTING DURATION LONG RISK LEVEL DANGEROUS. PRIVATE SECTION.