Improved error handling
More tests, particular for failure testing
This commit is contained in:
parent
25c3c03a11
commit
daac0e3a3e
1 changed files with 113 additions and 52 deletions
|
@ -302,6 +302,19 @@ except ImportError:
|
|||
has_rds2 = False
|
||||
|
||||
|
||||
class RDSException(Exception):
|
||||
def __init__(self, exc):
|
||||
if hasattr(exc, 'error_message') and exc.error_message:
|
||||
self.message = exc.error_message
|
||||
self.code = exc.error_code
|
||||
elif hasattr(exc, 'body') and 'Error' in exc.body:
|
||||
self.message = exc.body['Error']['Message']
|
||||
self.code = exc.body['Error']['Code']
|
||||
else:
|
||||
self.message = str(exc)
|
||||
self.code = 'Unknown Error'
|
||||
|
||||
|
||||
class RDSConnection:
|
||||
def __init__(self, module, region, **aws_connect_params):
|
||||
try:
|
||||
|
@ -312,49 +325,73 @@ class RDSConnection:
|
|||
def get_db_instance(self, instancename):
|
||||
try:
|
||||
return RDSDBInstance(self.connection.get_all_dbinstances(instancename)[0])
|
||||
except boto.exception.BotoServerError,e:
|
||||
except boto.exception.BotoServerError, e:
|
||||
return None
|
||||
|
||||
def get_db_snapshot(self, snapshotid):
|
||||
try:
|
||||
return RDSSnapshot(self.connection.get_all_dbsnapshots(snapshot_id=snapshotid)[0])
|
||||
except boto.exception.BotoServerError,e:
|
||||
except boto.exception.BotoServerError, e:
|
||||
return None
|
||||
|
||||
def create_db_instance(self, instance_name, size, instance_class, db_engine,
|
||||
username, password, **params):
|
||||
params['engine'] = db_engine
|
||||
result = self.connection.create_dbinstance(instance_name, size, instance_class,
|
||||
username, password, **params)
|
||||
return RDSDBInstance(result)
|
||||
try:
|
||||
result = self.connection.create_dbinstance(instance_name, size, instance_class,
|
||||
username, password, **params)
|
||||
return RDSDBInstance(result)
|
||||
except boto.exception.BotoServerError, e:
|
||||
raise RDSException(e)
|
||||
|
||||
def create_db_instance_read_replica(self, instance_name, source_instance, **params):
|
||||
result = self.connection.createdb_instance_read_replica(instance_name, source_instance, **params)
|
||||
return RDSDBInstance(result)
|
||||
try:
|
||||
result = self.connection.createdb_instance_read_replica(instance_name, source_instance, **params)
|
||||
return RDSDBInstance(result)
|
||||
except boto.exception.BotoServerError, e:
|
||||
raise RDSException(e)
|
||||
|
||||
def delete_db_instance(self, instance_name, **params):
|
||||
result = self.connection.delete_dbinstance(instance_name, **params)
|
||||
return RDSDBInstance(result)
|
||||
try:
|
||||
result = self.connection.delete_dbinstance(instance_name, **params)
|
||||
return RDSDBInstance(result)
|
||||
except boto.exception.BotoServerError, e:
|
||||
raise RDSException(e)
|
||||
|
||||
def delete_db_snapshot(self, snapshot):
|
||||
result = self.connection.delete_dbsnapshot(snapshot)
|
||||
return RDSSnapshot(result)
|
||||
try:
|
||||
result = self.connection.delete_dbsnapshot(snapshot)
|
||||
return RDSSnapshot(result)
|
||||
except boto.exception.BotoServerError, e:
|
||||
raise RDSException(e)
|
||||
|
||||
def modify_db_instance(self, instance_name, **params):
|
||||
result = self.connection.modify_dbinstance(instance_name, **params)
|
||||
return RDSDBInstance(result)
|
||||
try:
|
||||
result = self.connection.modify_dbinstance(instance_name, **params)
|
||||
return RDSDBInstance(result)
|
||||
except boto.exception.BotoServerError, e:
|
||||
raise RDSException(e)
|
||||
|
||||
def restore_db_instance_from_db_snapshot(self, instance_name, snapshot, instance_type, **params):
|
||||
result = self.connection.restore_dbinstance_from_dbsnapshot(snapshot, instance_name, instance_type, **params)
|
||||
return RDSDBInstance(result)
|
||||
try:
|
||||
result = self.connection.restore_dbinstance_from_dbsnapshot(snapshot, instance_name, instance_type, **params)
|
||||
return RDSDBInstance(result)
|
||||
except boto.exception.BotoServerError, e:
|
||||
raise RDSException(e)
|
||||
|
||||
def create_db_snapshot(self, snapshot, instance_name, **params):
|
||||
result = self.connection.create_dbsnapshot(snapshot, instance_name)
|
||||
return RDSSnapshot(result)
|
||||
try:
|
||||
result = self.connection.create_dbsnapshot(snapshot, instance_name)
|
||||
return RDSSnapshot(result)
|
||||
except boto.exception.BotoServerError, e:
|
||||
raise RDSException(e)
|
||||
|
||||
def promote_read_replica(self, instance_name, **params):
|
||||
result = self.connection.promote_read_replica(instance_name, **params)
|
||||
return RDSInstance(result)
|
||||
try:
|
||||
result = self.connection.promote_read_replica(instance_name, **params)
|
||||
return RDSInstance(result)
|
||||
except boto.exception.BotoServerError, e:
|
||||
raise RDSException(e)
|
||||
|
||||
|
||||
class RDS2Connection:
|
||||
|
@ -384,37 +421,61 @@ class RDS2Connection:
|
|||
|
||||
def create_db_instance(self, instance_name, size, instance_class, db_engine,
|
||||
username, password, **params):
|
||||
result = self.connection.create_db_instance(instance_name, size, instance_class,
|
||||
try:
|
||||
result = self.connection.create_db_instance(instance_name, size, instance_class,
|
||||
db_engine, username, password, **params)['CreateDBInstanceResponse']['CreateDBInstanceResult']['DBInstance']
|
||||
return RDS2DBInstance(result)
|
||||
return RDS2DBInstance(result)
|
||||
except boto.exception.BotoServerError, e:
|
||||
raise RDSException(e)
|
||||
|
||||
def create_db_instance_read_replica(self, instance_name, source_instance, **params):
|
||||
result = self.connection.create_db_instance_read_replica(instance_name, source_instance, **params)['CreateDBInstanceReadReplicaResponse']['CreateDBInstanceReadReplicaResult']['DBInstance']
|
||||
return RDS2DBInstance(result)
|
||||
try:
|
||||
result = self.connection.create_db_instance_read_replica(instance_name, source_instance, **params)['CreateDBInstanceReadReplicaResponse']['CreateDBInstanceReadReplicaResult']['DBInstance']
|
||||
return RDS2DBInstance(result)
|
||||
except boto.exception.BotoServerError, e:
|
||||
raise RDSException(e)
|
||||
|
||||
def delete_db_instance(self, instance_name, **params):
|
||||
result = self.connection.delete_db_instance(instance_name, **params)['DeleteDBInstanceResponse']['DeleteDBInstanceResult']['DBInstance']
|
||||
return RDS2DBInstance(result)
|
||||
try:
|
||||
result = self.connection.delete_db_instance(instance_name, **params)['DeleteDBInstanceResponse']['DeleteDBInstanceResult']['DBInstance']
|
||||
return RDS2DBInstance(result)
|
||||
except boto.exception.BotoServerError, e:
|
||||
raise RDSException(e)
|
||||
|
||||
def delete_db_snapshot(self, snapshot):
|
||||
result = self.connection.delete_db_snapshot(snapshot)['DeleteDBSnapshotResponse']['DeleteDBSnapshotResult']['DBSnapshot']
|
||||
return RDS2Snapshot(result)
|
||||
try:
|
||||
result = self.connection.delete_db_snapshot(snapshot)['DeleteDBSnapshotResponse']['DeleteDBSnapshotResult']['DBSnapshot']
|
||||
return RDS2Snapshot(result)
|
||||
except boto.exception.BotoServerError, e:
|
||||
raise RDSException(e)
|
||||
|
||||
def modify_db_instance(self, instance_name, **params):
|
||||
result = self.connection.modify_db_instance(instance_name, **params)['ModifyDBInstanceResponse']['ModifyDBInstanceResult']['DBInstance']
|
||||
return RDS2DBInstance(result)
|
||||
try:
|
||||
result = self.connection.modify_db_instance(instance_name, **params)['ModifyDBInstanceResponse']['ModifyDBInstanceResult']['DBInstance']
|
||||
return RDS2DBInstance(result)
|
||||
except boto.exception.BotoServerError, e:
|
||||
raise RDSException(e)
|
||||
|
||||
def restore_db_instance_from_db_snapshot(self, instance_name, snapshot, instance_type, **params):
|
||||
result = self.connection.restore_db_instance_from_db_snapshot(instance_name, snapshot, **params)['RestoreDBInstanceFromDBSnapshotResponse']['RestoreDBInstanceFromDBSnapshotResult']['DBInstance']
|
||||
return RDS2DBInstance(result)
|
||||
try:
|
||||
result = self.connection.restore_db_instance_from_db_snapshot(instance_name, snapshot, **params)['RestoreDBInstanceFromDBSnapshotResponse']['RestoreDBInstanceFromDBSnapshotResult']['DBInstance']
|
||||
return RDS2DBInstance(result)
|
||||
except boto.exception.BotoServerError, e:
|
||||
raise RDSException(e)
|
||||
|
||||
def create_db_snapshot(self, snapshot, instance_name, **params):
|
||||
result = self.connection.create_db_snapshot(snapshot, instance_name, **params)['CreateDBSnapshotResponse']['CreateDBSnapshotResult']['DBSnapshot']
|
||||
return RDS2Snapshot(result)
|
||||
try:
|
||||
result = self.connection.create_db_snapshot(snapshot, instance_name, **params)['CreateDBSnapshotResponse']['CreateDBSnapshotResult']['DBSnapshot']
|
||||
return RDS2Snapshot(result)
|
||||
except boto.exception.BotoServerError, e:
|
||||
raise RDSException(e)
|
||||
|
||||
def promote_read_replica(self, instance_name, **params):
|
||||
result = self.connection.promote_read_replica(instance_name, **params)['PromoteReadReplicaResponse']['PromoteReadReplicaResult']['DBInstance']
|
||||
return RDS2DBInstance(result)
|
||||
try:
|
||||
result = self.connection.promote_read_replica(instance_name, **params)['PromoteReadReplicaResponse']['PromoteReadReplicaResult']['DBInstance']
|
||||
return RDS2DBInstance(result)
|
||||
except boto.exception.BotoServerError, e:
|
||||
raise RDSException(e)
|
||||
|
||||
|
||||
class RDSDBInstance:
|
||||
|
@ -587,8 +648,8 @@ def create_db_instance(module, conn):
|
|||
module.params.get('instance_type'), module.params.get('db_engine'),
|
||||
module.params.get('username'), module.params.get('password'), **params)
|
||||
changed = True
|
||||
except boto.exception.StandardError, e:
|
||||
module.fail_json(msg=e.error_message)
|
||||
except RDSException, e:
|
||||
module.fail_json(msg=e.message)
|
||||
|
||||
if module.params.get('wait'):
|
||||
resource = await_resource(conn, result, 'available', module)
|
||||
|
@ -614,8 +675,8 @@ def replicate_db_instance(module, conn):
|
|||
try:
|
||||
result = conn.create_db_instance_read_replica(instance_name, source_instance, **params)
|
||||
changed = True
|
||||
except boto.exception.StandardError, e:
|
||||
module.fail_json(msg=e.error_message)
|
||||
except RDSException, e:
|
||||
module.fail_json(msg=e.message)
|
||||
|
||||
if module.params.get('wait'):
|
||||
resource = await_resource(conn, result, 'available', module)
|
||||
|
@ -650,8 +711,8 @@ def delete_db_instance_or_snapshot(module, conn):
|
|||
result = conn.delete_db_instance(instance_name, **params)
|
||||
else:
|
||||
result = conn.delete_db_snapshot(snapshot)
|
||||
except boto.exception.StandardError, e:
|
||||
module.fail_json(msg=e.error_message)
|
||||
except RDSException, e:
|
||||
module.fail_json(msg=e.message)
|
||||
|
||||
# If we're not waiting for a delete to complete then we're all done
|
||||
# so just return
|
||||
|
@ -660,11 +721,11 @@ def delete_db_instance_or_snapshot(module, conn):
|
|||
try:
|
||||
resource = await_resource(conn, result, 'deleted', module)
|
||||
module.exit_json(changed=True)
|
||||
except boto.exception.StandardError, e:
|
||||
if e.error_code == 'DBInstanceNotFound':
|
||||
except RDSException, e:
|
||||
if e.code == 'DBInstanceNotFound':
|
||||
module.exit_json(changed=True)
|
||||
else:
|
||||
module.fail_json(msg=e.error_message)
|
||||
module.fail_json(msg=e.message)
|
||||
except Exception, e:
|
||||
module.fail_json(msg=str(e))
|
||||
|
||||
|
@ -704,8 +765,8 @@ def modify_db_instance(module, conn):
|
|||
|
||||
try:
|
||||
result = conn.modify_db_instance(instance_name, **params)
|
||||
except boto.exception.StandardError, e:
|
||||
module.fail_json(msg=e.error_message)
|
||||
except RDSException, e:
|
||||
module.fail_json(msg=e.message)
|
||||
if params.get('apply_immediately'):
|
||||
if new_instance_name:
|
||||
# Wait until the new instance name is valid
|
||||
|
@ -753,8 +814,8 @@ def promote_db_instance(module, conn):
|
|||
else:
|
||||
try:
|
||||
result = conn.promote_read_replica(instance_name, **params)
|
||||
except boto.exception.StandardError, e:
|
||||
module.fail_json(msg=e.error_message)
|
||||
except RDSException, e:
|
||||
module.fail_json(msg=e.message)
|
||||
|
||||
if module.params.get('wait'):
|
||||
resource = await_resource(conn, result, 'available', module)
|
||||
|
@ -776,8 +837,8 @@ def snapshot_db_instance(module, conn):
|
|||
try:
|
||||
result = conn.create_db_snapshot(snapshot, instance_name, **params)
|
||||
changed = True
|
||||
except boto.exception.StandardError, e:
|
||||
module.fail_json(msg=e.error_message)
|
||||
except RDSException, e:
|
||||
module.fail_json(msg=e.message)
|
||||
|
||||
if module.params.get('wait'):
|
||||
resource = await_resource(conn, result, 'available', module)
|
||||
|
@ -807,8 +868,8 @@ def restore_db_instance(module, conn):
|
|||
try:
|
||||
result = conn.restore_db_instance_from_db_snapshot(instance_name, snapshot, instance_type, **params)
|
||||
changed = True
|
||||
except boto.exception.StandardError, e:
|
||||
module.fail_json(msg=e.error_message)
|
||||
except RDSException, e:
|
||||
module.fail_json(msg=e.message)
|
||||
|
||||
if module.params.get('wait'):
|
||||
resource = await_resource(conn, result, 'available', module)
|
||||
|
|
Loading…
Reference in a new issue