def test__create_alias__can_create_multiple_aliases_for_same_key_id(): kms = boto.connect_kms() create_resp = kms.create_key() key_id = create_resp['KeyMetadata']['KeyId'] kms.create_alias('alias/my-alias3', key_id).should.be.none kms.create_alias('alias/my-alias4', key_id).should.be.none kms.create_alias('alias/my-alias5', key_id).should.be.none
def test__create_alias__returns_none_if_correct(): kms = boto.connect_kms() create_resp = kms.create_key() key_id = create_resp['KeyMetadata']['KeyId'] resp = kms.create_alias('alias/my-alias', key_id) resp.should.be.none
def test__delete_alias(): kms = boto.connect_kms() create_resp = kms.create_key() key_id = create_resp['KeyMetadata']['KeyId'] alias = 'alias/my-alias' # added another alias here to make sure that the deletion of the alias can # be done when there are multiple existing aliases. another_create_resp = kms.create_key() another_key_id = create_resp['KeyMetadata']['KeyId'] another_alias = 'alias/another-alias' kms.create_alias(alias, key_id) kms.create_alias(another_alias, another_key_id) resp = kms.delete_alias(alias) resp.should.be.none # we can create the alias again, since it has been deleted kms.create_alias(alias, key_id)
def test__create_alias__accepted_characters(): kms = boto.connect_kms() create_resp = kms.create_key() key_id = create_resp['KeyMetadata']['KeyId'] alias_names_with_accepted_characters = [ 'alias/my-alias_/', 'alias/my_alias-/', ] for alias_name in alias_names_with_accepted_characters: kms.create_alias(alias_name, key_id)
def test__delete_alias(): kms = boto.connect_kms() create_resp = kms.create_key() key_id = create_resp['KeyMetadata']['KeyId'] alias = 'alias/my-alias' kms.create_alias(alias, key_id) resp = kms.delete_alias(alias) resp.should.be.none # we can create the alias again, since it has been deleted kms.create_alias(alias, key_id)
def test__create_alias__raises_if_wrong_prefix(): kms = boto.connect_kms() create_resp = kms.create_key() key_id = create_resp['KeyMetadata']['KeyId'] with assert_raises(JSONResponseError) as err: kms.create_alias('wrongprefix/my-alias', key_id) ex = err.exception ex.error_message.should.equal('Invalid identifier') ex.error_code.should.equal('ValidationException') ex.body.should.equal({'message': 'Invalid identifier', '__type': 'ValidationException'}) ex.reason.should.equal('Bad Request') ex.status.should.equal(400)
def create_kaurna_key(region='us-east-1', **kwargs): # This method will create the kaurna KMS master key if necessary kms = boto.kms.connect_to_region(region_name=region) # list_aliases response: # {'Truncated': False, 'Aliases': [{'AliasArn': 'arn:aws:kms:us-east-1:000000000000:alias/aws/ebs', 'AliasName': 'alias/aws/ebs'}, {'AliasArn': 'arn:aws:kms:us-east-1:000000000000:alias/aws/rds', 'AliasName': 'alias/aws/rds'}, {'AliasArn': 'arn:aws:kms:us-east-1:000000000000:alias/aws/redshift', 'AliasName': 'alias/aws/redshift'}, {'AliasArn': 'arn:aws:kms:us-east-1:000000000000:alias/aws/s3', 'AliasName': 'alias/aws/s3'}, {'AliasArn': 'arn:aws:kms:us-east-1:000000000000:alias/kaurna', 'AliasName': 'alias/kaurna', 'TargetKeyId': '1234abcd-12ab-12ab-12ab-123456abcdef'}]} aliases = kms.list_aliases() if 'alias/kaurna' in [alias['AliasName'] for alias in aliases['Aliases']]: return False else: # create_key response: # {'KeyMetadata': {'KeyId': '1234abcd-12ab-12ab-12ab-123456abcdef', 'Description': '', 'Enabled': True, 'KeyUsage': 'ENCRYPT_DECRYPT', 'CreationDate': 1431872957.123, 'Arn': 'arn:aws:kms:us-east-1:000000000000:key/1234abcd-12ab-12ab-12ab-123456abcdef', 'AWSAccountId': '000000000000'}} # TODO: see what the format of this response is and make it so that the alias gets attached properly response = kms.create_key() # create_alias has no output kms.create_alias('alias/kaurna', response['KeyMetadata']['KeyId']) return True
def test__create_alias__raises_if_target_key_id_is_existing_alias(): kms = boto.connect_kms() create_resp = kms.create_key() key_id = create_resp['KeyMetadata']['KeyId'] alias = 'alias/my-alias' kms.create_alias(alias, key_id) with assert_raises(JSONResponseError) as err: kms.create_alias(alias, alias) ex = err.exception ex.body['__type'].should.equal('ValidationException') ex.body['message'].should.equal('Aliases must refer to keys. Not aliases') ex.error_code.should.equal('ValidationException') ex.message.should.equal('Aliases must refer to keys. Not aliases') ex.reason.should.equal('Bad Request') ex.status.should.equal(400)
def test__create_alias__raises_if_alias_has_colon_character(): # For some reason, colons are not accepted for an alias, even though they are accepted by regex ^[a-zA-Z0-9:/_-]+$ kms = boto.connect_kms() create_resp = kms.create_key() key_id = create_resp['KeyMetadata']['KeyId'] alias_names_with_restricted_characters = [ 'alias/my:alias', ] for alias_name in alias_names_with_restricted_characters: with assert_raises(JSONResponseError) as err: kms.create_alias(alias_name, key_id) ex = err.exception ex.body['__type'].should.equal('ValidationException') ex.body['message'].should.equal("{alias_name} contains invalid characters for an alias".format(**locals())) ex.error_code.should.equal('ValidationException') ex.message.should.equal("{alias_name} contains invalid characters for an alias".format(**locals())) ex.reason.should.equal('Bad Request') ex.status.should.equal(400)
def test__create_alias__raises_if_alias_has_restricted_characters(): kms = boto.connect_kms() create_resp = kms.create_key() key_id = create_resp['KeyMetadata']['KeyId'] alias_names_with_restricted_characters = [ 'alias/my-alias!', 'alias/my-alias$', 'alias/my-alias@', ] for alias_name in alias_names_with_restricted_characters: with assert_raises(JSONResponseError) as err: kms.create_alias(alias_name, key_id) ex = err.exception ex.body['__type'].should.equal('ValidationException') ex.body['message'].should.equal("1 validation error detected: Value '{alias_name}' at 'aliasName' failed to satisfy constraint: Member must satisfy regular expression pattern: ^[a-zA-Z0-9:/_-]+$".format(**locals())) ex.error_code.should.equal('ValidationException') ex.message.should.equal("1 validation error detected: Value '{alias_name}' at 'aliasName' failed to satisfy constraint: Member must satisfy regular expression pattern: ^[a-zA-Z0-9:/_-]+$".format(**locals())) ex.reason.should.equal('Bad Request') ex.status.should.equal(400)
def test__list_aliases(): region = "eu-west-1" kms = boto.kms.connect_to_region(region) create_resp = kms.create_key() key_id = create_resp['KeyMetadata']['KeyId'] kms.create_alias('alias/my-alias1', key_id) kms.create_alias('alias/my-alias2', key_id) kms.create_alias('alias/my-alias3', key_id) resp = kms.list_aliases() resp['Truncated'].should.be.false aliases = resp['Aliases'] def has_correct_arn(alias_obj): alias_name = alias_obj['AliasName'] alias_arn = alias_obj['AliasArn'] return re.match(r'arn:aws:kms:{region}:\d{{12}}:{alias_name}'.format(region=region, alias_name=alias_name), alias_arn) len([alias for alias in aliases if has_correct_arn(alias) and 'alias/aws/ebs' == alias['AliasName']]).should.equal(1) len([alias for alias in aliases if has_correct_arn(alias) and 'alias/aws/rds' == alias['AliasName']]).should.equal(1) len([alias for alias in aliases if has_correct_arn(alias) and 'alias/aws/redshift' == alias['AliasName']]).should.equal(1) len([alias for alias in aliases if has_correct_arn(alias) and 'alias/aws/s3' == alias['AliasName']]).should.equal(1) len([alias for alias in aliases if has_correct_arn(alias) and 'alias/my-alias1' == alias['AliasName']]).should.equal(1) len([alias for alias in aliases if has_correct_arn(alias) and 'alias/my-alias2' == alias['AliasName']]).should.equal(1) len([alias for alias in aliases if 'TargetKeyId' in alias and key_id == alias['TargetKeyId']]).should.equal(3) len(aliases).should.equal(7)
def test__create_alias__raises_if_reserved_alias(): kms = boto.connect_kms() create_resp = kms.create_key() key_id = create_resp['KeyMetadata']['KeyId'] reserved_aliases = [ 'alias/aws/ebs', 'alias/aws/s3', 'alias/aws/redshift', 'alias/aws/rds', ] for alias_name in reserved_aliases: with assert_raises(JSONResponseError) as err: kms.create_alias(alias_name, key_id) ex = err.exception ex.error_message.should.be.none ex.error_code.should.equal('NotAuthorizedException') ex.body.should.equal({'__type': 'NotAuthorizedException'}) ex.reason.should.equal('Bad Request') ex.status.should.equal(400)
def test__create_alias__raises_if_duplicate(): region = 'us-west-2' kms = boto.kms.connect_to_region(region) create_resp = kms.create_key() key_id = create_resp['KeyMetadata']['KeyId'] alias = 'alias/my-alias' kms.create_alias(alias, key_id) with assert_raises(AlreadyExistsException) as err: kms.create_alias(alias, key_id) ex = err.exception ex.error_message.should.match(r'An alias with the name arn:aws:kms:{region}:\d{{12}}:{alias} already exists' .format(**locals())) ex.error_code.should.be.none ex.box_usage.should.be.none ex.request_id.should.be.none ex.body['message'].should.match(r'An alias with the name arn:aws:kms:{region}:\d{{12}}:{alias} already exists' .format(**locals())) ex.body['__type'].should.equal('AlreadyExistsException') ex.reason.should.equal('Bad Request') ex.status.should.equal(400)
def test__create_alias__raises_if_alias_has_colon_character(): # For some reason, colons are not accepted for an alias, even though they are accepted by regex ^[a-zA-Z0-9:/_-]+$ kms = boto.connect_kms() create_resp = kms.create_key() key_id = create_resp['KeyMetadata']['KeyId'] alias_names_with_restricted_characters = [ 'alias/my:alias', ] for alias_name in alias_names_with_restricted_characters: with assert_raises(JSONResponseError) as err: kms.create_alias(alias_name, key_id) ex = err.exception ex.body['__type'].should.equal('ValidationException') ex.body['message'].should.equal( "{alias_name} contains invalid characters for an alias".format( **locals())) ex.error_code.should.equal('ValidationException') ex.message.should.equal( "{alias_name} contains invalid characters for an alias".format( **locals())) ex.reason.should.equal('Bad Request') ex.status.should.equal(400)
def test__create_alias__accepted_characters(alias_name): kms = boto.connect_kms() create_resp = kms.create_key() key_id = create_resp["KeyMetadata"]["KeyId"] kms.create_alias(alias_name, key_id)
def test__list_aliases(): region = "eu-west-1" kms = boto.kms.connect_to_region(region) create_resp = kms.create_key() key_id = create_resp["KeyMetadata"]["KeyId"] kms.create_alias("alias/my-alias1", key_id) kms.create_alias("alias/my-alias2", key_id) kms.create_alias("alias/my-alias3", key_id) resp = kms.list_aliases() resp["Truncated"].should.be.false aliases = resp["Aliases"] def has_correct_arn(alias_obj): alias_name = alias_obj["AliasName"] alias_arn = alias_obj["AliasArn"] return re.match( r"arn:aws:kms:{region}:\d{{12}}:{alias_name}".format( region=region, alias_name=alias_name ), alias_arn, ) len( [ alias for alias in aliases if has_correct_arn(alias) and "alias/aws/ebs" == alias["AliasName"] ] ).should.equal(1) len( [ alias for alias in aliases if has_correct_arn(alias) and "alias/aws/rds" == alias["AliasName"] ] ).should.equal(1) len( [ alias for alias in aliases if has_correct_arn(alias) and "alias/aws/redshift" == alias["AliasName"] ] ).should.equal(1) len( [ alias for alias in aliases if has_correct_arn(alias) and "alias/aws/s3" == alias["AliasName"] ] ).should.equal(1) len( [ alias for alias in aliases if has_correct_arn(alias) and "alias/my-alias1" == alias["AliasName"] ] ).should.equal(1) len( [ alias for alias in aliases if has_correct_arn(alias) and "alias/my-alias2" == alias["AliasName"] ] ).should.equal(1) len( [ alias for alias in aliases if "TargetKeyId" in alias and key_id == alias["TargetKeyId"] ] ).should.equal(3) len(aliases).should.equal(17)