fix up some issues found in unittests - comment out snapshotting until later
This commit is contained in:
		
							parent
							
								
									9687b6e03e
								
							
						
					
					
						commit
						ed39c2ea4e
					
				@ -58,3 +58,18 @@ class DBParameterGroupNotFoundError(RDSClientError):
 | 
				
			|||||||
        super(DBParameterGroupNotFoundError, self).__init__(
 | 
					        super(DBParameterGroupNotFoundError, self).__init__(
 | 
				
			||||||
            'DBParameterGroupNotFound',
 | 
					            'DBParameterGroupNotFound',
 | 
				
			||||||
            'DB Parameter Group {0} not found.'.format(db_parameter_group_name))
 | 
					            'DB Parameter Group {0} not found.'.format(db_parameter_group_name))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class InvalidDBClusterStateFaultError(RDSClientError):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __init__(self, database_identifier):
 | 
				
			||||||
 | 
					        super(InvalidDBClusterStateFaultError, self).__init__(
 | 
				
			||||||
 | 
					            'InvalidDBClusterStateFault',
 | 
				
			||||||
 | 
					            'Invalid DB type, when trying to perform StopDBInstance on {0}e. See AWS RDS documentation on rds.stop_db_instance'.format(database_identifier))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class InvalidDBInstanceStateError(RDSClientError):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __init__(self, database_identifier, istate):
 | 
				
			||||||
 | 
					        estate = "in available state" if istate == 'stop' else "stopped, it cannot be started"
 | 
				
			||||||
 | 
					        super(InvalidDBInstanceStateError, self).__init__(
 | 
				
			||||||
 | 
					            'InvalidDBInstanceState',
 | 
				
			||||||
 | 
					            'when calling the {}DBInstance operation: Instance {} is not {}.'.format(istate.title(), database_identifier, estate))
 | 
				
			||||||
 | 
				
			|||||||
@ -18,7 +18,9 @@ from .exceptions import (RDSClientError,
 | 
				
			|||||||
                         DBSnapshotNotFoundError,
 | 
					                         DBSnapshotNotFoundError,
 | 
				
			||||||
                         DBSecurityGroupNotFoundError,
 | 
					                         DBSecurityGroupNotFoundError,
 | 
				
			||||||
                         DBSubnetGroupNotFoundError,
 | 
					                         DBSubnetGroupNotFoundError,
 | 
				
			||||||
                         DBParameterGroupNotFoundError)
 | 
					                         DBParameterGroupNotFoundError,
 | 
				
			||||||
 | 
					                         InvalidDBClusterStateFaultError,
 | 
				
			||||||
 | 
					                         InvalidDBInstanceStateError)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Database(BaseModel):
 | 
					class Database(BaseModel):
 | 
				
			||||||
@ -737,28 +739,30 @@ class RDS2Backend(BaseBackend):
 | 
				
			|||||||
        database = self.describe_databases(db_instance_identifier)[0]
 | 
					        database = self.describe_databases(db_instance_identifier)[0]
 | 
				
			||||||
        # todo: certain rds types not allowed to be stopped at this time.
 | 
					        # todo: certain rds types not allowed to be stopped at this time.
 | 
				
			||||||
        if database.is_replica or database.multi_az:
 | 
					        if database.is_replica or database.multi_az:
 | 
				
			||||||
                # should be 400 error
 | 
					                # todo: more db types not supported by stop/start instance api
 | 
				
			||||||
                return RDSClientError('InvalidDBClusterStateFault', 'Invalid DB type, when trying to perform StopDBInstance. See AWS RDS documentation on rds.stop_db_instance')
 | 
					                raise InvalidDBClusterStateFaultError(db_instance_identifier)
 | 
				
			||||||
        if database.status != 'available':
 | 
					        if database.status != 'available':
 | 
				
			||||||
            return RDSClientError('InvalidDBInstanceState', 'when calling the StopDBInstance operation: Instance %s is not in available state' % db_instance_identifier)
 | 
					            raise InvalidDBInstanceStateError(db_instance_identifier, 'stop')
 | 
				
			||||||
        if db_snapshot_identifier:
 | 
					        # todo: create rds snapshots
 | 
				
			||||||
            self.create_rds_snapshot(db_instance_identifier, db_snapshot_identifier)
 | 
					        # if db_snapshot_identifier:
 | 
				
			||||||
 | 
					        #     self.create_rds_snapshot(db_instance_identifier, db_snapshot_identifier)
 | 
				
			||||||
        database.status = 'shutdown'
 | 
					        database.status = 'shutdown'
 | 
				
			||||||
        return database
 | 
					        return database
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def start_database(self, db_instance_identifier):
 | 
					    def start_database(self, db_instance_identifier):
 | 
				
			||||||
        database = self.describe_databases(db_instance_identifier)[0]
 | 
					        database = self.describe_databases(db_instance_identifier)[0]
 | 
				
			||||||
        if database.status != 'shutdown':  # should be 400 error
 | 
					        # todo: bunch of different error messages to be generated from this api call
 | 
				
			||||||
            return RDSClientError('InvalidDBInstanceState', 'when calling the StartDBInstance operation: Instance %s is not stopped, it cannot be started.' % db_instance_identifier)
 | 
					        if database.status != 'shutdown':
 | 
				
			||||||
 | 
					            raise InvalidDBInstanceStateError(db_instance_identifier, 'start')
 | 
				
			||||||
        database.status = 'available'
 | 
					        database.status = 'available'
 | 
				
			||||||
        return
 | 
					        return database
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def create_rds_snapshot(self, db_instance_identifier, db_snapshot_identifier):
 | 
					    # def create_rds_snapshot(self, db_instance_identifier, db_snapshot_identifier):
 | 
				
			||||||
        database = self.describe_databases(db_instance_identifier)[0]
 | 
					    #     database = self.describe_databases(db_instance_identifier)[0]
 | 
				
			||||||
        # todo
 | 
					    #     # todo
 | 
				
			||||||
        # DBSnapshotAlreadyExists
 | 
					    #     # DBSnapshotAlreadyExists
 | 
				
			||||||
        # SnapshotQuotaExceeded
 | 
					    #     # SnapshotQuotaExceeded
 | 
				
			||||||
        return None
 | 
					    #     return None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def find_db_from_id(self, db_id):
 | 
					    def find_db_from_id(self, db_id):
 | 
				
			||||||
        if self.arn_regex.match(db_id):
 | 
					        if self.arn_regex.match(db_id):
 | 
				
			||||||
 | 
				
			|||||||
