From ba527160440cdae3c4158ee66fee7a49e479cb9f Mon Sep 17 00:00:00 2001 From: proposalbot Date: Thu, 10 Nov 2022 18:01:30 +0000 Subject: [PATCH] Changes to dis_api-ref from docs/doc-exports#263 (DIS API test1 version Upload Reviewed-by: gtema Co-authored-by: proposalbot Co-committed-by: proposalbot --- .../images/en-us_image_0000001135802808.png | Bin 0 -> 23829 bytes .../images/en-us_image_0000001238312593.jpg | Bin 0 -> 112824 bytes .../_static/images/en-us_image_0170647338.png | Bin 0 -> 42231 bytes .../_static/images/en-us_image_0170787737.gif | Bin 0 -> 29752 bytes .../creating_consumption_apps.rst | 88 ++ .../app_management/deleting_apps.rst | 71 ++ .../api_description/app_management/index.rst | 22 + .../querying_app_consumption_status.rst | 130 +++ .../app_management/querying_app_details.rst | 96 ++ .../app_management/querying_apps.rst | 137 +++ .../deleting_checkpoints.rst | 98 ++ .../checkpoint_management/index.rst | 18 + .../querying_checkpoint_details.rst | 115 +++ .../submitting_checkpoints.rst | 112 +++ .../data_management/downloading_data.rst | 149 +++ .../api_description/data_management/index.rst | 18 + .../obtaining_data_cursors.rst | 146 +++ .../data_management/uploading_data.rst | 147 +++ .../adding_cloudtable_dump_tasks.rst | 447 +++++++++ .../adding_dli_dump_tasks.rst | 163 +++ .../adding_dws_dump_tasks.rst | 282 ++++++ .../adding_mrs_dump_tasks.rst | 197 ++++ .../adding_obs_dump_tasks.rst | 286 ++++++ .../deleting_dump_tasks.rst | 72 ++ .../dump_task_management/index.rst | 32 + .../pausing_dump_tasks_in_batches.rst | 97 ++ .../querying_dump_task_details.rst | 939 ++++++++++++++++++ .../querying_dump_tasks.rst | 168 ++++ .../starting_dump_tasks_in_batches.rst | 97 ++ api-ref/source/api_description/index.rst | 26 + .../monitoring_management/index.rst | 16 + .../querying_partition_monitoring_data.rst | 145 +++ .../querying_stream_monitoring_data.rst | 163 +++ .../adding_permission_policies.rst | 128 +++ .../changing_partition_quantity.rst | 99 ++ .../stream_management/creating_streams.rst | 236 +++++ .../deleting_specified_streams.rst | 74 ++ .../stream_management/index.rst | 28 + .../querying_permission_policies.rst | 132 +++ .../querying_stream_details.rst | 360 +++++++ .../stream_management/querying_streams.rst | 276 +++++ .../updating_stream_information.rst | 134 +++ .../adding_resource_tags_in_batches.rst | 130 +++ .../adding_tags_for_specified_streams.rst | 121 +++ .../deleting_resource_tags_in_batches.rst | 130 +++ .../deleting_tags_of_specified_streams.rst | 72 ++ .../api_description/tag_management/index.rst | 26 + .../querying_tags_of_specified_regions.rst | 114 +++ .../querying_tags_of_specified_streams.rst | 125 +++ ...using_tags_to_filter_resources_streams.rst | 237 +++++ api-ref/source/api_overview.rst | 8 + api-ref/source/appendix/error_codes.rst | 118 +++ api-ref/source/appendix/index.rst | 18 + .../appendix/obtaining_a_project_id.rst | 58 ++ api-ref/source/appendix/status_codes.rst | 120 +++ api-ref/source/application_example.rst | 135 +++ .../source/before_you_start/api_calling.rst | 8 + api-ref/source/before_you_start/concepts.rst | 34 + .../source/before_you_start/constraints.rst | 8 + api-ref/source/before_you_start/endpoints.rst | 8 + api-ref/source/before_you_start/index.rst | 22 + api-ref/source/before_you_start/overview.rst | 12 + .../source/calling_apis/authentication.rst | 91 ++ api-ref/source/calling_apis/index.rst | 18 + .../calling_apis/making_an_api_request.rst | 145 +++ api-ref/source/calling_apis/response.rst | 62 ++ api-ref/source/change_history.rst | 22 + api-ref/source/index.rst | 11 + ...issions_policies_and_supported_actions.rst | 178 ++++ 69 files changed, 7975 insertions(+) create mode 100644 api-ref/source/_static/images/en-us_image_0000001135802808.png create mode 100644 api-ref/source/_static/images/en-us_image_0000001238312593.jpg create mode 100644 api-ref/source/_static/images/en-us_image_0170647338.png create mode 100644 api-ref/source/_static/images/en-us_image_0170787737.gif create mode 100644 api-ref/source/api_description/app_management/creating_consumption_apps.rst create mode 100644 api-ref/source/api_description/app_management/deleting_apps.rst create mode 100644 api-ref/source/api_description/app_management/index.rst create mode 100644 api-ref/source/api_description/app_management/querying_app_consumption_status.rst create mode 100644 api-ref/source/api_description/app_management/querying_app_details.rst create mode 100644 api-ref/source/api_description/app_management/querying_apps.rst create mode 100644 api-ref/source/api_description/checkpoint_management/deleting_checkpoints.rst create mode 100644 api-ref/source/api_description/checkpoint_management/index.rst create mode 100644 api-ref/source/api_description/checkpoint_management/querying_checkpoint_details.rst create mode 100644 api-ref/source/api_description/checkpoint_management/submitting_checkpoints.rst create mode 100644 api-ref/source/api_description/data_management/downloading_data.rst create mode 100644 api-ref/source/api_description/data_management/index.rst create mode 100644 api-ref/source/api_description/data_management/obtaining_data_cursors.rst create mode 100644 api-ref/source/api_description/data_management/uploading_data.rst create mode 100644 api-ref/source/api_description/dump_task_management/adding_cloudtable_dump_tasks.rst create mode 100644 api-ref/source/api_description/dump_task_management/adding_dli_dump_tasks.rst create mode 100644 api-ref/source/api_description/dump_task_management/adding_dws_dump_tasks.rst create mode 100644 api-ref/source/api_description/dump_task_management/adding_mrs_dump_tasks.rst create mode 100644 api-ref/source/api_description/dump_task_management/adding_obs_dump_tasks.rst create mode 100644 api-ref/source/api_description/dump_task_management/deleting_dump_tasks.rst create mode 100644 api-ref/source/api_description/dump_task_management/index.rst create mode 100644 api-ref/source/api_description/dump_task_management/pausing_dump_tasks_in_batches.rst create mode 100644 api-ref/source/api_description/dump_task_management/querying_dump_task_details.rst create mode 100644 api-ref/source/api_description/dump_task_management/querying_dump_tasks.rst create mode 100644 api-ref/source/api_description/dump_task_management/starting_dump_tasks_in_batches.rst create mode 100644 api-ref/source/api_description/index.rst create mode 100644 api-ref/source/api_description/monitoring_management/index.rst create mode 100644 api-ref/source/api_description/monitoring_management/querying_partition_monitoring_data.rst create mode 100644 api-ref/source/api_description/monitoring_management/querying_stream_monitoring_data.rst create mode 100644 api-ref/source/api_description/stream_management/adding_permission_policies.rst create mode 100644 api-ref/source/api_description/stream_management/changing_partition_quantity.rst create mode 100644 api-ref/source/api_description/stream_management/creating_streams.rst create mode 100644 api-ref/source/api_description/stream_management/deleting_specified_streams.rst create mode 100644 api-ref/source/api_description/stream_management/index.rst create mode 100644 api-ref/source/api_description/stream_management/querying_permission_policies.rst create mode 100644 api-ref/source/api_description/stream_management/querying_stream_details.rst create mode 100644 api-ref/source/api_description/stream_management/querying_streams.rst create mode 100644 api-ref/source/api_description/stream_management/updating_stream_information.rst create mode 100644 api-ref/source/api_description/tag_management/adding_resource_tags_in_batches.rst create mode 100644 api-ref/source/api_description/tag_management/adding_tags_for_specified_streams.rst create mode 100644 api-ref/source/api_description/tag_management/deleting_resource_tags_in_batches.rst create mode 100644 api-ref/source/api_description/tag_management/deleting_tags_of_specified_streams.rst create mode 100644 api-ref/source/api_description/tag_management/index.rst create mode 100644 api-ref/source/api_description/tag_management/querying_tags_of_specified_regions.rst create mode 100644 api-ref/source/api_description/tag_management/querying_tags_of_specified_streams.rst create mode 100644 api-ref/source/api_description/tag_management/using_tags_to_filter_resources_streams.rst create mode 100644 api-ref/source/api_overview.rst create mode 100644 api-ref/source/appendix/error_codes.rst create mode 100644 api-ref/source/appendix/index.rst create mode 100644 api-ref/source/appendix/obtaining_a_project_id.rst create mode 100644 api-ref/source/appendix/status_codes.rst create mode 100644 api-ref/source/application_example.rst create mode 100644 api-ref/source/before_you_start/api_calling.rst create mode 100644 api-ref/source/before_you_start/concepts.rst create mode 100644 api-ref/source/before_you_start/constraints.rst create mode 100644 api-ref/source/before_you_start/endpoints.rst create mode 100644 api-ref/source/before_you_start/index.rst create mode 100644 api-ref/source/before_you_start/overview.rst create mode 100644 api-ref/source/calling_apis/authentication.rst create mode 100644 api-ref/source/calling_apis/index.rst create mode 100644 api-ref/source/calling_apis/making_an_api_request.rst create mode 100644 api-ref/source/calling_apis/response.rst create mode 100644 api-ref/source/change_history.rst create mode 100644 api-ref/source/permissions_policies_and_supported_actions.rst diff --git a/api-ref/source/_static/images/en-us_image_0000001135802808.png b/api-ref/source/_static/images/en-us_image_0000001135802808.png new file mode 100644 index 0000000000000000000000000000000000000000..323d460df25fd1e49527874f9a8d1efd49f9c064 GIT binary patch literal 23829 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 ?pUP7KFTN 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 literal 0 HcmV?d00001 diff --git a/api-ref/source/_static/images/en-us_image_0000001238312593.jpg b/api-ref/source/_static/images/en-us_image_0000001238312593.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b0e263d9b79bf2d87a08575ce6509555ca60d44c GIT binary patch literal 112824 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 literal 0 HcmV?d00001 diff --git a/api-ref/source/_static/images/en-us_image_0170647338.png b/api-ref/source/_static/images/en-us_image_0170647338.png new file mode 100644 index 0000000000000000000000000000000000000000..c0f16671971f9e54c930a12bf9fb9dccd29a2a8c GIT binary patch literal 42231 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 &Jji!|#@?sr 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

