From 500d2eb7805ea855273d8191c2acc73653d03775 Mon Sep 17 00:00:00 2001 From: Yasufumi Ogawa Date: Tue, 1 Dec 2020 01:37:04 +0000 Subject: [PATCH] Change tosca-parser and heat-translator install With devstack, tosca-parser and heat-translator of stable version are installed via pip as listed in `requirements.txt`. However, we usually use devsatck for deploying development env, and it's recommended to get the latest division sometimes. On the other hand, there are not so many cases using stable ones actually. This update includes several tricks as following, but most of them are no need if the two packages have its own devstack script. So, we should remove the tricks after that as described in TODOs added in the update. NOTE: As described below, we should update upper-constraints.txt as following example and upload it to tacker's repo everytime [1] is updated for the change. $ bash devstack/lib/download_upper_consts * Install packages from cloned git repos in `/opt/stack/` as similar to other packages. * Comment out entries of the two packages in `requirements.txt` and `lower-constraints.txt` because no need to install them from here, but activate it if you install stable packages. * To pass tox jobs, add files below. * upper-constraints.txt: The two packages are removed from official constraints file [1] to skip checking version of stable. This file is refreshed everytime running `stack.sh` to catch up the official. * requirements-extra.txt: Install the packages from git repo. Without separating it from `requirements.txt`, `tox -e lower-constraints` is failed. * Update params in `tox.ini` to activate the modifications above. [1] https://releases.openstack.org/constraints/upper/master Signed-off-by: Yasufumi Ogawa Change-Id: I776137215ea06c8ac54612d13a663349c2e7db7d --- devstack/lib/download_upper_consts | 16 + devstack/lib/tacker | 23 ++ devstack/plugin.sh | 9 + lower-constraints.txt | 10 +- requirements-extra.txt | 8 + requirements.txt | 10 +- tox.ini | 10 + upper-constraints.txt | 566 +++++++++++++++++++++++++++++ 8 files changed, 648 insertions(+), 4 deletions(-) create mode 100644 devstack/lib/download_upper_consts create mode 100644 requirements-extra.txt create mode 100644 upper-constraints.txt diff --git a/devstack/lib/download_upper_consts b/devstack/lib/download_upper_consts new file mode 100644 index 000000000..93c101d05 --- /dev/null +++ b/devstack/lib/download_upper_consts @@ -0,0 +1,16 @@ +#!/bin/bash + +# TODO(yasufum) Remove it after tosca-parser and heat-translator have its own +# devstack script. It's because for installing them from the latest git +# repo instead of stable pip packages. +# Get a customized `upper-constraints.txt` locally, tosca-parser and +# heat-translator are removed for passing tox jobs. In addition, remove nouse +# packages. +function download_upper_constraints_file { + curl --location https://releases.openstack.org/constraints/upper/master \ + | sed '/tosca-parser/d' | sed '/heat-translator/d' \ + | sed '/python-saharaclient/d' \ + > upper-constraints.txt +} + +download_upper_constraints_file diff --git a/devstack/lib/tacker b/devstack/lib/tacker index b5c08a774..55484ee84 100644 --- a/devstack/lib/tacker +++ b/devstack/lib/tacker @@ -489,3 +489,26 @@ function configure_maintenance_event_types { echo "Configure maintenance event types to $event_definitions_file" cat $maintenance_events_file >> $event_definitions_file } + +# Install pip package from local git repositry. +function install_package_local_repo { + # Name of package, such as `tosca-parser`. + local pkg_name=$1 + # (optional) URL of git repo, it's required if the package is not under + # `https://opendev.org/openstack/`. + local git_url=$2 + + local repo_dir=$DEST/$pkg_name + + if [[ $git_url == "" ]]; then + # Expect the repo is under opendev + local git_url=https://opendev.org/openstack/$pkg_name + fi + + if [ ! -d $repo_dir ]; then + git clone $git_url $repo_dir + fi + + # Install local package with `pip install -e local_dir`. + setup_develop $repo_dir +} diff --git a/devstack/plugin.sh b/devstack/plugin.sh index 1d050d6ce..ebc327a5a 100644 --- a/devstack/plugin.sh +++ b/devstack/plugin.sh @@ -15,6 +15,15 @@ if is_service_enabled tacker; then echo_summary "Installing Tacker" install_tacker + # NOTE(yasufum) We don't use pip packages of tosca-parser and + # heat-translator but cloned git repo for usnig the latest revision + # for development. + # If you install pip packages instead, comment out here, and activate + # entries in `requirements.txt` and `lower-constraints.txt`. + install_package_local_repo tosca-parser + install_package_local_repo heat-translator + . $DEST/tacker/devstack/lib/download_upper_consts + elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then # Configure after the other layer 1 and 2 services have been configured echo_summary "Configuring Tacker" diff --git a/lower-constraints.txt b/lower-constraints.txt index c939eaeb4..5ab0a8b21 100644 --- a/lower-constraints.txt +++ b/lower-constraints.txt @@ -34,7 +34,6 @@ futurist==2.1.0 glance-store==2.4.0 google-auth==1.4.1 greenlet==0.4.15 -heat-translator==2.0.0 idna==2.6 imagesize==1.0.0 ipaddress==1.0.19 @@ -142,7 +141,6 @@ testresources==2.0.1 testscenarios==0.5.0 testtools==2.2.0 tooz==1.58.0 -tosca-parser==1.6.1 traceback2==1.4.0 unittest2==1.1.0 urllib3==1.24.2 @@ -154,3 +152,11 @@ WebOb==1.7.1 websocket-client==0.47.0 WebTest==2.0.27 wrapt==1.10.11 + +# TODO(yasufum) Remove following comments after those two packages have devstack script. +# NOTE(yasufum) We don't install tosca-parser and heat-translator of stable, +# but the latest revision from git repo for development. +# If you install packages, comment out two lines of `install_package_gitrepo` in +# `devstack/plugin.sh` in addition to activate following lines. +#heat-translator==2.0.0 # Apache-2.0 +#tosca-parser==1.6.1 # Apache-2.0 diff --git a/requirements-extra.txt b/requirements-extra.txt new file mode 100644 index 000000000..decb6e1fb --- /dev/null +++ b/requirements-extra.txt @@ -0,0 +1,8 @@ +# This file is used as an input for pip while runnign tox jobs in addition to +# `requirements.txt`. The reason why separated from `requirements.txt' is +# because the syntax of `-e git+https://...` cannot be understood in job +# `tox -e lower-constraints` and it's failed if it's defined in +# `requirements.txt`. + +-e git+https://opendev.org/openstack/tosca-parser.git#egg=tosca-parser # Apache-2.0 +-e git+https://opendev.org/openstack/heat-translator.git#egg=heat-translator # Apache-2.0 diff --git a/requirements.txt b/requirements.txt index 1ad248c83..e71a4ba31 100644 --- a/requirements.txt +++ b/requirements.txt @@ -40,8 +40,6 @@ openstacksdk>=0.44.0 # Apache-2.0 python-neutronclient>=6.7.0 # Apache-2.0 python-novaclient>=9.1.0 # Apache-2.0 rfc3986>=1.1.0 # Apache-2.0 -tosca-parser>=1.6.1 # Apache-2.0 -heat-translator>=2.0.0 # Apache-2.0 cryptography>=2.7 # BSD/Apache-2.0 paramiko>=2.7.1 # LGPLv2.1+ pyroute2>=0.4.21;sys_platform!='win32' # Apache-2.0 (+ dual licensed GPL2) @@ -55,3 +53,11 @@ PyYAML>=5.1 # MIT # Glance Store glance-store>=2.4.0 # Apache-2.0 + +# TODO(yasufum) Remove following comments after those two packages have devstack script. +# NOTE(yasufum) We don't install tosca-parser and heat-translator of stable, +# but the latest revision from git repo for development. +# If you install packages, comment out two lines of `install_package_gitrepo` in +# `devstack/plugin.sh` in addition to activate following lines. +#heat-translator>=2.0.0 # Apache-2.0 +#tosca-parser>=1.6.1 # Apache-2.0 diff --git a/tox.ini b/tox.ini index 33ce79079..fdfa97ad8 100644 --- a/tox.ini +++ b/tox.ini @@ -6,10 +6,16 @@ ignore_basepython_conflict = True [testenv] basepython = python3 +# TODO(yasufum) Remove following definitions after tosca-parser and +# heat-translator have its own devstack scripts. +# * `UPPER_CONSTRAINTS_FILE` in setenv +# * `-r{toxinidir}/requirements-extra.txt` in [testenv], [testenv:docs] and +# [testenv:lower-constraints] sections. setenv = VIRTUAL_ENV={envdir} OS_LOG_CAPTURE={env:OS_LOG_CAPTURE:true} OS_STDOUT_CAPTURE={env:OS_STDOUT_CAPTURE:true} OS_STDERR_CAPTURE={env:OS_STDERR_CAPTURE:true} + UPPER_CONSTRAINTS_FILE={toxinidir}/upper-constraints.txt passenv = UPPER_CONSTRAINTS_FILE usedevelop = True whitelist_externals = rm @@ -18,6 +24,7 @@ install_command = deps = -c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} -r{toxinidir}/requirements.txt + -r{toxinidir}/requirements-extra.txt -r{toxinidir}/test-requirements.txt commands = stestr run --slowest --concurrency 1 {posargs} @@ -58,6 +65,7 @@ commands = python ./tools/check_i18n.py ./tacker [testenv:docs] deps = -r{toxinidir}/doc/requirements.txt + -r{toxinidir}/requirements-extra.txt commands = sphinx-build -W -b html doc/source doc/build/html oslopolicy-sample-generator --config-file=etc/tacker-policy-generator.conf @@ -77,6 +85,7 @@ commands = [testenv:cover] setenv = PYTHON=coverage run --source tacker --parallel-mode + UPPER_CONSTRAINTS_FILE={toxinidir}/upper-constraints.txt commands = stestr run {posargs} coverage combine @@ -117,6 +126,7 @@ deps = -c{toxinidir}/lower-constraints.txt -r{toxinidir}/test-requirements.txt -r{toxinidir}/requirements.txt + -r{toxinidir}/requirements-extra.txt [testenv:bindep] # Do not install any requirements. We want this to be fast and work even if diff --git a/upper-constraints.txt b/upper-constraints.txt new file mode 100644 index 000000000..4898f0969 --- /dev/null +++ b/upper-constraints.txt @@ -0,0 +1,566 @@ +ntlm-auth===1.5.0 +voluptuous===0.12.0 +chardet===3.0.4 +enum-compat===0.0.3 +rsa===4.6 +restructuredtext-lint===1.3.2 +netmiko===3.3.2 +sshtunnel===0.3.1 +PasteDeploy===2.1.1 +typing===3.7.4.3 +Routes===2.5.1 +rtslib-fb===2.1.74 +oslo.limit===1.2.1 +smmap===3.0.4 +confget===2.3.4 +XStatic-Angular-Bootstrap===2.5.0.0 +WebOb===1.8.6 +sphinxcontrib-actdiag===2.0.0 +pecan===1.3.3 +ryu===4.34 +os-api-ref===2.1.0 +python-ldap===3.3.1 +oslo.concurrency===4.3.1 +websocket-client===0.57.0 +osprofiler===3.4.0 +os-resource-classes===1.0.0 +tabulate===0.8.7 +python-ironic-inspector-client===4.4.0 +lxml===4.6.2 +vintage===0.4.1 +ntc-templates===1.6.0 +rst2txt===1.1.0 +setproctitle===1.2.1 +pytest===6.1.2 +python-slugify===4.0.1 +cursive===0.2.2 +oslo.service===2.4.0 +django-appconf===1.0.4 +pykerberos===1.2.1 +certifi===2020.11.8 +sphinxcontrib-nwdiag===2.0.0 +rbd-iscsi-client===0.1.8 +requests-aws===0.1.8 +alabaster===0.7.12 +pbr===5.5.1 +munch===2.5.0 +waiting===1.4.1 +attrs===20.3.0 +microversion-parse===1.0.1 +Pint===0.16.1 +oslo.i18n===5.0.1 +jsonpath-rw-ext===1.2.2 +python-mistralclient===4.1.1 +oslo.context===3.1.1 +python-senlinclient===2.2.0 +rcssmin===1.0.6 +pycadf===3.1.1 +grpcio===1.34.0 +pysendfile===2.0.1 +sniffio===1.2.0 +fixtures===3.0.0 +neutron-lib===2.7.0 +XStatic-FileSaver===1.3.2.0 +storage-interfaces===1.0.4 +persist-queue===0.5.1 +pystache===0.5.4 +XStatic-Font-Awesome===4.7.0.0 +nose===1.3.7 +nosehtmloutput===0.0.7 +waitress===1.4.4 +os-refresh-config===10.4.0 +pysnmp===4.4.12 +Mako===1.1.3 +pyScss===1.3.7 +sphinxcontrib-htmlhelp===1.0.3 +XStatic-jQuery===1.12.4.1 +ddt===1.4.1 +XStatic-Graphlib===2.1.7.0 +pyserial===3.5 +infi.dtypes.wwn===0.1.1 +python-freezerclient===4.1.0 +os-xenapi===0.3.4 +python-vitrageclient===4.2.0 +nosexcover===1.0.11 +krest===1.3.2 +psycopg2===2.8.6 +networkx===2.5 +bashate===2.0.0 +XStatic-Angular===1.5.8.0 +pyngus===2.3.1 +Pillow===8.0.1 +zuul-sphinx===0.5.0 +python-mimeparse===1.6.0 +tripleo-common===13.0.0 +Tempita===0.5.2 +ply===3.11 +google-api-core===1.23.0 +requests-toolbelt===0.9.1 +simplejson===3.17.2 +suds-jurko===0.6 +immutables===0.14;python_version=='3.6' +python-swiftclient===3.11.0 +pyOpenSSL===20.0.0 +monasca-common===3.2.0 +zeroconf===0.28.6 +scipy===1.5.4 +mypy-extensions===0.4.3 +rsd-lib===1.2.0 +XStatic-Jasmine===2.4.1.2 +googleapis-common-protos===1.52.0 +python-glanceclient===3.2.2 +pyinotify===0.9.6 +debtcollector===2.2.0 +requests-unixsocket===0.2.0 +croniter===0.3.36 +octavia-lib===2.2.0 +python-watcherclient===3.1.1 +MarkupSafe===1.1.1 +pypowervm===1.1.24 +doc8===0.8.1 +pymongo===3.11.2 +python-cloudkittyclient===4.1.0 +soupsieve===2.0.1 +sqlparse===0.4.1 +oslotest===4.4.1 +jsonpointer===2.0 +defusedxml===0.6.0 +netaddr===0.8.0 +pyghmi===1.5.19 +sphinxcontrib-blockdiag===2.0.0 +thrift===0.13.0 +gnocchiclient===7.0.6 +wcwidth===0.2.5 +sphinxcontrib.datatemplates===0.7.2 +jsonpath-rw===1.4.0 +prettytable===0.7.2 +vine===5.0.0 +taskflow===4.5.0 +traceback2===1.4.0 +arrow===0.17.0 +semantic-version===2.8.5 +virtualbmc===2.2.0 +deprecation===2.1.0 +SQLAlchemy===1.3.20 +pyroute2===0.5.14 +google-auth===1.23.0 +kazoo===2.8.0 +XStatic-roboto-fontface===0.5.0.0 +pyudev===0.22.0 +eventlet===0.29.1 +openstack-doc-tools===3.3.0 +oslo.messaging===12.6.0 +oslo.metrics===0.1.0 +jira===2.0.0 +extras===1.0.0 +PyJWT===1.7.1 +XStatic-lodash===4.16.4.2 +zVMCloudConnector===1.4.1 +paramiko===2.7.2 +ifaddr===0.1.7 +reno===3.2.0 +imagesize===1.2.0 +pydot===1.4.1 +urllib3===1.26.2 +graphviz===0.15 +PyKMIP===0.10.0 +whereto===0.4.0 +pywbem===1.1.2 +python-subunit===1.4.0 +tornado===6.1 +pycparser===2.20 +mock===3.0.5 +PyYAML===5.3.1 +beautifulsoup4===4.9.3 +os-net-config===13.0.0 +ovs===2.13.0 +cryptography===3.2.1 +httpcore===0.12.2 +URLObject===2.4.3 +nocasedict===1.0.1 +psycopg2-binary===2.8.6 +openstack-release-test===3.3.1 +validations-libs===1.0.4 +pylxd===2.2.11 +pycryptodomex===3.9.9 +anyjson===0.3.3 +requests-mock===1.8.0 +os-apply-config===11.3.0 +prometheus-client===0.9.0 +oslosphinx===4.18.0 +gunicorn===20.0.4 +storpool===5.5.0 +textfsm===1.1.0 +python-3parclient===4.2.11 +unittest2===1.1.0 +django-compressor===2.4 +libvirt-python===6.10.0 +python-zunclient===4.1.1 +tzlocal===2.1 +sphinxcontrib-jsmath===1.0.1 +python-novaclient===17.2.1 +pact===1.12.0 +bcrypt===3.2.0 +os-client-config===2.1.0 +XStatic-Angular-Gettext===2.4.1.0 +h11===0.11.0 +Pygments===2.7.2 +XStatic-Hogan===2.0.0.3 +XStatic-objectpath===1.2.1.0 +python-manilaclient===2.4.0 +sphinxcontrib-serializinghtml===1.1.4 +requests===2.25.0 +snowballstemmer===2.0.0 +Jinja2===2.11.2 +XStatic-Bootstrap-SCSS===3.4.1.0 +pyzabbix===0.8.2 +ptyprocess===0.6.0 +threadloop===1.0.2 +amqp===5.0.2 +websockify===0.9.0 +XStatic-JQuery.quicksearch===2.0.3.2 +mpmath===1.1.0 +python-binary-memcached===0.30.1 +django-debreach===2.0.1 +sphinx-feature-classification===1.1.0 +XStatic-JQuery-Migrate===1.2.1.2 +pytest-html===3.1.0 +appdirs===1.4.4 +tinyrpc===1.0.4 +google-auth-httplib2===0.0.4 +daiquiri===3.0.0 +influxdb===5.3.1 +funcparserlib===0.3.6 +passlib===1.7.4 +dib-utils===0.0.11 +cliff===3.5.0 +os-brick===4.1.0 +ansible-runner===1.4.6 +scp===0.13.3 +python-zaqarclient===2.0.1 +lockfile===0.12.2 +ldappool===2.4.1 +termcolor===1.1.0 +joblib===0.17.0 +google-api-python-client===1.12.8 +castellan===3.7.0 +oslo.versionedobjects===2.4.0 +enmerkar===0.7.1 +webcolors===1.11.1 +aodhclient===2.1.1 +autobahn===20.7.1 +SQLAlchemy-Utils===0.36.8 +retryz===0.1.9 +pluggy===0.13.1 +coverage===5.3 +freezegun===1.0.0 +toml===0.10.0 +pyperclip===1.8.1 +cassandra-driver===3.24.0 +XStatic-Angular-Schema-Form===0.8.13.0 +gabbi===2.0.4 +nwdiag===2.0.0 +XStatic-bootswatch===3.3.7.0 +pytest-xdist===2.1.0 +XStatic-JS-Yaml===3.8.1.0 +XStatic-term.js===0.0.7.0 +oslo.log===4.4.0 +nodeenv===1.5.0 +gossip===2.4.0 +importlib-metadata===3.1.1;python_version=='3.6' +python-searchlightclient===2.1.1 +oslo.middleware===4.1.1 +apipkg===1.5 +XStatic-mdi===1.6.50.2 +django-pyscss===2.0.2 +uritemplate===3.0.1 +docutils===0.15.2 +threadpoolctl===2.1.0 +os-ken===1.3.0 +ujson===4.0.1 +selenium===3.141.0 +python-glareclient===0.5.3 +mypy===0.790 +mistral-lib===2.4.0 +dogtag-pki===10.7.4.1 +XStatic-Angular-UUID===0.0.4.0 +purestorage===1.19.0 +sphinxcontrib-seqdiag===2.0.0 +os-win===5.3.0 +capacity===1.3.14 +retrying===1.3.3 +XStatic-Dagre===0.6.4.1 +pydotplus===2.0.2 +boto3===1.16.30 +jeepney===0.6.0 +stestr===3.1.0 +oslo.serialization===4.0.1 +warlock===1.3.3 +exabgp===4.2.11 +sphinxcontrib-httpdomain===1.7.0 +metalsmith===1.3.0 +s3transfer===0.3.3 +text-unidecode===1.3 +sphinxcontrib-svg2pdfconverter===1.1.0 +murano-pkg-check===0.3.0 +oslo.vmware===3.7.0 +XStatic-moment===2.8.4.3 +sqlalchemy-migrate===0.13.0 +gitdb===4.0.5 +python-monascaclient===2.2.1 +ldap3===2.8.1 +natsort===7.1.0 +requests-ntlm===1.1.0 +automaton===2.2.0 +os-service-types===1.7.0 +keyring===21.5.0 +testscenarios===0.5.0 +sphinxcontrib-pecanwsme===0.10.0 +sadisplay===0.4.9 +infinisdk===161.1.3 +packaging===20.4 +XStatic-Dagre-D3===0.4.17.0 +nose-exclude===0.5.0 +psutil===5.7.3 +py===1.9.0 +txaio===20.4.1 +elasticsearch===2.4.1 +django-nose===1.4.7 +XStatic-JQuery.TableSorter===2.14.5.2 +pifpaf===3.0.0 +pysmi===0.3.4 +blockdiag===2.0.1 +testtools===2.4.0 +infi.dtypes.iqn===0.4.0 +XStatic-tv4===1.2.7.0 +XStatic-JSEncrypt===2.3.1.1 +python-cinderclient===7.2.0 +keystonemiddleware===9.2.0 +django-formtools===2.2 +django-pymemcache===1.0.0 +python-ceilometerclient===2.9.0 +XStatic-Spin===1.2.5.3 +tap-as-a-service===7.0.0 +os-traits===2.4.0 +SecretStorage===3.3.0 +opentracing===2.4.0 +XStatic-Rickshaw===1.5.1.0 +iso8601===0.1.13 +tooz===2.8.0 +linecache2===1.0.0 +oauth2client===4.1.3 +idna===2.10 +python-karborclient===2.1.0 +yamlloader===0.5.5 +protobuf===3.14.0 +sushy===3.5.0 +python-neutronclient===7.2.1 +pika===1.1.0 +oslo.cache===2.6.1 +WebTest===2.0.35 +openstack.nose-plugin===0.11 +os-collect-config===11.0.1 +edgegrid-python===1.1.1 +python-qpid-proton===0.33.0 +python-octaviaclient===2.2.0 +pysaml2===6.3.1 +requests-oauthlib===1.3.0 +oslo.reports===2.2.0 +bitmath===1.3.3.1 +ceilometermiddleware===2.1.0 +python-nss===1.0.1 +testrepository===0.0.20 +sympy===1.7 +Logbook===1.5.3 +PyNaCl===1.4.0 +osc-lib===2.3.0 +python-consul===1.1.0 +seqdiag===2.0.0 +numpy===1.19.4 +msgpack===1.0.0 +Sphinx===3.3.1 +oslo.config===8.4.0 +tempest===25.0.0 +openstackdocstheme===2.2.7 +osc-placement===2.1.0 +zake===0.2.2 +python-rsdclient===1.0.2 +flux===1.3.5 +python-solumclient===3.2.0 +PyMySQL===0.10.1 +uhashring===1.2 +kubernetes===12.0.1 +httplib2===0.18.1 +betamax===0.8.1 +construct===2.10.56 +pytest-metadata===1.11.0 +pyparsing===2.4.7 +geomet===0.2.1.post1 +distlib===0.3.1 +XStatic-Moment-Timezone===0.5.22.0 +dogpile.cache===1.1.1 +python-barbicanclient===5.0.1 +salt===3002.2 +api-object-schema===2.0.0 +WSME===0.10.0 +proboscis===1.2.6.0 +oslo.upgradecheck===1.3.0 +stevedore===3.3.0 +pywinrm===0.4.1 +botocore===1.19.30 +xmltodict===0.12.0 +pyasn1===0.4.8 +oslo.rootwrap===6.2.0 +Django===2.2.17 +pexpect===4.8.0 +contextvars===2.4;python_version=='3.6' +cmd2===1.4.0 +python-json-logger===2.0.1 +redis===3.5.3 +jmespath===0.10.0 +click===7.1.2 +XStatic-smart-table===1.4.13.2 +kuryr-lib===2.2.0 +scrypt===0.8.17 +jsonpatch===1.28 +python-daemon===2.2.4 +typed-ast===1.4.1 +os-testr===2.0.0 +cotyledon===1.7.3 +xattr===0.9.7 +systemd-python===234 +python-memcached===1.59 +openstacksdk===0.52.0 +six===1.15.0 +dulwich===0.20.14 +dfs-sdk===1.2.26 +sentinels===1.0.0 +kombu===5.0.2 +distro===1.5.0 +zstd===1.4.5.1 +yaql===1.1.3 +requestsexceptions===1.4.0 +testresources===2.0.1 +falcon===2.0.0 +etcd3gw===0.2.5 +Flask-RESTful===0.3.8 +GitPython===3.1.11 +python-ironicclient===4.4.0 +XStatic===1.0.2 +XStatic-Angular-FileUpload===12.0.4.0 +python-openstackclient===5.4.0 +pyzmq===20.0.0 +nocaselist===1.0.3 +oslo.db===8.4.0 +simplegeneric===0.8.1 +python-pcre===0.7 +yappi===1.3.2 +dataclasses===0.8;python_version=='3.6' +abclient===0.2.3 +pymemcache===3.3.0 +wrapt===1.12.1 +oslo.privsep===2.4.0 +sphinxcontrib-apidoc===0.3.0 +oslo.policy===3.6.0 +python-muranoclient===2.1.1 +hvac===0.10.5 +pyeclib===1.6.0 +wsgi-intercept===1.9.2 +ndg-httpsclient===0.5.1 +pyrsistent===0.17.3 +repoze.lru===0.7 +rfc3986===1.4.0 +tenacity===6.2.0 +python-designateclient===4.1.0 +future===0.18.2 +Paste===3.5.0 +pytest-django===4.1.0 +jaeger-client===4.3.0 +XStatic-Json2yaml===0.1.1.0 +boto===2.49.0 +os-vif===2.3.0 +mitba===1.1.1 +python-masakariclient===6.2.0 +Werkzeug===1.0.1 +pyasn1-modules===0.2.8 +APScheduler===3.6.3 +monotonic===1.5 +python-troveclient===6.0.1 +etcd3===0.12.0 +cachez===0.1.2 +XStatic-Bootstrap-Datepicker===1.4.0.0 +CouchDB===1.2 +netifaces===0.10.9 +cachetools===4.1.1 +ws4py===0.5.1 +sphinxcontrib-qthelp===1.0.3 +keystoneauth1===4.3.0 +statsd===3.3.0 +XenAPI===2.14 +importlib-resources===3.3.0;python_version=='3.6' +python-keystoneclient===4.2.0 +ceilometer===15.0.0 +diskimage-builder===3.4.0 +python-magnumclient===3.3.0 +docker===4.4.0 +storops===1.2.8 +XStatic-Angular-lrdragndrop===1.0.2.4 +ovsdbapp===1.7.0 +aniso8601===8.1.0 +rjsmin===1.1.0 +icalendar===4.0.7 +decorator===4.4.2 +cffi===1.14.4 +futurist===2.3.0 +jsonschema===3.2.0 +sphinxcontrib-devhelp===1.0.2 +python-blazarclient===3.1.1 +alembic===1.4.3 +execnet===1.7.1 +glance-store===2.4.0 +sphinxcontrib-programoutput===0.16 +storpool.spopenstack===3.0.0 +sphinx-testing===1.0.1 +dnspython===1.16.0 +oauthlib===3.1.0 +Babel===2.9.0 +logutils===0.3.5 +zipp===3.4.0 +greenlet===0.4.17 +XStatic-Angular-Vis===4.16.0.0 +iniconfig===1.1.1 +confluent-kafka===1.5.0 +xvfbwrapper===0.2.9 +Flask===1.1.2 +httpx===0.16.1 +sqlalchemy-filters===0.12.0 +marathon===0.13.0 +sphinxcontrib-runcmd===0.2.0 +confspirator===0.2.2 +fasteners===0.14.1 +sortedcontainers===2.3.0 +filelock===3.0.12 +python-tackerclient===1.4.0 +python-heatclient===2.3.0 +kafka-python===2.0.2 +oslo.utils===4.7.0 +python-editor===1.0.4 +gitdb2===4.0.2 +requests-kerberos===0.12.0 +itsdangerous===1.1.0 +XStatic-jquery-ui===1.12.1.1 +monasca-statsd===2.1.0 +python-dateutil===2.8.1 +typing-extensions===3.7.4.3 +virtualenv===20.2.1 +colorama===0.4.4 +confetti===2.5.3 +ironic-lib===4.4.0 +pytz===2020.4 +pytest-forked===1.3.0 +XStatic-D3===3.5.17.0 +actdiag===2.0.0 +sysv-ipc===1.0.1 +sphinxcontrib-applehelp===1.0.2 +scikit-learn===0.23.2 +setuptools===50.3.2