@ -19,9 +19,6 @@ def test_create_database():
 | 
				
			|||||||
                                       MasterUserPassword='hunter2',
 | 
					                                       MasterUserPassword='hunter2',
 | 
				
			||||||
                                       Port=1234,
 | 
					                                       Port=1234,
 | 
				
			||||||
                                       DBSecurityGroups=["my_sg"])
 | 
					                                       DBSecurityGroups=["my_sg"])
 | 
				
			||||||
    database['DBInstance']['DBInstanceStatus'].should.equal('available')
 | 
					 | 
				
			||||||
    database['DBInstance']['DBName'].should.equal('staging-postgres')
 | 
					 | 
				
			||||||
    database['DBInstance']['DBInstanceIdentifier'].should.equal("db-master-1")
 | 
					 | 
				
			||||||
    database['DBInstance']['AllocatedStorage'].should.equal(10)
 | 
					    database['DBInstance']['AllocatedStorage'].should.equal(10)
 | 
				
			||||||
    database['DBInstance']['DBInstanceClass'].should.equal("db.m1.small")
 | 
					    database['DBInstance']['DBInstanceClass'].should.equal("db.m1.small")
 | 
				
			||||||
    database['DBInstance']['LicenseModel'].should.equal("license-included")
 | 
					    database['DBInstance']['LicenseModel'].should.equal("license-included")
 | 
				
			||||||
@ -30,7 +27,102 @@ def test_create_database():
 | 
				
			|||||||
        'DBSecurityGroupName'].should.equal('my_sg')
 | 
					        'DBSecurityGroupName'].should.equal('my_sg')
 | 
				
			||||||
    database['DBInstance']['DBInstanceArn'].should.equal(
 | 
					    database['DBInstance']['DBInstanceArn'].should.equal(
 | 
				
			||||||
        'arn:aws:rds:us-west-2:1234567890:db:db-master-1')
 | 
					        'arn:aws:rds:us-west-2:1234567890:db:db-master-1')
 | 
				
			||||||
 | 
					    database['DBInstance']['DBInstanceStatus'].should.equal('available')
 | 
				
			||||||
 | 
					    database['DBInstance']['DBName'].should.equal('staging-postgres')
 | 
				
			||||||
 | 
					    database['DBInstance']['DBInstanceIdentifier'].should.equal("db-master-1")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@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
 | 
				
			||||||
 | 
					    response = conn.stop_db_instance(DBInstanceIdentifier=mydb['DBInstanceIdentifier'])
 | 
				
			||||||
 | 
					    response['ResponseMetadata']['HTTPStatusCode'].should.equal(200)
 | 
				
			||||||
 | 
					    response['DBInstance']['DBInstanceStatus'].should.equal('shutdown')
 | 
				
			||||||
 | 
					    # test rdsclient error when trying to stop an already stopped database
 | 
				
			||||||
 | 
					    conn.stop_db_instance.when.called_with(DBInstanceIdentifier=mydb['DBInstanceIdentifier']).should.throw(ClientError)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@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 trying to start an already started database
 | 
				
			||||||
 | 
					    conn.start_db_instance.when.called_with(DBInstanceIdentifier=mydb['DBInstanceIdentifier']).should.throw(ClientError)
 | 
				
			||||||
 | 
					    # stop and test start - should go from shutdown to available
 | 
				
			||||||
 | 
					    response = conn.stop_db_instance(DBInstanceIdentifier=mydb['DBInstanceIdentifier'])
 | 
				
			||||||
 | 
					    response['DBInstance']['DBInstanceStatus'].should.equal('shutdown')
 | 
				
			||||||
 | 
					    response = conn.start_db_instance(DBInstanceIdentifier=mydb['DBInstanceIdentifier'])
 | 
				
			||||||
 | 
					    response['ResponseMetadata']['HTTPStatusCode'].should.equal(200)
 | 
				
			||||||
 | 
					    response['DBInstance']['DBInstanceStatus'].should.equal('available')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@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
 | 
					@mock_rds2
 | 
				
			||||||
def test_get_databases():
 | 
					def test_get_databases():
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user