From 9178ed1dbdd16e0ca0a7402ca3db339517c781d5 Mon Sep 17 00:00:00 2001
From: Matt Martz <matt@sivel.net>
Date: Mon, 31 Mar 2014 19:38:25 -0500
Subject: [PATCH] Return untouhced servers with exact_count

---
 cloud/rax | 43 +++++++++++++++++++++++++++++--------------
 1 file changed, 29 insertions(+), 14 deletions(-)

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: