Merge "Re-factor neutron client for 'list' methods"
diff --git a/tempest/scenario/manager.py b/tempest/scenario/manager.py
index 8f0b4dc..95a8356 100644
--- a/tempest/scenario/manager.py
+++ b/tempest/scenario/manager.py
@@ -559,27 +559,27 @@
 
     def _list_networks(self, *args, **kwargs):
         """List networks using admin creds """
-        return self._admin_lister('networks')(*args, **kwargs)
+        networks_list = self.admin_manager.network_client.list_networks(
+            *args, **kwargs)
+        return networks_list['networks']
 
     def _list_subnets(self, *args, **kwargs):
         """List subnets using admin creds """
-        return self._admin_lister('subnets')(*args, **kwargs)
+        subnets_list = self.admin_manager.network_client.list_subnets(
+            *args, **kwargs)
+        return subnets_list['subnets']
 
     def _list_routers(self, *args, **kwargs):
         """List routers using admin creds """
-        return self._admin_lister('routers')(*args, **kwargs)
+        routers_list = self.admin_manager.network_client.list_routers(
+            *args, **kwargs)
+        return routers_list['routers']
 
     def _list_ports(self, *args, **kwargs):
         """List ports using admin creds """
-        return self._admin_lister('ports')(*args, **kwargs)
-
-    def _admin_lister(self, resource_type):
-        def temp(*args, **kwargs):
-            temp_method = self.admin_manager.network_client.__getattr__(
-                'list_%s' % resource_type)
-            resource_list = temp_method(*args, **kwargs)
-            return resource_list[resource_type]
-        return temp
+        ports_list = self.admin_manager.network_client.list_ports(
+            *args, **kwargs)
+        return ports_list['ports']
 
     def _create_subnet(self, network, client=None, namestart='subnet-smoke',
                        **kwargs):
diff --git a/tempest/services/network/json/network_client.py b/tempest/services/network/json/network_client.py
index a903457..b3663fc 100644
--- a/tempest/services/network/json/network_client.py
+++ b/tempest/services/network/json/network_client.py
@@ -73,17 +73,14 @@
         }
         return resource_plural_map.get(resource_name, resource_name + 's')
 
-    def _lister(self, plural_name):
-        def _list(**filters):
-            uri = self.get_uri(plural_name)
-            if filters:
-                uri += '?' + urllib.urlencode(filters, doseq=1)
-            resp, body = self.get(uri)
-            body = self.deserialize_list(body)
-            self.expected_success(200, resp.status)
-            return service_client.ResponseBody(resp, body)
-
-        return _list
+    def _list_resources(self, uri, **filters):
+        req_uri = self.uri_prefix + uri
+        if filters:
+            req_uri += '?' + urllib.urlencode(filters, doseq=1)
+        resp, body = self.get(req_uri)
+        body = self.deserialize_list(body)
+        self.expected_success(200, resp.status)
+        return service_client.ResponseBody(resp, body)
 
     def _delete_resource(self, uri):
         req_uri = self.uri_prefix + uri
@@ -119,15 +116,6 @@
         self.expected_success(200, resp.status)
         return service_client.ResponseBody(resp, body)
 
-    def __getattr__(self, name):
-        method_prefixes = ["list_"]
-        method_functors = [self._lister]
-        for index, prefix in enumerate(method_prefixes):
-            prefix_len = len(prefix)
-            if name[:prefix_len] == prefix:
-                return method_functors[index](name[prefix_len:])
-        raise AttributeError(name)
-
     def create_network(self, **kwargs):
         uri = '/networks'
         post_data = {'network': kwargs}
@@ -146,6 +134,10 @@
         uri = '/networks/%s' % network_id
         return self._delete_resource(uri)
 
+    def list_networks(self, **filters):
+        uri = '/networks'
+        return self._list_resources(uri, **filters)
+
     def create_subnet(self, **kwargs):
         uri = '/subnets'
         post_data = {'subnet': kwargs}
@@ -164,6 +156,10 @@
         uri = '/subnets/%s' % subnet_id
         return self._delete_resource(uri)
 
