byteplus-python-sdk-v2 3.0.43__py2.py3-none-any.whl → 3.0.45__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {byteplus_python_sdk_v2-3.0.43.dist-info → byteplus_python_sdk_v2-3.0.45.dist-info}/METADATA +27 -1
- {byteplus_python_sdk_v2-3.0.43.dist-info → byteplus_python_sdk_v2-3.0.45.dist-info}/RECORD +562 -94
- {byteplus_python_sdk_v2-3.0.43.dist-info → byteplus_python_sdk_v2-3.0.45.dist-info}/top_level.txt +2 -0
- byteplussdkcore/api_client.py +219 -1
- byteplussdkcore/auth/credential.py +4 -0
- byteplussdkcore/auth/providers/__init__.py +5 -1
- byteplussdkcore/auth/providers/cli_config_provider.py +628 -0
- byteplussdkcore/auth/providers/default_provider.py +103 -0
- byteplussdkcore/auth/providers/ecs_role_provider.py +186 -0
- byteplussdkcore/auth/providers/env_provider.py +38 -0
- byteplussdkcore/auth/providers/provider.py +36 -1
- byteplussdkcore/auth/providers/static_provider.py +3 -3
- byteplussdkcore/auth/providers/sts_oidc_provider.py +132 -42
- byteplussdkcore/auth/providers/sts_provider.py +10 -1
- byteplussdkcore/auth/providers/sts_saml_provider.py +77 -32
- byteplussdkcore/configuration.py +1 -1
- byteplussdkcore/endpoint/providers/default_provider.py +28 -0
- byteplussdkcore/endpoint/providers/standard_provider.py +2 -3
- byteplussdkcore/feature/__init__.py +6 -0
- byteplussdkcore/feature/rds/__init__.py +4 -0
- byteplussdkcore/feature/rds/connect_utils.py +88 -0
- byteplussdkcore/interceptor/interceptors/request.py +4 -0
- byteplussdkcore/interceptor/interceptors/resolve_endpoint_interceptor.py +8 -1
- byteplussdkcore/interceptor/interceptors/sign_request_interceptor.py +42 -14
- byteplussdkcore/signv4.py +86 -0
- byteplussdkexamples/byteplussdkarkruntime/async_completions.py +0 -2
- byteplussdkexamples/byteplussdkarkruntime/completions.py +1 -3
- byteplussdkexamples/byteplussdkarkruntime/context.py +1 -3
- byteplussdkkickart/__init__.py +251 -0
- byteplussdkkickart/api/__init__.py +6 -0
- byteplussdkkickart/api/kickart_api.py +11189 -0
- byteplussdkkickart/models/__init__.py +247 -0
- byteplussdkkickart/models/batch_delete_asset_request.py +123 -0
- byteplussdkkickart/models/batch_delete_asset_response.py +95 -0
- byteplussdkkickart/models/batch_delete_media_request.py +123 -0
- byteplussdkkickart/models/batch_delete_media_response.py +123 -0
- byteplussdkkickart/models/check_delete_media_request.py +123 -0
- byteplussdkkickart/models/check_delete_media_response.py +123 -0
- byteplussdkkickart/models/check_product_url_request.py +149 -0
- byteplussdkkickart/models/check_product_url_response.py +123 -0
- byteplussdkkickart/models/clear_ad_variations_output_videos_request.py +124 -0
- byteplussdkkickart/models/clear_ad_variations_output_videos_response.py +95 -0
- byteplussdkkickart/models/clear_ad_variations_project_request.py +150 -0
- byteplussdkkickart/models/clear_ad_variations_project_response.py +95 -0
- byteplussdkkickart/models/copy_genius_project_request.py +149 -0
- byteplussdkkickart/models/copy_genius_project_response.py +149 -0
- byteplussdkkickart/models/create_ad_variations_project_request.py +123 -0
- byteplussdkkickart/models/create_ad_variations_project_response.py +123 -0
- byteplussdkkickart/models/create_ai_template_task_request.py +227 -0
- byteplussdkkickart/models/create_ai_template_task_response.py +123 -0
- byteplussdkkickart/models/create_api_key_request.py +123 -0
- byteplussdkkickart/models/create_api_key_response.py +123 -0
- byteplussdkkickart/models/create_auth_url_request.py +149 -0
- byteplussdkkickart/models/create_auth_url_response.py +175 -0
- byteplussdkkickart/models/create_avatar_request.py +149 -0
- byteplussdkkickart/models/create_avatar_response.py +123 -0
- byteplussdkkickart/models/create_draft_request.py +149 -0
- byteplussdkkickart/models/create_draft_response.py +149 -0
- byteplussdkkickart/models/create_film_request.py +721 -0
- byteplussdkkickart/models/create_film_response.py +95 -0
- byteplussdkkickart/models/create_folder_request.py +279 -0
- byteplussdkkickart/models/create_folder_response.py +123 -0
- byteplussdkkickart/models/create_item_request.py +227 -0
- byteplussdkkickart/models/create_item_response.py +149 -0
- byteplussdkkickart/models/create_material_request.py +851 -0
- byteplussdkkickart/models/create_material_response.py +95 -0
- byteplussdkkickart/models/create_media_request.py +357 -0
- byteplussdkkickart/models/create_media_response.py +149 -0
- byteplussdkkickart/models/create_project_from_template_request.py +123 -0
- byteplussdkkickart/models/create_project_from_template_response.py +123 -0
- byteplussdkkickart/models/create_project_request.py +487 -0
- byteplussdkkickart/models/create_project_response.py +201 -0
- byteplussdkkickart/models/create_template_project_request.py +149 -0
- byteplussdkkickart/models/create_template_project_response.py +175 -0
- byteplussdkkickart/models/delete_all_task_item_request.py +124 -0
- byteplussdkkickart/models/delete_all_task_item_response.py +95 -0
- byteplussdkkickart/models/delete_api_key_request.py +123 -0
- byteplussdkkickart/models/delete_api_key_response.py +95 -0
- byteplussdkkickart/models/delete_task_item_request.py +123 -0
- byteplussdkkickart/models/delete_task_item_response.py +95 -0
- byteplussdkkickart/models/download_asset_request.py +149 -0
- byteplussdkkickart/models/download_asset_response.py +149 -0
- byteplussdkkickart/models/export_editor_video_request.py +279 -0
- byteplussdkkickart/models/export_editor_video_response.py +123 -0
- byteplussdkkickart/models/export_video_request.py +149 -0
- byteplussdkkickart/models/export_video_response.py +123 -0
- byteplussdkkickart/models/gen_ad_variations_analysis_request.py +124 -0
- byteplussdkkickart/models/gen_ad_variations_analysis_response.py +123 -0
- byteplussdkkickart/models/gen_ad_variations_video_request.py +124 -0
- byteplussdkkickart/models/gen_ad_variations_video_response.py +123 -0
- byteplussdkkickart/models/gen_bgm_by_product_request.py +175 -0
- byteplussdkkickart/models/gen_bgm_by_product_response.py +123 -0
- byteplussdkkickart/models/gen_bgm_by_video_request.py +175 -0
- byteplussdkkickart/models/gen_bgm_by_video_response.py +123 -0
- byteplussdkkickart/models/gen_main_video_request.py +175 -0
- byteplussdkkickart/models/gen_main_video_response.py +149 -0
- byteplussdkkickart/models/gen_pic_by_prompt_request.py +175 -0
- byteplussdkkickart/models/gen_pic_by_prompt_response.py +123 -0
- byteplussdkkickart/models/gen_pics_video_by_story_request.py +175 -0
- byteplussdkkickart/models/gen_pics_video_by_story_response.py +123 -0
- byteplussdkkickart/models/gen_product_intro_creative_request.py +149 -0
- byteplussdkkickart/models/gen_product_intro_creative_response.py +123 -0
- byteplussdkkickart/models/gen_product_intro_script_request.py +149 -0
- byteplussdkkickart/models/gen_product_intro_script_response.py +123 -0
- byteplussdkkickart/models/gen_product_intro_video_request.py +149 -0
- byteplussdkkickart/models/gen_product_intro_video_response.py +149 -0
- byteplussdkkickart/models/gen_product_storyboard_outline_request.py +149 -0
- byteplussdkkickart/models/gen_product_storyboard_outline_response.py +149 -0
- byteplussdkkickart/models/gen_product_storyboard_video_request.py +175 -0
- byteplussdkkickart/models/gen_product_storyboard_video_response.py +175 -0
- byteplussdkkickart/models/gen_story_by_prompt_request.py +123 -0
- byteplussdkkickart/models/gen_story_by_prompt_response.py +123 -0
- byteplussdkkickart/models/gen_template_script_request.py +175 -0
- byteplussdkkickart/models/gen_template_script_response.py +175 -0
- byteplussdkkickart/models/gen_template_video_request.py +201 -0
- byteplussdkkickart/models/gen_template_video_response.py +149 -0
- byteplussdkkickart/models/gen_video_by_prompt_request.py +175 -0
- byteplussdkkickart/models/gen_video_by_prompt_response.py +123 -0
- byteplussdkkickart/models/get_ai_template_task_status_request.py +123 -0
- byteplussdkkickart/models/get_ai_template_task_status_response.py +123 -0
- byteplussdkkickart/models/get_ai_template_template_info_request.py +123 -0
- byteplussdkkickart/models/get_ai_template_template_info_response.py +123 -0
- byteplussdkkickart/models/get_avatar_request.py +123 -0
- byteplussdkkickart/models/get_avatar_response.py +123 -0
- byteplussdkkickart/models/get_block_detail_request.py +149 -0
- byteplussdkkickart/models/get_block_detail_response.py +123 -0
- byteplussdkkickart/models/get_block_request.py +124 -0
- byteplussdkkickart/models/get_block_response.py +123 -0
- byteplussdkkickart/models/get_category_detail_request.py +201 -0
- byteplussdkkickart/models/get_category_detail_response.py +123 -0
- byteplussdkkickart/models/get_combo_balance_request.py +124 -0
- byteplussdkkickart/models/get_combo_balance_response.py +149 -0
- byteplussdkkickart/models/get_composition_request.py +123 -0
- byteplussdkkickart/models/get_composition_response.py +253 -0
- byteplussdkkickart/models/get_create_cost_request.py +123 -0
- byteplussdkkickart/models/get_create_cost_response.py +123 -0
- byteplussdkkickart/models/get_creator_info_request.py +123 -0
- byteplussdkkickart/models/get_creator_info_response.py +123 -0
- byteplussdkkickart/models/get_draft_request.py +123 -0
- byteplussdkkickart/models/get_draft_response.py +123 -0
- byteplussdkkickart/models/get_film_detail_request.py +175 -0
- byteplussdkkickart/models/get_film_detail_response.py +123 -0
- byteplussdkkickart/models/get_genius_project_request.py +124 -0
- byteplussdkkickart/models/get_genius_project_response.py +123 -0
- byteplussdkkickart/models/get_genius_template_request.py +123 -0
- byteplussdkkickart/models/get_genius_template_response.py +123 -0
- byteplussdkkickart/models/get_home_bootstrap2_request.py +149 -0
- byteplussdkkickart/models/get_home_bootstrap2_response.py +253 -0
- byteplussdkkickart/models/get_home_bootstrap_request.py +149 -0
- byteplussdkkickart/models/get_home_bootstrap_response.py +253 -0
- byteplussdkkickart/models/get_list_request.py +177 -0
- byteplussdkkickart/models/get_list_response.py +175 -0
- byteplussdkkickart/models/get_material_detail_request.py +227 -0
- byteplussdkkickart/models/get_material_detail_response.py +123 -0
- byteplussdkkickart/models/get_material_transcoding_list_request.py +331 -0
- byteplussdkkickart/models/get_material_transcoding_list_response.py +149 -0
- byteplussdkkickart/models/get_media_request.py +123 -0
- byteplussdkkickart/models/get_media_response.py +123 -0
- byteplussdkkickart/models/get_meta_list_request.py +201 -0
- byteplussdkkickart/models/get_meta_list_response.py +175 -0
- byteplussdkkickart/models/get_price_request.py +123 -0
- byteplussdkkickart/models/get_price_response.py +123 -0
- byteplussdkkickart/models/get_product_info_request.py +123 -0
- byteplussdkkickart/models/get_product_info_response.py +149 -0
- byteplussdkkickart/models/get_public_template_list_request.py +436 -0
- byteplussdkkickart/models/get_public_template_list_response.py +149 -0
- byteplussdkkickart/models/get_publish_draft_by_task_request.py +124 -0
- byteplussdkkickart/models/get_publish_draft_by_task_response.py +149 -0
- byteplussdkkickart/models/get_publish_draft_request.py +175 -0
- byteplussdkkickart/models/get_publish_draft_response.py +149 -0
- byteplussdkkickart/models/get_raw_api_key_request.py +123 -0
- byteplussdkkickart/models/get_raw_api_key_response.py +123 -0
- byteplussdkkickart/models/get_special_zone_config_request.py +124 -0
- byteplussdkkickart/models/get_special_zone_config_response.py +227 -0
- byteplussdkkickart/models/get_task_item_request.py +149 -0
- byteplussdkkickart/models/get_task_item_response.py +565 -0
- byteplussdkkickart/models/get_tasks_detail_request.py +123 -0
- byteplussdkkickart/models/get_tasks_detail_response.py +123 -0
- byteplussdkkickart/models/get_tenant_config_request.py +124 -0
- byteplussdkkickart/models/get_tenant_config_response.py +929 -0
- byteplussdkkickart/models/get_voice_recommendation_request.py +227 -0
- byteplussdkkickart/models/get_voice_recommendation_response.py +123 -0
- byteplussdkkickart/models/get_watermark_switch_status_request.py +124 -0
- byteplussdkkickart/models/get_watermark_switch_status_response.py +253 -0
- byteplussdkkickart/models/handle_o_auth_callback_request.py +177 -0
- byteplussdkkickart/models/handle_o_auth_callback_response.py +123 -0
- byteplussdkkickart/models/health_check_request.py +123 -0
- byteplussdkkickart/models/health_check_response.py +123 -0
- byteplussdkkickart/models/invoke_project_event_request.py +201 -0
- byteplussdkkickart/models/invoke_project_event_response.py +123 -0
- byteplussdkkickart/models/list_api_key_request.py +149 -0
- byteplussdkkickart/models/list_api_key_response.py +201 -0
- byteplussdkkickart/models/list_avatar_request.py +201 -0
- byteplussdkkickart/models/list_avatar_response.py +201 -0
- byteplussdkkickart/models/list_avatar_voice_request.py +279 -0
- byteplussdkkickart/models/list_avatar_voice_response.py +201 -0
- byteplussdkkickart/models/list_block_request.py +201 -0
- byteplussdkkickart/models/list_block_response.py +149 -0
- byteplussdkkickart/models/list_combo_request.py +149 -0
- byteplussdkkickart/models/list_combo_response.py +149 -0
- byteplussdkkickart/models/list_create_cost_request.py +149 -0
- byteplussdkkickart/models/list_create_cost_response.py +123 -0
- byteplussdkkickart/models/list_creative_point_logs_request.py +253 -0
- byteplussdkkickart/models/list_creative_point_logs_response.py +149 -0
- byteplussdkkickart/models/list_genius_project_request.py +149 -0
- byteplussdkkickart/models/list_genius_project_response.py +149 -0
- byteplussdkkickart/models/list_genius_template_request.py +175 -0
- byteplussdkkickart/models/list_genius_template_response.py +149 -0
- byteplussdkkickart/models/list_prompt_request.py +95 -0
- byteplussdkkickart/models/list_prompt_response.py +123 -0
- byteplussdkkickart/models/list_publish_accounts_request.py +149 -0
- byteplussdkkickart/models/list_publish_accounts_response.py +123 -0
- byteplussdkkickart/models/list_resources_request.py +95 -0
- byteplussdkkickart/models/list_resources_response.py +123 -0
- byteplussdkkickart/models/list_select_item_request.py +123 -0
- byteplussdkkickart/models/list_select_item_response.py +149 -0
- byteplussdkkickart/models/list_tasks_request.py +177 -0
- byteplussdkkickart/models/list_tasks_response.py +175 -0
- byteplussdkkickart/models/query_creative_point_logs_request.py +253 -0
- byteplussdkkickart/models/query_creative_point_logs_response.py +149 -0
- byteplussdkkickart/models/query_select_item_request.py +123 -0
- byteplussdkkickart/models/query_select_item_response.py +149 -0
- byteplussdkkickart/models/reorder_check_request.py +123 -0
- byteplussdkkickart/models/reorder_check_response.py +123 -0
- byteplussdkkickart/models/retry_risk_task_request.py +123 -0
- byteplussdkkickart/models/retry_risk_task_response.py +123 -0
- byteplussdkkickart/models/retry_task_request.py +149 -0
- byteplussdkkickart/models/retry_task_response.py +123 -0
- byteplussdkkickart/models/save_publish_draft_request.py +149 -0
- byteplussdkkickart/models/save_publish_draft_response.py +123 -0
- byteplussdkkickart/models/search_asset_request.py +487 -0
- byteplussdkkickart/models/search_asset_response.py +201 -0
- byteplussdkkickart/models/search_list_media_request.py +617 -0
- byteplussdkkickart/models/search_list_media_response.py +201 -0
- byteplussdkkickart/models/set_watermark_switch_status_request.py +253 -0
- byteplussdkkickart/models/set_watermark_switch_status_response.py +95 -0
- byteplussdkkickart/models/show_popup_request.py +124 -0
- byteplussdkkickart/models/show_popup_response.py +175 -0
- byteplussdkkickart/models/submit_publish_request.py +124 -0
- byteplussdkkickart/models/submit_publish_response.py +123 -0
- byteplussdkkickart/models/unbind_publish_account_request.py +124 -0
- byteplussdkkickart/models/unbind_publish_account_response.py +95 -0
- byteplussdkkickart/models/update_api_key_request.py +175 -0
- byteplussdkkickart/models/update_api_key_response.py +95 -0
- byteplussdkkickart/models/update_asset_request.py +149 -0
- byteplussdkkickart/models/update_asset_response.py +95 -0
- byteplussdkkickart/models/update_composition_product_info_request.py +151 -0
- byteplussdkkickart/models/update_composition_product_info_response.py +123 -0
- byteplussdkkickart/models/update_composition_request.py +149 -0
- byteplussdkkickart/models/update_composition_response.py +123 -0
- byteplussdkkickart/models/update_draft_request.py +227 -0
- byteplussdkkickart/models/update_draft_response.py +95 -0
- byteplussdkkickart/models/update_draft_title_request.py +151 -0
- byteplussdkkickart/models/update_draft_title_response.py +123 -0
- byteplussdkkickart/models/update_film_request.py +435 -0
- byteplussdkkickart/models/update_film_response.py +95 -0
- byteplussdkkickart/models/update_folder_media_path_request.py +175 -0
- byteplussdkkickart/models/update_folder_media_path_response.py +95 -0
- byteplussdkkickart/models/update_material_request.py +513 -0
- byteplussdkkickart/models/update_material_response.py +95 -0
- byteplussdkkickart/models/validate_avatar_image_request.py +123 -0
- byteplussdkkickart/models/validate_avatar_image_response.py +149 -0
- byteplussdkllmshield/models/llm_shield_sign.py +1 -1
- byteplussdkrdsmssql/__init__.py +1 -1
- byteplussdkrdsmssql/models/__init__.py +1 -1
- byteplussdkrdsmssql/models/describe_db_instance_specs_response.py +17 -17
- byteplussdkrdsmssql/models/{instance_spec_info_for_describe_db_instance_specs_output.py → instance_specs_info_for_describe_db_instance_specs_output.py} +45 -45
- byteplussdkvepfs/__init__.py +26 -0
- byteplussdkvepfs/api/vepfs_api.py +582 -0
- byteplussdkvepfs/models/__init__.py +26 -0
- byteplussdkvepfs/models/add_mount_service_clients_request.py +202 -0
- byteplussdkvepfs/models/add_mount_service_clients_response.py +123 -0
- byteplussdkvepfs/models/client_for_add_mount_service_clients_input.py +149 -0
- byteplussdkvepfs/models/client_for_describe_mount_service_tasks_output.py +149 -0
- byteplussdkvepfs/models/client_for_remove_mount_service_clients_input.py +149 -0
- byteplussdkvepfs/models/client_for_verify_mount_service_clients_input.py +149 -0
- byteplussdkvepfs/models/client_snapshot_for_describe_mount_service_task_results_output.py +305 -0
- byteplussdkvepfs/models/describe_lens_tasks_request.py +60 -1
- byteplussdkvepfs/models/describe_mount_service_clients_request.py +440 -0
- byteplussdkvepfs/models/describe_mount_service_clients_response.py +201 -0
- byteplussdkvepfs/models/describe_mount_service_task_results_request.py +415 -0
- byteplussdkvepfs/models/describe_mount_service_task_results_response.py +201 -0
- byteplussdkvepfs/models/describe_mount_service_tasks_request.py +267 -0
- byteplussdkvepfs/models/describe_mount_service_tasks_response.py +201 -0
- byteplussdkvepfs/models/instance_for_describe_mount_service_clients_output.py +253 -0
- byteplussdkvepfs/models/instance_for_describe_mount_service_task_results_output.py +253 -0
- byteplussdkvepfs/models/monitor_for_describe_mount_service_clients_output.py +123 -0
- byteplussdkvepfs/models/monitor_for_describe_mount_service_task_results_output.py +123 -0
- byteplussdkvepfs/models/mount_service_client_for_describe_mount_service_clients_output.py +305 -0
- byteplussdkvepfs/models/mount_service_task_result_for_describe_mount_service_task_results_output.py +201 -0
- byteplussdkvepfs/models/progress_for_describe_mount_service_tasks_output.py +201 -0
- byteplussdkvepfs/models/remove_mount_service_clients_request.py +150 -0
- byteplussdkvepfs/models/remove_mount_service_clients_response.py +123 -0
- byteplussdkvepfs/models/result_for_verify_mount_service_clients_output.py +175 -0
- byteplussdkvepfs/models/task_for_describe_mount_service_tasks_output.py +305 -0
- byteplussdkvepfs/models/verify_mount_service_clients_request.py +150 -0
- byteplussdkvepfs/models/verify_mount_service_clients_response.py +123 -0
- byteplussdkvke/__init__.py +69 -0
- byteplussdkvke/api/vke_api.py +1273 -206
- byteplussdkvke/models/__init__.py +69 -0
- byteplussdkvke/models/action_for_list_remedy_configs_output.py +149 -0
- byteplussdkvke/models/affinity_group_config_for_create_node_pool_input.py +149 -0
- byteplussdkvke/models/affinity_group_config_for_list_node_pools_output.py +149 -0
- byteplussdkvke/models/affinity_group_config_for_update_node_pool_config_input.py +149 -0
- byteplussdkvke/models/binding_remedy_config_request.py +262 -0
- byteplussdkvke/models/binding_remedy_config_response.py +123 -0
- byteplussdkvke/models/cluster_config_for_list_clusters_output.py +27 -1
- byteplussdkvke/models/cluster_config_for_update_cluster_config_input.py +53 -1
- byteplussdkvke/models/cluster_connector_config_request_for_update_cluster_config_input.py +215 -0
- byteplussdkvke/models/config_for_list_remedy_configs_output.py +253 -0
- byteplussdkvke/models/container_image_commitment_for_describe_container_image_commitments_output.py +227 -0
- byteplussdkvke/models/containerd_config_for_create_default_node_pool_input.py +149 -0
- byteplussdkvke/models/containerd_config_for_create_node_pool_input.py +149 -0
- byteplussdkvke/models/containerd_config_for_list_node_pools_output.py +149 -0
- byteplussdkvke/models/containerd_config_for_update_node_pool_config_input.py +149 -0
- byteplussdkvke/models/create_node_pool_request.py +27 -1
- byteplussdkvke/models/create_nodes_request.py +81 -3
- byteplussdkvke/models/create_snapshot_request.py +255 -0
- byteplussdkvke/models/create_snapshot_response.py +123 -0
- byteplussdkvke/models/data_volume_for_create_node_pool_input.py +87 -2
- byteplussdkvke/models/data_volume_for_list_node_pools_output.py +79 -1
- byteplussdkvke/models/data_volume_for_update_node_pool_config_input.py +87 -2
- byteplussdkvke/models/delete_nodes_request.py +2 -3
- byteplussdkvke/models/delete_snapshot_request.py +124 -0
- byteplussdkvke/models/delete_snapshot_response.py +123 -0
- byteplussdkvke/models/describe_container_image_commitments_request.py +227 -0
- byteplussdkvke/models/describe_container_image_commitments_response.py +149 -0
- byteplussdkvke/models/describe_snapshots_request.py +175 -0
- byteplussdkvke/models/describe_snapshots_response.py +149 -0
- byteplussdkvke/models/drain_for_list_remedy_configs_output.py +123 -0
- byteplussdkvke/models/eviction_hard_for_create_default_node_pool_input.py +62 -1
- byteplussdkvke/models/eviction_hard_for_create_node_pool_input.py +62 -1
- byteplussdkvke/models/eviction_hard_for_list_node_pools_output.py +55 -1
- byteplussdkvke/models/eviction_hard_for_update_node_pool_config_input.py +62 -1
- byteplussdkvke/models/exec_container_image_commitment_request.py +27 -1
- byteplussdkvke/models/exec_container_image_commitment_response.py +29 -1
- byteplussdkvke/models/filter_for_list_clusters_input.py +1 -1
- byteplussdkvke/models/filter_for_list_nodes_input.py +53 -1
- byteplussdkvke/models/filter_for_list_remedy_configs_input.py +234 -0
- byteplussdkvke/models/flannel_config_for_list_clusters_output.py +29 -3
- byteplussdkvke/models/flannel_config_for_update_cluster_config_input.py +123 -0
- byteplussdkvke/models/image_spec_for_describe_container_image_commitments_output.py +201 -0
- byteplussdkvke/models/instances_distribution_for_create_node_pool_input.py +201 -0
- byteplussdkvke/models/instances_distribution_for_list_node_pools_output.py +201 -0
- byteplussdkvke/models/instances_distribution_for_update_node_pool_config_input.py +201 -0
- byteplussdkvke/models/intersection_item_for_list_supported_images_output.py +149 -0
- byteplussdkvke/models/intervene_cordon_for_list_remedy_configs_output.py +149 -0
- byteplussdkvke/models/intervene_drain_for_list_remedy_configs_output.py +149 -0
- byteplussdkvke/models/irsa_config_for_list_clusters_output.py +253 -0
- byteplussdkvke/models/item_for_list_clusters_output.py +27 -1
- byteplussdkvke/models/item_for_list_instance_type_labels_output.py +175 -0
- byteplussdkvke/models/item_for_list_node_pools_output.py +27 -1
- byteplussdkvke/models/item_for_list_nodes_output.py +105 -1
- byteplussdkvke/models/item_for_list_remedy_configs_output.py +305 -0
- byteplussdkvke/models/item_for_list_supported_images_output.py +149 -0
- byteplussdkvke/models/kube_reserved_for_create_default_node_pool_input.py +7 -0
- byteplussdkvke/models/kube_reserved_for_create_node_pool_input.py +7 -0
- byteplussdkvke/models/kube_reserved_for_update_node_pool_config_input.py +7 -0
- byteplussdkvke/models/kubelet_config_for_create_default_node_pool_input.py +7 -24
- byteplussdkvke/models/kubelet_config_for_create_node_pool_input.py +7 -24
- byteplussdkvke/models/kubelet_config_for_update_node_pool_config_input.py +7 -24
- byteplussdkvke/models/kubernetes_config_for_create_default_node_pool_input.py +105 -1
- byteplussdkvke/models/kubernetes_config_for_create_node_pool_input.py +105 -1
- byteplussdkvke/models/kubernetes_config_for_list_node_pools_output.py +105 -1
- byteplussdkvke/models/kubernetes_config_for_update_node_pool_config_input.py +105 -1
- byteplussdkvke/models/label_for_list_instance_type_labels_output.py +149 -0
- byteplussdkvke/models/label_for_list_remedy_configs_output.py +149 -0
- byteplussdkvke/models/list_instance_type_labels_request.py +123 -0
- byteplussdkvke/models/list_instance_type_labels_response.py +123 -0
- byteplussdkvke/models/list_remedy_configs_request.py +175 -0
- byteplussdkvke/models/list_remedy_configs_response.py +201 -0
- byteplussdkvke/models/list_supported_add_instance_types_request.py +95 -0
- byteplussdkvke/models/list_supported_add_instance_types_response.py +123 -0
- byteplussdkvke/models/list_supported_gpu_driver_versions_request.py +176 -0
- byteplussdkvke/models/list_supported_gpu_driver_versions_response.py +123 -0
- byteplussdkvke/models/list_supported_images_request.py +175 -0
- byteplussdkvke/models/list_supported_images_response.py +149 -0
- byteplussdkvke/models/log_setup_for_create_cluster_input.py +1 -1
- byteplussdkvke/models/log_setup_for_update_cluster_config_input.py +1 -1
- byteplussdkvke/models/management_for_create_node_pool_input.py +149 -0
- byteplussdkvke/models/management_for_list_node_pools_output.py +149 -0
- byteplussdkvke/models/management_for_update_node_pool_config_input.py +149 -0
- byteplussdkvke/models/monitoring_config_for_list_clusters_output.py +27 -1
- byteplussdkvke/models/monitoring_config_for_update_cluster_config_input.py +27 -1
- byteplussdkvke/models/node_config_for_create_default_node_pool_input.py +27 -1
- byteplussdkvke/models/node_config_for_create_node_pool_input.py +216 -1
- byteplussdkvke/models/node_config_for_list_node_pools_output.py +209 -1
- byteplussdkvke/models/node_config_for_update_node_pool_config_input.py +216 -1
- byteplussdkvke/models/pods_config_for_update_cluster_config_input.py +27 -1
- byteplussdkvke/models/proxy_config_for_update_cluster_config_input.py +227 -0
- byteplussdkvke/models/public_access_config_for_create_node_pool_input.py +1 -1
- byteplussdkvke/models/public_access_config_for_update_node_pool_config_input.py +1 -1
- byteplussdkvke/models/public_access_network_config_for_create_cluster_input.py +1 -1
- byteplussdkvke/models/public_access_network_config_for_update_cluster_config_input.py +1 -1
- byteplussdkvke/models/registry_proxy_config_for_create_default_node_pool_input.py +149 -0
- byteplussdkvke/models/registry_proxy_config_for_create_node_pool_input.py +149 -0
- byteplussdkvke/models/registry_proxy_config_for_list_node_pools_output.py +149 -0
- byteplussdkvke/models/registry_proxy_config_for_update_node_pool_config_input.py +149 -0
- byteplussdkvke/models/remedy_config_for_create_node_pool_input.py +149 -0
- byteplussdkvke/models/remedy_config_for_list_node_pools_output.py +149 -0
- byteplussdkvke/models/remedy_config_for_update_node_pool_config_input.py +149 -0
- byteplussdkvke/models/remedy_strategy_for_list_remedy_configs_output.py +149 -0
- byteplussdkvke/models/rule_for_list_remedy_configs_output.py +175 -0
- byteplussdkvke/models/runtime_for_create_default_node_pool_input.py +156 -0
- byteplussdkvke/models/runtime_for_create_node_pool_input.py +156 -0
- byteplussdkvke/models/runtime_for_list_node_pools_output.py +149 -0
- byteplussdkvke/models/runtime_for_update_node_pool_config_input.py +156 -0
- byteplussdkvke/models/scheduled_instance_policy_for_create_scaling_policy_input.py +27 -1
- byteplussdkvke/models/scheduled_instance_policy_for_list_scaling_policies_output.py +27 -1
- byteplussdkvke/models/scheduled_instance_policy_for_update_scaling_policy_input.py +27 -1
- byteplussdkvke/models/snapshot_for_describe_snapshots_output.py +461 -0
- byteplussdkvke/models/status_for_list_clusters_input.py +1 -1
- byteplussdkvke/models/status_for_list_node_pools_input.py +1 -1
- byteplussdkvke/models/status_for_list_nodes_input.py +2 -2
- byteplussdkvke/models/supported_image_for_list_supported_images_output.py +149 -0
- byteplussdkvke/models/system_reserved_for_create_default_node_pool_input.py +7 -0
- byteplussdkvke/models/system_reserved_for_create_node_pool_input.py +7 -0
- byteplussdkvke/models/system_reserved_for_update_node_pool_config_input.py +7 -0
- byteplussdkvke/models/system_volume_for_create_node_pool_input.py +1 -1
- byteplussdkvke/models/system_volume_for_update_node_pool_config_input.py +1 -1
- byteplussdkvke/models/tag_for_create_snapshot_input.py +149 -0
- byteplussdkvke/models/unbinding_remedy_config_request.py +211 -0
- byteplussdkvke/models/unbinding_remedy_config_response.py +95 -0
- byteplussdkvke/models/update_cluster_config_request.py +27 -1
- byteplussdkvke/models/update_node_pool_config_request.py +27 -1
- byteplussdkvke/models/vpc_cni_config_for_list_clusters_output.py +29 -3
- byteplussdkvke/models/vpc_cni_config_for_update_cluster_config_input.py +29 -3
- byteplussdkvpc20250901/__init__.py +149 -0
- byteplussdkvpc20250901/api/__init__.py +6 -0
- byteplussdkvpc20250901/api/vpc20250901_api.py +4399 -0
- byteplussdkvpc20250901/models/__init__.py +145 -0
- byteplussdkvpc20250901/models/assign_private_ip_addresses_request.py +202 -0
- byteplussdkvpc20250901/models/assign_private_ip_addresses_response.py +201 -0
- byteplussdkvpc20250901/models/associate_route_table_request.py +176 -0
- byteplussdkvpc20250901/models/associate_route_table_response.py +149 -0
- byteplussdkvpc20250901/models/associate_vpc_cidr_block_request.py +150 -0
- byteplussdkvpc20250901/models/associate_vpc_cidr_block_response.py +201 -0
- byteplussdkvpc20250901/models/associated_elastic_ip_for_describe_network_interface_attributes_output.py +175 -0
- byteplussdkvpc20250901/models/associated_elastic_ip_for_describe_network_interfaces_output.py +175 -0
- byteplussdkvpc20250901/models/attach_network_interface_request.py +151 -0
- byteplussdkvpc20250901/models/attach_network_interface_response.py +149 -0
- byteplussdkvpc20250901/models/attachment_for_describe_network_interfaces_output.py +149 -0
- byteplussdkvpc20250901/models/authorize_security_group_egress_request.py +309 -0
- byteplussdkvpc20250901/models/authorize_security_group_egress_response.py +149 -0
- byteplussdkvpc20250901/models/authorize_security_group_ingress_request.py +309 -0
- byteplussdkvpc20250901/models/authorize_security_group_ingress_response.py +149 -0
- byteplussdkvpc20250901/models/create_network_interface_request.py +396 -0
- byteplussdkvpc20250901/models/create_network_interface_response.py +175 -0
- byteplussdkvpc20250901/models/create_route_entry_request.py +294 -0
- byteplussdkvpc20250901/models/create_route_entry_response.py +175 -0
- byteplussdkvpc20250901/models/create_route_table_request.py +266 -0
- byteplussdkvpc20250901/models/create_route_table_response.py +175 -0
- byteplussdkvpc20250901/models/create_security_group_request.py +254 -0
- byteplussdkvpc20250901/models/create_security_group_response.py +175 -0
- byteplussdkvpc20250901/models/create_subnet_request.py +294 -0
- byteplussdkvpc20250901/models/create_subnet_response.py +175 -0
- byteplussdkvpc20250901/models/create_vpc_request.py +292 -0
- byteplussdkvpc20250901/models/create_vpc_response.py +201 -0
- byteplussdkvpc20250901/models/delete_network_interface_request.py +124 -0
- byteplussdkvpc20250901/models/delete_network_interface_response.py +149 -0
- byteplussdkvpc20250901/models/delete_route_entry_request.py +124 -0
- byteplussdkvpc20250901/models/delete_route_entry_response.py +149 -0
- byteplussdkvpc20250901/models/delete_route_table_request.py +124 -0
- byteplussdkvpc20250901/models/delete_route_table_response.py +149 -0
- byteplussdkvpc20250901/models/delete_security_group_request.py +124 -0
- byteplussdkvpc20250901/models/delete_security_group_response.py +149 -0
- byteplussdkvpc20250901/models/delete_subnet_request.py +124 -0
- byteplussdkvpc20250901/models/delete_subnet_response.py +149 -0
- byteplussdkvpc20250901/models/delete_vpc_request.py +124 -0
- byteplussdkvpc20250901/models/delete_vpc_response.py +149 -0
- byteplussdkvpc20250901/models/describe_network_interface_attributes_request.py +124 -0
- byteplussdkvpc20250901/models/describe_network_interface_attributes_response.py +695 -0
- byteplussdkvpc20250901/models/describe_network_interfaces_request.py +548 -0
- byteplussdkvpc20250901/models/describe_network_interfaces_response.py +253 -0
- byteplussdkvpc20250901/models/describe_route_entry_list_request.py +393 -0
- byteplussdkvpc20250901/models/describe_route_entry_list_response.py +253 -0
- byteplussdkvpc20250901/models/describe_route_table_list_request.py +334 -0
- byteplussdkvpc20250901/models/describe_route_table_list_response.py +253 -0
- byteplussdkvpc20250901/models/describe_security_group_attributes_request.py +228 -0
- byteplussdkvpc20250901/models/describe_security_group_attributes_response.py +461 -0
- byteplussdkvpc20250901/models/describe_security_groups_request.py +340 -0
- byteplussdkvpc20250901/models/describe_security_groups_response.py +253 -0
- byteplussdkvpc20250901/models/describe_subnet_attributes_request.py +124 -0
- byteplussdkvpc20250901/models/describe_subnet_attributes_response.py +539 -0
- byteplussdkvpc20250901/models/describe_subnets_request.py +438 -0
- byteplussdkvpc20250901/models/describe_subnets_response.py +253 -0
- byteplussdkvpc20250901/models/describe_vpc_attributes_request.py +124 -0
- byteplussdkvpc20250901/models/describe_vpc_attributes_response.py +565 -0
- byteplussdkvpc20250901/models/describe_vpcs_request.py +366 -0
- byteplussdkvpc20250901/models/describe_vpcs_response.py +253 -0
- byteplussdkvpc20250901/models/detach_network_interface_request.py +151 -0
- byteplussdkvpc20250901/models/detach_network_interface_response.py +149 -0
- byteplussdkvpc20250901/models/disassociate_route_table_request.py +176 -0
- byteplussdkvpc20250901/models/disassociate_route_table_response.py +149 -0
- byteplussdkvpc20250901/models/disassociate_vpc_cidr_block_request.py +150 -0
- byteplussdkvpc20250901/models/disassociate_vpc_cidr_block_response.py +149 -0
- byteplussdkvpc20250901/models/list_tags_for_resources_request.py +264 -0
- byteplussdkvpc20250901/models/list_tags_for_resources_response.py +175 -0
- byteplussdkvpc20250901/models/modify_network_interface_attributes_request.py +266 -0
- byteplussdkvpc20250901/models/modify_network_interface_attributes_response.py +149 -0
- byteplussdkvpc20250901/models/modify_route_entry_request.py +188 -0
- byteplussdkvpc20250901/models/modify_route_entry_response.py +123 -0
- byteplussdkvpc20250901/models/modify_route_table_attributes_request.py +188 -0
- byteplussdkvpc20250901/models/modify_route_table_attributes_response.py +123 -0
- byteplussdkvpc20250901/models/modify_security_group_attributes_request.py +176 -0
- byteplussdkvpc20250901/models/modify_security_group_attributes_response.py +123 -0
- byteplussdkvpc20250901/models/modify_security_group_rule_descriptions_egress_request.py +283 -0
- byteplussdkvpc20250901/models/modify_security_group_rule_descriptions_egress_response.py +123 -0
- byteplussdkvpc20250901/models/modify_security_group_rule_descriptions_ingress_request.py +283 -0
- byteplussdkvpc20250901/models/modify_security_group_rule_descriptions_ingress_response.py +123 -0
- byteplussdkvpc20250901/models/modify_subnet_attributes_request.py +188 -0
- byteplussdkvpc20250901/models/modify_subnet_attributes_response.py +149 -0
- byteplussdkvpc20250901/models/modify_vpc_attributes_request.py +214 -0
- byteplussdkvpc20250901/models/modify_vpc_attributes_response.py +149 -0
- byteplussdkvpc20250901/models/network_interface_set_for_describe_network_interfaces_output.py +695 -0
- byteplussdkvpc20250901/models/permission_for_describe_security_group_attributes_output.py +331 -0
- byteplussdkvpc20250901/models/private_ip_set_for_describe_network_interface_attributes_output.py +175 -0
- byteplussdkvpc20250901/models/private_ip_set_for_describe_network_interfaces_output.py +175 -0
- byteplussdkvpc20250901/models/private_ip_sets_for_describe_network_interface_attributes_output.py +123 -0
- byteplussdkvpc20250901/models/private_ip_sets_for_describe_network_interfaces_output.py +123 -0
- byteplussdkvpc20250901/models/resource_tag_for_list_tags_for_resources_output.py +201 -0
- byteplussdkvpc20250901/models/revoke_security_group_egress_request.py +283 -0
- byteplussdkvpc20250901/models/revoke_security_group_egress_response.py +149 -0
- byteplussdkvpc20250901/models/revoke_security_group_ingress_request.py +283 -0
- byteplussdkvpc20250901/models/revoke_security_group_ingress_response.py +149 -0
- byteplussdkvpc20250901/models/route_entry_for_describe_route_entry_list_output.py +357 -0
- byteplussdkvpc20250901/models/route_table_for_describe_subnet_attributes_output.py +149 -0
- byteplussdkvpc20250901/models/route_table_for_describe_subnets_output.py +149 -0
- byteplussdkvpc20250901/models/router_table_list_for_describe_route_table_list_output.py +435 -0
- byteplussdkvpc20250901/models/security_group_for_describe_security_groups_output.py +383 -0
- byteplussdkvpc20250901/models/subnet_for_describe_subnets_output.py +513 -0
- byteplussdkvpc20250901/models/tag_filter_for_describe_network_interfaces_input.py +149 -0
- byteplussdkvpc20250901/models/tag_filter_for_describe_route_table_list_input.py +149 -0
- byteplussdkvpc20250901/models/tag_filter_for_describe_security_groups_input.py +149 -0
- byteplussdkvpc20250901/models/tag_filter_for_describe_subnets_input.py +149 -0
- byteplussdkvpc20250901/models/tag_filter_for_describe_vpcs_input.py +149 -0
- byteplussdkvpc20250901/models/tag_filter_for_list_tags_for_resources_input.py +149 -0
- byteplussdkvpc20250901/models/tag_for_create_network_interface_input.py +149 -0
- byteplussdkvpc20250901/models/tag_for_create_route_table_input.py +149 -0
- byteplussdkvpc20250901/models/tag_for_create_security_group_input.py +149 -0
- byteplussdkvpc20250901/models/tag_for_create_subnet_input.py +149 -0
- byteplussdkvpc20250901/models/tag_for_create_vpc_input.py +149 -0
- byteplussdkvpc20250901/models/tag_for_describe_network_interface_attributes_output.py +149 -0
- byteplussdkvpc20250901/models/tag_for_describe_network_interfaces_output.py +149 -0
- byteplussdkvpc20250901/models/tag_for_describe_route_table_list_output.py +149 -0
- byteplussdkvpc20250901/models/tag_for_describe_security_group_attributes_output.py +149 -0
- byteplussdkvpc20250901/models/tag_for_describe_security_groups_output.py +149 -0
- byteplussdkvpc20250901/models/tag_for_describe_subnet_attributes_output.py +149 -0
- byteplussdkvpc20250901/models/tag_for_describe_subnets_output.py +149 -0
- byteplussdkvpc20250901/models/tag_for_describe_vpc_attributes_output.py +149 -0
- byteplussdkvpc20250901/models/tag_for_describe_vpcs_output.py +149 -0
- byteplussdkvpc20250901/models/tag_for_tag_resources_input.py +150 -0
- byteplussdkvpc20250901/models/tag_resources_request.py +183 -0
- byteplussdkvpc20250901/models/tag_resources_response.py +123 -0
- byteplussdkvpc20250901/models/unassign_private_ip_addresses_request.py +150 -0
- byteplussdkvpc20250901/models/unassign_private_ip_addresses_response.py +149 -0
- byteplussdkvpc20250901/models/untag_resources_request.py +183 -0
- byteplussdkvpc20250901/models/untag_resources_response.py +123 -0
- byteplussdkvpc20250901/models/vpc_for_describe_vpcs_output.py +539 -0
- {byteplus_python_sdk_v2-3.0.43.dist-info → byteplus_python_sdk_v2-3.0.45.dist-info}/WHEEL +0 -0
- {byteplus_python_sdk_v2-3.0.43.dist-info → byteplus_python_sdk_v2-3.0.45.dist-info}/licenses/LICENSE.txt +0 -0
- {byteplus_python_sdk_v2-3.0.43.dist-info → byteplus_python_sdk_v2-3.0.45.dist-info}/licenses/NOTICE.md +0 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# coding=utf-8
|
|
2
|
+
import logging
|
|
3
|
+
import os
|
|
4
|
+
import threading
|
|
5
|
+
|
|
6
|
+
from .provider import Provider
|
|
7
|
+
|
|
8
|
+
logger = logging.getLogger(__name__)
|
|
9
|
+
|
|
10
|
+
class DefaultCredentialProvider(Provider):
|
|
11
|
+
PROVIDER_NAME = "DefaultCredentialProvider"
|
|
12
|
+
|
|
13
|
+
def __init__(self, role_name=None,
|
|
14
|
+
reuse_last_provider_enabled=True,
|
|
15
|
+
providers=None):
|
|
16
|
+
if providers is not None:
|
|
17
|
+
self._providers = list(providers)
|
|
18
|
+
else:
|
|
19
|
+
from .env_provider import EnvironmentVariableCredentialProvider
|
|
20
|
+
from .sts_oidc_provider import StsOidcCredentialProvider
|
|
21
|
+
from .cli_config_provider import CLIConfigCredentialProvider
|
|
22
|
+
from .ecs_role_provider import EcsRoleCredentialProvider
|
|
23
|
+
|
|
24
|
+
self._providers = [
|
|
25
|
+
EnvironmentVariableCredentialProvider(),
|
|
26
|
+
StsOidcCredentialProvider(),
|
|
27
|
+
CLIConfigCredentialProvider(),
|
|
28
|
+
]
|
|
29
|
+
if os.environ.get("BYTEPLUS_ECS_METADATA_DISABLED", "").lower() != "true":
|
|
30
|
+
self._providers.append(
|
|
31
|
+
EcsRoleCredentialProvider(role_name=role_name)
|
|
32
|
+
)
|
|
33
|
+
self._reuse_last_provider_enabled = reuse_last_provider_enabled
|
|
34
|
+
self._last_provider = None
|
|
35
|
+
self._lock = threading.Lock()
|
|
36
|
+
|
|
37
|
+
@staticmethod
|
|
38
|
+
def _truncate_error_message(err):
|
|
39
|
+
err_msg = str(err)
|
|
40
|
+
if len(err_msg) > 200:
|
|
41
|
+
return err_msg[:200] + "...(truncated)"
|
|
42
|
+
return err_msg
|
|
43
|
+
|
|
44
|
+
def _drop_cached_provider(self, provider, err, action):
|
|
45
|
+
logger.warning(
|
|
46
|
+
"%s: cached provider %s failed to %s (%s: %s); falling back to full chain",
|
|
47
|
+
self.PROVIDER_NAME,
|
|
48
|
+
type(provider).__name__,
|
|
49
|
+
action,
|
|
50
|
+
type(err).__name__,
|
|
51
|
+
self._truncate_error_message(err),
|
|
52
|
+
)
|
|
53
|
+
with self._lock:
|
|
54
|
+
self._last_provider = None
|
|
55
|
+
|
|
56
|
+
def retrieve(self):
|
|
57
|
+
return self.get_credentials()
|
|
58
|
+
|
|
59
|
+
def is_expired(self):
|
|
60
|
+
provider = self._last_provider
|
|
61
|
+
if provider is not None:
|
|
62
|
+
return provider.is_expired()
|
|
63
|
+
return True
|
|
64
|
+
|
|
65
|
+
def refresh(self):
|
|
66
|
+
provider = self._last_provider
|
|
67
|
+
if provider is not None:
|
|
68
|
+
try:
|
|
69
|
+
provider.refresh()
|
|
70
|
+
return
|
|
71
|
+
except Exception as e:
|
|
72
|
+
self._drop_cached_provider(provider, e, "refresh credentials")
|
|
73
|
+
self.get_credentials()
|
|
74
|
+
|
|
75
|
+
def get_credentials(self):
|
|
76
|
+
if self._reuse_last_provider_enabled:
|
|
77
|
+
provider = self._last_provider
|
|
78
|
+
if provider is not None:
|
|
79
|
+
try:
|
|
80
|
+
creds = provider.get_credentials()
|
|
81
|
+
if creds is not None:
|
|
82
|
+
return creds
|
|
83
|
+
except Exception as e:
|
|
84
|
+
self._drop_cached_provider(provider, e, "return credentials")
|
|
85
|
+
|
|
86
|
+
errors = []
|
|
87
|
+
for provider in self._providers:
|
|
88
|
+
try:
|
|
89
|
+
creds = provider.get_credentials()
|
|
90
|
+
if creds is not None:
|
|
91
|
+
if self._reuse_last_provider_enabled:
|
|
92
|
+
with self._lock:
|
|
93
|
+
self._last_provider = provider
|
|
94
|
+
return creds
|
|
95
|
+
except Exception as e:
|
|
96
|
+
errors.append("{}: {}".format(type(provider).__name__, str(e)))
|
|
97
|
+
continue
|
|
98
|
+
|
|
99
|
+
error_details = "\n ".join(errors) if errors else "no providers configured"
|
|
100
|
+
raise RuntimeError(
|
|
101
|
+
"{}: unable to resolve credentials from any provider in the chain.\n"
|
|
102
|
+
"Attempted providers:\n {}".format(self.PROVIDER_NAME, error_details)
|
|
103
|
+
)
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
# coding=utf-8
|
|
2
|
+
import json
|
|
3
|
+
import logging
|
|
4
|
+
import os
|
|
5
|
+
import threading
|
|
6
|
+
import time
|
|
7
|
+
from datetime import datetime
|
|
8
|
+
|
|
9
|
+
import dateutil.parser
|
|
10
|
+
import dateutil.tz
|
|
11
|
+
|
|
12
|
+
from .provider import Provider, CredentialValue
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
# ECS IMDSv2 endpoint and protocol
|
|
17
|
+
_IMDS_ENDPOINT = "http://100.96.0.96"
|
|
18
|
+
_IMDS_CREDENTIALS_PATH = "/volcstack/latest/iam/security_credentials/{role_name}" # GET
|
|
19
|
+
_IMDS_ROLE_NAME_PATH = "/volcstack/latest/iam/security_credentials?type=user&format=json" # GET
|
|
20
|
+
_IMDS_TOKEN_PATH = "/latest/api/token" # PUT
|
|
21
|
+
|
|
22
|
+
# ECS IMDSv2 headers
|
|
23
|
+
_IMDS_TOKEN_TTL_HEADER = "X-volc-ecs-metadata-token-ttl-seconds"
|
|
24
|
+
_IMDS_TOKEN_HEADER = "X-volc-ecs-metadata-token"
|
|
25
|
+
_IMDS_TOKEN_TTL_SECONDS = "21600" # 6 hours
|
|
26
|
+
|
|
27
|
+
# ECS IMDSv2 response field names
|
|
28
|
+
_FIELD_AK = "AccessKeyId"
|
|
29
|
+
_FIELD_SK = "SecretAccessKey"
|
|
30
|
+
_FIELD_TOKEN = "SessionToken"
|
|
31
|
+
_FIELD_EXPIRATION = "ExpiredTime"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class EcsRoleCredentialProvider(Provider):
|
|
35
|
+
PROVIDER_NAME = "EcsRoleCredentialProvider"
|
|
36
|
+
|
|
37
|
+
def __init__(self, role_name=None, connect_timeout=1, read_timeout=1,
|
|
38
|
+
max_retries=3, retry_interval=1, expired_buffer_seconds=300):
|
|
39
|
+
if os.environ.get("BYTEPLUS_ECS_METADATA_DISABLED", "").lower() == "true":
|
|
40
|
+
raise ValueError(
|
|
41
|
+
"{}: IMDS credentials are disabled via "
|
|
42
|
+
"BYTEPLUS_ECS_METADATA_DISABLED=true.".format(self.PROVIDER_NAME)
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
self._role_name = role_name
|
|
46
|
+
self._connect_timeout = connect_timeout
|
|
47
|
+
self._read_timeout = read_timeout
|
|
48
|
+
self._max_retries = max(max_retries, 1)
|
|
49
|
+
self._retry_interval = retry_interval
|
|
50
|
+
self._expired_buffer_seconds = expired_buffer_seconds
|
|
51
|
+
|
|
52
|
+
self._credentials = None
|
|
53
|
+
self._expired_time = None
|
|
54
|
+
self._lock = threading.Lock()
|
|
55
|
+
|
|
56
|
+
def retrieve(self):
|
|
57
|
+
return self._credentials
|
|
58
|
+
|
|
59
|
+
def is_expired(self):
|
|
60
|
+
return (self._credentials is None or
|
|
61
|
+
(self._expired_time is not None
|
|
62
|
+
and self._expired_time < time.time() + self._expired_buffer_seconds))
|
|
63
|
+
|
|
64
|
+
def refresh(self):
|
|
65
|
+
with self._lock:
|
|
66
|
+
if self.is_expired():
|
|
67
|
+
self._refresh_credentials()
|
|
68
|
+
|
|
69
|
+
def get_credentials(self):
|
|
70
|
+
self.refresh()
|
|
71
|
+
return self._credentials
|
|
72
|
+
|
|
73
|
+
def _get_imdsv2_token(self):
|
|
74
|
+
url = _IMDS_ENDPOINT + _IMDS_TOKEN_PATH
|
|
75
|
+
headers = {_IMDS_TOKEN_TTL_HEADER: _IMDS_TOKEN_TTL_SECONDS}
|
|
76
|
+
body = self._do_request(url, method="PUT", extra_headers=headers)
|
|
77
|
+
token = body.strip()
|
|
78
|
+
if not token:
|
|
79
|
+
raise RuntimeError(
|
|
80
|
+
"{}: IMDSv2 token endpoint returned empty response.".format(
|
|
81
|
+
self.PROVIDER_NAME
|
|
82
|
+
)
|
|
83
|
+
)
|
|
84
|
+
return token
|
|
85
|
+
|
|
86
|
+
def _resolve_role_name(self, imds_token):
|
|
87
|
+
if self._role_name:
|
|
88
|
+
return self._role_name
|
|
89
|
+
|
|
90
|
+
env_role = os.environ.get("BYTEPLUS_ECS_METADATA", "").strip()
|
|
91
|
+
if env_role:
|
|
92
|
+
return env_role
|
|
93
|
+
|
|
94
|
+
return self._auto_detect_role_name(imds_token)
|
|
95
|
+
|
|
96
|
+
def _auto_detect_role_name(self, imds_token):
|
|
97
|
+
url = _IMDS_ENDPOINT + _IMDS_ROLE_NAME_PATH
|
|
98
|
+
headers = {_IMDS_TOKEN_HEADER: imds_token}
|
|
99
|
+
body = self._do_request(url, method="GET", extra_headers=headers)
|
|
100
|
+
|
|
101
|
+
try:
|
|
102
|
+
roles = json.loads(body)
|
|
103
|
+
except ValueError:
|
|
104
|
+
roles = [r.strip() for r in body.strip().split('\n') if r.strip()]
|
|
105
|
+
|
|
106
|
+
if isinstance(roles, list):
|
|
107
|
+
roles = [r.strip() if isinstance(r, str) else str(r) for r in roles if r]
|
|
108
|
+
else:
|
|
109
|
+
raise RuntimeError(
|
|
110
|
+
"{}: unexpected role list response format: {}".format(
|
|
111
|
+
self.PROVIDER_NAME, type(roles).__name__
|
|
112
|
+
)
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
if not roles:
|
|
116
|
+
raise RuntimeError(
|
|
117
|
+
"{}: no IAM roles found via IMDS.".format(self.PROVIDER_NAME)
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
if len(roles) > 1:
|
|
121
|
+
logger.warning(
|
|
122
|
+
"%s: multiple IAM roles found via IMDS: %s. Using the first one '%s'. "
|
|
123
|
+
"Set BYTEPLUS_ECS_METADATA or pass role_name explicitly to avoid ambiguity.",
|
|
124
|
+
self.PROVIDER_NAME, roles, roles[0],
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
return roles[0]
|
|
128
|
+
|
|
129
|
+
def _refresh_credentials(self):
|
|
130
|
+
imds_token = self._get_imdsv2_token()
|
|
131
|
+
role_name = self._resolve_role_name(imds_token)
|
|
132
|
+
|
|
133
|
+
url = _IMDS_ENDPOINT + _IMDS_CREDENTIALS_PATH.format(role_name=role_name)
|
|
134
|
+
headers = {_IMDS_TOKEN_HEADER: imds_token}
|
|
135
|
+
body = self._do_request(url, method="GET", extra_headers=headers)
|
|
136
|
+
|
|
137
|
+
try:
|
|
138
|
+
data = json.loads(body)
|
|
139
|
+
except ValueError as e:
|
|
140
|
+
raise RuntimeError(
|
|
141
|
+
"{}: failed to parse IMDS response: {}".format(self.PROVIDER_NAME, e)
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
ak = data.get(_FIELD_AK)
|
|
145
|
+
sk = data.get(_FIELD_SK)
|
|
146
|
+
token = data.get(_FIELD_TOKEN)
|
|
147
|
+
expiration_str = data.get(_FIELD_EXPIRATION)
|
|
148
|
+
|
|
149
|
+
if not ak or not sk:
|
|
150
|
+
raise RuntimeError(
|
|
151
|
+
"{}: IMDS response missing required credential fields.".format(
|
|
152
|
+
self.PROVIDER_NAME
|
|
153
|
+
)
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
if expiration_str:
|
|
157
|
+
dt = dateutil.parser.parse(expiration_str)
|
|
158
|
+
self._expired_time = (
|
|
159
|
+
dt - datetime(1970, 1, 1, tzinfo=dateutil.tz.tzutc())
|
|
160
|
+
).total_seconds()
|
|
161
|
+
else:
|
|
162
|
+
self._expired_time = None
|
|
163
|
+
|
|
164
|
+
self._credentials = CredentialValue(
|
|
165
|
+
ak=ak,
|
|
166
|
+
sk=sk,
|
|
167
|
+
session_token=token,
|
|
168
|
+
provider_name=self.PROVIDER_NAME,
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
def _do_request(self, url, method="GET", extra_headers=None):
|
|
172
|
+
"""Perform an HTTP request with retries."""
|
|
173
|
+
# Late imports to avoid circular deps (auth.providers is imported
|
|
174
|
+
# indirectly by byteplussdkcore/__init__.py).
|
|
175
|
+
from byteplussdkcore import ApiClient, Configuration
|
|
176
|
+
timeout = self._connect_timeout + self._read_timeout
|
|
177
|
+
return ApiClient(Configuration())._do_http_request(
|
|
178
|
+
url=url,
|
|
179
|
+
method=method,
|
|
180
|
+
headers=extra_headers,
|
|
181
|
+
timeout=timeout,
|
|
182
|
+
max_retries=self._max_retries,
|
|
183
|
+
retry_interval=self._retry_interval,
|
|
184
|
+
request_name="IMDS request",
|
|
185
|
+
provider_name=self.PROVIDER_NAME,
|
|
186
|
+
)
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# coding=utf-8
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
from .provider import Provider, CredentialValue
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class EnvironmentVariableCredentialProvider(Provider):
|
|
8
|
+
PROVIDER_NAME = "EnvironmentVariableCredentialProvider"
|
|
9
|
+
|
|
10
|
+
def retrieve(self):
|
|
11
|
+
return self.get_credentials()
|
|
12
|
+
|
|
13
|
+
def is_expired(self):
|
|
14
|
+
return False
|
|
15
|
+
|
|
16
|
+
def refresh(self):
|
|
17
|
+
return
|
|
18
|
+
|
|
19
|
+
def get_credentials(self):
|
|
20
|
+
ak = os.environ.get("BYTEPLUS_ACCESSKEY") or os.environ.get("BYTEPLUS_ACCESS_KEY")
|
|
21
|
+
sk = os.environ.get("BYTEPLUS_SECRETKEY") or os.environ.get("BYTEPLUS_SECRET_KEY")
|
|
22
|
+
|
|
23
|
+
if not ak or not sk:
|
|
24
|
+
raise RuntimeError(
|
|
25
|
+
"{}: unable to resolve credentials from environment variables. "
|
|
26
|
+
"Please set BYTEPLUS_ACCESSKEY and BYTEPLUS_SECRETKEY.".format(
|
|
27
|
+
self.PROVIDER_NAME
|
|
28
|
+
)
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
session_token = os.environ.get("BYTEPLUS_SESSION_TOKEN")
|
|
32
|
+
|
|
33
|
+
return CredentialValue(
|
|
34
|
+
ak=ak,
|
|
35
|
+
sk=sk,
|
|
36
|
+
session_token=session_token if session_token else None,
|
|
37
|
+
provider_name=self.PROVIDER_NAME,
|
|
38
|
+
)
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# coding=utf-8
|
|
2
2
|
import abc
|
|
3
|
+
import json
|
|
3
4
|
|
|
4
5
|
|
|
5
6
|
class CredentialValue:
|
|
@@ -11,6 +12,7 @@ class CredentialValue:
|
|
|
11
12
|
|
|
12
13
|
|
|
13
14
|
class Provider(object):
|
|
15
|
+
PROVIDER_NAME = "Provider"
|
|
14
16
|
|
|
15
17
|
@abc.abstractmethod
|
|
16
18
|
def retrieve(self):
|
|
@@ -26,4 +28,37 @@ class Provider(object):
|
|
|
26
28
|
|
|
27
29
|
@abc.abstractmethod
|
|
28
30
|
def get_credentials(self):
|
|
29
|
-
raise NotImplementedError()
|
|
31
|
+
raise NotImplementedError()
|
|
32
|
+
|
|
33
|
+
def _parse_json_response(self, content, response_name="response"):
|
|
34
|
+
try:
|
|
35
|
+
resp = json.loads(content)
|
|
36
|
+
except ValueError as e:
|
|
37
|
+
raise RuntimeError(
|
|
38
|
+
"{}: failed to parse {} as JSON: {}. raw={}".format(
|
|
39
|
+
self.PROVIDER_NAME, response_name, e, content
|
|
40
|
+
)
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
if not isinstance(resp, dict):
|
|
44
|
+
raise RuntimeError(
|
|
45
|
+
"{}: unexpected {} type: {}".format(
|
|
46
|
+
self.PROVIDER_NAME, response_name, type(resp).__name__
|
|
47
|
+
)
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
return resp
|
|
51
|
+
|
|
52
|
+
def _unwrap_result(self, resp, response_name="response"):
|
|
53
|
+
if 'Result' not in resp:
|
|
54
|
+
return resp
|
|
55
|
+
|
|
56
|
+
result = resp['Result']
|
|
57
|
+
if not isinstance(result, dict):
|
|
58
|
+
raise RuntimeError(
|
|
59
|
+
"{}: unexpected {}.Result type: {}".format(
|
|
60
|
+
self.PROVIDER_NAME, response_name, type(result).__name__
|
|
61
|
+
)
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
return result
|
|
@@ -4,9 +4,6 @@ from .provider import Provider, CredentialValue
|
|
|
4
4
|
|
|
5
5
|
class StaticCredentialProvider(Provider):
|
|
6
6
|
|
|
7
|
-
def _refresh(self):
|
|
8
|
-
return
|
|
9
|
-
|
|
10
7
|
def __init__(self, access_key_id, secret_access_key, session_token=None):
|
|
11
8
|
self.credentials = CredentialValue(
|
|
12
9
|
access_key_id,
|
|
@@ -23,3 +20,6 @@ class StaticCredentialProvider(Provider):
|
|
|
23
20
|
|
|
24
21
|
def refresh(self):
|
|
25
22
|
return
|
|
23
|
+
|
|
24
|
+
def get_credentials(self):
|
|
25
|
+
return self.credentials
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
+
import os
|
|
1
2
|
import threading
|
|
2
3
|
import time
|
|
3
4
|
import uuid
|
|
4
5
|
from datetime import datetime
|
|
5
6
|
|
|
6
7
|
import dateutil.parser
|
|
8
|
+
import dateutil.tz
|
|
7
9
|
|
|
8
|
-
from byteplussdkcore import UniversalApi, UniversalInfo, ApiClient, Configuration
|
|
9
10
|
from .provider import Provider, CredentialValue
|
|
10
11
|
|
|
11
12
|
|
|
@@ -19,30 +20,70 @@ class AssumeRoleOidcCredentials:
|
|
|
19
20
|
|
|
20
21
|
|
|
21
22
|
class StsOidcCredentialProvider(Provider):
|
|
22
|
-
|
|
23
|
-
|
|
23
|
+
PROVIDER_NAME = "StsOidcCredentialProvider"
|
|
24
|
+
|
|
25
|
+
def __init__(self, role_name=None, account_id=None, oidc_token=None,
|
|
26
|
+
duration_seconds=3600, scheme='https',
|
|
27
|
+
host='sts.ap-southeast-1.byteplusapi.com', region='ap-southeast-1', timeout=30,
|
|
28
|
+
expired_buffer_seconds=60, policy=None,
|
|
29
|
+
role_trn=None, oidc_token_file=None, session_name=None,
|
|
30
|
+
max_retries=3, retry_interval=1):
|
|
31
|
+
|
|
32
|
+
self._legacy_mode = oidc_token is not None
|
|
33
|
+
|
|
34
|
+
if role_trn:
|
|
35
|
+
self._role_trn = role_trn
|
|
36
|
+
elif role_name and account_id:
|
|
37
|
+
self._role_trn = 'trn:iam::' + account_id + ':role/' + role_name
|
|
38
|
+
elif not self._legacy_mode:
|
|
39
|
+
env_trn = os.environ.get("BYTEPLUS_OIDC_ROLE_TRN", "")
|
|
40
|
+
self._role_trn = env_trn if env_trn else None
|
|
41
|
+
else:
|
|
42
|
+
self._role_trn = None
|
|
43
|
+
|
|
24
44
|
self.role_name = role_name
|
|
25
45
|
self.account_id = account_id
|
|
26
|
-
|
|
46
|
+
|
|
47
|
+
self._oidc_token = oidc_token
|
|
48
|
+
if not self._legacy_mode:
|
|
49
|
+
self._oidc_token_file = oidc_token_file or os.environ.get("BYTEPLUS_OIDC_TOKEN_FILE", "") or None
|
|
50
|
+
else:
|
|
51
|
+
self._oidc_token_file = oidc_token_file
|
|
52
|
+
|
|
53
|
+
if session_name:
|
|
54
|
+
self._session_name = session_name
|
|
55
|
+
elif not self._legacy_mode:
|
|
56
|
+
self._session_name = os.environ.get("BYTEPLUS_OIDC_ROLE_SESSION_NAME", "") or None
|
|
57
|
+
else:
|
|
58
|
+
self._session_name = None
|
|
59
|
+
|
|
60
|
+
if policy is not None:
|
|
61
|
+
self.policy = policy
|
|
62
|
+
elif not self._legacy_mode:
|
|
63
|
+
self.policy = os.environ.get("BYTEPLUS_OIDC_ROLE_POLICY") or None
|
|
64
|
+
else:
|
|
65
|
+
self.policy = None
|
|
66
|
+
|
|
67
|
+
if host:
|
|
68
|
+
self.host = host
|
|
69
|
+
elif not self._legacy_mode:
|
|
70
|
+
self.host = os.environ.get("BYTEPLUS_OIDC_STS_ENDPOINT", "") or "sts.byteplusapi.com"
|
|
71
|
+
else:
|
|
72
|
+
self.host = "sts.byteplusapi.com"
|
|
27
73
|
|
|
28
74
|
self.timeout = timeout
|
|
75
|
+
self.max_retries = max(max_retries, 1)
|
|
76
|
+
self.retry_interval = retry_interval
|
|
29
77
|
self.duration_seconds = duration_seconds
|
|
30
|
-
|
|
31
|
-
self.host = host
|
|
32
78
|
self.region = region
|
|
33
79
|
self.scheme = scheme
|
|
34
|
-
|
|
35
|
-
self.expired_time = None
|
|
36
|
-
if host is None:
|
|
37
|
-
raise ValueError('host is required')
|
|
38
|
-
if region is None:
|
|
39
|
-
raise ValueError('region is required')
|
|
80
|
+
|
|
40
81
|
if expired_buffer_seconds > 600:
|
|
41
82
|
raise ValueError('expired_buffer_seconds must be less than or equal to 600')
|
|
42
83
|
self.expired_buffer_seconds = expired_buffer_seconds
|
|
43
84
|
|
|
85
|
+
self.expired_time = None
|
|
44
86
|
self.credentials = None
|
|
45
|
-
|
|
46
87
|
self._lock = threading.Lock()
|
|
47
88
|
|
|
48
89
|
def retrieve(self):
|
|
@@ -61,39 +102,88 @@ class StsOidcCredentialProvider(Provider):
|
|
|
61
102
|
self.refresh()
|
|
62
103
|
return self.credentials
|
|
63
104
|
|
|
105
|
+
def _resolve_oidc_token(self):
|
|
106
|
+
if self._oidc_token:
|
|
107
|
+
return self._oidc_token
|
|
108
|
+
|
|
109
|
+
token_file = self._oidc_token_file
|
|
110
|
+
if not token_file:
|
|
111
|
+
raise RuntimeError(
|
|
112
|
+
"{}: OIDC token not provided. Set oidc_token, oidc_token_file, "
|
|
113
|
+
"or BYTEPLUS_OIDC_TOKEN_FILE environment variable.".format(self.PROVIDER_NAME)
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
try:
|
|
117
|
+
with open(token_file, 'r') as f:
|
|
118
|
+
token = f.read().strip()
|
|
119
|
+
except (IOError, OSError) as e:
|
|
120
|
+
raise RuntimeError(
|
|
121
|
+
"{}: failed to read OIDC token file '{}': {}".format(
|
|
122
|
+
self.PROVIDER_NAME, token_file, e
|
|
123
|
+
)
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
if not token:
|
|
127
|
+
raise RuntimeError(
|
|
128
|
+
"{}: OIDC token file '{}' is empty.".format(self.PROVIDER_NAME, token_file)
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
return token
|
|
132
|
+
|
|
64
133
|
def _assume_role_oidc(self):
|
|
134
|
+
if not self._role_trn:
|
|
135
|
+
raise RuntimeError(
|
|
136
|
+
"{}: role_trn not provided. Set role_trn (or role_name+account_id), "
|
|
137
|
+
"or BYTEPLUS_OIDC_ROLE_TRN environment variable.".format(self.PROVIDER_NAME)
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
oidc_token = self._resolve_oidc_token()
|
|
141
|
+
|
|
142
|
+
if self._session_name:
|
|
143
|
+
session_name = self._session_name
|
|
144
|
+
elif self._legacy_mode:
|
|
145
|
+
session_name = uuid.uuid4().hex
|
|
146
|
+
else:
|
|
147
|
+
session_name = "credentials-python-" + str(int(time.time() * 1000000))
|
|
148
|
+
|
|
65
149
|
params = {
|
|
66
150
|
'DurationSeconds': self.duration_seconds,
|
|
67
|
-
'RoleSessionName':
|
|
68
|
-
'RoleTrn':
|
|
69
|
-
'OIDCToken':
|
|
151
|
+
'RoleSessionName': session_name,
|
|
152
|
+
'RoleTrn': self._role_trn,
|
|
153
|
+
'OIDCToken': oidc_token,
|
|
70
154
|
}
|
|
71
|
-
if self.policy
|
|
155
|
+
if self.policy:
|
|
72
156
|
params['Policy'] = self.policy
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
#
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
157
|
+
|
|
158
|
+
# Late imports to avoid circular deps (auth.providers is imported
|
|
159
|
+
# indirectly by byteplussdkcore/__init__.py).
|
|
160
|
+
from byteplussdkcore import ApiClient, Configuration
|
|
161
|
+
resp_result = ApiClient(Configuration())._sts_call(
|
|
162
|
+
action='AssumeRoleWithOIDC',
|
|
163
|
+
version='2018-01-01',
|
|
164
|
+
params=params,
|
|
165
|
+
host=self.host,
|
|
166
|
+
scheme=self.scheme,
|
|
167
|
+
region=self.region,
|
|
168
|
+
timeout=self.timeout,
|
|
169
|
+
max_retries=self.max_retries,
|
|
170
|
+
retry_interval=self.retry_interval,
|
|
171
|
+
provider_name=self.PROVIDER_NAME,
|
|
172
|
+
)
|
|
173
|
+
if 'Credentials' not in resp_result:
|
|
174
|
+
raise RuntimeError(
|
|
175
|
+
'failed to retrieve credentials from sts {}:{}'.format(
|
|
176
|
+
self.PROVIDER_NAME, str(resp_result)
|
|
177
|
+
)
|
|
178
|
+
)
|
|
179
|
+
resp_cred = resp_result['Credentials']
|
|
180
|
+
|
|
181
|
+
dt = dateutil.parser.parse(resp_cred.get('Expiration', resp_cred.get('ExpiredTime')))
|
|
94
182
|
self.expired_time = (dt - datetime(1970, 1, 1, tzinfo=dateutil.tz.tzutc())).total_seconds()
|
|
95
183
|
|
|
96
|
-
self.credentials = CredentialValue(
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
184
|
+
self.credentials = CredentialValue(
|
|
185
|
+
ak=resp_cred['AccessKeyId'],
|
|
186
|
+
sk=resp_cred['SecretAccessKey'],
|
|
187
|
+
session_token=resp_cred['SessionToken'],
|
|
188
|
+
provider_name=self.PROVIDER_NAME,
|
|
189
|
+
)
|
|
@@ -20,13 +20,15 @@ class AssumeRoleCredentials:
|
|
|
20
20
|
|
|
21
21
|
class StsCredentialProvider(Provider):
|
|
22
22
|
def __init__(self, ak, sk, role_name, account_id, duration_seconds=3600, scheme='https',
|
|
23
|
-
host='
|
|
23
|
+
host='sts.ap-southeast-1.byteplusapi.com', region='ap-southeast-1', timeout=30, expired_buffer_seconds=60, policy=None, max_retries=3, retry_interval=1):
|
|
24
24
|
self.ak = ak
|
|
25
25
|
self.sk = sk
|
|
26
26
|
self.role_name = role_name
|
|
27
27
|
self.account_id = account_id
|
|
28
28
|
|
|
29
29
|
self.timeout = timeout
|
|
30
|
+
self.max_retries = max(max_retries, 1)
|
|
31
|
+
self.retry_interval = retry_interval
|
|
30
32
|
self.duration_seconds = duration_seconds
|
|
31
33
|
|
|
32
34
|
self.host = host
|
|
@@ -74,6 +76,13 @@ class StsCredentialProvider(Provider):
|
|
|
74
76
|
configuration.region = self.region
|
|
75
77
|
configuration.scheme = self.scheme
|
|
76
78
|
configuration.read_timeout = self.timeout
|
|
79
|
+
|
|
80
|
+
import copy
|
|
81
|
+
configuration._Configuration__retryer = copy.deepcopy(configuration.retryer)
|
|
82
|
+
configuration.num_max_retries = max(self.max_retries - 1, 0)
|
|
83
|
+
delay_ms = int(self.retry_interval * 1000)
|
|
84
|
+
configuration.min_retry_delay_ms = delay_ms
|
|
85
|
+
configuration.max_retry_delay_ms = delay_ms
|
|
77
86
|
c = UniversalApi(ApiClient(configuration))
|
|
78
87
|
info = UniversalInfo(method='GET', service='sts', version='2018-01-01', action='AssumeRole',
|
|
79
88
|
content_type='text/plain')
|