diff --git a/cloud/rax b/cloud/rax index af533bca126..bd3d20f9a6c 100644 --- a/cloud/rax +++ b/cloud/rax @@ -200,7 +200,7 @@ def rax_slugify(value): return 'rax_%s' % (re.sub('[^\w-]', '_', value).lower().lstrip('_')) -def pyrax_object_to_dict(obj): +def server_to_dict(obj): instance = {} for key in dir(obj): value = getattr(obj, key) @@ -216,7 +216,7 @@ def pyrax_object_to_dict(obj): def create(module, names, flavor, image, meta, key_name, files, wait, wait_timeout, disk_config, group, nics, - extra_create_args): + extra_create_args, existing=[]): cs = pyrax.cloudservers changed = False @@ -266,7 +266,7 @@ def create(module, names, flavor, image, meta, key_name, files, server.get() except: server.status == 'ERROR' - instance = pyrax_object_to_dict(server) + instance = server_to_dict(server) if server.status == 'ACTIVE' or not wait: success.append(instance) elif server.status == 'ERROR': @@ -274,15 +274,18 @@ def create(module, names, flavor, image, meta, key_name, files, elif wait: timeout.append(instance) + untouched = [server_to_dict(s) for s in existing] + instances = success + untouched + results = { 'changed': changed, 'action': 'create', - 'instances': success + error + timeout, + 'instances': instances, 'success': success, 'error': error, 'timeout': timeout, 'instance_ids': { - 'instances': [i['id'] for i in success + error + timeout], + 'instances': [i['id'] for i in instances], 'success': [i['id'] for i in success], 'error': [i['id'] for i in error], 'timeout': [i['id'] for i in timeout] @@ -300,7 +303,7 @@ def create(module, names, flavor, image, meta, key_name, files, module.exit_json(**results) -def delete(module, instance_ids, wait, wait_timeout): +def delete(module, instance_ids, wait, wait_timeout, kept=[]): cs = pyrax.cloudservers changed = False @@ -318,7 +321,7 @@ def delete(module, instance_ids, wait, wait_timeout): else: changed = True - instance = pyrax_object_to_dict(server) + instance = server_to_dict(server) instances[instance['id']] = instance # If requested, wait for server deletion @@ -332,6 +335,7 @@ def delete(module, instance_ids, wait, wait_timeout): server.get() except: instances[instance_id]['status'] = 'DELETED' + instances[instance_id]['rax_status'] = 'DELETED' if not filter(lambda s: s['status'] not in ('', 'DELETED', 'ERROR'), @@ -347,15 +351,17 @@ def delete(module, instance_ids, wait, wait_timeout): success = filter(lambda s: s['status'] in ('', 'DELETED'), instances.values()) + instances = [server_to_dict(s) for s in kept] + results = { 'changed': changed, 'action': 'delete', - 'instances': success + error + timeout, + 'instances': instances, 'success': success, 'error': error, 'timeout': timeout, 'instance_ids': { - 'instances': [i['id'] for i in success + error + timeout], + 'instances': [i['id'] for i in instances], 'success': [i['id'] for i in success], 'error': [i['id'] for i in error], 'timeout': [i['id'] for i in timeout] @@ -501,11 +507,13 @@ def cloudservers(module, state, name, flavor, image, meta, key_name, files, if len(servers) > count: state = 'absent' + kept = servers[:count] del servers[:count] instance_ids = [] for server in servers: instance_ids.append(server.id) - delete(module, instance_ids, wait, wait_timeout) + delete(module, instance_ids, wait, wait_timeout, + kept=kept) elif len(servers) < count: if auto_increment: names = [] @@ -516,9 +524,15 @@ def cloudservers(module, state, name, flavor, image, meta, key_name, files, else: names = [name] * (count - len(servers)) else: - module.exit_json(changed=False, action=None, instances=[], + instances = [] + instance_ids = [] + for server in servers: + instances.append(server_to_dict(server)) + instance_ids.append(server.id) + module.exit_json(changed=False, action=None, + instances=instances, success=[], error=[], timeout=[], - instance_ids={'instances': [], + instance_ids={'instances': instance_ids, 'success': [], 'error': [], 'timeout': []}) else: @@ -568,7 +582,7 @@ def cloudservers(module, state, name, flavor, image, meta, key_name, files, if len(servers) >= count: instances = [] for server in servers: - instances.append(pyrax_object_to_dict(server)) + instances.append(server_to_dict(server)) instance_ids = [i['id'] for i in instances] module.exit_json(changed=False, action=None, @@ -581,7 +595,8 @@ def cloudservers(module, state, name, flavor, image, meta, key_name, files, names = [name] * (count - len(servers)) create(module, names, flavor, image, meta, key_name, files, - wait, wait_timeout, disk_config, group, nics, extra_create_args) + wait, wait_timeout, disk_config, group, nics, extra_create_args, + existing=servers) elif state == 'absent': if instance_ids is None: