def test_cluster_validator(mocker, section_dict, expected_message): mocker.patch( "pcluster.config.validators.get_supported_features", return_value={"instances": ["t2.micro", "optimal"], "baseos": ["alinux"], "schedulers": ["awsbatch"]}, ) config_parser_dict = {"cluster default": section_dict} utils.assert_param_validator(mocker, config_parser_dict, expected_message)
def test_efa_validator_with_vpc_security_group( boto3_stubber, mocker, ip_permissions, ip_permissions_egress, expected_message ): mocker.patch("pcluster.config.validators.get_supported_features", return_value={"instances": ["t2.micro"]}) describe_security_groups_response = { "SecurityGroups": [ { "IpPermissionsEgress": ip_permissions_egress, "Description": "My security group", "IpPermissions": ip_permissions, "GroupName": "MySecurityGroup", "OwnerId": "123456789012", "GroupId": "sg-12345678", } ] } mocked_requests = [ MockedBoto3Request( method="describe_security_groups", response=describe_security_groups_response, expected_params={"GroupIds": ["sg-12345678"]}, ) ] * 2 # it is called two times, for vpc_security_group_id validation and to validate efa boto3_stubber("ec2", mocked_requests) config_parser_dict = { "cluster default": {"enable_efa": "compute", "placement_group": "DYNAMIC", "vpc_settings": "default"}, "vpc default": {"vpc_security_group_id": "sg-12345678"}, } utils.assert_param_validator(mocker, config_parser_dict, expected_message)
def test_ec2_ebs_snapshot_validator(mocker, boto3_stubber): describe_snapshots_response = { "Snapshots": [ { "Description": "This is my snapshot", "Encrypted": False, "VolumeId": "vol-049df61146c4d7901", "State": "completed", "VolumeSize": 8, "StartTime": "2014-02-28T21:28:32.000Z", "Progress": "100%", "OwnerId": "012345678910", "SnapshotId": "snap-1234567890abcdef0", } ] } mocked_requests = [ MockedBoto3Request( method="describe_snapshots", response=describe_snapshots_response, expected_params={"SnapshotIds": ["snap-1234567890abcdef0"]}, ) ] boto3_stubber("ec2", mocked_requests) # TODO test with invalid key config_parser_dict = { "cluster default": {"ebs_settings": "default"}, "ebs default": {"shared_dir": "test", "ebs_snapshot_id": "snap-1234567890abcdef0"}, } utils.assert_param_validator(mocker, config_parser_dict)
def test_scheduler_validator(mocker, region, expected_message): mocker.patch( "pcluster.config.validators.get_supported_features", return_value={"instances": ["t2.micro", "optimal"], "baseos": ["alinux"], "schedulers": ["awsbatch"]}, ) # we need to set the region in the environment because it takes precedence respect of the config file os.environ["AWS_DEFAULT_REGION"] = region config_parser_dict = {"cluster default": {"scheduler": "awsbatch"}} utils.assert_param_validator(mocker, config_parser_dict, expected_message)
def test_ec2_vpc_id_validator(mocker, boto3_stubber): mocked_requests = [] # mock describe_vpc boto3 call describe_vpc_response = { "Vpcs": [ { "VpcId": "vpc-12345678", "InstanceTenancy": "default", "Tags": [{"Value": "Default VPC", "Key": "Name"}], "State": "available", "DhcpOptionsId": "dopt-4ef69c2a", "CidrBlock": "172.31.0.0/16", "IsDefault": True, } ] } mocked_requests.append( MockedBoto3Request( method="describe_vpcs", response=describe_vpc_response, expected_params={"VpcIds": ["vpc-12345678"]} ) ) # mock describe_vpc_attribute boto3 call describe_vpc_attribute_response = { "VpcId": "vpc-12345678", "EnableDnsSupport": {"Value": True}, "EnableDnsHostnames": {"Value": True}, } mocked_requests.append( MockedBoto3Request( method="describe_vpc_attribute", response=describe_vpc_attribute_response, expected_params={"VpcId": "vpc-12345678", "Attribute": "enableDnsSupport"}, ) ) mocked_requests.append( MockedBoto3Request( method="describe_vpc_attribute", response=describe_vpc_attribute_response, expected_params={"VpcId": "vpc-12345678", "Attribute": "enableDnsHostnames"}, ) ) boto3_stubber("ec2", mocked_requests) # TODO mock and test invalid vpc-id for vpc_id, expected_message in [("vpc-12345678", None)]: config_parser_dict = {"cluster default": {"vpc_settings": "default"}, "vpc default": {"vpc_id": vpc_id}} utils.assert_param_validator(mocker, config_parser_dict, expected_message)
def test_ec2_key_pair_validator(mocker, boto3_stubber): describe_key_pairs_response = { "KeyPairs": [ {"KeyFingerprint": "12:bf:7c:56:6c:dd:4f:8c:24:45:75:f1:1b:16:54:89:82:09:a4:26", "KeyName": "key1"} ] } mocked_requests = [ MockedBoto3Request( method="describe_key_pairs", response=describe_key_pairs_response, expected_params={"KeyNames": ["key1"]} ) ] boto3_stubber("ec2", mocked_requests) # TODO test with invalid key config_parser_dict = {"cluster default": {"key_name": "key1"}} utils.assert_param_validator(mocker, config_parser_dict)
def test_placement_group_validator(mocker, boto3_stubber): describe_placement_groups_response = { "PlacementGroups": [{"GroupName": "my-cluster", "State": "available", "Strategy": "cluster"}] } mocked_requests = [ MockedBoto3Request( method="describe_placement_groups", response=describe_placement_groups_response, expected_params={"GroupNames": ["my-cluster"]}, ) ] boto3_stubber("ec2", mocked_requests) # TODO test with invalid group name config_parser_dict = {"cluster default": {"placement_group": "my-cluster"}} utils.assert_param_validator(mocker, config_parser_dict)
def test_ec2_ami_validator(mocker, boto3_stubber): describe_images_response = { "Images": [ { "VirtualizationType": "paravirtual", "Name": "My server", "Hypervisor": "xen", "ImageId": "ami-12345678", "RootDeviceType": "ebs", "State": "available", "BlockDeviceMappings": [ { "DeviceName": "/dev/sda1", "Ebs": { "DeleteOnTermination": True, "SnapshotId": "snap-1234567890abcdef0", "VolumeSize": 8, "VolumeType": "standard", }, } ], "Architecture": "x86_64", "ImageLocation": "123456789012/My server", "KernelId": "aki-88aa75e1", "OwnerId": "123456789012", "RootDeviceName": "/dev/sda1", "Public": False, "ImageType": "machine", "Description": "An AMI for my server", } ] } mocked_requests = [ MockedBoto3Request( method="describe_images", response=describe_images_response, expected_params={"ImageIds": ["ami-12345678"]} ) ] boto3_stubber("ec2", mocked_requests) # TODO test with invalid key config_parser_dict = {"cluster default": {"custom_ami": "ami-12345678"}} utils.assert_param_validator(mocker, config_parser_dict)
def test_ec2_volume_validator(mocker, boto3_stubber): describe_volumes_response = { "Volumes": [ { "AvailabilityZone": "us-east-1a", "Attachments": [ { "AttachTime": "2013-12-18T22:35:00.000Z", "InstanceId": "i-1234567890abcdef0", "VolumeId": "vol-12345678", "State": "attached", "DeleteOnTermination": True, "Device": "/dev/sda1", } ], "Encrypted": False, "VolumeType": "gp2", "VolumeId": "vol-049df61146c4d7901", "State": "available", # TODO add test with "in-use" "SnapshotId": "snap-1234567890abcdef0", "CreateTime": "2013-12-18T22:35:00.084Z", "Size": 8, } ] } mocked_requests = [ MockedBoto3Request( method="describe_volumes", response=describe_volumes_response, expected_params={"VolumeIds": ["vol-12345678"]}, ) ] boto3_stubber("ec2", mocked_requests) # TODO test with invalid key config_parser_dict = { "cluster default": {"ebs_settings": "default"}, "ebs default": {"shared_dir": "test", "ebs_volume_id": "vol-12345678"}, } utils.assert_param_validator(mocker, config_parser_dict)
def test_url_validator(mocker, boto3_stubber): head_object_response = { "AcceptRanges": "bytes", "ContentType": "text/html", "LastModified": "Thu, 16 Apr 2015 18:19:14 GMT", "ContentLength": 77, "VersionId": "null", "ETag": '"30a6ec7e1a9ad79c203d05a589c8b400"', "Metadata": {}, } mocked_requests = [ MockedBoto3Request( method="head_object", response=head_object_response, expected_params={"Bucket": "test", "Key": "test.json"} ) ] boto3_stubber("s3", mocked_requests) mocker.patch("pcluster.config.validators.urllib.request.urlopen") tests = [("s3://test/test.json", None), ("http://test/test.json", None)] for template_url, expected_message in tests: config_parser_dict = {"cluster default": {"template_url": template_url}} utils.assert_param_validator(mocker, config_parser_dict, expected_message)
def test_ec2_security_group_validator(mocker, boto3_stubber): describe_security_groups_response = { "SecurityGroups": [ { "IpPermissionsEgress": [], "Description": "My security group", "IpPermissions": [ { "PrefixListIds": [], "FromPort": 22, "IpRanges": [{"CidrIp": "203.0.113.0/24"}], "ToPort": 22, "IpProtocol": "tcp", "UserIdGroupPairs": [], } ], "GroupName": "MySecurityGroup", "OwnerId": "123456789012", "GroupId": "sg-12345678", } ] } mocked_requests = [ MockedBoto3Request( method="describe_security_groups", response=describe_security_groups_response, expected_params={"GroupIds": ["sg-12345678"]}, ) ] boto3_stubber("ec2", mocked_requests) # TODO test with invalid key config_parser_dict = { "cluster default": {"vpc_settings": "default"}, "vpc default": {"vpc_security_group_id": "sg-12345678"}, } utils.assert_param_validator(mocker, config_parser_dict)
def test_ec2_subnet_id_validator(mocker, boto3_stubber): describe_subnets_response = { "Subnets": [ { "AvailabilityZone": "us-east-2c", "AvailabilityZoneId": "use2-az3", "AvailableIpAddressCount": 248, "CidrBlock": "10.0.1.0/24", "DefaultForAz": False, "MapPublicIpOnLaunch": False, "State": "available", "SubnetId": "subnet-12345678", "VpcId": "vpc-06e4ab6c6cEXAMPLE", "OwnerId": "111122223333", "AssignIpv6AddressOnCreation": False, "Ipv6CidrBlockAssociationSet": [], "Tags": [{"Key": "Name", "Value": "MySubnet"}], "SubnetArn": "arn:aws:ec2:us-east-2:111122223333:subnet/subnet-12345678", } ] } mocked_requests = [ MockedBoto3Request( method="describe_subnets", response=describe_subnets_response, expected_params={"SubnetIds": ["subnet-12345678"]}, ) ] boto3_stubber("ec2", mocked_requests) # TODO test with invalid key config_parser_dict = { "cluster default": {"vpc_settings": "default"}, "vpc default": {"master_subnet_id": "subnet-12345678"}, } utils.assert_param_validator(mocker, config_parser_dict)
def test_raid_volume_iops_validator(mocker, section_dict, expected_message): config_parser_dict = {"cluster default": {"raid_settings": "default"}, "raid default": section_dict} utils.assert_param_validator(mocker, config_parser_dict, expected_message)
def test_efa_validator(mocker, section_dict, expected_message): mocker.patch("pcluster.config.validators.get_supported_features", return_value={"instances": ["t2.large"]}) config_parser_dict = {"cluster default": section_dict} utils.assert_param_validator(mocker, config_parser_dict, expected_message)
def test_fsx_imported_file_chunk_size_validator(mocker, section_dict, expected_message): config_parser_dict = {"cluster default": {"fsx_settings": "default"}, "fsx default": section_dict} utils.assert_param_validator(mocker, config_parser_dict, expected_message)
def test_disable_hyperthreading_validator(mocker, section_dict, expected_message): config_parser_dict = {"cluster default": section_dict} utils.assert_param_validator(mocker, config_parser_dict, expected_message)
def test_fsx_storage_capacity_validator(mocker, section_dict, expected_message): config_parser_dict = {"cluster default": {"fsx_settings": "default"}, "fsx default": section_dict} utils.assert_param_validator(mocker, config_parser_dict, expected_message)
def test_intel_hpc_validator(mocker, section_dict, expected_message): config_parser_dict = {"cluster default": section_dict} utils.assert_param_validator(mocker, config_parser_dict, expected_message)
def test_efs_validator(mocker, section_dict, expected_message): config_parser_dict = {"cluster default": {"efs_settings": "default"}, "efs default": section_dict} utils.assert_param_validator(mocker, config_parser_dict, expected_message)