From cb76d2febc91feeb70900aa50b3b64a1d696ab70 Mon Sep 17 00:00:00 2001 From: Rodrigo Barbieri Date: Fri, 12 Jan 2018 15:11:52 -0200 Subject: [PATCH] Fix manila driverfixes/newton checks Branch is broken so we need 2 fixes: 1) Add upper-constraints.txt from stable/newton This will be used to set the upper-constraints for unit test jobs on this branch. 2) Backport "Remove usage of parameter enforce_type" oslo.config has deprecated the enforce_type parameter to set_override() and set its default value to True [1], so remove this usage from our codebase. Also remove explict str() cast of mock.sentinel_password in Windows driver since it should no longer be expected. [1] Ifa552de0a994e40388cbc9f7dbaa55700ca276b0 (cherry-picked from 4e25ce5a0c5c6100bc164729063659fd1472d391) Change-Id: Id7db496441f6c1d620a4995812ed4f8c98a00ad5 --- manila/test.py | 2 +- manila/tests/cmd/test_manage.py | 2 +- manila/tests/cmd/test_share.py | 7 +- .../drivers/cephfs/test_cephfs_native.py | 3 +- .../cluster_mode/test_data_motion.py | 26 +- .../share/drivers/netapp/dataontap/fakes.py | 3 +- .../tests/share/drivers/netapp/test_common.py | 6 +- .../drivers/windows/test_service_instance.py | 4 +- manila/tests/test_conf.py | 2 +- manila/tests/test_policy.py | 3 +- manila/tests/volume/test_cinder.py | 6 +- tox.ini | 2 +- upper-constraints.txt | 404 ++++++++++++++++++ 13 files changed, 433 insertions(+), 37 deletions(-) create mode 100644 upper-constraints.txt diff --git a/manila/test.py b/manila/test.py index eebc8a42d1..352e8782ed 100644 --- a/manila/test.py +++ b/manila/test.py @@ -173,7 +173,7 @@ class TestCase(base_test.BaseTestCase): def flags(self, **kw): """Override flag variables for a test.""" for k, v in kw.items(): - CONF.set_override(k, v, enforce_type=True) + CONF.set_override(k, v) def start_service(self, name, host=None, **kwargs): host = host and host or uuid.uuid4().hex diff --git a/manila/tests/cmd/test_manage.py b/manila/tests/cmd/test_manage.py index fd73c90b8d..0e1d012bf0 100644 --- a/manila/tests/cmd/test_manage.py +++ b/manila/tests/cmd/test_manage.py @@ -260,7 +260,7 @@ class ManilaCmdManageTestCase(test.TestCase): @mock.patch('six.moves.builtins.open') @mock.patch('os.listdir') def test_get_log_commands_errors(self, listdir, open): - CONF.set_override('log_dir', 'fake-dir', enforce_type=True) + CONF.set_override('log_dir', 'fake-dir') listdir.return_value = ['fake-error.log'] with mock.patch('sys.stdout', new=six.StringIO()) as fake_out: diff --git a/manila/tests/cmd/test_share.py b/manila/tests/cmd/test_share.py index 2592bcc438..66405ca6b2 100644 --- a/manila/tests/cmd/test_share.py +++ b/manila/tests/cmd/test_share.py @@ -38,10 +38,9 @@ class ManilaCmdShareTestCase(test.TestCase): self.mock_object(self.launcher, 'launch_service') self.mock_object(self.launcher, 'wait') self.server = manila_share.service.Service.create.return_value - fake_host = 'fake_host' - CONF.set_override('enabled_share_backends', backends, - enforce_type=True) - CONF.set_override('host', fake_host, enforce_type=True) + fake_host = 'fake.host' + CONF.set_override('enabled_share_backends', backends) + CONF.set_override('host', fake_host) sys.argv = ['manila-share'] manila_share.main() diff --git a/manila/tests/share/drivers/cephfs/test_cephfs_native.py b/manila/tests/share/drivers/cephfs/test_cephfs_native.py index 3756cdb4fc..27bcc0b181 100644 --- a/manila/tests/share/drivers/cephfs/test_cephfs_native.py +++ b/manila/tests/share/drivers/cephfs/test_cephfs_native.py @@ -425,8 +425,7 @@ class CephFSNativeDriverTestCase(test.TestCase): def test_connect_noevict(self): # When acting as "admin", driver should skip evicting self._driver.configuration.local_conf.set_override('cephfs_auth_id', - "admin", - enforce_type=True) + "admin") self._driver.create_share(self._context, self._share) diff --git a/manila/tests/share/drivers/netapp/dataontap/cluster_mode/test_data_motion.py b/manila/tests/share/drivers/netapp/dataontap/cluster_mode/test_data_motion.py index 5f679cbe6a..bdd0a22f95 100644 --- a/manila/tests/share/drivers/netapp/dataontap/cluster_mode/test_data_motion.py +++ b/manila/tests/share/drivers/netapp/dataontap/cluster_mode/test_data_motion.py @@ -53,17 +53,17 @@ class NetAppCDOTDataMotionTestCase(test.TestCase): self.config.append_config_values(na_opts.netapp_provisioning_opts) self.config.append_config_values(na_opts.netapp_replication_opts) CONF.set_override("share_backend_name", self.backend, - group=self.backend, enforce_type=True) + group=self.backend) CONF.set_override("netapp_transport_type", "https", - group=self.backend, enforce_type=True) + group=self.backend) CONF.set_override("netapp_login", "fake_user", - group=self.backend, enforce_type=True) + group=self.backend) CONF.set_override("netapp_password", "fake_password", - group=self.backend, enforce_type=True) - CONF.set_override("netapp_server_hostname", "fake_hostname", - group=self.backend, enforce_type=True) + group=self.backend) + CONF.set_override("netapp_server_hostname", "fake.hostname", + group=self.backend) CONF.set_override("netapp_server_port", 8866, - group=self.backend, enforce_type=True) + group=self.backend) def test_get_client_for_backend(self): self.mock_object(data_motion, "get_backend_configuration", @@ -72,7 +72,7 @@ class NetAppCDOTDataMotionTestCase(test.TestCase): data_motion.get_client_for_backend(self.backend) self.mock_cmode_client.assert_called_once_with( - hostname='fake_hostname', password='fake_password', + hostname='fake.hostname', password='fake_password', username='fake_user', transport_type='https', port=8866, trace=mock.ANY, vserver=None) @@ -81,19 +81,19 @@ class NetAppCDOTDataMotionTestCase(test.TestCase): mock.Mock(return_value=self.config)) CONF.set_override("netapp_vserver", 'fake_vserver', - group=self.backend, enforce_type=True) + group=self.backend) data_motion.get_client_for_backend(self.backend) self.mock_cmode_client.assert_called_once_with( - hostname='fake_hostname', password='fake_password', + hostname='fake.hostname', password='fake_password', username='fake_user', transport_type='https', port=8866, trace=mock.ANY, vserver='fake_vserver') def test_get_config_for_backend(self): self.mock_object(data_motion, "CONF") CONF.set_override("netapp_vserver", 'fake_vserver', - group=self.backend, enforce_type=True) + group=self.backend) data_motion.CONF.list_all_sections.return_value = [self.backend] config = data_motion.get_backend_configuration(self.backend) @@ -103,9 +103,9 @@ class NetAppCDOTDataMotionTestCase(test.TestCase): def test_get_config_for_backend_different_backend_name(self): self.mock_object(data_motion, "CONF") CONF.set_override("netapp_vserver", 'fake_vserver', - group=self.backend, enforce_type=True) + group=self.backend) CONF.set_override("share_backend_name", "fake_backend_name", - group=self.backend, enforce_type=True) + group=self.backend) data_motion.CONF.list_all_sections.return_value = [self.backend] config = data_motion.get_backend_configuration(self.backend) diff --git a/manila/tests/share/drivers/netapp/dataontap/fakes.py b/manila/tests/share/drivers/netapp/dataontap/fakes.py index 71449e9db0..766d834cb8 100644 --- a/manila/tests/share/drivers/netapp/dataontap/fakes.py +++ b/manila/tests/share/drivers/netapp/dataontap/fakes.py @@ -595,8 +595,7 @@ SSC_DISK_TYPES = ['FCAL', ['SATA', 'SSD']] def get_config_cmode(): config = na_fakes.create_configuration_cmode() - config.local_conf.set_override('share_backend_name', BACKEND_NAME, - enforce_type=True) + config.local_conf.set_override('share_backend_name', BACKEND_NAME) config.reserved_share_percentage = 5 config.netapp_login = CLIENT_KWARGS['username'] config.netapp_password = CLIENT_KWARGS['password'] diff --git a/manila/tests/share/drivers/netapp/test_common.py b/manila/tests/share/drivers/netapp/test_common.py index a53971f95b..2008ac78eb 100644 --- a/manila/tests/share/drivers/netapp/test_common.py +++ b/manila/tests/share/drivers/netapp/test_common.py @@ -120,8 +120,7 @@ class NetAppDriverFactoryTestCase(test.TestCase): config = na_fakes.create_configuration() config.local_conf.set_override('driver_handles_share_servers', - mode == na_common.MULTI_SVM, - enforce_type=True) + mode == na_common.MULTI_SVM) kwargs = { 'configuration': config, 'private_storage': mock.Mock(), @@ -136,8 +135,7 @@ class NetAppDriverFactoryTestCase(test.TestCase): def test_create_driver_case_insensitive(self): config = na_fakes.create_configuration() - config.local_conf.set_override('driver_handles_share_servers', True, - enforce_type=True) + config.local_conf.set_override('driver_handles_share_servers', True) kwargs = { 'configuration': config, diff --git a/manila/tests/share/drivers/windows/test_service_instance.py b/manila/tests/share/drivers/windows/test_service_instance.py index eca61f0e05..7c359e0346 100644 --- a/manila/tests/share/drivers/windows/test_service_instance.py +++ b/manila/tests/share/drivers/windows/test_service_instance.py @@ -82,7 +82,7 @@ class WindowsServiceInstanceManagerTestCase(test.TestCase): if not use_cert_auth: mock_check_complexity.assert_called_once_with( - str(mock.sentinel.password)) + mock.sentinel.password) @ddt.data(False, True) def test_get_auth_info(self, use_cert_auth): @@ -165,7 +165,7 @@ class WindowsServiceInstanceManagerTestCase(test.TestCase): expected_kwargs = dict(user_data=mock_cert_data) else: expected_kwargs = dict( - meta=dict(admin_pass=str(mock.sentinel.admin_pass))) + meta=dict(admin_pass=mock.sentinel.admin_pass)) create_kwargs = self._mgr._get_service_instance_create_kwargs() diff --git a/manila/tests/test_conf.py b/manila/tests/test_conf.py index a285ef64ed..2c9e897a0f 100644 --- a/manila/tests/test_conf.py +++ b/manila/tests/test_conf.py @@ -38,7 +38,7 @@ class ConfigTestCase(test.TestCase): self.assertEqual(42, CONF.answer) # Make sure we don't overwrite anything - CONF.set_override('answer', 256, enforce_type=True) + CONF.set_override('answer', 256) self.assertEqual(256, CONF.answer) CONF.import_opt('answer', 'manila.tests.declare_conf') self.assertEqual(256, CONF.answer) diff --git a/manila/tests/test_policy.py b/manila/tests/test_policy.py index b99d53dc86..354b59351c 100644 --- a/manila/tests/test_policy.py +++ b/manila/tests/test_policy.py @@ -41,8 +41,7 @@ class PolicyFileTestCase(test.TestCase): def test_modified_policy_reloads(self): with utils.tempdir() as tmpdir: tmpfilename = os.path.join(tmpdir, 'policy') - CONF.set_override('policy_file', tmpfilename, group='oslo_policy', - enforce_type=True) + CONF.set_override('policy_file', tmpfilename, group='oslo_policy') action = "example:test" with open(tmpfilename, "w") as policyfile: policyfile.write("""{"example:test": []}""") diff --git a/manila/tests/volume/test_cinder.py b/manila/tests/volume/test_cinder.py index 5082993e34..ea32c11402 100644 --- a/manila/tests/volume/test_cinder.py +++ b/manila/tests/volume/test_cinder.py @@ -190,8 +190,7 @@ class CinderApiTestCase(test.TestCase): volume['attach_status'] = "detached" instance = {'availability_zone': 'zone1'} volume['availability_zone'] = 'zone2' - cinder.CONF.set_override('cross_az_attach', False, 'cinder', - enforce_type=True) + cinder.CONF.set_override('cross_az_attach', False, 'cinder') self.assertRaises(exception.InvalidVolume, self.api.check_attach, self.ctx, volume, instance) volume['availability_zone'] = 'zone1' @@ -203,8 +202,7 @@ class CinderApiTestCase(test.TestCase): volume['attach_status'] = "detached" volume['availability_zone'] = 'zone1' instance = {'availability_zone': 'zone1'} - cinder.CONF.set_override('cross_az_attach', False, 'cinder', - enforce_type=True) + cinder.CONF.set_override('cross_az_attach', False, 'cinder') self.assertIsNone(self.api.check_attach(self.ctx, volume, instance)) cinder.CONF.reset() diff --git a/tox.ini b/tox.ini index 413d08becc..4b18d29c83 100644 --- a/tox.ini +++ b/tox.ini @@ -6,7 +6,7 @@ envlist = py34,py27,pep8 [testenv] setenv = VIRTUAL_ENV={envdir} usedevelop = True -install_command = pip install -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt?h=stable/newton} {opts} {packages} +install_command = pip install -cupper-constraints.txt {opts} {packages} whitelist_externals = find deps = -r{toxinidir}/requirements.txt -r{toxinidir}/test-requirements.txt diff --git a/upper-constraints.txt b/upper-constraints.txt new file mode 100644 index 0000000000..b039b24768 --- /dev/null +++ b/upper-constraints.txt @@ -0,0 +1,404 @@ +# taken from openstack/requirements stable/newton @ aec3ee5 +APScheduler===3.2.0 +Babel===2.3.4 +CouchDB===1.1 +Django===1.8.14 +Flask===0.11.1 +GitPython===2.0.8 +Jinja2===2.8 +Mako===1.0.4 +MarkupSafe===0.23 +MySQL-python===1.2.5;python_version=='2.7' +Parsley===1.3 +Paste===2.0.3 +PasteDeploy===1.5.2 +Pillow===3.3.1 +Pint===0.7.2 +PuLP===1.6.1 +PyECLib===1.2.0 +PyJWT===1.4.2 +PyKMIP===0.5.0 +PyMySQL===0.7.6 +PyYAML===3.12 +Pygments===2.1.3 +Routes===2.3.1 +SQLAlchemy===1.0.14 +SQLAlchemy-Utils===0.32.9 +SecretStorage===2.3.1 +Sphinx===1.2.3 +Tempita===0.5.2 +WSME===0.8.0 +WebOb===1.6.1 +WebTest===2.0.23 +Werkzeug===0.11.11 +XStatic===1.0.1 +XStatic-Angular===1.4.10.1 +XStatic-Angular-Bootstrap===0.11.0.8 +XStatic-Angular-FileUpload===12.0.4.0 +XStatic-Angular-Gettext===2.1.0.2 +XStatic-Angular-Schema-Form===0.8.13.0 +XStatic-Angular-lrdragndrop===1.0.2.2 +XStatic-Bootstrap-Datepicker===1.3.1.0 +XStatic-Bootstrap-SCSS===3.3.7.1 +XStatic-D3===3.1.6.2 +XStatic-Font-Awesome===4.5.0.0 +XStatic-Hogan===2.0.0.2 +XStatic-JQuery-Migrate===1.2.1.1 +XStatic-JQuery.TableSorter===2.14.5.1 +XStatic-JQuery.quicksearch===2.0.3.1 +XStatic-JSEncrypt===2.0.0.2 +XStatic-Jasmine===2.4.1.1 +XStatic-Magic-Search===0.2.5.1 +XStatic-Rickshaw===1.5.0.0 +XStatic-Spin===1.2.5.2 +XStatic-bootswatch===3.3.6.0 +XStatic-jQuery===1.10.2.1 +XStatic-jquery-ui===1.11.0.1 +XStatic-mdi===1.4.57.0 +XStatic-objectpath===1.2.1.0 +XStatic-roboto-fontface===0.4.3.2 +XStatic-smart-table===1.4.13.2 +XStatic-term.js===0.0.7.0 +XStatic-tv4===1.2.7.0 +XenAPI===1.2 +alembic===0.8.7 +amqp===1.4.9 +anyjson===0.3.3 +aodhclient===0.7.0 +appdirs===1.4.3 +astroid===1.3.8 +autobahn===0.16.0 +automaton===1.4.0 +backports.ssl-match-hostname===3.5.0.1;python_version=='2.7' +bandit===1.1.0 +bashate===0.5.1 +beautifulsoup4===4.5.1 +betamax===0.8.0 +blockdiag===1.5.3 +boto===2.42.0 +botocore===1.4.50 +cachetools===1.1.6 +cassandra-driver===3.5.0 +castellan===0.4.0 +ceilometermiddleware===0.5.2 +cffi===1.7.0 +chardet===2.3.0 +click===6.6 +cliff===2.2.0 +cliff-tablib===2.0 +cmd2===0.6.8 +colorama===0.3.7 +configparser===3.5.0 +contextlib2===0.5.4 +coverage===4.2 +crc16===0.1.1 +croniter===0.3.12 +cryptography===1.5 +cursive===0.1.1 +ddt===1.1.0 +debtcollector===1.8.0 +decorator===4.0.10 +demjson===2.2.4 +dib-utils===0.0.10 +discover===0.4.0 +diskimage-builder===1.19.0 +django-appconf===1.0.2 +django-babel===0.5.1 +django-compressor===2.1 +django-floppyforms===1.7.0 +django-formtools===1.0 +django-nose===1.4.4 +django-openstack-auth===2.4.2 +django-pyscss===2.0.2 +dnspython===1.14.0 +dnspython3===1.12.0;python_version=='3.4' +dnspython3===1.12.0;python_version=='3.5' +doc8===0.7.0 +docker-py===1.7.2 +docutils===0.12 +dogpile.cache===0.6.2 +elasticsearch===2.4.0 +enum34===1.1.6 +eventlet===0.19.0 +extras===1.0.0 +fairy-slipper===0.2.0 +falcon===1.0.0 +fasteners===0.14.1 +fixtures===3.0.0 +freezegun===0.3.7 +frozendict===1.0 +funcparserlib===0.3.6 +funcsigs===1.0.2;python_version=='2.7' +functools32===3.2.3.post2;python_version=='2.7' +futures===3.0.5 +futurist===0.18.0 +gabbi===1.24.0 +gitdb===0.6.4 +glance-store===0.18.0 +google-api-python-client===1.5.3 +graphviz===0.4.10 +greenlet===0.4.10 +happybase===1.0.0;python_version=='2.7' +heat-translator===0.5.0 +hiredis===0.2.0 +httplib2===0.9.2 +icalendar===3.10 +idna===2.1 +ipaddress===1.0.16;python_version=='2.7' +ironic-lib===2.1.3 +iso8601===0.1.11 +itsdangerous===0.24 +jmespath===0.9.0 +jsonpatch===1.14 +jsonpath-rw===1.4.0 +jsonpath-rw-ext===1.0.0 +jsonpointer===1.10 +jsonschema===2.5.1 +kafka-python===0.9.5 +kazoo===2.2.1 +keyring===9.3.1 +keystoneauth1===2.12.3 +keystonemiddleware===4.9.1 +kombu===3.0.35 +krest===1.3.1 +ldap3===1.4.0 +ldappool===2.1.0 +libvirt-python===2.1.0 +linecache2===1.0.0 +logilab-common===1.2.2 +logutils===0.3.3 +lxml===3.6.4 +microversion-parse===0.1.4 +mistral===3.0.2 +mock===2.0.0 +monasca-common===1.0.0 +monasca-statsd===1.1.0 +monotonic===1.2 +mox===0.5.3 +mox3===0.18.0 +mpmath===0.19 +msgpack-python===0.4.8 +ndg-httpsclient===0.4.2;python_version=='2.7' +netaddr===0.7.18 +netifaces===0.10.5 +netmiko===0.5.6 +networkx===1.11 +neutron-lib===0.4.0 +nodeenv===0.13.6 +nose===1.3.7 +nose-exclude===0.4.1 +nosehtmloutput===0.0.5 +nosexcover===1.0.10 +notifier===1.0.3 +numpy===1.11.1 +oauth2client===3.0.0 +oauthlib===1.1.2 +openstack-doc-tools===1.0.1 +openstack.nose-plugin===0.11 +openstackdocstheme===1.5.0 +openstacksdk===0.9.5 +ordereddict===1.1 +os-api-ref===1.0.0 +os-apply-config===5.1.0 +os-brick===1.6.2 +os-client-config===1.21.1 +os-cloud-config===5.1.0 +os-collect-config===5.2.0 +os-refresh-config===5.2.0 +os-testr===0.8.0 +os-vif===1.2.1 +os-win===1.2.2 +osc-lib===1.1.0 +oslo.cache===1.14.1 +oslo.concurrency===3.14.1 +oslo.config===3.17.1 +oslo.context===2.9.0 +oslo.db===4.13.6 +oslo.i18n===3.9.0 +oslo.log===3.16.1 +oslo.messaging===5.10.2 +oslo.middleware===3.19.1 +oslo.policy===1.14.0 +oslo.privsep===1.13.2 +oslo.reports===1.14.0 +oslo.rootwrap===5.1.2 +oslo.serialization===2.13.2 +oslo.service===1.16.1 +oslo.utils===3.16.1 +oslo.versionedobjects===1.17.1 +oslo.vmware===2.14.1 +oslosphinx===4.7.0 +oslotest===2.10.1 +osprofiler===1.4.0 +ovs===2.5.0;python_version=='2.7' +ovs===2.6.0.dev3;python_version=='3.4' +ovs===2.6.0.dev3;python_version=='3.5' +packaging===16.8 +paramiko===2.0.2 +passlib===1.6.5 +pathlib===1.0.1;python_version=='2.7' +pbr===1.10.0 +pecan===1.1.2 +pexpect===4.2.1 +pifpaf===0.12.0 +pika===0.10.0 +pika-pool===0.1.3 +ply===3.9 +positional===1.1.1 +posix-ipc===1.0.0 +prettytable===0.7.2 +proboscis===1.2.6.0 +psutil===1.2.1 +psycopg2===2.6.2 +ptyprocess===0.5.1 +py===1.4.31 +pyOpenSSL===16.2.0 +pyScss===1.3.4 +pyasn1===0.1.9 +pyasn1-modules===0.0.8 +pycadf===2.4.0 +pycparser===2.14 +pycrypto===2.6.1 +pydotplus===2.0.2 +pyghmi===1.0.9 +pyinotify===0.9.6 +pykerberos===1.1.13;python_version=='2.7' +pyldap===2.4.25.1 +pylxd===2.0.3 +pymemcache===1.3.6 +pymod2pkg===0.5.4 +pymongo===3.3.0 +pyngus===2.1.2 +pyparsing===2.1.10 +pyroute2===0.4.6 +pysaml2===4.0.2 +pysendfile===2.0.1 +pysmi===0.0.7 +pysnmp===4.3.2 +pystache===0.5.4 +pytest===3.0.1 +python-barbicanclient===4.0.1 +python-ceilometerclient===2.6.2 +python-cinderclient===1.9.0 +python-congressclient===1.5.0 +python-consul===0.6.1 +python-dateutil===2.5.3 +python-designateclient===2.3.0 +python-editor===1.0.1 +python-glanceclient===2.5.0 +python-heatclient===1.5.2 +python-ironic-inspector-client===1.10.0 +python-ironicclient===1.7.1 +python-k8sclient===0.3.0 +python-karborclient===0.1.0 +python-keystoneclient===3.5.1 +python-magnumclient===2.3.1 +python-manilaclient===1.11.0 +python-memcached===1.58 +python-mimeparse===1.5.2 +python-mistralclient===2.1.2 +python-monascaclient===1.2.1 +python-muranoclient===0.11.1 +python-neutronclient===6.0.1 +python-novaclient===6.0.2 +python-openstackclient===3.2.1 +python-pytun===2.2.1 +python-qpid-proton===0.14.0 +python-saharaclient===0.18.0 +python-searchlightclient===1.0.0 +python-senlinclient===1.0.0 +python-smaugclient===0.0.8 +python-solumclient===2.0.1 +python-statsd===2.0.0 +python-subunit===1.2.0 +python-swiftclient===3.1.0 +python-tackerclient===0.7.0 +python-troveclient===2.5.0 +python-watcherclient===0.25.1 +python-zaqarclient===1.2.0 +pytz===2016.6.1 +pyudev===0.21.0 +pyzabbix===0.7.4 +pyzmq===15.4.0 +qpid-python===0.32.1;python_version=='2.7' +rcssmin===1.0.6 +redis===2.10.5 +reno===1.9.0 +repoze.lru===0.6 +repoze.who===2.3 +requests===2.11.1 +requests-aws===0.1.8 +requests-kerberos===0.10.0;python_version=='2.7' +requests-mock===1.0.0 +requests-unixsocket===0.1.5 +requestsexceptions===1.1.3 +restructuredtext-lint===0.17.0 +retrying===1.3.3 +rfc3986===0.4.1 +rjsmin===1.0.12 +rsa===3.4.2 +rtslib-fb===2.1.58 +ryu===4.5 +scikit-learn===0.17.1 +scipy===0.18.0 +scp===0.10.2 +selenium===2.53.6 +semantic-version===2.5.0 +seqdiag===0.9.5 +simplegeneric===0.8.1 +simplejson===3.8.2 +singledispatch===3.4.0.3;python_version=='2.7' +six===1.10.0 +smmap===0.9.0 +spec-cleaner===0.9.0 +sphinxcontrib-blockdiag===1.5.5 +sphinxcontrib-httpdomain===1.5.0 +sphinxcontrib-pecanwsme===0.8.0 +sphinxcontrib-seqdiag===0.8.5 +sqlalchemy-migrate===0.10.0 +sqlparse===0.2.1 +stevedore===1.17.1 +suds-jurko===0.6 +sympy===1.0 +sysv-ipc===0.7.0 +tablib===0.11.2 +taskflow===2.6.1 +tempest===12.1.0 +tempest-lib===1.0.0 +tenacity===3.0.0 +termcolor===1.1.0 +testrepository===0.0.20 +testresources===2.0.1 +testscenarios===0.5.0 +testtools===2.2.0 +thriftpy===0.3.9;python_version=='2.7' +tooz===1.43.2 +tosca-parser===0.6.0 +traceback2===1.4.0 +tripleo-common===5.4.4 +trollius===2.1 +txaio===2.5.1 +tzlocal===1.2.2 +ujson===1.35 +unicodecsv===0.14.1;python_version=='2.7' +unittest2===1.1.0 +uritemplate===0.6 +urllib3===1.16 +virtualenv===15.0.3 +voluptuous===0.9.3 +waitress===1.0.0 +warlock===1.2.0 +weakrefmethod===1.0.3;python_version=='2.7' +webcolors===1.5 +websocket-client===0.37.0 +websockify===0.8.0 +wrapt===1.10.8 +ws4py===0.3.4 +wsgi-intercept===1.3.1 +xattr===0.8.0 +xmltodict===0.10.2 +xvfbwrapper===0.2.8 +yaql===1.1.2 +zake===0.2.2 +zope.interface===4.3.1 +virtualbmc===0.1.0