def _validate_compute_resources()

in syndicate/core/build/validator/batch_compenv_validator.py [0:0]


def _validate_compute_resources(compute_resources):
    """
    Performs check of Batch Compute Environment compute resources.
    :param compute_resources: compute resources definition

    :raises AssertionError in case of invalidity.

    :return: None
    """
    compute_resource_type = compute_resources.get('type')
    compute_resource_config = [
        {
            'field_name': 'compute_resource_type',
            'field_value': compute_resource_type,
            'field_options': COMPUTE_RESOURCE_TYPES,
            'required': True,
            'validators': [
                _validate_options_field
            ]
        },
        {
            'field_name': 'allocation_strategy',
            'field_value': compute_resources.get('allocation_strategy'),
            'field_options': ALLOCATION_STRATEGIES,
            'compute_resource_type': compute_resource_type,
            'required': False,
            'validators': [
                _validate_options_field,
                _validate_fargate_forbidden_field
            ]
        },
        {
            'field_name': 'min_vcpus',
            'field_value': compute_resources.get('minv_cpus'),
            'compute_resource_type': compute_resource_type,
            'required_type': int,
            'validators': [
                _validate_field_type,
                _validate_fargate_forbidden_field
            ]
        },
        {
            'field_name': 'maxv_cpus',
            'field_value': compute_resources.get('maxv_cpus'),
            'compute_resource_type': compute_resource_type,
            'required_type': int,
            'validators': [
                _validate_required_field,
                _validate_field_type,
            ]
        },
        {
            'field_name': 'desiredv_cpus',
            'field_value': compute_resources.get('desiredv_cpus'),
            'compute_resource_type': compute_resource_type,
            'required_type': int,
            'validators': [
                _validate_field_type,
                _validate_fargate_forbidden_field
            ]
        },
        {
            'field_name': 'instance_types',
            'field_value': compute_resources.get('instance_types'),
            'compute_resource_type': compute_resource_type,
            'required_type': list,
            'validators': [
                _validate_field_type,
                _validate_fargate_forbidden_field,
            ]
        },
        {
            'field_name': 'image_id',
            'field_value': compute_resources.get('image_id'),
            'compute_resource_type': compute_resource_type,
            'required_type': str,
            'validators': [
                _validate_field_type,
                _validate_fargate_forbidden_field
            ]
        },
        {
            'field_name': 'subnets',
            'field_value': compute_resources.get('subnets'),
            'required_type': list,
            'validators': [
                _validate_required_field,
                _validate_field_type,
            ]
        },
        {
            'field_name': 'security_group_ids',
            'field_value': compute_resources.get('security_group_ids'),
            'required_type': list,
            'validators': [
                _validate_field_type,
            ]
        },
        {
            'field_name': 'ec2_key_pair',
            'field_value': compute_resources.get('ec2_key_pair'),
            'required_type': str,
            'compute_resource_type': compute_resource_type,
            'validators': [
                _validate_field_type,
                _validate_fargate_forbidden_field
            ]
        },
        {
            'field_name': 'instance_role',
            'field_value': compute_resources.get('instance_role'),
            'required_type': str,
            'compute_resource_type': compute_resource_type,
            'validators': [
                _validate_field_type,
                _validate_fargate_forbidden_field
            ]
        },
        {
            'field_name': 'tags',
            'field_value': compute_resources.get('tags'),
            'required_type': dict,
            'compute_resource_type': compute_resource_type,
            'validators': [
                _validate_field_type,
                _validate_fargate_forbidden_field
            ]
        },
        {
            'field_name': 'placement_group',
            'field_value': compute_resources.get('placement_group'),
            'required_type': str,
            'compute_resource_type': compute_resource_type,
            'validators': [
                _validate_field_type,
                _validate_fargate_forbidden_field
            ]
        },
        {
            'field_name': 'bid_percentage',
            'field_value': compute_resources.get('bid_percentage'),
            'required_type': int,
            'compute_resource_type': compute_resource_type,
            'validators': [
                _validate_field_type,
                _validate_fargate_forbidden_field
            ]
        },
        {
            'field_name': 'spot_iam_fleet_role',
            'field_value': compute_resources.get('spot_iam_fleet_role'),
            'required_type': str,
            'compute_resource_type': compute_resource_type,
            'validators': [
                _validate_field_type,
                _validate_fargate_forbidden_field
            ]
        },
        {
            'field_name': 'launch_template',
            'field_value': compute_resources.get('launch_template'),
            'required_type': dict,
            'compute_resource_type': compute_resource_type,
            'validators': [
                _validate_field_type,
                _validate_fargate_forbidden_field
            ]
        },
        {
            'field_name': 'ec2_configuration',
            'field_value': compute_resources.get('ec2_configuration'),
            'required_type': list,
            'validators': [
                _validate_field_type,
            ]
        },
    ]
    _process_config(compute_resource_config)

    instance_types = compute_resources.get('instance_types') or []
    # available = set(InstanceTypes.with_groups(
    #     InstanceTypes.from_api(region_name=CONFIG.region)
    # ))
    available = set(InstanceTypes.with_groups(InstanceTypes.from_botocore()))
    available.add(OPTIMAL_INSTANCE_TYPE)
    for instance_type in instance_types:
        _validate_options_field(
            field_name='instance_types__item',
            field_value=instance_type,
            field_options=available
        )

    desiredv_cpus = compute_resources.get('desiredv_cpus')
    if desiredv_cpus:
        minv_cpus = compute_resources.get('minv_cpus')
        maxv_cpus = compute_resources.get('maxv_cpus')
        if desiredv_cpus > maxv_cpus:
            raise AssertionError(
                'compute_resources__desired_vcpus must be smaller or equal than max_vcpus.'
            )
        if minv_cpus and desiredv_cpus < minv_cpus:
            raise AssertionError(
                'compute_resources__desired_vcpus must be greater or equal than min_vcpus.'
            )

    security_group_ids = compute_resources.get('security_group_ids')
    if not security_group_ids and compute_resource_type in FARGATE_RESOURCE_TYPES:
        raise AssertionError(
            "compute_resources__security_group_ids is required for jobs running on Fargate resources"
        )

    launch_template = compute_resources.get('launch_template')
    if launch_template:
        launch_template_id = launch_template.get('launch_template_id')
        _validate_field_type(
            field_name='launch_template_id',
            field_value=launch_template_id,
            prefix='compute_resources__launch_template',
            required_type=str
        )

        launch_template_name = launch_template.get('launch_template_name')
        _validate_field_type(
            field_name='launch_template_name',
            field_value=launch_template_name,
            prefix='compute_resources__launch_template',
            required_type=str
        )

        launch_template_options = (launch_template_id, launch_template_name)
        if all(launch_template_options) or not any(launch_template_options):
            raise AssertionError(
                "You must specify either the 'launch_template_id' or 'launch_template_name', but not both."
            )