From 65dc7af1661b9476c57842ca368d46d93c7c4050 Mon Sep 17 00:00:00 2001
From: Rene Moser <mail@renemoser.net>
Date: Mon, 17 Aug 2015 08:30:11 +0200
Subject: [PATCH] cloudstack: use new get_result() handling

---
 .../extras/cloud/cloudstack/cs_account.py     | 21 ++---
 .../cloud/cloudstack/cs_affinitygroup.py      | 25 +++---
 .../extras/cloud/cloudstack/cs_domain.py      | 23 ++----
 .../extras/cloud/cloudstack/cs_firewall.py    | 31 ++++----
 .../extras/cloud/cloudstack/cs_instance.py    | 63 ++++-----------
 .../cloud/cloudstack/cs_instancegroup.py      | 21 +----
 .../extras/cloud/cloudstack/cs_ip_address.py  | 29 +++----
 .../modules/extras/cloud/cloudstack/cs_iso.py | 36 +++------
 .../extras/cloud/cloudstack/cs_network.py     | 76 +++++-------------
 .../extras/cloud/cloudstack/cs_portforward.py | 54 +++++++------
 .../extras/cloud/cloudstack/cs_project.py     | 27 +------
 .../cloud/cloudstack/cs_securitygroup.py      | 15 ++--
 .../cloud/cloudstack/cs_securitygroup_rule.py | 36 ++++-----
 .../extras/cloud/cloudstack/cs_sshkeypair.py  | 21 +++--
 .../extras/cloud/cloudstack/cs_staticnat.py   | 33 +++-----
 .../extras/cloud/cloudstack/cs_template.py    | 77 ++++++-------------
 .../extras/cloud/cloudstack/cs_vmsnapshot.py  | 35 +++------
 17 files changed, 207 insertions(+), 416 deletions(-)

diff --git a/lib/ansible/modules/extras/cloud/cloudstack/cs_account.py b/lib/ansible/modules/extras/cloud/cloudstack/cs_account.py
index 8196196a1a9..1ce6fdde88f 100644
--- a/lib/ansible/modules/extras/cloud/cloudstack/cs_account.py
+++ b/lib/ansible/modules/extras/cloud/cloudstack/cs_account.py
@@ -139,6 +139,11 @@ local_action:
 
 RETURN = '''
 ---
+id:
+  description: UUID of the account.
+  returned: success
+  type: string
+  sample: 87b1e0ce-4e01-11e4-bb66-0050569e64b8
 name:
   description: Name of the account.
   returned: success
@@ -149,7 +154,7 @@ account_type:
   returned: success
   type: string
   sample: user
-account_state:
+state:
   description: State of the account.
   returned: success
   type: string
@@ -179,7 +184,10 @@ from ansible.module_utils.cloudstack import *
 class AnsibleCloudStackAccount(AnsibleCloudStack):
 
     def __init__(self, module):
-        AnsibleCloudStack.__init__(self, module)
+        super(AnsibleCloudStackAccount, self).__init__(module)
+        self.returns = {
+            'networkdomain': 'network_domain',
+        }
         self.account = None
         self.account_types = {
             'user':         0,
@@ -328,20 +336,13 @@ class AnsibleCloudStackAccount(AnsibleCloudStack):
 
 
     def get_result(self, account):
+        super(AnsibleCloudStackAccount, self).get_result(account)
         if account:
-            if 'name' in account:
-                self.result['name'] = account['name']
             if 'accounttype' in account:
                 for key,value in self.account_types.items():
                     if value == account['accounttype']:
                         self.result['account_type'] = key
                         break
-            if 'state' in account:
-                self.result['account_state'] = account['state']
-            if 'domain' in account:
-                self.result['domain'] = account['domain']
-            if 'networkdomain' in account:
-                self.result['network_domain'] = account['networkdomain']
         return self.result
 
 
diff --git a/lib/ansible/modules/extras/cloud/cloudstack/cs_affinitygroup.py b/lib/ansible/modules/extras/cloud/cloudstack/cs_affinitygroup.py
index 6d37878dcb7..4ef530bd13e 100644
--- a/lib/ansible/modules/extras/cloud/cloudstack/cs_affinitygroup.py
+++ b/lib/ansible/modules/extras/cloud/cloudstack/cs_affinitygroup.py
@@ -80,6 +80,11 @@ EXAMPLES = '''
 
 RETURN = '''
 ---
+id:
+  description: UUID of the affinity group.
+  returned: success
+  type: string
+  sample: 87b1e0ce-4e01-11e4-bb66-0050569e64b8
 name:
   description: Name of affinity group.
   returned: success
@@ -110,7 +115,10 @@ from ansible.module_utils.cloudstack import *
 class AnsibleCloudStackAffinityGroup(AnsibleCloudStack):
 
     def __init__(self, module):
-        AnsibleCloudStack.__init__(self, module)
+        super(AnsibleCloudStackAffinityGroup, self).__init__(module)
+        self.returns = {
+            'type': 'affinity_type',
+        }
         self.affinity_group = None
 
 
@@ -191,21 +199,6 @@ class AnsibleCloudStackAffinityGroup(AnsibleCloudStack):
         return affinity_group
 
 
-    def get_result(self, affinity_group):
-        if affinity_group:
-            if 'name' in affinity_group:
-                self.result['name'] = affinity_group['name']
-            if 'description' in affinity_group:
-                self.result['description'] = affinity_group['description']
-            if 'type' in affinity_group:
-                self.result['affinity_type'] = affinity_group['type']
-            if 'domain' in affinity_group:
-                self.result['domain'] = affinity_group['domain']
-            if 'account' in affinity_group:
-                self.result['account'] = affinity_group['account']
-        return self.result
-
-
 def main():
     module = AnsibleModule(
         argument_spec = dict(
diff --git a/lib/ansible/modules/extras/cloud/cloudstack/cs_domain.py b/lib/ansible/modules/extras/cloud/cloudstack/cs_domain.py
index 3b048eddbb5..c9f345a00c2 100644
--- a/lib/ansible/modules/extras/cloud/cloudstack/cs_domain.py
+++ b/lib/ansible/modules/extras/cloud/cloudstack/cs_domain.py
@@ -80,7 +80,7 @@ local_action:
 RETURN = '''
 ---
 id:
