1507 lines
69 KiB
Python
1507 lines
69 KiB
Python
from __future__ import unicode_literals
|
|
|
|
from botocore.exceptions import ClientError, ParamValidationError
|
|
import boto3
|
|
import sure # noqa
|
|
from moto import mock_ec2, mock_kms, mock_rds2
|
|
|
|
|
|
@mock_rds2
|
|
def test_create_database():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
database = conn.create_db_instance(DBInstanceIdentifier='db-master-1',
|
|
AllocatedStorage=10,
|
|
Engine='postgres',
|
|
DBName='staging-postgres',
|
|
DBInstanceClass='db.m1.small',
|
|
LicenseModel='license-included',
|
|
MasterUsername='root',
|
|
MasterUserPassword='hunter2',
|
|
Port=1234,
|
|
DBSecurityGroups=["my_sg"])
|
|
db_instance = database['DBInstance']
|
|
db_instance['AllocatedStorage'].should.equal(10)
|
|
db_instance['DBInstanceClass'].should.equal("db.m1.small")
|
|
db_instance['LicenseModel'].should.equal("license-included")
|
|
db_instance['MasterUsername'].should.equal("root")
|
|
db_instance['DBSecurityGroups'][0][
|
|
'DBSecurityGroupName'].should.equal('my_sg')
|
|
db_instance['DBInstanceArn'].should.equal(
|
|
'arn:aws:rds:us-west-2:1234567890:db:db-master-1')
|
|
db_instance['DBInstanceStatus'].should.equal('available')
|
|
db_instance['DBName'].should.equal('staging-postgres')
|
|
db_instance['DBInstanceIdentifier'].should.equal("db-master-1")
|
|
db_instance['IAMDatabaseAuthenticationEnabled'].should.equal(False)
|
|
db_instance['DbiResourceId'].should.contain("db-")
|
|
db_instance['CopyTagsToSnapshot'].should.equal(False)
|
|
db_instance['InstanceCreateTime'].should.be.a("datetime.datetime")
|
|
|
|
|
|
@mock_rds2
|
|
def test_create_database_non_existing_option_group():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
database = conn.create_db_instance.when.called_with(
|
|
DBInstanceIdentifier='db-master-1',
|
|
AllocatedStorage=10,
|
|
Engine='postgres',
|
|
DBName='staging-postgres',
|
|
DBInstanceClass='db.m1.small',
|
|
OptionGroupName='non-existing').should.throw(ClientError)
|
|
|
|
|
|
@mock_rds2
|
|
def test_create_database_with_option_group():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_option_group(OptionGroupName='my-og',
|
|
EngineName='mysql',
|
|
MajorEngineVersion='5.6',
|
|
OptionGroupDescription='test option group')
|
|
database = conn.create_db_instance(DBInstanceIdentifier='db-master-1',
|
|
AllocatedStorage=10,
|
|
Engine='postgres',
|
|
DBName='staging-postgres',
|
|
DBInstanceClass='db.m1.small',
|
|
OptionGroupName='my-og')
|
|
db_instance = database['DBInstance']
|
|
db_instance['AllocatedStorage'].should.equal(10)
|
|
db_instance['DBInstanceClass'].should.equal('db.m1.small')
|
|
db_instance['DBName'].should.equal('staging-postgres')
|
|
db_instance['OptionGroupMemberships'][0]['OptionGroupName'].should.equal('my-og')
|
|
|
|
|
|
@mock_rds2
|
|
def test_stop_database():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
database = conn.create_db_instance(DBInstanceIdentifier='db-master-1',
|
|
AllocatedStorage=10,
|
|
Engine='postgres',
|
|
DBName='staging-postgres',
|
|
DBInstanceClass='db.m1.small',
|
|
LicenseModel='license-included',
|
|
MasterUsername='root',
|
|
MasterUserPassword='hunter2',
|
|
Port=1234,
|
|
DBSecurityGroups=["my_sg"])
|
|
mydb = conn.describe_db_instances(DBInstanceIdentifier=database['DBInstance']['DBInstanceIdentifier'])['DBInstances'][0]
|
|
mydb['DBInstanceStatus'].should.equal('available')
|
|
# test stopping database should shutdown
|
|
response = conn.stop_db_instance(DBInstanceIdentifier=mydb['DBInstanceIdentifier'])
|
|
response['ResponseMetadata']['HTTPStatusCode'].should.equal(200)
|
|
response['DBInstance']['DBInstanceStatus'].should.equal('stopped')
|
|
# test rdsclient error when trying to stop an already stopped database
|
|
conn.stop_db_instance.when.called_with(DBInstanceIdentifier=mydb['DBInstanceIdentifier']).should.throw(ClientError)
|
|
# test stopping a stopped database with snapshot should error and no snapshot should exist for that call
|
|
conn.stop_db_instance.when.called_with(DBInstanceIdentifier=mydb['DBInstanceIdentifier'], DBSnapshotIdentifier='rocky4570-rds-snap').should.throw(ClientError)
|
|
response = conn.describe_db_snapshots()
|
|
response['DBSnapshots'].should.equal([])
|
|
|
|
|
|
@mock_rds2
|
|
def test_start_database():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
database = conn.create_db_instance(DBInstanceIdentifier='db-master-1',
|
|
AllocatedStorage=10,
|
|
Engine='postgres',
|
|
DBName='staging-postgres',
|
|
DBInstanceClass='db.m1.small',
|
|
LicenseModel='license-included',
|
|
MasterUsername='root',
|
|
MasterUserPassword='hunter2',
|
|
Port=1234,
|
|
DBSecurityGroups=["my_sg"])
|
|
mydb = conn.describe_db_instances(DBInstanceIdentifier=database['DBInstance']['DBInstanceIdentifier'])['DBInstances'][0]
|
|
mydb['DBInstanceStatus'].should.equal('available')
|
|
# test starting an already started database should error
|
|
conn.start_db_instance.when.called_with(DBInstanceIdentifier=mydb['DBInstanceIdentifier']).should.throw(ClientError)
|
|
# stop and test start - should go from stopped to available, create snapshot and check snapshot
|
|
response = conn.stop_db_instance(DBInstanceIdentifier=mydb['DBInstanceIdentifier'], DBSnapshotIdentifier='rocky4570-rds-snap')
|
|
response['ResponseMetadata']['HTTPStatusCode'].should.equal(200)
|
|
response['DBInstance']['DBInstanceStatus'].should.equal('stopped')
|
|
response = conn.describe_db_snapshots()
|
|
response['DBSnapshots'][0]['DBSnapshotIdentifier'].should.equal('rocky4570-rds-snap')
|
|
response = conn.start_db_instance(DBInstanceIdentifier=mydb['DBInstanceIdentifier'])
|
|
response['ResponseMetadata']['HTTPStatusCode'].should.equal(200)
|
|
response['DBInstance']['DBInstanceStatus'].should.equal('available')
|
|
# starting database should not remove snapshot
|
|
response = conn.describe_db_snapshots()
|
|
response['DBSnapshots'][0]['DBSnapshotIdentifier'].should.equal('rocky4570-rds-snap')
|
|
# test stopping database, create snapshot with existing snapshot already created should throw error
|
|
conn.stop_db_instance.when.called_with(DBInstanceIdentifier=mydb['DBInstanceIdentifier'], DBSnapshotIdentifier='rocky4570-rds-snap').should.throw(ClientError)
|
|
# test stopping database not invoking snapshot should succeed.
|
|
response = conn.stop_db_instance(DBInstanceIdentifier=mydb['DBInstanceIdentifier'])
|
|
response['ResponseMetadata']['HTTPStatusCode'].should.equal(200)
|
|
response['DBInstance']['DBInstanceStatus'].should.equal('stopped')
|
|
|
|
|
|
@mock_rds2
|
|
def test_fail_to_stop_multi_az():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
database = conn.create_db_instance(DBInstanceIdentifier='db-master-1',
|
|
AllocatedStorage=10,
|
|
Engine='postgres',
|
|
DBName='staging-postgres',
|
|
DBInstanceClass='db.m1.small',
|
|
LicenseModel='license-included',
|
|
MasterUsername='root',
|
|
MasterUserPassword='hunter2',
|
|
Port=1234,
|
|
DBSecurityGroups=["my_sg"],
|
|
MultiAZ=True)
|
|
|
|
mydb = conn.describe_db_instances(DBInstanceIdentifier=database['DBInstance']['DBInstanceIdentifier'])['DBInstances'][0]
|
|
mydb['DBInstanceStatus'].should.equal('available')
|
|
# multi-az databases arent allowed to be shutdown at this time.
|
|
conn.stop_db_instance.when.called_with(DBInstanceIdentifier=mydb['DBInstanceIdentifier']).should.throw(ClientError)
|
|
# multi-az databases arent allowed to be started up at this time.
|
|
conn.start_db_instance.when.called_with(DBInstanceIdentifier=mydb['DBInstanceIdentifier']).should.throw(ClientError)
|
|
|
|
|
|
@mock_rds2
|
|
def test_fail_to_stop_readreplica():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
database = conn.create_db_instance(DBInstanceIdentifier='db-master-1',
|
|
AllocatedStorage=10,
|
|
Engine='postgres',
|
|
DBName='staging-postgres',
|
|
DBInstanceClass='db.m1.small',
|
|
LicenseModel='license-included',
|
|
MasterUsername='root',
|
|
MasterUserPassword='hunter2',
|
|
Port=1234,
|
|
DBSecurityGroups=["my_sg"])
|
|
|
|
replica = conn.create_db_instance_read_replica(DBInstanceIdentifier="db-replica-1",
|
|
SourceDBInstanceIdentifier="db-master-1",
|
|
DBInstanceClass="db.m1.small")
|
|
|
|
mydb = conn.describe_db_instances(DBInstanceIdentifier=replica['DBInstance']['DBInstanceIdentifier'])['DBInstances'][0]
|
|
mydb['DBInstanceStatus'].should.equal('available')
|
|
# read-replicas are not allowed to be stopped at this time.
|
|
conn.stop_db_instance.when.called_with(DBInstanceIdentifier=mydb['DBInstanceIdentifier']).should.throw(ClientError)
|
|
# read-replicas are not allowed to be started at this time.
|
|
conn.start_db_instance.when.called_with(DBInstanceIdentifier=mydb['DBInstanceIdentifier']).should.throw(ClientError)
|
|
|
|
|
|
@mock_rds2
|
|
def test_get_databases():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
|
|
instances = conn.describe_db_instances()
|
|
list(instances['DBInstances']).should.have.length_of(0)
|
|
|
|
conn.create_db_instance(DBInstanceIdentifier='db-master-1',
|
|
AllocatedStorage=10,
|
|
DBInstanceClass='postgres',
|
|
Engine='db.m1.small',
|
|
MasterUsername='root',
|
|
MasterUserPassword='hunter2',
|
|
Port=1234,
|
|
DBSecurityGroups=['my_sg'])
|
|
conn.create_db_instance(DBInstanceIdentifier='db-master-2',
|
|
AllocatedStorage=10,
|
|
DBInstanceClass='postgres',
|
|
Engine='db.m1.small',
|
|
MasterUsername='root',
|
|
MasterUserPassword='hunter2',
|
|
Port=1234,
|
|
DBSecurityGroups=['my_sg'])
|
|
instances = conn.describe_db_instances()
|
|
list(instances['DBInstances']).should.have.length_of(2)
|
|
|
|
instances = conn.describe_db_instances(DBInstanceIdentifier="db-master-1")
|
|
list(instances['DBInstances']).should.have.length_of(1)
|
|
instances['DBInstances'][0][
|
|
'DBInstanceIdentifier'].should.equal("db-master-1")
|
|
instances['DBInstances'][0]['DBInstanceArn'].should.equal(
|
|
'arn:aws:rds:us-west-2:1234567890:db:db-master-1')
|
|
|
|
|
|
@mock_rds2
|
|
def test_get_databases_paginated():
|
|
conn = boto3.client('rds', region_name="us-west-2")
|
|
|
|
for i in range(51):
|
|
conn.create_db_instance(AllocatedStorage=5,
|
|
Port=5432,
|
|
DBInstanceIdentifier='rds%d' % i,
|
|
DBInstanceClass='db.t1.micro',
|
|
Engine='postgres')
|
|
|
|
resp = conn.describe_db_instances()
|
|
resp["DBInstances"].should.have.length_of(50)
|
|
resp["Marker"].should.equal(resp["DBInstances"][-1]['DBInstanceIdentifier'])
|
|
|
|
resp2 = conn.describe_db_instances(Marker=resp["Marker"])
|
|
resp2["DBInstances"].should.have.length_of(1)
|
|
|
|
resp3 = conn.describe_db_instances(MaxRecords=100)
|
|
resp3["DBInstances"].should.have.length_of(51)
|
|
|
|
|
|
@mock_rds2
|
|
def test_describe_non_existant_database():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.describe_db_instances.when.called_with(
|
|
DBInstanceIdentifier="not-a-db").should.throw(ClientError)
|
|
|
|
|
|
@mock_rds2
|
|
def test_modify_db_instance():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
database = conn.create_db_instance(DBInstanceIdentifier='db-master-1',
|
|
AllocatedStorage=10,
|
|
DBInstanceClass='postgres',
|
|
Engine='db.m1.small',
|
|
MasterUsername='root',
|
|
MasterUserPassword='hunter2',
|
|
Port=1234,
|
|
DBSecurityGroups=['my_sg'])
|
|
instances = conn.describe_db_instances(DBInstanceIdentifier='db-master-1')
|
|
instances['DBInstances'][0]['AllocatedStorage'].should.equal(10)
|
|
conn.modify_db_instance(DBInstanceIdentifier='db-master-1',
|
|
AllocatedStorage=20,
|
|
ApplyImmediately=True)
|
|
instances = conn.describe_db_instances(DBInstanceIdentifier='db-master-1')
|
|
instances['DBInstances'][0]['AllocatedStorage'].should.equal(20)
|
|
|
|
|
|
@mock_rds2
|
|
def test_rename_db_instance():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
database = conn.create_db_instance(DBInstanceIdentifier='db-master-1',
|
|
AllocatedStorage=10,
|
|
DBInstanceClass='postgres',
|
|
Engine='db.m1.small',
|
|
MasterUsername='root',
|
|
MasterUserPassword='hunter2',
|
|
Port=1234,
|
|
DBSecurityGroups=['my_sg'])
|
|
instances = conn.describe_db_instances(DBInstanceIdentifier="db-master-1")
|
|
list(instances['DBInstances']).should.have.length_of(1)
|
|
conn.describe_db_instances.when.called_with(DBInstanceIdentifier="db-master-2").should.throw(ClientError)
|
|
conn.modify_db_instance(DBInstanceIdentifier='db-master-1',
|
|
NewDBInstanceIdentifier='db-master-2',
|
|
ApplyImmediately=True)
|
|
conn.describe_db_instances.when.called_with(DBInstanceIdentifier="db-master-1").should.throw(ClientError)
|
|
instances = conn.describe_db_instances(DBInstanceIdentifier="db-master-2")
|
|
list(instances['DBInstances']).should.have.length_of(1)
|
|
|
|
|
|
@mock_rds2
|
|
def test_modify_non_existant_database():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.modify_db_instance.when.called_with(DBInstanceIdentifier='not-a-db',
|
|
AllocatedStorage=20,
|
|
ApplyImmediately=True).should.throw(ClientError)
|
|
|
|
|
|
@mock_rds2
|
|
def test_reboot_db_instance():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_db_instance(DBInstanceIdentifier='db-master-1',
|
|
AllocatedStorage=10,
|
|
DBInstanceClass='postgres',
|
|
Engine='db.m1.small',
|
|
MasterUsername='root',
|
|
MasterUserPassword='hunter2',
|
|
Port=1234,
|
|
DBSecurityGroups=['my_sg'])
|
|
database = conn.reboot_db_instance(DBInstanceIdentifier='db-master-1')
|
|
database['DBInstance']['DBInstanceIdentifier'].should.equal("db-master-1")
|
|
|
|
|
|
@mock_rds2
|
|
def test_reboot_non_existant_database():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.reboot_db_instance.when.called_with(
|
|
DBInstanceIdentifier="not-a-db").should.throw(ClientError)
|
|
|
|
|
|
@mock_rds2
|
|
def test_delete_database():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
instances = conn.describe_db_instances()
|
|
list(instances['DBInstances']).should.have.length_of(0)
|
|
conn.create_db_instance(DBInstanceIdentifier='db-primary-1',
|
|
AllocatedStorage=10,
|
|
Engine='postgres',
|
|
DBInstanceClass='db.m1.small',
|
|
MasterUsername='root',
|
|
MasterUserPassword='hunter2',
|
|
Port=1234,
|
|
DBSecurityGroups=['my_sg'])
|
|
instances = conn.describe_db_instances()
|
|
list(instances['DBInstances']).should.have.length_of(1)
|
|
|
|
conn.delete_db_instance(DBInstanceIdentifier="db-primary-1",
|
|
FinalDBSnapshotIdentifier='primary-1-snapshot')
|
|
|
|
instances = conn.describe_db_instances()
|
|
list(instances['DBInstances']).should.have.length_of(0)
|
|
|
|
# Saved the snapshot
|
|
snapshots = conn.describe_db_snapshots(DBInstanceIdentifier="db-primary-1").get('DBSnapshots')
|
|
snapshots[0].get('Engine').should.equal('postgres')
|
|
|
|
|
|
@mock_rds2
|
|
def test_delete_non_existant_database():
|
|
conn = boto3.client('rds2', region_name="us-west-2")
|
|
conn.delete_db_instance.when.called_with(
|
|
DBInstanceIdentifier="not-a-db").should.throw(ClientError)
|
|
|
|
|
|
@mock_rds2
|
|
def test_create_db_snapshots():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_db_snapshot.when.called_with(
|
|
DBInstanceIdentifier='db-primary-1',
|
|
DBSnapshotIdentifier='snapshot-1').should.throw(ClientError)
|
|
|
|
conn.create_db_instance(DBInstanceIdentifier='db-primary-1',
|
|
AllocatedStorage=10,
|
|
Engine='postgres',
|
|
DBName='staging-postgres',
|
|
DBInstanceClass='db.m1.small',
|
|
MasterUsername='root',
|
|
MasterUserPassword='hunter2',
|
|
Port=1234,
|
|
DBSecurityGroups=["my_sg"])
|
|
|
|
snapshot = conn.create_db_snapshot(DBInstanceIdentifier='db-primary-1',
|
|
DBSnapshotIdentifier='g-1').get('DBSnapshot')
|
|
|
|
snapshot.get('Engine').should.equal('postgres')
|
|
snapshot.get('DBInstanceIdentifier').should.equal('db-primary-1')
|
|
snapshot.get('DBSnapshotIdentifier').should.equal('g-1')
|
|
result = conn.list_tags_for_resource(ResourceName=snapshot['DBSnapshotArn'])
|
|
result['TagList'].should.equal([])
|
|
|
|
|
|
@mock_rds2
|
|
def test_create_db_snapshots_copy_tags():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_db_snapshot.when.called_with(
|
|
DBInstanceIdentifier='db-primary-1',
|
|
DBSnapshotIdentifier='snapshot-1').should.throw(ClientError)
|
|
|
|
conn.create_db_instance(DBInstanceIdentifier='db-primary-1',
|
|
AllocatedStorage=10,
|
|
Engine='postgres',
|
|
DBName='staging-postgres',
|
|
DBInstanceClass='db.m1.small',
|
|
MasterUsername='root',
|
|
MasterUserPassword='hunter2',
|
|
Port=1234,
|
|
DBSecurityGroups=["my_sg"],
|
|
CopyTagsToSnapshot=True,
|
|
Tags=[
|
|
{
|
|
'Key': 'foo',
|
|
'Value': 'bar',
|
|
},
|
|
{
|
|
'Key': 'foo1',
|
|
'Value': 'bar1',
|
|
},
|
|
])
|
|
|
|
snapshot = conn.create_db_snapshot(DBInstanceIdentifier='db-primary-1',
|
|
DBSnapshotIdentifier='g-1').get('DBSnapshot')
|
|
|
|
snapshot.get('Engine').should.equal('postgres')
|
|
snapshot.get('DBInstanceIdentifier').should.equal('db-primary-1')
|
|
snapshot.get('DBSnapshotIdentifier').should.equal('g-1')
|
|
result = conn.list_tags_for_resource(ResourceName=snapshot['DBSnapshotArn'])
|
|
result['TagList'].should.equal([{'Value': 'bar',
|
|
'Key': 'foo'},
|
|
{'Value': 'bar1',
|
|
'Key': 'foo1'}])
|
|
|
|
|
|
@mock_rds2
|
|
def test_describe_db_snapshots():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_db_instance(DBInstanceIdentifier='db-primary-1',
|
|
AllocatedStorage=10,
|
|
Engine='postgres',
|
|
DBName='staging-postgres',
|
|
DBInstanceClass='db.m1.small',
|
|
MasterUsername='root',
|
|
MasterUserPassword='hunter2',
|
|
Port=1234,
|
|
DBSecurityGroups=["my_sg"])
|
|
|
|
created = conn.create_db_snapshot(DBInstanceIdentifier='db-primary-1',
|
|
DBSnapshotIdentifier='snapshot-1').get('DBSnapshot')
|
|
|
|
created.get('Engine').should.equal('postgres')
|
|
|
|
by_database_id = conn.describe_db_snapshots(DBInstanceIdentifier='db-primary-1').get('DBSnapshots')
|
|
by_snapshot_id = conn.describe_db_snapshots(DBSnapshotIdentifier='snapshot-1').get('DBSnapshots')
|
|
by_snapshot_id.should.equal(by_database_id)
|
|
|
|
snapshot = by_snapshot_id[0]
|
|
snapshot.should.equal(created)
|
|
snapshot.get('Engine').should.equal('postgres')
|
|
|
|
conn.create_db_snapshot(DBInstanceIdentifier='db-primary-1',
|
|
DBSnapshotIdentifier='snapshot-2')
|
|
snapshots = conn.describe_db_snapshots(DBInstanceIdentifier='db-primary-1').get('DBSnapshots')
|
|
snapshots.should.have.length_of(2)
|
|
|
|
|
|
@mock_rds2
|
|
def test_delete_db_snapshot():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_db_instance(DBInstanceIdentifier='db-primary-1',
|
|
AllocatedStorage=10,
|
|
Engine='postgres',
|
|
DBName='staging-postgres',
|
|
DBInstanceClass='db.m1.small',
|
|
MasterUsername='root',
|
|
MasterUserPassword='hunter2',
|
|
Port=1234,
|
|
DBSecurityGroups=["my_sg"])
|
|
conn.create_db_snapshot(DBInstanceIdentifier='db-primary-1',
|
|
DBSnapshotIdentifier='snapshot-1')
|
|
|
|
conn.describe_db_snapshots(DBSnapshotIdentifier='snapshot-1').get('DBSnapshots')[0]
|
|
conn.delete_db_snapshot(DBSnapshotIdentifier='snapshot-1')
|
|
conn.describe_db_snapshots.when.called_with(
|
|
DBSnapshotIdentifier='snapshot-1').should.throw(ClientError)
|
|
|
|
|
|
@mock_rds2
|
|
def test_create_option_group():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
option_group = conn.create_option_group(OptionGroupName='test',
|
|
EngineName='mysql',
|
|
MajorEngineVersion='5.6',
|
|
OptionGroupDescription='test option group')
|
|
option_group['OptionGroup']['OptionGroupName'].should.equal('test')
|
|
option_group['OptionGroup']['EngineName'].should.equal('mysql')
|
|
option_group['OptionGroup'][
|
|
'OptionGroupDescription'].should.equal('test option group')
|
|
option_group['OptionGroup']['MajorEngineVersion'].should.equal('5.6')
|
|
|
|
|
|
@mock_rds2
|
|
def test_create_option_group_bad_engine_name():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_option_group.when.called_with(OptionGroupName='test',
|
|
EngineName='invalid_engine',
|
|
MajorEngineVersion='5.6',
|
|
OptionGroupDescription='test invalid engine').should.throw(ClientError)
|
|
|
|
|
|
@mock_rds2
|
|
def test_create_option_group_bad_engine_major_version():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_option_group.when.called_with(OptionGroupName='test',
|
|
EngineName='mysql',
|
|
MajorEngineVersion='6.6.6',
|
|
OptionGroupDescription='test invalid engine version').should.throw(ClientError)
|
|
|
|
|
|
@mock_rds2
|
|
def test_create_option_group_empty_description():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_option_group.when.called_with(OptionGroupName='test',
|
|
EngineName='mysql',
|
|
MajorEngineVersion='5.6',
|
|
OptionGroupDescription='').should.throw(ClientError)
|
|
|
|
|
|
@mock_rds2
|
|
def test_create_option_group_duplicate():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_option_group(OptionGroupName='test',
|
|
EngineName='mysql',
|
|
MajorEngineVersion='5.6',
|
|
OptionGroupDescription='test option group')
|
|
conn.create_option_group.when.called_with(OptionGroupName='test',
|
|
EngineName='mysql',
|
|
MajorEngineVersion='5.6',
|
|
OptionGroupDescription='test option group').should.throw(ClientError)
|
|
|
|
|
|
@mock_rds2
|
|
def test_describe_option_group():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_option_group(OptionGroupName='test',
|
|
EngineName='mysql',
|
|
MajorEngineVersion='5.6',
|
|
OptionGroupDescription='test option group')
|
|
option_groups = conn.describe_option_groups(OptionGroupName='test')
|
|
option_groups['OptionGroupsList'][0][
|
|
'OptionGroupName'].should.equal('test')
|
|
|
|
|
|
@mock_rds2
|
|
def test_describe_non_existant_option_group():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.describe_option_groups.when.called_with(
|
|
OptionGroupName="not-a-option-group").should.throw(ClientError)
|
|
|
|
|
|
@mock_rds2
|
|
def test_delete_option_group():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_option_group(OptionGroupName='test',
|
|
EngineName='mysql',
|
|
MajorEngineVersion='5.6',
|
|
OptionGroupDescription='test option group')
|
|
option_groups = conn.describe_option_groups(OptionGroupName='test')
|
|
option_groups['OptionGroupsList'][0][
|
|
'OptionGroupName'].should.equal('test')
|
|
conn.delete_option_group(OptionGroupName='test')
|
|
conn.describe_option_groups.when.called_with(
|
|
OptionGroupName='test').should.throw(ClientError)
|
|
|
|
|
|
@mock_rds2
|
|
def test_delete_non_existant_option_group():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.delete_option_group.when.called_with(
|
|
OptionGroupName='non-existant').should.throw(ClientError)
|
|
|
|
|
|
@mock_rds2
|
|
def test_describe_option_group_options():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
option_group_options = conn.describe_option_group_options(
|
|
EngineName='sqlserver-ee')
|
|
len(option_group_options['OptionGroupOptions']).should.equal(4)
|
|
option_group_options = conn.describe_option_group_options(
|
|
EngineName='sqlserver-ee', MajorEngineVersion='11.00')
|
|
len(option_group_options['OptionGroupOptions']).should.equal(2)
|
|
option_group_options = conn.describe_option_group_options(
|
|
EngineName='mysql', MajorEngineVersion='5.6')
|
|
len(option_group_options['OptionGroupOptions']).should.equal(1)
|
|
conn.describe_option_group_options.when.called_with(
|
|
EngineName='non-existent').should.throw(ClientError)
|
|
conn.describe_option_group_options.when.called_with(
|
|
EngineName='mysql', MajorEngineVersion='non-existent').should.throw(ClientError)
|
|
|
|
|
|
@mock_rds2
|
|
def test_modify_option_group():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_option_group(OptionGroupName='test', EngineName='mysql',
|
|
MajorEngineVersion='5.6', OptionGroupDescription='test option group')
|
|
# TODO: create option and validate before deleting.
|
|
# if Someone can tell me how the hell to use this function
|
|
# to add options to an option_group, I can finish coding this.
|
|
result = conn.modify_option_group(OptionGroupName='test', OptionsToInclude=[
|
|
], OptionsToRemove=['MEMCACHED'], ApplyImmediately=True)
|
|
result['OptionGroup']['EngineName'].should.equal('mysql')
|
|
result['OptionGroup']['Options'].should.equal([])
|
|
result['OptionGroup']['OptionGroupName'].should.equal('test')
|
|
|
|
|
|
@mock_rds2
|
|
def test_modify_option_group_no_options():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_option_group(OptionGroupName='test', EngineName='mysql',
|
|
MajorEngineVersion='5.6', OptionGroupDescription='test option group')
|
|
conn.modify_option_group.when.called_with(
|
|
OptionGroupName='test').should.throw(ClientError)
|
|
|
|
|
|
@mock_rds2
|
|
def test_modify_non_existant_option_group():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.modify_option_group.when.called_with(OptionGroupName='non-existant', OptionsToInclude=[(
|
|
'OptionName', 'Port', 'DBSecurityGroupMemberships', 'VpcSecurityGroupMemberships', 'OptionSettings')]).should.throw(ParamValidationError)
|
|
|
|
|
|
@mock_rds2
|
|
def test_delete_non_existant_database():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.delete_db_instance.when.called_with(
|
|
DBInstanceIdentifier="not-a-db").should.throw(ClientError)
|
|
|
|
|
|
@mock_rds2
|
|
def test_list_tags_invalid_arn():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.list_tags_for_resource.when.called_with(
|
|
ResourceName='arn:aws:rds:bad-arn').should.throw(ClientError)
|
|
|
|
|
|
@mock_rds2
|
|
def test_list_tags_db():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
result = conn.list_tags_for_resource(
|
|
ResourceName='arn:aws:rds:us-west-2:1234567890:db:foo')
|
|
result['TagList'].should.equal([])
|
|
test_instance = conn.create_db_instance(
|
|
DBInstanceIdentifier='db-with-tags',
|
|
AllocatedStorage=10,
|
|
DBInstanceClass='postgres',
|
|
Engine='db.m1.small',
|
|
MasterUsername='root',
|
|
MasterUserPassword='hunter2',
|
|
Port=1234,
|
|
DBSecurityGroups=['my_sg'],
|
|
Tags=[
|
|
{
|
|
'Key': 'foo',
|
|
'Value': 'bar',
|
|
},
|
|
{
|
|
'Key': 'foo1',
|
|
'Value': 'bar1',
|
|
},
|
|
])
|
|
result = conn.list_tags_for_resource(
|
|
ResourceName=test_instance['DBInstance']['DBInstanceArn'])
|
|
result['TagList'].should.equal([{'Value': 'bar',
|
|
'Key': 'foo'},
|
|
{'Value': 'bar1',
|
|
'Key': 'foo1'}])
|
|
|
|
|
|
@mock_rds2
|
|
def test_add_tags_db():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_db_instance(DBInstanceIdentifier='db-without-tags',
|
|
AllocatedStorage=10,
|
|
DBInstanceClass='postgres',
|
|
Engine='db.m1.small',
|
|
MasterUsername='root',
|
|
MasterUserPassword='hunter2',
|
|
Port=1234,
|
|
DBSecurityGroups=['my_sg'],
|
|
Tags=[
|
|
{
|
|
'Key': 'foo',
|
|
'Value': 'bar',
|
|
},
|
|
{
|
|
'Key': 'foo1',
|
|
'Value': 'bar1',
|
|
},
|
|
])
|
|
result = conn.list_tags_for_resource(
|
|
ResourceName='arn:aws:rds:us-west-2:1234567890:db:db-without-tags')
|
|
list(result['TagList']).should.have.length_of(2)
|
|
conn.add_tags_to_resource(ResourceName='arn:aws:rds:us-west-2:1234567890:db:db-without-tags',
|
|
Tags=[
|
|
{
|
|
'Key': 'foo',
|
|
'Value': 'fish',
|
|
},
|
|
{
|
|
'Key': 'foo2',
|
|
'Value': 'bar2',
|
|
},
|
|
])
|
|
result = conn.list_tags_for_resource(
|
|
ResourceName='arn:aws:rds:us-west-2:1234567890:db:db-without-tags')
|
|
list(result['TagList']).should.have.length_of(3)
|
|
|
|
|
|
@mock_rds2
|
|
def test_remove_tags_db():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_db_instance(DBInstanceIdentifier='db-with-tags',
|
|
AllocatedStorage=10,
|
|
DBInstanceClass='postgres',
|
|
Engine='db.m1.small',
|
|
MasterUsername='root',
|
|
MasterUserPassword='hunter2',
|
|
Port=1234,
|
|
DBSecurityGroups=['my_sg'],
|
|
Tags=[
|
|
{
|
|
'Key': 'foo',
|
|
'Value': 'bar',
|
|
},
|
|
{
|
|
'Key': 'foo1',
|
|
'Value': 'bar1',
|
|
},
|
|
])
|
|
result = conn.list_tags_for_resource(
|
|
ResourceName='arn:aws:rds:us-west-2:1234567890:db:db-with-tags')
|
|
list(result['TagList']).should.have.length_of(2)
|
|
conn.remove_tags_from_resource(
|
|
ResourceName='arn:aws:rds:us-west-2:1234567890:db:db-with-tags', TagKeys=['foo'])
|
|
result = conn.list_tags_for_resource(
|
|
ResourceName='arn:aws:rds:us-west-2:1234567890:db:db-with-tags')
|
|
len(result['TagList']).should.equal(1)
|
|
|
|
|
|
@mock_rds2
|
|
def test_list_tags_snapshot():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
result = conn.list_tags_for_resource(
|
|
ResourceName='arn:aws:rds:us-west-2:1234567890:snapshot:foo')
|
|
result['TagList'].should.equal([])
|
|
conn.create_db_instance(DBInstanceIdentifier='db-primary-1',
|
|
AllocatedStorage=10,
|
|
Engine='postgres',
|
|
DBName='staging-postgres',
|
|
DBInstanceClass='db.m1.small',
|
|
MasterUsername='root',
|
|
MasterUserPassword='hunter2',
|
|
Port=1234,
|
|
DBSecurityGroups=["my_sg"])
|
|
snapshot = conn.create_db_snapshot(DBInstanceIdentifier='db-primary-1',
|
|
DBSnapshotIdentifier='snapshot-with-tags',
|
|
Tags=[
|
|
{
|
|
'Key': 'foo',
|
|
'Value': 'bar',
|
|
},
|
|
{
|
|
'Key': 'foo1',
|
|
'Value': 'bar1',
|
|
},
|
|
])
|
|
result = conn.list_tags_for_resource(ResourceName=snapshot['DBSnapshot']['DBSnapshotArn'])
|
|
result['TagList'].should.equal([{'Value': 'bar',
|
|
'Key': 'foo'},
|
|
{'Value': 'bar1',
|
|
'Key': 'foo1'}])
|
|
|
|
|
|
@mock_rds2
|
|
def test_add_tags_snapshot():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_db_instance(DBInstanceIdentifier='db-primary-1',
|
|
AllocatedStorage=10,
|
|
Engine='postgres',
|
|
DBName='staging-postgres',
|
|
DBInstanceClass='db.m1.small',
|
|
MasterUsername='root',
|
|
MasterUserPassword='hunter2',
|
|
Port=1234,
|
|
DBSecurityGroups=["my_sg"])
|
|
snapshot = conn.create_db_snapshot(DBInstanceIdentifier='db-primary-1',
|
|
DBSnapshotIdentifier='snapshot-without-tags',
|
|
Tags=[
|
|
{
|
|
'Key': 'foo',
|
|
'Value': 'bar',
|
|
},
|
|
{
|
|
'Key': 'foo1',
|
|
'Value': 'bar1',
|
|
},
|
|
])
|
|
result = conn.list_tags_for_resource(
|
|
ResourceName='arn:aws:rds:us-west-2:1234567890:snapshot:snapshot-without-tags')
|
|
list(result['TagList']).should.have.length_of(2)
|
|
conn.add_tags_to_resource(ResourceName='arn:aws:rds:us-west-2:1234567890:snapshot:snapshot-without-tags',
|
|
Tags=[
|
|
{
|
|
'Key': 'foo',
|
|
'Value': 'fish',
|
|
},
|
|
{
|
|
'Key': 'foo2',
|
|
'Value': 'bar2',
|
|
},
|
|
])
|
|
result = conn.list_tags_for_resource(
|
|
ResourceName='arn:aws:rds:us-west-2:1234567890:snapshot:snapshot-without-tags')
|
|
list(result['TagList']).should.have.length_of(3)
|
|
|
|
|
|
@mock_rds2
|
|
def test_remove_tags_snapshot():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_db_instance(DBInstanceIdentifier='db-primary-1',
|
|
AllocatedStorage=10,
|
|
Engine='postgres',
|
|
DBName='staging-postgres',
|
|
DBInstanceClass='db.m1.small',
|
|
MasterUsername='root',
|
|
MasterUserPassword='hunter2',
|
|
Port=1234,
|
|
DBSecurityGroups=["my_sg"])
|
|
snapshot = conn.create_db_snapshot(DBInstanceIdentifier='db-primary-1',
|
|
DBSnapshotIdentifier='snapshot-with-tags',
|
|
Tags=[
|
|
{
|
|
'Key': 'foo',
|
|
'Value': 'bar',
|
|
},
|
|
{
|
|
'Key': 'foo1',
|
|
'Value': 'bar1',
|
|
},
|
|
])
|
|
result = conn.list_tags_for_resource(
|
|
ResourceName='arn:aws:rds:us-west-2:1234567890:snapshot:snapshot-with-tags')
|
|
list(result['TagList']).should.have.length_of(2)
|
|
conn.remove_tags_from_resource(
|
|
ResourceName='arn:aws:rds:us-west-2:1234567890:snapshot:snapshot-with-tags', TagKeys=['foo'])
|
|
result = conn.list_tags_for_resource(
|
|
ResourceName='arn:aws:rds:us-west-2:1234567890:snapshot:snapshot-with-tags')
|
|
len(result['TagList']).should.equal(1)
|
|
|
|
|
|
@mock_rds2
|
|
def test_add_tags_option_group():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_option_group(OptionGroupName='test',
|
|
EngineName='mysql',
|
|
MajorEngineVersion='5.6',
|
|
OptionGroupDescription='test option group')
|
|
result = conn.list_tags_for_resource(
|
|
ResourceName='arn:aws:rds:us-west-2:1234567890:og:test')
|
|
list(result['TagList']).should.have.length_of(0)
|
|
conn.add_tags_to_resource(ResourceName='arn:aws:rds:us-west-2:1234567890:og:test',
|
|
Tags=[
|
|
{
|
|
'Key': 'foo',
|
|
'Value': 'fish',
|
|
},
|
|
{
|
|
'Key': 'foo2',
|
|
'Value': 'bar2',
|
|
}])
|
|
result = conn.list_tags_for_resource(
|
|
ResourceName='arn:aws:rds:us-west-2:1234567890:og:test')
|
|
list(result['TagList']).should.have.length_of(2)
|
|
|
|
|
|
@mock_rds2
|
|
def test_remove_tags_option_group():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_option_group(OptionGroupName='test',
|
|
EngineName='mysql',
|
|
MajorEngineVersion='5.6',
|
|
OptionGroupDescription='test option group')
|
|
result = conn.list_tags_for_resource(
|
|
ResourceName='arn:aws:rds:us-west-2:1234567890:og:test')
|
|
conn.add_tags_to_resource(ResourceName='arn:aws:rds:us-west-2:1234567890:og:test',
|
|
Tags=[
|
|
{
|
|
'Key': 'foo',
|
|
'Value': 'fish',
|
|
},
|
|
{
|
|
'Key': 'foo2',
|
|
'Value': 'bar2',
|
|
}])
|
|
result = conn.list_tags_for_resource(
|
|
ResourceName='arn:aws:rds:us-west-2:1234567890:og:test')
|
|
list(result['TagList']).should.have.length_of(2)
|
|
conn.remove_tags_from_resource(ResourceName='arn:aws:rds:us-west-2:1234567890:og:test',
|
|
TagKeys=['foo'])
|
|
result = conn.list_tags_for_resource(
|
|
ResourceName='arn:aws:rds:us-west-2:1234567890:og:test')
|
|
list(result['TagList']).should.have.length_of(1)
|
|
|
|
|
|
@mock_rds2
|
|
def test_create_database_security_group():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
|
|
result = conn.create_db_security_group(
|
|
DBSecurityGroupName='db_sg', DBSecurityGroupDescription='DB Security Group')
|
|
result['DBSecurityGroup']['DBSecurityGroupName'].should.equal("db_sg")
|
|
result['DBSecurityGroup'][
|
|
'DBSecurityGroupDescription'].should.equal("DB Security Group")
|
|
result['DBSecurityGroup']['IPRanges'].should.equal([])
|
|
|
|
|
|
@mock_rds2
|
|
def test_get_security_groups():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
|
|
result = conn.describe_db_security_groups()
|
|
result['DBSecurityGroups'].should.have.length_of(0)
|
|
|
|
conn.create_db_security_group(
|
|
DBSecurityGroupName='db_sg1', DBSecurityGroupDescription='DB Security Group')
|
|
conn.create_db_security_group(
|
|
DBSecurityGroupName='db_sg2', DBSecurityGroupDescription='DB Security Group')
|
|
|
|
result = conn.describe_db_security_groups()
|
|
result['DBSecurityGroups'].should.have.length_of(2)
|
|
|
|
result = conn.describe_db_security_groups(DBSecurityGroupName="db_sg1")
|
|
result['DBSecurityGroups'].should.have.length_of(1)
|
|
result['DBSecurityGroups'][0]['DBSecurityGroupName'].should.equal("db_sg1")
|
|
|
|
|
|
@mock_rds2
|
|
def test_get_non_existant_security_group():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.describe_db_security_groups.when.called_with(
|
|
DBSecurityGroupName="not-a-sg").should.throw(ClientError)
|
|
|
|
|
|
@mock_rds2
|
|
def test_delete_database_security_group():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_db_security_group(
|
|
DBSecurityGroupName='db_sg', DBSecurityGroupDescription='DB Security Group')
|
|
|
|
result = conn.describe_db_security_groups()
|
|
result['DBSecurityGroups'].should.have.length_of(1)
|
|
|
|
conn.delete_db_security_group(DBSecurityGroupName="db_sg")
|
|
result = conn.describe_db_security_groups()
|
|
result['DBSecurityGroups'].should.have.length_of(0)
|
|
|
|
|
|
@mock_rds2
|
|
def test_delete_non_existant_security_group():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.delete_db_security_group.when.called_with(
|
|
DBSecurityGroupName="not-a-db").should.throw(ClientError)
|
|
|
|
|
|
@mock_rds2
|
|
def test_security_group_authorize():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
security_group = conn.create_db_security_group(DBSecurityGroupName='db_sg',
|
|
DBSecurityGroupDescription='DB Security Group')
|
|
security_group['DBSecurityGroup']['IPRanges'].should.equal([])
|
|
|
|
conn.authorize_db_security_group_ingress(DBSecurityGroupName='db_sg',
|
|
CIDRIP='10.3.2.45/32')
|
|
|
|
result = conn.describe_db_security_groups(DBSecurityGroupName="db_sg")
|
|
result['DBSecurityGroups'][0]['IPRanges'].should.have.length_of(1)
|
|
result['DBSecurityGroups'][0]['IPRanges'].should.equal(
|
|
[{'Status': 'authorized', 'CIDRIP': '10.3.2.45/32'}])
|
|
|
|
conn.authorize_db_security_group_ingress(DBSecurityGroupName='db_sg',
|
|
CIDRIP='10.3.2.46/32')
|
|
result = conn.describe_db_security_groups(DBSecurityGroupName="db_sg")
|
|
result['DBSecurityGroups'][0]['IPRanges'].should.have.length_of(2)
|
|
result['DBSecurityGroups'][0]['IPRanges'].should.equal([
|
|
{'Status': 'authorized', 'CIDRIP': '10.3.2.45/32'},
|
|
{'Status': 'authorized', 'CIDRIP': '10.3.2.46/32'},
|
|
])
|
|
|
|
|
|
@mock_rds2
|
|
def test_add_security_group_to_database():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
|
|
conn.create_db_instance(DBInstanceIdentifier='db-master-1',
|
|
AllocatedStorage=10,
|
|
DBInstanceClass='postgres',
|
|
Engine='db.m1.small',
|
|
MasterUsername='root',
|
|
MasterUserPassword='hunter2',
|
|
Port=1234)
|
|
|
|
result = conn.describe_db_instances()
|
|
result['DBInstances'][0]['DBSecurityGroups'].should.equal([])
|
|
conn.create_db_security_group(DBSecurityGroupName='db_sg',
|
|
DBSecurityGroupDescription='DB Security Group')
|
|
conn.modify_db_instance(DBInstanceIdentifier='db-master-1',
|
|
DBSecurityGroups=['db_sg'])
|
|
result = conn.describe_db_instances()
|
|
result['DBInstances'][0]['DBSecurityGroups'][0][
|
|
'DBSecurityGroupName'].should.equal('db_sg')
|
|
|
|
|
|
@mock_rds2
|
|
def test_list_tags_security_group():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
result = conn.describe_db_subnet_groups()
|
|
result['DBSubnetGroups'].should.have.length_of(0)
|
|
|
|
security_group = conn.create_db_security_group(DBSecurityGroupName="db_sg",
|
|
DBSecurityGroupDescription='DB Security Group',
|
|
Tags=[{'Value': 'bar',
|
|
'Key': 'foo'},
|
|
{'Value': 'bar1',
|
|
'Key': 'foo1'}])['DBSecurityGroup']['DBSecurityGroupName']
|
|
resource = 'arn:aws:rds:us-west-2:1234567890:secgrp:{0}'.format(
|
|
security_group)
|
|
result = conn.list_tags_for_resource(ResourceName=resource)
|
|
result['TagList'].should.equal([{'Value': 'bar',
|
|
'Key': 'foo'},
|
|
{'Value': 'bar1',
|
|
'Key': 'foo1'}])
|
|
|
|
|
|
@mock_rds2
|
|
def test_add_tags_security_group():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
result = conn.describe_db_subnet_groups()
|
|
result['DBSubnetGroups'].should.have.length_of(0)
|
|
|
|
security_group = conn.create_db_security_group(DBSecurityGroupName="db_sg",
|
|
DBSecurityGroupDescription='DB Security Group')['DBSecurityGroup']['DBSecurityGroupName']
|
|
|
|
resource = 'arn:aws:rds:us-west-2:1234567890:secgrp:{0}'.format(
|
|
security_group)
|
|
conn.add_tags_to_resource(ResourceName=resource,
|
|
Tags=[{'Value': 'bar',
|
|
'Key': 'foo'},
|
|
{'Value': 'bar1',
|
|
'Key': 'foo1'}])
|
|
|
|
result = conn.list_tags_for_resource(ResourceName=resource)
|
|
result['TagList'].should.equal([{'Value': 'bar',
|
|
'Key': 'foo'},
|
|
{'Value': 'bar1',
|
|
'Key': 'foo1'}])
|
|
|
|
|
|
@mock_rds2
|
|
def test_remove_tags_security_group():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
result = conn.describe_db_subnet_groups()
|
|
result['DBSubnetGroups'].should.have.length_of(0)
|
|
|
|
security_group = conn.create_db_security_group(DBSecurityGroupName="db_sg",
|
|
DBSecurityGroupDescription='DB Security Group',
|
|
Tags=[{'Value': 'bar',
|
|
'Key': 'foo'},
|
|
{'Value': 'bar1',
|
|
'Key': 'foo1'}])['DBSecurityGroup']['DBSecurityGroupName']
|
|
|
|
resource = 'arn:aws:rds:us-west-2:1234567890:secgrp:{0}'.format(
|
|
security_group)
|
|
conn.remove_tags_from_resource(ResourceName=resource, TagKeys=['foo'])
|
|
|
|
result = conn.list_tags_for_resource(ResourceName=resource)
|
|
result['TagList'].should.equal([{'Value': 'bar1', 'Key': 'foo1'}])
|
|
|
|
|
|
@mock_ec2
|
|
@mock_rds2
|
|
def test_create_database_subnet_group():
|
|
vpc_conn = boto3.client('ec2', 'us-west-2')
|
|
vpc = vpc_conn.create_vpc(CidrBlock='10.0.0.0/16')['Vpc']
|
|
subnet1 = vpc_conn.create_subnet(
|
|
VpcId=vpc['VpcId'], CidrBlock='10.0.1.0/24')['Subnet']
|
|
subnet2 = vpc_conn.create_subnet(
|
|
VpcId=vpc['VpcId'], CidrBlock='10.0.2.0/24')['Subnet']
|
|
|
|
subnet_ids = [subnet1['SubnetId'], subnet2['SubnetId']]
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
result = conn.create_db_subnet_group(DBSubnetGroupName='db_subnet',
|
|
DBSubnetGroupDescription='my db subnet',
|
|
SubnetIds=subnet_ids)
|
|
result['DBSubnetGroup']['DBSubnetGroupName'].should.equal("db_subnet")
|
|
result['DBSubnetGroup'][
|
|
'DBSubnetGroupDescription'].should.equal("my db subnet")
|
|
subnets = result['DBSubnetGroup']['Subnets']
|
|
subnet_group_ids = [subnets[0]['SubnetIdentifier'],
|
|
subnets[1]['SubnetIdentifier']]
|
|
list(subnet_group_ids).should.equal(subnet_ids)
|
|
|
|
|
|
@mock_ec2
|
|
@mock_rds2
|
|
def test_create_database_in_subnet_group():
|
|
vpc_conn = boto3.client('ec2', 'us-west-2')
|
|
vpc = vpc_conn.create_vpc(CidrBlock='10.0.0.0/16')['Vpc']
|
|
subnet = vpc_conn.create_subnet(
|
|
VpcId=vpc['VpcId'], CidrBlock='10.0.1.0/24')['Subnet']
|
|
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_db_subnet_group(DBSubnetGroupName='db_subnet1',
|
|
DBSubnetGroupDescription='my db subnet',
|
|
SubnetIds=[subnet['SubnetId']])
|
|
conn.create_db_instance(DBInstanceIdentifier='db-master-1',
|
|
AllocatedStorage=10,
|
|
Engine='postgres',
|
|
DBInstanceClass='db.m1.small',
|
|
MasterUsername='root',
|
|
MasterUserPassword='hunter2',
|
|
Port=1234,
|
|
DBSubnetGroupName='db_subnet1')
|
|
result = conn.describe_db_instances(DBInstanceIdentifier='db-master-1')
|
|
result['DBInstances'][0]['DBSubnetGroup'][
|
|
'DBSubnetGroupName'].should.equal('db_subnet1')
|
|
|
|
|
|
@mock_ec2
|
|
@mock_rds2
|
|
def test_describe_database_subnet_group():
|
|
vpc_conn = boto3.client('ec2', 'us-west-2')
|
|
vpc = vpc_conn.create_vpc(CidrBlock='10.0.0.0/16')['Vpc']
|
|
subnet = vpc_conn.create_subnet(
|
|
VpcId=vpc['VpcId'], CidrBlock='10.0.1.0/24')['Subnet']
|
|
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_db_subnet_group(DBSubnetGroupName="db_subnet1",
|
|
DBSubnetGroupDescription='my db subnet',
|
|
SubnetIds=[subnet['SubnetId']])
|
|
conn.create_db_subnet_group(DBSubnetGroupName='db_subnet2',
|
|
DBSubnetGroupDescription='my db subnet',
|
|
SubnetIds=[subnet['SubnetId']])
|
|
|
|
resp = conn.describe_db_subnet_groups()
|
|
resp['DBSubnetGroups'].should.have.length_of(2)
|
|
|
|
subnets = resp['DBSubnetGroups'][0]['Subnets']
|
|
subnets.should.have.length_of(1)
|
|
|
|
list(conn.describe_db_subnet_groups(DBSubnetGroupName="db_subnet1")
|
|
['DBSubnetGroups']).should.have.length_of(1)
|
|
|
|
conn.describe_db_subnet_groups.when.called_with(
|
|
DBSubnetGroupName="not-a-subnet").should.throw(ClientError)
|
|
|
|
|
|
@mock_ec2
|
|
@mock_rds2
|
|
def test_delete_database_subnet_group():
|
|
vpc_conn = boto3.client('ec2', 'us-west-2')
|
|
vpc = vpc_conn.create_vpc(CidrBlock='10.0.0.0/16')['Vpc']
|
|
subnet = vpc_conn.create_subnet(
|
|
VpcId=vpc['VpcId'], CidrBlock='10.0.1.0/24')['Subnet']
|
|
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
result = conn.describe_db_subnet_groups()
|
|
result['DBSubnetGroups'].should.have.length_of(0)
|
|
|
|
conn.create_db_subnet_group(DBSubnetGroupName="db_subnet1",
|
|
DBSubnetGroupDescription='my db subnet',
|
|
SubnetIds=[subnet['SubnetId']])
|
|
result = conn.describe_db_subnet_groups()
|
|
result['DBSubnetGroups'].should.have.length_of(1)
|
|
|
|
conn.delete_db_subnet_group(DBSubnetGroupName="db_subnet1")
|
|
result = conn.describe_db_subnet_groups()
|
|
result['DBSubnetGroups'].should.have.length_of(0)
|
|
|
|
conn.delete_db_subnet_group.when.called_with(
|
|
DBSubnetGroupName="db_subnet1").should.throw(ClientError)
|
|
|
|
|
|
@mock_ec2
|
|
@mock_rds2
|
|
def test_list_tags_database_subnet_group():
|
|
vpc_conn = boto3.client('ec2', 'us-west-2')
|
|
vpc = vpc_conn.create_vpc(CidrBlock='10.0.0.0/16')['Vpc']
|
|
subnet = vpc_conn.create_subnet(
|
|
VpcId=vpc['VpcId'], CidrBlock='10.0.1.0/24')['Subnet']
|
|
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
result = conn.describe_db_subnet_groups()
|
|
result['DBSubnetGroups'].should.have.length_of(0)
|
|
|
|
subnet = conn.create_db_subnet_group(DBSubnetGroupName="db_subnet1",
|
|
DBSubnetGroupDescription='my db subnet',
|
|
SubnetIds=[subnet['SubnetId']],
|
|
Tags=[{'Value': 'bar',
|
|
'Key': 'foo'},
|
|
{'Value': 'bar1',
|
|
'Key': 'foo1'}])['DBSubnetGroup']['DBSubnetGroupName']
|
|
result = conn.list_tags_for_resource(
|
|
ResourceName='arn:aws:rds:us-west-2:1234567890:subgrp:{0}'.format(subnet))
|
|
result['TagList'].should.equal([{'Value': 'bar',
|
|
'Key': 'foo'},
|
|
{'Value': 'bar1',
|
|
'Key': 'foo1'}])
|
|
|
|
|
|
@mock_ec2
|
|
@mock_rds2
|
|
def test_add_tags_database_subnet_group():
|
|
vpc_conn = boto3.client('ec2', 'us-west-2')
|
|
vpc = vpc_conn.create_vpc(CidrBlock='10.0.0.0/16')['Vpc']
|
|
subnet = vpc_conn.create_subnet(
|
|
VpcId=vpc['VpcId'], CidrBlock='10.0.1.0/24')['Subnet']
|
|
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
result = conn.describe_db_subnet_groups()
|
|
result['DBSubnetGroups'].should.have.length_of(0)
|
|
|
|
subnet = conn.create_db_subnet_group(DBSubnetGroupName="db_subnet1",
|
|
DBSubnetGroupDescription='my db subnet',
|
|
SubnetIds=[subnet['SubnetId']],
|
|
Tags=[])['DBSubnetGroup']['DBSubnetGroupName']
|
|
resource = 'arn:aws:rds:us-west-2:1234567890:subgrp:{0}'.format(subnet)
|
|
|
|
conn.add_tags_to_resource(ResourceName=resource,
|
|
Tags=[{'Value': 'bar',
|
|
'Key': 'foo'},
|
|
{'Value': 'bar1',
|
|
'Key': 'foo1'}])
|
|
|
|
result = conn.list_tags_for_resource(ResourceName=resource)
|
|
result['TagList'].should.equal([{'Value': 'bar',
|
|
'Key': 'foo'},
|
|
{'Value': 'bar1',
|
|
'Key': 'foo1'}])
|
|
|
|
|
|
@mock_ec2
|
|
@mock_rds2
|
|
def test_remove_tags_database_subnet_group():
|
|
vpc_conn = boto3.client('ec2', 'us-west-2')
|
|
vpc = vpc_conn.create_vpc(CidrBlock='10.0.0.0/16')['Vpc']
|
|
subnet = vpc_conn.create_subnet(
|
|
VpcId=vpc['VpcId'], CidrBlock='10.0.1.0/24')['Subnet']
|
|
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
result = conn.describe_db_subnet_groups()
|
|
result['DBSubnetGroups'].should.have.length_of(0)
|
|
|
|
subnet = conn.create_db_subnet_group(DBSubnetGroupName="db_subnet1",
|
|
DBSubnetGroupDescription='my db subnet',
|
|
SubnetIds=[subnet['SubnetId']],
|
|
Tags=[{'Value': 'bar',
|
|
'Key': 'foo'},
|
|
{'Value': 'bar1',
|
|
'Key': 'foo1'}])['DBSubnetGroup']['DBSubnetGroupName']
|
|
resource = 'arn:aws:rds:us-west-2:1234567890:subgrp:{0}'.format(subnet)
|
|
|
|
conn.remove_tags_from_resource(ResourceName=resource, TagKeys=['foo'])
|
|
|
|
result = conn.list_tags_for_resource(ResourceName=resource)
|
|
result['TagList'].should.equal([{'Value': 'bar1', 'Key': 'foo1'}])
|
|
|
|
|
|
@mock_rds2
|
|
def test_create_database_replica():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
|
|
database = conn.create_db_instance(DBInstanceIdentifier='db-master-1',
|
|
AllocatedStorage=10,
|
|
Engine='postgres',
|
|
DBInstanceClass='db.m1.small',
|
|
MasterUsername='root',
|
|
MasterUserPassword='hunter2',
|
|
Port=1234,
|
|
DBSecurityGroups=["my_sg"])
|
|
|
|
replica = conn.create_db_instance_read_replica(DBInstanceIdentifier="db-replica-1",
|
|
SourceDBInstanceIdentifier="db-master-1",
|
|
DBInstanceClass="db.m1.small")
|
|
replica['DBInstance'][
|
|
'ReadReplicaSourceDBInstanceIdentifier'].should.equal('db-master-1')
|
|
replica['DBInstance']['DBInstanceClass'].should.equal('db.m1.small')
|
|
replica['DBInstance']['DBInstanceIdentifier'].should.equal('db-replica-1')
|
|
|
|
master = conn.describe_db_instances(DBInstanceIdentifier="db-master-1")
|
|
master['DBInstances'][0]['ReadReplicaDBInstanceIdentifiers'].should.equal([
|
|
'db-replica-1'])
|
|
|
|
conn.delete_db_instance(
|
|
DBInstanceIdentifier="db-replica-1", SkipFinalSnapshot=True)
|
|
|
|
master = conn.describe_db_instances(DBInstanceIdentifier="db-master-1")
|
|
master['DBInstances'][0][
|
|
'ReadReplicaDBInstanceIdentifiers'].should.equal([])
|
|
|
|
|
|
@mock_rds2
|
|
@mock_kms
|
|
def test_create_database_with_encrypted_storage():
|
|
kms_conn = boto3.client('kms', region_name='us-west-2')
|
|
key = kms_conn.create_key(Policy='my RDS encryption policy',
|
|
Description='RDS encryption key',
|
|
KeyUsage='ENCRYPT_DECRYPT')
|
|
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
database = conn.create_db_instance(DBInstanceIdentifier='db-master-1',
|
|
AllocatedStorage=10,
|
|
Engine='postgres',
|
|
DBInstanceClass='db.m1.small',
|
|
MasterUsername='root',
|
|
MasterUserPassword='hunter2',
|
|
Port=1234,
|
|
DBSecurityGroups=["my_sg"],
|
|
StorageEncrypted=True,
|
|
KmsKeyId=key['KeyMetadata']['KeyId'])
|
|
|
|
database['DBInstance']['StorageEncrypted'].should.equal(True)
|
|
database['DBInstance']['KmsKeyId'].should.equal(
|
|
key['KeyMetadata']['KeyId'])
|
|
|
|
|
|
@mock_rds2
|
|
def test_create_db_parameter_group():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
db_parameter_group = conn.create_db_parameter_group(DBParameterGroupName='test',
|
|
DBParameterGroupFamily='mysql5.6',
|
|
Description='test parameter group')
|
|
|
|
db_parameter_group['DBParameterGroup'][
|
|
'DBParameterGroupName'].should.equal('test')
|
|
db_parameter_group['DBParameterGroup'][
|
|
'DBParameterGroupFamily'].should.equal('mysql5.6')
|
|
db_parameter_group['DBParameterGroup'][
|
|
'Description'].should.equal('test parameter group')
|
|
|
|
|
|
@mock_rds2
|
|
def test_create_db_instance_with_parameter_group():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
db_parameter_group = conn.create_db_parameter_group(DBParameterGroupName='test',
|
|
DBParameterGroupFamily='mysql5.6',
|
|
Description='test parameter group')
|
|
|
|
database = conn.create_db_instance(DBInstanceIdentifier='db-master-1',
|
|
AllocatedStorage=10,
|
|
Engine='mysql',
|
|
DBInstanceClass='db.m1.small',
|
|
DBParameterGroupName='test',
|
|
MasterUsername='root',
|
|
MasterUserPassword='hunter2',
|
|
Port=1234)
|
|
|
|
len(database['DBInstance']['DBParameterGroups']).should.equal(1)
|
|
database['DBInstance']['DBParameterGroups'][0][
|
|
'DBParameterGroupName'].should.equal('test')
|
|
database['DBInstance']['DBParameterGroups'][0][
|
|
'ParameterApplyStatus'].should.equal('in-sync')
|
|
|
|
|
|
@mock_rds2
|
|
def test_create_database_with_default_port():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
database = conn.create_db_instance(DBInstanceIdentifier='db-master-1',
|
|
AllocatedStorage=10,
|
|
Engine='postgres',
|
|
DBInstanceClass='db.m1.small',
|
|
MasterUsername='root',
|
|
MasterUserPassword='hunter2',
|
|
DBSecurityGroups=["my_sg"])
|
|
database['DBInstance']['Endpoint']['Port'].should.equal(5432)
|
|
|
|
|
|
@mock_rds2
|
|
def test_modify_db_instance_with_parameter_group():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
database = conn.create_db_instance(DBInstanceIdentifier='db-master-1',
|
|
AllocatedStorage=10,
|
|
Engine='mysql',
|
|
DBInstanceClass='db.m1.small',
|
|
MasterUsername='root',
|
|
MasterUserPassword='hunter2',
|
|
Port=1234)
|
|
|
|
len(database['DBInstance']['DBParameterGroups']).should.equal(1)
|
|
database['DBInstance']['DBParameterGroups'][0][
|
|
'DBParameterGroupName'].should.equal('default.mysql5.6')
|
|
database['DBInstance']['DBParameterGroups'][0][
|
|
'ParameterApplyStatus'].should.equal('in-sync')
|
|
|
|
db_parameter_group = conn.create_db_parameter_group(DBParameterGroupName='test',
|
|
DBParameterGroupFamily='mysql5.6',
|
|
Description='test parameter group')
|
|
conn.modify_db_instance(DBInstanceIdentifier='db-master-1',
|
|
DBParameterGroupName='test',
|
|
ApplyImmediately=True)
|
|
|
|
database = conn.describe_db_instances(
|
|
DBInstanceIdentifier='db-master-1')['DBInstances'][0]
|
|
len(database['DBParameterGroups']).should.equal(1)
|
|
database['DBParameterGroups'][0][
|
|
'DBParameterGroupName'].should.equal('test')
|
|
database['DBParameterGroups'][0][
|
|
'ParameterApplyStatus'].should.equal('in-sync')
|
|
|
|
|
|
@mock_rds2
|
|
def test_create_db_parameter_group_empty_description():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_db_parameter_group.when.called_with(DBParameterGroupName='test',
|
|
DBParameterGroupFamily='mysql5.6',
|
|
Description='').should.throw(ClientError)
|
|
|
|
|
|
@mock_rds2
|
|
def test_create_db_parameter_group_duplicate():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_db_parameter_group(DBParameterGroupName='test',
|
|
DBParameterGroupFamily='mysql5.6',
|
|
Description='test parameter group')
|
|
conn.create_db_parameter_group.when.called_with(DBParameterGroupName='test',
|
|
DBParameterGroupFamily='mysql5.6',
|
|
Description='test parameter group').should.throw(ClientError)
|
|
|
|
|
|
@mock_rds2
|
|
def test_describe_db_parameter_group():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_db_parameter_group(DBParameterGroupName='test',
|
|
DBParameterGroupFamily='mysql5.6',
|
|
Description='test parameter group')
|
|
db_parameter_groups = conn.describe_db_parameter_groups(
|
|
DBParameterGroupName='test')
|
|
db_parameter_groups['DBParameterGroups'][0][
|
|
'DBParameterGroupName'].should.equal('test')
|
|
|
|
|
|
@mock_rds2
|
|
def test_describe_non_existant_db_parameter_group():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
db_parameter_groups = conn.describe_db_parameter_groups(
|
|
DBParameterGroupName='test')
|
|
len(db_parameter_groups['DBParameterGroups']).should.equal(0)
|
|
|
|
|
|
@mock_rds2
|
|
def test_delete_db_parameter_group():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_db_parameter_group(DBParameterGroupName='test',
|
|
DBParameterGroupFamily='mysql5.6',
|
|
Description='test parameter group')
|
|
db_parameter_groups = conn.describe_db_parameter_groups(
|
|
DBParameterGroupName='test')
|
|
db_parameter_groups['DBParameterGroups'][0][
|
|
'DBParameterGroupName'].should.equal('test')
|
|
conn.delete_db_parameter_group(DBParameterGroupName='test')
|
|
db_parameter_groups = conn.describe_db_parameter_groups(
|
|
DBParameterGroupName='test')
|
|
len(db_parameter_groups['DBParameterGroups']).should.equal(0)
|
|
|
|
|
|
@mock_rds2
|
|
def test_modify_db_parameter_group():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_db_parameter_group(DBParameterGroupName='test',
|
|
DBParameterGroupFamily='mysql5.6',
|
|
Description='test parameter group')
|
|
|
|
modify_result = conn.modify_db_parameter_group(DBParameterGroupName='test',
|
|
Parameters=[{
|
|
'ParameterName': 'foo',
|
|
'ParameterValue': 'foo_val',
|
|
'Description': 'test param',
|
|
'ApplyMethod': 'immediate'
|
|
}]
|
|
)
|
|
|
|
modify_result['DBParameterGroupName'].should.equal('test')
|
|
|
|
db_parameters = conn.describe_db_parameters(DBParameterGroupName='test')
|
|
db_parameters['Parameters'][0]['ParameterName'].should.equal('foo')
|
|
db_parameters['Parameters'][0]['ParameterValue'].should.equal('foo_val')
|
|
db_parameters['Parameters'][0]['Description'].should.equal('test param')
|
|
db_parameters['Parameters'][0]['ApplyMethod'].should.equal('immediate')
|
|
|
|
|
|
@mock_rds2
|
|
def test_delete_non_existant_db_parameter_group():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.delete_db_parameter_group.when.called_with(
|
|
DBParameterGroupName='non-existant').should.throw(ClientError)
|
|
|
|
|
|
@mock_rds2
|
|
def test_create_parameter_group_with_tags():
|
|
conn = boto3.client('rds', region_name='us-west-2')
|
|
conn.create_db_parameter_group(DBParameterGroupName='test',
|
|
DBParameterGroupFamily='mysql5.6',
|
|
Description='test parameter group',
|
|
Tags=[{
|
|
'Key': 'foo',
|
|
'Value': 'bar',
|
|
}])
|
|
result = conn.list_tags_for_resource(
|
|
ResourceName='arn:aws:rds:us-west-2:1234567890:pg:test')
|
|
result['TagList'].should.equal([{'Value': 'bar', 'Key': 'foo'}])
|