MsdAc+3IvaDb`0+@{6{iKa+%bXzHOo7P%Q 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. diff --git a/api-ref/source/api_description/app_management/deleting_apps.rst b/api-ref/source/api_description/app_management/deleting_apps.rst new file mode 100644 index 0000000..e06a8f3 --- /dev/null +++ b/api-ref/source/api_description/app_management/deleting_apps.rst @@ -0,0 +1,71 @@ +:original_name: DeleteApp.html + +.. _DeleteApp: + +Deleting Apps +============= + +Function +-------- + +This API is used to delete apps. + +URI +--- + +DELETE /v2/{project_id}/apps/{app_name} + +.. table:: **Table 1** Path parameters + + ========== ========= ====== ============================== + Parameter Mandatory Type Description + ========== ========= ====== ============================== + project_id Yes String Project ID. + app_name Yes String Name of the app to be deleted. + ========== ========= ====== ============================== + +Request Parameters +------------------ + +.. table:: **Table 2** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +None + +Example Requests +---------------- + +Deleting Apps + +.. code-block:: text + + DELETE https://{Endpoint}/v2/{project_id}/apps/{app_name} + +Example Responses +----------------- + +None + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +204 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/app_management/index.rst b/api-ref/source/api_description/app_management/index.rst new file mode 100644 index 0000000..a2ba6c2 --- /dev/null +++ b/api-ref/source/api_description/app_management/index.rst @@ -0,0 +1,22 @@ +:original_name: topic_300000001.html + +.. _topic_300000001: + +App Management +============== + +- :ref:`Creating Consumption Apps ` +- :ref:`Querying Apps ` +- :ref:`Deleting Apps ` +- :ref:`Querying App Details ` +- :ref:`Querying App Consumption Status ` + +.. toctree:: + :maxdepth: 1 + :hidden: + + creating_consumption_apps + querying_apps + deleting_apps + querying_app_details + querying_app_consumption_status diff --git a/api-ref/source/api_description/app_management/querying_app_consumption_status.rst b/api-ref/source/api_description/app_management/querying_app_consumption_status.rst new file mode 100644 index 0000000..0f6820e --- /dev/null +++ b/api-ref/source/api_description/app_management/querying_app_consumption_status.rst @@ -0,0 +1,130 @@ +:original_name: ShowConsumerState.html + +.. _ShowConsumerState: + +Querying App Consumption Status +=============================== + +Function +-------- + +This API is used to query the consumption status of apps. + +URI +--- + +GET /v2/{project_id}/apps/{app_name}/streams/{stream_name} + +.. table:: **Table 1** Path parameters + + +-----------------+-----------------+-----------------+-----------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+===================================+ + | project_id | Yes | String | Project ID. | + +-----------------+-----------------+-----------------+-----------------------------------+ + | app_name | Yes | String | Name of the app to be queried. | + +-----------------+-----------------+-----------------+-----------------------------------+ + | stream_name | Yes | String | Name of the stream to be queried. | + | | | | | + | | | | Maximum: **60** | + +-----------------+-----------------+-----------------+-----------------------------------+ + +.. table:: **Table 2** Query parameters + + +--------------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +====================+=================+=================+==========================================================================================================================================+ + | limit | No | Integer | Max. number of partitions to list in a single API call. The minimum value is 1 and the maximum value is 1,000. The default value is 100. | + | | | | | + | | | | Minimum: **1** | + | | | | | + | | | | Maximum: **1000** | + | | | | | + | | | | Default: **100** | + +--------------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------+ + | start_partition_id | No | String | Name of the partition to start the partition list with. The returned partition list does not contain this partition. | + +--------------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------+ + | checkpoint_type | Yes | String | Type of the checkpoint. | + | | | | | + | | | | - LAST_READ: Only sequence numbers are recorded in databases. | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **LAST_READ** | + +--------------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------+ + +Request Parameters +------------------ + +.. table:: **Table 3** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +**Status code: 200** + +.. table:: **Table 4** Response body parameters + + +--------------------------------+------------------+------------------------------------------------+ + | Parameter | Type | Description | + +================================+==================+================================================+ + | app_name | String | Name of the app. | + +--------------------------------+------------------+------------------------------------------------+ + | app_id | String | Unique identifier of the app. | + +--------------------------------+------------------+------------------------------------------------+ + | create_time | Long | Time when the app is created, in milliseconds. | + +--------------------------------+------------------+------------------------------------------------+ + | commit_checkpoint_stream_names | Array of strings | List of associated streams. | + +--------------------------------+------------------+------------------------------------------------+ + +Example Requests +---------------- + +Querying App Consumption Status + +.. code-block:: text + + GET https://{Endpoint}/v2/{project_id}/apps/{app_name}/streams/{stream_name} + +Example Responses +----------------- + +**Status code: 200** + +Normal response. + +.. code-block:: + + { + "stream_name" : "newstream", + "app_name" : "newapp", + "partition_consuming_states" : [ { + "partition_id" : "2", + "sequence_number" : "485", + "latest_offset" : "1000", + "earliest_offset" : "10", + "checkpoint_type" : "LAST_READ" + } ] + } + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +200 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/app_management/querying_app_details.rst b/api-ref/source/api_description/app_management/querying_app_details.rst new file mode 100644 index 0000000..55ca0ab --- /dev/null +++ b/api-ref/source/api_description/app_management/querying_app_details.rst @@ -0,0 +1,96 @@ +:original_name: ShowApp.html + +.. _ShowApp: + +Querying App Details +==================== + +Function +-------- + +This API is used to query app details. + +URI +--- + +GET /v2/{project_id}/apps/{app_name} + +.. table:: **Table 1** Path parameters + + ========== ========= ====== ============================== + Parameter Mandatory Type Description + ========== ========= ====== ============================== + project_id Yes String Project ID. + app_name Yes String Name of the app to be queried. + ========== ========= ====== ============================== + +Request Parameters +------------------ + +.. table:: **Table 2** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +**Status code: 200** + +.. table:: **Table 3** Response body parameters + + +--------------------------------+------------------+------------------------------------------------+ + | Parameter | Type | Description | + +================================+==================+================================================+ + | app_name | String | Name of the app. | + +--------------------------------+------------------+------------------------------------------------+ + | app_id | String | Unique identifier of the app. | + +--------------------------------+------------------+------------------------------------------------+ + | create_time | Long | Time when the app is created, in milliseconds. | + +--------------------------------+------------------+------------------------------------------------+ + | commit_checkpoint_stream_names | Array of strings | List of associated streams. | + +--------------------------------+------------------+------------------------------------------------+ + +Example Requests +---------------- + +Querying App Details + +.. code-block:: text + + GET https://{Endpoint}/v2/{project_id}/apps/{app_name} + +Example Responses +----------------- + +**Status code: 200** + +Normal response. + +.. code-block:: + + { + "app_id" : "bd6IPpvgiIflQPMpi9M", + "app_name" : "newstream", + "create_time" : 1593569685875, + "commit_checkpoint_stream_names" : [ "newstream" ] + } + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +200 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/app_management/querying_apps.rst b/api-ref/source/api_description/app_management/querying_apps.rst new file mode 100644 index 0000000..72e3d7f --- /dev/null +++ b/api-ref/source/api_description/app_management/querying_apps.rst @@ -0,0 +1,137 @@ +:original_name: ListApp.html + +.. _ListApp: + +Querying Apps +============= + +Function +-------- + +This API is used to query apps. + +URI +--- + +GET /v2/{project_id}/apps + +.. table:: **Table 1** Path parameters + + ========== ========= ====== =========== + Parameter Mandatory Type Description + ========== ========= ====== =========== + project_id Yes String Project ID. + ========== ========= ====== =========== + +.. table:: **Table 2** Query parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+===============================================================================================+ + | limit | No | Integer | Maximum number of apps to list in a single API call. Value range: 1-100 Default value: 10 | + | | | | | + | | | | Minimum: **1** | + | | | | | + | | | | Maximum: **100** | + | | | | | + | | | | Default: **10** | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------+ + | start_app_name | No | String | Name of the app to start the list with. The returned app list does not contain this app name. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------+ + | stream_name | No | String | Name of the stream whose apps will be returned. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------+ + +Request Parameters +------------------ + +.. table:: **Table 3** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +**Status code: 200** + +.. table:: **Table 4** Response body parameters + + +-----------------------+---------------------------------------------------------------------------------+--------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=================================================================================+==========================================================================+ + | has_more_app | Boolean | Specifies whether there are more matching consumer applications to list. | + | | | | + | | | - true: yes | + | | | | + | | | - false: no | + +-----------------------+---------------------------------------------------------------------------------+--------------------------------------------------------------------------+ + | apps | Array of :ref:`DescribeAppResult ` objects | AppEntry list that meets the current request. | + +-----------------------+---------------------------------------------------------------------------------+--------------------------------------------------------------------------+ + | total_number | Integer | Total number of apps that meet criteria. | + +-----------------------+---------------------------------------------------------------------------------+--------------------------------------------------------------------------+ + +.. _listapp__response_describeappresult: + +.. table:: **Table 5** DescribeAppResult + + +--------------------------------+------------------+------------------------------------------------+ + | Parameter | Type | Description | + +================================+==================+================================================+ + | app_name | String | Name of the app. | + +--------------------------------+------------------+------------------------------------------------+ + | app_id | String | Unique identifier of the app. | + +--------------------------------+------------------+------------------------------------------------+ + | create_time | Long | Time when the app is created, in milliseconds. | + +--------------------------------+------------------+------------------------------------------------+ + | commit_checkpoint_stream_names | Array of strings | List of associated streams. | + +--------------------------------+------------------+------------------------------------------------+ + +Example Requests +---------------- + +Querying Apps + +.. code-block:: text + + GET https://{Endpoint}/v2/{project_id}/apps + +Example Responses +----------------- + +**Status code: 200** + +Normal response. + +.. code-block:: + + { + "total_number" : 1, + "apps" : [ { + "app_id" : "bd6IPpvgiIflQPMpi9M", + "app_name" : "newstream", + "create_time" : 1593569685875 + } ], + "has_more_app" : true + } + +Status Codes +------------ + +=========== ===================== +Status Code Description +=========== ===================== +200 Normal response. +400 Invalid Parameters +404 Application not found +500 Internal Server Error +=========== ===================== + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/checkpoint_management/deleting_checkpoints.rst b/api-ref/source/api_description/checkpoint_management/deleting_checkpoints.rst new file mode 100644 index 0000000..9f9ae5e --- /dev/null +++ b/api-ref/source/api_description/checkpoint_management/deleting_checkpoints.rst @@ -0,0 +1,98 @@ +:original_name: DeleteCheckpoint.html + +.. _DeleteCheckpoint: + +Deleting Checkpoints +==================== + +Function +-------- + +This API is used to delete checkpoints. + +URI +--- + +DELETE /v2/{project_id}/checkpoints + +.. table:: **Table 1** Path parameters + + ========== ========= ====== =========== + Parameter Mandatory Type Description + ========== ========= ====== =========== + project_id Yes String Project ID. + ========== ========= ====== =========== + +.. table:: **Table 2** Query parameters + + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=========================================================================================================================================================================+ + | stream_name | Yes | String | Name of the stream to which the checkpoint belongs. | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | app_name | Yes | String | Name of the application associated with the checkpoint. | + | | | | | + | | | | Minimum: **1** | + | | | | | + | | | | Maximum: **50** | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | checkpoint_type | Yes | String | Type of the checkpoint. LAST_READ: Only sequence numbers are recorded in databases. | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **LAST_READ** | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | partition_id | No | String | Identifier of the stream partition to which the checkpoint belongs. The value can be in either of the following formats: | + | | | | | + | | | | - shardId-0000000000 | + | | | | | + | | | | - 0 | + | | | | | + | | | | For example, if a stream has three partitions, the partition identifiers are 0, 1, and 2, and shardId-0000000000, shardId-0000000001, shardId-0000000002, respectively. | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Request Parameters +------------------ + +.. table:: **Table 3** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +None + +Example Requests +---------------- + +Deleting Checkpoints + +.. code-block:: text + + DELETE https://{Endpoint}/v2/{project_id}/checkpoints + +Example Responses +----------------- + +None + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +204 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/checkpoint_management/index.rst b/api-ref/source/api_description/checkpoint_management/index.rst new file mode 100644 index 0000000..e20113e --- /dev/null +++ b/api-ref/source/api_description/checkpoint_management/index.rst @@ -0,0 +1,18 @@ +:original_name: topic_300000002.html + +.. _topic_300000002: + +Checkpoint Management +===================== + +- :ref:`Submitting Checkpoints ` +- :ref:`Querying Checkpoint Details ` +- :ref:`Deleting Checkpoints ` + +.. toctree:: + :maxdepth: 1 + :hidden: + + submitting_checkpoints + querying_checkpoint_details + deleting_checkpoints diff --git a/api-ref/source/api_description/checkpoint_management/querying_checkpoint_details.rst b/api-ref/source/api_description/checkpoint_management/querying_checkpoint_details.rst new file mode 100644 index 0000000..40623db --- /dev/null +++ b/api-ref/source/api_description/checkpoint_management/querying_checkpoint_details.rst @@ -0,0 +1,115 @@ +:original_name: ShowCheckpoint.html + +.. _ShowCheckpoint: + +Querying Checkpoint Details +=========================== + +Function +-------- + +This API is used to query checkpoint details. + +URI +--- + +GET /v2/{project_id}/checkpoints + +.. table:: **Table 1** Path parameters + + ========== ========= ====== =========== + Parameter Mandatory Type Description + ========== ========= ====== =========== + project_id Yes String Project ID. + ========== ========= ====== =========== + +.. table:: **Table 2** Query parameters + + +-----------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+============================================================================================================================================================================+ + | stream_name | Yes | String | Name of the stream to which the checkpoint belongs. | + +-----------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | partition_id | Yes | String | Identifier of the stream partition to which the checkpoint belongs. The value can be in either of the following formats: | + | | | | | + | | | | - shardId-0000000000 | + | | | | | + | | | | - 0 | + | | | | | + | | | | For example, if a stream has three partitions, the partition identifiers are 0, 1, and 2, or shardId-0000000000, shardId-0000000001, and shardId-0000000002, respectively. | + +-----------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | app_name | Yes | String | Name of the app associated with the checkpoint. | + +-----------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | checkpoint_type | Yes | String | Type of the checkpoint. | + | | | | | + | | | | - LAST_READ: Only sequence numbers are recorded in databases. | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **LAST_READ** | + +-----------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Request Parameters +------------------ + +.. table:: **Table 3** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +**Status code: 204** + +.. table:: **Table 4** Response body parameters + + +-----------------+--------+--------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=================+========+==========================================================================+ + | sequence_number | String | Sequence number used to record the consumption checkpoint of the stream. | + +-----------------+--------+--------------------------------------------------------------------------+ + | metadata | String | Metadata information of the consumer application. | + +-----------------+--------+--------------------------------------------------------------------------+ + +Example Requests +---------------- + +Querying Checkpoint Details + +.. code-block:: text + + GET https://{Endpoint}/v2/{project_id}/checkpoints + +Example Responses +----------------- + +**Status code: 204** + +Normal response. + +.. code-block:: + + { + "sequence_number" : "newstram", + "metadata" : "" + } + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +204 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/checkpoint_management/submitting_checkpoints.rst b/api-ref/source/api_description/checkpoint_management/submitting_checkpoints.rst new file mode 100644 index 0000000..9a574e6 --- /dev/null +++ b/api-ref/source/api_description/checkpoint_management/submitting_checkpoints.rst @@ -0,0 +1,112 @@ +:original_name: dis_02_0403.html + +.. _dis_02_0403: + +Submitting Checkpoints +====================== + +Function +-------- + +This API is used to submit checkpoints. + +URI +--- + +POST /v2/{project_id}/checkpoints + +.. table:: **Table 1** Path parameters + + ========== ========= ====== =========== + Parameter Mandatory Type Description + ========== ========= ====== =========== + project_id Yes String Project ID. + ========== ========= ====== =========== + +Request Parameters +------------------ + +.. table:: **Table 2** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +.. table:: **Table 3** Request body parameters + + +-----------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+============================================================================================================================================================================+ + | app_name | Yes | String | Name of the app, which is the unique identifier of a user data consumption program. | + +-----------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | checkpoint_type | Yes | String | Type of the checkpoint. | + | | | | | + | | | | - LAST_READ: Only sequence numbers are recorded in databases. | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **LAST_READ** | + +-----------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | stream_name | Yes | String | Name of the stream. | + +-----------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | partition_id | Yes | String | Partition identifier of the stream. The value can be in either of the following formats: | + | | | | | + | | | | - shardId-0000000000 | + | | | | | + | | | | - 0 | + | | | | | + | | | | For example, if a stream has three partitions, the partition identifiers are 0, 1, and 2, or shardId-0000000000, shardId-0000000001, and shardId-0000000002, respectively. | + +-----------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | sequence_number | Yes | String | Sequence number to be submitted, which is used to record the consumption checkpoint of the stream. Ensure that the sequence number is within the valid range. | + +-----------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | metadata | No | String | Metadata information of the consumer application. | + | | | | | + | | | | The metadata information can contain a maximum of 1,000 characters. | + | | | | | + | | | | Maximum: **1000** | + +-----------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +None + +Example Requests +---------------- + +Submitting Checkpoints + +.. code-block:: text + + POST https://{Endpoint}/v2/{project_id}/checkpoints + + { + "stream_name" : "newstream", + "app_name" : "newapp", + "partition_id" : "0", + "sequence_number" : "2", + "checkpoint_type" : "LAST_READ" + } + +Example Responses +----------------- + +None + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +201 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/data_management/downloading_data.rst b/api-ref/source/api_description/data_management/downloading_data.rst new file mode 100644 index 0000000..5e24a03 --- /dev/null +++ b/api-ref/source/api_description/data_management/downloading_data.rst @@ -0,0 +1,149 @@ +:original_name: dis_02_0019.html + +.. _dis_02_0019: + +Downloading Data +================ + +Function +-------- + +This API is used to download data from DIS streams. + +URI +--- + +GET /v2/{project_id}/records + +.. table:: **Table 1** Path parameters + + ========== ========= ====== =========== + Parameter Mandatory Type Description + ========== ========= ====== =========== + project_id Yes String Project ID. + ========== ========= ====== =========== + +.. table:: **Table 2** Query parameters + + +------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +==================+=================+=================+========================================================================================================+ + | partition-cursor | Yes | String | Data cursor, which needs to be obtained through the API for obtaining data cursors. | + | | | | | + | | | | Value range: a string of 1 to 512 characters | + | | | | | + | | | | Note: | + | | | | | + | | | | The validity period of a data cursor is 5 minutes. | + +------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------+ + | max_fetch_bytes | No | Integer | Maximum number of bytes that can be obtained for each request. | + | | | | | + | | | | Note: | + | | | | | + | | | | If the value is less than the size of a single record in the partition, the record cannot be obtained. | + +------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------+ + +Request Parameters +------------------ + +.. table:: **Table 3** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +**Status code: 200** + +.. table:: **Table 4** Response body parameters + + +-----------------------+---------------------------------------------------------------+----------------------------------------------------+ + | Parameter | Type | Description | + +=======================+===============================================================+====================================================+ + | records | Array of :ref:`Record ` objects | List of downloaded records. | + +-----------------------+---------------------------------------------------------------+----------------------------------------------------+ + | next_partition_cursor | String | Next iterator. | + | | | | + | | | Note: | + | | | | + | | | The validity period of a data cursor is 5 minutes. | + +-----------------------+---------------------------------------------------------------+----------------------------------------------------+ + +.. _dis_02_0019__response_record: + +.. table:: **Table 5** Record + + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+==================================================================================================================================================================================================================================+ + | partition_key | String | Partition key set when data is being uploaded. | + | | | | + | | | Note: | + | | | | + | | | If the partition_key parameter is passed when data is uploaded, this parameter will be returned when data is downloaded. If partition_id instead of partition_key is passed when data is uploaded, no partition_key is returned. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | sequence_number | String | Sequence number of the data record. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | data | String | Downloaded data. | + | | | | + | | | The downloaded data is the serialized binary data (Base64-encoded character string). | + | | | | + | | | For example, the data returned by the data download API is "ZGF0YQ==", which is "data" after Base64 decoding. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | timestamp | Long | Timestamp when the record is written to DIS. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | timestamp_type | String | Timestamp data type. | + | | | | + | | | - CreateTime: creation time. | + | | | | + | | | Default: **CreateTime** | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Example Requests +---------------- + +Downloading Data + +.. code-block:: text + + GET https://{Endpoint}/v2/{project_id}/records + +Example Responses +----------------- + +**Status code: 200** + +Normal response. + +.. code-block:: + + { + "records" : [ { + "partition_key" : "0", + "sequence_number" : "485", + "data" : "MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx", + "timestamp" : 1527577402541, + "timestamp_type" : "CreateTime" + } ], + "next_partition_cursor" : "eyJpdGVyR2VuVGltZSI6MTQ5MDk1MDE1Nzc0NywiU3RyZWFtTmFtZSI6IjY2MCIsIlNoYXJkSWQiOiIwIiwiU2hhcmRJdGVyYXRvclR5cGUiOiJBVF9TRVFVRU5DRV9OVU1CRVIiLCJTdGFydGluZ1NlcXVlbmNlTnVtYmVyIjoiMjIiLCJUaW1lU3RhbXAiOjB9" + } + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +200 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/data_management/index.rst b/api-ref/source/api_description/data_management/index.rst new file mode 100644 index 0000000..ae7055a --- /dev/null +++ b/api-ref/source/api_description/data_management/index.rst @@ -0,0 +1,18 @@ +:original_name: topic_300000003.html + +.. _topic_300000003: + +Data Management +=============== + +- :ref:`Uploading Data ` +- :ref:`Downloading Data ` +- :ref:`Obtaining Data Cursors ` + +.. toctree:: + :maxdepth: 1 + :hidden: + + uploading_data + downloading_data + obtaining_data_cursors diff --git a/api-ref/source/api_description/data_management/obtaining_data_cursors.rst b/api-ref/source/api_description/data_management/obtaining_data_cursors.rst new file mode 100644 index 0000000..118124d --- /dev/null +++ b/api-ref/source/api_description/data_management/obtaining_data_cursors.rst @@ -0,0 +1,146 @@ +:original_name: dis_02_0020.html + +.. _dis_02_0020: + +Obtaining Data Cursors +====================== + +Function +-------- + +This API is used to obtain data cursors. + +URI +--- + +GET /v2/{project_id}/cursors + +.. table:: **Table 1** Path parameters + + ========== ========= ====== =========== + Parameter Mandatory Type Description + ========== ========= ====== =========== + project_id Yes String Project ID. + ========== ========= ====== =========== + +.. table:: **Table 2** Query parameters + + +--------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +==========================+=================+=================+==========================================================================================================================================================================================================================================================================================================================================================+ + | stream-name | Yes | String | Name of the stream. | + +--------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | partition-id | Yes | String | Partition ID of the stream. The value can be in either of the following formats: | + | | | | | + | | | | - shardId-0000000000 | + | | | | | + | | | | - 0 | + | | | | | + | | | | For example, if a stream has three partitions, the partition identifiers are 0, 1, and 2, or shardId-0000000000, shardId-0000000001, and shardId-0000000002, respectively. | + +--------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | cursor-type | No | String | Cursor type. | + | | | | | + | | | | - AT_SEQUENCE_NUMBER: Data is read from the position denoted by a specific sequence number (that is defined by starting-sequence-number). This is the default cursor type. | + | | | | | + | | | | - AFTER_SEQUENCE_NUMBER: Data is read right after the position denoted by a specific sequence number (that is defined by starting-sequence-number). | + | | | | | + | | | | - TRIM_HORIZON: Data is read from the earliest data record in the partition. For example, a tenant uses a DIS stream to upload three pieces of data A1, A2, and A3. N days later, A1 has expired and A2 and A3 are still in the validity period. In this case, if the tenant uses TRIM_HORIZON to download the data, the system downloads data from A2. | + | | | | | + | | | | - LATEST: Data is read from the latest record in the partition. This setting ensures that you always read the latest record in the partition. | + | | | | | + | | | | - AT_TIMESTAMP: Data is read from the position denoted by a specific timestamp. | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **AT_SEQUENCE_NUMBER** | + | | | | | + | | | | - **AFTER_SEQUENCE_NUMBER** | + | | | | | + | | | | - **TRIM_HORIZON** | + | | | | | + | | | | - **LATEST** | + | | | | | + | | | | - **AT_TIMESTAMP** | + +--------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | starting-sequence-number | No | String | Serial number. A sequence number is a unique identifier for each record. DIS automatically allocates a sequence number when the data producer calls the PutRecords operation to add data to the DIS stream. SN of the same partition key usually changes with time. A longer interval between PutRecords requests results in a larger sequence number. | + | | | | | + | | | | The sequence number is closely related to cursor types AT_SEQUENCE_NUMBER and AFTER_SEQUENCE_NUMBER. The two parameters determine the position of the data to be read. | + | | | | | + | | | | Value range: 0 to 9,223,372,036,854,775,807 | + +--------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | timestamp | No | Long | Timestamp when the data record starts to be read, which is closely related to cursor type AT_TIMESTAMP. The two parameters determine the position of the data to be read. | + | | | | | + | | | | Note: | + | | | | | + | | | | The timestamp is accurate to milliseconds. | + +--------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Request Parameters +------------------ + +.. table:: **Table 3** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +**Status code: 200** + +.. table:: **Table 4** Response body parameters + + +-----------------------+-----------------------+-----------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+===========================================================+ + | partition_cursor | String | Data cursor. Value range: a string of 1 to 512 characters | + | | | | + | | | Note: | + | | | | + | | | The validity period of a data cursor is 5 minutes. | + | | | | + | | | Minimum: **1** | + | | | | + | | | Maximum: **512** | + +-----------------------+-----------------------+-----------------------------------------------------------+ + +Example Requests +---------------- + +Obtaining Data Cursors + +.. code-block:: text + + GET https://{Endpoint}/v2/{project_id}/cursors + +Example Responses +----------------- + +**Status code: 200** + +Normal response. + +.. code-block:: + + { + "partition_cursor" : "eyJnZXRJdGVyYXRvclBhcmFtIjp7InN0cmVhbS1uYW1lIjoianpjIiwicGFydGl0aW9uLWlkIjoiMCIsImN1cnNvci10eXBlIjoiQVRfU0VRVUVOQ0VfTlVNQkVSIiwic3RhcnRpbmctc2VxdWVuY2UtbnVtYmVyIjoiMTAifSwiZ2VuZXJhdGVUaW1lc3RhbXAiOjE1MDYxNTk1NjM0MDV9" + } + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +200 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/data_management/uploading_data.rst b/api-ref/source/api_description/data_management/uploading_data.rst new file mode 100644 index 0000000..fce1bac --- /dev/null +++ b/api-ref/source/api_description/data_management/uploading_data.rst @@ -0,0 +1,147 @@ +:original_name: dis_02_0018.html + +.. _dis_02_0018: + +Uploading Data +============== + +Function +-------- + +This API is used to upload data to DIS streams. + +URI +--- + +POST /v2/{project_id}/records + +.. table:: **Table 1** Path parameters + + ========== ========= ====== =========== + Parameter Mandatory Type Description + ========== ========= ====== =========== + project_id Yes String Project ID. + ========== ========= ====== =========== + +Request Parameters +------------------ + +.. table:: **Table 2** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +.. table:: **Table 3** Request body parameters + + +-----------------+-----------------+----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+==============================================================================================+==============================================================================================================+ + | stream_name | Yes | String | Name of the stream. | + | | | | | + | | | | Maximum: **60** | + +-----------------+-----------------+----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------+ + | stream_id | No | String | Unique ID of the stream. | + | | | | | + | | | | If no stream is found by stream_name and stream_id is not empty, stream_id is used to search for the stream. | + | | | | | + | | | | Note: | + | | | | | + | | | | This parameter is mandatory when data is uploaded to the authorized stream. | + +-----------------+-----------------+----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------+ + | records | Yes | Array of :ref:`PutRecordsRequestEntry ` objects | List of records to be uploaded. | + +-----------------+-----------------+----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------+ + +.. _dis_02_0018__request_putrecordsrequestentry: + +.. table:: **Table 4** PutRecordsRequestEntry + + +-------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +===================+=================+=================+=======================================================================================================================================================================================================================================+ + | data | Yes | String | Data to be uploaded. The uploaded data is the serialized binary data (character string encoded using Base64). For example, if the character string data needs to be uploaded, the character string after Base64 encoding is ZGF0YQ==. | + +-------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | explicit_hash_key | No | String | Hash value of the data to be written to the partition. The hash value overwrites the hash value of partition_key. Value range: 0-long.max | + +-------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | partition_id | No | String | Partition ID of the stream. The value can be in either of the following formats: | + | | | | | + | | | | - shardId-0000000000 | + | | | | | + | | | | - 0 | + | | | | | + | | | | For example, if a stream has three partitions, the partition identifiers are 0, 1, and 2, or shardId-0000000000, shardId-0000000001, and shardId-0000000002, respectively. | + +-------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | partition_key | No | String | Partition to which data is written to. Note: | + | | | | | + | | | | If the partition_id parameter is transferred, the partition_id parameter is used preferentially. If partition_id is not transferred, partition_key is used. | + +-------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +**Status code: 200** + +.. table:: **Table 5** Response body parameters + + +---------------------+---------------------------------------------------------------------------------------------+--------------------------------------------------+ + | Parameter | Type | Description | + +=====================+=============================================================================================+==================================================+ + | failed_record_count | Integer | Number of data records that fail to be uploaded. | + +---------------------+---------------------------------------------------------------------------------------------+--------------------------------------------------+ + | records | Array of :ref:`PutRecordsResultEntry ` objects | List of upload results. | + +---------------------+---------------------------------------------------------------------------------------------+--------------------------------------------------+ + +.. _dis_02_0018__response_putrecordsresultentry: + +.. table:: **Table 6** PutRecordsResultEntry + + +-----------------+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=================+========+=============================================================================================================================================================================================================================================================================================================================================================================================+ + | partition_id | String | ID of the partition to which data is uploaded. | + +-----------------+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | sequence_number | String | Sequence number of the data to be uploaded. A sequence number is a unique identifier for each record. DIS automatically allocates a sequence number the data producer calls the PutRecords operation to add data to the DIS stream. Sequence number of the same partition key usually changes with time. A longer interval between PutRecords requests results in a larger sequence number. | + +-----------------+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | error_code | String | Error code. | + +-----------------+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | error_message | String | Error message. | + +-----------------+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Example Requests +---------------- + +Uploading Data + +.. code-block:: text + + POST https://{Endpoint}/v2/{project_id}/records + + { + "stream_name" : "newstream", + "records" : [ { + "data" : "MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTE=" + } ] + } + +Example Responses +----------------- + +None + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +200 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/dump_task_management/adding_cloudtable_dump_tasks.rst b/api-ref/source/api_description/dump_task_management/adding_cloudtable_dump_tasks.rst new file mode 100644 index 0000000..4cf3c9e --- /dev/null +++ b/api-ref/source/api_description/dump_task_management/adding_cloudtable_dump_tasks.rst @@ -0,0 +1,447 @@ +:original_name: CreateCloudTableTransferTask.html + +.. _CreateCloudTableTransferTask: + +Adding CloudTable Dump Tasks +============================ + +Function +-------- + +This API is used to add CloudTable dump tasks. + +URI +--- + +POST /v2/{project_id}/streams/{stream_name}/transfer-tasks + +.. table:: **Table 1** Path parameters + + +-----------------+-----------------+-----------------+---------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================+ + | project_id | Yes | String | Project ID. | + +-----------------+-----------------+-----------------+---------------------+ + | stream_name | Yes | String | Name of the stream. | + | | | | | + | | | | Maximum: **60** | + +-----------------+-----------------+-----------------+---------------------+ + +Request Parameters +------------------ + +.. table:: **Table 2** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +.. table:: **Table 3** Request body parameters + + +-----------------------------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +===================================+=================+=====================================================================================================================================+==================================================================================+ + | destination_type | Yes | String | Dump destination. Possible values: | + | | | | | + | | | | - OBS: Data is dumped to OBS. | + | | | | - MRS: Data is dumped to MRS. | + | | | | - DLI: Data is dumped to DLI. | + | | | | - CLOUDTABLE: Data is dumped to CloudTable. | + | | | | - DWS: Data is dumped to DWS. | + | | | | | + | | | | Default: **NOWHERE** | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **CLOUDTABLE** | + +-----------------------------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------+ + | cloudtable_destination_descriptor | No | :ref:`CloudtableDestinationDescriptorRequest ` object | Parameter list of the CloudTable to which data in the DIS stream will be dumped. | + +-----------------------------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------+ + +.. _createcloudtabletransfertask__request_cloudtabledestinationdescriptorrequest: + +.. table:: **Table 4** CloudtableDestinationDescriptorRequest + + +------------------------------+-----------------+-----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +==============================+=================+===============================================================================================+================================================================================================================================================================================================================================================================================================================================+ + | task_name | Yes | String | Name of the dump task. The task name consists of letters, digits, hyphens (-), and underscores (_). It must be a string of 1 to 64 characters. | + +------------------------------+-----------------+-----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | agency_name | Yes | String | Name of the agency created on IAM. DIS uses an agency to access your specified resources. The parameters for creating an agency are as follows: | + | | | | | + | | | | - Agency Type: Cloud service | + | | | | - Cloud Service: DIS | + | | | | - Validity Period: unlimited | + | | | | - Scope: Global service, Project: OBS. Select the Tenant Administrator role for the global service project. | + | | | | | + | | | | If agencies have been created, you can obtain available agencies from the agency list by using the "Listing Agencies " API. | + | | | | | + | | | | This parameter cannot be left blank and the parameter value cannot exceed 64 characters. | + | | | | | + | | | | If there are dump tasks on the console, the system displays a message indicating that an agency will be automatically created. The name of the automatically created agency is dis_admin_agency. | + | | | | | + | | | | Maximum: **64** | + +------------------------------+-----------------+-----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | deliver_time_interval | Yes | Integer | User-defined interval at which data is imported from the current DIS stream into OBS. If no data is pushed to the DIS stream during the current interval, no dump file package will be generated. | + | | | | | + | | | | Value range: 30-900 | + | | | | | + | | | | Default value: 300 | + | | | | | + | | | | Unit: second | + | | | | | + | | | | Minimum: **30** | + | | | | | + | | | | Maximum: **900** | + | | | | | + | | | | Default: **300** | + +------------------------------+-----------------+-----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | consumer_strategy | No | String | Offset. | + | | | | | + | | | | - LATEST: Maximum offset, indicating that the latest data will be extracted. | + | | | | - TRIM_HORIZON: Minimum offset, indicating that the earliest data will be extracted. | + | | | | | + | | | | Default value: LATEST | + | | | | | + | | | | Default: **LATEST** | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **LATEST** | + | | | | - **TRIM_HORIZON** | + +------------------------------+-----------------+-----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | cloudtable_cluster_name | Yes | String | Name of the CloudTable cluster to which data will be dumped. | + | | | | | + | | | | If you choose to dump data to OpenTSDB, OpenTSDB must be enabled for the cluster. | + +------------------------------+-----------------+-----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | cloudtable_cluster_id | Yes | String | ID of the CloudTable cluster to which data will be dumped. | + | | | | | + | | | | If you choose to dump data to OpenTSDB, OpenTSDB must be enabled for the cluster. | + +------------------------------+-----------------+-----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | cloudtable_table_name | No | String | HBase table name of the CloudTable cluster to which data will be dumped. The parameter is mandatory when data is dumped to the CloudTable HBase. | + +------------------------------+-----------------+-----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | cloudtable_schema | No | :ref:`CloudtableSchema ` object | Schema configuration of the CloudTable HBase data. You can set either this parameter or opentsdb_schema, but this parameter is mandatory when data will be dumped to HBase. After this parameter is set, the JSON data in the stream can be converted to another format and then be imported to the CloudTable HBase. | + +------------------------------+-----------------+-----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | opentsdb_schema | No | Array of :ref:`OpenTSDBSchema ` objects | Schema configuration of the CloudTable OpenTSDB data. You can set either this parameter or opentsdb_schema, but this parameter is mandatory when data will be dumped to OpenTSDB. After this parameter is set, the JSON data in the stream can be converted to another format and then be imported to the CloudTable OpenTSDB. | + +------------------------------+-----------------+-----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | cloudtable_row_key_delimiter | No | String | Delimiter used to separate the user data that generates HBase row keys. Value range: , . \| ; \\ - \_ and ~ | + | | | | | + | | | | Default value: . | + +------------------------------+-----------------+-----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | obs_backup_bucket_path | No | String | Name of the OBS bucket used to back up data that failed to be dumped to CloudTable. | + +------------------------------+-----------------+-----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | backup_file_prefix | No | String | Self-defined directory created in the OBS bucket and used to back up data that failed to be dumped to CloudTable. Directory levels are separated by slashes (/) and cannot start with slashes. | + | | | | | + | | | | Value range: a string of letters, digits, and underscores (_) | + | | | | | + | | | | The maximum length is 50 characters. | + | | | | | + | | | | This parameter is left empty by default. | + +------------------------------+-----------------+-----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | retry_duration | No | String | Time duration for DIS to retry if data fails to be dumped to CloudTable. If this threshold is exceeded, the data that fails to be dumped will be backed up to the OBS bucket/backup_file_prefix /cloudtable_error or OBS bucket/backup_file_prefix/opentsdb_error directory. | + | | | | | + | | | | Value range: 0-7,200 | + | | | | | + | | | | Unit: second | + | | | | | + | | | | Default value: 1,800 | + +------------------------------+-----------------+-----------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _createcloudtabletransfertask__request_cloudtableschema: + +.. table:: **Table 5** CloudtableSchema + + +-----------------+-----------------+-------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+===============================================================================+=============================================================================================+ + | row_key | Yes | Array of :ref:`RowKey ` objects | HBase rowkey schema used by the CloudTable cluster to convert JSON data into HBase rowkeys. | + | | | | | + | | | | Value range: 1-64 | + +-----------------+-----------------+-------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------+ + | columns | Yes | Array of :ref:`Column ` objects | HBase column schema used by the CloudTable cluster to convert JSON data into HBase columns. | + | | | | | + | | | | Value range: 1 to 4,096 | + +-----------------+-----------------+-------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------+ + +.. _createcloudtabletransfertask__request_rowkey: + +.. table:: **Table 6** RowKey + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+===============================================================================================+ + | value | Yes | String | JSON attribute name, which is used to generate HBase rowkeys for JSON data in the DIS stream. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------+ + | type | Yes | String | JSON attribute type of JSON data in the DIS stream. Value range: | + | | | | | + | | | | - Bigint | + | | | | - Double | + | | | | - Boolean | + | | | | - Timestamp | + | | | | - String | + | | | | - Decimal | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **Bigint** | + | | | | - **Double** | + | | | | - **Boolean** | + | | | | - **Timestamp** | + | | | | - **String** | + | | | | - **Decimal** | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------+ + +.. _createcloudtabletransfertask__request_column: + +.. table:: **Table 7** Column + + +--------------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +====================+=================+=================+======================================================================================================+ + | column_family_name | Yes | String | Name of the HBase column family to which data will be dumped. | + +--------------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------+ + | column_name | Yes | String | Name of the HBase column to which data will be dumped. | + | | | | | + | | | | Value range: a string of 1 to 32 characters, consisting of only letters, digits, and underscores (_) | + +--------------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------+ + | value | Yes | String | JSON attribute name, which is used to generate HBase column values for JSON data in the DIS stream. | + +--------------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------+ + | type | Yes | String | JSON attribute type of JSON data in the DIS stream. | + | | | | | + | | | | Value range: | + | | | | | + | | | | - Bigint | + | | | | - Double | + | | | | - Boolean | + | | | | - Timestamp | + | | | | - String | + | | | | - Decimal | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **Bigint** | + | | | | - **Double** | + | | | | - **Boolean** | + | | | | - **Timestamp** | + | | | | - **String** | + | | | | - **Decimal** | + +--------------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------+ + +.. _createcloudtabletransfertask__request_opentsdbschema: + +.. table:: **Table 8** OpenTSDBSchema + + +-----------+-----------+-----------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +===========+===========+===============================================================================================+=================================================================================================================================================================================================+ + | metric | Yes | Array of :ref:`OpenTSDBMetric ` objects | Schema configuration of the OpenTSDB data metric in the CloudTable cluster. After this parameter is set, the JSON data in the stream can be converted to the metric of the OpenTSDB data. | + +-----------+-----------+-----------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | timestamp | Yes | :ref:`OpenTSDBTimestamp ` object | Schema configuration of the OpenTSDB data timestamp in the CloudTable cluster. After this parameter is set, the JSON data in the stream can be converted to the timestamp of the OpenTSDB data. | + +-----------+-----------+-----------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | value | Yes | :ref:`OpenTSDBValue ` object | Schema configuration of the OpenTSDB data value in the CloudTable cluster. After this parameter is set, the JSON data in the stream can be converted to the value of the OpenTSDB data. | + +-----------+-----------+-----------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | tags | Yes | Array of :ref:`OpenTSDBTags ` objects | Schema configuration of the OpenTSDB data tags in the CloudTable cluster. After this parameter is set, the JSON data in the stream can be converted to the tags of the OpenTSDB data. | + +-----------+-----------+-----------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _createcloudtabletransfertask__request_opentsdbmetric: + +.. table:: **Table 9** OpenTSDBMetric + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=================================================================================================================================================================+ + | type | Yes | String | - When type is set to Constant, the value of metric is the value of Value. | + | | | | - When value is set to String, the value of metric is the value of the JSON attribute of the user data in the stream. | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **Constant** | + | | | | - **String** | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | value | Yes | String | Constant value or JSON attribute name of the user data in the stream. This value is 1 to 32 characters long. Only letters, digits, and periods (.) are allowed. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _createcloudtabletransfertask__request_opentsdbtimestamp: + +.. table:: **Table 10** OpenTSDBTimestamp + + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+================================================================================================================================================================================================================================+ + | type | Yes | String | - When type is set to Timestamp, the value type of the JSON attribute of the user data in the stream is Timestamp, and the timestamp of OpenTSDB can be generated without converting the data format. | + | | | | - When type is set to String, the value type of the JSON attribute of the user data in the stream is Date, and the timestamp of OpenTSDB can be generated only after the data format is converted. | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | value | Yes | String | JSON attribute name of the user data in the stream. Value range: a string of 1 to 32 characters, consisting of only letters, digits, and underscores (_) | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | format | Yes | String | This parameter is mandatory when type is set to String. When the value type of the JSON attribute of the user data in the stream is Date, format is required to convert the data format to generate the timestamp of OpenTSDB. | + | | | | | + | | | | Value range: | + | | | | | + | | | | - yyyy/MM/dd HH:mm:ss | + | | | | - MM/dd/yyyy HH:mm:ss | + | | | | - dd/MM/yyyy HH:mm:ss | + | | | | - yyyy-MM-dd HH:mm:ss | + | | | | - MM-dd-yyyy HH:mm:ss | + | | | | - dd-MM-yyyy HH:mm:ss | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **yyyy/MM/dd HH:mm:ss** | + | | | | - **MM/dd/yyyy HH:mm:ss** | + | | | | - **dd/MM/yyyy HH:mm:ss** | + | | | | - **yyyy-MM-dd HH:mm:ss** | + | | | | - **MM-dd-yyyy HH:mm:ss** | + | | | | - **dd-MM-yyyy HH:mm:ss** | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _createcloudtabletransfertask__request_opentsdbvalue: + +.. table:: **Table 11** OpenTSDBValue + + +-----------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+============================================================================================================================================================================+ + | type | Yes | String | Dump destination. Possible values: Value range: | + | | | | | + | | | | - Bigint | + | | | | - Double | + | | | | - Boolean | + | | | | - Timestamp | + | | | | - String | + | | | | - Decimal | + +-----------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | value | Yes | String | Constant value or JSON attribute name of the user data in the stream. Value range: a string of 1 to 32 characters, consisting of only letters, digits, and underscores (_) | + +-----------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _createcloudtabletransfertask__request_opentsdbtags: + +.. table:: **Table 12** OpenTSDBTags + + +-----------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+============================================================================================================================================================================+ + | name | Yes | String | Tag name of the OpenTSDB data that stores the data in the stream. Value range: a string of 1 to 32 characters, consisting of only letters, digits, and underscores (_) | + +-----------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | type | Yes | String | Type name of the JSON attribute of the user data in the stream. | + | | | | | + | | | | Value range: | + | | | | | + | | | | - Bigint | + | | | | - Double | + | | | | - Boolean | + | | | | - Timestamp | + | | | | - String | + | | | | - Decimal | + +-----------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | value | Yes | String | Constant value or JSON attribute name of the user data in the stream. Value range: a string of 1 to 32 characters, consisting of only letters, digits, and underscores (_) | + +-----------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +None + +Example Requests +---------------- + +- Adding CloudTable HBase Dump Tasks + + .. code-block:: text + + POST https://{Endpoint}/v2/{project_id}/streams/{stream_name}/transfer-tasks + + { + "destination_type" : "CLOUDTABLE", + "cloudtable_destination_descriptor" : { + "task_name" : "hbasetask", + "consumer_strategy" : "TRIM_HORIZON", + "agency_name" : "dis_admin_agency", + "cloudtable_cluster_name" : "cloudtablecluster", + "cloudtable_cluster_id" : "b8c095e2-db5f-4732-8a1d-eacd662e35dc", + "cloudtable_table_name" : "cloudtabletable", + "cloudtable_row_key_delimiter" : "|", + "retry_duration" : 1800, + "obs_backup_bucket_path" : "obsbackupbucket", + "backup_file_prefix" : "", + "cloudtable_schema" : { + "row_key" : [ { + "value" : "datavalue", + "type" : "String" + } ], + "columns" : [ { + "column_family_name" : "cfname1", + "column_name" : "ID", + "value" : "datavalue1", + "type" : "String" + }, { + "column_family_name" : "cfname2", + "column_name" : "VALUE", + "value" : "datavalue2", + "type" : "String" + } ] + } + } + } + +- Adding CloudTable OpenTSDB Dump Tasks + + .. code-block:: text + + POST https://{Endpoint}/v2/{project_id}/streams/{stream_name}/transfer-tasks + + { + "destination_type" : "CLOUDTABLE", + "cloudtable_destination_descriptor" : { + "task_name" : "opentsdbtask", + "consumer_strategy" : "LATEST", + "agency_name" : "dis_admin_agency", + "cloudtable_cluster_name" : "cloudtablecluster", + "cloudtable_cluster_id" : "b8c095e2-db5f-4732-8a1d-eacd662e35dc", + "retry_duration" : 1800, + "obs_backup_bucket_path" : "obsbackupbucket", + "backup_file_prefix" : "", + "opentsdb_schema" : [ { + "metric" : [ { + "type" : "Constant", + "value" : "age" + } ], + "timestamp" : { + "value" : "date", + "type" : "String", + "format" : "yyyy/MM/dd HH:mm:ss" + }, + "value" : { + "value" : "value", + "type" : "Bigint" + }, + "tags" : [ { + "name" : "name", + "value" : "name", + "type" : "Bigint" + } ] + } ] + } + } + +Example Responses +----------------- + +None + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +201 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/dump_task_management/adding_dli_dump_tasks.rst b/api-ref/source/api_description/dump_task_management/adding_dli_dump_tasks.rst new file mode 100644 index 0000000..49ab8ee --- /dev/null +++ b/api-ref/source/api_description/dump_task_management/adding_dli_dump_tasks.rst @@ -0,0 +1,163 @@ +:original_name: CreateDliTransferTask.html + +.. _CreateDliTransferTask: + +Adding DLI Dump Tasks +===================== + +Function +-------- + +This API is used to add DLI dump tasks. + +URI +--- + +POST /v2/{project_id}/streams/{stream_name}/transfer-tasks + +.. table:: **Table 1** Path parameters + + +-----------------+-----------------+-----------------+---------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================+ + | project_id | Yes | String | Project ID. | + +-----------------+-----------------+-----------------+---------------------+ + | stream_name | Yes | String | Name of the stream. | + | | | | | + | | | | Maximum: **60** | + +-----------------+-----------------+-----------------+---------------------+ + +Request Parameters +------------------ + +.. table:: **Table 2** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +.. table:: **Table 3** Request body parameters + + +----------------------------+-----------------+----------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +============================+=================+================================================================================================================+===========================================================================+ + | destination_type | Yes | String | Dump destination. Possible values: | + | | | | | + | | | | - OBS: Data is dumped to OBS. | + | | | | - MRS: Data is dumped to MRS. | + | | | | - DLI: Data is dumped to DLI. | + | | | | - CLOUDTABLE: Data is dumped to CloudTable. | + | | | | - DWS: Data is dumped to DWS. | + | | | | | + | | | | Default: **NOWHERE** | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **DLI** | + +----------------------------+-----------------+----------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------+ + | dli_destination_descriptor | No | :ref:`DliDestinationDescriptorRequest ` object | Parameter list of the DLI to which data in the DIS stream will be dumped. | + +----------------------------+-----------------+----------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------+ + +.. _createdlitransfertask__request_dlidestinationdescriptorrequest: + +.. table:: **Table 4** DliDestinationDescriptorRequest + + +-----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=======================+=================+=================+=========================================================================================================================================================================================================================================================================================================================================================+ + | task_name | Yes | String | Name of the dump task. The task name consists of letters, digits, hyphens (-), and underscores (_). It must be a string of 1 to 64 characters. | + +-----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | agency_name | Yes | String | Name of the agency created on IAM. DIS uses an agency to access your specified resources. The parameters for creating an agency are as follows: | + | | | | | + | | | | - Agency Type: Cloud service | + | | | | - Cloud Service: DIS | + | | | | - Validity Period: unlimited | + | | | | - Scope: Global service, Project: OBS. Select the Tenant Administrator role for the global service project. | + | | | | | + | | | | If agencies have been created, you can obtain available agencies from the agency list by using the "Listing Agencies " API. | + | | | | | + | | | | This parameter cannot be left blank and the parameter value cannot exceed 64 characters. | + | | | | | + | | | | If there are dump tasks on the console, the system displays a message indicating that an agency will be automatically created. The name of the automatically created agency is dis_admin_agency. | + | | | | | + | | | | Maximum: **64** | + +-----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | deliver_time_interval | Yes | Integer | User-defined interval at which data is imported from the current DIS stream into OBS. If no data is pushed to the DIS stream during the current interval, no dump file package will be generated. | + | | | | | + | | | | Value range: 30-900 | + | | | | | + | | | | Default value: 300 | + | | | | | + | | | | Unit: second | + | | | | | + | | | | Minimum: **30** | + | | | | | + | | | | Maximum: **900** | + | | | | | + | | | | Default: **300** | + +-----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | consumer_strategy | No | String | Offset. | + | | | | | + | | | | - LATEST: Maximum offset, indicating that the latest data will be extracted. | + | | | | - TRIM_HORIZON: Minimum offset, indicating that the earliest data will be extracted. | + | | | | | + | | | | Default value: LATEST | + | | | | | + | | | | Default: **LATEST** | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **LATEST** | + | | | | - **TRIM_HORIZON** | + +-----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dli_database_name | Yes | String | Name of the DLI database to which data in the DIS stream will be dumped. | + +-----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dli_table_name | Yes | String | Name of the DLI table to which data in the DIS stream will be dumped. | + | | | | | + | | | | Note: | + | | | | | + | | | | Only tables whose data location is DLI are supported, and you must have the permission to insert data into the tables. | + +-----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | obs_bucket_path | Yes | String | Name of the OBS bucket used to temporarily store data in the DIS stream. | + +-----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | file_prefix | No | String | Self-defined directory created in the OBS bucket and used to temporarily store data in the DIS stream. Directory levels are separated by slashes (/) and cannot start with slashes. | + | | | | | + | | | | The value can contain a maximum of 50 characters, including letters, digits, underscores (_), and slashes (/). | + | | | | | + | | | | This parameter is left empty by default. | + +-----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | retry_duration | No | String | Time duration for DIS to retry if data fails to be dumped to DLI. If the retry time exceeds the value of this parameter, the data that fails to be dumped is backed up to the OBS bucket/file_prefix/dli_error directory. Value range: 0-7,200 Unit: second Default value: 1,800 If this parameter is set to 0, DIS does not retry when the dump fails. | + +-----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +None + +Example Requests +---------------- + +None + +Example Responses +----------------- + +None + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +201 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/dump_task_management/adding_dws_dump_tasks.rst b/api-ref/source/api_description/dump_task_management/adding_dws_dump_tasks.rst new file mode 100644 index 0000000..36d0d40 --- /dev/null +++ b/api-ref/source/api_description/dump_task_management/adding_dws_dump_tasks.rst @@ -0,0 +1,282 @@ +:original_name: CreateDwsTransferTask.html + +.. _CreateDwsTransferTask: + +Adding DWS Dump Tasks +===================== + +Function +-------- + +This API is used to add DWS dump tasks. + +URI +--- + +POST /v2/{project_id}/streams/{stream_name}/transfer-tasks + +.. table:: **Table 1** Path parameters + + +-----------------+-----------------+-----------------+---------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================+ + | project_id | Yes | String | Project ID. | + +-----------------+-----------------+-----------------+---------------------+ + | stream_name | Yes | String | Name of the stream. | + | | | | | + | | | | Maximum: **60** | + +-----------------+-----------------+-----------------+---------------------+ + +Request Parameters +------------------ + +.. table:: **Table 2** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +.. table:: **Table 3** Request body parameters + + +----------------------------+-----------------+----------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +============================+=================+================================================================================================================+===========================================================================+ + | destination_type | Yes | String | Dump destination. Possible values: | + | | | | | + | | | | - OBS: Data is dumped to OBS. | + | | | | - MRS: Data is dumped to MRS. | + | | | | - DLI: Data is dumped to DLI. | + | | | | - CLOUDTABLE: Data is dumped to CloudTable. | + | | | | - DWS: Data is dumped to DWS. | + | | | | | + | | | | Default: **NOWHERE** | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **DWS** | + +----------------------------+-----------------+----------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------+ + | dws_destination_descriptor | No | :ref:`DWSDestinationDescriptorRequest ` object | Parameter list of the DWS to which data in the DIS stream will be dumped. | + +----------------------------+-----------------+----------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------+ + +.. _createdwstransfertask__request_dwsdestinationdescriptorrequest: + +.. table:: **Table 4** DWSDestinationDescriptorRequest + + +-----------------------+-----------------+----------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=======================+=================+================================================================+=====================================================================================================================================================================================================================================================+ + | task_name | Yes | String | Name of the dump task. The task name consists of letters, digits, hyphens (-), and underscores (_). It must be a string of 1 to 64 characters. | + +-----------------------+-----------------+----------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | agency_name | Yes | String | Name of the agency created on IAM. DIS uses an agency to access your specified resources. The parameters for creating an agency are as follows: | + | | | | | + | | | | - Agency Type: Cloud service | + | | | | - Cloud Service: DIS | + | | | | - Validity Period: unlimited | + | | | | - Scope: Global service, Project: OBS. Select the Tenant Administrator role for the global service project. | + | | | | | + | | | | If agencies have been created, you can obtain available agencies from the agency list by using the "Listing Agencies " API. | + | | | | | + | | | | This parameter cannot be left blank and the parameter value cannot exceed 64 characters. | + | | | | | + | | | | If there are dump tasks on the console, the system displays a message indicating that an agency will be automatically created. The name of the automatically created agency is dis_admin_agency. | + | | | | | + | | | | Maximum: **64** | + +-----------------------+-----------------+----------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | deliver_time_interval | Yes | Integer | User-defined interval at which data is imported from the current DIS stream into OBS. If no data is pushed to the DIS stream during the current interval, no dump file package will be generated. | + | | | | | + | | | | Value range: 30-900 | + | | | | | + | | | | Default value: 300 | + | | | | | + | | | | Unit: second | + | | | | | + | | | | Minimum: **30** | + | | | | | + | | | | Maximum: **900** | + | | | | | + | | | | Default: **300** | + +-----------------------+-----------------+----------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | consumer_strategy | No | String | Offset. | + | | | | | + | | | | - LATEST: Maximum offset, indicating that the latest data will be extracted. | + | | | | - TRIM_HORIZON: Minimum offset, indicating that the earliest data will be extracted. | + | | | | | + | | | | Default value: LATEST | + | | | | | + | | | | Default: **LATEST** | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **LATEST** | + | | | | - **TRIM_HORIZON** | + +-----------------------+-----------------+----------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dws_cluster_name | Yes | String | Name of the DWS cluster that stores the data in the stream. | + +-----------------------+-----------------+----------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dws_cluster_id | Yes | String | ID of the DWS cluster to which will be dumped. | + +-----------------------+-----------------+----------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dws_database_name | Yes | String | Name of the DWS database that stores the data in the stream. | + +-----------------------+-----------------+----------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dws_schema | Yes | String | Schema of the DWS database to which data will be dumped. | + +-----------------------+-----------------+----------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dws_table_name | Yes | String | Name of the DWS table that stores the data in the stream. | + +-----------------------+-----------------+----------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dws_delimiter | Yes | String | Delimiter used to separate the columns in the DWS tables. | + | | | | | + | | | | The value can be a comma (,), semicolon (;), or vertical bar (|). | + +-----------------------+-----------------+----------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | user_name | Yes | String | Username of the DWS database to which data will be dumped. | + +-----------------------+-----------------+----------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | user_password | Yes | String | Password of the DWS database to which data will be dumped. | + +-----------------------+-----------------+----------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | kms_user_key_name | Yes | String | Key created in Key Management Service (KMS) and used to encrypt the password of the DWS database. | + +-----------------------+-----------------+----------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | kms_user_key_id | Yes | String | ID of the key created in KMS and used to encrypt the password of the DWS database. | + +-----------------------+-----------------+----------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | obs_bucket_path | Yes | String | Name of the OBS bucket used to temporarily store data in the DIS stream. | + +-----------------------+-----------------+----------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | file_prefix | No | String | Self-defined directory created in the OBS bucket and used to temporarily store data in the DIS stream. Directory levels are separated by slashes (/) and cannot start with slashes. | + | | | | | + | | | | The value can contain a maximum of 50 characters, including letters, digits, underscores (_), and slashes (/). | + | | | | | + | | | | This parameter is left empty by default. | + +-----------------------+-----------------+----------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | retry_duration | No | String | Duration when you can constantly retry dumping data to DWS after the dump fails. If the dump time exceeds the value of this parameter, the data that fails to be dumped to DWS will be backed up to the OBS bucket/file_prefix/dws_error directory. | + | | | | | + | | | | Value range: 0-7,200 | + | | | | | + | | | | Unit: second | + | | | | | + | | | | Default value: 1,800 | + +-----------------------+-----------------+----------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dws_table_columns | No | String | Column to be dumped to the DWS table. If the value is null or empty, all columns are dumped by default. For example, c1,c2 indicates that columns c1 and c2 in the schema are dumped to DWS. | + | | | | | + | | | | This parameter is left blank by default. | + +-----------------------+-----------------+----------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | options | No | :ref:`Options ` object | DWS fault tolerance option (used to specify various parameters of foreign table data). | + +-----------------------+-----------------+----------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _createdwstransfertask__request_options: + +.. table:: **Table 5** Options + + +--------------------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +==========================+=================+=================+===============================================================================================================================================================================================================================+ + | fill_missing_fields | No | String | Specifies whether to set the field to Null or enable an error message to be displayed in the error table when the last field in a row of the data source file is missing during database import. | + | | | | | + | | | | Value range: | + | | | | | + | | | | - true/on | + | | | | - false/off | + | | | | | + | | | | Default value: false/off | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **true/on** | + | | | | - **false/off** | + +--------------------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | ignore_extra_data | No | String | Specifies whether to ignore excessive columns when the number of columns in a source data file exceeds that defined in the foreign table. This parameter is used only during data import. | + | | | | | + | | | | Value range: | + | | | | | + | | | | - true/on | + | | | | - false/off | + | | | | | + | | | | Default value: false/off | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **true/on** | + | | | | - **false/off** | + +--------------------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | compatible_illegal_chars | No | String | Specifies whether to tolerate invalid characters during data import. Specifies whether to convert invalid characters based on the conversion rule and import them to the database, or to report an error and stop the import. | + | | | | | + | | | | Value range: | + | | | | | + | | | | - true/on | + | | | | - false/off | + | | | | | + | | | | Default value: false/off | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **true/on** | + | | | | - **false/off** | + +--------------------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | reject_limit | No | String | Maximum number of data format errors allowed during the data import. If the number of data format errors does not reach the maximum, the data import is successful. | + | | | | | + | | | | Value range: | + | | | | | + | | | | - integer | + | | | | - unlimited | + | | | | | + | | | | Default value: 0, indicating that error information is returned immediately | + +--------------------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | error_table_name | No | String | Name of the error table that records data format errors. After the parallel import is complete, you can query the error information table to obtain the detailed error information. | + +--------------------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +None + +Example Requests +---------------- + +Adding DWS Dump Tasks + +.. code-block:: text + + POST https://{Endpoint}/v2/{project_id}/streams/{stream_name}/transfer-tasks + + { + "destination_type" : "DWS", + "dws_destination_descriptor" : { + "task_name" : "dwstask", + "consumer_strategy" : "LATEST", + "agency_name" : "dis_admin_agency", + "dws_cluster_name" : "dwscluster", + "dws_cluster_id" : "f82dc227-3691-47eb-bca7-e7851f509b2a", + "dws_database_name" : "postgres", + "dws_schema" : "dbadmin", + "dws_table_name" : "dwstablename", + "dws_delimiter" : "", + "user_name" : "dbadmin", + "user_password" : "userpassword", + "kms_user_key_name" : "kmskey", + "kms_user_key_id" : "1e759f06-9188-4d21-afab-a75e57c04d2b", + "obs_bucket_path" : "obsbucket", + "file_prefix" : "", + "deliver_time_interval" : 60, + "retry_duration" : 1800, + "options" : { + "fill_missing_fields" : "false", + "ignore_extra_data" : "false", + "compatible_illegal_chars" : "false" + } + } + } + +Example Responses +----------------- + +None + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +201 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/dump_task_management/adding_mrs_dump_tasks.rst b/api-ref/source/api_description/dump_task_management/adding_mrs_dump_tasks.rst new file mode 100644 index 0000000..f54cbb1 --- /dev/null +++ b/api-ref/source/api_description/dump_task_management/adding_mrs_dump_tasks.rst @@ -0,0 +1,197 @@ +:original_name: CreateMrsTransferTask.html + +.. _CreateMrsTransferTask: + +Adding MRS Dump Tasks +===================== + +Function +-------- + +This API is used to add MRS dump tasks. + +URI +--- + +POST /v2/{project_id}/streams/{stream_name}/transfer-tasks + +.. table:: **Table 1** Path parameters + + +-----------------+-----------------+-----------------+---------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================+ + | project_id | Yes | String | Project ID. | + +-----------------+-----------------+-----------------+---------------------+ + | stream_name | Yes | String | Name of the stream. | + | | | | | + | | | | Maximum: **60** | + +-----------------+-----------------+-----------------+---------------------+ + +Request Parameters +------------------ + +.. table:: **Table 2** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +.. table:: **Table 3** Request body parameters + + +----------------------------+-----------------+----------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +============================+=================+================================================================================================================+===========================================================================+ + | destination_type | Yes | String | Dump destination. Possible values: | + | | | | | + | | | | - OBS: Data is dumped to OBS. | + | | | | - MRS: Data is dumped to MRS. | + | | | | - DLI: Data is dumped to DLI. | + | | | | - CLOUDTABLE: Data is dumped to CloudTable. | + | | | | - DWS: Data is dumped to DWS. | + | | | | | + | | | | Default: **NOWHERE** | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **MRS** | + +----------------------------+-----------------+----------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------+ + | mrs_destination_descriptor | No | :ref:`MRSDestinationDescriptorRequest ` object | Parameter list of the MRS to which data in the DIS stream will be dumped. | + +----------------------------+-----------------+----------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------+ + +.. _createmrstransfertask__request_mrsdestinationdescriptorrequest: + +.. table:: **Table 4** MRSDestinationDescriptorRequest + + +-----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=======================+=================+=================+=====================================================================================================================================================================================================================+ + | task_name | Yes | String | Name of the dump task. The task name consists of letters, digits, hyphens (-), and underscores (_). It must be a string of 1 to 64 characters. | + +-----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | agency_name | Yes | String | Name of the agency created on IAM. DIS uses an agency to access your specified resources. The parameters for creating an agency are as follows: | + | | | | | + | | | | - Agency Type: Cloud service | + | | | | - Cloud Service: DIS | + | | | | - Validity Period: unlimited | + | | | | - Scope: Global service, Project: OBS. Select the Tenant Administrator role for the global service project. | + | | | | | + | | | | If agencies have been created, you can obtain available agencies from the agency list by using the "Listing Agencies " API. | + | | | | | + | | | | This parameter cannot be left blank and the parameter value cannot exceed 64 characters. | + | | | | | + | | | | If there are dump tasks on the console, the system displays a message indicating that an agency will be automatically created. The name of the automatically created agency is dis_admin_agency. | + | | | | | + | | | | Maximum: **64** | + +-----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | deliver_time_interval | Yes | Integer | User-defined interval at which data is imported from the current DIS stream into OBS. If no data is pushed to the DIS stream during the current interval, no dump file package will be generated. | + | | | | | + | | | | Value range: 30-900 | + | | | | | + | | | | Default value: 300 | + | | | | | + | | | | Unit: second | + | | | | | + | | | | Minimum: **30** | + | | | | | + | | | | Maximum: **900** | + | | | | | + | | | | Default: **300** | + +-----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | consumer_strategy | No | String | Offset. | + | | | | | + | | | | - LATEST: Maximum offset, indicating that the latest data will be extracted. | + | | | | - TRIM_HORIZON: Minimum offset, indicating that the earliest data will be extracted. | + | | | | | + | | | | Default value: LATEST | + | | | | | + | | | | Default: **LATEST** | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **LATEST** | + | | | | - **TRIM_HORIZON** | + +-----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | mrs_cluster_name | Yes | String | Name of the MRS cluster to which data in the DIS stream will be dumped. | + | | | | | + | | | | Note: | + | | | | | + | | | | Only MRS clusters with non-Kerberos authentication are supported. | + +-----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | mrs_cluster_id | Yes | String | ID of the MRS cluster to which data in the DIS stream will be dumped. | + +-----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | mrs_hdfs_path | Yes | String | Hadoop Distributed File System (HDFS) path of the MRS cluster to which data in the DIS stream will be dumped. | + +-----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | file_prefix | No | String | Self-defined directory created in the OBS bucket and used to temporarily store data in the DIS stream. Directory levels are separated by slashes (/) and cannot start with slashes. | + | | | | | + | | | | The value can contain a maximum of 50 characters, including letters, digits, underscores (_), and slashes (/). | + | | | | | + | | | | This parameter is left empty by default. | + +-----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | hdfs_prefix_folder | No | String | Directory to store files that will be dumped to the chosen MRS cluster. Different directory levels are separated by slash (/). Value range: a string of 0 to 50 characters This parameter is left empty by default. | + +-----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | obs_bucket_path | Yes | String | Name of the OBS bucket used to temporarily store data in the DIS stream. | + +-----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | retry_duration | No | String | Time duration for DIS to retry if data fails to be dumped. If the retry time exceeds the value of this parameter, the data that fails to be dumped is backed up to the OBS bucket/file_prefix/mrs_error directory. | + | | | | | + | | | | Value range: 0-7,200 | + | | | | | + | | | | Unit: second | + | | | | | + | | | | Default value: 1,800 | + | | | | | + | | | | If this parameter is set to 0, DIS does not retry when the dump fails. | + +-----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +None + +Example Requests +---------------- + +Adding MRS Dump Tasks + +.. code-block:: text + + POST https://{Endpoint}/v2/{project_id}/streams/{stream_name}/transfer-tasks + + { + "destination_type" : "MRS", + "mrs_destination_descriptor" : { + "task_name" : "mrstask", + "consumer_strategy" : "LATEST", + "agency_name" : "dis_admin_agency", + "destination_file_type" : "text", + "mrs_cluster_id" : "f8123fa6-99f1-4ed9-83f4-c827c7277d41", + "mrs_cluster_name" : "mrscluster", + "mrs_hdfs_path" : "/user", + "obs_bucket_path" : "obsbucket", + "file_prefix" : "", + "hdfs_prefix_folder" : "", + "deliver_time_interval" : 30, + "retry_duration" : 1800 + } + } + +Example Responses +----------------- + +None + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +201 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/dump_task_management/adding_obs_dump_tasks.rst b/api-ref/source/api_description/dump_task_management/adding_obs_dump_tasks.rst new file mode 100644 index 0000000..4309d06 --- /dev/null +++ b/api-ref/source/api_description/dump_task_management/adding_obs_dump_tasks.rst @@ -0,0 +1,286 @@ +:original_name: dis_02_0410.html + +.. _dis_02_0410: + +Adding OBS Dump Tasks +===================== + +Function +-------- + +This API is used to add OBS dump tasks. + +URI +--- + +POST /v2/{project_id}/streams/{stream_name}/transfer-tasks + +.. table:: **Table 1** Path parameters + + +-----------------+-----------------+-----------------+---------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================+ + | project_id | Yes | String | Project ID. | + +-----------------+-----------------+-----------------+---------------------+ + | stream_name | Yes | String | Name of the stream. | + | | | | | + | | | | Maximum: **60** | + +-----------------+-----------------+-----------------+---------------------+ + +Request Parameters +------------------ + +.. table:: **Table 2** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +.. table:: **Table 3** Request body parameters + + +----------------------------+-----------------+------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +============================+=================+======================================================================================================+=======================================================================+ + | destination_type | Yes | String | Dump destination. Possible values: | + | | | | | + | | | | - OBS: Data is dumped to OBS. | + | | | | - MRS: Data is dumped to MRS. | + | | | | - DLI: Data is dumped to DLI. | + | | | | - CLOUDTABLE: Data is dumped to CloudTable. | + | | | | - DWS: Data is dumped to DWS. | + | | | | | + | | | | Default: **NOWHERE** | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **OBS** | + +----------------------------+-----------------+------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------+ + | obs_destination_descriptor | No | :ref:`OBSDestinationDescriptorRequest ` object | Parameter list of OBS to which data in the DIS stream will be dumped. | + +----------------------------+-----------------+------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------+ + +.. _dis_02_0410__request_obsdestinationdescriptorrequest: + +.. table:: **Table 4** OBSDestinationDescriptorRequest + + +-----------------------+-----------------+------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=======================+=================+========================================================================+=====================================================================================================================================================================================================================================+ + | task_name | Yes | String | Name of the dump task. The task name consists of letters, digits, hyphens (-), and underscores (_). It must be a string of 1 to 64 characters. | + +-----------------------+-----------------+------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | agency_name | Yes | String | Name of the agency created on IAM. DIS uses an agency to access your specified resources. The parameters for creating an agency are as follows: | + | | | | | + | | | | - Agency Type: Cloud service | + | | | | - Cloud Service: DIS | + | | | | - Validity Period: unlimited | + | | | | - Scope: Global service, Project: OBS. Select the Tenant Administrator role for the global service project. | + | | | | | + | | | | If agencies have been created, you can obtain available agencies from the agency list by using the "Listing Agencies " API. | + | | | | | + | | | | This parameter cannot be left blank and the parameter value cannot exceed 64 characters. | + | | | | | + | | | | If there are dump tasks on the console, the system displays a message indicating that an agency will be automatically created. The name of the automatically created agency is dis_admin_agency. | + | | | | | + | | | | Maximum: **64** | + +-----------------------+-----------------+------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | deliver_time_interval | Yes | Integer | User-defined interval at which data is imported from the current DIS stream into OBS. If no data is pushed to the DIS stream during the current interval, no dump file package will be generated. | + | | | | | + | | | | Value range: 30-900 | + | | | | | + | | | | Default value: 300 | + | | | | | + | | | | Unit: second | + | | | | | + | | | | Minimum: **30** | + | | | | | + | | | | Maximum: **900** | + | | | | | + | | | | Default: **300** | + +-----------------------+-----------------+------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | consumer_strategy | No | String | Offset. | + | | | | | + | | | | - LATEST: Maximum offset, indicating that the latest data will be extracted. | + | | | | - TRIM_HORIZON: Minimum offset, indicating that the earliest data will be extracted. | + | | | | | + | | | | Default value: LATEST | + | | | | | + | | | | Default: **LATEST** | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **LATEST** | + | | | | - **TRIM_HORIZON** | + +-----------------------+-----------------+------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | file_prefix | No | String | Directory to store files that will be dumped to OBS. Different directory levels are separated by slashes (/) and cannot start with slashes. | + | | | | | + | | | | The value can contain a maximum of 50 characters, including letters, digits, underscores (_), and slashes (/). | + | | | | | + | | | | This parameter is left empty by default. | + | | | | | + | | | | Maximum: **50** | + +-----------------------+-----------------+------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | partition_format | No | String | Directory structure of the object file written into OBS. The directory structure is in the format of yyyy/MM/dd/HH/mm (time at which the dump task was created). | + | | | | | + | | | | - N/A: Leave this parameter empty, indicating that the date and time directory is not used. | + | | | | - yyyy: year | + | | | | - yyyy/MM: year/month | + | | | | - yyyy/MM/dd: year/month/day | + | | | | - yyyy/MM/dd/HH: year/month/day/hour | + | | | | - yyyy/MM/dd/HH/mm: year/month/day/hour/minute | + | | | | | + | | | | Example: in 2017/11/10/14/49, the directory structure is 2017 > 11 > 10 > 14 > 49. 2017 indicates the outermost folder. | + | | | | | + | | | | Default value: empty. | + | | | | | + | | | | Note: | + | | | | | + | | | | After data is successfully dumped, the directory structure is obs_bucket_path/file_prefix/partition_format. | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **yyyy** | + | | | | - **yyyy/MM** | + | | | | - **yyyy/MM/dd** | + | | | | - **yyyy/MM/dd/HH** | + | | | | - **yyyy/MM/dd/HH/mm** | + +-----------------------+-----------------+------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | obs_bucket_path | Yes | String | Name of the OBS bucket used to store data from the DIS stream. | + +-----------------------+-----------------+------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | destination_file_type | No | String | Dump file format. Possible values: | + | | | | | + | | | | - Text (default) | + | | | | - Parquet | + | | | | - CarbonData | + | | | | | + | | | | Note: | + | | | | | + | | | | You can select Parquet or CarbonData only when Source Data Type is set to JSON and Dump Destination is set to OBS. | + | | | | | + | | | | Default: **text** | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **text** | + | | | | - **parquet** | + | | | | - **carbon** | + +-----------------------+-----------------+------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | processing_schema | No | :ref:`ProcessingSchema ` object | Dump time directory generated based on the timestamp of the source data and the configured partition_format. Directory structure of the object file written into OBS. The directory structure is in the format of yyyy/MM/dd/HH/mm. | + +-----------------------+-----------------+------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | record_delimiter | No | String | Delimiter for the dump file, which is used to separate the user data that is written into the dump file. | + | | | | | + | | | | Value range: | + | | | | | + | | | | - Comma (,), which is the default value | + | | | | - Semicolon (;) | + | | | | - Vertical bar (|) | + | | | | - Newline character (\\n) | + | | | | | + | | | | Default: **\\n** | + +-----------------------+-----------------+------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _dis_02_0410__request_processingschema: + +.. table:: **Table 5** ProcessingSchema + + +------------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +==================+=================+=================+==========================================================================================================================================+ + | timestamp_name | Yes | String | Attribute name of the source data timestamp. | + +------------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------+ + | timestamp_type | Yes | String | Type of the source data timestamp. | + | | | | | + | | | | - String | + | | | | - Timestamp: 13-bit timestamp of the long type | + +------------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------+ + | timestamp_format | No | String | OBS directory generated based on the timestamp format. This parameter is mandatory when the timestamp type of the source data is String. | + | | | | | + | | | | Value range: | + | | | | | + | | | | - yyyy/MM/dd HH:mm:ss | + | | | | - MM/dd/yyyy HH:mm:ss | + | | | | - dd/MM/yyyy HH:mm:ss | + | | | | - yyyy-MM-dd HH:mm:ss | + | | | | - MM-dd-yyyy HH:mm:ss | + | | | | - dd-MM-yyyy HH:mm:ss | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **yyyy/MM/dd HH:mm:ss** | + | | | | - **MM/dd/yyyy HH:mm:ss** | + | | | | - **dd/MM/yyyy HH:mm:ss** | + | | | | - **yyyy-MM-dd HH:mm:ss** | + | | | | - **MM-dd-yyyy HH:mm:ss** | + | | | | - **dd-MM-yyyy HH:mm:ss** | + +------------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +None + +Example Requests +---------------- + +- Adding OBS Dump Tasks + + .. code-block:: text + + POST https://{Endpoint}/v2/{project_id}/streams/{stream_name}/transfer-tasks + + { + "destination_type" : "OBS", + "obs_destination_descriptor" : { + "task_name" : "newtask", + "consumer_strategy" : "LATEST", + "agency_name" : "dis_admin_agency", + "destination_file_type" : "text", + "obs_bucket_path" : "obsbucket", + "file_prefix" : "", + "partition_format" : "yyyy/MM/dd/HH/mm", + "record_delimiter" : "|", + "deliver_time_interval" : 30 + } + } + +- Adding OBS Dump Tasks (The dump file format is Parquet.) + + .. code-block:: text + + POST https://{Endpoint}/v2/{project_id}/streams/{stream_name}/transfer-tasks + + { + "destination_type" : "OBS", + "obs_destination_descriptor" : { + "task_name" : "newtask", + "consumer_strategy" : "LATEST", + "agency_name" : "dis_admin_agency", + "destination_file_type" : "parquet", + "obs_bucket_path" : "obsbucket", + "file_prefix" : "", + "partition_format" : "yyyy/MM/dd/HH/mm", + "record_delimiter" : "|", + "deliver_time_interval" : 30 + } + } + +Example Responses +----------------- + +None + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +201 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/dump_task_management/deleting_dump_tasks.rst b/api-ref/source/api_description/dump_task_management/deleting_dump_tasks.rst new file mode 100644 index 0000000..7a7c7a9 --- /dev/null +++ b/api-ref/source/api_description/dump_task_management/deleting_dump_tasks.rst @@ -0,0 +1,72 @@ +:original_name: DeleteTransferTask.html + +.. _DeleteTransferTask: + +Deleting Dump Tasks +=================== + +Function +-------- + +This API is used to delete dump tasks. + +URI +--- + +DELETE /v2/{project_id}/streams/{stream_name}/transfer-tasks/{task_name} + +.. table:: **Table 1** Path parameters + + =========== ========= ====== ==================================== + Parameter Mandatory Type Description + =========== ========= ====== ==================================== + project_id Yes String Project ID. + stream_name Yes String Name of the stream. + task_name Yes String Name of the dump task to be deleted. + =========== ========= ====== ==================================== + +Request Parameters +------------------ + +.. table:: **Table 2** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +None + +Example Requests +---------------- + +Deleting Dump Tasks + +.. code-block:: text + + DELETE https://{Endpoint}/v2/{project_id}/streams/{stream_name}/transfer-tasks/{task_name} + +Example Responses +----------------- + +None + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +204 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/dump_task_management/index.rst b/api-ref/source/api_description/dump_task_management/index.rst new file mode 100644 index 0000000..8014bc7 --- /dev/null +++ b/api-ref/source/api_description/dump_task_management/index.rst @@ -0,0 +1,32 @@ +:original_name: topic_300000004.html + +.. _topic_300000004: + +Dump Task Management +==================== + +- :ref:`Adding OBS Dump Tasks ` +- :ref:`Querying Dump Tasks ` +- :ref:`Deleting Dump Tasks ` +- :ref:`Querying Dump Task Details ` +- :ref:`Starting Dump Tasks in Batches ` +- :ref:`Pausing Dump Tasks in Batches ` +- :ref:`Adding DWS Dump Tasks ` +- :ref:`Adding MRS Dump Tasks ` +- :ref:`Adding DLI Dump Tasks ` +- :ref:`Adding CloudTable Dump Tasks ` + +.. toctree:: + :maxdepth: 1 + :hidden: + + adding_obs_dump_tasks + querying_dump_tasks + deleting_dump_tasks + querying_dump_task_details + starting_dump_tasks_in_batches + pausing_dump_tasks_in_batches + adding_dws_dump_tasks + adding_mrs_dump_tasks + adding_dli_dump_tasks + adding_cloudtable_dump_tasks diff --git a/api-ref/source/api_description/dump_task_management/pausing_dump_tasks_in_batches.rst b/api-ref/source/api_description/dump_task_management/pausing_dump_tasks_in_batches.rst new file mode 100644 index 0000000..65eabfd --- /dev/null +++ b/api-ref/source/api_description/dump_task_management/pausing_dump_tasks_in_batches.rst @@ -0,0 +1,97 @@ +:original_name: BatchStopTransferTask.html + +.. _BatchStopTransferTask: + +Pausing Dump Tasks in Batches +============================= + +Function +-------- + +This API is used to pause dump tasks in batches. + +URI +--- + +POST /v2/{project_id}/streams/{stream_name}/transfer-tasks/action + +.. table:: **Table 1** Path parameters + + +-----------------+-----------------+-----------------+-----------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+===================================+ + | project_id | Yes | String | Project ID. | + +-----------------+-----------------+-----------------+-----------------------------------+ + | stream_name | Yes | String | Name of the stream to be queried. | + | | | | | + | | | | Maximum: **60** | + +-----------------+-----------------+-----------------+-----------------------------------+ + +Request Parameters +------------------ + +.. table:: **Table 2** Request body parameters + + +-----------------+-----------------+----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+==============================================================================================+============================================================================+ + | action | Yes | String | Dump task operation. Currently, only the following operation is supported: | + | | | | | + | | | | - stop: The dump task is stopped. | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **stop** | + +-----------------+-----------------+----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------+ + | tasks | Yes | Array of :ref:`BatchTransferTask ` objects | List of dump tasks to be paused. | + +-----------------+-----------------+----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------+ + +.. _batchstoptransfertask__request_batchtransfertask: + +.. table:: **Table 3** BatchTransferTask + + ========= ========= ====== ============= + Parameter Mandatory Type Description + ========= ========= ====== ============= + id Yes String Dump task ID. + ========= ========= ====== ============= + +Response Parameters +------------------- + +None + +Example Requests +---------------- + +Pausing Dump Tasks in Batches + +.. code-block:: text + + POST https://{Endpoint}/v2/{project_id}/streams/{stream_name}/transfer-tasks/action + + { + "action" : "stop", + "tasks" : [ { + "id" : "9dSu1wfCytSk1aOLxvF" + } ] + } + +Example Responses +----------------- + +None + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +200 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/dump_task_management/querying_dump_task_details.rst b/api-ref/source/api_description/dump_task_management/querying_dump_task_details.rst new file mode 100644 index 0000000..8098878 --- /dev/null +++ b/api-ref/source/api_description/dump_task_management/querying_dump_task_details.rst @@ -0,0 +1,939 @@ +:original_name: ShowTransferTask.html + +.. _ShowTransferTask: + +Querying Dump Task Details +========================== + +Function +-------- + +This API is used to query dump task details. + +URI +--- + +GET /v2/{project_id}/streams/{stream_name}/transfer-tasks/{task_name} + +.. table:: **Table 1** Path parameters + + =========== ========= ====== ==================================== + Parameter Mandatory Type Description + =========== ========= ====== ==================================== + project_id Yes String Project ID. + stream_name Yes String Name of the stream. + task_name Yes String Name of the dump task to be deleted. + =========== ========= ====== ==================================== + +Request Parameters +------------------ + +.. table:: **Table 2** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +**Status code: 200** + +.. table:: **Table 3** Response body parameters + + +-----------------------------------+--------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +===================================+==========================================================================================================================+==================================================================================+ + | stream_name | String | Name of the stream to which the dump task belongs. | + +-----------------------------------+--------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------+ + | task_name | String | Name of the dump task. | + +-----------------------------------+--------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------+ + | state | String | Dump task status. Possible values: | + | | | | + | | | - ERROR: An error occurs. | + | | | - STARTING: The dump task is being started. | + | | | - PAUSED: The dump task has been stopped. | + | | | - RUNNING: The dump task is running. | + | | | - DELETE: The dump task has been deleted. | + | | | - ABNORMAL: The dump task is abnormal. | + | | | | + | | | Enumeration values: | + | | | | + | | | - **ERROR** | + | | | - **STARTING** | + | | | - **PAUSED** | + | | | - **RUNNING** | + | | | - **DELETE** | + | | | - **ABNORMAL** | + +-----------------------------------+--------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------+ + | destination_type | String | Dump destination. Possible values: | + | | | | + | | | - OBS: Data is dumped to OBS. | + | | | - MRS: Data is dumped to MRS. | + | | | - DLI: Data is dumped to DLI. | + | | | - CLOUDTABLE: Data is dumped to CloudTable. | + | | | - DWS: Data is dumped to DWS. | + | | | | + | | | Enumeration values: | + | | | | + | | | - **OBS** | + | | | - **MRS** | + | | | - **DLI** | + | | | - **CLOUDTABLE** | + | | | - **DWS** | + +-----------------------------------+--------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------+ + | create_time | Long | Time when the dump task is created. | + +-----------------------------------+--------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------+ + | last_transfer_timestamp | Long | Latest dump time of the dump task. | + +-----------------------------------+--------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------+ + | partitions | Array of :ref:`PartitionResult ` objects | List of partition dump details. | + +-----------------------------------+--------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------+ + | obs_destination_description | :ref:`OBSDestinationDescriptorRequest ` object | Parameter list of OBS to which data in the DIS stream will be dumped. | + +-----------------------------------+--------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------+ + | dws_destination_descripton | :ref:`DWSDestinationDescriptorRequest ` object | Parameter list of the DWS to which data in the DIS stream will be dumped. | + +-----------------------------------+--------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------+ + | mrs_destination_description | :ref:`MRSDestinationDescriptorRequest ` object | Parameter list of the MRS to which data in the DIS stream will be dumped. | + +-----------------------------------+--------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------+ + | dli_destination_description | :ref:`DliDestinationDescriptorRequest ` object | Parameter list of the DLI to which data in the DIS stream will be dumped. | + +-----------------------------------+--------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------+ + | cloudtable_destination_descripton | :ref:`CloudtableDestinationDescriptorRequest ` object | Parameter list of the CloudTable to which data in the DIS stream will be dumped. | + +-----------------------------------+--------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------+ + +.. _showtransfertask__response_partitionresult: + +.. table:: **Table 4** PartitionResult + + +-----------------------+-----------------------+-------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+=============================================================+ + | status | String | Current status of the partition. Possible values: | + | | | | + | | | - CREATING: The stream is being created. | + | | | - ACTIVE: The stream is available. | + | | | - DELETED: The stream is being deleted. | + | | | - EXPIRED: The stream has expired. | + | | | | + | | | Enumeration values: | + | | | | + | | | - **CREATING** | + | | | - **ACTIVE** | + | | | - **DELETED** | + | | | - **EXPIRED** | + +-----------------------+-----------------------+-------------------------------------------------------------+ + | partition_id | String | Unique identifier of the partition. | + +-----------------------+-----------------------+-------------------------------------------------------------+ + | hash_range | String | Possible value range of the hash key used by the partition. | + +-----------------------+-----------------------+-------------------------------------------------------------+ + | sequence_number_range | String | Sequence number range of the partition. | + +-----------------------+-----------------------+-------------------------------------------------------------+ + | parent_partitions | String | Parent partition. | + +-----------------------+-----------------------+-------------------------------------------------------------+ + +.. _showtransfertask__response_obsdestinationdescriptorrequest: + +.. table:: **Table 5** OBSDestinationDescriptorRequest + + +-----------------------+------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+==============================================================================+=====================================================================================================================================================================================================================================+ + | task_name | String | Name of the dump task. The task name consists of letters, digits, hyphens (-), and underscores (_). It must be a string of 1 to 64 characters. | + +-----------------------+------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | agency_name | String | Name of the agency created on IAM. DIS uses an agency to access your specified resources. The parameters for creating an agency are as follows: | + | | | | + | | | - Agency Type: Cloud service | + | | | - Cloud Service: DIS | + | | | - Validity Period: unlimited | + | | | - Scope: Global service, Project: OBS. Select the Tenant Administrator role for the global service project. | + | | | | + | | | If agencies have been created, you can obtain available agencies from the agency list by using the "Listing Agencies " API. | + | | | | + | | | This parameter cannot be left blank and the parameter value cannot exceed 64 characters. | + | | | | + | | | If there are dump tasks on the console, the system displays a message indicating that an agency will be automatically created. The name of the automatically created agency is dis_admin_agency. | + | | | | + | | | Maximum: **64** | + +-----------------------+------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | deliver_time_interval | Integer | User-defined interval at which data is imported from the current DIS stream into OBS. If no data is pushed to the DIS stream during the current interval, no dump file package will be generated. | + | | | | + | | | Value range: 30-900 | + | | | | + | | | Default value: 300 | + | | | | + | | | Unit: second | + | | | | + | | | Minimum: **30** | + | | | | + | | | Maximum: **900** | + | | | | + | | | Default: **300** | + +-----------------------+------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | consumer_strategy | String | Offset. | + | | | | + | | | - LATEST: Maximum offset, indicating that the latest data will be extracted. | + | | | - TRIM_HORIZON: Minimum offset, indicating that the earliest data will be extracted. | + | | | | + | | | Default value: LATEST | + | | | | + | | | Default: **LATEST** | + | | | | + | | | Enumeration values: | + | | | | + | | | - **LATEST** | + | | | - **TRIM_HORIZON** | + +-----------------------+------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | file_prefix | String | Directory to store files that will be dumped to OBS. Different directory levels are separated by slashes (/) and cannot start with slashes. | + | | | | + | | | The value can contain a maximum of 50 characters, including letters, digits, underscores (_), and slashes (/). | + | | | | + | | | This parameter is left empty by default. | + | | | | + | | | Maximum: **50** | + +-----------------------+------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | partition_format | String | Directory structure of the object file written into OBS. The directory structure is in the format of yyyy/MM/dd/HH/mm (time at which the dump task was created). | + | | | | + | | | - N/A: Leave this parameter empty, indicating that the date and time directory is not used. | + | | | - yyyy: year | + | | | - yyyy/MM: year/month | + | | | - yyyy/MM/dd: year/month/day | + | | | - yyyy/MM/dd/HH: year/month/day/hour | + | | | - yyyy/MM/dd/HH/mm: year/month/day/hour/minute | + | | | | + | | | Example: in 2017/11/10/14/49, the directory structure is 2017 > 11 > 10 > 14 > 49. 2017 indicates the outermost folder. | + | | | | + | | | Default value: empty. | + | | | | + | | | Note: | + | | | | + | | | After data is successfully dumped, the directory structure is obs_bucket_path/file_prefix/partition_format. | + | | | | + | | | Enumeration values: | + | | | | + | | | - **yyyy** | + | | | - **yyyy/MM** | + | | | - **yyyy/MM/dd** | + | | | - **yyyy/MM/dd/HH** | + | | | - **yyyy/MM/dd/HH/mm** | + +-----------------------+------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | obs_bucket_path | String | Name of the OBS bucket used to store data from the DIS stream. | + +-----------------------+------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | destination_file_type | String | Dump file format. Possible values: | + | | | | + | | | - Text (default) | + | | | - Parquet | + | | | - CarbonData | + | | | | + | | | Note: | + | | | | + | | | You can select Parquet or CarbonData only when Source Data Type is set to JSON and Dump Destination is set to OBS. | + | | | | + | | | Default: **text** | + | | | | + | | | Enumeration values: | + | | | | + | | | - **text** | + | | | - **parquet** | + | | | - **carbon** | + +-----------------------+------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | processing_schema | :ref:`ProcessingSchema ` object | Dump time directory generated based on the timestamp of the source data and the configured partition_format. Directory structure of the object file written into OBS. The directory structure is in the format of yyyy/MM/dd/HH/mm. | + +-----------------------+------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | record_delimiter | String | Delimiter for the dump file, which is used to separate the user data that is written into the dump file. | + | | | | + | | | Value range: | + | | | | + | | | - Comma (,), which is the default value | + | | | - Semicolon (;) | + | | | - Vertical bar (|) | + | | | - Newline character (\\n) | + | | | | + | | | Default: **\\n** | + +-----------------------+------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _showtransfertask__response_processingschema: + +.. table:: **Table 6** ProcessingSchema + + +-----------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+==========================================================================================================================================+ + | timestamp_name | String | Attribute name of the source data timestamp. | + +-----------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------+ + | timestamp_type | String | Type of the source data timestamp. | + | | | | + | | | - String | + | | | - Timestamp: 13-bit timestamp of the long type | + +-----------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------+ + | timestamp_format | String | OBS directory generated based on the timestamp format. This parameter is mandatory when the timestamp type of the source data is String. | + | | | | + | | | Value range: | + | | | | + | | | - yyyy/MM/dd HH:mm:ss | + | | | - MM/dd/yyyy HH:mm:ss | + | | | - dd/MM/yyyy HH:mm:ss | + | | | - yyyy-MM-dd HH:mm:ss | + | | | - MM-dd-yyyy HH:mm:ss | + | | | - dd-MM-yyyy HH:mm:ss | + | | | | + | | | Enumeration values: | + | | | | + | | | - **yyyy/MM/dd HH:mm:ss** | + | | | - **MM/dd/yyyy HH:mm:ss** | + | | | - **dd/MM/yyyy HH:mm:ss** | + | | | - **yyyy-MM-dd HH:mm:ss** | + | | | - **MM-dd-yyyy HH:mm:ss** | + | | | - **dd-MM-yyyy HH:mm:ss** | + +-----------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _showtransfertask__response_dwsdestinationdescriptorrequest: + +.. table:: **Table 7** DWSDestinationDescriptorRequest + + +-----------------------+------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+============================================================+=====================================================================================================================================================================================================================================================+ + | task_name | String | Name of the dump task. The task name consists of letters, digits, hyphens (-), and underscores (_). It must be a string of 1 to 64 characters. | + +-----------------------+------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | agency_name | String | Name of the agency created on IAM. DIS uses an agency to access your specified resources. The parameters for creating an agency are as follows: | + | | | | + | | | - Agency Type: Cloud service | + | | | - Cloud Service: DIS | + | | | - Validity Period: unlimited | + | | | - Scope: Global service, Project: OBS. Select the Tenant Administrator role for the global service project. | + | | | | + | | | If agencies have been created, you can obtain available agencies from the agency list by using the "Listing Agencies " API. | + | | | | + | | | This parameter cannot be left blank and the parameter value cannot exceed 64 characters. | + | | | | + | | | If there are dump tasks on the console, the system displays a message indicating that an agency will be automatically created. The name of the automatically created agency is dis_admin_agency. | + | | | | + | | | Maximum: **64** | + +-----------------------+------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | deliver_time_interval | Integer | User-defined interval at which data is imported from the current DIS stream into OBS. If no data is pushed to the DIS stream during the current interval, no dump file package will be generated. | + | | | | + | | | Value range: 30-900 | + | | | | + | | | Default value: 300 | + | | | | + | | | Unit: second | + | | | | + | | | Minimum: **30** | + | | | | + | | | Maximum: **900** | + | | | | + | | | Default: **300** | + +-----------------------+------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | consumer_strategy | String | Offset. | + | | | | + | | | - LATEST: Maximum offset, indicating that the latest data will be extracted. | + | | | - TRIM_HORIZON: Minimum offset, indicating that the earliest data will be extracted. | + | | | | + | | | Default value: LATEST | + | | | | + | | | Default: **LATEST** | + | | | | + | | | Enumeration values: | + | | | | + | | | - **LATEST** | + | | | - **TRIM_HORIZON** | + +-----------------------+------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dws_cluster_name | String | Name of the DWS cluster that stores the data in the stream. | + +-----------------------+------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dws_cluster_id | String | ID of the DWS cluster to which will be dumped. | + +-----------------------+------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dws_database_name | String | Name of the DWS database that stores the data in the stream. | + +-----------------------+------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dws_schema | String | Schema of the DWS database to which data will be dumped. | + +-----------------------+------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dws_table_name | String | Name of the DWS table that stores the data in the stream. | + +-----------------------+------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dws_delimiter | String | Delimiter used to separate the columns in the DWS tables. | + | | | | + | | | The value can be a comma (,), semicolon (;), or vertical bar (|). | + +-----------------------+------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | user_name | String | Username of the DWS database to which data will be dumped. | + +-----------------------+------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | user_password | String | Password of the DWS database to which data will be dumped. | + +-----------------------+------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | kms_user_key_name | String | Key created in Key Management Service (KMS) and used to encrypt the password of the DWS database. | + +-----------------------+------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | kms_user_key_id | String | ID of the key created in KMS and used to encrypt the password of the DWS database. | + +-----------------------+------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | obs_bucket_path | String | Name of the OBS bucket used to temporarily store data in the DIS stream. | + +-----------------------+------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | file_prefix | String | Self-defined directory created in the OBS bucket and used to temporarily store data in the DIS stream. Directory levels are separated by slashes (/) and cannot start with slashes. | + | | | | + | | | The value can contain a maximum of 50 characters, including letters, digits, underscores (_), and slashes (/). | + | | | | + | | | This parameter is left empty by default. | + +-----------------------+------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | retry_duration | String | Duration when you can constantly retry dumping data to DWS after the dump fails. If the dump time exceeds the value of this parameter, the data that fails to be dumped to DWS will be backed up to the OBS bucket/file_prefix/dws_error directory. | + | | | | + | | | Value range: 0-7,200 | + | | | | + | | | Unit: second | + | | | | + | | | Default value: 1,800 | + +-----------------------+------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dws_table_columns | String | Column to be dumped to the DWS table. If the value is null or empty, all columns are dumped by default. For example, c1,c2 indicates that columns c1 and c2 in the schema are dumped to DWS. | + | | | | + | | | This parameter is left blank by default. | + +-----------------------+------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | options | :ref:`Options ` object | DWS fault tolerance option (used to specify various parameters of foreign table data). | + +-----------------------+------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _showtransfertask__response_options: + +.. table:: **Table 8** Options + + +--------------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +==========================+=======================+===============================================================================================================================================================================================================================+ + | fill_missing_fields | String | Specifies whether to set the field to Null or enable an error message to be displayed in the error table when the last field in a row of the data source file is missing during database import. | + | | | | + | | | Value range: | + | | | | + | | | - true/on | + | | | - false/off | + | | | | + | | | Default value: false/off | + | | | | + | | | Enumeration values: | + | | | | + | | | - **true/on** | + | | | - **false/off** | + +--------------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | ignore_extra_data | String | Specifies whether to ignore excessive columns when the number of columns in a source data file exceeds that defined in the foreign table. This parameter is used only during data import. | + | | | | + | | | Value range: | + | | | | + | | | - true/on | + | | | - false/off | + | | | | + | | | Default value: false/off | + | | | | + | | | Enumeration values: | + | | | | + | | | - **true/on** | + | | | - **false/off** | + +--------------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | compatible_illegal_chars | String | Specifies whether to tolerate invalid characters during data import. Specifies whether to convert invalid characters based on the conversion rule and import them to the database, or to report an error and stop the import. | + | | | | + | | | Value range: | + | | | | + | | | - true/on | + | | | - false/off | + | | | | + | | | Default value: false/off | + | | | | + | | | Enumeration values: | + | | | | + | | | - **true/on** | + | | | - **false/off** | + +--------------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | reject_limit | String | Maximum number of data format errors allowed during the data import. If the number of data format errors does not reach the maximum, the data import is successful. | + | | | | + | | | Value range: | + | | | | + | | | - integer | + | | | - unlimited | + | | | | + | | | Default value: 0, indicating that error information is returned immediately | + +--------------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | error_table_name | String | Name of the error table that records data format errors. After the parallel import is complete, you can query the error information table to obtain the detailed error information. | + +--------------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _showtransfertask__response_mrsdestinationdescriptorrequest: + +.. table:: **Table 9** MRSDestinationDescriptorRequest + + +-----------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+=====================================================================================================================================================================================================================+ + | task_name | String | Name of the dump task. The task name consists of letters, digits, hyphens (-), and underscores (_). It must be a string of 1 to 64 characters. | + +-----------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | agency_name | String | Name of the agency created on IAM. DIS uses an agency to access your specified resources. The parameters for creating an agency are as follows: | + | | | | + | | | - Agency Type: Cloud service | + | | | - Cloud Service: DIS | + | | | - Validity Period: unlimited | + | | | - Scope: Global service, Project: OBS. Select the Tenant Administrator role for the global service project. | + | | | | + | | | If agencies have been created, you can obtain available agencies from the agency list by using the "Listing Agencies " API. | + | | | | + | | | This parameter cannot be left blank and the parameter value cannot exceed 64 characters. | + | | | | + | | | If there are dump tasks on the console, the system displays a message indicating that an agency will be automatically created. The name of the automatically created agency is dis_admin_agency. | + | | | | + | | | Maximum: **64** | + +-----------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | deliver_time_interval | Integer | User-defined interval at which data is imported from the current DIS stream into OBS. If no data is pushed to the DIS stream during the current interval, no dump file package will be generated. | + | | | | + | | | Value range: 30-900 | + | | | | + | | | Default value: 300 | + | | | | + | | | Unit: second | + | | | | + | | | Minimum: **30** | + | | | | + | | | Maximum: **900** | + | | | | + | | | Default: **300** | + +-----------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | consumer_strategy | String | Offset. | + | | | | + | | | - LATEST: Maximum offset, indicating that the latest data will be extracted. | + | | | - TRIM_HORIZON: Minimum offset, indicating that the earliest data will be extracted. | + | | | | + | | | Default value: LATEST | + | | | | + | | | Default: **LATEST** | + | | | | + | | | Enumeration values: | + | | | | + | | | - **LATEST** | + | | | - **TRIM_HORIZON** | + +-----------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | mrs_cluster_name | String | Name of the MRS cluster to which data in the DIS stream will be dumped. | + | | | | + | | | Note: | + | | | | + | | | Only MRS clusters with non-Kerberos authentication are supported. | + +-----------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | mrs_cluster_id | String | ID of the MRS cluster to which data in the DIS stream will be dumped. | + +-----------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | mrs_hdfs_path | String | Hadoop Distributed File System (HDFS) path of the MRS cluster to which data in the DIS stream will be dumped. | + +-----------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | file_prefix | String | Self-defined directory created in the OBS bucket and used to temporarily store data in the DIS stream. Directory levels are separated by slashes (/) and cannot start with slashes. | + | | | | + | | | The value can contain a maximum of 50 characters, including letters, digits, underscores (_), and slashes (/). | + | | | | + | | | This parameter is left empty by default. | + +-----------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | hdfs_prefix_folder | String | Directory to store files that will be dumped to the chosen MRS cluster. Different directory levels are separated by slash (/). Value range: a string of 0 to 50 characters This parameter is left empty by default. | + +-----------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | obs_bucket_path | String | Name of the OBS bucket used to temporarily store data in the DIS stream. | + +-----------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | retry_duration | String | Time duration for DIS to retry if data fails to be dumped. If the retry time exceeds the value of this parameter, the data that fails to be dumped is backed up to the OBS bucket/file_prefix/mrs_error directory. | + | | | | + | | | Value range: 0-7,200 | + | | | | + | | | Unit: second | + | | | | + | | | Default value: 1,800 | + | | | | + | | | If this parameter is set to 0, DIS does not retry when the dump fails. | + +-----------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _showtransfertask__response_dlidestinationdescriptorrequest: + +.. table:: **Table 10** DliDestinationDescriptorRequest + + +-----------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+=========================================================================================================================================================================================================================================================================================================================================================+ + | task_name | String | Name of the dump task. The task name consists of letters, digits, hyphens (-), and underscores (_). It must be a string of 1 to 64 characters. | + +-----------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | agency_name | String | Name of the agency created on IAM. DIS uses an agency to access your specified resources. The parameters for creating an agency are as follows: | + | | | | + | | | - Agency Type: Cloud service | + | | | - Cloud Service: DIS | + | | | - Validity Period: unlimited | + | | | - Scope: Global service, Project: OBS. Select the Tenant Administrator role for the global service project. | + | | | | + | | | If agencies have been created, you can obtain available agencies from the agency list by using the "Listing Agencies " API. | + | | | | + | | | This parameter cannot be left blank and the parameter value cannot exceed 64 characters. | + | | | | + | | | If there are dump tasks on the console, the system displays a message indicating that an agency will be automatically created. The name of the automatically created agency is dis_admin_agency. | + | | | | + | | | Maximum: **64** | + +-----------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | deliver_time_interval | Integer | User-defined interval at which data is imported from the current DIS stream into OBS. If no data is pushed to the DIS stream during the current interval, no dump file package will be generated. | + | | | | + | | | Value range: 30-900 | + | | | | + | | | Default value: 300 | + | | | | + | | | Unit: second | + | | | | + | | | Minimum: **30** | + | | | | + | | | Maximum: **900** | + | | | | + | | | Default: **300** | + +-----------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | consumer_strategy | String | Offset. | + | | | | + | | | - LATEST: Maximum offset, indicating that the latest data will be extracted. | + | | | - TRIM_HORIZON: Minimum offset, indicating that the earliest data will be extracted. | + | | | | + | | | Default value: LATEST | + | | | | + | | | Default: **LATEST** | + | | | | + | | | Enumeration values: | + | | | | + | | | - **LATEST** | + | | | - **TRIM_HORIZON** | + +-----------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dli_database_name | String | Name of the DLI database to which data in the DIS stream will be dumped. | + +-----------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dli_table_name | String | Name of the DLI table to which data in the DIS stream will be dumped. | + | | | | + | | | Note: | + | | | | + | | | Only tables whose data location is DLI are supported, and you must have the permission to insert data into the tables. | + +-----------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | obs_bucket_path | String | Name of the OBS bucket used to temporarily store data in the DIS stream. | + +-----------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | file_prefix | String | Self-defined directory created in the OBS bucket and used to temporarily store data in the DIS stream. Directory levels are separated by slashes (/) and cannot start with slashes. | + | | | | + | | | The value can contain a maximum of 50 characters, including letters, digits, underscores (_), and slashes (/). | + | | | | + | | | This parameter is left empty by default. | + +-----------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | retry_duration | String | Time duration for DIS to retry if data fails to be dumped to DLI. If the retry time exceeds the value of this parameter, the data that fails to be dumped is backed up to the OBS bucket/file_prefix/dli_error directory. Value range: 0-7,200 Unit: second Default value: 1,800 If this parameter is set to 0, DIS does not retry when the dump fails. | + +-----------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _showtransfertask__response_cloudtabledestinationdescriptorrequest: + +.. table:: **Table 11** CloudtableDestinationDescriptorRequest + + +------------------------------+------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +==============================+====================================================================================+================================================================================================================================================================================================================================================================================================================================+ + | task_name | String | Name of the dump task. The task name consists of letters, digits, hyphens (-), and underscores (_). It must be a string of 1 to 64 characters. | + +------------------------------+------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | agency_name | String | Name of the agency created on IAM. DIS uses an agency to access your specified resources. The parameters for creating an agency are as follows: | + | | | | + | | | - Agency Type: Cloud service | + | | | - Cloud Service: DIS | + | | | - Validity Period: unlimited | + | | | - Scope: Global service, Project: OBS. Select the Tenant Administrator role for the global service project. | + | | | | + | | | If agencies have been created, you can obtain available agencies from the agency list by using the "Listing Agencies " API. | + | | | | + | | | This parameter cannot be left blank and the parameter value cannot exceed 64 characters. | + | | | | + | | | If there are dump tasks on the console, the system displays a message indicating that an agency will be automatically created. The name of the automatically created agency is dis_admin_agency. | + | | | | + | | | Maximum: **64** | + +------------------------------+------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | deliver_time_interval | Integer | User-defined interval at which data is imported from the current DIS stream into OBS. If no data is pushed to the DIS stream during the current interval, no dump file package will be generated. | + | | | | + | | | Value range: 30-900 | + | | | | + | | | Default value: 300 | + | | | | + | | | Unit: second | + | | | | + | | | Minimum: **30** | + | | | | + | | | Maximum: **900** | + | | | | + | | | Default: **300** | + +------------------------------+------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | consumer_strategy | String | Offset. | + | | | | + | | | - LATEST: Maximum offset, indicating that the latest data will be extracted. | + | | | - TRIM_HORIZON: Minimum offset, indicating that the earliest data will be extracted. | + | | | | + | | | Default value: LATEST | + | | | | + | | | Default: **LATEST** | + | | | | + | | | Enumeration values: | + | | | | + | | | - **LATEST** | + | | | - **TRIM_HORIZON** | + +------------------------------+------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | cloudtable_cluster_name | String | Name of the CloudTable cluster to which data will be dumped. | + | | | | + | | | If you choose to dump data to OpenTSDB, OpenTSDB must be enabled for the cluster. | + +------------------------------+------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | cloudtable_cluster_id | String | ID of the CloudTable cluster to which data will be dumped. | + | | | | + | | | If you choose to dump data to OpenTSDB, OpenTSDB must be enabled for the cluster. | + +------------------------------+------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | cloudtable_table_name | String | HBase table name of the CloudTable cluster to which data will be dumped. The parameter is mandatory when data is dumped to the CloudTable HBase. | + +------------------------------+------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | cloudtable_schema | :ref:`CloudtableSchema ` object | Schema configuration of the CloudTable HBase data. You can set either this parameter or opentsdb_schema, but this parameter is mandatory when data will be dumped to HBase. After this parameter is set, the JSON data in the stream can be converted to another format and then be imported to the CloudTable HBase. | + +------------------------------+------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | opentsdb_schema | Array of :ref:`OpenTSDBSchema ` objects | Schema configuration of the CloudTable OpenTSDB data. You can set either this parameter or opentsdb_schema, but this parameter is mandatory when data will be dumped to OpenTSDB. After this parameter is set, the JSON data in the stream can be converted to another format and then be imported to the CloudTable OpenTSDB. | + +------------------------------+------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | cloudtable_row_key_delimiter | String | Delimiter used to separate the user data that generates HBase row keys. Value range: , . \| ; \\ - \_ and ~ | + | | | | + | | | Default value: . | + +------------------------------+------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | obs_backup_bucket_path | String | Name of the OBS bucket used to back up data that failed to be dumped to CloudTable. | + +------------------------------+------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | backup_file_prefix | String | Self-defined directory created in the OBS bucket and used to back up data that failed to be dumped to CloudTable. Directory levels are separated by slashes (/) and cannot start with slashes. | + | | | | + | | | Value range: a string of letters, digits, and underscores (_) | + | | | | + | | | The maximum length is 50 characters. | + | | | | + | | | This parameter is left empty by default. | + +------------------------------+------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | retry_duration | String | Time duration for DIS to retry if data fails to be dumped to CloudTable. If this threshold is exceeded, the data that fails to be dumped will be backed up to the OBS bucket/backup_file_prefix /cloudtable_error or OBS bucket/backup_file_prefix/opentsdb_error directory. | + | | | | + | | | Value range: 0-7,200 | + | | | | + | | | Unit: second | + | | | | + | | | Default value: 1,800 | + +------------------------------+------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _showtransfertask__response_cloudtableschema: + +.. table:: **Table 12** CloudtableSchema + + +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+====================================================================+=============================================================================================+ + | row_key | Array of :ref:`RowKey ` objects | HBase rowkey schema used by the CloudTable cluster to convert JSON data into HBase rowkeys. | + | | | | + | | | Value range: 1-64 | + +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------+ + | columns | Array of :ref:`Column ` objects | HBase column schema used by the CloudTable cluster to convert JSON data into HBase columns. | + | | | | + | | | Value range: 1 to 4,096 | + +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------+ + +.. _showtransfertask__response_rowkey: + +.. table:: **Table 13** RowKey + + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+===============================================================================================+ + | value | String | JSON attribute name, which is used to generate HBase rowkeys for JSON data in the DIS stream. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------+ + | type | String | JSON attribute type of JSON data in the DIS stream. Value range: | + | | | | + | | | - Bigint | + | | | - Double | + | | | - Boolean | + | | | - Timestamp | + | | | - String | + | | | - Decimal | + | | | | + | | | Enumeration values: | + | | | | + | | | - **Bigint** | + | | | - **Double** | + | | | - **Boolean** | + | | | - **Timestamp** | + | | | - **String** | + | | | - **Decimal** | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------+ + +.. _showtransfertask__response_column: + +.. table:: **Table 14** Column + + +-----------------------+-----------------------+------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+======================================================================================================+ + | column_family_name | String | Name of the HBase column family to which data will be dumped. | + +-----------------------+-----------------------+------------------------------------------------------------------------------------------------------+ + | column_name | String | Name of the HBase column to which data will be dumped. | + | | | | + | | | Value range: a string of 1 to 32 characters, consisting of only letters, digits, and underscores (_) | + +-----------------------+-----------------------+------------------------------------------------------------------------------------------------------+ + | value | String | JSON attribute name, which is used to generate HBase column values for JSON data in the DIS stream. | + +-----------------------+-----------------------+------------------------------------------------------------------------------------------------------+ + | type | String | JSON attribute type of JSON data in the DIS stream. | + | | | | + | | | Value range: | + | | | | + | | | - Bigint | + | | | - Double | + | | | - Boolean | + | | | - Timestamp | + | | | - String | + | | | - Decimal | + | | | | + | | | Enumeration values: | + | | | | + | | | - **Bigint** | + | | | - **Double** | + | | | - **Boolean** | + | | | - **Timestamp** | + | | | - **String** | + | | | - **Decimal** | + +-----------------------+-----------------------+------------------------------------------------------------------------------------------------------+ + +.. _showtransfertask__response_opentsdbschema: + +.. table:: **Table 15** OpenTSDBSchema + + +-----------+------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +===========+====================================================================================+=================================================================================================================================================================================================+ + | metric | Array of :ref:`OpenTSDBMetric ` objects | Schema configuration of the OpenTSDB data metric in the CloudTable cluster. After this parameter is set, the JSON data in the stream can be converted to the metric of the OpenTSDB data. | + +-----------+------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | timestamp | :ref:`OpenTSDBTimestamp ` object | Schema configuration of the OpenTSDB data timestamp in the CloudTable cluster. After this parameter is set, the JSON data in the stream can be converted to the timestamp of the OpenTSDB data. | + +-----------+------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | value | :ref:`OpenTSDBValue ` object | Schema configuration of the OpenTSDB data value in the CloudTable cluster. After this parameter is set, the JSON data in the stream can be converted to the value of the OpenTSDB data. | + +-----------+------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | tags | Array of :ref:`OpenTSDBTags ` objects | Schema configuration of the OpenTSDB data tags in the CloudTable cluster. After this parameter is set, the JSON data in the stream can be converted to the tags of the OpenTSDB data. | + +-----------+------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _showtransfertask__response_opentsdbmetric: + +.. table:: **Table 16** OpenTSDBMetric + + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+=================================================================================================================================================================+ + | type | String | - When type is set to Constant, the value of metric is the value of Value. | + | | | - When value is set to String, the value of metric is the value of the JSON attribute of the user data in the stream. | + | | | | + | | | Enumeration values: | + | | | | + | | | - **Constant** | + | | | - **String** | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | value | String | Constant value or JSON attribute name of the user data in the stream. This value is 1 to 32 characters long. Only letters, digits, and periods (.) are allowed. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _showtransfertask__response_opentsdbtimestamp: + +.. table:: **Table 17** OpenTSDBTimestamp + + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+================================================================================================================================================================================================================================+ + | type | String | - When type is set to Timestamp, the value type of the JSON attribute of the user data in the stream is Timestamp, and the timestamp of OpenTSDB can be generated without converting the data format. | + | | | - When type is set to String, the value type of the JSON attribute of the user data in the stream is Date, and the timestamp of OpenTSDB can be generated only after the data format is converted. | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | value | String | JSON attribute name of the user data in the stream. Value range: a string of 1 to 32 characters, consisting of only letters, digits, and underscores (_) | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | format | String | This parameter is mandatory when type is set to String. When the value type of the JSON attribute of the user data in the stream is Date, format is required to convert the data format to generate the timestamp of OpenTSDB. | + | | | | + | | | Value range: | + | | | | + | | | - yyyy/MM/dd HH:mm:ss | + | | | - MM/dd/yyyy HH:mm:ss | + | | | - dd/MM/yyyy HH:mm:ss | + | | | - yyyy-MM-dd HH:mm:ss | + | | | - MM-dd-yyyy HH:mm:ss | + | | | - dd-MM-yyyy HH:mm:ss | + | | | | + | | | Enumeration values: | + | | | | + | | | - **yyyy/MM/dd HH:mm:ss** | + | | | - **MM/dd/yyyy HH:mm:ss** | + | | | - **dd/MM/yyyy HH:mm:ss** | + | | | - **yyyy-MM-dd HH:mm:ss** | + | | | - **MM-dd-yyyy HH:mm:ss** | + | | | - **dd-MM-yyyy HH:mm:ss** | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _showtransfertask__response_opentsdbvalue: + +.. table:: **Table 18** OpenTSDBValue + + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+============================================================================================================================================================================+ + | type | String | Dump destination. Possible values: Value range: | + | | | | + | | | - Bigint | + | | | - Double | + | | | - Boolean | + | | | - Timestamp | + | | | - String | + | | | - Decimal | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | value | String | Constant value or JSON attribute name of the user data in the stream. Value range: a string of 1 to 32 characters, consisting of only letters, digits, and underscores (_) | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _showtransfertask__response_opentsdbtags: + +.. table:: **Table 19** OpenTSDBTags + + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+============================================================================================================================================================================+ + | name | String | Tag name of the OpenTSDB data that stores the data in the stream. Value range: a string of 1 to 32 characters, consisting of only letters, digits, and underscores (_) | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | type | String | Type name of the JSON attribute of the user data in the stream. | + | | | | + | | | Value range: | + | | | | + | | | - Bigint | + | | | - Double | + | | | - Boolean | + | | | - Timestamp | + | | | - String | + | | | - Decimal | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | value | String | Constant value or JSON attribute name of the user data in the stream. Value range: a string of 1 to 32 characters, consisting of only letters, digits, and underscores (_) | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Example Requests +---------------- + +Querying Dump Task Details + +.. code-block:: text + + GET https://{Endpoint}/v2/{project_id}/streams/{stream_name}/transfer-tasks/{task_name} + +Example Responses +----------------- + +**Status code: 200** + +Normal response. + +.. code-block:: + + { + "stream_id" : "RdMFID6edQdf8eDzc9e", + "stream_name" : "newstream", + "task_name" : "newtask", + "task_id" : "As805BudhcH1lDs6gbn", + "destination_type" : "OBS", + "state" : "RUNNING", + "create_time" : 1606554932552, + "last_transfer_timestamp" : 1606984428612, + "obs_destination_description" : { + "agency_name" : "dis_admin_agency", + "file_prefix\"" : "", + "partition_format" : "yyyy/MM/dd", + "obs_bucket_path" : "obsbucket", + "deliver_time_interval" : 60, + "consumer_strategy" : "LATEST", + "retry_duration" : 0, + "destination_file_type" : "text", + "record_delimiter" : "\n" + }, + "partitions" : [ { + "partitionId" : "shardId-0000000000", + "discard" : 0, + "state" : "RUNNING", + "last_transfer_timestamp" : 1606984428612, + "last_transfer_offset" : 289897 + } ] + } + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +200 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/dump_task_management/querying_dump_tasks.rst b/api-ref/source/api_description/dump_task_management/querying_dump_tasks.rst new file mode 100644 index 0000000..6545fbb --- /dev/null +++ b/api-ref/source/api_description/dump_task_management/querying_dump_tasks.rst @@ -0,0 +1,168 @@ +:original_name: ListTransferTasks.html + +.. _ListTransferTasks: + +Querying Dump Tasks +=================== + +Function +-------- + +This API is used to query dump tasks. + +URI +--- + +GET /v2/{project_id}/streams/{stream_name}/transfer-tasks + +.. table:: **Table 1** Path parameters + + +-----------------+-----------------+-----------------+-----------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+===================================+ + | project_id | Yes | String | Project ID. | + +-----------------+-----------------+-----------------+-----------------------------------+ + | stream_name | Yes | String | Name of the stream to be queried. | + | | | | | + | | | | Maximum: **60** | + +-----------------+-----------------+-----------------+-----------------------------------+ + +Request Parameters +------------------ + +.. table:: **Table 2** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +**Status code: 200** + +.. table:: **Table 3** Response body parameters + + +--------------+---------------------------------------------------------------------------------+---------------------------------------------------+ + | Parameter | Type | Description | + +==============+=================================================================================+===================================================+ + | total_number | Integer | Total number of dump tasks. | + +--------------+---------------------------------------------------------------------------------+---------------------------------------------------+ + | quota | Integer | Maximum number of dump tasks that can be created. | + +--------------+---------------------------------------------------------------------------------+---------------------------------------------------+ + | tasks | Array of :ref:`TransferTask ` objects | List of dump tasks. | + +--------------+---------------------------------------------------------------------------------+---------------------------------------------------+ + +.. _listtransfertasks__response_transfertask: + +.. table:: **Table 4** TransferTask + + +-------------------------+-----------------------+----------------------------------------------+ + | Parameter | Type | Description | + +=========================+=======================+==============================================+ + | task_name | String | Name of the dump task. | + +-------------------------+-----------------------+----------------------------------------------+ + | state | String | Dump task status. Possible values: | + | | | | + | | | - ERROR: An error occurs. | + | | | | + | | | - STARTING: The dump task is being started. | + | | | | + | | | - PAUSED: The dump task has been stopped. | + | | | | + | | | - RUNNING: The dump task is running. | + | | | | + | | | - DELETE: The dump task has been deleted. | + | | | | + | | | - ABNORMAL: The dump task is abnormal. | + | | | | + | | | Enumeration values: | + | | | | + | | | - **ERROR** | + | | | | + | | | - **STARTING** | + | | | | + | | | - **PAUSED** | + | | | | + | | | - **RUNNING** | + | | | | + | | | - **DELETE** | + | | | | + | | | - **ABNORMAL** | + +-------------------------+-----------------------+----------------------------------------------+ + | destination_type | String | Dump destination. Possible values: | + | | | | + | | | - OBS: Data is dumped to OBS. | + | | | | + | | | - MRS: Data is dumped to MRS. | + | | | | + | | | - DLI: Data is dumped to DLI. | + | | | | + | | | - CLOUDTABLE: Data is dumped to CloudTable. | + | | | | + | | | - DWS: Data is dumped to DWS. | + | | | | + | | | Enumeration values: | + | | | | + | | | - **OBS** | + | | | | + | | | - **MRS** | + | | | | + | | | - **DLI** | + | | | | + | | | - **CLOUDTABLE** | + | | | | + | | | - **DWS** | + +-------------------------+-----------------------+----------------------------------------------+ + | create_time | Long | Time when the dump task is created. | + +-------------------------+-----------------------+----------------------------------------------+ + | last_transfer_timestamp | Long | Latest dump time of the dump task. | + +-------------------------+-----------------------+----------------------------------------------+ + +Example Requests +---------------- + +Querying Dump Tasks + +.. code-block:: text + + GET https://{Endpoint}/v2/{project_id}/streams/{stream_name}/transfer-tasks + +Example Responses +----------------- + +**Status code: 200** + +Normal response. + +.. code-block:: + + { + "tasks" : [ { + "task_id" : "As805BudhcH1lDs6gbn", + "destination_type" : "OBS", + "task_name" : "newtask", + "create_time" : 1606554932552, + "state" : "RUNNING", + "last_transfer_timestamp" : 1606984428612 + } ], + "total_number" : 1 + } + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +200 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/dump_task_management/starting_dump_tasks_in_batches.rst b/api-ref/source/api_description/dump_task_management/starting_dump_tasks_in_batches.rst new file mode 100644 index 0000000..c0710a8 --- /dev/null +++ b/api-ref/source/api_description/dump_task_management/starting_dump_tasks_in_batches.rst @@ -0,0 +1,97 @@ +:original_name: BatchStartTransferTask.html + +.. _BatchStartTransferTask: + +Starting Dump Tasks in Batches +============================== + +Function +-------- + +This API is used to start dump tasks in batches. + +URI +--- + +POST /v2/{project_id}/streams/{stream_name}/transfer-tasks/action + +.. table:: **Table 1** Path parameters + + +-----------------+-----------------+-----------------+-----------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+===================================+ + | project_id | Yes | String | Project ID. | + +-----------------+-----------------+-----------------+-----------------------------------+ + | stream_name | Yes | String | Name of the stream to be queried. | + | | | | | + | | | | Maximum: **60** | + +-----------------+-----------------+-----------------+-----------------------------------+ + +Request Parameters +------------------ + +.. table:: **Table 2** Request body parameters + + +-----------------+-----------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+===============================================================================================+============================================================================+ + | action | Yes | String | Dump task operation. Currently, only the following operation is supported: | + | | | | | + | | | | - start: The dump task is started. | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **start** | + +-----------------+-----------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------+ + | tasks | Yes | Array of :ref:`BatchTransferTask ` objects | List of dump tasks to be operated. | + +-----------------+-----------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------+ + +.. _batchstarttransfertask__request_batchtransfertask: + +.. table:: **Table 3** BatchTransferTask + + ========= ========= ====== ============= + Parameter Mandatory Type Description + ========= ========= ====== ============= + id Yes String Dump task ID. + ========= ========= ====== ============= + +Response Parameters +------------------- + +None + +Example Requests +---------------- + +Starting Dump Tasks in Batches + +.. code-block:: text + + POST https://{Endpoint}/v2/{project_id}/streams/{stream_name}/transfer-tasks/action + + { + "action" : "start", + "tasks" : [ { + "id" : "9dSu1wfCytSk1aOLxvF" + } ] + } + +Example Responses +----------------- + +None + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +200 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/index.rst b/api-ref/source/api_description/index.rst new file mode 100644 index 0000000..ab50c2b --- /dev/null +++ b/api-ref/source/api_description/index.rst @@ -0,0 +1,26 @@ +:original_name: dis_02_0015.html + +.. _dis_02_0015: + +API Description +=============== + +- :ref:`Stream Management ` +- :ref:`App Management ` +- :ref:`Checkpoint Management ` +- :ref:`Data Management ` +- :ref:`Dump Task Management ` +- :ref:`Monitoring Management ` +- :ref:`Tag Management ` + +.. toctree:: + :maxdepth: 1 + :hidden: + + stream_management/index + app_management/index + checkpoint_management/index + data_management/index + dump_task_management/index + monitoring_management/index + tag_management/index diff --git a/api-ref/source/api_description/monitoring_management/index.rst b/api-ref/source/api_description/monitoring_management/index.rst new file mode 100644 index 0000000..fd13f7f --- /dev/null +++ b/api-ref/source/api_description/monitoring_management/index.rst @@ -0,0 +1,16 @@ +:original_name: topic_300000005.html + +.. _topic_300000005: + +Monitoring Management +===================== + +- :ref:`Querying Stream Monitoring Data ` +- :ref:`Querying Partition Monitoring Data ` + +.. toctree:: + :maxdepth: 1 + :hidden: + + querying_stream_monitoring_data + querying_partition_monitoring_data diff --git a/api-ref/source/api_description/monitoring_management/querying_partition_monitoring_data.rst b/api-ref/source/api_description/monitoring_management/querying_partition_monitoring_data.rst new file mode 100644 index 0000000..f6f3764 --- /dev/null +++ b/api-ref/source/api_description/monitoring_management/querying_partition_monitoring_data.rst @@ -0,0 +1,145 @@ +:original_name: ShowPartitionMetrics.html + +.. _ShowPartitionMetrics: + +Querying Partition Monitoring Data +================================== + +Function +-------- + +This API is used to query the monitoring data of a specified partition of a stream. + +URI +--- + +GET /v2/{project_id}/streams/{stream_name}/partitions/{partition_id}/metrics + +.. table:: **Table 1** Path parameters + + +-----------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+============================================================================================================================================================================+ + | project_id | Yes | String | Project ID. | + +-----------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | stream_name | Yes | String | Name of the stream. | + | | | | | + | | | | Maximum: **60** | + +-----------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | partition_id | Yes | String | Partition No. The value can be in either of the following formats: | + | | | | | + | | | | - shardId-0000000000 | + | | | | | + | | | | - 0 | + | | | | | + | | | | For example, if a stream has three partitions, the partition identifiers are 0, 1, and 2, or shardId-0000000000, shardId-0000000001, and shardId-0000000002, respectively. | + +-----------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. table:: **Table 2** Query parameters + + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+======================================================================================================================================================================================+ + | label | No | String | Partition monitoring metric. (Either label or label_list must be specified. If both label_list and label are specified, label_list prevails.) | + | | | | | + | | | | - total_put_bytes_per_partition: total input traffic of the partition (byte) | + | | | | | + | | | | - total_get_bytes_per_partition: total output traffic of the partition (byte) | + | | | | | + | | | | - total_put_records_per_partition: total number of input records of the partition | + | | | | | + | | | | - total_get_records_per_partition: total number of output records of the partition | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **total_put_bytes_per_partition** | + | | | | | + | | | | - **total_get_bytes_per_partition** | + | | | | | + | | | | - **total_put_records_per_partition** | + | | | | | + | | | | - **total_get_records_per_partition** | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | label_list | No | String | List of labels separated by commas (,) to query multiple labels in batches. (Either label or label_list must be specified. If both label_list and label exist, label_list prevails.) | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | start_time | Yes | Long | Monitoring start time, which is a 10-digit timestamp. | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | end_time | Yes | String | Monitoring end time, which is a 10-digit timestamp. | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Request Parameters +------------------ + +.. table:: **Table 3** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +**Status code: 200** + +.. table:: **Table 4** Response body parameters + + +-----------+----------------------------------------------------------------+--------------+ + | Parameter | Type | Description | + +===========+================================================================+==============+ + | metrics | :ref:`Metrics ` object | Data object. | + +-----------+----------------------------------------------------------------+--------------+ + +.. _showpartitionmetrics__response_metrics: + +.. table:: **Table 5** Metrics + + +------------+------------------------------------------------------------------------------+------------------+ + | Parameter | Type | Description | + +============+==============================================================================+==================+ + | dataPoints | Array of :ref:`DataPoint ` objects | Monitoring data. | + +------------+------------------------------------------------------------------------------+------------------+ + | label | String | Metric. | + +------------+------------------------------------------------------------------------------+------------------+ + +.. _showpartitionmetrics__response_datapoint: + +.. table:: **Table 6** DataPoint + + ========= ==== ================================================ + Parameter Type Description + ========= ==== ================================================ + timestamp Long Timestamp. + value Long Monitoring value corresponding to the timestamp. + ========= ==== ================================================ + +Example Requests +---------------- + +Querying Partition Monitoring Data + +.. code-block:: text + + GET https://{Endpoint}/v2/{project_id}/streams/{stream_name}/partitions/{partition_id}/metrics + +Example Responses +----------------- + +None + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +200 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/monitoring_management/querying_stream_monitoring_data.rst b/api-ref/source/api_description/monitoring_management/querying_stream_monitoring_data.rst new file mode 100644 index 0000000..bf0d67a --- /dev/null +++ b/api-ref/source/api_description/monitoring_management/querying_stream_monitoring_data.rst @@ -0,0 +1,163 @@ +:original_name: ShowStreamMetrics.html + +.. _ShowStreamMetrics: + +Querying Stream Monitoring Data +=============================== + +Function +-------- + +This API is used to query the monitoring data of specified streams. + +URI +--- + +GET /v2/{project_id}/streams/{stream_name}/metrics + +.. table:: **Table 1** Path parameters + + +-----------------+-----------------+-----------------+---------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================+ + | project_id | Yes | String | Project ID. | + +-----------------+-----------------+-----------------+---------------------+ + | stream_name | Yes | String | Name of the stream. | + | | | | | + | | | | Maximum: **60** | + +-----------------+-----------------+-----------------+---------------------+ + +.. table:: **Table 2** Query parameters + + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+================================================================================================================================================================================+ + | label | No | String | Stream monitoring metric. (Either label or label_list must be specified. If both label_list and label are specified, label_list prevails.) | + | | | | | + | | | | - total_put_bytes_per_stream: total input traffic (byte) | + | | | | | + | | | | - total_get_bytes_per_stream: total output traffic (byte) | + | | | | | + | | | | - total_put_records_per_stream: total number of input records | + | | | | | + | | | | - total_get_records_per_stream: total number of output records | + | | | | | + | | | | - total_put_req_latency: average processing time of upload requests (millisecond) | + | | | | | + | | | | - total_get_req_latency: average processing time of download requests (millisecond) | + | | | | | + | | | | - total_put_req_suc_per_stream: number of successful upload requests | + | | | | | + | | | | - total_get_req_suc_per_stream: number of successful download requests | + | | | | | + | | | | - traffic_control_put: number of rejected upload requests due to flow control | + | | | | | + | | | | - traffic_control_get: number of rejected download requests due to flow control | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **total_put_bytes_per_stream** | + | | | | | + | | | | - **total_get_bytes_per_stream** | + | | | | | + | | | | - **total_put_records_per_stream** | + | | | | | + | | | | - **total_get_records_per_stream** | + | | | | | + | | | | - **total_put_req_latency** | + | | | | | + | | | | - **total_get_req_latency** | + | | | | | + | | | | - **total_put_req_suc_per_stream** | + | | | | | + | | | | - **total_get_req_suc_per_stream** | + | | | | | + | | | | - **traffic_control_put** | + | | | | | + | | | | - **traffic_control_get** | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | label_list | No | String | List of labels separated by commas (,) to query multiple labels in batches. (Either label or label_list must be set. If both label_list and label exist, label_list prevails.) | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | start_time | Yes | Long | Monitoring start time, which is a 10-digit timestamp. | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | end_time | Yes | Long | Monitoring end time, which is a 10-digit timestamp. | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Request Parameters +------------------ + +.. table:: **Table 3** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +**Status code: 200** + +.. table:: **Table 4** Response body parameters + + +--------------+-----------------------------------------------------------------------+---------------------------------+ + | Parameter | Type | Description | + +==============+=======================================================================+=================================+ + | metrics | :ref:`Metrics ` object | Data object. | + +--------------+-----------------------------------------------------------------------+---------------------------------+ + | metrics_list | Array of :ref:`Metrics ` objects | List of monitored data objects. | + +--------------+-----------------------------------------------------------------------+---------------------------------+ + +.. _showstreammetrics__response_metrics: + +.. table:: **Table 5** Metrics + + +------------+---------------------------------------------------------------------------+------------------+ + | Parameter | Type | Description | + +============+===========================================================================+==================+ + | dataPoints | Array of :ref:`DataPoint ` objects | Monitoring data. | + +------------+---------------------------------------------------------------------------+------------------+ + | label | String | Metric. | + +------------+---------------------------------------------------------------------------+------------------+ + +.. _showstreammetrics__response_datapoint: + +.. table:: **Table 6** DataPoint + + ========= ==== ================================================ + Parameter Type Description + ========= ==== ================================================ + timestamp Long Timestamp. + value Long Monitoring value corresponding to the timestamp. + ========= ==== ================================================ + +Example Requests +---------------- + +Querying Stream Monitoring Data + +.. code-block:: text + + GET https://{Endpoint}/v2/{project_id}/streams/{stream_name}/metrics + +Example Responses +----------------- + +None + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +200 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/stream_management/adding_permission_policies.rst b/api-ref/source/api_description/stream_management/adding_permission_policies.rst new file mode 100644 index 0000000..6828f65 --- /dev/null +++ b/api-ref/source/api_description/stream_management/adding_permission_policies.rst @@ -0,0 +1,128 @@ +:original_name: CreatePolicies.html + +.. _CreatePolicies: + +Adding Permission Policies +========================== + +Function +-------- + +This API is used to add permission policies to specified streams. + +URI +--- + +POST /v2/{project_id}/streams/{stream_name}/policies + +.. table:: **Table 1** Path parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=======================================================================+ + | project_id | Yes | String | Project ID. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------+ + | stream_name | Yes | String | Name of the stream for which you want to add an authorization policy. | + | | | | | + | | | | Maximum: **64** | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------+ + +Request Parameters +------------------ + +.. table:: **Table 2** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +.. table:: **Table 3** Request body parameters + + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+======================================================================================================================================================================================+ + | stream_id | Yes | String | Unique ID of the stream. | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | principal_name | Yes | String | Authorized user. | + | | | | | + | | | | If the permission is granted to a specified tenant, the format is domainName.*. If the permission is granted to a specified sub-user of a tenant, the format is domainName.userName. | + | | | | | + | | | | Multiple accounts can be added and separated by commas (,), for example, domainName1.userName1,domainName2.userName2. | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | action_type | Yes | String | Authorization operation type. | + | | | | | + | | | | - putRecords: Upload data. | + | | | | | + | | | | - getRecords: Download data. | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **putRecords** | + | | | | | + | | | | - **getRecords** | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | effect | Yes | String | Authorization impact type. | + | | | | | + | | | | - accept: The authorization operation is allowed. | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **accept** | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +None + +Example Requests +---------------- + +- Adding Permission Policies for Tenants + + .. code-block:: text + + POST https://{Endpoint}/v2/{project_id}/streams/{stream_name}/policies + + { + "stream_id" : "CiFdELMr0401K9GGZlp", + "principal_name" : "domainname1", + "action_type" : "putRecords", + "effect" : "accept" + } + +- Adding Permission Policies for Sub-users + + .. code-block:: text + + POST https://{Endpoint}/v2/{project_id}/streams/{stream_name}/policies + + { + "stream_id" : "CiFdELMr0401K9GGZlp", + "principal_name" : "domainname1.username1", + "action_type" : "putRecords", + "effect" : "accept" + } + +Example Responses +----------------- + +None + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +201 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/stream_management/changing_partition_quantity.rst b/api-ref/source/api_description/stream_management/changing_partition_quantity.rst new file mode 100644 index 0000000..bbf212f --- /dev/null +++ b/api-ref/source/api_description/stream_management/changing_partition_quantity.rst @@ -0,0 +1,99 @@ +:original_name: UpdatePartitionCount.html + +.. _UpdatePartitionCount: + +Changing Partition Quantity +=========================== + +Function +-------- + +This API is used to change the number of partitions in a specific stream. + +URI +--- + +PUT /v2/{project_id}/streams/{stream_name} + +.. table:: **Table 1** Path parameters + + +-----------------+-----------------+-----------------+------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+==================================================================+ + | project_id | Yes | String | Project ID. | + +-----------------+-----------------+-----------------+------------------------------------------------------------------+ + | stream_name | Yes | String | Name of the stream whose partition quantity needs to be changed. | + | | | | | + | | | | Maximum: **64** | + +-----------------+-----------------+-----------------+------------------------------------------------------------------+ + +Request Parameters +------------------ + +.. table:: **Table 2** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +.. table:: **Table 3** Request body parameters + + +------------------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +========================+=================+=================+==========================================================================================================================================================================================================================================+ + | stream_name | Yes | String | Name of the stream whose partition quantity needs to be changed. | + | | | | | + | | | | Maximum: **64** | + +------------------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | target_partition_count | Yes | Integer | Number of the target partitions. | + | | | | | + | | | | The value is an integer greater than 0. | + | | | | | + | | | | If the value is greater than the number of current partitions, scaling-up is required. If the value is less than the number of current partitions, scale-down is required. | + | | | | | + | | | | Note: A maximum of five scale-up/down operations can be performed for each stream within one hour. If a scale-up/down operation is successfully performed, you cannot perform one more scale-up/down operation within the next one hour. | + | | | | | + | | | | Minimum: **0** | + +------------------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +None + +Example Requests +---------------- + +Changing Partition Quantity + +.. code-block:: text + + PUT https://{Endpoint}/v2/{project_id}/streams/{stream_name} + + { + "stream_name" : "newstream", + "target_partition_count" : 5 + } + +Example Responses +----------------- + +None + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +200 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/stream_management/creating_streams.rst b/api-ref/source/api_description/stream_management/creating_streams.rst new file mode 100644 index 0000000..135e8a9 --- /dev/null +++ b/api-ref/source/api_description/stream_management/creating_streams.rst @@ -0,0 +1,236 @@ +:original_name: dis_02_0016_01.html + +.. _dis_02_0016_01: + +Creating Streams +================ + +Function +-------- + +This API is used to create a stream. + +- When creating a stream, specify a stream type (common or advanced) and the number of partitions. + +- By default, an account can create a maximum of 10 advanced stream partitions and 50 common stream partitions. You can submit a service ticket to increase the quota. + +URI +--- + +POST /v2/{project_id}/streams + +.. table:: **Table 1** Path parameters + + ========== ========= ====== =========== + Parameter Mandatory Type Description + ========== ========= ====== =========== + project_id Yes String Project ID. + ========== ========= ====== =========== + +Request Parameters +------------------ + +.. table:: **Table 2** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +.. table:: **Table 3** Request body parameters + + +--------------------------------+-----------------+---------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +================================+=================+=====================================================================+======================================================================================================================================================================+ + | stream_name | Yes | String | Name of the stream. | + | | | | | + | | | | The stream name can contain 1 to 64 characters, including letters, digits, underscores (_), and hyphens (-). | + | | | | | + | | | | Maximum: **64** | + +--------------------------------+-----------------+---------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | partition_count | Yes | Integer | Number of partitions. Partitions are the base throughput unit of a DIS stream. | + +--------------------------------+-----------------+---------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | stream_type | No | String | Stream type. | + | | | | | + | | | | - COMMON: a common stream. The bandwidth is 1 MB/s. | + | | | | | + | | | | - ADVANCED: an advanced stream. The bandwidth is 5 MB/s. | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **COMMON** | + | | | | | + | | | | - **ADVANCED** | + +--------------------------------+-----------------+---------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | data_type | No | String | Source data type. | + | | | | | + | | | | - BLOB: a set of binary data stored in a database management system. | + | | | | | + | | | | - JSON: an open-source file format that uses readable text to transmit data objects consisting of attribute values or serialized values. | + | | | | | + | | | | - CSV: a simple text format for storing tabular data in a plain text file. Commas (,) are used as separators by default. | + | | | | | + | | | | Default value: BLOB | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **BLOB** | + | | | | | + | | | | - **JSON** | + | | | | | + | | | | - **CSV** | + +--------------------------------+-----------------+---------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | data_duration | No | Integer | Period of time for which data is retained in the stream. Value range: 24-72 Unit: hour Default value: 24 If this parameter is left blank, the default value is used. | + | | | | | + | | | | Maximum: **168** | + | | | | | + | | | | Default: **24** | + +--------------------------------+-----------------+---------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | auto_scale_enabled | No | Boolean | Specifies whether to enable auto scaling. | + | | | | | + | | | | - true: Auto scaling is enabled. | + | | | | | + | | | | - false: Auto scaling is disabled. | + | | | | | + | | | | This function is disabled by default. | + | | | | | + | | | | Default: **false** | + +--------------------------------+-----------------+---------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | auto_scale_min_partition_count | No | Long | Minimum number of partitions for automatic scale-down when auto scaling is enabled. | + | | | | | + | | | | Minimum: **1** | + +--------------------------------+-----------------+---------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | auto_scale_max_partition_count | No | Integer | Maximum number of partitions for automatic scale-up when auto scaling is enabled. | + +--------------------------------+-----------------+---------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | data_schema | No | String | Source data structure that defines JSON and CSV formats. It is described in the syntax of the Avro schema. | + +--------------------------------+-----------------+---------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | csv_properties | No | :ref:`CSVProperties ` object | Attributes of data in CSV format, such as delimiter. | + +--------------------------------+-----------------+---------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | compression_format | No | String | Compression type of data. Currently, the value can be: | + | | | | | + | | | | - snappy | + | | | | | + | | | | - gzip | + | | | | | + | | | | - zip | + | | | | | + | | | | Data is not compressed by default. | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **snappy** | + | | | | | + | | | | - **gzip** | + | | | | | + | | | | - **zip** | + +--------------------------------+-----------------+---------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | tags | No | Array of :ref:`Tag ` objects | List of stream tags. | + +--------------------------------+-----------------+---------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | sys_tags | No | Array of :ref:`SysTag ` objects | Stream enterprise projects. | + +--------------------------------+-----------------+---------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _dis_02_0016_01__request_csvproperties: + +.. table:: **Table 4** CSVProperties + + ========= ========= ====== =============== + Parameter Mandatory Type Description + ========= ========= ====== =============== + delimiter No String Data separator. + ========= ========= ====== =============== + +.. _dis_02_0016_01__request_tag: + +.. table:: **Table 5** Tag + + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+============================================================================================+ + | key | No | String | Key. | + | | | | | + | | | | - This field cannot be left blank. | + | | | | | + | | | | - The key value of a resource must be unique. | + | | | | | + | | | | - Character set: A-Z, a-z, 0-9, '-', '_', and Unicode characters (\\u4E00-\\u9FFF). | + | | | | | + | | | | Minimum: **1** | + | | | | | + | | | | Maximum: **36** | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------+ + | value | No | String | Value. | + | | | | | + | | | | - The value contains a maximum of 43 characters. | + | | | | | + | | | | - Character set: A-Z, a-z, 0-9, '. ', '-', '_', and Unicode characters (\\u4E00-\\u9FFF). | + | | | | | + | | | | - The value can contain only digits, letters, hyphens (-), and underscores (_). | + | | | | | + | | | | Minimum: **0** | + | | | | | + | | | | Maximum: **43** | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------+ + +.. _dis_02_0016_01__request_systag: + +.. table:: **Table 6** SysTag + + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+==============================================================================================================+ + | key | No | String | Key. | + | | | | | + | | | | - This field cannot be left blank. | + | | | | | + | | | | - The value must be \_sys_enterprise_project_id. | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **\_sys_enterprise_project_id** | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | value | No | String | Value. The value is the enterprise project ID, which needs to be obtained on the enterprise management page. | + | | | | | + | | | | - 36-digit UUID | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +None + +Example Requests +---------------- + +Creating Streams + +.. code-block:: text + + POST https://{Endpoint}/v2/{project_id}/streams + + { + "stream_name" : "newstream", + "partition_count" : 3, + "data_duration" : 24 + } + +Example Responses +----------------- + +None + +Status Codes +------------ + +=========== =========== +Status Code Description +=========== =========== +201 Created +=========== =========== + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/stream_management/deleting_specified_streams.rst b/api-ref/source/api_description/stream_management/deleting_specified_streams.rst new file mode 100644 index 0000000..0f96d01 --- /dev/null +++ b/api-ref/source/api_description/stream_management/deleting_specified_streams.rst @@ -0,0 +1,74 @@ +:original_name: DeleteStream.html + +.. _DeleteStream: + +Deleting Specified Streams +========================== + +Function +-------- + +This API is used to delete specified streams. + +URI +--- + +DELETE /v2/{project_id}/streams/{stream_name} + +.. table:: **Table 1** Path parameters + + +-----------------+-----------------+-----------------+-----------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+===================================+ + | project_id | Yes | String | Project ID. | + +-----------------+-----------------+-----------------+-----------------------------------+ + | stream_name | Yes | String | Name of the stream to be deleted. | + | | | | | + | | | | Maximum: **60** | + +-----------------+-----------------+-----------------+-----------------------------------+ + +Request Parameters +------------------ + +.. table:: **Table 2** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +None + +Example Requests +---------------- + +Deleting Specified Streams + +.. code-block:: text + + DELETE https://{Endpoint}/v2/{project_id}/streams/{stream_name} + +Example Responses +----------------- + +None + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +204 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/stream_management/index.rst b/api-ref/source/api_description/stream_management/index.rst new file mode 100644 index 0000000..c4ed4d9 --- /dev/null +++ b/api-ref/source/api_description/stream_management/index.rst @@ -0,0 +1,28 @@ +:original_name: topic_300000000.html + +.. _topic_300000000: + +Stream Management +================= + +- :ref:`Creating Streams ` +- :ref:`Querying Streams ` +- :ref:`Deleting Specified Streams ` +- :ref:`Querying Stream Details ` +- :ref:`Changing Partition Quantity ` +- :ref:`Updating Stream Information ` +- :ref:`Adding Permission Policies ` +- :ref:`Querying Permission Policies ` + +.. toctree:: + :maxdepth: 1 + :hidden: + + creating_streams + querying_streams + deleting_specified_streams + querying_stream_details + changing_partition_quantity + updating_stream_information + adding_permission_policies + querying_permission_policies diff --git a/api-ref/source/api_description/stream_management/querying_permission_policies.rst b/api-ref/source/api_description/stream_management/querying_permission_policies.rst new file mode 100644 index 0000000..2ef274b --- /dev/null +++ b/api-ref/source/api_description/stream_management/querying_permission_policies.rst @@ -0,0 +1,132 @@ +:original_name: ListPolicies.html + +.. _ListPolicies: + +Querying Permission Policies +============================ + +Function +-------- + +This API is used to query permission policies of specified streams. + +URI +--- + +GET /v2/{project_id}/streams/{stream_name}/policies + +.. table:: **Table 1** Path parameters + + +-----------------+-----------------+-----------------+---------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=======================================+ + | project_id | Yes | String | Project ID. | + +-----------------+-----------------+-----------------+---------------------------------------+ + | stream_name | Yes | String | Name of the DIS stream to be created. | + | | | | | + | | | | Maximum: **60** | + +-----------------+-----------------+-----------------+---------------------------------------+ + +Request Parameters +------------------ + +.. table:: **Table 2** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +**Status code: 200** + +.. table:: **Table 3** Response body parameters + + +-----------+------------------------------------------------------------------------------+--------------------------------------------+ + | Parameter | Type | Description | + +===========+==============================================================================+============================================+ + | stream_id | String | Unique ID of the stream. | + +-----------+------------------------------------------------------------------------------+--------------------------------------------+ + | rules | Array of :ref:`PrincipalRule ` objects | List of authorization information records. | + +-----------+------------------------------------------------------------------------------+--------------------------------------------+ + +.. _listpolicies__response_principalrule: + +.. table:: **Table 4** PrincipalRule + + +-----------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+=============================================================================================================================================================================================+ + | principal | String | ID of the authorized user. | + +-----------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | principal_name | String | Name of the authorized user. | + | | | | + | | | If the permission is granted to all sub-users of a tenant, the format is domainName.*. If the permission is granted to a specified sub-user of a tenant, the format is domainName.userName. | + +-----------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | action_type | String | Authorization operation type. | + | | | | + | | | - putRecords: Upload data. | + | | | | + | | | - getRecords: Download data. | + | | | | + | | | Enumeration values: | + | | | | + | | | - **putRecords** | + | | | | + | | | - **getRecords** | + +-----------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | effect | String | Authorization impact type. | + | | | | + | | | - accept: The authorization operation is allowed. | + | | | | + | | | Enumeration values: | + | | | | + | | | - **accept** | + +-----------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Example Requests +---------------- + +Querying Permission Policies + +.. code-block:: text + + GET https://{Endpoint}/v2/{project_id}/streams/{stream_name}/policies + +Example Responses +----------------- + +**Status code: 200** + +Normal response. + +.. code-block:: + + { + "streamId" : "CiFdELMr0401K9GGZlp", + "rules" : [ { + "action_type" : "putRecords", + "principal" : "3b3f237122574xxxxb74482ae11005ba.*", + "principal_name" : "anotherusername", + "effect" : "accept" + } ] + } + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +200 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/stream_management/querying_stream_details.rst b/api-ref/source/api_description/stream_management/querying_stream_details.rst new file mode 100644 index 0000000..3ba34fa --- /dev/null +++ b/api-ref/source/api_description/stream_management/querying_stream_details.rst @@ -0,0 +1,360 @@ +:original_name: dis_02_0025.html + +.. _dis_02_0025: + +Querying Stream Details +======================= + +Function +-------- + +This API is used to query details about a specified stream. + +URI +--- + +GET /v2/{project_id}/streams/{stream_name} + +.. table:: **Table 1** Path parameters + + +-----------------+-----------------+-----------------+-----------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=======================+ + | project_id | Yes | String | Project ID. | + +-----------------+-----------------+-----------------+-----------------------+ + | stream_name | Yes | String | Stream to be queried. | + | | | | | + | | | | Maximum: **60** | + +-----------------+-----------------+-----------------+-----------------------+ + +.. table:: **Table 2** Query parameters + + +-------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +===================+=================+=================+======================================================================================================================+ + | start_partitionId | No | String | Name of the partition to start the partition list with. The returned partition list does not contain this partition. | + +-------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------+ + | limit_partitions | No | Integer | Maximum number of partitions to list in a single API call. Value range: 1-1,000 Default value: 100 | + | | | | | + | | | | Minimum: **1** | + | | | | | + | | | | Maximum: **1000** | + | | | | | + | | | | Default: **100** | + +-------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------+ + +Request Parameters +------------------ + +.. table:: **Table 3** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +**Status code: 200** + +.. table:: **Table 4** Response body parameters + + +--------------------------------+-------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +================================+===========================================================================================+===============================================================================================================================================================================+ + | stream_name | String | Name of the stream. | + +--------------------------------+-------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | create_time | Long | Time when a stream is created. The value is a 13-bit timestamp. | + +--------------------------------+-------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | last_modified_time | Long | Time when a stream is the most recently modified. The value is a 13-bit timestamp. | + +--------------------------------+-------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | status | String | Current status of the stream. Possible values: | + | | | | + | | | - CREATING: The stream is being created. | + | | | | + | | | - RUNNING: The stream is running. | + | | | | + | | | - TERMINATING: The stream is being deleted. | + | | | | + | | | - TERMINATED: The stream has been deleted. | + | | | | + | | | Enumeration values: | + | | | | + | | | - **CREATING** | + | | | | + | | | - **RUNNING** | + | | | | + | | | - **TERMINATING** | + | | | | + | | | - **FROZEN** | + +--------------------------------+-------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | stream_type | String | Stream type. | + | | | | + | | | - COMMON: a common stream. The bandwidth is 1 MB/s. | + | | | | + | | | - ADVANCED: an advanced stream. The bandwidth is 5 MB/s. | + | | | | + | | | Enumeration values: | + | | | | + | | | - **COMMON** | + | | | | + | | | - **ADVANCED** | + +--------------------------------+-------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | partitions | Array of :ref:`PartitionResult ` objects | A list of partitions that comprise the DIS stream. | + +--------------------------------+-------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | has_more_partitions | Boolean | Specifies whether there are more matching partitions of the DIS stream to list. | + | | | | + | | | - true: yes | + | | | | + | | | - false: no | + +--------------------------------+-------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | retention_period | Integer | Period for storing data in units of hours. | + +--------------------------------+-------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | stream_id | String | Unique identifier of the stream. | + +--------------------------------+-------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | data_type | String | Source data type. | + | | | | + | | | - BLOB: a set of binary data stored in a database management system. | + | | | | + | | | - JSON: an open-source file format that uses readable text to transmit data objects consisting of attribute values or serialized values. | + | | | | + | | | - CSV: a simple text format for storing tabular data in a plain text file. Commas (,) are used as separators by default. | + | | | | + | | | Default value: BLOB | + | | | | + | | | Enumeration values: | + | | | | + | | | - **BLOB** | + | | | | + | | | - **JSON** | + | | | | + | | | - **CSV** | + +--------------------------------+-------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | data_schema | String | Source data structure that defines JSON and CSV formats. It is described in the syntax of the Avro schema. For details about Avro, go to http://avro.apache.org/docs/current/ | + +--------------------------------+-------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | compression_format | String | Compression type of data. Currently, the value can be: | + | | | | + | | | - snappy | + | | | | + | | | - gzip | + | | | | + | | | - zip | + | | | | + | | | Data is not compressed by default. | + | | | | + | | | Enumeration values: | + | | | | + | | | - **snappy** | + | | | | + | | | - **gzip** | + | | | | + | | | - **zip** | + +--------------------------------+-------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | csv_properties | :ref:`CSVProperties ` object | Attributes of data in CSV format, such as delimiter. | + +--------------------------------+-------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | writable_partition_count | Integer | Total number of writable partitions (including partitions in ACTIVE state only). | + +--------------------------------+-------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | readable_partition_count | Integer | Total number of readable partitions (including partitions in ACTIVE and DELETED state). | + +--------------------------------+-------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | update_partition_counts | Array of :ref:`UpdatePartitionCount ` objects | List of scaling operation records. | + +--------------------------------+-------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | tags | Array of :ref:`Tag ` objects | List of stream tags. | + +--------------------------------+-------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | sys_tags | Array of :ref:`SysTag ` objects | Enterprise project of a stream. | + +--------------------------------+-------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | auto_scale_enabled | Boolean | Specifies whether to enable auto scaling. | + | | | | + | | | - true: auto scaling is enabled. | + | | | | + | | | - false: auto scaling is disabled. | + | | | | + | | | This function is disabled by default. | + +--------------------------------+-------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | auto_scale_min_partition_count | Integer | Minimum number of partitions for automatic scale-down when auto scaling is enabled. | + +--------------------------------+-------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | auto_scale_max_partition_count | Integer | Maximum number of partitions for automatic scale-up when auto scaling is enabled. | + +--------------------------------+-------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _dis_02_0025__response_partitionresult: + +.. table:: **Table 5** PartitionResult + + +-----------------------+-----------------------+-------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+=============================================================+ + | status | String | Current status of the partition. Possible values: | + | | | | + | | | - CREATING: The stream is being created. | + | | | | + | | | - ACTIVE: The stream is available. | + | | | | + | | | - DELETED: The stream is being deleted. | + | | | | + | | | - EXPIRED: The stream has expired. | + | | | | + | | | Enumeration values: | + | | | | + | | | - **CREATING** | + | | | | + | | | - **ACTIVE** | + | | | | + | | | - **DELETED** | + | | | | + | | | - **EXPIRED** | + +-----------------------+-----------------------+-------------------------------------------------------------+ + | partition_id | String | Unique identifier of the partition. | + +-----------------------+-----------------------+-------------------------------------------------------------+ + | hash_range | String | Possible value range of the hash key used by the partition. | + +-----------------------+-----------------------+-------------------------------------------------------------+ + | sequence_number_range | String | Sequence number range of the partition. | + +-----------------------+-----------------------+-------------------------------------------------------------+ + | parent_partitions | String | Parent partition. | + +-----------------------+-----------------------+-------------------------------------------------------------+ + +.. _dis_02_0025__response_csvproperties: + +.. table:: **Table 6** CSVProperties + + ========= ====== =============== + Parameter Type Description + ========= ====== =============== + delimiter String Data separator. + ========= ====== =============== + +.. _dis_02_0025__response_updatepartitioncount: + +.. table:: **Table 7** UpdatePartitionCount + + +------------------------+-----------------------+-------------------------------------------------------------+ + | Parameter | Type | Description | + +========================+=======================+=============================================================+ + | create_timestamp | Long | Scaling execution timestamp, which is a 13-digit timestamp. | + +------------------------+-----------------------+-------------------------------------------------------------+ + | src_partition_count | Integer | Number of partitions before scaling. | + +------------------------+-----------------------+-------------------------------------------------------------+ + | target_partition_count | Integer | Number of partitions after scaling. | + +------------------------+-----------------------+-------------------------------------------------------------+ + | result_code | Integer | Response code of the scaling operation. | + +------------------------+-----------------------+-------------------------------------------------------------+ + | result_msg | Integer | Response to the scaling operation. | + +------------------------+-----------------------+-------------------------------------------------------------+ + | auto_scale | Boolean | Specifies whether the scaling operation is automatic. | + | | | | + | | | - true: Auto scaling is enabled. | + | | | | + | | | - false: Manual scaling is enabled. | + +------------------------+-----------------------+-------------------------------------------------------------+ + +.. _dis_02_0025__response_tag: + +.. table:: **Table 8** Tag + + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+============================================================================================+ + | key | String | Key. | + | | | | + | | | - This field cannot be left blank. | + | | | | + | | | - The key value of a resource must be unique. | + | | | | + | | | - Character set: A-Z, a-z, 0-9, '-', '_', and Unicode characters (\\u4E00-\\u9FFF). | + | | | | + | | | Minimum: **1** | + | | | | + | | | Maximum: **36** | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------+ + | value | String | Value. | + | | | | + | | | - The value contains a maximum of 43 characters. | + | | | | + | | | - Character set: A-Z, a-z, 0-9, '. ', '-', '_', and Unicode characters (\\u4E00-\\u9FFF). | + | | | | + | | | - The value can contain only digits, letters, hyphens (-), and underscores (_). | + | | | | + | | | Minimum: **0** | + | | | | + | | | Maximum: **43** | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------+ + +.. _dis_02_0025__response_systag: + +.. table:: **Table 9** SysTag + + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+==============================================================================================================+ + | key | String | Key. | + | | | | + | | | - This field cannot be left blank. | + | | | | + | | | - The value must be \_sys_enterprise_project_id. | + | | | | + | | | Enumeration values: | + | | | | + | | | - **\_sys_enterprise_project_id** | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------+ + | value | String | Value. The value is the enterprise project ID, which needs to be obtained on the enterprise management page. | + | | | | + | | | - 36-digit UUID | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------+ + +Example Requests +---------------- + +Querying Stream Details + +.. code-block:: text + + GET https://{Endpoint}/v2/{project_id}/streams/{stream_name} + +Example Responses +----------------- + +**Status code: 200** + +Normal response. + +.. code-block:: + + { + "stream_id" : "8QM3Nt9YTLOwtUVYJhO", + "stream_name" : "newstream", + "create_time" : 1593569685875, + "last_modified_time" : "1599050091026,", + "retention_period" : 24, + "status" : "RUNNING", + "stream_type" : "COMMON", + "data_type" : "BLOB", + "writable_partition_count" : 1, + "readable_partition_count" : 1, + "tags" : [ ], + "auto_scale_enabled" : false, + "auto_scale_min_partition_count" : 0, + "auto_scale_max_partition_count" : 0, + "partitions" : [ { + "status" : "ACTIVE", + "partition_id" : "shardId-0000000000", + "hash_range" : "[0 : 9223372036854775807]", + "sequence_number_range" : "[289911 : 289927]" + } ], + "has_more_partitions" : false + } + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +200 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/stream_management/querying_streams.rst b/api-ref/source/api_description/stream_management/querying_streams.rst new file mode 100644 index 0000000..28fbabe --- /dev/null +++ b/api-ref/source/api_description/stream_management/querying_streams.rst @@ -0,0 +1,276 @@ +:original_name: dis_02_0024.html + +.. _dis_02_0024: + +Querying Streams +================ + +Function +-------- + +This API is used to query all streams created by the current tenant. + +During the query, specify the stream from which the stream list is returned and the maximum number of streams to be returned for a single request. + +URI +--- + +GET /v2/{project_id}/streams + +.. table:: **Table 1** Path parameters + + ========== ========= ====== =========== + Parameter Mandatory Type Description + ========== ========= ====== =========== + project_id Yes String Project ID. + ========== ========= ====== =========== + +.. table:: **Table 2** Query parameters + + +-------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +===================+=================+=================+=========================================================================================================================================================================================================================================================================================+ + | limit | No | Integer | The maximum number of DIS streams to list in a single API call. | + | | | | | + | | | | Value range: 1-100 Default value: 10 | + | | | | | + | | | | Minimum: **1** | + | | | | | + | | | | Maximum: **100** | + | | | | | + | | | | Default: **10** | + +-------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | start_stream_name | No | String | Name of the DIS stream to start the stream list with. The returned stream list does not contain this DIS stream name. | + | | | | | + | | | | If pagination query is required, this parameter is not transferred for query on the first page. If the value of has_more_streams is true, the query is performed on the next page. The value of start_stream_name is the name of the last stream in the query result of the first page. | + +-------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Request Parameters +------------------ + +.. table:: **Table 3** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +**Status code: 200** + +.. table:: **Table 4** Response body parameters + + +-----------------------+-----------------------------------------------------------------------+-------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================================================================+===============================================================================+ + | total_number | Long | Total number of all the DIS streams created by the current tenant. | + +-----------------------+-----------------------------------------------------------------------+-------------------------------------------------------------------------------+ + | stream_names | Array of strings | List of the streams meeting the current requests. | + +-----------------------+-----------------------------------------------------------------------+-------------------------------------------------------------------------------+ + | has_more_streams | Boolean | Specify whether there are more matching DIS streams to list. Possible values: | + | | | | + | | | - true: yes | + | | | | + | | | - false: no | + | | | | + | | | Default: **false** | + +-----------------------+-----------------------------------------------------------------------+-------------------------------------------------------------------------------+ + | stream_info_list | Array of :ref:`StreamInfo ` objects | Stream details. | + +-----------------------+-----------------------------------------------------------------------+-------------------------------------------------------------------------------+ + +.. _dis_02_0024__response_streaminfo: + +.. table:: **Table 5** StreamInfo + + +--------------------------------+---------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +================================+===============================================================+========================================================================================================================================================+ + | stream_name | String | Name of the stream. | + +--------------------------------+---------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+ + | create_time | Long | Time when the stream is created. The value is a 13-bit timestamp. | + +--------------------------------+---------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+ + | retention_period | Integer | Period for storing data in units of hours. | + +--------------------------------+---------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+ + | status | String | Current status of the stream. Possible values: | + | | | | + | | | - CREATING: The stream is being created. | + | | | | + | | | - RUNNING: The stream is running. | + | | | | + | | | - TERMINATING: The stream is being deleted. | + | | | | + | | | - TERMINATED: The stream has been deleted. | + | | | | + | | | Enumeration values: | + | | | | + | | | - **CREATING** | + | | | | + | | | - **RUNNING** | + | | | | + | | | - **TERMINATING** | + | | | | + | | | - **FROZEN** | + +--------------------------------+---------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+ + | stream_type | String | Stream type. | + | | | | + | | | - COMMON: a common stream. The bandwidth is 1 MB/s. | + | | | | + | | | - ADVANCED: an advanced stream. The bandwidth is 5 MB/s. | + | | | | + | | | Enumeration values: | + | | | | + | | | - **COMMON** | + | | | | + | | | - **ADVANCED** | + +--------------------------------+---------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+ + | data_type | String | Source data type. | + | | | | + | | | - BLOB: a collection of binary data stored as a single entity in a database management system. | + | | | | + | | | - JSON: an open-standard file format that uses human-readable text to transmit data objects consisting of attribute-value pairs and array data types. | + | | | | + | | | - CSV: a simple text format for storing tabular data in a plain text file. Commas are used as delimiters. | + | | | | + | | | Default value: BLOB | + | | | | + | | | Enumeration values: | + | | | | + | | | - **BLOB** | + | | | | + | | | - **JSON** | + | | | | + | | | - **CSV** | + +--------------------------------+---------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+ + | partition_count | Integer | Quantity of partitions. Partitions are the base throughput unit of a DIS stream. | + +--------------------------------+---------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+ + | auto_scale_enabled | Boolean | Specifies whether to enable auto scaling. | + | | | | + | | | - true: auto scaling is enabled. | + | | | | + | | | - false: auto scaling is disabled. | + | | | | + | | | This function is disabled by default. | + | | | | + | | | Default: **false** | + +--------------------------------+---------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+ + | auto_scale_min_partition_count | Integer | Minimum number of partitions for automatic scale-down when auto scaling is enabled. | + | | | | + | | | Minimum: **1** | + +--------------------------------+---------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+ + | auto_scale_max_partition_count | Integer | Maximum number of partitions for automatic scale-up when auto scaling is enabled. | + +--------------------------------+---------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+ + | tags | Array of :ref:`Tag ` objects | List of stream tags. | + +--------------------------------+---------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+ + | sys_tags | Array of :ref:`SysTag ` objects | Stream enterprise projects. | + +--------------------------------+---------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _dis_02_0024__response_tag: + +.. table:: **Table 6** Tag + + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+============================================================================================+ + | key | String | Key. | + | | | | + | | | - This field cannot be left blank. | + | | | | + | | | - The key value of a resource must be unique. | + | | | | + | | | - Character set: A-Z, a-z, 0-9, '-', '_', and Unicode characters (\\u4E00-\\u9FFF). | + | | | | + | | | Minimum: **1** | + | | | | + | | | Maximum: **36** | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------+ + | value | String | Value. | + | | | | + | | | - The value contains a maximum of 43 characters. | + | | | | + | | | - Character set: A-Z, a-z, 0-9, '. ', '-', '_', and Unicode characters (\\u4E00-\\u9FFF). | + | | | | + | | | - The value can contain only digits, letters, hyphens (-), and underscores (_). | + | | | | + | | | Minimum: **0** | + | | | | + | | | Maximum: **43** | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------+ + +.. _dis_02_0024__response_systag: + +.. table:: **Table 7** SysTag + + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+==============================================================================================================+ + | key | String | Key. | + | | | | + | | | - This field cannot be left blank. | + | | | | + | | | - The value must be \_sys_enterprise_project_id. | + | | | | + | | | Enumeration values: | + | | | | + | | | - **\_sys_enterprise_project_id** | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------+ + | value | String | Value. The value is the enterprise project ID, which needs to be obtained on the enterprise management page. | + | | | | + | | | - 36-digit UUID | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------+ + +Example Requests +---------------- + +Querying Streams + +.. code-block:: text + + GET https://{Endpoint}/v2/{project_id}/streams + +Example Responses +----------------- + +**Status code: 200** + +Normal response. + +.. code-block:: + + { + "total_number" : 1, + "stream_names" : [ "newstream" ], + "stream_info_list" : [ { + "stream_id" : "8QM3Nt9YTLOwtUVYJhO", + "stream_name" : "newstream", + "create_time" : 1593569685875, + "retention_period" : 24, + "status" : "RUNNING", + "stream_type" : "COMMON", + "data_type" : "BLOB", + "partition_count" : 1, + "tags" : [ ], + "auto_scale_enabled" : false, + "auto_scale_min_partition_count" : 0, + "auto_scale_max_partition_count" : 0 + } ], + "has_more_streams" : false + } + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +200 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/stream_management/updating_stream_information.rst b/api-ref/source/api_description/stream_management/updating_stream_information.rst new file mode 100644 index 0000000..81c2356 --- /dev/null +++ b/api-ref/source/api_description/stream_management/updating_stream_information.rst @@ -0,0 +1,134 @@ +:original_name: UpdateStream.html + +.. _UpdateStream: + +Updating Stream Information +=========================== + +Function +-------- + +This API is used to update the information about specified streams. + +URI +--- + +PUT /v3/{project_id}/streams/{stream_name} + +.. table:: **Table 1** Path parameters + + +-------------+-----------+--------+------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=============+===========+========+==================================================================+ + | project_id | Yes | String | Project ID. | + +-------------+-----------+--------+------------------------------------------------------------------+ + | stream_name | Yes | String | Name of the stream whose partition quantity needs to be changed. | + +-------------+-----------+--------+------------------------------------------------------------------+ + +Request Parameters +------------------ + +.. table:: **Table 2** Request body parameters + + +--------------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +================================+=================+=================+======================================================================================================================================================================+ + | stream_name | Yes | String | Name of the stream to be updated. | + | | | | | + | | | | Maximum: **64** | + +--------------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | data_duration | No | Integer | Period of time for which data is retained in the stream. Value range: 24-72 Unit: hour Default value: 24 If this parameter is left blank, the default value is used. | + | | | | | + | | | | Maximum: **168** | + | | | | | + | | | | Default: **24** | + +--------------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | data_type | No | String | Source data type. | + | | | | | + | | | | - BLOB: a collection of binary data stored as a single entity in a database management system. | + | | | | | + | | | | - JSON: an open-standard file format that uses human-readable text to transmit data objects consisting of attribute-value pairs and array data types. | + | | | | | + | | | | - CSV: a simple text format for storing tabular data in a plain text file. Commas are used as delimiters. | + | | | | | + | | | | Default value: BLOB | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **BLOB** | + | | | | | + | | | | - **JSON** | + | | | | | + | | | | - **CSV** | + +--------------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | data_schema | No | String | Source data structure that defines JSON and CSV formats. It is described in the syntax of the Avro schema. | + +--------------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | auto_scale_enabled | No | Boolean | Specifies whether to enable auto scaling. | + | | | | | + | | | | - true: auto scaling is enabled. | + | | | | | + | | | | - false: auto scaling is disabled. This function is disabled by default. | + | | | | | + | | | | Default: **false** | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **true** | + | | | | | + | | | | - **false** | + +--------------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | auto_scale_min_partition_count | No | Long | Minimum number of partitions for automatic scale-down when auto scaling is enabled. | + | | | | | + | | | | Minimum: **1** | + +--------------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | auto_scale_max_partition_count | No | Long | Maximum number of partitions for automatic scale-up when auto scaling is enabled. | + +--------------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +None + +Example Requests +---------------- + +- Updating Lifecycles of Streams + + .. code-block:: text + + PUT https://{Endpoint}/v3/{project_id}/streams/{stream_name} + + { + "stream_name" : "stz_test", + "data_duration" : 48 + } + +- Updating Stream Types + + .. code-block:: text + + PUT https://{Endpoint}/v3/{project_id}/streams/{stream_name} + + { + "stream_name" : "stz_test", + "data_type" : "JSON" + } + +Example Responses +----------------- + +None + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +204 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/tag_management/adding_resource_tags_in_batches.rst b/api-ref/source/api_description/tag_management/adding_resource_tags_in_batches.rst new file mode 100644 index 0000000..e520c65 --- /dev/null +++ b/api-ref/source/api_description/tag_management/adding_resource_tags_in_batches.rst @@ -0,0 +1,130 @@ +:original_name: BatchCreateTags.html + +.. _BatchCreateTags: + +Adding Resource Tags in Batches +=============================== + +Function +-------- + +This API is used to add resource tags (such as stream tags) in batches. The API is idempotent. When you are creating tags, if there are duplicate keys in the request body, an error is reported. During tag creation, duplicate keys are not allowed. If a key exists in the database, its value will be overwritten. + +URI +--- + +POST /v2/{project_id}/stream/{stream_id}/tags/action + +.. table:: **Table 1** Path parameters + + ========== ========= ====== =========== + Parameter Mandatory Type Description + ========== ========= ====== =========== + project_id Yes String Project ID. + stream_id Yes String Stream ID. + ========== ========= ====== =========== + +Request Parameters +------------------ + +.. table:: **Table 2** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +.. table:: **Table 3** Request body parameters + + +-----------------+-----------------+------------------------------------------------------------+----------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+============================================================+==========================================================+ + | action | Yes | String | Operation to be performed. The value can be create only. | + | | | | | + | | | | - create: batch creation | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **create** | + +-----------------+-----------------+------------------------------------------------------------+----------------------------------------------------------+ + | tags | Yes | Array of :ref:`Tag ` objects | Tag list. | + +-----------------+-----------------+------------------------------------------------------------+----------------------------------------------------------+ + +.. _batchcreatetags__request_tag: + +.. table:: **Table 4** Tag + + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+============================================================================================+ + | key | No | String | Key. | + | | | | | + | | | | - This field cannot be left blank. | + | | | | | + | | | | - The key value of a resource must be unique. | + | | | | | + | | | | - Character set: A-Z, a-z, 0-9, '-', '_', and Unicode characters (\\u4E00-\\u9FFF). | + | | | | | + | | | | Minimum: **1** | + | | | | | + | | | | Maximum: **36** | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------+ + | value | No | String | Value. | + | | | | | + | | | | - The value contains a maximum of 43 characters. | + | | | | | + | | | | - Character set: A-Z, a-z, 0-9, '. ', '-', '_', and Unicode characters (\\u4E00-\\u9FFF). | + | | | | | + | | | | - The value can contain only digits, letters, hyphens (-), and underscores (_). | + | | | | | + | | | | Minimum: **0** | + | | | | | + | | | | Maximum: **43** | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +None + +Example Requests +---------------- + +Adding Resource Tags in Batches + +.. code-block:: text + + POST https://{Endpoint}/v2/{project_id}/stream/{stream_id}/tags/action + + { + "action" : "create", + "tags" : [ { + "key" : "key1", + "value" : "value1" + }, { + "key" : "key2", + "value" : "value3" + } ] + } + +Example Responses +----------------- + +None + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +204 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/tag_management/adding_tags_for_specified_streams.rst b/api-ref/source/api_description/tag_management/adding_tags_for_specified_streams.rst new file mode 100644 index 0000000..136bf71 --- /dev/null +++ b/api-ref/source/api_description/tag_management/adding_tags_for_specified_streams.rst @@ -0,0 +1,121 @@ +:original_name: CreateTag.html + +.. _CreateTag: + +Adding Tags for Specified Streams +================================= + +Function +-------- + +This API is used to add tags to specified streams. + +URI +--- + +POST /v2/{project_id}/stream/{stream_id}/tags + +.. table:: **Table 1** Path parameters + + +-----------------+-----------------+-----------------+-----------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=================+ + | project_id | Yes | String | Project ID. | + +-----------------+-----------------+-----------------+-----------------+ + | stream_id | Yes | String | Stream ID. | + | | | | | + | | | | Maximum: **60** | + +-----------------+-----------------+-----------------+-----------------+ + +Request Parameters +------------------ + +.. table:: **Table 2** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +.. table:: **Table 3** Request body parameters + + +-----------+-----------+--------------------------------------------+---------------+ + | Parameter | Mandatory | Type | Description | + +===========+===========+============================================+===============+ + | tag | Yes | :ref:`Tag ` object | Label object. | + +-----------+-----------+--------------------------------------------+---------------+ + +.. _createtag__request_tag: + +.. table:: **Table 4** Tag + + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+============================================================================================+ + | key | No | String | Key. | + | | | | | + | | | | - This field cannot be left blank. | + | | | | | + | | | | - The key value of a resource must be unique. | + | | | | | + | | | | - Character set: A-Z, a-z, 0-9, '-', '_', and Unicode characters (\\u4E00-\\u9FFF). | + | | | | | + | | | | Minimum: **1** | + | | | | | + | | | | Maximum: **36** | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------+ + | value | No | String | Value. | + | | | | | + | | | | - The value contains a maximum of 43 characters. | + | | | | | + | | | | - Character set: A-Z, a-z, 0-9, '. ', '-', '_', and Unicode characters (\\u4E00-\\u9FFF). | + | | | | | + | | | | - The value can contain only digits, letters, hyphens (-), and underscores (_). | + | | | | | + | | | | Minimum: **0** | + | | | | | + | | | | Maximum: **43** | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +None + +Example Requests +---------------- + +Adding Tags for Specified Streams + +.. code-block:: text + + POST https://{Endpoint}/v2/{project_id}/stream/{stream_id}/tags + + { + "tag" : { + "key" : "key", + "value" : "value" + } + } + +Example Responses +----------------- + +None + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +204 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/tag_management/deleting_resource_tags_in_batches.rst b/api-ref/source/api_description/tag_management/deleting_resource_tags_in_batches.rst new file mode 100644 index 0000000..af1eb14 --- /dev/null +++ b/api-ref/source/api_description/tag_management/deleting_resource_tags_in_batches.rst @@ -0,0 +1,130 @@ +:original_name: BatchDeleteTags.html + +.. _BatchDeleteTags: + +Deleting Resource Tags in Batches +================================= + +Function +-------- + +This API is used to delete resource tags (stream tags) in batches. This API is idempotent. If the deleted tag does not exist, the deletion is considered successful by default. The tag character set range is not verified during tag deletion. When you delete tags, the tag structure cannot be missing, and the key cannot be left blank or be an empty string. + +URI +--- + +POST /v2/{project_id}/stream/{stream_id}/tags/action + +.. table:: **Table 1** Path parameters + + ========== ========= ====== =========== + Parameter Mandatory Type Description + ========== ========= ====== =========== + project_id Yes String Project ID. + stream_id Yes String Stream ID. + ========== ========= ====== =========== + +Request Parameters +------------------ + +.. table:: **Table 2** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +.. table:: **Table 3** Request body parameters + + +-----------------+-----------------+------------------------------------------------------------+----------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+============================================================+==========================================================+ + | action | Yes | String | Operation to be performed. The value can be delete only. | + | | | | | + | | | | - delete: batch deletion | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **delete** | + +-----------------+-----------------+------------------------------------------------------------+----------------------------------------------------------+ + | tags | Yes | Array of :ref:`Tag ` objects | Tag list. | + +-----------------+-----------------+------------------------------------------------------------+----------------------------------------------------------+ + +.. _batchdeletetags__request_tag: + +.. table:: **Table 4** Tag + + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+============================================================================================+ + | key | No | String | Key. | + | | | | | + | | | | - This field cannot be left blank. | + | | | | | + | | | | - The key value of a resource must be unique. | + | | | | | + | | | | - Character set: A-Z, a-z, 0-9, '-', '_', and Unicode characters (\\u4E00-\\u9FFF). | + | | | | | + | | | | Minimum: **1** | + | | | | | + | | | | Maximum: **36** | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------+ + | value | No | String | Value. | + | | | | | + | | | | - The value contains a maximum of 43 characters. | + | | | | | + | | | | - Character set: A-Z, a-z, 0-9, '. ', '-', '_', and Unicode characters (\\u4E00-\\u9FFF). | + | | | | | + | | | | - The value can contain only digits, letters, hyphens (-), and underscores (_). | + | | | | | + | | | | Minimum: **0** | + | | | | | + | | | | Maximum: **43** | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +None + +Example Requests +---------------- + +Deleting Resource Tags in Batches + +.. code-block:: text + + POST https://{Endpoint}/v2/{project_id}/stream/{stream_id}/tags/action + + { + "action" : "delete", + "tags" : [ { + "key" : "key1", + "value" : "value1" + }, { + "key" : "key2", + "value" : "value3" + } ] + } + +Example Responses +----------------- + +None + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +204 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/tag_management/deleting_tags_of_specified_streams.rst b/api-ref/source/api_description/tag_management/deleting_tags_of_specified_streams.rst new file mode 100644 index 0000000..7887ddd --- /dev/null +++ b/api-ref/source/api_description/tag_management/deleting_tags_of_specified_streams.rst @@ -0,0 +1,72 @@ +:original_name: DeleteTag.html + +.. _DeleteTag: + +Deleting Tags of Specified Streams +================================== + +Function +-------- + +This API is used to delete tags of specified streams. + +URI +--- + +DELETE /v2/{project_id}/stream/{stream_id}/tags/{key} + +.. table:: **Table 1** Path parameters + + ========== ========= ====== =========== + Parameter Mandatory Type Description + ========== ========= ====== =========== + project_id Yes String Project ID. + stream_id Yes String Stream ID. + key Yes String Tag key. + ========== ========= ====== =========== + +Request Parameters +------------------ + +.. table:: **Table 2** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +None + +Example Requests +---------------- + +Deleting Tags of Specified Streams + +.. code-block:: text + + DELETE https://{Endpoint}/v2/{project_id}/stream/{stream_id}/tags/{key} + +Example Responses +----------------- + +None + +Status Codes +------------ + +=========== ================ +Status Code Description +=========== ================ +204 Normal response. +=========== ================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/tag_management/index.rst b/api-ref/source/api_description/tag_management/index.rst new file mode 100644 index 0000000..201ddb5 --- /dev/null +++ b/api-ref/source/api_description/tag_management/index.rst @@ -0,0 +1,26 @@ +:original_name: topic_300000006.html + +.. _topic_300000006: + +Tag Management +============== + +- :ref:`Adding Tags for Specified Streams ` +- :ref:`Querying Tags of Specified Streams ` +- :ref:`Deleting Tags of Specified Streams ` +- :ref:`Adding Resource Tags in Batches ` +- :ref:`Querying Tags of Specified Regions ` +- :ref:`Using Tags to Filter Resources (Streams) ` +- :ref:`Deleting Resource Tags in Batches ` + +.. toctree:: + :maxdepth: 1 + :hidden: + + adding_tags_for_specified_streams + querying_tags_of_specified_streams + deleting_tags_of_specified_streams + adding_resource_tags_in_batches + querying_tags_of_specified_regions + using_tags_to_filter_resources_streams + deleting_resource_tags_in_batches diff --git a/api-ref/source/api_description/tag_management/querying_tags_of_specified_regions.rst b/api-ref/source/api_description/tag_management/querying_tags_of_specified_regions.rst new file mode 100644 index 0000000..d3b1459 --- /dev/null +++ b/api-ref/source/api_description/tag_management/querying_tags_of_specified_regions.rst @@ -0,0 +1,114 @@ +:original_name: ListTags.html + +.. _ListTags: + +Querying Tags of Specified Regions +================================== + +Function +-------- + +This API is used to query all tags of specified regions. + +URI +--- + +GET /v2/{project_id}/stream/tags + +.. table:: **Table 1** Path parameters + + ========== ========= ====== =========== + Parameter Mandatory Type Description + ========== ========= ====== =========== + project_id Yes String Project ID. + ========== ========= ====== =========== + +Request Parameters +------------------ + +.. table:: **Table 2** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +**Status code: 200** + +.. table:: **Table 3** Response body parameters + + +-----------+--------------------------------------------------------+-------------+ + | Parameter | Type | Description | + +===========+========================================================+=============+ + | tags | Array of :ref:`Tags ` objects | Tag list. | + +-----------+--------------------------------------------------------+-------------+ + +.. _listtags__response_tags: + +.. table:: **Table 4** Tags + + +-----------------------+-----------------------+--------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+======================================================================================+ + | key | String | Key. | + | | | | + | | | - This field cannot be left blank. | + | | | | + | | | - The key value of a resource must be unique. | + | | | | + | | | - Character set: A-Z, a-z, 0-9, '-', '_', and Unicode characters (\\u4E00-\\u9FFF). | + | | | | + | | | Maximum: **36** | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------+ + | values | Array of strings | Tag value list. | + | | | | + | | | If values are null, it indicates any_value. The relationship between values is OR. | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------+ + +Example Requests +---------------- + +Querying Tags of Specified Regions + +.. code-block:: text + + GET https://{Endpoint}/v2/{project_id}/stream/tags + +Example Responses +----------------- + +**Status code: 200** + +Response body of the tag set. + +.. code-block:: + + { + "tags" : [ { + "key" : "key1", + "values" : [ "value1", "value2" ] + }, { + "key" : "key2", + "values" : [ "value1", "value2" ] + } ] + } + +Status Codes +------------ + +=========== ============================= +Status Code Description +=========== ============================= +200 Response body of the tag set. +=========== ============================= + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/tag_management/querying_tags_of_specified_streams.rst b/api-ref/source/api_description/tag_management/querying_tags_of_specified_streams.rst new file mode 100644 index 0000000..44a95d4 --- /dev/null +++ b/api-ref/source/api_description/tag_management/querying_tags_of_specified_streams.rst @@ -0,0 +1,125 @@ +:original_name: ShowStreamTags.html + +.. _ShowStreamTags: + +Querying Tags of Specified Streams +================================== + +Function +-------- + +This API is used to query tags of specified streams. + +URI +--- + +GET /v2/{project_id}/stream/{stream_id}/tags + +.. table:: **Table 1** Path parameters + + ========== ========= ====== =========== + Parameter Mandatory Type Description + ========== ========= ====== =========== + project_id Yes String Project ID. + stream_id Yes String Stream ID. + ========== ========= ====== =========== + +Request Parameters +------------------ + +.. table:: **Table 2** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +**Status code: 200** + +.. table:: **Table 3** Response body parameters + + +-----------+------------------------------------------------------------+-------------+ + | Parameter | Type | Description | + +===========+============================================================+=============+ + | tags | Array of :ref:`Tag ` objects | Label list. | + +-----------+------------------------------------------------------------+-------------+ + +.. _showstreamtags__response_tag: + +.. table:: **Table 4** Tag + + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+============================================================================================+ + | key | String | Key. | + | | | | + | | | - This field cannot be left blank. | + | | | | + | | | - The key value of a resource must be unique. | + | | | | + | | | - Character set: A-Z, a-z, 0-9, '-', '_', and Unicode characters (\\u4E00-\\u9FFF). | + | | | | + | | | Minimum: **1** | + | | | | + | | | Maximum: **36** | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------+ + | value | String | Value. | + | | | | + | | | - The value contains a maximum of 43 characters. | + | | | | + | | | - Character set: A-Z, a-z, 0-9, '. ', '-', '_', and Unicode characters (\\u4E00-\\u9FFF). | + | | | | + | | | - The value can contain only digits, letters, hyphens (-), and underscores (_). | + | | | | + | | | Minimum: **0** | + | | | | + | | | Maximum: **43** | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------+ + +Example Requests +---------------- + +This API is used to query tags of specified streams. + +.. code-block:: text + + GET https://{Endpoint}/v2/{project_id}/stream/{stream_id}/tags + +Example Responses +----------------- + +**Status code: 200** + +Response body of the stream tag information. + +.. code-block:: + + { + "tags" : [ { + "key" : "key1", + "value" : "value1" + }, { + "key" : "key2", + "value" : "value3" + } ] + } + +Status Codes +------------ + +=========== ============================================ +Status Code Description +=========== ============================================ +200 Response body of the stream tag information. +=========== ============================================ + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_description/tag_management/using_tags_to_filter_resources_streams.rst b/api-ref/source/api_description/tag_management/using_tags_to_filter_resources_streams.rst new file mode 100644 index 0000000..f3c1555 --- /dev/null +++ b/api-ref/source/api_description/tag_management/using_tags_to_filter_resources_streams.rst @@ -0,0 +1,237 @@ +:original_name: ListResourcesByTags.html + +.. _ListResourcesByTags: + +Using Tags to Filter Resources (Streams) +======================================== + +Function +-------- + +This API is used to filter resources (streams) by tag. + +URI +--- + +POST /v2/{project_id}/stream/resource_instances/action + +.. table:: **Table 1** Path parameters + + ========== ========= ====== =========== + Parameter Mandatory Type Description + ========== ========= ====== =========== + project_id Yes String Project ID. + ========== ========= ====== =========== + +Request Parameters +------------------ + +.. table:: **Table 2** Request header parameters + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | X-Auth-Token | Yes | String | User token. | + | | | | | + | | | | The token can be obtained by calling the IAM API (value of X-Subject-Token in the response header). | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +.. table:: **Table 3** Request body parameters + + +-----------------+-----------------+------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+==================================================================+==========================================================================================================================================================================================================================================================================================================================================================================================================================================================================+ + | action | Yes | String | Operation to be performed. The value can be only filter or count. | + | | | | | + | | | | - filter: queries data on multiple pages. | + | | | | | + | | | | - count: queries the total number of data records. The total number of data records is returned based on the search criteria. | + | | | | | + | | | | Enumeration values: | + | | | | | + | | | | - **filter** | + | | | | | + | | | | - **count** | + +-----------------+-----------------+------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | limit | No | String | Number of queried records. This parameter is not displayed if action is set to count. The default value is 1000 if action is set to filter. The value must be an integer ranging from 1 to 1000. | + | | | | | + | | | | Default: **1000** | + +-----------------+-----------------+------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | offset | No | String | Index position. The query starts from the next data record indexed by this parameter. When querying data on the first page, you do not need to pass this parameter. When querying data on subsequent pages, set this parameter to the value in the response body returned by querying data of the previous page. This parameter is not displayed when action is set to count. If action is set to filter, the value defaults to 0. The value must be a positive integer. | + +-----------------+-----------------+------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | tags | No | Array of :ref:`Tags ` objects | The return result contains resources corresponding to all tags in this parameter. This parameter contains a maximum of 10 keys, and each key contains a maximum of 10 values. The structure body cannot be missing, and the key cannot be left blank or set to an empty string. | + +-----------------+-----------------+------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | tags_any | No | Array of :ref:`Tags ` objects | The return result contains resources corresponding to any tag in this parameter. This parameter contains a maximum of 10 keys, and each key contains a maximum of 10 values. The structure body cannot be missing, and the key cannot be left blank or set to an empty string. Keys and the values of a key must be unique. | + +-----------------+-----------------+------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | not_tags | No | Array of :ref:`Tags ` objects | The return result does not contain resources corresponding to all tags in this parameter. This parameter contains a maximum of 10 keys, and each key contains a maximum of 10 values. The structure body cannot be missing, and the key cannot be left blank or set to an empty string. Keys and the values of a key must be unique. | + +-----------------+-----------------+------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | not_tags_any | No | Array of :ref:`Tags ` objects | The return result does not contain resources corresponding to any tag in this parameter. This parameter contains a maximum of 10 keys, and each key contains a maximum of 10 values. The structure body cannot be missing, and the key cannot be left blank or set to an empty string. Keys must be unique and values of a key must be unique. | + +-----------------+-----------------+------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | matches | No | String | Search criteria. The tag key is the field to match. Currently, only resource_name is supported. value indicates the matched value. This field is a fixed dictionary value. | + +-----------------+-----------------+------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _listresourcesbytags__request_tags: + +.. table:: **Table 4** Tags + + +-----------------+-----------------+------------------+--------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+==================+======================================================================================+ + | key | No | String | Key. | + | | | | | + | | | | - This field cannot be left blank. | + | | | | | + | | | | - The key value of a resource must be unique. | + | | | | | + | | | | - Character set: A-Z, a-z, 0-9, '-', '_', and Unicode characters (\\u4E00-\\u9FFF). | + | | | | | + | | | | Maximum: **36** | + +-----------------+-----------------+------------------+--------------------------------------------------------------------------------------+ + | values | No | Array of strings | Tag value list. | + | | | | | + | | | | If values are null, it indicates any_value. The relationship between values is OR. | + +-----------------+-----------------+------------------+--------------------------------------------------------------------------------------+ + +Response Parameters +------------------- + +**Status code: 200** + +.. table:: **Table 5** Response body parameters + + +-----------------------+-------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+===================================================================+==========================================================================================================================================================================================================================================================================================================================================================================================================================================================================+ + | action | String | Operation to be performed. The value can be only filter or count. | + | | | | + | | | - filter: queries data on multiple pages. | + | | | | + | | | - count: queries the total number of data records. The total number of data records is returned based on the search criteria. | + | | | | + | | | Enumeration values: | + | | | | + | | | - **filter** | + | | | | + | | | - **count** | + +-----------------------+-------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | limit | String | Number of queried records. This parameter is not displayed if action is set to count. The default value is 1000 if action is set to filter. The value must be an integer ranging from 1 to 1000. | + | | | | + | | | Default: **1000** | + +-----------------------+-------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | offset | String | Index position. The query starts from the next data record indexed by this parameter. When querying data on the first page, you do not need to pass this parameter. When querying data on subsequent pages, set this parameter to the value in the response body returned by querying data of the previous page. This parameter is not displayed when action is set to count. If action is set to filter, the value defaults to 0. The value must be a positive integer. | + +-----------------------+-------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | tags | Array of :ref:`Tags ` objects | The return result contains resources corresponding to all tags in this parameter. This parameter contains a maximum of 10 keys, and each key contains a maximum of 10 values. The structure body cannot be missing, and the key cannot be left blank or set to an empty string. | + +-----------------------+-------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | tags_any | Array of :ref:`Tags ` objects | The return result contains resources corresponding to any tag in this parameter. This parameter contains a maximum of 10 keys, and each key contains a maximum of 10 values. The structure body cannot be missing, and the key cannot be left blank or set to an empty string. Keys and the values of a key must be unique. | + +-----------------------+-------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | not_tags | Array of :ref:`Tags ` objects | The return result does not contain resources corresponding to all tags in this parameter. This parameter contains a maximum of 10 keys, and each key contains a maximum of 10 values. The structure body cannot be missing, and the key cannot be left blank or set to an empty string. Keys and the values of a key must be unique. | + +-----------------------+-------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | not_tags_any | Array of :ref:`Tags ` objects | The return result does not contain resources corresponding to any tag in this parameter. This parameter contains a maximum of 10 keys, and each key contains a maximum of 10 values. The structure body cannot be missing, and the key cannot be left blank or set to an empty string. Keys must be unique and values of a key must be unique. | + +-----------------------+-------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | matches | String | Search criteria. The tag key is the field to match. Currently, only resource_name is supported. value indicates the matched value. This field is a fixed dictionary value. | + +-----------------------+-------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _listresourcesbytags__response_tags: + +.. table:: **Table 6** Tags + + +-----------------------+-----------------------+--------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+======================================================================================+ + | key | String | Key. | + | | | | + | | | - This field cannot be left blank. | + | | | | + | | | - The key value of a resource must be unique. | + | | | | + | | | - Character set: A-Z, a-z, 0-9, '-', '_', and Unicode characters (\\u4E00-\\u9FFF). | + | | | | + | | | Maximum: **36** | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------+ + | values | Array of strings | Tag value list. | + | | | | + | | | If values are null, it indicates any_value. The relationship between values is OR. | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------+ + +Example Requests +---------------- + +- Resource (stream) filtering by tag and record querying + + .. code-block:: text + + POST https://{Endpoint}/v2/{project_id}/stream/resource_instances/action + + { + "action" : "count", + "tags" : [ { + "key" : "key1", + "values" : [ "value1", "value2" ] + }, { + "key" : "key2", + "values" : [ "value1", "value2" ] + } ], + "matches" : [ { + "key" : "resource_name", + "value" : "resource1" + } ] + } + +- Resource (stream) filtering by tag and querying by page. + + .. code-block:: text + + POST https://{Endpoint}/v2/{project_id}/stream/resource_instances/action + + { + "offset" : "0", + "limit" : "100", + "action" : "filter", + "matches" : [ { + "key" : "resource_name", + "value" : "resource1" + } ], + "tags" : [ { + "key" : "key1", + "values" : [ "*value1", "value2" ] + } ] + } + +Example Responses +----------------- + +**Status code: 200** + +Request body for filtering resources (streams) by tag. + +.. code-block:: + + { + "resources" : [ { + "resource_detail" : null, + "resource_id" : "cdfs_cefs_wesas_12_dsad", + "resource_name" : "resouece1", + "tags" : [ { + "key" : "key1", + "value" : "value1" + }, { + "key" : "key2", + "value" : "value1" + } ] + } ], + "total_count" : 1000 + } + +Status Codes +------------ + +=========== ====================================================== +Status Code Description +=========== ====================================================== +200 Request body for filtering resources (streams) by tag. +=========== ====================================================== + +Error Codes +----------- + +See :ref:`Error Codes `. diff --git a/api-ref/source/api_overview.rst b/api-ref/source/api_overview.rst new file mode 100644 index 0000000..0b5ca0d --- /dev/null +++ b/api-ref/source/api_overview.rst @@ -0,0 +1,8 @@ +:original_name: dis_02_0200.html + +.. _dis_02_0200: + +API Overview +============ + +DIS provides self-developed APIs that comply with RESTful API design specifications. You can use DIS functions listed in :ref:`API Description ` by calling these APIs. diff --git a/api-ref/source/appendix/error_codes.rst b/api-ref/source/appendix/error_codes.rst new file mode 100644 index 0000000..782b5bd --- /dev/null +++ b/api-ref/source/appendix/error_codes.rst @@ -0,0 +1,118 @@ +:original_name: ErrorCode.html + +.. _ErrorCode: + +Error Codes +=========== + ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| Status Code | Error Codes | Error Message | Description | Solution | ++=============+=============+======================================================================================================================================+===================================================================================================+====================================================================================================================================================+ +| 400 | DIS.4117 | Invalid Project Id. %s | Invalid project ID. | Ensure that the project ID is valid. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4200 | Invalid request. %s | Invalid request. | Ensure that the request is invalid by referring to API Reference | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4201 | Invalid partition_id. %s | Invalid partition ID. | Ensure that the partition ID is valid. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4202 | Empty request. | The request is empty. | Enter a valid request. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4203 | Invalid monitoring period. %s | The start time for querying the monitoring information is invalid. | Enter a valid timestamp. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4204 | The monitoring period cannot be longer than 7 days. | Only the monitoring information generated in the recent seven days can be queried. | Query the monitoring information generated in the recent seven days. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4205 | Stream is not running. | The stream is not in the running state. | Check the stream status. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4208 | Mrs cluster is invalid. %s | The MRS cluster entered during MRS dump task creation is invalid. | Ensure that the MRS cluster name and ID are correct and the cluster is running in security mode. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4209 | Invalid metrics label. %s | The monitoring metric entered during monitoring information query is invalid. | Check and modify the monitoring metric by referring to API Reference. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4215 | Invalid cursor type. %s | The cursor type entered during data cursor acquisition is invalid. | Check and modify the cursor type by referring to API Reference. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4216 | Invalid sequence_number. %s | The starting sequence number entered during data cursor acquisition is invalid. | Enter a valid starting sequence number. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4217 | Invalid partition cursor. %s | The partition cursor entered during data download from DIS is invalid. | Obtain the partition cursor again and download the data. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4224 | Sequence_number out of range. %s | The starting sequence number entered during data cursor acquisition is not in a valid range. | Enter a valid starting sequence number. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4225 | Expired partition cursor. %s | The partition cursor entered during data download from DIS has expired. | Obtain the partition cursor again and download the data. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4226 | A partition iterator error occurred or a record to which the SN corresponds has expired. Try to obtain the partition iterator again. | The starting sequence number of the partition cursor entered during data acquisition has expired. | Obtain the data cursor again and use the new cursor to obtain data. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4300 | Request error. | Incorrect request body. | Modify the request body by referring to API Reference. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4301 | The stream does not exist. %s | The stream does not exist. | Ensure that the stream exists. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4302 | Partition does not exist. %s | The partition does not exist. | Ensure that the partition ID exists. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4303 | Exceeded traffic control limit. | The flow control limit is exceeded. | Add the stream or reduce the upload rate. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4305 | Too many stream requests. | An excessive number of user requests are generated at the same time. | Reduce the requesting frequency and try again. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4306 | Bucket does not exist. %s | The OBS bucket does not exist. | Ensure that the OBS bucket exists. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4307 | The stream already exists. | The stream already exists. | Enter a new stream name. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4308 | Insufficient quota. | Insufficient stream or partition quotas. | Release the resources that will not be used to ensure that the quota limit is not exceeded or submit a service ticket to increase the quota limit. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4309 | Too many request failures. Please try again later. | The IP address is added to the blacklist. | Ensure that the authentication information and request are valid and try again later. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4310 | OBS access error. | OBS fails to be accessed. | Ensure that the user has permissions to access OBS. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4319 | Partition is expired. %s | The partition has expired. | Use a correct and valid partition. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4329 | app quota exceeded. | The application quota exceeds the limit. | Release the applications that are not used. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4330 | app already exist. | An application with the same name already exists. | Enter a new application name. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4331 | app is using. | The application fails to be deleted. | Ensure that the application that you want to delete is not being used. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4332 | app not found. | The application does not exist. | Ensure that the application name is correct. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4335 | Invalid IAM agency. | The IAM agency used during dump task creation is invalid. | Ensure that dis_admin_agency created by DIS or the user-defined IAM agency exists and permission is complete. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4336 | Invalid HDFS path. | The MRS HDFS path entered during MRS dump task creation is invalid. | Ensure that the MRS HDFS path exists. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4337 | The DLI database does not exist. | The DLI database entered during DLI dump task creation does not exist. | Ensure that the DLI database exists. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4338 | The DLI table does not exist. | The DLI table entered during DLI dump task creation does not exist. | Ensure that the DLI table exists and is an internal table. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4339 | Consumer quota exceeded. | The consumer quota of the consumer group is insufficient. | Allocate consumers properly or create a consumer group to meet the requirement. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4341 | The CloudTable cluster does not exist. | The CloudTable cluster entered during CloudTable dump task creation does not exist. | Ensure that the CloudTable cluster exists and is running properly. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4342 | The CloudTable table does not exist | The CloudTable table entered during CloudTable dump task creation does not exist. | Ensure that the CloudTable table exists. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4343 | The CloudTable table family does not exist. | The CloudTable column family entered during CloudTable dump task creation does not exist. | Ensure that the CloudTable column family exists. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4345 | Invalid CloudTable schema. | The schema entered during CloudTable dump task creation is invalid. | Check the schema based on the returned details to ensure that the configured JSON attribute name exists and the parameters are valid. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4348 | Invalid CloudTable openTSDB schema. | The schema entered during CloudTable OpenTSDB dump task creation is invalid. | Check the schema based on the returned details to ensure that the configured JSON attribute name exists and the parameters are valid. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4350 | Invalid DWS cluster. | The DWS cluster entered during DWS dump task creation does not exist. | Ensure that the DWS cluster exists and is running properly. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4351 | Invalid KMS userKey. | The KMS key entered during DWS dump task creation is invalid. | Ensure that the KMS key exists. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4354 | The transfer task does not exist. | The dump task to be deleted or updated does not exist. | Ensure that the dump task exists. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4355 | The transfer task already exists. | A dump task with the same name already exists. | Enter a new dump task name. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4357 | Exceeded transfer task quota. | A maximum of five dump tasks can be created for one stream at the same time. | Delete the discarded dump tasks and then add dump tasks again. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4360 | Invalid data schema. | The data schema entered during stream creation or update is invalid. | Ensure that the data schema format is correct and try again. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4375 | The app does not commit checkpoint | The application does not submit the checkpoint operation in the stream. | Check whether the application has submitted the checkpoint operation in the consumption stream. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4601 | The number of resource tags has reached the maximum. | A maximum of 10 tags can be added to a resource. | Delete the discarded tags and then add tags again. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4602 | Invalid resource type. | Invalid resource type. | Ensure that the resource type is valid. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4603 | The resource does not exist. | The resource does not exist. | Ensure that the resource exists. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4604 | The key does not exist. | The tag key does not exist. | Ensure that the tag key exists. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | DIS.4605 | The action is not supported. | The current tag operation is not supported. | Ensure that the current tag operation is valid. Currently, only the create and delete operations are supported. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 403 | DIS.4116 | Invalid RBAC. %s | User operations are restricted. | Ensure that the account has passed real-name authentication, is not in arrears, or has permissions to operate DIS. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ +| 500 | DIS.5000 | System error. | System error. | Contact customer service or technical support to handle system errors. | ++-------------+-------------+--------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ diff --git a/api-ref/source/appendix/index.rst b/api-ref/source/appendix/index.rst new file mode 100644 index 0000000..0bb2a0e --- /dev/null +++ b/api-ref/source/appendix/index.rst @@ -0,0 +1,18 @@ +:original_name: dis_02_0500.html + +.. _dis_02_0500: + +Appendix +======== + +- :ref:`Error Codes ` +- :ref:`Status Codes ` +- :ref:`Obtaining a Project ID ` + +.. toctree:: + :maxdepth: 1 + :hidden: + + error_codes + status_codes + obtaining_a_project_id diff --git a/api-ref/source/appendix/obtaining_a_project_id.rst b/api-ref/source/appendix/obtaining_a_project_id.rst new file mode 100644 index 0000000..61e81ae --- /dev/null +++ b/api-ref/source/appendix/obtaining_a_project_id.rst @@ -0,0 +1,58 @@ +:original_name: dis_02_0501.html + +.. _dis_02_0501: + +Obtaining a Project ID +====================== + +Obtaining a Project ID by Calling an API +---------------------------------------- + +You can obtain a project ID by calling the API for `Querying Project Information Based on the Specified Criteria `__. + +The API for obtaining the project ID is **GET https://{Endpoint}/v3/projects/**, where *Endpoint* indicates the endpoint of IAM. You can obtain the endpoint from `Regions and Endpoints `__. For details about API authentication, see :ref:`Authentication `. + +The following is an example response. The value of **id** is the project ID. If multiple IDs are returned, obtain the desired project ID based on the actual region (name). + +.. code-block:: + + { + "projects": [ + { + "domain_id": "65382450e8f64ac0870cd180d14e684b", + "is_domain": false, + "parent_id": "65382450e8f64ac0870cd180d14e684b", + "name": "region_name", + "description": "", + "links": { + "next": null, + "previous": null, + "self": "https://www.example.com/v3/projects/a4a5d4098fb4474fa22cd05f897d6b99" + }, + "id": "a4a5d4098fb4474fa22cd05f897d6b99", + "enabled": true + } + ], + "links": { + "next": null, + "previous": null, + "self": "https://www.example.com/v3/projects" + } + } + +Obtaining a Project ID from the Console +--------------------------------------- + +A project ID is required for some URLs when an API is called. To obtain a project ID, perform the following operations: + +#. Log in to the management console. + +#. Click the username and select **My Credentials** from the drop-down list. + + On the **My Credentials** page, view project IDs in the project list. + + +.. figure:: /_static/images/en-us_image_0000001238312593.jpg + :alt: **Figure 1** Viewing project IDs + + **Figure 1** Viewing project IDs diff --git a/api-ref/source/appendix/status_codes.rst b/api-ref/source/appendix/status_codes.rst new file mode 100644 index 0000000..a6798e9 --- /dev/null +++ b/api-ref/source/appendix/status_codes.rst @@ -0,0 +1,120 @@ +:original_name: dis_02_0022.html + +.. _dis_02_0022: + +Status Codes +============ + +A status code is an HTTPS response issued by DIS to indicate whether an API request has been successfully completed. + ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Status Code | Status | Description | ++=======================+=================================+=====================================================================================================================================================================================================================================================================================================================================================+ +| 100 | Continue | The server has received the initial part of the request and the client should continue to send the remaining part. | +| | | | +| | | It is issued on a provisional basis while request processing continues. It alerts the client to wait for a final response. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 101 | Switching Protocols | The requester has asked the server to switch protocols and the server has agreed to do so. The target protocol must be more advanced than the source protocol. | +| | | | +| | | For example, the current HTTP protocol is switched to a later version of HTTP. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 200 | OK | The server has successfully processed the request. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 201 | Created | The request has been fulfilled, resulting in the creation of a new resource. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 202 | Accepted | The request has been accepted for processing, but the processing has not been completed. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 203 | Non-Authoritative Information | The server successfully processed the request, but is returning information that may be from another source. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 204 | NoContent | The server has successfully processed the request, but does not return any content. | +| | | | +| | | The status code is returned in response to an HTTPS OPTIONS request. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 205 | Reset Content | The server has successfully processed the request, but does not return any content. Unlike a 204 response, this response requires that the requester reset the content. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 206 | Partial Content | The server has successfully processed a part of the GET request. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 300 | Multiple Choices | There are multiple options for the requested resource. For example, this code could be used to present a list of resource characteristics and addresses from which the client such as a browser may choose. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 301 | Moved Permanently | This and all future requests should be permanently directed to the given URI indicated in this response. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 302 | Found | The requested resource was temporarily moved. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 303 | See Other | The response to the request can be found under another URI using a GET or POST method. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 304 | Not Modified | The requested resource has not been modified. In such a case, there is no need to retransmit the resource since the client still has a previously-downloaded copy. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 305 | Use Proxy | The requested resource is available only through a proxy. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 306 | Unused | This HTTP status code is no longer used. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 400 | BadRequest | The request is invalid. | +| | | | +| | | The client should modify the request instead of re-initiating it. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 401 | Unauthorized | The authentication information provided by the client is incorrect or invalid. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 402 | Payment Required | Reserved for future use. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 403 | Forbidden | The server has received the request and understood it, but the server is refusing to respond to it. | +| | | | +| | | The client should modify the request instead of re-initiating it. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 404 | NotFound | The requested resource could not be found. | +| | | | +| | | The client should modify the request instead of re-initiating it. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 405 | MethodNotAllowed | A request method is not supported for the requested resource. | +| | | | +| | | The client should modify the request instead of re-initiating it. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 406 | Not Acceptable | The server could not fulfill the request according to the content characteristics of the request. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 407 | Proxy Authentication Required | This code is similar to 401, but indicates that the client must first authenticate itself with the proxy. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 408 | Request Time-out | The server timed out waiting for the request. | +| | | | +| | | The client may re-initiate the request without modifications at any later time. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 409 | Conflict | The request could not be processed due to a conflict in the request. | +| | | | +| | | For example, an edit conflict between multiple simultaneous updates or the resource that the client attempts to create already exists. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 410 | Gone | The requested resource has been deleted permanently and will not be available again. | +| | | | +| | | The status code indicates that the requested resource has been deleted permanently. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 411 | Length Required | The server refused to process the request because the request does not specify the length of its content. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 412 | Precondition Failed | The server does not meet one of the preconditions that the requester puts on the request. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 413 | Request Entity Too Large | The request is larger than the server is willing or able to process. The server may close the connection to prevent the client from continuing the request. If the server temporarily cannot process the request, the response will contain a Retry-After header field. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 414 | Request-URI Too Large | The URI provided was too long for the server to process. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 415 | Unsupported Media Type | The server does not support the media type in the request. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 416 | Requested range not satisfiable | The requested range is invalid. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 417 | Expectation Failed | The server fails to meet the requirements of the Expect request-header field. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 422 | UnprocessableEntity | The request was well-formed but was unable to be followed due to semantic errors. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 429 | TooManyRequests | The client has sent more requests than its rate limit is allowed within a given amount of time, or the server has received more requests than it is able to process within a given amount of time. In this case, it is advisable for the client to re-initiate requests after the time specified in the Retry-After header of the response expires. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 441 | Authentication Error | Authentication fails. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 500 | InternalServerError | The server is able to receive the request but it could not understand the request. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 501 | Not Implemented | The server does not support the requested function. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 502 | Bad Gateway | The server was acting as a gateway or proxy and received an invalid request from a remote server. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 503 | ServiceUnavailable | The requested service is invalid. | +| | | | +| | | The client should modify the request instead of re-initiating it. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 504 | ServerTimeout | The server could not return a timely response. The response will reach the client only if the request carries a timeout parameter. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 505 | HTTP Version not supported | The server does not support the HTTP protocol version used in the request. | ++-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ diff --git a/api-ref/source/application_example.rst b/api-ref/source/application_example.rst new file mode 100644 index 0000000..7fbefb9 --- /dev/null +++ b/api-ref/source/application_example.rst @@ -0,0 +1,135 @@ +:original_name: dis_02_0003.html + +.. _dis_02_0003: + +Application Example +=================== + +Scenarios +--------- + +DIS provides efficient collection, transmission, and distribution capabilities for real-time data and provides a variety of APIs to help you quickly build real-time data applications. + +The following describes how to create a DIS stream by calling the :ref:`Before You Start ` API. For details, see :ref:`Calling APIs `. + +.. note:: + + The token obtained on IAM is valid for only 24 hours. If you want to use one token for authentication, you can cache it to avoid frequent calling. + +Involved APIs +------------- + +If you use a token for authentication, you must obtain the token and add **X-Auth-Token** to the request header of the API request. + +- API for obtaining a token from IAM +- API for creating a DIS stream + +Prerequisites +------------- + +You have planned the region where DIS is located and determined the endpoint for calling an API based on the region. + +An endpoint is the **request address** for calling an API. Endpoints vary depending on services and regions. You can obtain endpoints from `Regions and Endpoints `__. + +Creating a Stream +----------------- + +The following is an example of creating a stream with the simplest configuration. + +#. Obtain the token by following the instructions in :ref:`Token-based Authentication `. + +#. Send **POST https://Endpoint of DIS/v2/{project_id}/streams**. + +#. Add **X-Auth-Token** to the request header. + +#. Specify the following parameters in the request body: + + .. code-block:: + + { + "stream_name": "dis-DLpR", + "partition_count": 1, + "stream_type": "COMMON", + "data_duration": 24 + } + + - **stream_name** indicates the stream name, which can be customized, for example, **newstream**. + - **partition_count** indicates the number of partitions. A partition is the base throughput unit of a DIS stream. You can specify the number of partitions based on your service throughput requirements. + - **stream_type** indicates the stream type. **COMMON** indicates a common partition. A single partition supports a maximum of 1 MB/s for data writing and a maximum of 2 MB/s for data reading. + - **data_duration** indicates the lifecycle of a stream, that is, the duration for storing data in the stream partition. + + If the request is successful, 201 Created is returned. + + If the request fails, an error code and error information are returned. For details, see :ref:`Error Codes `. + +Creating a Stream That Supports Auto Scaling +-------------------------------------------- + +You can also create a stream that supports auto scaling. The number of partitions can be automatically increased or decreased based on the stream traffic. The following is an example configuration: + +#. Obtain the token by following the instructions provided in :ref:`Token-based Authentication `. + +#. Send **POST https://Endpoint of DIS/v2/{project_id}/streams**. + +#. Add **X-Auth-Token** to the request header. + +#. Specify the following parameters in the request body: + + .. code-block:: + + { + "stream_name": "dis-DLpR", + "partition_count": 1, + "stream_type": "COMMON", + "data_duration": 24 + "auto_scale_enabled": true, + "auto_scale_min_partition_count": 2, + "auto_scale_max_partition_count": 10 + } + + In this example, a stream that supports auto scaling is created. The number of partitions to scale ranges from 2 to 10. If the stream has 10 partitions, auto scaling-out will not be triggered. + + - **auto_scale_enabled** specifies whether to enable auto scaling. The value **true** indicates that auto scaling is enabled. + - **auto_scale_min_partition_count** indicates the minimum number of partitions allowed when auto scale-in is enabled. In this example, as there are two partitions, automatic scale-in will not be triggered. + - **auto_scale_max_partition_count** indicates the maximum number of partitions allowed when auto scale-out is enabled. In this example, as there are 10 partitions, automatic scale-out will not be triggered. + + If the request is successful, 201 Created is returned. + + If the request fails, an error code and error information are returned. For details, see :ref:`Error Codes `. + +Creating a Stream with Data Schemas +----------------------------------- + +You can also configure a schema for the stream. When using DIS to dump data to other services, you can map data based on the schema configured for the stream. The following is an example configuration: + +#. Obtain the token by following the instructions provided in :ref:`Token-based Authentication `. + +#. Send **POST https://Endpoint of DIS/v2/{project_id}/streams**. + +#. Add **X-Auth-Token** to the request header. + +#. Specify the following parameters in the request body: + + .. code-block:: + + { + "stream_name": "dis-DLpR", + "partition_count": 1, + "stream_type": "COMMON", + "data_duration": 24 + "auto_scale_enabled": true, + "auto_scale_min_partition_count": 1, + "auto_scale_max_partition_count": 10 + "data_type": "JSON", + "data_schema": + "{\"type\":\"record\",\"name\":\"RecordName\",\"fields\":[{\"name\":\"key1\",\"type\":\"string\"},{\"name\":\"key2\",\"type\":\"string\"}]}" + } + + In this example, a stream whose source data type is JSON and that contains the key1 and key2 attributes is created. + + - **data_type** indicates the type of source data. The value **JSON** indicates that the data format in the partition is JSON. + - **data_schema** indicates the source data schema, which describes the source data structures in JSON and CSV formats using the Avro Schema syntax. + + If the request is successful, 201 Created is returned. + + If the request fails, an error code and error information are returned. For details, see :ref:`Error Codes `. diff --git a/api-ref/source/before_you_start/api_calling.rst b/api-ref/source/before_you_start/api_calling.rst new file mode 100644 index 0000000..a665cd7 --- /dev/null +++ b/api-ref/source/before_you_start/api_calling.rst @@ -0,0 +1,8 @@ +:original_name: dis_02_0512.html + +.. _dis_02_0512: + +API Calling +=========== + +DIS supports Representational State Transfer (REST) APIs, allowing you to call APIs using HTTPS. For details about API calling, see :ref:`Calling APIs `. diff --git a/api-ref/source/before_you_start/concepts.rst b/api-ref/source/before_you_start/concepts.rst new file mode 100644 index 0000000..6040155 --- /dev/null +++ b/api-ref/source/before_you_start/concepts.rst @@ -0,0 +1,34 @@ +:original_name: dis_02_0515.html + +.. _dis_02_0515: + +Concepts +======== + +- Domain + + A domain is created upon successful registration. The domain has full access permissions for all of its cloud services and resources. It can be used to reset user passwords and grant user permissions. The domain is a payment entity and should not be used directly to perform routine management. For security purposes, create users and grant them permissions for routine management. + +- User + + A user is created using an accounta domain to use cloud services. Each user has its own identity credentials (password and access keys). + + The account, username, and password will be required for API authentication. + +- Project + + Projects group and isolate resources (including compute, storage, and network resources) across physical regions. A default project is provided for each region, and subprojects can be created under each default project. Users can be granted permissions to access all resources in a specific project. For more refined access control, create subprojects under a project and create resources in the subprojects. Users can then be assigned permissions to access only specific resources in the subprojects. + + + .. figure:: /_static/images/en-us_image_0170787737.gif + :alt: **Figure 1** Project isolating model + + **Figure 1** Project isolating model + +- Checkpoint + + When an application consumes data, the latest SN of the consumed data is recorded as a checkpoint. When the data is reconsumed, the consumption can be continued based on this checkpoint. + +- Application + + Multiple applications can consume data in the same stream. The consumed data in the stream by each application is recorded by checkpoints generated for each application. diff --git a/api-ref/source/before_you_start/constraints.rst b/api-ref/source/before_you_start/constraints.rst new file mode 100644 index 0000000..2e916b6 --- /dev/null +++ b/api-ref/source/before_you_start/constraints.rst @@ -0,0 +1,8 @@ +:original_name: dis_02_0514.html + +.. _dis_02_0514: + +Constraints +=========== + +- For more constraints, see API description. diff --git a/api-ref/source/before_you_start/endpoints.rst b/api-ref/source/before_you_start/endpoints.rst new file mode 100644 index 0000000..cd826b1 --- /dev/null +++ b/api-ref/source/before_you_start/endpoints.rst @@ -0,0 +1,8 @@ +:original_name: dis_02_0513.html + +.. _dis_02_0513: + +Endpoints +========= + +An endpoint is the **request address** for calling an API. Endpoints vary depending on services and regions. For the endpoints of all services, see `Regions and Endpoints `__. diff --git a/api-ref/source/before_you_start/index.rst b/api-ref/source/before_you_start/index.rst new file mode 100644 index 0000000..1da603b --- /dev/null +++ b/api-ref/source/before_you_start/index.rst @@ -0,0 +1,22 @@ +:original_name: dis_02_0511.html + +.. _dis_02_0511: + +Before You Start +================ + +- :ref:`Overview ` +- :ref:`API Calling ` +- :ref:`Endpoints ` +- :ref:`Constraints ` +- :ref:`Concepts ` + +.. toctree:: + :maxdepth: 1 + :hidden: + + overview + api_calling + endpoints + constraints + concepts diff --git a/api-ref/source/before_you_start/overview.rst b/api-ref/source/before_you_start/overview.rst new file mode 100644 index 0000000..e9500a3 --- /dev/null +++ b/api-ref/source/before_you_start/overview.rst @@ -0,0 +1,12 @@ +:original_name: dis_02_0600.html + +.. _dis_02_0600: + +Overview +======== + +Welcome to *Data Ingestion Service API Reference*. Data Ingestion Service (DIS) provides efficient collection, transmission, and distribution capabilities for real-time IoT and Internet data, supports multiple IoT protocols, and provides various APIs to help you quickly build real-time data applications. + +This document describes how to use application programming interfaces (APIs) to perform operations on DIS, such as uploading or downloading data. For details about all supported operations, see :ref:`API Overview `. + +If you plan to access DIS through an API, ensure that you are familiar with DIS concepts. For details, see "Service Overview" in the *DIS User Guide*. diff --git a/api-ref/source/calling_apis/authentication.rst b/api-ref/source/calling_apis/authentication.rst new file mode 100644 index 0000000..fa3c47d --- /dev/null +++ b/api-ref/source/calling_apis/authentication.rst @@ -0,0 +1,91 @@ +:original_name: dis_02_0517.html + +.. _dis_02_0517: + +Authentication +============== + +Requests for calling an API can be authenticated using either of the following methods: + +- Token-based authentication: Requests are authenticated using a token. +- AK/SK-based authentication: Requests are authenticated by encrypting the request body using an AK/SK pair. AK/SK-based authentication is recommended because it is more secure than token-based authentication. + +.. _dis_02_0517__en-us_topic_0183235768_en-us_topic_0181281305_dis_02_0517_en-us_topic_0121671869_section2417768214391: + +Token-based Authentication +-------------------------- + +.. note:: + + The validity period of a token is 24 hours. When using a token for authentication, cache it to prevent frequently calling the IAM API used to obtain a user token. + +A token specifies temporary permissions in a computer system. During API authentication using a token, the token is added to a request to get permissions for calling the API. + +When calling the API to obtain a user token, you must set **auth.scope** in the request body to **project**. + +.. code-block:: + + { + "auth": { + "identity": { + "methods": [ + "password" + ], + "password": { + "user": { + "name": "username", + "password": "********", + "domain": { + "name": "domainname" + } + } + } + }, + "scope": { + "project": { + "id": "xxxxxxxxxxxxxxxxxx" + } + } + } + } + +After a token is obtained, the X-Auth-Token header field must be added to requests to specify the token when calling other APIs, for example, the API used to query a connection list. For example, if the token is **ABCDEFJ....**, **X-Auth-Token: ABCDEFJ....** can be added to a request as follows: + +.. code-block:: + + GET https://{{endpoint}}/v1/{project_id}/connections + Content-Type: application/json + X-Auth-Token: ABCDEFJ.... + +AK/SK-based Authentication +-------------------------- + +.. note:: + + AK/SK-based authentication supports API requests with a body not larger than 12 MB. For API requests with a larger body, token-based authentication is recommended. + +In AK/SK-based authentication, AK/SK is used to sign requests and the signature is then added to the requests for authentication. + +- AK: access key ID, which is a unique identifier used in conjunction with a secret access key to sign requests cryptographically. +- SK: secret access key used in conjunction with an AK to sign requests cryptographically. It identifies a request sender and prevents the request from being modified. + +To obtain an access key, perform the following steps: + +#. Log in to the management console, move the cursor to the username in the upper right corner, and select **My Credentials** from the drop-down list. + +#. On the **My Credentials** page, choose **Access Keys**, and click **Create Access Key**. See :ref:`Figure 1 `. + + .. _dis_02_0517__en-us_topic_0183235768_en-us_topic_0000001129241845_en-us_topic_0183643042_fig1552229194615: + + .. figure:: /_static/images/en-us_image_0000001135802808.png + :alt: **Figure 1** Clicking Create Access Key + + **Figure 1** Clicking Create Access Key + +#. Click **OK** and save the access key file as prompted. The access key file will be saved to your browser's configured download location. Open the **credentials.csv** file to view **Access Key Id** and **Secret Access Key**. + +In AK/SK-based authentication, you can use an AK/SK to sign requests based on the signature algorithm or use the signing SDK to sign requests. + +.. important:: + + The signing SDKs are only used for signing requests and different from the SDKs provided by services. diff --git a/api-ref/source/calling_apis/index.rst b/api-ref/source/calling_apis/index.rst new file mode 100644 index 0000000..d3de755 --- /dev/null +++ b/api-ref/source/calling_apis/index.rst @@ -0,0 +1,18 @@ +:original_name: dis_02_0516.html + +.. _dis_02_0516: + +Calling APIs +============ + +- :ref:`Making an API Request ` +- :ref:`Authentication ` +- :ref:`Response ` + +.. toctree:: + :maxdepth: 1 + :hidden: + + making_an_api_request + authentication + response diff --git a/api-ref/source/calling_apis/making_an_api_request.rst b/api-ref/source/calling_apis/making_an_api_request.rst new file mode 100644 index 0000000..ce4455c --- /dev/null +++ b/api-ref/source/calling_apis/making_an_api_request.rst @@ -0,0 +1,145 @@ +:original_name: dis_02_0400.html + +.. _dis_02_0400: + +Making an API Request +===================== + +This section describes the structure of a REST API request, and uses the IAM API for `obtaining a user token `__ as an example to demonstrate how to call an API. The obtained token can then be used to authenticate the calling of other APIs. + +Request URI +----------- + +A request URI is in the following format: + +**{URI-scheme}://{Endpoint}/{resource-path}?{query-string}** + +Although a request URI is included in the request header, most programming languages or frameworks require the request URI to be transmitted separately. + +.. table:: **Table 1** URI parameter description + + +---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Description | + +===============+=====================================================================================================================================================================================================================================================================+ + | URI-scheme | Protocol used to transmit requests. All APIs use HTTPS. | + +---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Endpoint | Domain name or IP address of the server bearing the REST service. The endpoint varies between services in different regions. It can be obtained from `Regions and Endpoints `__. | + +---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | resource-path | Access path of an API for performing a specified operation. Obtain the path from the URI of an API. For example, the **resource-path** of the API used to obtain a user token is **/v3/auth/tokens**. | + +---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | query-string | Query parameter, which is optional. Ensure that a question mark (?) is included before each query parameter that is in the format of "*Parameter name=Parameter value*". For example, **? limit=10** indicates that a maximum of 10 data records will be displayed. | + +---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. note:: + + To simplify the URI display in this document, each API is provided only with a **resource-path** and a request method. The **URI-scheme** of all APIs is **HTTPS**, and the endpoints of all APIs in the same region are identical. + +Request Methods +--------------- + +The HTTP protocol defines the following request methods that can be used to send a request to the server: + +.. table:: **Table 2** HTTP methods + + +-----------------------------------+----------------------------------------------------------------------------+ + | Method | Description | + +===================================+============================================================================+ + | GET | Requests the server to return specified resources. | + +-----------------------------------+----------------------------------------------------------------------------+ + | PUT | Requests the server to update specified resources. | + +-----------------------------------+----------------------------------------------------------------------------+ + | POST | Requests the server to add resources or perform special operations. | + +-----------------------------------+----------------------------------------------------------------------------+ + | DELETE | Requests the server to delete specified resources, for example, an object. | + +-----------------------------------+----------------------------------------------------------------------------+ + | HEAD | Same as GET except that the server must return only the response header. | + +-----------------------------------+----------------------------------------------------------------------------+ + | PATCH | Requests the server to update partial content of a specified resource. | + | | | + | | If the resource does not exist, a new resource will be created. | + +-----------------------------------+----------------------------------------------------------------------------+ + +For example, in the case of the API used to `obtain a user token `__, the request method is **POST**, and the request is as follows: + +Request Header +-------------- + +You can also add additional header fields to a request, such as the fields required by a specified URI or HTTP method. For example, to request for the authentication information, add **Content-Type**, which specifies the request body type. + +:ref:`Table 3 ` lists common request headers. + +.. _dis_02_0400__en-us_topic_0121682347_table1986821153312: + +.. table:: **Table 3** Common request headers + + +-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------+--------------------------------------------+ + | Parameter | Description | Mandatory | Example | + +=================+==============================================================================================================================================================================================================================================================================================================+===================================================+============================================+ + | Host | Specifies the server domain name and port number of the resources being requested. The value can be obtained from the URL of the service API. The value is in the format of *Hostname:Port number*. If the port number is not specified, the default port is used. The default port number for HTTPS is 443. | No | code.test.com | + | | | | | + | | | This field is mandatory for AK/SK authentication. | or | + | | | | | + | | | | code.test.com:443 | + +-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------+--------------------------------------------+ + | Content-Type | Specifies the request body MIME type. Its default value is **application/json**. Other values of this field will be provided for specific APIs if any. | Yes | application/json | + +-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------+--------------------------------------------+ + | Content-Length | Specifies the length of the request body. The unit is byte. | No | 3495 | + +-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------+--------------------------------------------+ + | X-Project-Id | Specifies the project ID. Obtain the project ID by following the instructions in :ref:`Obtaining a Project ID `. | No | e9993fc787d94b6c886cbaa340f9c0f4 | + +-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------+--------------------------------------------+ + | X-Auth-Token | Specifies the user token. | No | The following is part of an example token: | + | | | | | + | | It is a response to the API used to `obtain a user token `__. This API is the only one that does not require authentication. | This field is mandatory for token authentication. | MIIPAgYJKoZIhvcNAQcCo...ggg1BBIINPXsidG9rZ | + | | | | | + | | After the request is processed, the value of **X-Subject-Token** in the header is the token value. | | | + +-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------+--------------------------------------------+ + +.. note:: + + In addition to supporting token-based authentication, APIs also support authentication using access key ID/secret access key (AK/SK). During AK/SK-based authentication, an SDK is used to sign the request, and the **Authorization** (signature authentication) and **X-Sdk-Date** (time when the request is sent) header fields are automatically added to the request. + + For more information, see "AK/SK-based Authentication" in :ref:`Authentication `. + +The API used to `obtain a user token `__ does not require authentication. Therefore, only the **Content-Type** field needs to be added to requests for calling the API. An example of such requests is as follows: + +(Optional) Request Body +----------------------- + +This part is optional. The body of a request is often sent in a structured format as specified in the **Content-Type** header field, such as JSON or XML. The request body transfers content except the request header. + +The request body varies between APIs. Some APIs do not require the request body, such as the APIs requested using the GET and DELETE methods. + +In the case of the API used to `obtain a user token `__, the request parameters and parameter description can be obtained from the API request. The following provides an example request with a body included. Replace *username*, *domainname*, ``********`` (login password), and *xxxxxxxxxxxxxxxxxx* (project ID) with the actual values. To learn how to obtain a project ID, see :ref:`Obtaining a Project ID `. + +.. note:: + + The **scope** parameter specifies where a token takes effect. In the following example, the token takes effect only for the resources in a specified project. You can set **scope** to a domain or a project under a domain. In the following example, the token takes effect only for the resources in a specified project. For more information about this API, see `obtaining a user token `__. + +.. code-block:: + + Content-Type: application/json + { + "auth": { + "identity": { + "methods": [ + "password" + ], + "password": { + "user": { + "name": "username", + "password": "********", + "domain": { + "name": "domainname" + } + } + } + }, + "scope": { + "project": { + "name": "xxxxxxxxxxxxxxxxxx" + } + } + } + } + +If all data required for the API request is available, you can send the request to call the API through `curl `__, `Postman `__, or coding. In the response to the API used to obtain a user token, **x-subject-token** is the desired user token. This token can then be used to authenticate the calling of other APIs. diff --git a/api-ref/source/calling_apis/response.rst b/api-ref/source/calling_apis/response.rst new file mode 100644 index 0000000..83fdd5b --- /dev/null +++ b/api-ref/source/calling_apis/response.rst @@ -0,0 +1,62 @@ +:original_name: dis_02_0518.html + +.. _dis_02_0518: + +Response +======== + +Status Code +----------- + +After sending a request, you will receive a response, including a status code, response header, and response body. + +A status code is a group of digits, ranging from 1xx to 5xx. It indicates the status of a request. For more information, see :ref:`Status Codes `. + +For example, if status code **201** is returned for calling the API used to `obtain a user token `__, the request is successful. + +Response Header +--------------- + +Similar to a request, a response also has a header, for example, **Content-Type**. + +:ref:`Figure 1 ` shows the response header fields for the API used to `obtain a user token `__. The **x-subject-token** header field is the desired user token. This token can then be used to authenticate the calling of other APIs. + +.. _dis_02_0518__en-us_topic_0170155703_fig4865141011511: + +.. figure:: /_static/images/en-us_image_0170647338.png + :alt: **Figure 1** Header fields of the response to the request for obtaining a user token + + **Figure 1** Header fields of the response to the request for obtaining a user token + +(Optional) Response Body +------------------------ + +The body of a response is often returned in structured format as specified in the **Content-Type** header field, such as JSON or XML. The response body transfers content except the response header. + +The following is part of the response body for the API used to `obtain a user token `__. + +.. code-block:: + + { + "token": { + "expires_at": "2019-02-13T06:52:13.855000Z", + "methods": [ + "password" + ], + "catalog": [ + { + "endpoints": [ + { + "region_id": "******", + ...... + +If an error occurs during API calling, an error code and a message will be displayed. The following shows an error response body. + +.. code-block:: + + { + "error_msg": "The format of message is error", + "error_code": "AS.0001" + } + +In the response body, **error_code** is an error code, and **error_msg** provides information about the error. diff --git a/api-ref/source/change_history.rst b/api-ref/source/change_history.rst new file mode 100644 index 0000000..181cd6b --- /dev/null +++ b/api-ref/source/change_history.rst @@ -0,0 +1,22 @@ +:original_name: dis_02_0023.html + +.. _dis_02_0023: + +Change History +============== + ++-----------------------------------+---------------------------------------------------------------+ +| Released On | Description | ++===================================+===============================================================+ +| 2018-10-25 | Accepted in OTC 3.2. | ++-----------------------------------+---------------------------------------------------------------+ +| 2018-09-29 | Modified the following contents: | +| | | +| | Added tag management APIs | ++-----------------------------------+---------------------------------------------------------------+ +| 2018-09-26 | Modified the following contents: | +| | | +| | A status code was added in :ref:`Status Codes `. | ++-----------------------------------+---------------------------------------------------------------+ +| 2018-03-16 | This issue is the first official release. | ++-----------------------------------+---------------------------------------------------------------+ diff --git a/api-ref/source/index.rst b/api-ref/source/index.rst index df350f4..1c7dd8e 100644 --- a/api-ref/source/index.rst +++ b/api-ref/source/index.rst @@ -2,3 +2,14 @@ Data Ingestion Service - API Reference ====================================== +.. toctree:: + :maxdepth: 1 + + before_you_start/index + api_overview + calling_apis/index + application_example + api_description/index + permissions_policies_and_supported_actions + appendix/index + change_history diff --git a/api-ref/source/permissions_policies_and_supported_actions.rst b/api-ref/source/permissions_policies_and_supported_actions.rst new file mode 100644 index 0000000..ab398e7 --- /dev/null +++ b/api-ref/source/permissions_policies_and_supported_actions.rst @@ -0,0 +1,178 @@ +:original_name: en-us_topic_0000001079240698.html + +.. _en-us_topic_0000001079240698: + +Permissions Policies and Supported Actions +========================================== + +This chapter describes fine-grained permissions management for your DIS. If your cloud account does not need individual IAM users, then you may skip over this chapter. + +By default, new IAM users do not have any permissions assigned. You need to add a user to one or more groups, and assign permissions policies to these groups. The user then inherits permissions from the groups it is a member of. This process is called authorization. After authorization, the user can perform specified operations on DIS based on the permissions. + +You can grant users permissions by using roles and policies. Roles are a type of coarse-grained authorization mechanism provided by IAM that defines permissions related to user responsibilities. Policies define API-based permissions for operations on specific resources under certain conditions, allowing for more fine-grained, secure access control of cloud resources. + +Note: + +Policy-based authorization is useful if you want to allow or deny the access to an API. + +An account has all of the permissions required to call all APIs, but IAM users must have the required permissions specifically assigned. The permissions required for calling an API are determined by the actions supported by the API. Only users who have been granted permissions allowing the actions can call the API successfully. For example, if an IAM user queries MRS clusters using an API, the user must have been granted permissions that allow the **dis:streams:list** action. + +**Supported Actions** + +DIS provides system-defined policies that can be directly used in IAM. You can also create custom policies and use them to supplement system-defined policies, implementing more refined access control. Operations supported by policies are specific to APIs. The following are common concepts related to policies: + +· Permission: A statement in a policy that allows or denies certain operations. + +· APIs: REST APIs that can be called in a custom policy. + +· Action: Specific operations that are allowed or denied. + +· IAM or enterprise projects: Type of projects for which an action will take effect. Policies that contain actions supporting both IAM and enterprise projects can be assigned to user groups and take effect in both IAM and Enterprise Management. Policies that only contain actions for IAM projects can be used and only take effect for IAM. + +Note: + +The check mark (Y) indicates that an action takes effect. The cross mark (x) indicates that an action does not take effect. + +:ref:`Table 1 ` lists the actions that can be defined in custom policies of DIS. All actions listed in the following table support both Project and Enterprise Project. + +.. _en-us_topic_0000001079240698__table538416112711: + +.. table:: **Table 1** Permissions policies and supported actions + + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Permissions | APIs | Actions | Project | Enterprise Project | + +==================================================+===================================================================+===========================+=============+====================+ + | Creating a consumer app | POST /v2/{project_id}/apps | dis:apps:create | Y | x | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Deleting an app | DELETE /v2/{project_id}/apps/{app_name} | dis:apps:delete | Y | x | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Querying apps | GET | dis:apps:list | Y | x | + | | | | | | + | | /v2/{project_id}/apps | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Querying app details | GET | dis:apps:get | Y | x | + | | | | | | + | | /v2/{project_id}/apps/{app_name} | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Querying the app consumption status | GET | dis:appState:get | Y | Y | + | | | | | | + | | /v2/{project_id}/apps/{app}/streams/{stream_name} | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Querying all events of a user in pagination mode | GET | dis:events:list | Y | x | + | | | | | | + | | /v1/{project_id}/events | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Creating a subscription | POST | dis:eventEnumSubs:create | Y | x | + | | | | | | + | | /v1/{project_id}/event-subs | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Deleting a subscription | DELETE | dis:eventEnumSubs:delete | Y | x | + | | | | | | + | | /v1/{project_id}/event-subs/{sub_id} | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Modifying a subscription | PUT | dis:eventEnumSubs:update | Y | x | + | | | | | | + | | /v1/{project_id}/event-subs/{sub_id} | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Querying all subscriptions of a user | GET | dis:eventEnumSubs:list | Y | x | + | | | | | | + | | /v1/{project_id}/event-subs | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Adding a permission policy | POST | dis:streamPolicies:create | Y | Y | + | | | | | | + | | /v2/{project_id}/streams/{streamName}/policies | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Querying permission policies | GET | dis:streamPolicies:list | Y | Y | + | | | | | | + | | /v2/{project_id}/streams/{streamName}/policies | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Deleting a permission policy of a stream | DELETE | dis:streamPolicies:delete | Y | Y | + | | | | | | + | | /v2/{project_id}/streams/{streamName}/policies | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Querying details of a stream | GET | dis:streams:get | Y | Y | + | | | | | | + | | /v2/{project_id}/streams/{streamName} | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Creating a stream | POST | dis:streams:create | Y | Y | + | | | | | | + | | /v2/{project_id}/streams | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Deleting a Stream | DELETE | dis:streams:delete | Y | Y | + | | | | | | + | | /v2/{project_id}/streams/{stream_name} | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Querying streams | GET | dis:streams:list | Y | x | + | | | | | | + | | /v2/{project_id}/streams | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Updating stream information | PUT | dis:streams:update | Y | Y | + | | | | | | + | | /v2/{project_id}/streams/{stream_name}/update | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Creating a dump task | POST | dis:transferTasks:create | Y | Y | + | | | | | | + | | /v2/{project_id}/streams/{stream_name}/transfer-tasks | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Updating a dump task | PUT | dis:transferTasks:update | Y | Y | + | | | | | | + | | /v2/{project_id}/streams/{stream_name}/transfer-tasks | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Querying dump tasks | GET | dis:transferTasks:list | Y | Y | + | | | | | | + | | /v2/{project_id}/streams/{stream_name}/transfer-tasks | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Querying details of a dump task | GET | dis:transferTasks:get | Y | Y | + | | | | | | + | | /v2/{project_id}/streams/{stream_name}/transfer-tasks/{task_name} | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Deleting a dump task | DELETE | dis:transferTasks:delete | Y | Y | + | | | | | | + | | /v2/{project_id}/streams/{stream_name}/transfer-tasks/{task_name} | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Uploading Data to a DIS Stream | POST | dis:records:write | Y | Y | + | | | | | | + | | /v2/{project_id}/records | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Obtaining a data cursor | GET | dis:records:readCursor | Y | Y | + | | | | | | + | | /v2/{project_id}/cursors | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Downloading data from a DIS stream | GET | dis:records:read | Y | Y | + | | | | | | + | | /v2/{project_id}/records | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Adding a checkpoint | POST | dis:checkpoints:commit | Y | Y | + | | | | | | + | | /v2/{project_id}/checkpoints | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Querying checkpoint details | GET | dis:checkpoints:get | Y | Y | + | | | | | | + | | /v2/{project_id}/checkpoints | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Deleting a checkpoint | DELETE | dis:checkpoints:delete | Y | Y | + | | | | | | + | | /v2/{project_id}/checkpoints | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Filtering streams by tag | POST | dis:tagResources:list | Y | x | + | | | | | | + | | /{project_id}/{resource_type}/resource_instances/action | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Adding or deleting resource tags in batches | POST | dis:tagResources:update | Y | x | + | | | | | | + | | /{project_id}/{resource_type}/{resource_id}/tags/action | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Adding a Tag to a Specified Stream | POST | dis:tagResources:create | Y | x | + | | | | | | + | | /{project_id}/{resource_type}/{resource_id}/tags | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Deleting a tag of a specified stream | DELETE | dis:tagResources:delete | Y | x | + | | | | | | + | | /{project_id}/{resource_type}/{resource_id}/tags/{key} | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + | Querying all tags of a specified region | GET | dis:tags:list | Y | x | + | | | | | | + | | /{project_id}/{resource_type}/tags | | | | + +--------------------------------------------------+-------------------------------------------------------------------+---------------------------+-------------+--------------------+ + +Note: For the actions not listed :ref:`Table 1 `, for example, viewing app quota (/{projectId}/quotas) and viewing DIS resource statistics on the homepage (/v1/{projectId}/statistics), configure system-defined policy **DIS User**, **DIS ReadOnlyAccess**, **DIS CommonOperations**, or **DIS FullAccess** for users.