Re-factor neutron client for 'list' methods

Currently neutron client is written to auto generate
methods on fly. This is very difficult to debug and
make code very difficult to read.

As neutron client will be moved to lib, it will be better to
have its interfaces more readable and consistent with other
service clients.

This commit re-factor it for 'list_*' methods.

Change-Id: Ia9513edd0ed5c080bd988cdf3e44e67774c698f9
diff --git a/tempest/scenario/manager.py b/tempest/scenario/manager.py
index fff8a5c..80c6aa4 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 f1e9824..14f700d 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)