From daac0e3a3e8f85cabf7faa7a81d7bca689c4b30a Mon Sep 17 00:00:00 2001 From: Will Thames Date: Tue, 2 Sep 2014 22:08:44 +1000 Subject: [PATCH] Improved error handling More tests, particular for failure testing --- lib/ansible/modules/cloud/amazon/rds.py | 165 ++++++++++++++++-------- 1 file changed, 113 insertions(+), 52 deletions(-) diff --git a/lib/ansible/modules/cloud/amazon/rds.py b/lib/ansible/modules/cloud/amazon/rds.py index 5e20e3470d..adfd40247c 100644 --- a/lib/ansible/modules/cloud/amazon/rds.py +++ b/lib/ansible/modules/cloud/amazon/rds.py @@ -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)