Merge "Separate floating_ip_pools_client"
diff --git a/openstack-common.conf b/openstack-common.conf
index 1920295..16ba6a7 100644
--- a/openstack-common.conf
+++ b/openstack-common.conf
@@ -3,6 +3,8 @@
 # The list of modules to copy from openstack-common
 module=install_venv_common
 module=versionutils
+module=with_venv
+module=install_venv
 
 # The base module to hold the copy of openstack.common
 base=tempest
diff --git a/run_tempest.sh b/run_tempest.sh
index 5a9b742..0f32045 100755
--- a/run_tempest.sh
+++ b/run_tempest.sh
@@ -20,7 +20,7 @@
 }
 
 testrargs=""
-venv=.venv
+venv=${VENV:-.venv}
 with_venv=tools/with_venv.sh
 serial=0
 always_venv=0
diff --git a/run_tests.sh b/run_tests.sh
index 971f89b..9a158e4 100755
--- a/run_tests.sh
+++ b/run_tests.sh
@@ -19,7 +19,7 @@
 
 testrargs=""
 just_pep8=0
-venv=.venv
+venv=${VENV:-.venv}
 with_venv=tools/with_venv.sh
 serial=0
 always_venv=0
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)
diff --git a/tempest/test_discover/test_discover.py b/tempest/test_discover/test_discover.py
index a871d10..86aa855 100644
--- a/tempest/test_discover/test_discover.py
+++ b/tempest/test_discover/test_discover.py
@@ -30,12 +30,14 @@
     base_path = os.path.split(os.path.dirname(os.path.abspath(__file__)))[0]
     base_path = os.path.split(base_path)[0]
     # Load local tempest tests
-    for test_dir in ['./tempest/api', './tempest/scenario',
-                     './tempest/thirdparty']:
+    for test_dir in ['tempest/api', 'tempest/scenario',
+                     'tempest/thirdparty']:
+        full_test_dir = os.path.join(base_path, test_dir)
         if not pattern:
-            suite.addTests(loader.discover(test_dir, top_level_dir=base_path))
+            suite.addTests(loader.discover(full_test_dir,
+                                           top_level_dir=base_path))
         else:
-            suite.addTests(loader.discover(test_dir, pattern=pattern,
+            suite.addTests(loader.discover(full_test_dir, pattern=pattern,
                            top_level_dir=base_path))
 
     plugin_load_tests = ext_plugins.get_plugin_load_tests_tuple()
diff --git a/test-requirements.txt b/test-requirements.txt
index 2b3607d..7115168 100644
--- a/test-requirements.txt
+++ b/test-requirements.txt
@@ -7,6 +7,7 @@
 python-subunit>=0.0.18
 oslosphinx>=2.5.0 # Apache-2.0
 mox>=0.5.3
-mock>=1.0
+mock>=1.1;python_version!='2.6'
+mock==1.0.1;python_version=='2.6'
 coverage>=3.6
 oslotest>=1.5.1 # Apache-2.0
diff --git a/tools/install_venv.py b/tools/install_venv.py
index 96b8279..d6d9c8e 100644
--- a/tools/install_venv.py
+++ b/tools/install_venv.py
@@ -48,11 +48,11 @@
 def main(argv):
     root = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
 
-    if os.environ.get('tools_path'):
-        root = os.environ['tools_path']
+    if os.environ.get('TOOLS_PATH'):
+        root = os.environ['TOOLS_PATH']
     venv = os.path.join(root, '.venv')
-    if os.environ.get('venv'):
-        venv = os.environ['venv']
+    if os.environ.get('VENV'):
+        venv = os.environ['VENV']
 
     pip_requires = os.path.join(root, 'requirements.txt')
     test_requires = os.path.join(root, 'test-requirements.txt')
diff --git a/tools/install_venv_common.py b/tools/install_venv_common.py
index 743b59d..e279159 100644
--- a/tools/install_venv_common.py
+++ b/tools/install_venv_common.py
@@ -101,6 +101,7 @@
             print('done.')
         else:
             print("venv already exists...")
+            pass
 
     def pip_install(self, *args):
         self.run_command(['tools/with_venv.sh',
@@ -124,7 +125,7 @@
         parser.add_option('-n', '--no-site-packages',
                           action='store_true',
                           help="Do not inherit packages from global Python "
-                               "install")
+                               "install.")
         return parser.parse_args(argv[1:])[0]
 
 
diff --git a/tools/with_venv.sh b/tools/with_venv.sh
index 550c477..165c883 100755
--- a/tools/with_venv.sh
+++ b/tools/with_venv.sh
@@ -1,4 +1,6 @@
 #!/bin/bash
-TOOLS=`dirname $0`
-VENV=$TOOLS/../.venv
-source $VENV/bin/activate && "$@"
+TOOLS_PATH=${TOOLS_PATH:-$(dirname $0)/../}
+VENV_PATH=${VENV_PATH:-${TOOLS_PATH}}
+VENV_DIR=${VENV_DIR:-/.venv}
+VENV=${VENV:-${VENV_PATH}/${VENV_DIR}}
+source ${VENV}/bin/activate && "$@"