aws-parallelcluster 3.15.0__tar.gz → 3.16.0__tar.gz
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.
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/PKG-INFO +2 -1
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/setup.py +2 -1
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/aws_parallelcluster.egg-info/PKG-INFO +2 -1
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/aws_parallelcluster.egg-info/SOURCES.txt +1 -4
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/controllers/cluster_compute_fleet_controller.py +11 -23
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/controllers/cluster_instances_controller.py +0 -2
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/controllers/common.py +23 -7
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/compute_fleet_status.py +0 -2
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/requested_compute_fleet_status.py +0 -2
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/openapi/openapi.yaml +1 -1
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/aws/aws_api.py +9 -9
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/aws/ec2.py +1 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/aws/elb.py +9 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/aws/iam.py +2 -1
- aws_parallelcluster-3.16.0/src/pcluster/aws/resource_groups_tagging_api.py +47 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/cli/commands/configure/easyconfig.py +59 -91
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/cli/commands/configure/utils.py +1 -1
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/config/cluster_config.py +16 -139
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/config/common.py +0 -4
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/config/imagebuilder_config.py +30 -6
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/config/update_policy.py +27 -35
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/constants.py +16 -19
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/models/cluster.py +6 -53
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/models/cluster_resources.py +0 -5
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/models/common.py +22 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/models/compute_fleet_status_manager.py +0 -2
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/models/login_nodes_status.py +15 -32
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/models/s3_bucket.py +5 -2
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/compute_node/user_data.sh +7 -7
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/head_node/user_data.sh +3 -3
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/imagebuilder/parallelcluster.yaml +18 -14
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/imagebuilder/parallelcluster_tag.yaml +1 -3
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/imagebuilder/parallelcluster_test.yaml +25 -31
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/imagebuilder/update_and_reboot.yaml +1 -3
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/login_node/user_data.sh +17 -6
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/schemas/cluster_schema.py +19 -166
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/schemas/common_schema.py +1 -2
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/schemas/imagebuilder_schema.py +1 -1
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/templates/cdk_builder_utils.py +102 -110
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/templates/cluster_stack.py +81 -110
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/templates/cw_dashboard_builder.py +3 -10
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/templates/imagebuilder_stack.py +9 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/templates/login_nodes_stack.py +58 -132
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/templates/queues_stack.py +4 -7
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/utils.py +0 -11
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/validators/cluster_validators.py +71 -75
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/validators/dev_settings_validators.py +23 -31
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster3_config_converter/pcluster3_config_converter.py +4 -52
- aws_parallelcluster-3.15.0/src/pcluster/aws/batch.py +0 -130
- aws_parallelcluster-3.15.0/src/pcluster/resources/imagebuilder/parallelcluster_validate.yaml +0 -0
- aws_parallelcluster-3.15.0/src/pcluster/templates/awsbatch_builder.py +0 -886
- aws_parallelcluster-3.15.0/src/pcluster/validators/awsbatch_validators.py +0 -195
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/MANIFEST.in +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/README +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/setup.cfg +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/aws_parallelcluster.egg-info/dependency_links.txt +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/aws_parallelcluster.egg-info/entry_points.txt +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/aws_parallelcluster.egg-info/not-zip-safe +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/aws_parallelcluster.egg-info/requires.txt +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/aws_parallelcluster.egg-info/top_level.txt +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/__init__.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/__init__.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/awslambda/__init__.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/awslambda/entrypoint.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/awslambda/serverless_wsgi.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/controllers/__init__.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/controllers/cluster_logs_controller.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/controllers/cluster_operations_controller.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/controllers/image_logs_controller.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/controllers/image_operations_controller.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/converters.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/encoder.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/errors.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/flask_app.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/__init__.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/ami_info.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/bad_request_exception_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/base_model_.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/build_image_bad_request_exception_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/build_image_request_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/build_image_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/change.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/cloud_formation_resource_status.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/cloud_formation_stack_status.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/cluster_configuration_structure.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/cluster_info_summary.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/cluster_instance.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/cluster_status.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/cluster_status_filtering_option.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/config_validation_message.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/conflict_exception_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/create_cluster_bad_request_exception_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/create_cluster_request_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/create_cluster_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/delete_cluster_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/delete_image_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/describe_cluster_instances_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/describe_cluster_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/describe_compute_fleet_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/describe_image_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/dryrun_operation_exception_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/ec2_ami_info.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/ec2_ami_info_summary.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/ec2_ami_state.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/ec2_instance.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/failure.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/get_cluster_log_events_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/get_cluster_stack_events_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/get_image_log_events_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/get_image_stack_events_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/image_build_status.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/image_builder_image_status.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/image_configuration_structure.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/image_info_summary.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/image_status_filtering_option.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/instance_state.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/internal_service_exception_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/limit_exceeded_exception_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/list_cluster_log_streams_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/list_clusters_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/list_image_log_streams_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/list_images_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/list_official_images_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/log_event.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/log_stream.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/login_nodes_pool.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/login_nodes_state.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/metadata.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/node_type.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/not_found_exception_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/scheduler.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/stack_event.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/tag.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/unauthorized_client_error_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/update_cluster_bad_request_exception_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/update_cluster_request_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/update_cluster_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/update_compute_fleet_request_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/update_compute_fleet_response_content.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/update_error.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/models/validation_level.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/openapi/__init__.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/typing_utils.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/util.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/aws/__init__.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/aws/aws_resources.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/aws/cfn.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/aws/common.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/aws/dynamo.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/aws/efs.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/aws/fsx.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/aws/imagebuilder.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/aws/kms.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/aws/logs.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/aws/resource_groups.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/aws/route53.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/aws/s3.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/aws/s3_resource.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/aws/secretsmanager.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/aws/ssm.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/aws/sts.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/cli/__init__.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/cli/commands/__init__.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/cli/commands/cluster_logs.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/cli/commands/commands.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/cli/commands/common.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/cli/commands/configure/__init__.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/cli/commands/configure/command.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/cli/commands/configure/networking.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/cli/commands/configure/subnet_computation.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/cli/commands/dcv_connect.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/cli/commands/dcv_util.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/cli/commands/image_logs.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/cli/commands/ssh.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/cli/commands/version.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/cli/entrypoint.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/cli/exceptions.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/cli/logger.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/cli/middleware.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/cli/model.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/config/__init__.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/config/config_patch.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/config/update_policy_utils.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/imagebuilder_utils.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/launch_template_utils.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/lib/__init__.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/lib/lib.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/models/__init__.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/models/imagebuilder.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/models/imagebuilder_resources.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/networking/__init__.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/networking/vpc_factory.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/batch/docker/alinux2/Dockerfile +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/batch/docker/alinux2023/Dockerfile +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/batch/docker/build-docker-images.sh +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/batch/docker/buildspec.yml +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/batch/docker/scripts/entrypoint.sh +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/batch/docker/scripts/generate_hostfile.sh +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/batch/docker/scripts/modify_yum_vars.sh +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/batch/docker/scripts/mount_efs.sh +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/batch/docker/scripts/mount_nfs.sh +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/batch/docker/upload-docker-images.sh +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/custom_resources/custom_resources_code/__init__.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/custom_resources/custom_resources_code/cleanup_resources.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/custom_resources/custom_resources_code/crhelper/LICENSE +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/custom_resources/custom_resources_code/crhelper/NOTICE +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/custom_resources/custom_resources_code/crhelper/__init__.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/custom_resources/custom_resources_code/crhelper/log_helper.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/custom_resources/custom_resources_code/crhelper/resource_helper.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/custom_resources/custom_resources_code/crhelper/utils.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/custom_resources/custom_resources_code/delete_image_stack.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/custom_resources/custom_resources_code/manage_docker_images.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/custom_resources/custom_resources_code/send_build_notification.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/imagebuilder/custom_script.yaml +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/resources/supported-regions +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/schemas/__init__.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/templates/__init__.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/templates/cdk_artifacts_manager.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/templates/cdk_builder.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/templates/compute_fleet_stack.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/templates/import_cdk.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/templates/slurm_builder.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/validators/__init__.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/validators/common.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/validators/database_validators.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/validators/directory_service_validators.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/validators/ebs_validators.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/validators/ec2_validators.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/validators/efs_validators.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/validators/feature_validators.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/validators/fsx_validators.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/validators/iam_validators.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/validators/imagebuilder_validators.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/validators/instances_validators.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/validators/kms_validators.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/validators/monitoring_validators.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/validators/networking_validators.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/validators/s3_validators.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/validators/secret_validators.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/validators/slurm_settings_validator.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/validators/tags_validators.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/validators/utils.py +0 -0
- {aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster3_config_converter/__init__.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aws-parallelcluster
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.16.0
|
|
4
4
|
Summary: AWS ParallelCluster is an AWS supported Open Source cluster management tool to deploy and manage HPC clusters in the AWS cloud.
|
|
5
5
|
Home-page: https://github.com/aws/aws-parallelcluster
|
|
6
6
|
Author: Amazon Web Services
|
|
@@ -16,6 +16,7 @@ Classifier: Programming Language :: Python :: 3.9
|
|
|
16
16
|
Classifier: Programming Language :: Python :: 3.10
|
|
17
17
|
Classifier: Programming Language :: Python :: 3.11
|
|
18
18
|
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
20
|
Classifier: Topic :: Scientific/Engineering
|
|
20
21
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
21
22
|
Requires-Python: >=3.9
|
|
@@ -20,7 +20,7 @@ def readme():
|
|
|
20
20
|
return f.read()
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
VERSION = "3.
|
|
23
|
+
VERSION = "3.16.0"
|
|
24
24
|
CDK_VERSION = "1.164"
|
|
25
25
|
REQUIRES = [
|
|
26
26
|
"setuptools",
|
|
@@ -92,6 +92,7 @@ setup(
|
|
|
92
92
|
"Programming Language :: Python :: 3.10",
|
|
93
93
|
"Programming Language :: Python :: 3.11",
|
|
94
94
|
"Programming Language :: Python :: 3.12",
|
|
95
|
+
"Programming Language :: Python :: 3.13",
|
|
95
96
|
"Topic :: Scientific/Engineering",
|
|
96
97
|
"License :: OSI Approved :: Apache Software License",
|
|
97
98
|
],
|
{aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/aws_parallelcluster.egg-info/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aws-parallelcluster
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.16.0
|
|
4
4
|
Summary: AWS ParallelCluster is an AWS supported Open Source cluster management tool to deploy and manage HPC clusters in the AWS cloud.
|
|
5
5
|
Home-page: https://github.com/aws/aws-parallelcluster
|
|
6
6
|
Author: Amazon Web Services
|
|
@@ -16,6 +16,7 @@ Classifier: Programming Language :: Python :: 3.9
|
|
|
16
16
|
Classifier: Programming Language :: Python :: 3.10
|
|
17
17
|
Classifier: Programming Language :: Python :: 3.11
|
|
18
18
|
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
20
|
Classifier: Topic :: Scientific/Engineering
|
|
20
21
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
21
22
|
Requires-Python: >=3.9
|
|
@@ -105,7 +105,6 @@ src/pcluster/api/openapi/openapi.yaml
|
|
|
105
105
|
src/pcluster/aws/__init__.py
|
|
106
106
|
src/pcluster/aws/aws_api.py
|
|
107
107
|
src/pcluster/aws/aws_resources.py
|
|
108
|
-
src/pcluster/aws/batch.py
|
|
109
108
|
src/pcluster/aws/cfn.py
|
|
110
109
|
src/pcluster/aws/common.py
|
|
111
110
|
src/pcluster/aws/dynamo.py
|
|
@@ -118,6 +117,7 @@ src/pcluster/aws/imagebuilder.py
|
|
|
118
117
|
src/pcluster/aws/kms.py
|
|
119
118
|
src/pcluster/aws/logs.py
|
|
120
119
|
src/pcluster/aws/resource_groups.py
|
|
120
|
+
src/pcluster/aws/resource_groups_tagging_api.py
|
|
121
121
|
src/pcluster/aws/route53.py
|
|
122
122
|
src/pcluster/aws/s3.py
|
|
123
123
|
src/pcluster/aws/s3_resource.py
|
|
@@ -193,7 +193,6 @@ src/pcluster/resources/imagebuilder/custom_script.yaml
|
|
|
193
193
|
src/pcluster/resources/imagebuilder/parallelcluster.yaml
|
|
194
194
|
src/pcluster/resources/imagebuilder/parallelcluster_tag.yaml
|
|
195
195
|
src/pcluster/resources/imagebuilder/parallelcluster_test.yaml
|
|
196
|
-
src/pcluster/resources/imagebuilder/parallelcluster_validate.yaml
|
|
197
196
|
src/pcluster/resources/imagebuilder/update_and_reboot.yaml
|
|
198
197
|
src/pcluster/resources/login_node/user_data.sh
|
|
199
198
|
src/pcluster/schemas/__init__.py
|
|
@@ -201,7 +200,6 @@ src/pcluster/schemas/cluster_schema.py
|
|
|
201
200
|
src/pcluster/schemas/common_schema.py
|
|
202
201
|
src/pcluster/schemas/imagebuilder_schema.py
|
|
203
202
|
src/pcluster/templates/__init__.py
|
|
204
|
-
src/pcluster/templates/awsbatch_builder.py
|
|
205
203
|
src/pcluster/templates/cdk_artifacts_manager.py
|
|
206
204
|
src/pcluster/templates/cdk_builder.py
|
|
207
205
|
src/pcluster/templates/cdk_builder_utils.py
|
|
@@ -214,7 +212,6 @@ src/pcluster/templates/login_nodes_stack.py
|
|
|
214
212
|
src/pcluster/templates/queues_stack.py
|
|
215
213
|
src/pcluster/templates/slurm_builder.py
|
|
216
214
|
src/pcluster/validators/__init__.py
|
|
217
|
-
src/pcluster/validators/awsbatch_validators.py
|
|
218
215
|
src/pcluster/validators/cluster_validators.py
|
|
219
216
|
src/pcluster/validators/common.py
|
|
220
217
|
src/pcluster/validators/database_validators.py
|
|
@@ -64,30 +64,18 @@ def update_compute_fleet(update_compute_fleet_request_content, cluster_name, reg
|
|
|
64
64
|
validate_cluster(cluster)
|
|
65
65
|
|
|
66
66
|
status = update_compute_fleet_request_content.status
|
|
67
|
-
if
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
cluster.stop()
|
|
72
|
-
else:
|
|
73
|
-
raise BadRequestException(
|
|
74
|
-
"the update compute fleet status can only be set to"
|
|
75
|
-
" `ENABLED` or `DISABLED` for AWS Batch scheduler clusters."
|
|
76
|
-
)
|
|
67
|
+
if status == RequestedComputeFleetStatus.START_REQUESTED:
|
|
68
|
+
cluster.start()
|
|
69
|
+
elif status == RequestedComputeFleetStatus.STOP_REQUESTED:
|
|
70
|
+
cluster.stop()
|
|
77
71
|
else:
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
# [B608:hardcoded_sql_expressions] Possible SQL injection vector through string-based query construction.
|
|
86
|
-
raise BadRequestException(
|
|
87
|
-
"the update compute fleet status can only be set to" # nosec B608
|
|
88
|
-
" `START_REQUESTED` or `STOP_REQUESTED` for %s scheduler clusters."
|
|
89
|
-
% cluster.stack.scheduler.capitalize()
|
|
90
|
-
)
|
|
72
|
+
# A nosec comment is appended to the following line in order to disable the false positive B608 check.
|
|
73
|
+
# False positive since it is not a SQL query.
|
|
74
|
+
# [B608:hardcoded_sql_expressions] Possible SQL injection vector through string-based query construction.
|
|
75
|
+
raise BadRequestException(
|
|
76
|
+
"the update compute fleet status can only be set to" # nosec B608
|
|
77
|
+
" `START_REQUESTED` or `STOP_REQUESTED` for %s scheduler clusters." % cluster.stack.scheduler.capitalize()
|
|
78
|
+
)
|
|
91
79
|
status, last_status_updated_time = cluster.compute_fleet_status_with_last_updated_time
|
|
92
80
|
last_status_updated_time = last_status_updated_time and to_utc_datetime(last_status_updated_time)
|
|
93
81
|
return UpdateComputeFleetResponseContent(last_status_updated_time=last_status_updated_time, status=status.value)
|
|
@@ -45,8 +45,6 @@ def delete_cluster_instances(cluster_name, region=None, force=None):
|
|
|
45
45
|
raise BadRequestException(
|
|
46
46
|
f"Cluster '{cluster_name}' belongs to an incompatible ParallelCluster major version."
|
|
47
47
|
)
|
|
48
|
-
if cluster.stack.scheduler == "awsbatch":
|
|
49
|
-
raise BadRequestException("the delete cluster instances operation does not support AWS Batch clusters.")
|
|
50
48
|
except StackNotFoundError:
|
|
51
49
|
if not force:
|
|
52
50
|
raise NotFoundException(
|
{aws_parallelcluster-3.15.0 → aws_parallelcluster-3.16.0}/src/pcluster/api/controllers/common.py
RENAMED
|
@@ -17,6 +17,7 @@ import os
|
|
|
17
17
|
from typing import List, Optional, Set, Union
|
|
18
18
|
|
|
19
19
|
import boto3
|
|
20
|
+
from botocore.exceptions import ProfileNotFound
|
|
20
21
|
from packaging import version as packaging_version
|
|
21
22
|
|
|
22
23
|
from pcluster.api.errors import (
|
|
@@ -43,14 +44,23 @@ def _set_region(region):
|
|
|
43
44
|
region_backup = os.environ.get("AWS_DEFAULT_REGION")
|
|
44
45
|
LOGGER.info("Setting AWS Region to %s", region)
|
|
45
46
|
os.environ["AWS_DEFAULT_REGION"] = region
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
47
|
+
try:
|
|
48
|
+
supported_regions = retrieve_supported_regions()
|
|
49
|
+
except ProfileNotFound as e:
|
|
50
|
+
_restore_region(region_backup)
|
|
51
|
+
raise BadRequestException(str(e))
|
|
52
|
+
if region not in supported_regions:
|
|
53
|
+
_restore_region(region_backup)
|
|
51
54
|
raise BadRequestException(f"invalid or unsupported region '{region}'")
|
|
52
55
|
|
|
53
56
|
|
|
57
|
+
def _restore_region(region_backup):
|
|
58
|
+
if region_backup:
|
|
59
|
+
os.environ["AWS_DEFAULT_REGION"] = region_backup
|
|
60
|
+
else:
|
|
61
|
+
del os.environ["AWS_DEFAULT_REGION"]
|
|
62
|
+
|
|
63
|
+
|
|
54
64
|
def configure_aws_region_from_config(region: Union[None, str], config_str: str):
|
|
55
65
|
"""Set the region based on either the configuration or theregion parameter."""
|
|
56
66
|
# Allow parsing errors to pass through as they will be caught by later functions
|
|
@@ -62,7 +72,10 @@ def configure_aws_region_from_config(region: Union[None, str], config_str: str):
|
|
|
62
72
|
if region and config_region and region != config_region:
|
|
63
73
|
raise BadRequestException("region is set in both parameter and configuration and conflicts.")
|
|
64
74
|
|
|
65
|
-
|
|
75
|
+
try:
|
|
76
|
+
_set_region(region or config_region or boto3.Session().region_name)
|
|
77
|
+
except ProfileNotFound as e:
|
|
78
|
+
raise BadRequestException(str(e))
|
|
66
79
|
|
|
67
80
|
|
|
68
81
|
def configure_aws_region():
|
|
@@ -77,7 +90,10 @@ def configure_aws_region():
|
|
|
77
90
|
def _decorator_validate_region(func):
|
|
78
91
|
@functools.wraps(func)
|
|
79
92
|
def _wrapper_validate_region(*args, **kwargs):
|
|
80
|
-
|
|
93
|
+
try:
|
|
94
|
+
_set_region(kwargs.get("region") or boto3.Session().region_name)
|
|
95
|
+
except ProfileNotFound as e:
|
|
96
|
+
raise BadRequestException(str(e))
|
|
81
97
|
return func(*args, **kwargs)
|
|
82
98
|
|
|
83
99
|
return _wrapper_validate_region
|
|
@@ -24,8 +24,6 @@ class RequestedComputeFleetStatus(Model):
|
|
|
24
24
|
"""
|
|
25
25
|
START_REQUESTED = "START_REQUESTED"
|
|
26
26
|
STOP_REQUESTED = "STOP_REQUESTED"
|
|
27
|
-
ENABLED = "ENABLED"
|
|
28
|
-
DISABLED = "DISABLED"
|
|
29
27
|
|
|
30
28
|
def __init__(self):
|
|
31
29
|
"""RequestedComputeFleetStatus - a model defined in OpenAPI"""
|
|
@@ -10,7 +10,6 @@
|
|
|
10
10
|
# limitations under the License.
|
|
11
11
|
import os
|
|
12
12
|
|
|
13
|
-
from pcluster.aws.batch import BatchClient
|
|
14
13
|
from pcluster.aws.cfn import CfnClient
|
|
15
14
|
from pcluster.aws.dynamo import DynamoResource
|
|
16
15
|
from pcluster.aws.ec2 import Ec2Client
|
|
@@ -22,6 +21,7 @@ from pcluster.aws.imagebuilder import ImageBuilderClient
|
|
|
22
21
|
from pcluster.aws.kms import KmsClient
|
|
23
22
|
from pcluster.aws.logs import LogsClient
|
|
24
23
|
from pcluster.aws.resource_groups import ResourceGroupsClient
|
|
24
|
+
from pcluster.aws.resource_groups_tagging_api import ResourceGroupsTaggingApiClient
|
|
25
25
|
from pcluster.aws.route53 import Route53Client
|
|
26
26
|
from pcluster.aws.s3 import S3Client
|
|
27
27
|
from pcluster.aws.s3_resource import S3Resource
|
|
@@ -44,7 +44,6 @@ class AWSApi:
|
|
|
44
44
|
def __init__(self):
|
|
45
45
|
self.aws_region = os.environ.get("AWS_DEFAULT_REGION")
|
|
46
46
|
|
|
47
|
-
self._batch = None
|
|
48
47
|
self._cfn = None
|
|
49
48
|
self._ec2 = None
|
|
50
49
|
self._efs = None
|
|
@@ -63,6 +62,7 @@ class AWSApi:
|
|
|
63
62
|
self._secretsmanager = None
|
|
64
63
|
self._ssm = None
|
|
65
64
|
self._resource_groups = None
|
|
65
|
+
self._resource_groups_tagging_api = None
|
|
66
66
|
|
|
67
67
|
@property
|
|
68
68
|
def cfn(self):
|
|
@@ -71,13 +71,6 @@ class AWSApi:
|
|
|
71
71
|
self._cfn = CfnClient()
|
|
72
72
|
return self._cfn
|
|
73
73
|
|
|
74
|
-
@property
|
|
75
|
-
def batch(self):
|
|
76
|
-
"""AWS Batch client."""
|
|
77
|
-
if not self._batch:
|
|
78
|
-
self._batch = BatchClient()
|
|
79
|
-
return self._batch
|
|
80
|
-
|
|
81
74
|
@property
|
|
82
75
|
def ec2(self):
|
|
83
76
|
"""EC2 client."""
|
|
@@ -190,6 +183,13 @@ class AWSApi:
|
|
|
190
183
|
self._resource_groups = ResourceGroupsClient()
|
|
191
184
|
return self._resource_groups
|
|
192
185
|
|
|
186
|
+
@property
|
|
187
|
+
def resource_groups_tagging_api(self):
|
|
188
|
+
"""Resource Groups Tagging API client."""
|
|
189
|
+
if not self._resource_groups_tagging_api:
|
|
190
|
+
self._resource_groups_tagging_api = ResourceGroupsTaggingApiClient()
|
|
191
|
+
return self._resource_groups_tagging_api
|
|
192
|
+
|
|
193
193
|
@staticmethod
|
|
194
194
|
def instance():
|
|
195
195
|
"""Return the singleton AWSApi instance."""
|
|
@@ -315,6 +315,7 @@ class Ec2Client(Boto3Client):
|
|
|
315
315
|
|
|
316
316
|
filters = [{"Name": "name", "Values": [name]}]
|
|
317
317
|
filters.extend([{"Name": f"tag:{tag.key}", "Values": [tag.value]} for tag in tags])
|
|
318
|
+
filters.append({"Name": "state", "Values": ["available"]})
|
|
318
319
|
images = self._describe_images_with_pagination(Owners=[owner], Filters=filters, IncludeDeprecated=True)
|
|
319
320
|
if not images:
|
|
320
321
|
raise AWSClientError(function_name="describe_images", message="Cannot find official ParallelCluster AMI")
|
|
@@ -40,6 +40,15 @@ class ElbClient(Boto3Client):
|
|
|
40
40
|
response = self._client.describe_load_balancers(**describe_load_balancers_kwargs)
|
|
41
41
|
return response["LoadBalancers"], response.get("NextMarker")
|
|
42
42
|
|
|
43
|
+
@AWSExceptionHandler.handle_client_exception
|
|
44
|
+
def describe_load_balancer(self, load_balancer_arn: str) -> Any:
|
|
45
|
+
"""Retrieve the load balancer matching the given ARN, or None if not found."""
|
|
46
|
+
if not load_balancer_arn:
|
|
47
|
+
return None
|
|
48
|
+
response = self._client.describe_load_balancers(LoadBalancerArns=[load_balancer_arn])
|
|
49
|
+
load_balancers = response.get("LoadBalancers", [])
|
|
50
|
+
return load_balancers[0] if load_balancers else None
|
|
51
|
+
|
|
43
52
|
@AWSExceptionHandler.handle_client_exception
|
|
44
53
|
def describe_tags(self, load_balancer_arns: []):
|
|
45
54
|
"""Retrieve a list of tags associated to the load balancer arns provided as parameter."""
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
# OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions and
|
|
10
10
|
# limitations under the License.
|
|
11
11
|
|
|
12
|
-
from pcluster.aws.common import AWSExceptionHandler, Boto3Client
|
|
12
|
+
from pcluster.aws.common import AWSExceptionHandler, Boto3Client, Cache
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
class IamClient(Boto3Client):
|
|
@@ -18,6 +18,7 @@ class IamClient(Boto3Client):
|
|
|
18
18
|
def __init__(self):
|
|
19
19
|
super().__init__("iam")
|
|
20
20
|
|
|
21
|
+
@Cache.cached
|
|
21
22
|
@AWSExceptionHandler.handle_client_exception
|
|
22
23
|
def get_policy(self, iam_policy):
|
|
23
24
|
"""Get policy information."""
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Copyright 2026 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
|
|
4
|
+
# with the License. A copy of the License is located at
|
|
5
|
+
#
|
|
6
|
+
# http://aws.amazon.com/apache2.0/
|
|
7
|
+
#
|
|
8
|
+
# or in the "LICENSE.txt" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
|
|
9
|
+
# OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions and
|
|
10
|
+
# limitations under the License.
|
|
11
|
+
from typing import Dict, List
|
|
12
|
+
|
|
13
|
+
from pcluster.aws.common import AWSExceptionHandler, Boto3Client
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ResourceGroupsTaggingApiClient(Boto3Client):
|
|
17
|
+
"""Implement Resource Groups Tagging API Boto3 client."""
|
|
18
|
+
|
|
19
|
+
def __init__(self):
|
|
20
|
+
super().__init__("resourcegroupstaggingapi")
|
|
21
|
+
|
|
22
|
+
@AWSExceptionHandler.handle_client_exception
|
|
23
|
+
def get_resources(self, tag_filters: Dict[str, str], resource_type_filters: List[str] = None) -> List[str]:
|
|
24
|
+
"""
|
|
25
|
+
Return a list of resource ARNs matching the given tag filters and resource type filters.
|
|
26
|
+
|
|
27
|
+
:param tag_filters: dictionary of tag key/value pairs that resources must match (AND semantics).
|
|
28
|
+
:param resource_type_filters: list of resource type filters (e.g. ["elasticloadbalancing:loadbalancer"]).
|
|
29
|
+
:return: list of resource ARNs matching the filters.
|
|
30
|
+
"""
|
|
31
|
+
arns = []
|
|
32
|
+
kwargs = {
|
|
33
|
+
"TagFilters": [{"Key": key, "Values": [value]} for key, value in tag_filters.items()],
|
|
34
|
+
}
|
|
35
|
+
if resource_type_filters:
|
|
36
|
+
kwargs["ResourceTypeFilters"] = resource_type_filters
|
|
37
|
+
|
|
38
|
+
pagination_tkn = ""
|
|
39
|
+
while True:
|
|
40
|
+
if pagination_tkn:
|
|
41
|
+
kwargs["PaginationToken"] = pagination_tkn
|
|
42
|
+
response = self._client.get_resources(**kwargs)
|
|
43
|
+
arns.extend(resource["ResourceARN"] for resource in response.get("ResourceTagMappingList", []))
|
|
44
|
+
pagination_tkn = response.get("PaginationToken", "")
|
|
45
|
+
if not pagination_tkn:
|
|
46
|
+
break
|
|
47
|
+
return arns
|
|
@@ -41,9 +41,10 @@ from pcluster.constants import (
|
|
|
41
41
|
DEFAULT_MIN_COUNT,
|
|
42
42
|
MAX_NUMBER_OF_COMPUTE_RESOURCES_PER_CLUSTER,
|
|
43
43
|
MAX_NUMBER_OF_QUEUES,
|
|
44
|
+
SUPPORTED_OSES,
|
|
44
45
|
SUPPORTED_SCHEDULERS,
|
|
45
46
|
)
|
|
46
|
-
from pcluster.utils import error
|
|
47
|
+
from pcluster.utils import error
|
|
47
48
|
from pcluster.validators.cluster_validators import NameValidator
|
|
48
49
|
|
|
49
50
|
LOGGER = logging.getLogger(__name__)
|
|
@@ -146,10 +147,7 @@ def configure(args): # noqa: C901
|
|
|
146
147
|
|
|
147
148
|
scheduler = prompt_iterable("Scheduler", SUPPORTED_SCHEDULERS)
|
|
148
149
|
|
|
149
|
-
|
|
150
|
-
base_os = "alinux2"
|
|
151
|
-
else:
|
|
152
|
-
base_os = prompt_iterable("Operating System", get_supported_os_for_scheduler(scheduler))
|
|
150
|
+
base_os = prompt_iterable("Operating System", SUPPORTED_OSES)
|
|
153
151
|
|
|
154
152
|
default_instance_type = AWSApi.instance().ec2.get_default_instance_type()
|
|
155
153
|
head_node_instance_type = prompt(
|
|
@@ -157,18 +155,14 @@ def configure(args): # noqa: C901
|
|
|
157
155
|
lambda x: x in AWSApi.instance().ec2.list_instance_types(),
|
|
158
156
|
default_value=default_instance_type,
|
|
159
157
|
)
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
prompt(
|
|
166
|
-
"Number of queues",
|
|
167
|
-
lambda x: str(x).isdigit() and 1 <= int(x) <= MAX_NUMBER_OF_QUEUES,
|
|
168
|
-
default_value=1,
|
|
169
|
-
)
|
|
158
|
+
number_of_queues = int(
|
|
159
|
+
prompt(
|
|
160
|
+
"Number of queues",
|
|
161
|
+
lambda x: str(x).isdigit() and 1 <= int(x) <= MAX_NUMBER_OF_QUEUES,
|
|
162
|
+
default_value=1,
|
|
170
163
|
)
|
|
171
|
-
|
|
164
|
+
)
|
|
165
|
+
size_name = "instance count"
|
|
172
166
|
|
|
173
167
|
queues = []
|
|
174
168
|
queue_names = []
|
|
@@ -188,47 +182,42 @@ def configure(args): # noqa: C901
|
|
|
188
182
|
"name."
|
|
189
183
|
)
|
|
190
184
|
|
|
191
|
-
|
|
192
|
-
number_of_compute_resources = 1
|
|
193
|
-
else:
|
|
194
|
-
crs_per_queue_limit = MAX_NUMBER_OF_COMPUTE_RESOURCES_PER_CLUSTER // number_of_queues
|
|
185
|
+
crs_per_queue_limit = MAX_NUMBER_OF_COMPUTE_RESOURCES_PER_CLUSTER // number_of_queues
|
|
195
186
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
)
|
|
187
|
+
number_of_compute_resources = int(
|
|
188
|
+
prompt(
|
|
189
|
+
f"Number of compute resources for {queue_name}",
|
|
190
|
+
validator=lambda x, q=crs_per_queue_limit: str(x).isdigit() and 1 <= int(x) <= q,
|
|
191
|
+
default_value=1,
|
|
202
192
|
)
|
|
193
|
+
)
|
|
203
194
|
compute_resources = []
|
|
204
195
|
efa_enabled_in_queue = False
|
|
205
196
|
for compute_resource_index in range(number_of_compute_resources):
|
|
206
197
|
efa_enabled_in_compute_resource = False
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
if
|
|
229
|
-
|
|
230
|
-
if efa_enabled_in_compute_resource:
|
|
231
|
-
efa_enabled_in_queue = True
|
|
198
|
+
while True:
|
|
199
|
+
compute_instance_type = prompt(
|
|
200
|
+
f"Compute instance type for compute resource {compute_resource_index + 1} in {queue_name}",
|
|
201
|
+
validator=lambda x: x in AWSApi.instance().ec2.list_instance_types(),
|
|
202
|
+
default_value=default_instance_type,
|
|
203
|
+
)
|
|
204
|
+
if compute_instance_type not in [
|
|
205
|
+
instances["InstanceType"]
|
|
206
|
+
for compute_resource in compute_resources
|
|
207
|
+
for instances in compute_resource["Instances"]
|
|
208
|
+
]:
|
|
209
|
+
break
|
|
210
|
+
print(
|
|
211
|
+
f"Error: Instance type {compute_instance_type} cannot be specified for multiple compute "
|
|
212
|
+
"resources in the same queue. Please insert a different instance type."
|
|
213
|
+
)
|
|
214
|
+
compute_resource_name = re.sub(r"[^A-Za-z0-9]", "", compute_instance_type)
|
|
215
|
+
|
|
216
|
+
efa_supported_by_instance_type = instance_type_supports_efa(compute_instance_type)
|
|
217
|
+
if efa_supported_by_instance_type:
|
|
218
|
+
efa_enabled_in_compute_resource = _prompt_for_efa(compute_instance_type)
|
|
219
|
+
if efa_enabled_in_compute_resource:
|
|
220
|
+
efa_enabled_in_queue = True
|
|
232
221
|
min_cluster_size = DEFAULT_MIN_COUNT
|
|
233
222
|
max_cluster_size = int(
|
|
234
223
|
prompt(
|
|
@@ -237,31 +226,20 @@ def configure(args): # noqa: C901
|
|
|
237
226
|
default_value=DEFAULT_MAX_COUNT,
|
|
238
227
|
)
|
|
239
228
|
)
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
compute_resource = {
|
|
252
|
-
"Name": compute_resource_name,
|
|
253
|
-
"Instances": [{"InstanceType": compute_instance_type}],
|
|
254
|
-
"MinCount": min_cluster_size,
|
|
255
|
-
"MaxCount": max_cluster_size,
|
|
256
|
-
}
|
|
257
|
-
if efa_supported_by_instance_type:
|
|
258
|
-
compute_resource["Efa"] = {"Enabled": efa_enabled_in_compute_resource}
|
|
259
|
-
|
|
260
|
-
compute_resources.append(compute_resource)
|
|
261
|
-
compute_instance_types.append(compute_instance_type)
|
|
229
|
+
compute_resource = {
|
|
230
|
+
"Name": compute_resource_name,
|
|
231
|
+
"Instances": [{"InstanceType": compute_instance_type}],
|
|
232
|
+
"MinCount": min_cluster_size,
|
|
233
|
+
"MaxCount": max_cluster_size,
|
|
234
|
+
}
|
|
235
|
+
if efa_supported_by_instance_type:
|
|
236
|
+
compute_resource["Efa"] = {"Enabled": efa_enabled_in_compute_resource}
|
|
237
|
+
|
|
238
|
+
compute_resources.append(compute_resource)
|
|
239
|
+
compute_instance_types.append(compute_instance_type)
|
|
262
240
|
|
|
263
241
|
queue_names.append(queue_name)
|
|
264
|
-
cluster_size += max_cluster_size
|
|
242
|
+
cluster_size += max_cluster_size
|
|
265
243
|
|
|
266
244
|
queue = {
|
|
267
245
|
"Name": queue_name,
|
|
@@ -279,7 +257,7 @@ def configure(args): # noqa: C901
|
|
|
279
257
|
|
|
280
258
|
queues.append(queue)
|
|
281
259
|
|
|
282
|
-
vpc_parameters = _create_vpc_parameters(
|
|
260
|
+
vpc_parameters = _create_vpc_parameters(head_node_instance_type, compute_instance_types, cluster_size)
|
|
283
261
|
|
|
284
262
|
# Here is the end of prompt. Code below assembles config and write to file
|
|
285
263
|
for queue in queues:
|
|
@@ -292,11 +270,7 @@ def configure(args): # noqa: C901
|
|
|
292
270
|
"Networking": {"SubnetId": vpc_parameters["head_node_subnet_id"]},
|
|
293
271
|
"Ssh": {"KeyName": key_name},
|
|
294
272
|
}
|
|
295
|
-
|
|
296
|
-
scheduler_prefix = "AwsBatch"
|
|
297
|
-
head_node_config["Imds"] = {"Secured": False}
|
|
298
|
-
else:
|
|
299
|
-
scheduler_prefix = scheduler.capitalize()
|
|
273
|
+
scheduler_prefix = scheduler.capitalize()
|
|
300
274
|
|
|
301
275
|
result = {
|
|
302
276
|
"Region": os.environ.get("AWS_DEFAULT_REGION"),
|
|
@@ -332,7 +306,7 @@ def _write_configuration_file(config_file_path, content):
|
|
|
332
306
|
print(f"Configuration file written to {config_file_path}")
|
|
333
307
|
|
|
334
308
|
|
|
335
|
-
def _create_vpc_parameters(
|
|
309
|
+
def _create_vpc_parameters(head_node_instance_type, compute_instance_types, cluster_size):
|
|
336
310
|
vpc_parameters = {}
|
|
337
311
|
min_subnet_size = int(cluster_size)
|
|
338
312
|
vpc_and_subnets = _get_vpcs_and_subnets()
|
|
@@ -342,7 +316,7 @@ def _create_vpc_parameters(scheduler, head_node_instance_type, compute_instance_
|
|
|
342
316
|
if not vpc_list or prompt("Automate VPC creation? (y/n)", lambda x: x in ("y", "n"), default_value="n") == "y":
|
|
343
317
|
vpc_parameters.update(
|
|
344
318
|
automate_vpc_with_subnet_creation(
|
|
345
|
-
_choose_network_configuration(
|
|
319
|
+
_choose_network_configuration(head_node_instance_type, compute_instance_types),
|
|
346
320
|
min_subnet_size,
|
|
347
321
|
)
|
|
348
322
|
)
|
|
@@ -351,11 +325,7 @@ def _create_vpc_parameters(scheduler, head_node_instance_type, compute_instance_
|
|
|
351
325
|
vpc_parameters["vpc_id"] = vpc_id
|
|
352
326
|
subnet_list = vpc_and_subnets["vpc_subnets"][vpc_id]
|
|
353
327
|
qualified_head_node_subnets = _filter_subnets_offering_instance_types(subnet_list, [head_node_instance_type])
|
|
354
|
-
|
|
355
|
-
qualified_compute_subnets = _filter_subnets_offering_instance_types(subnet_list, compute_instance_types)
|
|
356
|
-
else:
|
|
357
|
-
# Special case of awsbatch, where compute instance type is not specified
|
|
358
|
-
qualified_compute_subnets = subnet_list
|
|
328
|
+
qualified_compute_subnets = _filter_subnets_offering_instance_types(subnet_list, compute_instance_types)
|
|
359
329
|
if (
|
|
360
330
|
not qualified_head_node_subnets
|
|
361
331
|
or not qualified_compute_subnets
|
|
@@ -378,7 +348,7 @@ def _create_vpc_parameters(scheduler, head_node_instance_type, compute_instance_
|
|
|
378
348
|
vpc_parameters.update(
|
|
379
349
|
automate_subnet_creation(
|
|
380
350
|
vpc_id,
|
|
381
|
-
_choose_network_configuration(
|
|
351
|
+
_choose_network_configuration(head_node_instance_type, compute_instance_types),
|
|
382
352
|
min_subnet_size,
|
|
383
353
|
)
|
|
384
354
|
)
|
|
@@ -403,9 +373,7 @@ def _ask_for_subnets(subnet_list, qualified_head_node_subnets, qualified_compute
|
|
|
403
373
|
return vpc_parameters
|
|
404
374
|
|
|
405
375
|
|
|
406
|
-
def _choose_network_configuration(
|
|
407
|
-
if scheduler == "awsbatch":
|
|
408
|
-
return PublicPrivateNetworkConfig()
|
|
376
|
+
def _choose_network_configuration(head_node_instance_type, compute_instance_types):
|
|
409
377
|
azs_for_head_node_type = AWSApi.instance().ec2.get_supported_az_for_instance_type(head_node_instance_type)
|
|
410
378
|
azs_for_compute_types = _get_common_supported_az_for_multi_instance_types(compute_instance_types)
|
|
411
379
|
common_availability_zones = set(azs_for_head_node_type) & set(azs_for_compute_types)
|
|
@@ -46,7 +46,7 @@ def get_default_suggestion(parameter, options):
|
|
|
46
46
|
"""
|
|
47
47
|
# For these parameters, steer users towards a default value rather than selecting the first
|
|
48
48
|
# from the available set of options.
|
|
49
|
-
opinionated_suggestions = {"Scheduler": "slurm", "Operating System": "
|
|
49
|
+
opinionated_suggestions = {"Scheduler": "slurm", "Operating System": "alinux2023"}
|
|
50
50
|
|
|
51
51
|
if parameter in opinionated_suggestions:
|
|
52
52
|
default = opinionated_suggestions.get(parameter)
|