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 e6cbe56d5..d6e936e6e 100644 --- a/devstack/lib/tacker +++ b/devstack/lib/tacker @@ -499,3 +499,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 4bd7d7656..2efd50642 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 55e5a6d9a..b56265390 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 276e54261..984116301 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