+    def list_subnets(self, **filters):
+        uri = '/subnets'
+        return self._list_resources(uri, **filters)
+
     def create_port(self, **kwargs):
         uri = '/ports'
         post_data = {'port': kwargs}
@@ -182,6 +178,10 @@
         uri = '/ports/%s' % port_id
         return self._delete_resource(uri)
 
+    def list_ports(self, **filters):
+        uri = '/ports'
+        return self._list_resources(uri, **filters)
+
     def create_floatingip(self, **kwargs):
         uri = '/floatingips'
         post_data = {'floatingip': kwargs}
@@ -200,6 +200,10 @@
         uri = '/floatingips/%s' % floatingip_id
         return self._delete_resource(uri)
 
+    def list_floatingips(self, **filters):
+        uri = '/floatingips'
+        return self._list_resources(uri, **filters)
+
     def create_metering_label(self, **kwargs):
         uri = '/metering/metering-labels'
         post_data = {'metering_label': kwargs}
@@ -213,6 +217,10 @@
         uri = '/metering/metering-labels/%s' % metering_label_id
         return self._delete_resource(uri)
 
+    def list_metering_labels(self, **filters):
+        uri = '/metering/metering-labels'
+        return self._list_resources(uri, **filters)
+
     def create_metering_label_rule(self, **kwargs):
         uri = '/metering/metering-label-rules'
         post_data = {'metering_label_rule': kwargs}
@@ -226,6 +234,10 @@
         uri = '/metering/metering-label-rules/%s' % metering_label_rule_id
         return self._delete_resource(uri)
 
+    def list_metering_label_rules(self, **filters):
+        uri = '/metering/metering-label-rules'
+        return self._list_resources(uri, **filters)
+
     def create_security_group(self, **kwargs):
         uri = '/security-groups'
         post_data = {'security_group': kwargs}
@@ -244,6 +256,10 @@
         uri = '/security-groups/%s' % security_group_id
         return self._delete_resource(uri)
 
+    def list_security_groups(self, **filters):
+        uri = '/security-groups'
+        return self._list_resources(uri, **filters)
+
     def create_security_group_rule(self, **kwargs):
         uri = '/security-group-rules'
         post_data = {'security_group_rule': kwargs}
@@ -257,10 +273,18 @@
         uri = '/security-group-rules/%s' % security_group_rule_id
         return self._delete_resource(uri)
 
+    def list_security_group_rules(self, **filters):
+        uri = '/security-group-rules'
+        return self._list_resources(uri, **filters)
+
     def show_extension(self, ext_alias, **fields):
         uri = '/extensions/%s' % ext_alias
         return self._show_resource(uri, **fields)
 
+    def list_extensions(self, **filters):
+        uri = '/extensions'
+        return self._list_resources(uri, **filters)
+
     # Common methods that are hard to automate
     def create_bulk_network(self, names):
         network_list = [{'name': name} for name in names]
@@ -378,6 +402,10 @@
         uri = '/quotas/%s' % tenant_id
         return self._show_resource(uri, **fields)
 
+    def list_quotas(self, **filters):
+        uri = '/quotas'
+        return self._list_resources(uri, **filters)
+
     def create_router(self, name, admin_state_up=True, **kwargs):
         post_body = {'router': kwargs}
         post_body['router']['name'] = name
@@ -435,6 +463,10 @@
         uri = '/routers/%s' % router_id
         return self._delete_resource(uri)
 
+    def list_routers(self, **filters):
+        uri = '/routers'
+        return self._list_resources(uri, **filters)
+
     def update_router_with_snat_gw_info(self, router_id, **kwargs):
         """Update a router passing also the enable_snat attribute.
 
@@ -507,6 +539,10 @@
         uri = '/agents/%s' % agent_id
         return self._show_resource(uri, **fields)
 
+    def list_agents(self, **filters):
+        uri = '/agents'
+        return self._list_resources(uri, **filters)
+
     def list_routers_on_l3_agent(self, agent_id):
         uri = '%s/agents/%s/l3-routers' % (self.uri_prefix, agent_id)
         resp, body = self.get(uri)