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,628 @@
|
|
|
1
|
+
# coding=utf-8
|
|
2
|
+
import calendar
|
|
3
|
+
import hashlib
|
|
4
|
+
import json
|
|
5
|
+
import os
|
|
6
|
+
import tempfile
|
|
7
|
+
import threading
|
|
8
|
+
import time
|
|
9
|
+
|
|
10
|
+
from datetime import datetime
|
|
11
|
+
|
|
12
|
+
from .provider import Provider, CredentialValue
|
|
13
|
+
|
|
14
|
+
_DEFAULT_REGION = "ap-southeast-1"
|
|
15
|
+
_OAUTH_BASE_URL_TEMPLATE = "https://cloudidentity-oauth.{}.bytepluses.com"
|
|
16
|
+
_PORTAL_BASE_URL_TEMPLATE = "https://cloudidentity-portal.{}.bytepluses.com"
|
|
17
|
+
_PORTAL_ACCESS_TOKEN_HEADER = "x-bd-cloudidentity-bearer-token"
|
|
18
|
+
_HTTP_TIMEOUT = 30
|
|
19
|
+
_HTTP_MAX_RETRIES = 3
|
|
20
|
+
_HTTP_RETRY_INTERVAL = 1
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class CLIConfigCredentialProvider(Provider):
|
|
24
|
+
PROVIDER_NAME = "CLIConfigCredentialProvider"
|
|
25
|
+
|
|
26
|
+
def __init__(self, profile_name=None, config_path=None):
|
|
27
|
+
self._profile_name = profile_name
|
|
28
|
+
self._config_path = config_path
|
|
29
|
+
self._delegate = None
|
|
30
|
+
self._static_cred = None
|
|
31
|
+
self._initialized = False
|
|
32
|
+
self._init_lock = threading.Lock()
|
|
33
|
+
self._resolved_config_path = None
|
|
34
|
+
|
|
35
|
+
def _init_delegate(self):
|
|
36
|
+
profile, profile_name, config = self._load_profile()
|
|
37
|
+
raw_mode = profile.get("mode", "") or ""
|
|
38
|
+
mode = raw_mode.lower().strip()
|
|
39
|
+
|
|
40
|
+
if mode in ("ak", ""):
|
|
41
|
+
self._static_cred = self._read_ak_mode(profile, profile_name)
|
|
42
|
+
elif mode == "ramrolearn":
|
|
43
|
+
self._static_cred = None
|
|
44
|
+
self._delegate = self._create_ram_role_arn_delegate(profile, profile_name)
|
|
45
|
+
elif mode == "oidc":
|
|
46
|
+
self._static_cred = None
|
|
47
|
+
self._delegate = self._create_oidc_delegate(profile, profile_name)
|
|
48
|
+
elif mode == "ecsrole":
|
|
49
|
+
self._static_cred = None
|
|
50
|
+
self._delegate = self._create_ecs_role_delegate(profile, profile_name)
|
|
51
|
+
elif mode == "sso":
|
|
52
|
+
self._static_cred = None
|
|
53
|
+
self._delegate = self._create_sso_delegate(profile, profile_name, config)
|
|
54
|
+
else:
|
|
55
|
+
raise RuntimeError(
|
|
56
|
+
"{}: unsupported mode: {}".format(self.PROVIDER_NAME, mode)
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
def _load_profile(self):
|
|
60
|
+
config_path = (
|
|
61
|
+
self._config_path
|
|
62
|
+
or os.environ.get("BYTEPLUS_CLI_CONFIG_FILE")
|
|
63
|
+
or os.path.expanduser("~/.byteplus/config.json")
|
|
64
|
+
)
|
|
65
|
+
self._resolved_config_path = config_path
|
|
66
|
+
|
|
67
|
+
if not os.path.isfile(config_path):
|
|
68
|
+
raise RuntimeError(
|
|
69
|
+
"{}: config file not found at '{}'.".format(self.PROVIDER_NAME, config_path)
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
with open(config_path, 'r') as f:
|
|
73
|
+
try:
|
|
74
|
+
config = json.load(f)
|
|
75
|
+
except ValueError as e:
|
|
76
|
+
raise RuntimeError(
|
|
77
|
+
"{}: failed to parse config file '{}': {}".format(
|
|
78
|
+
self.PROVIDER_NAME, config_path, e
|
|
79
|
+
)
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
profile_name = (self._profile_name
|
|
83
|
+
or os.environ.get("BYTEPLUS_PROFILE")
|
|
84
|
+
or config.get("current"))
|
|
85
|
+
|
|
86
|
+
if not profile_name:
|
|
87
|
+
profile_name = "default"
|
|
88
|
+
|
|
89
|
+
profiles = config.get("profiles", {})
|
|
90
|
+
profile = profiles.get(profile_name)
|
|
91
|
+
|
|
92
|
+
if profile is None:
|
|
93
|
+
raise RuntimeError(
|
|
94
|
+
"{}: profile '{}' not found in config file.".format(
|
|
95
|
+
self.PROVIDER_NAME, profile_name
|
|
96
|
+
)
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
return profile, profile_name, config
|
|
100
|
+
|
|
101
|
+
def retrieve(self):
|
|
102
|
+
return self.get_credentials()
|
|
103
|
+
|
|
104
|
+
def is_expired(self):
|
|
105
|
+
if not self._initialized:
|
|
106
|
+
return True
|
|
107
|
+
if self._delegate is not None:
|
|
108
|
+
return self._delegate.is_expired()
|
|
109
|
+
return False
|
|
110
|
+
|
|
111
|
+
def refresh(self):
|
|
112
|
+
if self._delegate is not None:
|
|
113
|
+
return self._delegate.refresh()
|
|
114
|
+
return
|
|
115
|
+
|
|
116
|
+
def get_credentials(self):
|
|
117
|
+
if not self._initialized:
|
|
118
|
+
with self._init_lock:
|
|
119
|
+
if not self._initialized:
|
|
120
|
+
self._init_delegate()
|
|
121
|
+
self._initialized = True
|
|
122
|
+
if self._delegate is not None:
|
|
123
|
+
return self._delegate.get_credentials()
|
|
124
|
+
return self._static_cred
|
|
125
|
+
|
|
126
|
+
def _read_ak_mode(self, profile, profile_name):
|
|
127
|
+
ak = profile.get("access-key", "").strip()
|
|
128
|
+
sk = profile.get("secret-key", "").strip()
|
|
129
|
+
|
|
130
|
+
if not ak or not sk:
|
|
131
|
+
raise RuntimeError(
|
|
132
|
+
"{}: profile '{}' does not contain valid access-key and secret-key.".format(
|
|
133
|
+
self.PROVIDER_NAME, profile_name
|
|
134
|
+
)
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
session_token = profile.get("session-token", "").strip() or None
|
|
138
|
+
|
|
139
|
+
return CredentialValue(
|
|
140
|
+
ak=ak,
|
|
141
|
+
sk=sk,
|
|
142
|
+
session_token=session_token,
|
|
143
|
+
provider_name=self.PROVIDER_NAME,
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
def _create_ram_role_arn_delegate(self, profile, profile_name):
|
|
147
|
+
from .sts_provider import StsCredentialProvider
|
|
148
|
+
|
|
149
|
+
ak = profile.get("access-key", "").strip()
|
|
150
|
+
sk = profile.get("secret-key", "").strip()
|
|
151
|
+
role_name = profile.get("role-name", "").strip()
|
|
152
|
+
account_id = profile.get("account-id", "").strip()
|
|
153
|
+
|
|
154
|
+
if not ak or not sk:
|
|
155
|
+
raise RuntimeError(
|
|
156
|
+
"{}: profile '{}' mode is RamRoleArn but access-key/secret-key is not set.".format(
|
|
157
|
+
self.PROVIDER_NAME, profile_name
|
|
158
|
+
)
|
|
159
|
+
)
|
|
160
|
+
if not role_name:
|
|
161
|
+
raise RuntimeError(
|
|
162
|
+
"{}: profile '{}' mode is RamRoleArn but role-name is not set.".format(
|
|
163
|
+
self.PROVIDER_NAME, profile_name
|
|
164
|
+
)
|
|
165
|
+
)
|
|
166
|
+
if not account_id:
|
|
167
|
+
raise RuntimeError(
|
|
168
|
+
"{}: profile '{}' mode is RamRoleArn but account-id is not set.".format(
|
|
169
|
+
self.PROVIDER_NAME, profile_name
|
|
170
|
+
)
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
kwargs = dict(ak=ak, sk=sk, role_name=role_name, account_id=account_id)
|
|
174
|
+
region = (profile.get("region") or "").strip()
|
|
175
|
+
if region:
|
|
176
|
+
kwargs["region"] = region
|
|
177
|
+
return StsCredentialProvider(**kwargs)
|
|
178
|
+
|
|
179
|
+
def _create_oidc_delegate(self, profile, profile_name):
|
|
180
|
+
from .sts_oidc_provider import StsOidcCredentialProvider
|
|
181
|
+
|
|
182
|
+
role_trn = (profile.get("role-trn") or "").strip()
|
|
183
|
+
oidc_token_file = (profile.get("oidc-token-file") or "").strip()
|
|
184
|
+
policy = (profile.get("policy") or "").strip() or None
|
|
185
|
+
|
|
186
|
+
if not role_trn:
|
|
187
|
+
raise RuntimeError(
|
|
188
|
+
"{}: profile '{}' mode is OIDC but role-trn is not set.".format(
|
|
189
|
+
self.PROVIDER_NAME, profile_name
|
|
190
|
+
)
|
|
191
|
+
)
|
|
192
|
+
if not oidc_token_file:
|
|
193
|
+
raise RuntimeError(
|
|
194
|
+
"{}: profile '{}' mode is OIDC but oidc-token-file is not set.".format(
|
|
195
|
+
self.PROVIDER_NAME, profile_name
|
|
196
|
+
)
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
kwargs = dict(role_trn=role_trn, oidc_token_file=oidc_token_file, policy=policy)
|
|
200
|
+
region = (profile.get("region") or "").strip()
|
|
201
|
+
if region:
|
|
202
|
+
kwargs["region"] = region
|
|
203
|
+
return StsOidcCredentialProvider(**kwargs)
|
|
204
|
+
|
|
205
|
+
def _create_ecs_role_delegate(self, profile, profile_name):
|
|
206
|
+
from .ecs_role_provider import EcsRoleCredentialProvider
|
|
207
|
+
|
|
208
|
+
role_name = profile.get("role-name", "").strip()
|
|
209
|
+
|
|
210
|
+
if not role_name:
|
|
211
|
+
raise RuntimeError(
|
|
212
|
+
"{}: profile '{}' mode is EcsRole but role-name is not set.".format(
|
|
213
|
+
self.PROVIDER_NAME, profile_name
|
|
214
|
+
)
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
return EcsRoleCredentialProvider(role_name=role_name)
|
|
218
|
+
|
|
219
|
+
def _create_sso_delegate(self, profile, profile_name, config):
|
|
220
|
+
session_name = (profile.get("sso-session-name") or "").strip()
|
|
221
|
+
if not session_name:
|
|
222
|
+
raise RuntimeError(
|
|
223
|
+
"{}: profile '{}' mode is sso but sso-session-name is not set.".format(
|
|
224
|
+
self.PROVIDER_NAME, profile_name
|
|
225
|
+
)
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
sso_sessions = config.get("sso-session", {}) or {}
|
|
229
|
+
session = sso_sessions.get(session_name)
|
|
230
|
+
if session is None:
|
|
231
|
+
raise RuntimeError(
|
|
232
|
+
"{}: sso-session '{}' not found in config file.".format(
|
|
233
|
+
self.PROVIDER_NAME, session_name
|
|
234
|
+
)
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
start_url = (session.get("start-url") or "").strip()
|
|
238
|
+
if not start_url:
|
|
239
|
+
raise RuntimeError(
|
|
240
|
+
"{}: sso-session '{}' does not contain start-url.".format(
|
|
241
|
+
self.PROVIDER_NAME, session_name
|
|
242
|
+
)
|
|
243
|
+
)
|
|
244
|
+
|
|
245
|
+
region = (session.get("region") or "").strip() or _DEFAULT_REGION
|
|
246
|
+
|
|
247
|
+
account_id = (profile.get("account-id") or "").strip()
|
|
248
|
+
if not account_id:
|
|
249
|
+
raise RuntimeError(
|
|
250
|
+
"{}: profile '{}' mode is sso but account-id is not set.".format(
|
|
251
|
+
self.PROVIDER_NAME, profile_name
|
|
252
|
+
)
|
|
253
|
+
)
|
|
254
|
+
|
|
255
|
+
role_name = (profile.get("role-name") or "").strip()
|
|
256
|
+
if not role_name:
|
|
257
|
+
raise RuntimeError(
|
|
258
|
+
"{}: profile '{}' mode is sso but role-name is not set.".format(
|
|
259
|
+
self.PROVIDER_NAME, profile_name
|
|
260
|
+
)
|
|
261
|
+
)
|
|
262
|
+
|
|
263
|
+
config_path = self._resolved_config_path or (
|
|
264
|
+
self._config_path
|
|
265
|
+
or os.environ.get("BYTEPLUS_CLI_CONFIG_FILE")
|
|
266
|
+
or os.path.expanduser("~/.byteplus/config.json")
|
|
267
|
+
)
|
|
268
|
+
cache_dir = os.path.join(os.path.dirname(config_path), "sso", "cache")
|
|
269
|
+
|
|
270
|
+
return SsoCredentialProvider(
|
|
271
|
+
profile=profile,
|
|
272
|
+
start_url=start_url,
|
|
273
|
+
session_name=session_name,
|
|
274
|
+
region=region,
|
|
275
|
+
account_id=account_id,
|
|
276
|
+
role_name=role_name,
|
|
277
|
+
cache_dir=cache_dir,
|
|
278
|
+
)
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
def _unix_timestamp_to_epoch(ts):
|
|
282
|
+
if ts >= 1e18:
|
|
283
|
+
return ts / 1e9
|
|
284
|
+
elif ts >= 1e15:
|
|
285
|
+
return ts / 1e6
|
|
286
|
+
elif ts >= 1e12:
|
|
287
|
+
return ts / 1e3
|
|
288
|
+
else:
|
|
289
|
+
return float(ts)
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
def _token_cache_filename(start_url, session_name):
|
|
293
|
+
payload = json.dumps({"start_url": start_url, "session_name": session_name},
|
|
294
|
+
separators=(',', ':'), sort_keys=False)
|
|
295
|
+
digest = hashlib.sha1(payload.encode("utf-8")).hexdigest()
|
|
296
|
+
return "{}.json".format(digest)
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
def _parse_rfc3339(value):
|
|
300
|
+
value = value.strip()
|
|
301
|
+
if not value:
|
|
302
|
+
raise ValueError("expires_at is empty")
|
|
303
|
+
if value.endswith("Z"):
|
|
304
|
+
value = value[:-1] + "+00:00"
|
|
305
|
+
try:
|
|
306
|
+
return datetime.fromisoformat(value)
|
|
307
|
+
except (ValueError, AttributeError):
|
|
308
|
+
pass
|
|
309
|
+
for fmt in ("%Y-%m-%dT%H:%M:%S%z", "%Y-%m-%dT%H:%M:%S.%f%z",
|
|
310
|
+
"%Y-%m-%dT%H:%M:%S", "%Y-%m-%dT%H:%M:%S.%f"):
|
|
311
|
+
try:
|
|
312
|
+
return datetime.strptime(value, fmt)
|
|
313
|
+
except ValueError:
|
|
314
|
+
continue
|
|
315
|
+
raise ValueError("cannot parse expires_at: {}".format(value))
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
def _rfc3339_to_epoch(value):
|
|
319
|
+
exp_dt = _parse_rfc3339(value)
|
|
320
|
+
if exp_dt.tzinfo:
|
|
321
|
+
utc_dt = exp_dt - exp_dt.utcoffset()
|
|
322
|
+
return calendar.timegm(utc_dt.timetuple())
|
|
323
|
+
return calendar.timegm(exp_dt.timetuple())
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
def _write_json_file_atomic(path, data):
|
|
327
|
+
dir_name = os.path.dirname(path)
|
|
328
|
+
if not os.path.exists(dir_name):
|
|
329
|
+
try:
|
|
330
|
+
os.makedirs(dir_name)
|
|
331
|
+
except OSError:
|
|
332
|
+
pass
|
|
333
|
+
fd, tmp_path = tempfile.mkstemp(dir=dir_name, prefix=".tmp-", suffix=".json")
|
|
334
|
+
try:
|
|
335
|
+
with os.fdopen(fd, 'w') as f:
|
|
336
|
+
json.dump(data, f)
|
|
337
|
+
os.chmod(tmp_path, 0o600)
|
|
338
|
+
os.rename(tmp_path, path)
|
|
339
|
+
except Exception:
|
|
340
|
+
try:
|
|
341
|
+
os.remove(tmp_path)
|
|
342
|
+
except OSError:
|
|
343
|
+
pass
|
|
344
|
+
raise
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
class SsoCredentialProvider(Provider):
|
|
348
|
+
PROVIDER_NAME = "SsoCredentialProvider"
|
|
349
|
+
|
|
350
|
+
def __init__(self, profile, start_url, session_name, region,
|
|
351
|
+
account_id, role_name, cache_dir):
|
|
352
|
+
self._profile = profile
|
|
353
|
+
self._start_url = start_url
|
|
354
|
+
self._session_name = session_name
|
|
355
|
+
self._region = region
|
|
356
|
+
self._account_id = account_id
|
|
357
|
+
self._role_name = role_name
|
|
358
|
+
self._cache_dir = cache_dir
|
|
359
|
+
|
|
360
|
+
self._credentials = None
|
|
361
|
+
self._expiration = None
|
|
362
|
+
self._lock = threading.Lock()
|
|
363
|
+
|
|
364
|
+
def retrieve(self):
|
|
365
|
+
return self.get_credentials()
|
|
366
|
+
|
|
367
|
+
def is_expired(self):
|
|
368
|
+
if self._credentials is None:
|
|
369
|
+
return True
|
|
370
|
+
if self._expiration is not None:
|
|
371
|
+
return time.time() >= self._expiration - 60
|
|
372
|
+
return False
|
|
373
|
+
|
|
374
|
+
def refresh(self):
|
|
375
|
+
with self._lock:
|
|
376
|
+
if self.is_expired():
|
|
377
|
+
self._do_refresh()
|
|
378
|
+
|
|
379
|
+
def get_credentials(self):
|
|
380
|
+
self.refresh()
|
|
381
|
+
return self._credentials
|
|
382
|
+
|
|
383
|
+
def _do_refresh(self):
|
|
384
|
+
cred = self._try_cached_sts_credentials()
|
|
385
|
+
if cred is not None:
|
|
386
|
+
self._credentials = cred
|
|
387
|
+
return
|
|
388
|
+
|
|
389
|
+
token_path = os.path.join(
|
|
390
|
+
self._cache_dir,
|
|
391
|
+
_token_cache_filename(self._start_url, self._session_name),
|
|
392
|
+
)
|
|
393
|
+
if not os.path.isfile(token_path):
|
|
394
|
+
raise RuntimeError(
|
|
395
|
+
"{}: SSO token cache file not found at '{}'.".format(
|
|
396
|
+
self.PROVIDER_NAME, token_path
|
|
397
|
+
)
|
|
398
|
+
)
|
|
399
|
+
|
|
400
|
+
with open(token_path, 'r') as f:
|
|
401
|
+
try:
|
|
402
|
+
token_cache = json.load(f)
|
|
403
|
+
except ValueError as e:
|
|
404
|
+
raise RuntimeError(
|
|
405
|
+
"{}: failed to parse SSO token cache '{}': {}".format(
|
|
406
|
+
self.PROVIDER_NAME, token_path, e
|
|
407
|
+
)
|
|
408
|
+
)
|
|
409
|
+
|
|
410
|
+
access_token = (token_cache.get("access_token") or "").strip()
|
|
411
|
+
if not access_token:
|
|
412
|
+
raise RuntimeError(
|
|
413
|
+
"{}: SSO token cache '{}' does not contain access_token.".format(
|
|
414
|
+
self.PROVIDER_NAME, token_path
|
|
415
|
+
)
|
|
416
|
+
)
|
|
417
|
+
|
|
418
|
+
expires_at = (token_cache.get("expires_at") or "").strip()
|
|
419
|
+
token_expired = False
|
|
420
|
+
if expires_at:
|
|
421
|
+
try:
|
|
422
|
+
exp_epoch = _rfc3339_to_epoch(expires_at)
|
|
423
|
+
token_expired = time.time() > exp_epoch
|
|
424
|
+
except ValueError as e:
|
|
425
|
+
raise RuntimeError(
|
|
426
|
+
"{}: failed to parse expires_at in '{}': {}".format(
|
|
427
|
+
self.PROVIDER_NAME, token_path, e
|
|
428
|
+
)
|
|
429
|
+
)
|
|
430
|
+
|
|
431
|
+
if token_expired:
|
|
432
|
+
access_token = self._refresh_access_token(token_cache, token_path)
|
|
433
|
+
|
|
434
|
+
self._fetch_role_credentials(access_token)
|
|
435
|
+
|
|
436
|
+
def _try_cached_sts_credentials(self):
|
|
437
|
+
sts_expiration = self._profile.get("sts-expiration", 0)
|
|
438
|
+
if not sts_expiration or sts_expiration <= 0:
|
|
439
|
+
return None
|
|
440
|
+
|
|
441
|
+
exp_epoch = _unix_timestamp_to_epoch(sts_expiration)
|
|
442
|
+
if time.time() >= exp_epoch:
|
|
443
|
+
return None
|
|
444
|
+
|
|
445
|
+
ak = (self._profile.get("access-key") or "").strip()
|
|
446
|
+
sk = (self._profile.get("secret-key") or "").strip()
|
|
447
|
+
if not ak or not sk:
|
|
448
|
+
return None
|
|
449
|
+
|
|
450
|
+
session_token = (self._profile.get("session-token") or "").strip() or None
|
|
451
|
+
|
|
452
|
+
self._expiration = exp_epoch
|
|
453
|
+
return CredentialValue(
|
|
454
|
+
ak=ak,
|
|
455
|
+
sk=sk,
|
|
456
|
+
session_token=session_token,
|
|
457
|
+
provider_name=self.PROVIDER_NAME,
|
|
458
|
+
)
|
|
459
|
+
|
|
460
|
+
def _refresh_access_token(self, token_cache, token_path):
|
|
461
|
+
refresh_token = (token_cache.get("refresh_token") or "").strip()
|
|
462
|
+
if not refresh_token:
|
|
463
|
+
raise RuntimeError(
|
|
464
|
+
"{}: SSO token cache '{}' does not contain refresh_token.".format(
|
|
465
|
+
self.PROVIDER_NAME, token_path
|
|
466
|
+
)
|
|
467
|
+
)
|
|
468
|
+
|
|
469
|
+
client_secret_expires_at = token_cache.get("client_secret_expires_at", 0)
|
|
470
|
+
if client_secret_expires_at and client_secret_expires_at > 0:
|
|
471
|
+
exp_epoch = _unix_timestamp_to_epoch(client_secret_expires_at)
|
|
472
|
+
if time.time() >= exp_epoch:
|
|
473
|
+
raise RuntimeError(
|
|
474
|
+
"{}: refresh token in '{}' has expired.".format(
|
|
475
|
+
self.PROVIDER_NAME, token_path
|
|
476
|
+
)
|
|
477
|
+
)
|
|
478
|
+
|
|
479
|
+
client_id = (token_cache.get("client_id") or "").strip()
|
|
480
|
+
client_secret = (token_cache.get("client_secret") or "").strip()
|
|
481
|
+
if not client_id or not client_secret:
|
|
482
|
+
raise RuntimeError(
|
|
483
|
+
"{}: SSO token cache '{}' does not contain client_id/client_secret.".format(
|
|
484
|
+
self.PROVIDER_NAME, token_path
|
|
485
|
+
)
|
|
486
|
+
)
|
|
487
|
+
|
|
488
|
+
oauth_url = "{}/token".format(
|
|
489
|
+
_OAUTH_BASE_URL_TEMPLATE.format(self._region)
|
|
490
|
+
)
|
|
491
|
+
|
|
492
|
+
# Late imports to avoid circular deps (auth.providers is imported
|
|
493
|
+
# indirectly by byteplussdkcore/__init__.py).
|
|
494
|
+
from byteplussdkcore import ApiClient, Configuration
|
|
495
|
+
# Pass a dict body; RESTClient auto-serializes with Content-Type:
|
|
496
|
+
# application/json (see byteplussdkcore/rest.py). Do NOT json.dumps
|
|
497
|
+
# here or it will be double-encoded.
|
|
498
|
+
resp_body = ApiClient(Configuration())._do_http_request(
|
|
499
|
+
oauth_url,
|
|
500
|
+
method="POST",
|
|
501
|
+
data={
|
|
502
|
+
"grant_type": "refresh_token",
|
|
503
|
+
"client_id": client_id,
|
|
504
|
+
"client_secret": client_secret,
|
|
505
|
+
"refresh_token": refresh_token,
|
|
506
|
+
},
|
|
507
|
+
headers={"Content-Type": "application/json"},
|
|
508
|
+
timeout=_HTTP_TIMEOUT,
|
|
509
|
+
max_retries=_HTTP_MAX_RETRIES,
|
|
510
|
+
retry_interval=_HTTP_RETRY_INTERVAL,
|
|
511
|
+
request_name="OAuth token refresh",
|
|
512
|
+
# OAuth refresh_token grants may rotate the refresh token on use;
|
|
513
|
+
# replaying a successful-but-response-lost POST would invalidate
|
|
514
|
+
# the local refresh_token. Fail fast on 5xx instead.
|
|
515
|
+
retry_on_5xx=False,
|
|
516
|
+
provider_name=self.PROVIDER_NAME,
|
|
517
|
+
)
|
|
518
|
+
|
|
519
|
+
try:
|
|
520
|
+
resp_data = json.loads(resp_body)
|
|
521
|
+
except ValueError as e:
|
|
522
|
+
raise RuntimeError(
|
|
523
|
+
"{}: failed to parse OAuth token response: {}".format(
|
|
524
|
+
self.PROVIDER_NAME, e
|
|
525
|
+
)
|
|
526
|
+
)
|
|
527
|
+
|
|
528
|
+
new_access_token = (resp_data.get("access_token") or "").strip()
|
|
529
|
+
if not new_access_token:
|
|
530
|
+
raise RuntimeError(
|
|
531
|
+
"{}: OAuth token response did not contain access_token.".format(
|
|
532
|
+
self.PROVIDER_NAME
|
|
533
|
+
)
|
|
534
|
+
)
|
|
535
|
+
|
|
536
|
+
expires_in = resp_data.get("expires_in", 0)
|
|
537
|
+
if expires_in <= 0:
|
|
538
|
+
raise RuntimeError(
|
|
539
|
+
"{}: OAuth token response did not contain valid expires_in.".format(
|
|
540
|
+
self.PROVIDER_NAME
|
|
541
|
+
)
|
|
542
|
+
)
|
|
543
|
+
|
|
544
|
+
token_cache["access_token"] = new_access_token
|
|
545
|
+
new_refresh = (resp_data.get("refresh_token") or "").strip()
|
|
546
|
+
if new_refresh:
|
|
547
|
+
token_cache["refresh_token"] = new_refresh
|
|
548
|
+
token_cache["expires_at"] = time.strftime(
|
|
549
|
+
"%Y-%m-%dT%H:%M:%SZ", time.gmtime(time.time() + expires_in)
|
|
550
|
+
)
|
|
551
|
+
|
|
552
|
+
_write_json_file_atomic(token_path, token_cache)
|
|
553
|
+
|
|
554
|
+
return new_access_token
|
|
555
|
+
|
|
556
|
+
def _fetch_role_credentials(self, access_token):
|
|
557
|
+
try:
|
|
558
|
+
from urllib.parse import urlencode
|
|
559
|
+
except ImportError:
|
|
560
|
+
from urllib import urlencode
|
|
561
|
+
|
|
562
|
+
portal_url = "{}/federation/credentials?{}".format(
|
|
563
|
+
_PORTAL_BASE_URL_TEMPLATE.format(self._region),
|
|
564
|
+
urlencode({"account_id": self._account_id, "role_name": self._role_name}),
|
|
565
|
+
)
|
|
566
|
+
|
|
567
|
+
# Late imports to avoid circular deps (auth.providers is imported
|
|
568
|
+
# indirectly by byteplussdkcore/__init__.py).
|
|
569
|
+
from byteplussdkcore import ApiClient, Configuration
|
|
570
|
+
resp_body = ApiClient(Configuration())._do_http_request(
|
|
571
|
+
portal_url,
|
|
572
|
+
method="GET",
|
|
573
|
+
headers={
|
|
574
|
+
"Accept": "application/json",
|
|
575
|
+
_PORTAL_ACCESS_TOKEN_HEADER: access_token,
|
|
576
|
+
},
|
|
577
|
+
timeout=_HTTP_TIMEOUT,
|
|
578
|
+
max_retries=_HTTP_MAX_RETRIES,
|
|
579
|
+
retry_interval=_HTTP_RETRY_INTERVAL,
|
|
580
|
+
request_name="Portal GetRoleCredentials",
|
|
581
|
+
provider_name=self.PROVIDER_NAME,
|
|
582
|
+
)
|
|
583
|
+
|
|
584
|
+
try:
|
|
585
|
+
resp_data = json.loads(resp_body)
|
|
586
|
+
except ValueError as e:
|
|
587
|
+
raise RuntimeError(
|
|
588
|
+
"{}: failed to parse Portal response: {}".format(
|
|
589
|
+
self.PROVIDER_NAME, e
|
|
590
|
+
)
|
|
591
|
+
)
|
|
592
|
+
|
|
593
|
+
result = resp_data.get("Result") or resp_data.get("result") or {}
|
|
594
|
+
role_creds = result.get("RoleCredentials") or result.get("roleCredentials") or {}
|
|
595
|
+
|
|
596
|
+
ak = (role_creds.get("AccessKeyId") or "").strip()
|
|
597
|
+
sk = (role_creds.get("SecretAccessKey") or "").strip()
|
|
598
|
+
token = (role_creds.get("sessionToken") or role_creds.get("SessionToken") or "").strip()
|
|
599
|
+
|
|
600
|
+
if not ak or not sk:
|
|
601
|
+
meta = resp_data.get("ResponseMetadata", {})
|
|
602
|
+
err = meta.get("Error", {})
|
|
603
|
+
if err:
|
|
604
|
+
raise RuntimeError(
|
|
605
|
+
"{}: Portal API error: {} - {}".format(
|
|
606
|
+
self.PROVIDER_NAME,
|
|
607
|
+
err.get("Code", ""),
|
|
608
|
+
err.get("Message", ""),
|
|
609
|
+
)
|
|
610
|
+
)
|
|
611
|
+
raise RuntimeError(
|
|
612
|
+
"{}: Portal response missing AccessKeyId/SecretAccessKey.".format(
|
|
613
|
+
self.PROVIDER_NAME
|
|
614
|
+
)
|
|
615
|
+
)
|
|
616
|
+
|
|
617
|
+
expiration = role_creds.get("Expiration", 0)
|
|
618
|
+
if expiration and expiration > 0:
|
|
619
|
+
self._expiration = _unix_timestamp_to_epoch(expiration)
|
|
620
|
+
else:
|
|
621
|
+
self._expiration = None
|
|
622
|
+
|
|
623
|
+
self._credentials = CredentialValue(
|
|
624
|
+
ak=ak,
|
|
625
|
+
sk=sk,
|
|
626
|
+
session_token=token or None,
|
|
627
|
+
provider_name=self.PROVIDER_NAME,
|
|
628
|
+
)
|