-  description: ID of the domain.
+  description: UUID of the domain.
   returned: success
   type: string
   sample: 87b1e0ce-4e01-11e4-bb66-0050569e64b8
@@ -119,7 +119,12 @@ from ansible.module_utils.cloudstack import *
 class AnsibleCloudStackDomain(AnsibleCloudStack):
 
     def __init__(self, module):
-        AnsibleCloudStack.__init__(self, module)
+        super(AnsibleCloudStackDomain, self).__init__(module)
+        self.returns = {
+            'path':             'path',
+            'networkdomain':    'network_domain',
+            'parentdomainname': 'parent_domain',
+        }
         self.domain = None
 
 
@@ -232,20 +237,6 @@ class AnsibleCloudStackDomain(AnsibleCloudStack):
         return domain
 
 
-    def get_result(self, domain):
-        if domain:
-            if 'id' in domain:
-                self.result['id'] = domain['id']
-            if 'name' in domain:
-                self.result['name'] = domain['name']
-            if 'path' in domain:
-                self.result['path'] = domain['path']
-            if 'parentdomainname' in domain:
-                self.result['parent_domain'] = domain['parentdomainname']
-            if 'networkdomain' in domain:
-                self.result['network_domain'] = domain['networkdomain']
-        return self.result
-
 
 def main():
     module = AnsibleModule(
diff --git a/lib/ansible/modules/extras/cloud/cloudstack/cs_firewall.py b/lib/ansible/modules/extras/cloud/cloudstack/cs_firewall.py
index 037bcfc7330..379f20c589f 100644
--- a/lib/ansible/modules/extras/cloud/cloudstack/cs_firewall.py
+++ b/lib/ansible/modules/extras/cloud/cloudstack/cs_firewall.py
@@ -151,6 +151,11 @@ EXAMPLES = '''
 
 RETURN = '''
 ---
+id:
+  description: UUID of the rule.
+  returned: success
+  type: string
+  sample: 04589590-ac63-4ffc-93f5-b698b8ac38b6
 ip_address:
   description: IP address of the rule if C(type=ingress)
   returned: success
@@ -211,7 +216,16 @@ from ansible.module_utils.cloudstack import *
 class AnsibleCloudStackFirewall(AnsibleCloudStack):
 
     def __init__(self, module):
-        AnsibleCloudStack.__init__(self, module)
+        super(AnsibleCloudStackFirewall, self).__init__(module)
+        self.returns = {
+            'cidrlist':     'cidr',
+            'startport':    'start_port',
+            'endpoint':     'end_port',
+            'protocol':     'protocol',
+            'ipaddress':    'ip_address',
+            'icmpcode':     'icmp_code',
+            'icmptype':     'icmp_type',
+        }
         self.firewall_rule = None
 
 
@@ -368,22 +382,9 @@ class AnsibleCloudStackFirewall(AnsibleCloudStack):
 
 
     def get_result(self, firewall_rule):
+        super(AnsibleCloudStackFirewall, self).get_result(firewall_rule)
         if firewall_rule:
             self.result['type'] = self.module.params.get('type')
-            if 'cidrlist' in firewall_rule:
-                self.result['cidr'] = firewall_rule['cidrlist']
-            if 'startport' in firewall_rule:
-                self.result['start_port'] = int(firewall_rule['startport'])
-            if 'endport' in firewall_rule:
-                self.result['end_port'] = int(firewall_rule['endport'])
-            if 'protocol' in firewall_rule:
-                self.result['protocol'] = firewall_rule['protocol']
-            if 'ipaddress' in firewall_rule:
-                self.result['ip_address'] = firewall_rule['ipaddress']
-            if 'icmpcode' in firewall_rule:
-                self.result['icmp_code'] = int(firewall_rule['icmpcode'])
-            if 'icmptype' in firewall_rule:
-                self.result['icmp_type'] = int(firewall_rule['icmptype'])
             if 'networkid' in firewall_rule:
                 self.result['network'] = self.get_network(key='displaytext', network=firewall_rule['networkid'])
         return self.result
diff --git a/lib/ansible/modules/extras/cloud/cloudstack/cs_instance.py b/lib/ansible/modules/extras/cloud/cloudstack/cs_instance.py
index 6a0923987a9..0587b3a1aaf 100644
--- a/lib/ansible/modules/extras/cloud/cloudstack/cs_instance.py
+++ b/lib/ansible/modules/extras/cloud/cloudstack/cs_instance.py
@@ -244,7 +244,7 @@ EXAMPLES = '''
 RETURN = '''
 ---
 id:
-  description: ID of the instance.
+  description: UUID of the instance.
   returned: success
   type: string
   sample: 04589590-ac63-4ffc-93f5-b698b8ac38b6
@@ -375,7 +375,20 @@ from ansible.module_utils.cloudstack import *
 class AnsibleCloudStackInstance(AnsibleCloudStack):
 
     def __init__(self, module):
-        AnsibleCloudStack.__init__(self, module)
+        super(AnsibleCloudStackInstance, self).__init__(module)
+        self.returns = {
+            'group':                'group',
+            'hypervisor':           'hypervisor',
+            'instancename':         'instance_name',
+            'publicip':             'public_ip',
+            'passwordenabled':      'password_enabled',
+            'password':             'password',
+            'serviceofferingname':  'service_offering',
+            'isoname':              'iso',
+            'templatename':         'template',
+            'keypair':              'ssh_key',
+            'securitygroup':        'security_group',
+        }
         self.instance = None
         self.template = None
         self.iso = None
@@ -752,52 +765,8 @@ class AnsibleCloudStackInstance(AnsibleCloudStack):
 
 
     def get_result(self, instance):
+        super(AnsibleCloudStackInstance, self).get_result(instance)
         if instance:
-            if 'id' in instance:
-                self.result['id'] = instance['id']
-            if 'name' in instance:
-                self.result['name'] = instance['name']
-            if 'displayname' in instance:
-                self.result['display_name'] = instance['displayname']
-            if 'group' in instance:
-                self.result['group'] = instance['group']
-            if 'domain' in instance:
-                self.result['domain'] = instance['domain']
-            if 'account' in instance:
-                self.result['account'] = instance['account']
-            if 'project' in instance:
-                self.result['project'] = instance['project']
-            if 'hypervisor' in instance:
-                self.result['hypervisor'] = instance['hypervisor']
-            if 'instancename' in instance:
-                self.result['instance_name'] = instance['instancename']
-            if 'publicip' in instance:
-                self.result['public_ip'] = instance['publicip']
-            if 'passwordenabled' in instance:
-                self.result['password_enabled'] = instance['passwordenabled']
-            if 'password' in instance:
-                self.result['password'] = instance['password']
-            if 'serviceofferingname' in instance:
-                self.result['service_offering'] = instance['serviceofferingname']
-            if 'zonename' in instance:
-                self.result['zone'] = instance['zonename']
-            if 'templatename' in instance:
-                self.result['template'] = instance['templatename']
-            if 'isoname' in instance:
-                self.result['iso'] = instance['isoname']
-            if 'keypair' in instance:
-                self.result['ssh_key'] = instance['keypair']
-            if 'created' in instance:
-                self.result['created'] = instance['created']
-            if 'state' in instance:
-                self.result['state'] = instance['state']
-            if 'tags' in instance:
-                self.result['tags'] = []
-                for tag in instance['tags']:
-                    result_tag          = {}
-                    result_tag['key']   = tag['key']
-                    result_tag['value'] = tag['value']
-                    self.result['tags'].append(result_tag)
             if 'securitygroup' in instance:
                 security_groups = []
                 for securitygroup in instance['securitygroup']:
diff --git a/lib/ansible/modules/extras/cloud/cloudstack/cs_instancegroup.py b/lib/ansible/modules/extras/cloud/cloudstack/cs_instancegroup.py
index 7280ceff5ea..537d9d90b28 100644
--- a/lib/ansible/modules/extras/cloud/cloudstack/cs_instancegroup.py
+++ b/lib/ansible/modules/extras/cloud/cloudstack/cs_instancegroup.py
@@ -71,7 +71,7 @@ EXAMPLES = '''
 RETURN = '''
 ---
 id:
-  description: ID of the instance group.
+  description: UUID of the instance group.
   returned: success
   type: string
   sample: 04589590-ac63-4ffc-93f5-b698b8ac38b6
@@ -115,7 +115,7 @@ from ansible.module_utils.cloudstack import *
 class AnsibleCloudStackInstanceGroup(AnsibleCloudStack):
 
     def __init__(self, module):
-        AnsibleCloudStack.__init__(self, module)
+        super(AnsibleCloudStackInstanceGroup, self).__init__(module)
         self.instance_group = None
 
 
@@ -169,23 +169,6 @@ class AnsibleCloudStackInstanceGroup(AnsibleCloudStack):
         return instance_group
 
 
-    def get_result(self, instance_group):
-        if instance_group:
-            if 'id' in instance_group:
-                self.result['id'] = instance_group['id']
-            if 'created' in instance_group:
-                self.result['created'] = instance_group['created']
-            if 'name' in instance_group:
-                self.result['name'] = instance_group['name']
-            if 'project' in instance_group:
-                self.result['project'] = instance_group['project']
-            if 'domain' in instance_group:
-                self.result['domain'] = instance_group['domain']
-            if 'account' in instance_group:
-                self.result['account'] = instance_group['account']
-        return self.result
-
-
 def main():
     module = AnsibleModule(
         argument_spec = dict(
diff --git a/lib/ansible/modules/extras/cloud/cloudstack/cs_ip_address.py b/lib/ansible/modules/extras/cloud/cloudstack/cs_ip_address.py
index ae4559fd87e..0ac57d097de 100644
--- a/lib/ansible/modules/extras/cloud/cloudstack/cs_ip_address.py
+++ b/lib/ansible/modules/extras/cloud/cloudstack/cs_ip_address.py
@@ -86,6 +86,11 @@ EXAMPLES = '''
 
 RETURN = '''
 ---
+id:
+  description: UUID of the Public IP address.
+  returned: success
+  type: string
+  sample: a6f7a5fc-43f8-11e5-a151-feff819cdc9f
 ip_address:
   description: Public IP address.
   returned: success
@@ -126,6 +131,13 @@ from ansible.module_utils.cloudstack import *
 
 class AnsibleCloudStackIPAddress(AnsibleCloudStack):
 
+    def __init__(self, module):
+        super(AnsibleCloudStackIPAddress, self).__init__(module)
+        self.returns = {
+            'ipaddress': 'ip_address',
+        }
+
+
     #TODO: Add to parent class, duplicated in cs_network
     def get_network(self, key=None, network=None):
         if not network:
@@ -211,23 +223,6 @@ class AnsibleCloudStackIPAddress(AnsibleCloudStack):
         return ip_address
 
 
-    def get_result(self, ip_address):
-        if ip_address:
-            if 'zonename' in ip_address:
-                self.result['zone'] = ip_address['zonename']
-            if 'domain' in ip_address:
-                self.result['domain'] = ip_address['domain']
-            if 'account' in ip_address:
-                self.result['account'] = ip_address['account']
-            if 'project' in ip_address:
-                self.result['project'] = ip_address['project']
-            if 'ipaddress' in ip_address:
-                self.result['ip_address'] = ip_address['ipaddress']
-            if 'id' in ip_address:
-                self.result['id'] = ip_address['id']
-        return self.result
-
-
 def main():
     module = AnsibleModule(
         argument_spec = dict(
diff --git a/lib/ansible/modules/extras/cloud/cloudstack/cs_iso.py b/lib/ansible/modules/extras/cloud/cloudstack/cs_iso.py
index 7030e4be607..62986502a64 100644
--- a/lib/ansible/modules/extras/cloud/cloudstack/cs_iso.py
+++ b/lib/ansible/modules/extras/cloud/cloudstack/cs_iso.py
@@ -140,6 +140,11 @@ EXAMPLES = '''
 
 RETURN = '''
 ---
+id:
+  description: UUID of the ISO.
+  returned: success
+  type: string
+  sample: a6f7a5fc-43f8-11e5-a151-feff819cdc9f
 name:
   description: Name of the ISO.
   returned: success
@@ -205,7 +210,12 @@ from ansible.module_utils.cloudstack import *
 class AnsibleCloudStackIso(AnsibleCloudStack):
 
     def __init__(self, module):
-        AnsibleCloudStack.__init__(self, module)
+        super(AnsibleCloudStackIso, self).__init__(module)
+        self.returns = {
+            'checksum': 'checksum',
+            'status':   'status',
+            'isready':  'is_ready',
+        }
         self.iso = None
 
     def register_iso(self):
@@ -283,30 +293,6 @@ class AnsibleCloudStackIso(AnsibleCloudStack):
         return iso
 
 
-    def get_result(self, iso):
-        if iso:
-            if 'displaytext' in iso:
-                self.result['displaytext'] = iso['displaytext']
-            if 'name' in iso:
-                self.result['name'] = iso['name']
-            if 'zonename' in iso:
-                self.result['zone'] = iso['zonename']
-            if 'checksum' in iso:
-                self.result['checksum'] = iso['checksum']
-            if 'status' in iso:
-                self.result['status'] = iso['status']
-            if 'isready' in iso:
-                self.result['is_ready'] = iso['isready']
-            if 'created' in iso:
-                self.result['created'] = iso['created']
-            if 'project' in iso:
-                self.result['project'] = iso['project']
-            if 'domain' in iso:
-                self.result['domain'] = iso['domain']
-            if 'account' in iso:
-                self.result['account'] = iso['account']
-        return self.result
-
 
 def main():
     module = AnsibleModule(
diff --git a/lib/ansible/modules/extras/cloud/cloudstack/cs_network.py b/lib/ansible/modules/extras/cloud/cloudstack/cs_network.py
index 2ae731064a6..538f62896ae 100644
--- a/lib/ansible/modules/extras/cloud/cloudstack/cs_network.py
+++ b/lib/ansible/modules/extras/cloud/cloudstack/cs_network.py
@@ -197,7 +197,7 @@ EXAMPLES = '''
 RETURN = '''
 ---
 id:
-  description: ID of the network.
+  description: UUID of the network.
   returned: success
   type: string
   sample: 04589590-ac63-4ffc-93f5-b698b8ac38b6
@@ -331,7 +331,24 @@ from ansible.module_utils.cloudstack import *
 class AnsibleCloudStackNetwork(AnsibleCloudStack):
 
     def __init__(self, module):
-        AnsibleCloudStack.__init__(self, module)
+        super(AnsibleCloudStackNetwork, self).__init__(module)
+        self.returns = {
+            'networkdomain':        'network domain',
+            'networkofferingname':  'network_offering',
+            'ispersistent':         'is_persistent',
+            'acltype':              'acl_type',
+            'type':                 'type',
+            'traffictype':          'traffic_type',
+            'ip6gateway':           'gateway_ipv6',
+            'ip6cidr':              'cidr_ipv6',
+            'gateway':              'gateway',
+            'cidr':                 'cidr',
+            'netmask':              'netmask',
+            'broadcastdomaintype':  'broadcast_domaintype',
+            'dns1':                 'dns1',
+            'dns2':                 'dns2',
+        }
+
         self.network = None
 
 
@@ -503,61 +520,6 @@ class AnsibleCloudStackNetwork(AnsibleCloudStack):
             return network
 
 
-    def get_result(self, network):
-        if network:
-            if 'id' in network:
-                self.result['id'] = network['id']
-            if 'name' in network:
-                self.result['name'] = network['name']
-            if 'displaytext' in network:
-                self.result['displaytext'] = network['displaytext']
-            if 'dns1' in network:
-                self.result['dns1'] = network['dns1']
-            if 'dns2' in network:
-                self.result['dns2'] = network['dns2']
-            if 'cidr' in network:
-                self.result['cidr'] = network['cidr']
-            if 'broadcastdomaintype' in network:
-                self.result['broadcast_domaintype'] = network['broadcastdomaintype']
-            if 'netmask' in network:
-                self.result['netmask'] = network['netmask']
-            if 'gateway' in network:
-                self.result['gateway'] = network['gateway']
-            if 'ip6cidr' in network:
-                self.result['cidr_ipv6'] = network['ip6cidr']
-            if 'ip6gateway' in network:
-                self.result['gateway_ipv6'] = network['ip6gateway']
-            if 'state' in network:
-                self.result['state'] = network['state']
-            if 'type' in network:
-                self.result['type'] = network['type']
-            if 'traffictype' in network:
-                self.result['traffic_type'] = network['traffictype']
-            if 'zonename' in network:
-                self.result['zone'] = network['zonename']
-            if 'domain' in network:
-                self.result['domain'] = network['domain']
-            if 'account' in network:
-                self.result['account'] = network['account']
-            if 'project' in network:
-                self.result['project'] = network['project']
-            if 'acltype' in network:
-                self.result['acl_type'] = network['acltype']
-            if 'networkdomain' in network:
-                self.result['network_domain'] = network['networkdomain']
-            if 'networkofferingname' in network:
-                self.result['network_offering'] = network['networkofferingname']
-            if 'ispersistent' in network:
-                self.result['is_persistent'] = network['ispersistent']
-            if 'tags' in network:
-                self.result['tags'] = []
-                for tag in network['tags']:
-                    result_tag          = {}
-                    result_tag['key']   = tag['key']
-                    result_tag['value'] = tag['value']
-                    self.result['tags'].append(result_tag)
-        return self.result
-
 
 def main():
     module = AnsibleModule(
diff --git a/lib/ansible/modules/extras/cloud/cloudstack/cs_portforward.py b/lib/ansible/modules/extras/cloud/cloudstack/cs_portforward.py
index 4f77be44c45..502f6ce1f6e 100644
--- a/lib/ansible/modules/extras/cloud/cloudstack/cs_portforward.py
+++ b/lib/ansible/modules/extras/cloud/cloudstack/cs_portforward.py
@@ -148,6 +148,11 @@ EXAMPLES = '''
 
 RETURN = '''
 ---
+id:
+  description: UUID of the public IP address.
+  returned: success
+  type: string
+  sample: a6f7a5fc-43f8-11e5-a151-feff819cdc9f
 ip_address:
   description: Public IP address.
   returned: success
@@ -212,7 +217,22 @@ from ansible.module_utils.cloudstack import *
 class AnsibleCloudStackPortforwarding(AnsibleCloudStack):
 
     def __init__(self, module):
-        AnsibleCloudStack.__init__(self, module)
+        super(AnsibleCloudStackPortforwarding, self).__init__(module)
+        self.returns = {
+            'virtualmachinedisplayname':    'vm_display_name',
+            'virtualmachinename':           'vm_name',
+            'ipaddress':                    'ip_address',
+            'vmguestip':                    'vm_guest_ip',
+            'publicip':                     'public_ip',
+            'protocol':                     'protocol',
+        }
+        # these values will be casted to int
+        self.returns_to_int = {
+            'publicport':       'public_port',
+            'publicendport':    'public_end_port',
+            'privateport':      'private_port',
+            'private_end_port': 'private_end_port',
+        }
         self.portforwarding_rule = None
         self.vm_default_nic = None
 
@@ -338,34 +358,12 @@ class AnsibleCloudStackPortforwarding(AnsibleCloudStack):
 
 
     def get_result(self, portforwarding_rule):
+        super(AnsibleCloudStackPortforwarding, self).get_result(portforwarding_rule)
         if portforwarding_rule:
-            if 'id' in portforwarding_rule:
-                self.result['id'] = portforwarding_rule['id']
-            if 'virtualmachinedisplayname' in portforwarding_rule:
-                self.result['vm_display_name'] = portforwarding_rule['virtualmachinedisplayname']
-            if 'virtualmachinename' in portforwarding_rule:
-                self.result['vm_name'] = portforwarding_rule['virtualmachinename']
-            if 'ipaddress' in portforwarding_rule:
-                self.result['ip_address'] = portforwarding_rule['ipaddress']
-            if 'vmguestip' in portforwarding_rule:
-                self.result['vm_guest_ip'] = portforwarding_rule['vmguestip']
-            if 'publicport' in portforwarding_rule:
-                self.result['public_port'] = int(portforwarding_rule['publicport'])
-            if 'publicendport' in portforwarding_rule:
-                self.result['public_end_port'] = int(portforwarding_rule['publicendport'])
-            if 'privateport' in portforwarding_rule:
-                self.result['private_port'] = int(portforwarding_rule['privateport'])
-            if 'privateendport' in portforwarding_rule:
-                self.result['private_end_port'] = int(portforwarding_rule['privateendport'])
-            if 'protocol' in portforwarding_rule:
-                self.result['protocol'] = portforwarding_rule['protocol']
-            if 'tags' in portforwarding_rule:
-                self.result['tags'] = []
-                for tag in portforwarding_rule['tags']:
-                    result_tag          = {}
-                    result_tag['key']   = tag['key']
-                    result_tag['value'] = tag['value']
-                    self.result['tags'].append(result_tag)
+            # Bad bad API does not always return int when it should.
+            for search_key, return_key in returns_to_int.iteritems():
+                if search_key in resource:
+                    self.result[return_key] = int(resource[search_key])
         return self.result
 
 
diff --git a/lib/ansible/modules/extras/cloud/cloudstack/cs_project.py b/lib/ansible/modules/extras/cloud/cloudstack/cs_project.py
index 896232f3053..0bd886ad7e3 100644
--- a/lib/ansible/modules/extras/cloud/cloudstack/cs_project.py
+++ b/lib/ansible/modules/extras/cloud/cloudstack/cs_project.py
@@ -95,7 +95,7 @@ EXAMPLES = '''
 RETURN = '''
 ---
 id:
-  description: ID of the project.
+  description: UUID of the project.
   returned: success
   type: string
   sample: 04589590-ac63-4ffc-93f5-b698b8ac38b6
@@ -143,10 +143,6 @@ from ansible.module_utils.cloudstack import *
 
 class AnsibleCloudStackProject(AnsibleCloudStack):
 
-    def __init__(self, module):
-        AnsibleCloudStack.__init__(self, module)
-        self.project = None
-
 
     def get_project(self):
         if not self.project:
@@ -261,27 +257,6 @@ class AnsibleCloudStackProject(AnsibleCloudStack):
             return project
 
 
-    def get_result(self, project):
-        if project:
-            if 'name' in project:
-                self.result['name'] = project['name']
-            if 'displaytext' in project:
-                self.result['displaytext'] = project['displaytext']
-            if 'account' in project:
-                self.result['account'] = project['account']
-            if 'domain' in project:
-                self.result['domain'] = project['domain']
-            if 'state' in project:
-                self.result['state'] = project['state']
-            if 'tags' in project:
-                self.result['tags'] = []
-                for tag in project['tags']:
-                    result_tag          = {}
-                    result_tag['key']   = tag['key']
-                    result_tag['value'] = tag['value']
-                    self.result['tags'].append(result_tag)
-        return self.result
-
 
 def main():
     module = AnsibleModule(
diff --git a/lib/ansible/modules/extras/cloud/cloudstack/cs_securitygroup.py b/lib/ansible/modules/extras/cloud/cloudstack/cs_securitygroup.py
index 5e85a6f56e4..d30aea55167 100644
--- a/lib/ansible/modules/extras/cloud/cloudstack/cs_securitygroup.py
+++ b/lib/ansible/modules/extras/cloud/cloudstack/cs_securitygroup.py
@@ -64,6 +64,11 @@ EXAMPLES = '''
 
 RETURN = '''
 ---
+id:
+  description: UUID of the security group.
+  returned: success
+  type: string
+  sample: a6f7a5fc-43f8-11e5-a151-feff819cdc9f
 name:
   description: Name of security group.
   returned: success
@@ -89,7 +94,7 @@ from ansible.module_utils.cloudstack import *
 class AnsibleCloudStackSecurityGroup(AnsibleCloudStack):
 
     def __init__(self, module):
-        AnsibleCloudStack.__init__(self, module)
+        super(AnsibleCloudStackSecurityGroup, self).__init__(module)
         self.security_group = None
 
 
@@ -143,14 +148,6 @@ class AnsibleCloudStackSecurityGroup(AnsibleCloudStack):
         return security_group
 
 
-    def get_result(self, security_group):
-        if security_group:
-            if 'name' in security_group:
-                self.result['name'] = security_group['name']
-            if 'description' in security_group:
-                self.result['description'] = security_group['description']
-        return self.result
-
 
 def main():
     module = AnsibleModule(
diff --git a/lib/ansible/modules/extras/cloud/cloudstack/cs_securitygroup_rule.py b/lib/ansible/modules/extras/cloud/cloudstack/cs_securitygroup_rule.py
index fddb0f0daa6..5286440415a 100644
--- a/lib/ansible/modules/extras/cloud/cloudstack/cs_securitygroup_rule.py
+++ b/lib/ansible/modules/extras/cloud/cloudstack/cs_securitygroup_rule.py
@@ -138,6 +138,11 @@ EXAMPLES = '''
 
 RETURN = '''
 ---
+id:
+  description: UUID of the of the rule.
+  returned: success
+  type: string
+  sample: a6f7a5fc-43f8-11e5-a151-feff819cdc9f
 security_group:
   description: security group of the rule.
   returned: success
@@ -188,7 +193,16 @@ from ansible.module_utils.cloudstack import *
 class AnsibleCloudStackSecurityGroupRule(AnsibleCloudStack):
 
     def __init__(self, module):
-        AnsibleCloudStack.__init__(self, module)
+        super(AnsibleCloudStackSecurityGroupRule, self).__init__(module)
+        self.returns = {
+            'icmptype':             'icmp_type',
+            'icmpcode':             'icmp_code',
+            'endport':              'end_port',
+            'start_port':           'start_port',
+            'protocol':             'protocol',
+            'cidr':                 'cidr',
+            'securitygroupname':    'user_security_group',
+        }
 
 
     def _tcp_udp_match(self, rule, protocol, start_port, end_port):
@@ -348,29 +362,13 @@ class AnsibleCloudStackSecurityGroupRule(AnsibleCloudStack):
 
 
     def get_result(self, security_group_rule):
-
+        super(AnsibleCloudStackSecurityGroupRule, self).get_result(security_group_rule)
         self.result['type'] = self.module.params.get('type')
         self.result['security_group'] = self.module.params.get('security_group')
-        
-        if security_group_rule:
-            rule = security_group_rule
-            if 'securitygroupname' in rule:
-                self.result['user_security_group'] = rule['securitygroupname']
-            if 'cidr' in rule:
-                self.result['cidr'] = rule['cidr']
-            if 'protocol' in rule:
-                self.result['protocol'] = rule['protocol']
-            if 'startport' in rule:
-                self.result['start_port'] = rule['startport']
-            if 'endport' in rule:
-                self.result['end_port'] = rule['endport']
-            if 'icmpcode' in rule:
-                self.result['icmp_code'] = rule['icmpcode']
-            if 'icmptype' in rule:
-                self.result['icmp_type'] = rule['icmptype']
         return self.result
 
 
+
 def main():
     module = AnsibleModule(
         argument_spec = dict(
diff --git a/lib/ansible/modules/extras/cloud/cloudstack/cs_sshkeypair.py b/lib/ansible/modules/extras/cloud/cloudstack/cs_sshkeypair.py
index 28c6b3802b4..ebd906f7d5c 100644
--- a/lib/ansible/modules/extras/cloud/cloudstack/cs_sshkeypair.py
+++ b/lib/ansible/modules/extras/cloud/cloudstack/cs_sshkeypair.py
@@ -77,6 +77,11 @@ EXAMPLES = '''
 
 RETURN = '''
 ---
+id:
+  description: UUID of the SSH public key.
+  returned: success
+  type: string
+  sample: a6f7a5fc-43f8-11e5-a151-feff819cdc9f
 name:
   description: Name of the SSH public key.
   returned: success
@@ -112,7 +117,11 @@ from ansible.module_utils.cloudstack import *
 class AnsibleCloudStackSshKey(AnsibleCloudStack):
 
     def __init__(self, module):
-        AnsibleCloudStack.__init__(self, module)
+        super(AnsibleCloudStackSshKey, self).__init__(module)
+        self.returns = {
+            'privatekey':   'private_key',
+            'fingerprint':  'fingerprint',
+        }
         self.ssh_key = None
 
 
@@ -189,16 +198,6 @@ class AnsibleCloudStackSshKey(AnsibleCloudStack):
         return self.ssh_key
 
 
-    def get_result(self, ssh_key):
-        if ssh_key:
-            if 'fingerprint' in ssh_key:
-                self.result['fingerprint'] = ssh_key['fingerprint']
-            if 'name' in ssh_key:
-                self.result['name'] = ssh_key['name']
-            if 'privatekey' in ssh_key:
-                self.result['private_key'] = ssh_key['privatekey']
-        return self.result
-
 
     def _get_ssh_fingerprint(self, public_key):
         key = sshpubkeys.SSHKey(public_key)
diff --git a/lib/ansible/modules/extras/cloud/cloudstack/cs_staticnat.py b/lib/ansible/modules/extras/cloud/cloudstack/cs_staticnat.py
index 5761a3990e9..500c533915b 100644
--- a/lib/ansible/modules/extras/cloud/cloudstack/cs_staticnat.py
+++ b/lib/ansible/modules/extras/cloud/cloudstack/cs_staticnat.py
@@ -93,6 +93,11 @@ EXAMPLES = '''
 
 RETURN = '''
 ---
+id:
+  description: UUID of the ip_address.
+  returned: success
+  type: string
+  sample: a6f7a5fc-43f8-11e5-a151-feff819cdc9f
 ip_address:
   description: Public IP address.
   returned: success
@@ -149,7 +154,13 @@ from ansible.module_utils.cloudstack import *
 class AnsibleCloudStackStaticNat(AnsibleCloudStack):
 
     def __init__(self, module):
-        AnsibleCloudStack.__init__(self, module)
+        super(AnsibleCloudStackPortforwarding, self).__init__(module)
+        self.returns = {
+            'virtualmachinedisplayname':    'vm_display_name',
+            'virtualmachinename':           'vm_name',
+            'ipaddress':                    'ip_address',
+            'vmipaddress':                  'vm_guest_ip',
+        }
         self.vm_default_nic = None
 
 
@@ -246,26 +257,6 @@ class AnsibleCloudStackStaticNat(AnsibleCloudStack):
         return ip_address
 
 
-    def get_result(self, ip_address):
-        if ip_address:
-            if 'zonename' in ip_address:
-                self.result['zone'] = ip_address['zonename']
-            if 'domain' in ip_address:
-                self.result['domain'] = ip_address['domain']
-            if 'account' in ip_address:
-                self.result['account'] = ip_address['account']
-            if 'project' in ip_address:
-                self.result['project'] = ip_address['project']
-            if 'virtualmachinedisplayname' in ip_address:
-                self.result['vm_display_name'] = ip_address['virtualmachinedisplayname']
-            if 'virtualmachinename' in ip_address:
-                self.result['vm'] = ip_address['virtualmachinename']
-            if 'vmipaddress' in ip_address:
-                self.result['vm_guest_ip'] = ip_address['vmipaddress']
-            if 'ipaddress' in ip_address:
-                self.result['ip_address'] = ip_address['ipaddress']
-        return self.result
-
 
 def main():
     module = AnsibleModule(
diff --git a/lib/ansible/modules/extras/cloud/cloudstack/cs_template.py b/lib/ansible/modules/extras/cloud/cloudstack/cs_template.py
index 9539442d06e..e53ec8825b8 100644
--- a/lib/ansible/modules/extras/cloud/cloudstack/cs_template.py
+++ b/lib/ansible/modules/extras/cloud/cloudstack/cs_template.py
@@ -219,6 +219,11 @@ EXAMPLES = '''
 
 RETURN = '''
 ---
+id:
+  description: UUID of the template.
+  returned: success
+  type: string
+  sample: a6f7a5fc-43f8-11e5-a151-feff819cdc9f
 name:
   description: Name of the template.
   returned: success
@@ -344,7 +349,23 @@ from ansible.module_utils.cloudstack import *
 class AnsibleCloudStackTemplate(AnsibleCloudStack):
 
     def __init__(self, module):
-        AnsibleCloudStack.__init__(self, module)
+        super(AnsibleCloudStackTemplate, self).__init__(module)
+        self.returns = {
+            'checksum':         'checksum',
+            'status':           'status',
+            'isready':          'is_ready',
+            'templatetag':      'template_tag',
+            'sshkeyenabled':    'sshkey_enabled',
+            'passwordenabled':  'password_enabled',
+            'tempaltetype':     'template_type',
+            'ostypename':       'os_type',
+            'crossZones':       'cross_zones',
+            'isextractable':    'is_extractable',
+            'isfeatured':       'is_featured',
+            'ispublic':         'is_public',
+            'format':           'format',
+            'hypervisor':       'hypervisor',
+        }
 
 
     def _get_args(self):
@@ -497,60 +518,6 @@ class AnsibleCloudStackTemplate(AnsibleCloudStack):
         return template
 
 
-    def get_result(self, template):
-        if template:
-            if 'displaytext' in template:
-                self.result['displaytext'] = template['displaytext']
-            if 'name' in template:
-                self.result['name'] = template['name']
-            if 'hypervisor' in template:
-                self.result['hypervisor'] = template['hypervisor']
-            if 'zonename' in template:
-                self.result['zone'] = template['zonename']
-            if 'checksum' in template:
-                self.result['checksum'] = template['checksum']
-            if 'format' in template:
-                self.result['format'] = template['format']
-            if 'isready' in template:
-                self.result['is_ready'] = template['isready']
-            if 'ispublic' in template:
-                self.result['is_public'] = template['ispublic']
-            if 'isfeatured' in template:
-                self.result['is_featured'] = template['isfeatured']
-            if 'isextractable' in template:
-                self.result['is_extractable'] = template['isextractable']
-            # and yes! it is really camelCase!
-            if 'crossZones' in template:
-                self.result['cross_zones'] = template['crossZones']
-            if 'ostypename' in template:
-                self.result['os_type'] = template['ostypename']
-            if 'templatetype' in template:
-                self.result['template_type'] = template['templatetype']
-            if 'passwordenabled' in template:
-                self.result['password_enabled'] = template['passwordenabled']
-            if 'sshkeyenabled' in template:
-                self.result['sshkey_enabled'] = template['sshkeyenabled']
-            if 'status' in template:
-                self.result['status'] = template['status']
-            if 'created' in template:
-                self.result['created'] = template['created']
-            if 'templatetag' in template:
-                self.result['template_tag'] = template['templatetag']
-            if 'tags' in template:
-                self.result['tags'] = []
-                for tag in template['tags']:
-                    result_tag          = {}
-                    result_tag['key']   = tag['key']
-                    result_tag['value'] = tag['value']
-                    self.result['tags'].append(result_tag)
-            if 'domain' in template:
-                self.result['domain'] = template['domain']
-            if 'account' in template:
-                self.result['account'] = template['account']
-            if 'project' in template:
-                self.result['project'] = template['project']
-        return self.result
-
 
 def main():
     module = AnsibleModule(
diff --git a/lib/ansible/modules/extras/cloud/cloudstack/cs_vmsnapshot.py b/lib/ansible/modules/extras/cloud/cloudstack/cs_vmsnapshot.py
index 15a5725bb81..c7faf8b746a 100644
--- a/lib/ansible/modules/extras/cloud/cloudstack/cs_vmsnapshot.py
+++ b/lib/ansible/modules/extras/cloud/cloudstack/cs_vmsnapshot.py
@@ -104,6 +104,11 @@ EXAMPLES = '''
 
 RETURN = '''
 ---
+id:
+  description: UUID of the snapshot.
+  returned: success
+  type: string
+  sample: a6f7a5fc-43f8-11e5-a151-feff819cdc9f
 name:
   description: Name of the snapshot.
   returned: success
@@ -170,7 +175,11 @@ from ansible.module_utils.cloudstack import *
 class AnsibleCloudStackVmSnapshot(AnsibleCloudStack):
 
     def __init__(self, module):
-        AnsibleCloudStack.__init__(self, module)
+        super(AnsibleCloudStackVmSnapshot, self).__init__(module)
+        self.returns = {
+            'type':     'type',
+            'current':  'current',
+        }
 
 
     def get_snapshot(self):
@@ -246,30 +255,6 @@ class AnsibleCloudStackVmSnapshot(AnsibleCloudStack):
         self.module.fail_json(msg="snapshot not found, could not revert VM")
 
 
-    def get_result(self, snapshot):
-        if snapshot:
-            if 'displayname' in snapshot:
-                self.result['displayname'] = snapshot['displayname']
-            if 'created' in snapshot:
-                self.result['created'] = snapshot['created']
-            if 'current' in snapshot:
-                self.result['current'] = snapshot['current']
-            if 'state' in snapshot:
-                self.result['state'] = snapshot['state']
-            if 'type' in snapshot:
-                self.result['type'] = snapshot['type']
-            if 'name' in snapshot:
-                self.result['name'] = snapshot['name']
-            if 'description' in snapshot:
-                self.result['description'] = snapshot['description']
-            if 'domain' in snapshot:
-                self.result['domain'] = snapshot['domain']
-            if 'account' in snapshot:
-                self.result['account'] = snapshot['account']
-            if 'project' in snapshot:
-                self.result['project'] = snapshot['project']
-        return self.result
-
 
 def main():
     module = AnsibleModule(