diff --git a/.gitignore b/.gitignore index 46150f8f..98ac93cc 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,9 @@ __pycache__/ # C extensions *.so +# Go +baclient_built + # Distribution / packaging .Python build/ @@ -108,3 +111,8 @@ ENV/ # Chart artifacts charts/drydock/charts charts/drydock/requirements.lock +/charts/*.tgz +/charts/*/charts +/charts/*/requirements.lock +/charts/deps/*/ +/*.tgz \ No newline at end of file diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 85d0cedf..845af27e 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -19,7 +19,7 @@ formats: # Optionally set the version of Python and requirements required to build your docs python: - version: 3.7 + version: 3.8 install: - requirements: doc/requirements-doc.txt - requirements: python/requirements-lock.txt diff --git a/.zuul.yaml b/.zuul.yaml index ba839ccc..b330506c 100644 --- a/.zuul.yaml +++ b/.zuul.yaml @@ -21,18 +21,15 @@ - airship-drydock-omni-test - airship-drydock-chart-build-gate - airship-drydock-chart-build-latest-htk - - airship-drydock-docker-build-gate-ubuntu_xenial - - airship-drydock-docker-build-gate-ubuntu_bionic + - airship-drydock-docker-build-gate-ubuntu_focal gate: jobs: - airship-drydock-omni-test - airship-drydock-chart-build-gate - - airship-drydock-docker-build-gate-ubuntu_xenial - - airship-drydock-docker-build-gate-ubuntu_bionic + - airship-drydock-docker-build-gate-ubuntu_focal post: jobs: - - airship-drydock-docker-publish-ubuntu_xenial - - airship-drydock-docker-publish-ubuntu_bionic + - airship-drydock-docker-publish-ubuntu_focal - drydock-upload-git-mirror - nodeset: @@ -41,6 +38,12 @@ - name: primary label: ubuntu-bionic +- nodeset: + name: airship-drydock-single-node-focal + nodes: + - name: primary + label: ubuntu-focal + - job: name: airship-drydock-omni-test description: | @@ -50,7 +53,7 @@ required-projects: - openstack/openstack-helm-infra timeout: 3600 - nodeset: airship-drydock-single-node + nodeset: airship-drydock-single-node-focal - job: name: airship-drydock-chart-build-gate @@ -58,7 +61,7 @@ Builds charts using pinned Helm toolkit. timeout: 900 run: tools/gate/playbooks/build-charts.yaml - nodeset: airship-drydock-single-node + nodeset: airship-drydock-single-node-focal - job: name: airship-drydock-chart-build-latest-htk @@ -67,46 +70,31 @@ timeout: 900 voting: false run: tools/gate/playbooks/build-charts.yaml - nodeset: airship-drydock-single-node + nodeset: airship-drydock-single-node-focal vars: HTK_COMMIT: master - job: - name: airship-drydock-docker-build-gate-ubuntu_xenial + name: airship-drydock-docker-build-gate-ubuntu_focal timeout: 1800 run: tools/gate/playbooks/docker-image-build.yaml - nodeset: airship-drydock-single-node + nodeset: airship-drydock-single-node-focal irrelevant-files: - '^doc/.*' - '^charts/.*' vars: publish: false - distro: ubuntu_xenial - tags: - dynamic: - patch_set: true - -- job: - name: airship-drydock-docker-build-gate-ubuntu_bionic - timeout: 1800 - run: tools/gate/playbooks/docker-image-build.yaml - nodeset: airship-drydock-single-node - irrelevant-files: - - '^doc/.*' - - '^charts/.*' - vars: - publish: false - distro: ubuntu_bionic + distro: ubuntu_focal tags: dynamic: patch_set: true - job: - name: airship-drydock-docker-publish-ubuntu_xenial + name: airship-drydock-docker-publish-ubuntu_focal timeout: 1800 run: tools/gate/playbooks/docker-image-build.yaml - nodeset: airship-drydock-single-node + nodeset: airship-drydock-single-node-focal secrets: - airship_drydock_quay_creds irrelevant-files: @@ -114,27 +102,7 @@ - '^charts/.*' vars: publish: true - distro: ubuntu_xenial - tags: - dynamic: - branch: true - commit: true - static: - - latest - -- job: - name: airship-drydock-docker-publish-ubuntu_bionic - timeout: 1800 - run: tools/gate/playbooks/docker-image-build.yaml - nodeset: airship-drydock-single-node - secrets: - - airship_drydock_quay_creds - irrelevant-files: - - '^doc/.*' - - '^charts/.*' - vars: - publish: true - distro: ubuntu_bionic + distro: ubuntu_focal tags: dynamic: branch: true diff --git a/Makefile b/Makefile index c0eea787..0232a029 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,7 @@ IMAGE_PREFIX ?= airshipit IMAGE_TAG ?= dev HELM := $(shell realpath $(BUILD_DIR))/helm UBUNTU_BASE_IMAGE ?= -DISTRO ?= ubuntu_bionic +DISTRO ?= ubuntu_focal PROXY ?= http://proxy.foo.com:8000 NO_PROXY ?= localhost,127.0.0.1,.svc.cluster.local USE_PROXY ?= false @@ -40,21 +40,16 @@ run_images: run_drydock # Run tests tests: pep8 security docs unit_tests test_baclient -# Install external (not managed by tox/pip) dependencies -external_dep: requirements-host.txt requirements-host-test.txt - sudo ./hostdeps.sh - touch external_dep - # Run unit and Postgres integration tests in coverage mode coverage_test: build_drydock tox -re cover # Run just unit tests -unit_tests: external_dep - tox -re py36 $(TESTS) +unit_tests: + tox -re py38 $(TESTS) # Run just DB integration tests -db_integration_tests: external_dep +db_integration_tests: tox -re integration $(TESTS) # Freeze full set of Python requirements @@ -91,27 +86,27 @@ helm-install: # Make targets intended for use by the primary targets above. -build_drydock: external_dep +build_drydock: export; tools/drydock_image_build.sh ifeq ($(PUSH_IMAGE), true) docker push $(IMAGE) endif # Make target for building bootaction signal client -build_baclient: external_dep - sudo ./tools/baclient_build.sh $(shell realpath go) $(shell realpath ${BUILD_DIR}) +build_baclient: + ./tools/baclient_build.sh $(shell realpath go) $(shell realpath ${BUILD_DIR}) touch ./baclient_built # Make target for testing bootaction signal client -test_baclient: external_dep build_baclient - GOPATH=$(shell realpath go) go test -v baclient +test_baclient: build_baclient + GOPATH=$(shell realpath go) GO111MODULE=off go test -v baclient docs: clean drydock_docs -security: external_dep +security: tox -e bandit -drydock_docs: external_dep render_diagrams genpolicy genconfig +drydock_docs: render_diagrams genpolicy genconfig tox -e docs render_diagrams: @@ -129,12 +124,14 @@ clean: rm -rf charts/drydock/charts rm -rf charts/drydock/requirements.lock -pep8: external_dep +pep8: tox -e pep8 helm_lint: helm-init + $(HELM) dep up charts/drydock $(HELM) lint charts/drydock + .PHONY: build_baclient build_drydock charts clean coverage_test \ db_integration_tests docs drydock drydock_docs dry-run genconfig \ genpolicy helm-init helm-install helm_lint images lint pep8 \ diff --git a/bindep.txt b/bindep.txt new file mode 100644 index 00000000..0412a13d --- /dev/null +++ b/bindep.txt @@ -0,0 +1,25 @@ +# These are host packages needed for Drydock +# that don't come on a minimal Ubuntu install +build-essential +curl +git +golang-go +libffi-dev +libkrb5-dev +libpq-dev +libre2-dev +libsasl2-dev +libssl-dev +libvirt-dev +libzmq3-dev +netbase +pkg-config +python3-dev +python3-pip +python3-setuptools +ssh +tox + +# PlantUML is used for documentation builds, graphviz is it's soft dependancy +plantuml +graphviz \ No newline at end of file diff --git a/charts/deps/.gitkeep b/charts/deps/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/charts/drydock/requirements.yaml b/charts/drydock/requirements.yaml index d3081a71..8594a246 100755 --- a/charts/drydock/requirements.yaml +++ b/charts/drydock/requirements.yaml @@ -14,5 +14,5 @@ dependencies: - name: helm-toolkit - repository: http://localhost:8879/charts + repository: file://../deps/helm-toolkit version: ">= 0.1.0" diff --git a/charts/drydock/values.yaml b/charts/drydock/values.yaml index a2145ef7..c60bf2cd 100644 --- a/charts/drydock/values.yaml +++ b/charts/drydock/values.yaml @@ -35,7 +35,7 @@ images: ks_user: docker.io/openstackhelm/heat:newton ks_service: docker.io/openstackhelm/heat:newton ks_endpoints: docker.io/openstackhelm/heat:newton - drydock_db_init: docker.io/postgres:9.5 + drydock_db_init: docker.io/postgres:14.6 drydock_db_cleanup: quay.io/airshipit/drydock:master drydock_db_sync: quay.io/airshipit/drydock:master pull_policy: "IfNotPresent" diff --git a/doc/requirements-doc.txt b/doc/requirements-doc.txt index 17d655b1..c17209f4 100644 --- a/doc/requirements-doc.txt +++ b/doc/requirements-doc.txt @@ -1,4 +1,5 @@ -sphinx>=1.6.2 -sphinx_rtd_theme==0.2.4 -oslo.versionedobjects -falcon +sphinx_rtd_theme==1.2.0 +pylibyaml==0.1.0 +oslo_versionedobjects==3.1.0 +falcon==3.1.1 +keystoneauth1==5.1.2 \ No newline at end of file diff --git a/doc/source/_static/drydock.conf.sample b/doc/source/_static/drydock.conf.sample index fdf4c39a..323d4df9 100644 --- a/doc/source/_static/drydock.conf.sample +++ b/doc/source/_static/drydock.conf.sample @@ -78,7 +78,7 @@ # Domain name containing project (string value) #project_domain_name = -# Trust ID (string value) +# ID of the trust to use as a trustee use (string value) #trust_id = # Optional domain ID to use with v3 and v2 parameters. It will be used for both @@ -114,15 +114,35 @@ # Complete "public" Identity API endpoint. This endpoint should not be an # "admin" endpoint, as it should be accessible by all end users. Unauthenticated # clients are redirected to this endpoint to authenticate. Although this -# endpoint should ideally be unversioned, client support in the wild varies. -# If you're using a versioned v2 endpoint here, then this should *not* be the -# same endpoint the service user utilizes for validating tokens, because normal -# end users may not be able to reach that endpoint. (string value) +# endpoint should ideally be unversioned, client support in the wild varies. If +# you're using a versioned v2 endpoint here, then this should *not* be the same +# endpoint the service user utilizes for validating tokens, because normal end +# users may not be able to reach that endpoint. (string value) +# Deprecated group/name - [keystone_authtoken]/auth_uri +#www_authenticate_uri = + +# DEPRECATED: Complete "public" Identity API endpoint. This endpoint should not +# be an "admin" endpoint, as it should be accessible by all end users. +# Unauthenticated clients are redirected to this endpoint to authenticate. +# Although this endpoint should ideally be unversioned, client support in the +# wild varies. If you're using a versioned v2 endpoint here, then this should +# *not* be the same endpoint the service user utilizes for validating tokens, +# because normal end users may not be able to reach that endpoint. This option +# is deprecated in favor of www_authenticate_uri and will be removed in the S +# release. (string value) +# This option is deprecated for removal since Queens. +# Its value may be silently ignored in the future. +# Reason: The auth_uri option is deprecated in favor of www_authenticate_uri and +# will be removed in the S release. #auth_uri = -# API version of the admin Identity API endpoint. (string value) +# API version of the Identity API endpoint. (string value) #auth_version = +# Interface to use for the Identity API endpoint. Valid values are "public", +# "internal" (default) or "admin". (string value) +#interface = internal + # Do not handle authorization requests within the middleware, but delegate the # authorization decision to downstream WSGI components. (boolean value) #delay_auth_decision = false @@ -157,9 +177,6 @@ # The region in which the identity server can be found. (string value) #region_name = -# Directory used to cache files related to PKI tokens. (string value) -#signing_dir = - # Optionally specify a list of memcached server(s) to use for caching. If left # undefined, tokens will instead be cached in-process. (list value) # Deprecated group/name - [keystone_authtoken]/memcache_servers @@ -170,12 +187,6 @@ # -1 to disable caching completely. (integer value) #token_cache_time = 300 -# Determines the frequency at which the list of revoked tokens is retrieved from -# the Identity service (in seconds). A high number of revocation events combined -# with a low cache duration may significantly reduce performance. Only valid for -# PKI tokens. (integer value) -#revocation_cache_time = 10 - # (Optional) If defined, indicate whether token data should be authenticated or # authenticated and encrypted. If MAC, token data is authenticated (with HMAC) # in the cache. If ENCRYPT, token data is encrypted and authenticated in the @@ -211,9 +222,9 @@ # client connection from the pool. (integer value) #memcache_pool_conn_get_timeout = 10 -# (Optional) Use the advanced (eventlet safe) memcached client pool. The -# advanced pool will only work under python 2.x. (boolean value) -#memcache_use_advanced_pool = false +# (Optional) Use the advanced (eventlet safe) memcached client pool. (boolean +# value) +#memcache_use_advanced_pool = true # (Optional) Indicate whether to set the X-Service-Catalog header. If False, # middleware will not ask for service catalog on token validation and will not @@ -229,19 +240,23 @@ # value) #enforce_token_bind = permissive -# If true, the revocation list will be checked for cached tokens. This requires -# that PKI tokens are configured on the identity server. (boolean value) -#check_revocations_for_cached = false +# A choice of roles that must be present in a service token. Service tokens are +# allowed to request that an expired token can be used and so this check should +# tightly control that only actual services should be sending this token. Roles +# here are applied as an ANY check so any role in this list must be present. For +# backwards compatibility reasons this currently only affects the allow_expired +# check. (list value) +#service_token_roles = service -# Hash algorithms to use for hashing PKI tokens. This may be a single algorithm -# or multiple. The algorithms are those supported by Python standard -# hashlib.new(). The hashes will be tried in the order given, so put the -# preferred one first for performance. The result of the first hash will be -# stored in the cache. This will typically be set to multiple values only while -# migrating from a less secure algorithm to a more secure one. Once all the old -# tokens are expired this option should be set to a single value for better -# performance. (list value) -#hash_algorithms = md5 +# For backwards compatibility reasons we must let valid service tokens pass that +# don't pass the service_token_roles check as valid. Setting this true will +# become the default in a future release and should be enabled if possible. +# (boolean value) +#service_token_roles_required = false + +# The name or type of the service as it appears in the service catalog. This is +# used to validate tokens that have restricted access rules. (string value) +#service_type = # Authentication type to load (string value) # Deprecated group/name - [keystone_authtoken]/auth_plugin @@ -335,7 +350,28 @@ # From oslo.policy # -# The file that defines policies. (string value) +# This option controls whether or not to enforce scope when evaluating policies. +# If ``True``, the scope of the token used in the request is compared to the +# ``scope_types`` of the policy being enforced. If the scopes do not match, an +# ``InvalidScope`` exception will be raised. If ``False``, a message will be +# logged informing operators that policies are being invoked with mismatching +# scope. (boolean value) +#enforce_scope = false + +# This option controls whether or not to use old deprecated defaults when +# evaluating policies. If ``True``, the old deprecated defaults are not going to +# be evaluated. This means if any existing token is allowed for old defaults but +# is disallowed for new defaults, it will be disallowed. It is encouraged to +# enable this flag along with the ``enforce_scope`` flag so that you can get the +# benefits of new defaults and ``scope_type`` together. If ``False``, the +# deprecated policy check string is logically OR'd with the new policy check +# string, allowing for a graceful upgrade experience between releases with new +# policies, which is the default behavior. (boolean value) +#enforce_new_defaults = false + +# The relative or absolute path of a file that maps roles to permissions for a +# given service. Relative paths must be specified in relation to the +# configuration file setting this option. (string value) #policy_file = policy.json # Default rule. Enforced when a requested rule is not found. (string value) @@ -348,6 +384,25 @@ # valued) #policy_dirs = policy.d +# Content Type to send and receive data for REST based policy check (string +# value) +# Possible values: +# application/x-www-form-urlencoded - +# application/json - +#remote_content_type = application/x-www-form-urlencoded + +# server identity verification for REST based policy check (boolean value) +#remote_ssl_verify_server_crt = false + +# Absolute path to ca cert file for REST based policy check (string value) +#remote_ssl_ca_crt_file = + +# Absolute path to client cert for REST based policy check (string value) +#remote_ssl_client_crt_file = + +# Absolute path client key file REST based policy check (string value) +#remote_ssl_client_key_file = + [plugins] diff --git a/doc/source/conf.py b/doc/source/conf.py index 16e1c81b..38fe85f9 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -77,7 +77,7 @@ release = u'0.1.0' # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. -language = None +language = 'en' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. diff --git a/doc/source/images/architecture.png b/doc/source/images/architecture.png index 04dc208c..71b1451d 100644 Binary files a/doc/source/images/architecture.png and b/doc/source/images/architecture.png differ diff --git a/doc/source/images/basic_task_sequence.png b/doc/source/images/basic_task_sequence.png index a01ec0dd..e784adb6 100644 Binary files a/doc/source/images/basic_task_sequence.png and b/doc/source/images/basic_task_sequence.png differ diff --git a/etc/drydock/drydock.conf.sample b/etc/drydock/drydock.conf.sample index fdf4c39a..323d4df9 100644 --- a/etc/drydock/drydock.conf.sample +++ b/etc/drydock/drydock.conf.sample @@ -78,7 +78,7 @@ # Domain name containing project (string value) #project_domain_name = -# Trust ID (string value) +# ID of the trust to use as a trustee use (string value) #trust_id = # Optional domain ID to use with v3 and v2 parameters. It will be used for both @@ -114,15 +114,35 @@ # Complete "public" Identity API endpoint. This endpoint should not be an # "admin" endpoint, as it should be accessible by all end users. Unauthenticated # clients are redirected to this endpoint to authenticate. Although this -# endpoint should ideally be unversioned, client support in the wild varies. -# If you're using a versioned v2 endpoint here, then this should *not* be the -# same endpoint the service user utilizes for validating tokens, because normal -# end users may not be able to reach that endpoint. (string value) +# endpoint should ideally be unversioned, client support in the wild varies. If +# you're using a versioned v2 endpoint here, then this should *not* be the same +# endpoint the service user utilizes for validating tokens, because normal end +# users may not be able to reach that endpoint. (string value) +# Deprecated group/name - [keystone_authtoken]/auth_uri +#www_authenticate_uri = + +# DEPRECATED: Complete "public" Identity API endpoint. This endpoint should not +# be an "admin" endpoint, as it should be accessible by all end users. +# Unauthenticated clients are redirected to this endpoint to authenticate. +# Although this endpoint should ideally be unversioned, client support in the +# wild varies. If you're using a versioned v2 endpoint here, then this should +# *not* be the same endpoint the service user utilizes for validating tokens, +# because normal end users may not be able to reach that endpoint. This option +# is deprecated in favor of www_authenticate_uri and will be removed in the S +# release. (string value) +# This option is deprecated for removal since Queens. +# Its value may be silently ignored in the future. +# Reason: The auth_uri option is deprecated in favor of www_authenticate_uri and +# will be removed in the S release. #auth_uri = -# API version of the admin Identity API endpoint. (string value) +# API version of the Identity API endpoint. (string value) #auth_version = +# Interface to use for the Identity API endpoint. Valid values are "public", +# "internal" (default) or "admin". (string value) +#interface = internal + # Do not handle authorization requests within the middleware, but delegate the # authorization decision to downstream WSGI components. (boolean value) #delay_auth_decision = false @@ -157,9 +177,6 @@ # The region in which the identity server can be found. (string value) #region_name = -# Directory used to cache files related to PKI tokens. (string value) -#signing_dir = - # Optionally specify a list of memcached server(s) to use for caching. If left # undefined, tokens will instead be cached in-process. (list value) # Deprecated group/name - [keystone_authtoken]/memcache_servers @@ -170,12 +187,6 @@ # -1 to disable caching completely. (integer value) #token_cache_time = 300 -# Determines the frequency at which the list of revoked tokens is retrieved from -# the Identity service (in seconds). A high number of revocation events combined -# with a low cache duration may significantly reduce performance. Only valid for -# PKI tokens. (integer value) -#revocation_cache_time = 10 - # (Optional) If defined, indicate whether token data should be authenticated or # authenticated and encrypted. If MAC, token data is authenticated (with HMAC) # in the cache. If ENCRYPT, token data is encrypted and authenticated in the @@ -211,9 +222,9 @@ # client connection from the pool. (integer value) #memcache_pool_conn_get_timeout = 10 -# (Optional) Use the advanced (eventlet safe) memcached client pool. The -# advanced pool will only work under python 2.x. (boolean value) -#memcache_use_advanced_pool = false +# (Optional) Use the advanced (eventlet safe) memcached client pool. (boolean +# value) +#memcache_use_advanced_pool = true # (Optional) Indicate whether to set the X-Service-Catalog header. If False, # middleware will not ask for service catalog on token validation and will not @@ -229,19 +240,23 @@ # value) #enforce_token_bind = permissive -# If true, the revocation list will be checked for cached tokens. This requires -# that PKI tokens are configured on the identity server. (boolean value) -#check_revocations_for_cached = false +# A choice of roles that must be present in a service token. Service tokens are +# allowed to request that an expired token can be used and so this check should +# tightly control that only actual services should be sending this token. Roles +# here are applied as an ANY check so any role in this list must be present. For +# backwards compatibility reasons this currently only affects the allow_expired +# check. (list value) +#service_token_roles = service -# Hash algorithms to use for hashing PKI tokens. This may be a single algorithm -# or multiple. The algorithms are those supported by Python standard -# hashlib.new(). The hashes will be tried in the order given, so put the -# preferred one first for performance. The result of the first hash will be -# stored in the cache. This will typically be set to multiple values only while -# migrating from a less secure algorithm to a more secure one. Once all the old -# tokens are expired this option should be set to a single value for better -# performance. (list value) -#hash_algorithms = md5 +# For backwards compatibility reasons we must let valid service tokens pass that +# don't pass the service_token_roles check as valid. Setting this true will +# become the default in a future release and should be enabled if possible. +# (boolean value) +#service_token_roles_required = false + +# The name or type of the service as it appears in the service catalog. This is +# used to validate tokens that have restricted access rules. (string value) +#service_type = # Authentication type to load (string value) # Deprecated group/name - [keystone_authtoken]/auth_plugin @@ -335,7 +350,28 @@ # From oslo.policy # -# The file that defines policies. (string value) +# This option controls whether or not to enforce scope when evaluating policies. +# If ``True``, the scope of the token used in the request is compared to the +# ``scope_types`` of the policy being enforced. If the scopes do not match, an +# ``InvalidScope`` exception will be raised. If ``False``, a message will be +# logged informing operators that policies are being invoked with mismatching +# scope. (boolean value) +#enforce_scope = false + +# This option controls whether or not to use old deprecated defaults when +# evaluating policies. If ``True``, the old deprecated defaults are not going to +# be evaluated. This means if any existing token is allowed for old defaults but +# is disallowed for new defaults, it will be disallowed. It is encouraged to +# enable this flag along with the ``enforce_scope`` flag so that you can get the +# benefits of new defaults and ``scope_type`` together. If ``False``, the +# deprecated policy check string is logically OR'd with the new policy check +# string, allowing for a graceful upgrade experience between releases with new +# policies, which is the default behavior. (boolean value) +#enforce_new_defaults = false + +# The relative or absolute path of a file that maps roles to permissions for a +# given service. Relative paths must be specified in relation to the +# configuration file setting this option. (string value) #policy_file = policy.json # Default rule. Enforced when a requested rule is not found. (string value) @@ -348,6 +384,25 @@ # valued) #policy_dirs = policy.d +# Content Type to send and receive data for REST based policy check (string +# value) +# Possible values: +# application/x-www-form-urlencoded - +# application/json - +#remote_content_type = application/x-www-form-urlencoded + +# server identity verification for REST based policy check (boolean value) +#remote_ssl_verify_server_crt = false + +# Absolute path to ca cert file for REST based policy check (string value) +#remote_ssl_ca_crt_file = + +# Absolute path to client cert for REST based policy check (string value) +#remote_ssl_client_crt_file = + +# Absolute path client key file REST based policy check (string value) +#remote_ssl_client_key_file = + [plugins] diff --git a/go/src/baclient/go.mod b/go/src/baclient/go.mod new file mode 100644 index 00000000..57cf840c --- /dev/null +++ b/go/src/baclient/go.mod @@ -0,0 +1 @@ +module baclient \ No newline at end of file diff --git a/hostdeps.sh b/hostdeps.sh deleted file mode 100755 index 1fbe4552..00000000 --- a/hostdeps.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash - -# Install host-level package dependencies -# needed for local testing -set -x - -if [[ ! -z $(uname -a | grep Ubuntu) ]] -then - apt-get update - installed_pkgs=$(dpkg --get-selections | awk '!/deinstall/ { gsub(/:.*/,"",$1); print $1 }') - set -a added_pkgs - for reqfile in $(ls requirements-host*.txt) - do - for l in $(grep -vE '(^ *#)|(^$)' "${reqfile}") - do - # Do extra magic to support a list of alternative packages separated by '|' - # none of the packages are found, install the first one listed - IFS='|' read -a pkgalts <<< "${l}" - pkgfound=0 - for a in "${pkgalts[@]}" - do - if grep -qE "^${a}$" <<< "${installed_pkgs}" - then - pkgfound=1 - break - fi - done - if [[ "${pkgfound}" -eq 0 ]] - then - added_pkgs+=("${pkgalts[0]}") - fi - done - done - if [[ ${#added_pkgs[@]} -gt 0 ]] - then - DEBIAN_FRONTEND=noninteractive apt-get \ - -o Dpkg::Options::="--force-confdef" \ - -o Dpkg::Options::="--force-confold" \ - install -y --no-install-recommends "${added_pkgs[@]}" - fi -else - echo "Only support testing on Ubuntu hosts at this time." -fi diff --git a/images/drydock/Dockerfile.ubuntu_xenial b/images/drydock/Dockerfile.ubuntu_focal similarity index 67% rename from images/drydock/Dockerfile.ubuntu_xenial rename to images/drydock/Dockerfile.ubuntu_focal index 73e72c62..803ded7e 100644 --- a/images/drydock/Dockerfile.ubuntu_xenial +++ b/images/drydock/Dockerfile.ubuntu_focal @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG FROM=ubuntu:16.04 +ARG FROM=ubuntu:20.04 FROM ${FROM} AS baclient_builder ARG UBUNTU_REPO=http://archive.ubuntu.com/ubuntu @@ -23,16 +23,23 @@ ENV container docker ENV LC_ALL C.UTF-8 ENV LANG C.UTF-8 -# Copy direct dependency requirements only to build a dependency layer -RUN echo "deb ${UBUNTU_REPO} xenial main restricted universe multiverse" > /etc/apt/sources.list; \ - echo "deb ${UBUNTU_REPO} xenial-security main restricted universe multiverse" >> /etc/apt/sources.list; \ - echo "deb ${UBUNTU_REPO} xenial-updates main restricted universe multiverse" >> /etc/apt/sources.list; \ - cat /etc/apt/sources.list; \ - echo "APT::Get::AllowUnauthenticated ${ALLOW_UNAUTHENTICATED};" >> /etc/apt/apt.conf.d/00-local-mirrors; +COPY ./bindep.txt /tmp/drydock/ +WORKDIR /tmp/drydock +RUN apt update \ + && apt install -y --allow-downgrades \ + python3 \ + python3-dev \ + python3-pip \ + python3-venv \ + python3-setuptools \ + && DEBIAN_FRONTEND=noninteractive apt install --no-install-recommends -y tzdata \ + && pip3 install bindep \ + && bindep -f /tmp/drydock/bindep.txt --brief | xargs apt install -y COPY ./tools/baclient_build.sh /tmp/drydock/ COPY ./go /tmp/drydock/go + WORKDIR /tmp/drydock RUN ./baclient_build.sh /tmp/drydock/go /tmp/drydock/baclient @@ -73,29 +80,36 @@ ENV PORT 9000 ENV LC_ALL C.UTF-8 ENV LANG C.UTF-8 -# Copy direct dependency requirements only to build a dependency layer -RUN echo "deb ${UBUNTU_REPO} xenial main restricted universe multiverse" > /etc/apt/sources.list; \ - echo "deb ${UBUNTU_REPO} xenial-security main restricted universe multiverse" >> /etc/apt/sources.list; \ - echo "deb ${UBUNTU_REPO} xenial-updates main restricted universe multiverse" >> /etc/apt/sources.list; \ - cat /etc/apt/sources.list; \ - echo "APT::Get::AllowUnauthenticated ${ALLOW_UNAUTHENTICATED};" >> /etc/apt/apt.conf.d/00-local-mirrors; - -COPY ./requirements-host.txt /tmp/drydock/ -COPY ./hostdeps.sh /tmp/drydock +# COPY ./bindep-python.txt /tmp/drydock/ WORKDIR /tmp/drydock -RUN ./hostdeps.sh; \ - rm -r /var/lib/apt/lists/* +RUN DEBIAN_FRONTEND=noninteractive \ + apt update \ + && DEBIAN_FRONTEND=noninteractive \ + apt install -y \ + --allow-downgrades \ + --no-install-recommends \ + python3-dev \ + python3-pip \ + python3-setuptools \ + pkg-config \ + libvirt-dev \ + libssl-dev \ + gcc \ + ssh\ + curl \ + netbase \ + && rm -r /var/lib/apt/lists/* # Install LibYAML ENV LD_LIBRARY_PATH=/usr/local/lib COPY --from=baclient_builder /usr/local/lib /usr/local/lib COPY --from=baclient_builder /usr/local/include/yaml.h /usr/local/include/yaml.h -RUN python3 -m pip install -U 'pip<21.0' COPY ./python/requirements-lock.txt /tmp/drydock/ -RUN cat /tmp/drydock/requirements-lock.txt | xargs -d '\n' \ - -l1 pip3 -vv install --no-cache-dir +RUN pip3 install \ + --no-cache-dir \ + -r /tmp/drydock/requirements-lock.txt COPY ./python /tmp/drydock/python WORKDIR /tmp/drydock/python diff --git a/python/drydock_provisioner/control/api.py b/python/drydock_provisioner/control/api.py index beafd5b7..07916462 100644 --- a/python/drydock_provisioner/control/api.py +++ b/python/drydock_provisioner/control/api.py @@ -45,7 +45,7 @@ def start_api(state_manager=None, ingester=None, orchestrator=None): part input :param orchestrator: Instance of drydock_provisioner.orchestrator.Orchestrator for managing tasks """ - control_api = falcon.API( + control_api = falcon.App( request_type=DrydockRequest, middleware=[ AuthMiddleware(), diff --git a/python/requirements-direct.txt b/python/requirements-direct.txt index 3fe51656..7909bfbb 100644 --- a/python/requirements-direct.txt +++ b/python/requirements-direct.txt @@ -1,29 +1,30 @@ -pylibyaml~=0.1 -PyYAML~=5.3.1 -pyghmi==1.0.18 -netaddr -falcon -oslo.versionedobjects==1.23.0 -requests -oauthlib -uwsgi==2.0.17.1 -pymongo==3.6.1 -oslo.config==7.0.0 +# edited with compartibility with shipyard's apache-airflow 1.10.15 +alembic==1.4.3 +Beaker==1.12.0 click==6.7 -PasteDeploy==1.5.2 -PTable==0.9.2 -keystonemiddleware==4.9.1 -oslo.policy==1.22.1 -iso8601==0.1.11 -keystoneauth1==3.18.0 -alembic==0.8.2 -sqlalchemy==1.2.8 +defusedxml===0.6.0 +falcon==3.1.1 +iso8601==0.1.13 +jinja2==3.0.3 +jsonschema==3.2.0 +keystoneauth1==5.1.1 +keystonemiddleware==10.2.0 +libvirt-python==9.2.0 +netaddr==0.8.0 +oauthlib==3.1.0 +oslo.config==8.7.1 +oslo.policy==3.10.1 +oslo.versionedobjects==2.4.0 +Paste==3.5.0 +PasteDeploy==3.0.1 psycopg2-binary==2.8.4 -jsonschema==2.6.0 -jsonschema>=3.0.1<4 -jinja2==2.10 +PTable==0.9.2 +pyghmi==1.5.60 +pylibyaml==0.1.0 +pymongo==3.10.1 +PyYAML==5.4.1 +redfish==3.1.9 +requests==2.23.0 +SQLAlchemy==1.2.8 ulid2==0.1.1 -defusedxml===0.5.0 -libvirt-python==3.10.0 -beaker==1.9.1 -redfish==2.0.1 +uWSGI==2.0.21 diff --git a/python/requirements-lock.txt b/python/requirements-lock.txt index e2b83120..b52049b5 100644 --- a/python/requirements-lock.txt +++ b/python/requirements-lock.txt @@ -1,82 +1,132 @@ -alembic==0.8.2 -amqp==2.6.0 -Babel==2.6.0 -Beaker==1.9.1 -cachetools==2.1.0 -certifi==2018.8.24 +alabaster==0.7.13 +alembic==1.4.3 +amqp==5.1.1 +attrs==22.2.0 +Babel==2.12.1 +bandit==1.7.5 +bcrypt==4.0.1 +Beaker==1.12.0 +cachetools==5.3.0 +certifi==2022.12.7 +cffi==1.15.1 chardet==3.0.4 click==6.7 -contextlib2==0.5.5 -debtcollector==1.20.0 -defusedxml==0.5.0 -dnspython==1.15.0 -eventlet==0.24.1 -falcon==1.4.1 -fasteners==0.14.1 -futurist==1.7.0 -greenlet==0.4.15 -idna==2.7 -iso8601==0.1.11 -Jinja2==2.10 -jsonschema>=3.0.1<4 -keystoneauth1==3.18.0 -keystonemiddleware==4.9.1 -kombu==4.6.11 -libvirt-python==3.10.0 -Mako==1.0.7 -MarkupSafe~=1.1.1 -monotonic==1.5 -msgpack==0.5.6 -netaddr==0.7.19 -netifaces==0.10.7 -oauthlib==2.1.0 -oslo.concurrency==3.28.0 -oslo.config==7.0.0 -oslo.context==2.21.0 -oslo.i18n==3.22.0 -oslo.log==3.45.2 -oslo.messaging==8.1.1 -oslo.middleware==3.36.0 -oslo.policy==1.22.1 -oslo.serialization==2.29.2 -oslo.service==1.32.0 -oslo.utils==3.42.1 -oslo.versionedobjects==1.23.0 -Paste==2.0.3 -PasteDeploy==1.5.2 -pbr==5.4.5 -pip==18.0 -positional==1.2.1 -prettytable==0.7.2 +coverage==7.2.3 +cryptography==40.0.1 +debtcollector==2.5.0 +decorator==5.1.1 +defusedxml==0.6.0 +dnspython==2.3.0 +docutils==0.19 +dogpile.cache==1.1.8 +eventlet==0.33.3 +falcon==3.1.1 +fasteners==0.18 +fixtures==4.0.1 +flake8==6.0.0 +futurist==2.4.1 +gitdb==4.0.10 +GitPython==3.1.31 +greenlet==2.0.2 +idna==2.10 +imagesize==1.4.1 +iniconfig==2.0.0 +iso8601==0.1.13 +Jinja2==3.0.3 +jsonpatch==1.32 +jsonpath-rw==1.4.0 +jsonpointer==2.3 +jsonschema==3.2.0 +keystoneauth1==5.1.1 +keystonemiddleware==10.2.0 +kombu==5.2.4 +libvirt-python==9.2.0 +Mako==1.2.4 +markdown-it-py==2.2.0 +MarkupSafe==2.1.2 +mccabe==0.7.0 +mdurl==0.1.2 +mock==5.0.1 +msgpack==1.0.5 +netaddr==0.8.0 +netifaces==0.11.0 +oauthlib==3.1.0 +os-service-types==1.7.0 +oslo.cache==3.3.1 +oslo.concurrency==5.1.1 +oslo.config==8.7.1 +oslo.context==5.1.1 +oslo.i18n==6.0.0 +oslo.log==5.2.0 +oslo.messaging==14.2.0 +oslo.metrics==0.6.0 +oslo.middleware==5.1.1 +oslo.policy==3.10.1 +oslo.serialization==5.1.1 +oslo.service==3.1.1 +oslo.utils==6.1.0 +oslo.versionedobjects==2.4.0 +packaging==23.0 +Paste==3.5.0 +PasteDeploy==3.0.1 +pbr==5.11.1 +pip==23.0.1 +pluggy==1.0.0 +ply==3.11 +prometheus-client==0.16.0 psycopg2-binary==2.8.4 PTable==0.9.2 -pycadf==2.8.0 -pycrypto==2.6.1 -pyghmi==1.0.18 +py==1.11.0 +pycadf==3.1.1 +pycodestyle==2.10.0 +pycparser==2.21 +pyflakes==3.0.1 +pyghmi==1.5.60 +Pygments==2.14.0 pylibyaml==0.1.0 -pymongo==3.6.1 -pyparsing==2.2.1 -python-dateutil==2.8.1 -python-editor==1.0.3 -python-keystoneclient==3.22.0 -python-mimeparse==1.6.0 -pytz==2018.5 -PyYAML==5.3.1 -redfish==2.0.1 +pymongo==3.10.1 +pyparsing==3.0.9 +pyrsistent==0.19.3 +pytest==6.2.5 +pytest-cov==4.0.0 +pytest-mock==3.10.0 +python-dateutil==2.8.2 +python-editor==1.0.4 +python-keystoneclient==5.1.0 +pytz==2023.3 +PyYAML==5.4.1 +redfish==3.1.9 repoze.lru==0.7 -requests==2.22.0 -rfc3986==1.2.0 -Routes==2.4.1 -setuptools==40.4.3 -six==1.15.0 +requests==2.23.0 +requests-toolbelt==0.10.1 +requests-unixsocket==0.3.0 +responses==0.23.1 +rfc3986==2.0.0 +rich==13.3.3 +Routes==2.5.1 +setuptools==56.0.0 +six==1.16.0 +smmap==5.0.0 +snowballstemmer==2.2.0 +Sphinx==5.3.0 +sphinxcontrib-applehelp==1.0.4 +sphinxcontrib-devhelp==1.0.2 +sphinxcontrib-htmlhelp==2.0.1 +sphinxcontrib-jsmath==1.0.1 +sphinxcontrib-qthelp==1.0.3 +sphinxcontrib-serializinghtml==1.1.5 SQLAlchemy==1.2.8 -statsd==3.3.0 -stevedore==1.29.0 -tenacity==5.0.2 +statsd==4.0.1 +stevedore==5.0.0 +toml==0.10.2 +tomli==2.0.1 +types-PyYAML==6.0.12.9 ulid2==0.1.1 -urllib3==1.25.9 -uWSGI==2.0.15 -vine==1.1.4 -WebOb==1.8.2 -wheel==0.31.1 -wrapt==1.10.11 +urllib3==1.25.11 +uWSGI==2.0.21 +vine==5.0.0 +WebOb==1.8.7 +wheel==0.38.4 +wrapt==1.15.0 +yapf==0.32.0 +yappi==1.4.0 diff --git a/python/requirements-test.txt b/python/requirements-test.txt index 0bc2eeba..39c828d0 100644 --- a/python/requirements-test.txt +++ b/python/requirements-test.txt @@ -1,13 +1,19 @@ -pytest-mock==3.1.0 -pytest +# tests +click==6.7 +falcon==3.1.1 +jsonschema==3.2.0 +mock==5.0.1 +pylibyaml==0.1.0 +pymongo==3.10.1 +pytest==6.2.5 pytest-cov -responses -mock -tox -oslo.versionedobjects[fixtures]>=1.23.0 -oslo.config[fixtures] +pytest-mock +responses==0.23.1 +setuptools==56.0.0 +ulid2==0.1.1 + +# tools yapf flake8 bandit>=1.1.0 sphinx>=1.6.2 -sphinx_rtd_theme==0.2.4 diff --git a/python/requirements-tree.txt b/python/requirements-tree.txt new file mode 100644 index 00000000..dfb02a46 --- /dev/null +++ b/python/requirements-tree.txt @@ -0,0 +1,1625 @@ +Automat==20.2.0 +bandit==1.7.4 + - GitPython [required: >=1.0.1, installed: 3.1.31] + - gitdb [required: >=4.0.1,<5, installed: 4.0.10] + - smmap [required: >=3.0.1,<6, installed: 5.0.0] + - PyYAML [required: >=5.3.1, installed: 5.3.1] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] +blinker==1.4 +cloud-init==22.4.2 +command-not-found==0.3 +configobj==5.0.6 +constantly==15.1.0 +coverage==5.3 +dbus-python==1.2.18 +Deckhand==1.0.0.dev717 + - alembic [required: ==1.4.3, installed: 1.4.3] + - Mako [required: Any, installed: 1.2.4] + - MarkupSafe [required: >=0.9.2, installed: 2.0.1] + - python-dateutil [required: Any, installed: 2.8.1] + - six [required: >=1.5, installed: 1.15.0] + - python-editor [required: >=0.3, installed: 1.0.4] + - SQLAlchemy [required: >=1.1.0, installed: 1.4.0] + - greenlet [required: !=0.4.17, installed: 2.0.2] + - amqp [required: ==2.6.1, installed: 2.6.1] + - vine [required: >=1.1.3,<5.0.0a1, installed: 1.3.0] + - Beaker [required: ==1.12.0, installed: 1.12.0] + - cryptography [required: ==3.2.1, installed: 3.2.1] + - cffi [required: >=1.8,!=1.11.3, installed: 1.15.1] + - pycparser [required: Any, installed: 2.21] + - six [required: >=1.4.1, installed: 1.15.0] + - deepdiff [required: ==5.8.1, installed: 5.8.1] + - ordered-set [required: >=4.1.0,<4.2.0, installed: 4.1.0] + - falcon [required: ==3.1.1, installed: 3.1.1] + - hacking [required: ==4.1.0, installed: 4.1.0] + - flake8 [required: >=3.8.0,<3.9.0, installed: 3.8.4] + - mccabe [required: >=0.6.0,<0.7.0, installed: 0.6.1] + - pycodestyle [required: >=2.6.0a1,<2.7.0, installed: 2.6.0] + - pyflakes [required: >=2.2.0,<2.3.0, installed: 2.2.0] + - jsonpath-ng [required: ==1.5.3, installed: 1.5.3] + - decorator [required: Any, installed: 5.1.1] + - ply [required: Any, installed: 3.11] + - six [required: Any, installed: 1.15.0] + - jsonpickle [required: ==1.4.1, installed: 1.4.1] + - importlib-metadata [required: Any, installed: 4.6.4] + - jsonschema [required: ==3.2.0, installed: 3.2.0] + - keystoneauth1 [required: ==5.1.1, installed: 5.1.1] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - os-service-types [required: >=1.2.0, installed: 1.7.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - requests [required: >=2.14.2, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - six [required: >=1.10.0, installed: 1.15.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - keystonemiddleware [required: ==10.2.0, installed: 10.2.0] + - keystoneauth1 [required: >=3.12.0, installed: 5.1.1] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - os-service-types [required: >=1.2.0, installed: 1.7.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - requests [required: >=2.14.2, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - six [required: >=1.10.0, installed: 1.15.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.cache [required: >=1.26.0, installed: 2.10.1] + - dogpile.cache [required: >=1.1.5, installed: 1.1.8] + - decorator [required: >=4.0.0, installed: 5.1.1] + - stevedore [required: >=3.0.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.config [required: >=8.1.0, installed: 8.7.1] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - PyYAML [required: >=5.1, installed: 5.3.1] + - requests [required: >=2.18.0, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - rfc3986 [required: >=1.2.0, installed: 2.0.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.i18n [required: >=5.0.0, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.log [required: >=4.2.1, installed: 4.6.0] + - debtcollector [required: >=1.19.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - oslo.config [required: >=5.2.0, installed: 8.7.1] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - PyYAML [required: >=5.1, installed: 5.3.1] + - requests [required: >=2.18.0, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - rfc3986 [required: >=1.2.0, installed: 2.0.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.context [required: >=2.20.0, installed: 4.1.0] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.i18n [required: >=3.20.0, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.serialization [required: >=2.25.0, installed: 4.2.0] + - msgpack [required: >=0.5.2, installed: 1.0.5] + - oslo.utils [required: >=3.33.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pytz [required: >=2013.6, installed: 2022.1] + - oslo.utils [required: >=3.36.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=3.1.1, installed: 5.5.1] + - pyinotify [required: >=0.9.6, installed: 0.9.6] + - python-dateutil [required: >=2.7.0, installed: 2.8.1] + - six [required: >=1.5, installed: 1.15.0] + - oslo.utils [required: >=4.2.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - oslo.config [required: >=5.2.0, installed: 8.7.1] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - PyYAML [required: >=5.1, installed: 5.3.1] + - requests [required: >=2.18.0, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - rfc3986 [required: >=1.2.0, installed: 2.0.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.context [required: >=2.19.2, installed: 4.1.0] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.log [required: >=3.36.0, installed: 4.6.0] + - debtcollector [required: >=1.19.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - oslo.config [required: >=5.2.0, installed: 8.7.1] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - PyYAML [required: >=5.1, installed: 5.3.1] + - requests [required: >=2.18.0, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - rfc3986 [required: >=1.2.0, installed: 2.0.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.context [required: >=2.20.0, installed: 4.1.0] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.i18n [required: >=3.20.0, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.serialization [required: >=2.25.0, installed: 4.2.0] + - msgpack [required: >=0.5.2, installed: 1.0.5] + - oslo.utils [required: >=3.33.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pytz [required: >=2013.6, installed: 2022.1] + - oslo.utils [required: >=3.36.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=3.1.1, installed: 5.5.1] + - pyinotify [required: >=0.9.6, installed: 0.9.6] + - python-dateutil [required: >=2.7.0, installed: 2.8.1] + - six [required: >=1.5, installed: 1.15.0] + - oslo.serialization [required: >=2.18.0,!=2.19.1, installed: 4.2.0] + - msgpack [required: >=0.5.2, installed: 1.0.5] + - oslo.utils [required: >=3.33.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pytz [required: >=2013.6, installed: 2022.1] + - oslo.utils [required: >=3.33.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pycadf [required: >=1.1.0,!=2.0.0, installed: 3.1.1] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - oslo.config [required: >=5.2.0, installed: 8.7.1] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - PyYAML [required: >=5.1, installed: 5.3.1] + - requests [required: >=2.18.0, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - rfc3986 [required: >=1.2.0, installed: 2.0.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.serialization [required: >=2.18.0,!=2.19.1, installed: 4.2.0] + - msgpack [required: >=0.5.2, installed: 1.0.5] + - oslo.utils [required: >=3.33.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pytz [required: >=2013.6, installed: 2022.1] + - pytz [required: >=2013.6, installed: 2022.1] + - six [required: >=1.10.0, installed: 1.15.0] + - python-keystoneclient [required: >=3.20.0, installed: 3.22.0] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - keystoneauth1 [required: >=3.4.0, installed: 5.1.1] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - os-service-types [required: >=1.2.0, installed: 1.7.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - requests [required: >=2.14.2, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - six [required: >=1.10.0, installed: 1.15.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.config [required: >=5.2.0, installed: 8.7.1] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - PyYAML [required: >=5.1, installed: 5.3.1] + - requests [required: >=2.18.0, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - rfc3986 [required: >=1.2.0, installed: 2.0.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.serialization [required: >=2.18.0,!=2.19.1, installed: 4.2.0] + - msgpack [required: >=0.5.2, installed: 1.0.5] + - oslo.utils [required: >=3.33.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pytz [required: >=2013.6, installed: 2022.1] + - oslo.utils [required: >=3.33.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - requests [required: >=2.14.2, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - six [required: >=1.10.0, installed: 1.15.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - requests [required: >=2.14.2, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - six [required: >=1.10.0, installed: 1.15.0] + - WebOb [required: >=1.7.1, installed: 1.8.7] + - kombu [required: ==4.6.11, installed: 4.6.11] + - amqp [required: >=2.6.0,<2.7, installed: 2.6.1] + - vine [required: >=1.1.3,<5.0.0a1, installed: 1.3.0] + - networkx [required: ==2.5, installed: 2.5] + - decorator [required: >=4.3.0, installed: 5.1.1] + - oslo.cache [required: ==2.10.1, installed: 2.10.1] + - dogpile.cache [required: >=1.1.5, installed: 1.1.8] + - decorator [required: >=4.0.0, installed: 5.1.1] + - stevedore [required: >=3.0.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.config [required: >=8.1.0, installed: 8.7.1] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - PyYAML [required: >=5.1, installed: 5.3.1] + - requests [required: >=2.18.0, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - rfc3986 [required: >=1.2.0, installed: 2.0.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.i18n [required: >=5.0.0, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.log [required: >=4.2.1, installed: 4.6.0] + - debtcollector [required: >=1.19.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - oslo.config [required: >=5.2.0, installed: 8.7.1] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - PyYAML [required: >=5.1, installed: 5.3.1] + - requests [required: >=2.18.0, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - rfc3986 [required: >=1.2.0, installed: 2.0.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.context [required: >=2.20.0, installed: 4.1.0] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.i18n [required: >=3.20.0, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.serialization [required: >=2.25.0, installed: 4.2.0] + - msgpack [required: >=0.5.2, installed: 1.0.5] + - oslo.utils [required: >=3.33.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pytz [required: >=2013.6, installed: 2022.1] + - oslo.utils [required: >=3.36.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=3.1.1, installed: 5.5.1] + - pyinotify [required: >=0.9.6, installed: 0.9.6] + - python-dateutil [required: >=2.7.0, installed: 2.8.1] + - six [required: >=1.5, installed: 1.15.0] + - oslo.utils [required: >=4.2.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - oslo.concurrency [required: ==5.0.1, installed: 5.0.1] + - fasteners [required: >=0.7.0, installed: 0.18] + - oslo.config [required: >=5.2.0, installed: 8.7.1] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - PyYAML [required: >=5.1, installed: 5.3.1] + - requests [required: >=2.18.0, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - rfc3986 [required: >=1.2.0, installed: 2.0.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.utils [required: >=3.33.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.config [required: ==8.7.1, installed: 8.7.1] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - PyYAML [required: >=5.1, installed: 5.3.1] + - requests [required: >=2.18.0, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - rfc3986 [required: >=1.2.0, installed: 2.0.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.context [required: ==4.1.0, installed: 4.1.0] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.db [required: ==11.2.0, installed: 11.2.0] + - alembic [required: >=0.9.6, installed: 1.4.3] + - Mako [required: Any, installed: 1.2.4] + - MarkupSafe [required: >=0.9.2, installed: 2.0.1] + - python-dateutil [required: Any, installed: 2.8.1] + - six [required: >=1.5, installed: 1.15.0] + - python-editor [required: >=0.3, installed: 1.0.4] + - SQLAlchemy [required: >=1.1.0, installed: 1.4.0] + - greenlet [required: !=0.4.17, installed: 2.0.2] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - oslo.config [required: >=5.2.0, installed: 8.7.1] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - PyYAML [required: >=5.1, installed: 5.3.1] + - requests [required: >=2.18.0, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - rfc3986 [required: >=1.2.0, installed: 2.0.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.utils [required: >=3.33.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - SQLAlchemy [required: >=1.4.0, installed: 1.4.0] + - greenlet [required: !=0.4.17, installed: 2.0.2] + - sqlalchemy-migrate [required: >=0.11.0, installed: 0.13.0] + - decorator [required: Any, installed: 5.1.1] + - pbr [required: >=1.8, installed: 5.5.1] + - six [required: >=1.7.0, installed: 1.15.0] + - SQLAlchemy [required: >=0.9.6, installed: 1.4.0] + - greenlet [required: !=0.4.17, installed: 2.0.2] + - sqlparse [required: Any, installed: 0.4.3] + - Tempita [required: >=0.4, installed: 0.5.2] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - testresources [required: >=2.0.0, installed: 2.0.1] + - pbr [required: >=1.8, installed: 5.5.1] + - testscenarios [required: >=0.4, installed: 0.5.0] + - pbr [required: >=0.11, installed: 5.5.1] + - testtools [required: Any, installed: 2.5.0] + - extras [required: >=1.0.0, installed: 1.0.0] + - fixtures [required: >=1.3.0, installed: 3.0.0] + - pbr [required: >=0.11, installed: 5.5.1] + - six [required: Any, installed: 1.15.0] + - pbr [required: >=0.11, installed: 5.5.1] + - oslo.log [required: ==4.6.0, installed: 4.6.0] + - debtcollector [required: >=1.19.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - oslo.config [required: >=5.2.0, installed: 8.7.1] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - PyYAML [required: >=5.1, installed: 5.3.1] + - requests [required: >=2.18.0, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - rfc3986 [required: >=1.2.0, installed: 2.0.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.context [required: >=2.20.0, installed: 4.1.0] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.i18n [required: >=3.20.0, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.serialization [required: >=2.25.0, installed: 4.2.0] + - msgpack [required: >=0.5.2, installed: 1.0.5] + - oslo.utils [required: >=3.33.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pytz [required: >=2013.6, installed: 2022.1] + - oslo.utils [required: >=3.36.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=3.1.1, installed: 5.5.1] + - pyinotify [required: >=0.9.6, installed: 0.9.6] + - python-dateutil [required: >=2.7.0, installed: 2.8.1] + - six [required: >=1.5, installed: 1.15.0] + - oslo.messaging [required: ==12.13.0, installed: 12.13.0] + - amqp [required: >=2.5.2, installed: 2.6.1] + - vine [required: >=1.1.3,<5.0.0a1, installed: 1.3.0] + - cachetools [required: >=2.0.0, installed: 5.3.0] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - futurist [required: >=1.2.0, installed: 2.4.1] + - kombu [required: >=4.6.6, installed: 4.6.11] + - amqp [required: >=2.6.0,<2.7, installed: 2.6.1] + - vine [required: >=1.1.3,<5.0.0a1, installed: 1.3.0] + - oslo.config [required: >=5.2.0, installed: 8.7.1] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - PyYAML [required: >=5.1, installed: 5.3.1] + - requests [required: >=2.18.0, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - rfc3986 [required: >=1.2.0, installed: 2.0.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.log [required: >=3.36.0, installed: 4.6.0] + - debtcollector [required: >=1.19.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - oslo.config [required: >=5.2.0, installed: 8.7.1] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - PyYAML [required: >=5.1, installed: 5.3.1] + - requests [required: >=2.18.0, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - rfc3986 [required: >=1.2.0, installed: 2.0.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.context [required: >=2.20.0, installed: 4.1.0] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.i18n [required: >=3.20.0, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.serialization [required: >=2.25.0, installed: 4.2.0] + - msgpack [required: >=0.5.2, installed: 1.0.5] + - oslo.utils [required: >=3.33.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pytz [required: >=2013.6, installed: 2022.1] + - oslo.utils [required: >=3.36.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=3.1.1, installed: 5.5.1] + - pyinotify [required: >=0.9.6, installed: 0.9.6] + - python-dateutil [required: >=2.7.0, installed: 2.8.1] + - six [required: >=1.5, installed: 1.15.0] + - oslo.metrics [required: >=0.2.1, installed: 0.6.0] + - oslo.config [required: >=6.9.0, installed: 8.7.1] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - PyYAML [required: >=5.1, installed: 5.3.1] + - requests [required: >=2.18.0, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - rfc3986 [required: >=1.2.0, installed: 2.0.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.log [required: >=3.44.0, installed: 4.6.0] + - debtcollector [required: >=1.19.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - oslo.config [required: >=5.2.0, installed: 8.7.1] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - PyYAML [required: >=5.1, installed: 5.3.1] + - requests [required: >=2.18.0, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - rfc3986 [required: >=1.2.0, installed: 2.0.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.context [required: >=2.20.0, installed: 4.1.0] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.i18n [required: >=3.20.0, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.serialization [required: >=2.25.0, installed: 4.2.0] + - msgpack [required: >=0.5.2, installed: 1.0.5] + - oslo.utils [required: >=3.33.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pytz [required: >=2013.6, installed: 2022.1] + - oslo.utils [required: >=3.36.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=3.1.1, installed: 5.5.1] + - pyinotify [required: >=0.9.6, installed: 0.9.6] + - python-dateutil [required: >=2.7.0, installed: 2.8.1] + - six [required: >=1.5, installed: 1.15.0] + - oslo.utils [required: >=3.41.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=3.1.1,!=2.1.0, installed: 5.5.1] + - prometheus-client [required: >=0.6.0, installed: 0.16.0] + - oslo.middleware [required: >=3.31.0, installed: 4.4.0] + - bcrypt [required: >=3.1.3, installed: 3.2.0] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - Jinja2 [required: >=2.10, installed: 3.0.3] + - oslo.config [required: >=5.2.0, installed: 8.7.1] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - PyYAML [required: >=5.1, installed: 5.3.1] + - requests [required: >=2.18.0, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - rfc3986 [required: >=1.2.0, installed: 2.0.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.context [required: >=2.19.2, installed: 4.1.0] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.utils [required: >=3.33.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - statsd [required: >=3.2.1, installed: 4.0.1] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - WebOb [required: >=1.8.0, installed: 1.8.7] + - oslo.serialization [required: >=2.18.0,!=2.19.1, installed: 4.2.0] + - msgpack [required: >=0.5.2, installed: 1.0.5] + - oslo.utils [required: >=3.33.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pytz [required: >=2013.6, installed: 2022.1] + - oslo.service [required: >=1.24.0,!=1.28.1, installed: 3.1.1] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - eventlet [required: >=0.25.2, installed: 0.33.3] + - dnspython [required: >=1.15.0, installed: 2.3.0] + - greenlet [required: >=0.3, installed: 2.0.2] + - six [required: >=1.10.0, installed: 1.15.0] + - fixtures [required: >=3.0.0, installed: 3.0.0] + - pbr [required: >=0.11, installed: 5.5.1] + - six [required: Any, installed: 1.15.0] + - testtools [required: >=0.9.22, installed: 2.5.0] + - extras [required: >=1.0.0, installed: 1.0.0] + - pbr [required: >=0.11, installed: 5.5.1] + - greenlet [required: >=0.4.15, installed: 2.0.2] + - oslo.concurrency [required: >=3.25.0, installed: 5.0.1] + - fasteners [required: >=0.7.0, installed: 0.18] + - oslo.config [required: >=5.2.0, installed: 8.7.1] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - PyYAML [required: >=5.1, installed: 5.3.1] + - requests [required: >=2.18.0, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - rfc3986 [required: >=1.2.0, installed: 2.0.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.utils [required: >=3.33.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.config [required: >=5.1.0, installed: 8.7.1] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - PyYAML [required: >=5.1, installed: 5.3.1] + - requests [required: >=2.18.0, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - rfc3986 [required: >=1.2.0, installed: 2.0.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.log [required: >=3.36.0, installed: 4.6.0] + - debtcollector [required: >=1.19.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - oslo.config [required: >=5.2.0, installed: 8.7.1] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - PyYAML [required: >=5.1, installed: 5.3.1] + - requests [required: >=2.18.0, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - rfc3986 [required: >=1.2.0, installed: 2.0.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.context [required: >=2.20.0, installed: 4.1.0] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.i18n [required: >=3.20.0, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.serialization [required: >=2.25.0, installed: 4.2.0] + - msgpack [required: >=0.5.2, installed: 1.0.5] + - oslo.utils [required: >=3.33.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pytz [required: >=2013.6, installed: 2022.1] + - oslo.utils [required: >=3.36.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=3.1.1, installed: 5.5.1] + - pyinotify [required: >=0.9.6, installed: 0.9.6] + - python-dateutil [required: >=2.7.0, installed: 2.8.1] + - six [required: >=1.5, installed: 1.15.0] + - oslo.utils [required: >=3.40.2, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - Paste [required: >=2.0.2, installed: 3.5.0] + - setuptools [required: Any, installed: 59.6.0] + - six [required: >=1.4.0, installed: 1.15.0] + - PasteDeploy [required: >=1.5.0, installed: 3.0.1] + - Routes [required: >=2.3.1, installed: 2.5.1] + - repoze.lru [required: >=0.3, installed: 0.7] + - six [required: Any, installed: 1.15.0] + - WebOb [required: >=1.7.1, installed: 1.8.7] + - Yappi [required: >=1.0, installed: 1.4.0] + - oslo.utils [required: >=3.37.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - PyYAML [required: >=3.13, installed: 5.3.1] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - WebOb [required: >=1.7.1, installed: 1.8.7] + - oslo.middleware [required: ==4.4.0, installed: 4.4.0] + - bcrypt [required: >=3.1.3, installed: 3.2.0] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - Jinja2 [required: >=2.10, installed: 3.0.3] + - oslo.config [required: >=5.2.0, installed: 8.7.1] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - PyYAML [required: >=5.1, installed: 5.3.1] + - requests [required: >=2.18.0, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - rfc3986 [required: >=1.2.0, installed: 2.0.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.context [required: >=2.19.2, installed: 4.1.0] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.utils [required: >=3.33.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - statsd [required: >=3.2.1, installed: 4.0.1] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - WebOb [required: >=1.8.0, installed: 1.8.7] + - oslo.policy [required: ==3.10.1, installed: 3.10.1] + - oslo.config [required: >=6.0.0, installed: 8.7.1] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - PyYAML [required: >=5.1, installed: 5.3.1] + - requests [required: >=2.18.0, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - rfc3986 [required: >=1.2.0, installed: 2.0.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.context [required: >=2.22.0, installed: 4.1.0] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.serialization [required: >=2.18.0,!=2.19.1, installed: 4.2.0] + - msgpack [required: >=0.5.2, installed: 1.0.5] + - oslo.utils [required: >=3.33.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pytz [required: >=2013.6, installed: 2022.1] + - oslo.utils [required: >=3.40.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - PyYAML [required: >=5.1, installed: 5.3.1] + - requests [required: >=2.14.2, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.serialization [required: ==4.2.0, installed: 4.2.0] + - msgpack [required: >=0.5.2, installed: 1.0.5] + - oslo.utils [required: >=3.33.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pytz [required: >=2013.6, installed: 2022.1] + - oslo.utils [required: ==4.12.3, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - Paste [required: ==3.5.0, installed: 3.5.0] + - setuptools [required: Any, installed: 59.6.0] + - six [required: >=1.4.0, installed: 1.15.0] + - PasteDeploy [required: ==3.0.1, installed: 3.0.1] + - pbr [required: ==5.5.1, installed: 5.5.1] + - psycopg2-binary [required: ==2.8.6, installed: 2.8.6] + - pylibyaml [required: ==0.1.0, installed: 0.1.0] + - python-barbicanclient [required: ==5.2.0, installed: 5.2.0] + - cliff [required: >=2.8.0,!=2.9.0, installed: 4.2.0] + - autopage [required: >=0.4.0, installed: 0.5.1] + - cmd2 [required: >=1.0.0, installed: 2.4.3] + - attrs [required: >=16.3.0, installed: 21.2.0] + - pyperclip [required: >=1.6, installed: 1.8.2] + - wcwidth [required: >=0.1.7, installed: 0.2.6] + - importlib-metadata [required: >=4.4, installed: 4.6.4] + - PrettyTable [required: >=0.7.2, installed: 3.6.0] + - wcwidth [required: Any, installed: 0.2.6] + - PyYAML [required: >=3.12, installed: 5.3.1] + - stevedore [required: >=2.0.1, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - keystoneauth1 [required: >=3.4.0, installed: 5.1.1] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - os-service-types [required: >=1.2.0, installed: 1.7.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - requests [required: >=2.14.2, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - six [required: >=1.10.0, installed: 1.15.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.serialization [required: >=2.18.0,!=2.19.1, installed: 4.2.0] + - msgpack [required: >=0.5.2, installed: 1.0.5] + - oslo.utils [required: >=3.33.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pytz [required: >=2013.6, installed: 2022.1] + - oslo.utils [required: >=3.33.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - requests [required: >=2.14.2, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - six [required: >=1.10.0, installed: 1.15.0] + - python-dateutil [required: ==2.8.1, installed: 2.8.1] + - six [required: >=1.5, installed: 1.15.0] + - python-keystoneclient [required: ==3.22.0, installed: 3.22.0] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - keystoneauth1 [required: >=3.4.0, installed: 5.1.1] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - os-service-types [required: >=1.2.0, installed: 1.7.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - requests [required: >=2.14.2, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - six [required: >=1.10.0, installed: 1.15.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.config [required: >=5.2.0, installed: 8.7.1] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - PyYAML [required: >=5.1, installed: 5.3.1] + - requests [required: >=2.18.0, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - rfc3986 [required: >=1.2.0, installed: 2.0.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - oslo.serialization [required: >=2.18.0,!=2.19.1, installed: 4.2.0] + - msgpack [required: >=0.5.2, installed: 1.0.5] + - oslo.utils [required: >=3.33.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pytz [required: >=2013.6, installed: 2022.1] + - oslo.utils [required: >=3.33.0, installed: 4.12.3] + - debtcollector [required: >=1.2.0, installed: 2.5.0] + - wrapt [required: >=1.7.0, installed: 1.15.0] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - netaddr [required: >=0.7.18, installed: 0.8.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - oslo.i18n [required: >=3.15.3, installed: 6.0.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - packaging [required: >=20.4, installed: 23.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pyparsing [required: >=2.1.0, installed: 2.4.7] + - pytz [required: >=2013.6, installed: 2022.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - requests [required: >=2.14.2, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - six [required: >=1.10.0, installed: 1.15.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - python-memcached [required: ==1.59, installed: 1.59] + - six [required: >=1.4.0, installed: 1.15.0] + - PyYAML [required: ==5.4.1, installed: 5.3.1] + - Routes [required: ==2.5.1, installed: 2.5.1] + - repoze.lru [required: >=0.3, installed: 0.7] + - six [required: Any, installed: 1.15.0] + - six [required: ==1.15.0, installed: 1.15.0] + - sphinx-rtd-theme [required: ==0.5.0, installed: 0.5.0] + - sphinx [required: Any, installed: 6.1.3] + - alabaster [required: >=0.7,<0.8, installed: 0.7.13] + - babel [required: >=2.9, installed: 2.12.1] + - docutils [required: >=0.18,<0.20, installed: 0.19] + - imagesize [required: >=1.3, installed: 1.4.1] + - Jinja2 [required: >=3.0, installed: 3.0.3] + - packaging [required: >=21.0, installed: 23.0] + - Pygments [required: >=2.13, installed: 2.14.0] + - requests [required: >=2.25.0, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - snowballstemmer [required: >=2.0, installed: 2.2.0] + - sphinxcontrib-applehelp [required: Any, installed: 1.0.4] + - sphinxcontrib-devhelp [required: Any, installed: 1.0.2] + - sphinxcontrib-htmlhelp [required: >=2.0.0, installed: 2.0.1] + - sphinxcontrib-jsmath [required: Any, installed: 1.0.1] + - sphinxcontrib-qthelp [required: Any, installed: 1.0.3] + - sphinxcontrib-serializinghtml [required: >=1.1.5, installed: 1.1.5] + - SQLAlchemy [required: ==1.4.0, installed: 1.4.0] + - greenlet [required: !=0.4.17, installed: 2.0.2] + - stestr [required: ==3.2.0, installed: 3.2.0] + - cliff [required: >=2.8.0, installed: 4.2.0] + - autopage [required: >=0.4.0, installed: 0.5.1] + - cmd2 [required: >=1.0.0, installed: 2.4.3] + - attrs [required: >=16.3.0, installed: 21.2.0] + - pyperclip [required: >=1.6, installed: 1.8.2] + - wcwidth [required: >=0.1.7, installed: 0.2.6] + - importlib-metadata [required: >=4.4, installed: 4.6.4] + - PrettyTable [required: >=0.7.2, installed: 3.6.0] + - wcwidth [required: Any, installed: 0.2.6] + - PyYAML [required: >=3.12, installed: 5.3.1] + - stevedore [required: >=2.0.1, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - fixtures [required: >=3.0.0, installed: 3.0.0] + - pbr [required: >=0.11, installed: 5.5.1] + - six [required: Any, installed: 1.15.0] + - testtools [required: >=0.9.22, installed: 2.5.0] + - extras [required: >=1.0.0, installed: 1.0.0] + - pbr [required: >=0.11, installed: 5.5.1] + - future [required: Any, installed: 0.18.3] + - pbr [required: >=2.0.0,!=4.0.3,!=4.0.2,!=4.0.1,!=4.0.0,!=2.1.0, installed: 5.5.1] + - python-subunit [required: >=1.4.0, installed: 1.4.0] + - extras [required: Any, installed: 1.0.0] + - testtools [required: >=0.9.34, installed: 2.5.0] + - extras [required: >=1.0.0, installed: 1.0.0] + - fixtures [required: >=1.3.0, installed: 3.0.0] + - pbr [required: >=0.11, installed: 5.5.1] + - six [required: Any, installed: 1.15.0] + - pbr [required: >=0.11, installed: 5.5.1] + - PyYAML [required: >=3.10.0, installed: 5.3.1] + - testtools [required: >=2.2.0, installed: 2.5.0] + - extras [required: >=1.0.0, installed: 1.0.0] + - fixtures [required: >=1.3.0, installed: 3.0.0] + - pbr [required: >=0.11, installed: 5.5.1] + - six [required: Any, installed: 1.15.0] + - pbr [required: >=0.11, installed: 5.5.1] + - voluptuous [required: >=0.8.9, installed: 0.13.1] + - stevedore [required: ==4.1.1, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - urllib3 [required: ==1.25.11, installed: 1.25.11] + - uWSGI [required: ==2.0.21, installed: 2.0.21] + - Werkzeug [required: ==0.16.1, installed: 0.16.1] +distro==1.7.0 +distro-info==1.1build1 +gabbi==1.35.1 + - colorama [required: Any, installed: 0.4.6] + - jsonpath-rw-ext [required: >=1.0.0, installed: 1.2.2] + - jsonpath-rw [required: >=1.2.0, installed: 1.4.0] + - decorator [required: Any, installed: 5.1.1] + - ply [required: Any, installed: 3.11] + - six [required: Any, installed: 1.15.0] + - pbr [required: >=1.8, installed: 5.5.1] + - pbr [required: Any, installed: 5.5.1] + - pytest [required: Any, installed: 7.2.2] + - attrs [required: >=19.2.0, installed: 21.2.0] + - exceptiongroup [required: >=1.0.0rc8, installed: 1.1.1] + - iniconfig [required: Any, installed: 2.0.0] + - packaging [required: Any, installed: 23.0] + - pluggy [required: >=0.12,<2.0, installed: 1.0.0] + - tomli [required: >=1.0.0, installed: 2.0.1] + - PyYAML [required: Any, installed: 5.3.1] + - six [required: Any, installed: 1.15.0] + - testtools [required: Any, installed: 2.5.0] + - extras [required: >=1.0.0, installed: 1.0.0] + - fixtures [required: >=1.3.0, installed: 3.0.0] + - pbr [required: >=0.11, installed: 5.5.1] + - six [required: Any, installed: 1.15.0] + - pbr [required: >=0.11, installed: 5.5.1] + - urllib3 [required: >=1.11.0, installed: 1.25.11] + - wsgi-intercept [required: >=1.2.2, installed: 1.11.0] + - six [required: Any, installed: 1.15.0] +git-review==2.2.0 +hyperlink==21.0.0 +incremental==21.3.0 +jeepney==0.7.1 +jsonpointer==2.0 +launchpadlib==1.10.16 + - httplib2 [required: Any, installed: 0.20.2] + - pyparsing [required: >=2.4.2,<4,!=3.0.3,!=3.0.2,!=3.0.1,!=3.0.0, installed: 2.4.7] + - keyring [required: Any, installed: 23.5.0] + - lazr.restfulclient [required: >=0.9.19, installed: 0.14.4] + - httplib2 [required: >=0.7.7, installed: 0.20.2] + - pyparsing [required: >=2.4.2,<4,!=3.0.3,!=3.0.2,!=3.0.1,!=3.0.0, installed: 2.4.7] + - lazr.uri [required: Any, installed: 1.0.6] + - six [required: Any, installed: 1.15.0] +libvirt-python==8.0.0 +more-itertools==8.10.0 +oauthlib==3.2.0 +openstacksdk==0.59.0 + - appdirs [required: >=1.3.0, installed: 1.4.4] + - cryptography [required: >=2.7, installed: 3.2.1] + - cffi [required: >=1.8,!=1.11.3, installed: 1.15.1] + - pycparser [required: Any, installed: 2.21] + - six [required: >=1.4.1, installed: 1.15.0] + - decorator [required: >=4.4.1, installed: 5.1.1] + - dogpile.cache [required: >=0.6.5, installed: 1.1.8] + - decorator [required: >=4.0.0, installed: 5.1.1] + - stevedore [required: >=3.0.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - jmespath [required: >=0.9.0, installed: 1.0.1] + - jsonpatch [required: >=1.16,!=1.20, installed: 1.32] + - keystoneauth1 [required: >=3.18.0, installed: 5.1.1] + - iso8601 [required: >=0.1.11, installed: 1.1.0] + - os-service-types [required: >=1.2.0, installed: 1.7.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - requests [required: >=2.14.2, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] + - six [required: >=1.10.0, installed: 1.15.0] + - stevedore [required: >=1.20.0, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - munch [required: >=2.1.0, installed: 2.5.0] + - six [required: Any, installed: 1.15.0] + - netifaces [required: >=0.10.4, installed: 0.11.0] + - os-service-types [required: >=1.7.0, installed: 1.7.0] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - PyYAML [required: >=3.13, installed: 5.3.1] + - requestsexceptions [required: >=1.2.0, installed: 1.4.0] +os-testr==2.0.1 + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - python-subunit [required: >=1.0.0, installed: 1.4.0] + - extras [required: Any, installed: 1.0.0] + - testtools [required: >=0.9.34, installed: 2.5.0] + - extras [required: >=1.0.0, installed: 1.0.0] + - fixtures [required: >=1.3.0, installed: 3.0.0] + - pbr [required: >=0.11, installed: 5.5.1] + - six [required: Any, installed: 1.15.0] + - pbr [required: >=0.11, installed: 5.5.1] + - stestr [required: >=1.0.0, installed: 3.2.0] + - cliff [required: >=2.8.0, installed: 4.2.0] + - autopage [required: >=0.4.0, installed: 0.5.1] + - cmd2 [required: >=1.0.0, installed: 2.4.3] + - attrs [required: >=16.3.0, installed: 21.2.0] + - pyperclip [required: >=1.6, installed: 1.8.2] + - wcwidth [required: >=0.1.7, installed: 0.2.6] + - importlib-metadata [required: >=4.4, installed: 4.6.4] + - PrettyTable [required: >=0.7.2, installed: 3.6.0] + - wcwidth [required: Any, installed: 0.2.6] + - PyYAML [required: >=3.12, installed: 5.3.1] + - stevedore [required: >=2.0.1, installed: 4.1.1] + - pbr [required: >=2.0.0,!=2.1.0, installed: 5.5.1] + - fixtures [required: >=3.0.0, installed: 3.0.0] + - pbr [required: >=0.11, installed: 5.5.1] + - six [required: Any, installed: 1.15.0] + - testtools [required: >=0.9.22, installed: 2.5.0] + - extras [required: >=1.0.0, installed: 1.0.0] + - pbr [required: >=0.11, installed: 5.5.1] + - future [required: Any, installed: 0.18.3] + - pbr [required: >=2.0.0,!=4.0.3,!=4.0.2,!=4.0.1,!=4.0.0,!=2.1.0, installed: 5.5.1] + - python-subunit [required: >=1.4.0, installed: 1.4.0] + - extras [required: Any, installed: 1.0.0] + - testtools [required: >=0.9.34, installed: 2.5.0] + - extras [required: >=1.0.0, installed: 1.0.0] + - fixtures [required: >=1.3.0, installed: 3.0.0] + - pbr [required: >=0.11, installed: 5.5.1] + - six [required: Any, installed: 1.15.0] + - pbr [required: >=0.11, installed: 5.5.1] + - PyYAML [required: >=3.10.0, installed: 5.3.1] + - testtools [required: >=2.2.0, installed: 2.5.0] + - extras [required: >=1.0.0, installed: 1.0.0] + - fixtures [required: >=1.3.0, installed: 3.0.0] + - pbr [required: >=0.11, installed: 5.5.1] + - six [required: Any, installed: 1.15.0] + - pbr [required: >=0.11, installed: 5.5.1] + - voluptuous [required: >=0.8.9, installed: 0.13.1] + - testtools [required: >=2.2.0, installed: 2.5.0] + - extras [required: >=1.0.0, installed: 1.0.0] + - fixtures [required: >=1.3.0, installed: 3.0.0] + - pbr [required: >=0.11, installed: 5.5.1] + - six [required: Any, installed: 1.15.0] + - pbr [required: >=0.11, installed: 5.5.1] +oslotest==4.5.0 + - fixtures [required: >=3.0.0, installed: 3.0.0] + - pbr [required: >=0.11, installed: 5.5.1] + - six [required: Any, installed: 1.15.0] + - testtools [required: >=0.9.22, installed: 2.5.0] + - extras [required: >=1.0.0, installed: 1.0.0] + - pbr [required: >=0.11, installed: 5.5.1] + - python-subunit [required: >=1.0.0, installed: 1.4.0] + - extras [required: Any, installed: 1.0.0] + - testtools [required: >=0.9.34, installed: 2.5.0] + - extras [required: >=1.0.0, installed: 1.0.0] + - fixtures [required: >=1.3.0, installed: 3.0.0] + - pbr [required: >=0.11, installed: 5.5.1] + - six [required: Any, installed: 1.15.0] + - pbr [required: >=0.11, installed: 5.5.1] + - six [required: >=1.10.0, installed: 1.15.0] + - testtools [required: >=2.2.0, installed: 2.5.0] + - extras [required: >=1.0.0, installed: 1.0.0] + - fixtures [required: >=1.3.0, installed: 3.0.0] + - pbr [required: >=0.11, installed: 5.5.1] + - six [required: Any, installed: 1.15.0] + - pbr [required: >=0.11, installed: 5.5.1] +pexpect==4.8.0 +pifpaf==3.1.5 + - click [required: Any, installed: 8.0.3] + - daiquiri [required: Any, installed: 3.2.1] + - python-json-logger [required: Any, installed: 2.0.7] + - fixtures [required: Any, installed: 3.0.0] + - pbr [required: >=0.11, installed: 5.5.1] + - six [required: Any, installed: 1.15.0] + - testtools [required: >=0.9.22, installed: 2.5.0] + - extras [required: >=1.0.0, installed: 1.0.0] + - pbr [required: >=0.11, installed: 5.5.1] + - jinja2 [required: Any, installed: 3.0.3] + - pbr [required: Any, installed: 5.5.1] + - psutil [required: Any, installed: 5.9.4] + - xattr [required: Any, installed: 0.10.1] + - cffi [required: >=1.0, installed: 1.15.1] + - pycparser [required: Any, installed: 2.21] +pip==22.0.2 +pipdeptree==2.7.0 +pipreqs==0.4.11 + - docopt [required: Any, installed: 0.6.2] + - yarg [required: Any, installed: 0.1.9] + - requests [required: Any, installed: 2.28.2] + - certifi [required: >=2017.4.17, installed: 2020.6.20] + - charset-normalizer [required: >=2,<4, installed: 3.1.0] + - idna [required: >=2.5,<4, installed: 2.10] + - urllib3 [required: >=1.21.1,<1.27, installed: 1.25.11] +ptyprocess==0.7.0 +py==1.10.0 +pyasn1==0.4.8 +pyasn1-modules==0.2.1 +PyGObject==3.42.1 + - pycairo [required: >=1.16.0, installed: 1.20.1] +PyHamcrest==2.0.2 +PyJWT==2.3.0 +pyOpenSSL==21.0.0 +pyrsistent==0.18.1 +pyserial==3.5 +python-apt==2.4.0+ubuntu1 +python-debian==0.1.43ubuntu1 +python-magic==0.4.24 +SecretStorage==3.3.1 +service-identity==18.1.0 +sos==4.4 +ssh-import-id==5.11 +systemd-python==234 +testrepository==0.0.20 + - fixtures [required: Any, installed: 3.0.0] + - pbr [required: >=0.11, installed: 5.5.1] + - six [required: Any, installed: 1.15.0] + - testtools [required: >=0.9.22, installed: 2.5.0] + - extras [required: >=1.0.0, installed: 1.0.0] + - pbr [required: >=0.11, installed: 5.5.1] + - python-subunit [required: >=0.0.18, installed: 1.4.0] + - extras [required: Any, installed: 1.0.0] + - testtools [required: >=0.9.34, installed: 2.5.0] + - extras [required: >=1.0.0, installed: 1.0.0] + - fixtures [required: >=1.3.0, installed: 3.0.0] + - pbr [required: >=0.11, installed: 5.5.1] + - six [required: Any, installed: 1.15.0] + - pbr [required: >=0.11, installed: 5.5.1] + - testtools [required: >=0.9.30, installed: 2.5.0] + - extras [required: >=1.0.0, installed: 1.0.0] + - fixtures [required: >=1.3.0, installed: 3.0.0] + - pbr [required: >=0.11, installed: 5.5.1] + - six [required: Any, installed: 1.15.0] + - pbr [required: >=0.11, installed: 5.5.1] +tox==4.4.11 + - cachetools [required: >=5.3, installed: 5.3.0] + - chardet [required: >=5.1, installed: 5.1.0] + - colorama [required: >=0.4.6, installed: 0.4.6] + - filelock [required: >=3.10.7, installed: 3.11.0] + - packaging [required: >=23, installed: 23.0] + - platformdirs [required: >=3.2, installed: 3.2.0] + - pluggy [required: >=1, installed: 1.0.0] + - pyproject-api [required: >=1.5.1, installed: 1.5.1] + - packaging [required: >=23, installed: 23.0] + - tomli [required: >=2.0.1, installed: 2.0.1] + - tomli [required: >=2.0.1, installed: 2.0.1] + - virtualenv [required: >=20.21, installed: 20.21.0] + - distlib [required: >=0.3.6,<1, installed: 0.3.6] + - filelock [required: >=3.4.1,<4, installed: 3.11.0] + - platformdirs [required: >=2.4,<4, installed: 3.2.0] +Twisted==22.1.0 +ubuntu-advantage-tools==8001 +ufw==0.36.1 +unattended-upgrades==0.1 +wadllib==1.3.6 +wheel==0.37.1 +yq==3.1.0 + - argcomplete [required: >=1.8.1, installed: 3.0.4] + - PyYAML [required: >=5.3.1, installed: 5.3.1] + - toml [required: >=0.10.0, installed: 0.10.2] + - xmltodict [required: >=0.11.0, installed: 0.13.0] +zipp==1.0.0 +zope.interface==5.4.0 diff --git a/python/tests/postgres/start_postgres.sh b/python/tests/postgres/start_postgres.sh index 80839686..4b4fe884 100755 --- a/python/tests/postgres/start_postgres.sh +++ b/python/tests/postgres/start_postgres.sh @@ -14,11 +14,11 @@ then sudo docker stop 'psql_integration' fi -sudo docker run --rm -dp 5432:5432 --name 'psql_integration' postgres:9.5 +sudo docker run --rm -dp 5432:5432 --name 'psql_integration' postgres:14.6 sleep 15 -docker run --rm --net host postgres:9.5 psql -h localhost -c "create user drydock with password 'drydock';" postgres postgres -docker run --rm --net host postgres:9.5 psql -h localhost -c "create database drydock;" postgres postgres +docker run --rm --net host postgres:14.6 psql -h localhost -c "create user drydock with password 'drydock';" postgres postgres +docker run --rm --net host postgres:14.6 psql -h localhost -c "create database drydock;" postgres postgres export DRYDOCK_DB_URL="postgresql+psycopg2://drydock:drydock@localhost:5432/drydock" diff --git a/requirements-host-test.txt b/requirements-host-test.txt deleted file mode 100644 index 9cdb2ba6..00000000 --- a/requirements-host-test.txt +++ /dev/null @@ -1,5 +0,0 @@ -# These are host packages needed for Drydock -# that don't come on a minimal Ubuntu install -python-tox -docker.io|docker-ce -plantuml diff --git a/requirements-host.txt b/requirements-host.txt deleted file mode 100644 index ee59c621..00000000 --- a/requirements-host.txt +++ /dev/null @@ -1,12 +0,0 @@ -# These are host packages needed for Drydock -# that don't come on a minimal Ubuntu install -libvirt-dev -pkg-config -python3-dev -gcc -netbase -libssl-dev -python3-pip -python3-setuptools -ssh -curl diff --git a/tools/baclient_build.sh b/tools/baclient_build.sh index b9187642..0bab4369 100755 --- a/tools/baclient_build.sh +++ b/tools/baclient_build.sh @@ -7,12 +7,7 @@ if $(uname -a | grep -q Ubuntu); then GOPATH=$1 BUILD_DIR=$2 if [[ ! -f ./baclient_built ]]; then - apt-get update - DEBIAN_FRONTEND=noninteractive apt-get \ - -o Dpkg::Options::="--force-confdef" \ - -o Dpkg::Options::="--force-confold" \ - install -y --no-install-recommends golang-go - GOPATH=${GOPATH} go build -o ${BUILD_DIR}/baclient baclient + GO111MODULE=off GOPATH=${GOPATH} go build -v -o ${BUILD_DIR}/baclient baclient else echo "Baclient library is already built. No action." fi diff --git a/tools/drydock_image_build.sh b/tools/drydock_image_build.sh index 55656051..fe70a982 100755 --- a/tools/drydock_image_build.sh +++ b/tools/drydock_image_build.sh @@ -3,7 +3,7 @@ set -x UBUNTU_BASE_IMAGE=${UBUNTU_BASE_IMAGE:-""} UBUNTU_REPO=${UBUNTU_REPO:-""} -DISTRO=${DISTRO:-"ubuntu_bionic"} +DISTRO=${DISTRO:-"ubuntu_focal"} TRUSTED_UBUNTU_REPO=${TRUSTED_UBUNTU_REPO:-"no"} ALLOW_UNATHENTICATED=${ALLOW_UNAUTHENTICATED:-"false"} PIP_INDEX_URL=${PIP_INDEX_URL:-""} diff --git a/tools/drydock_image_run.sh b/tools/drydock_image_run.sh index b91534a8..c875499d 100755 --- a/tools/drydock_image_run.sh +++ b/tools/drydock_image_run.sh @@ -9,11 +9,11 @@ function start_db { sudo docker stop 'psql_integration' fi - docker run --rm -dp 5432:5432 --name 'psql_integration' postgres:9.5 + docker run --rm -dp 5432:5432 --name 'psql_integration' -e POSTGRES_HOST_AUTH_METHOD=trust postgres:14.6 sleep 15 - docker run --rm --net host postgres:9.5 psql -h localhost -c "create user drydock with password 'drydock';" postgres postgres - docker run --rm --net host postgres:9.5 psql -h localhost -c "create database drydock;" postgres postgres + docker run --rm --net host postgres:14.6 psql -h localhost -c "create user drydock with password 'drydock';" postgres postgres + docker run --rm --net host postgres:14.6 psql -h localhost -c "create database drydock;" postgres postgres } function customize_conf { diff --git a/tools/gate/playbooks/build-charts.yaml b/tools/gate/playbooks/build-charts.yaml index 8807e4a0..d43ef828 100644 --- a/tools/gate/playbooks/build-charts.yaml +++ b/tools/gate/playbooks/build-charts.yaml @@ -13,6 +13,15 @@ # limitations under the License. - hosts: primary + + + + roles: + - bindep + - ensure-docker + - ensure-python + - ensure-pip + tasks: - name: Execute the make target to package Helm charts. make: diff --git a/tools/gate/playbooks/docker-image-build.yaml b/tools/gate/playbooks/docker-image-build.yaml index c3dcc4f2..486a0e6e 100644 --- a/tools/gate/playbooks/docker-image-build.yaml +++ b/tools/gate/playbooks/docker-image-build.yaml @@ -13,6 +13,14 @@ # limitations under the License. - hosts: primary + + roles: + - bindep + - ensure-docker + - ensure-python + - ensure-pip + + tasks: - name: Debug tag generation inputs block: @@ -40,18 +48,11 @@ debug: var: image_tags - - name: Install Docker (Debian) + - name: Install Docker python module for ansible docker login block: - - apt: - name: "{{ item }}" - with_items: - - docker.io - - python3-pip - - python3-setuptools - when: ansible_os_family == 'Debian' - pip: name: docker - version: 2.7.0 + version: 4.4.4 executable: pip3 become: True diff --git a/tools/gate/playbooks/omni_test.yaml b/tools/gate/playbooks/omni_test.yaml index d67c3014..8c11ef80 100644 --- a/tools/gate/playbooks/omni_test.yaml +++ b/tools/gate/playbooks/omni_test.yaml @@ -14,6 +14,16 @@ # to minimize Zuul node consumption - hosts: primary + + + + roles: + - bindep + - ensure-docker + - ensure-python + - ensure-pip + + tasks: - name: Execute the make target for PEP8 linting make: @@ -41,12 +51,6 @@ target: test_baclient become: true register: result - - name: Execute the make target for building and running the Drydock Docker image - make: - chdir: "{{ zuul.project.src_dir }}" - target: run_drydock - register: result - become: true - name: Setup Apparmor shell: | set -xe; @@ -54,3 +58,9 @@ args: chdir: "{{ zuul.projects['opendev.org/openstack/openstack-helm-infra'].src_dir }}" executable: /bin/bash + - name: Execute the make target for building and running the Drydock Docker image + make: + chdir: "{{ zuul.project.src_dir }}" + target: run_drydock + register: result + become: true \ No newline at end of file diff --git a/tools/helm_install.sh b/tools/helm_install.sh index 6e4c042c..14b08598 100755 --- a/tools/helm_install.sh +++ b/tools/helm_install.sh @@ -17,7 +17,7 @@ set -x HELM=$1 -HELM_ARTIFACT_URL=${HELM_ARTIFACT_URL:-"https://get.helm.sh/helm-v2.17.0-linux-amd64.tar.gz"} +HELM_ARTIFACT_URL=${HELM_ARTIFACT_URL:-"https://get.helm.sh/helm-v3.6.3-linux-amd64.tar.gz"} function install_helm_binary { diff --git a/tools/helm_tk.sh b/tools/helm_tk.sh index a0b7c8d4..34a0aa9d 100755 --- a/tools/helm_tk.sh +++ b/tools/helm_tk.sh @@ -12,65 +12,20 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -# -# Script to setup helm-toolkit and helm dep up the shipyard chart -# -HELM=$1 -HTK_REPO=${HTK_REPO:-"https://github.com/openstack/openstack-helm-infra"} -HTK_PATH=${HTK_PATH:-""} + + +set -eux + +HTK_REPO=${HTK_REPO:-"https://opendev.org/openstack/openstack-helm-infra.git"} HTK_STABLE_COMMIT=${HTK_COMMIT:-"f4972121bcb41c8d74748917804d2b239ab757f9"} -DEP_UP_LIST=${DEP_UP_LIST:-"drydock"} -BUILD_DIR=${BUILD_DIR:-$(mktemp -d)} -if [[ ! -z $(echo $http_proxy) ]] -then - export no_proxy=$no_proxy,127.0.0.1 -fi +TMP_DIR=$(mktemp -d) -set -x - -# Use ./helm as we expect this to be run in a already -# configured build directory - -function helm_serve { - if [[ -d "$HOME/.helm" ]]; then - echo ".helm directory found" - else - ${HELM} init --client-only --skip-refresh - fi - if [[ -z $(curl --noproxy '*' -s 127.0.0.1:8879 | grep 'Helm Repository') ]]; then - "${HELM}" serve & > /dev/null - while [[ -z $(curl --noproxy '*' -s 127.0.0.1:8879 | grep 'Helm Repository') ]]; do - sleep 1 - echo "Waiting for Helm Repository" - done - else - echo "Helm serve already running" - fi - - if "${HELM}" repo list | grep -q "^stable" ; then - "${HELM}" repo remove stable - fi - - ${HELM} repo add local http://localhost:8879/charts +{ + HTK_REPO_DIR=$TMP_DIR/htk + git clone "$HTK_REPO" "$HTK_REPO_DIR" + (cd "$HTK_REPO_DIR" && git reset --hard "${HTK_STABLE_COMMIT}") + cp -r "${HTK_REPO_DIR}/helm-toolkit" charts/deps/ } -mkdir -p "$BUILD_DIR" -pushd "$BUILD_DIR" -git clone $HTK_REPO || true -pushd openstack-helm-infra/$HTK_PATH -git reset --hard "${HTK_STABLE_COMMIT}" - -helm_serve -# OSH Makefile is bugged, so ensure helm is in the path -if [[ ${HELM} != "helm" ]] -then - export PATH=${PATH}:$(dirname ${HELM}) -fi - -make helm-toolkit -popd && popd -for c in $DEP_UP_LIST -do - ${HELM} dep up charts/$c -done +rm -rf "${TMP_DIR}" diff --git a/tox.ini b/tox.ini index 3919716c..1f3544e7 100644 --- a/tox.ini +++ b/tox.ini @@ -1,32 +1,32 @@ [tox] -envlist = py36,pep8,bandit +envlist = py38,pep8,bandit setupdir=python/ + [testenv] setenv = YAMLDIR = {toxinidir}/python/tests/yaml_samples/ passenv = http_proxy,HTTP_PROXY,https_proxy,HTTPS_PROXY,no_proxy,NO_PROXY deps= -r{toxinidir}/python/requirements-lock.txt - -r{toxinidir}/python/requirements-test.txt [testenv:venv] -basepython=python3 commands = {posargs} [testenv:freeze] -basepython=python3 recreate = True allowlist_externals= rm sh + pipdeptree deps= -rpython/requirements-direct.txt + -rpython/requirements-test.txt commands= - rm python/requirements-lock.txt + rm -f python/requirements-lock.txt sh -c "pip freeze --all | grep -vE 'drydock-provisioner|pyinotify|pkg-resources==0.0.0' > python/requirements-lock.txt" + sh -c "pipdeptree > python/requirements-tree.txt" [testenv:yapf] -basepython=python3 allowlist_externals=find commands= yapf -i -r --style=pep8 {toxinidir}/python/setup.py @@ -35,7 +35,7 @@ commands= yapf -i -r --style=pep8 {toxinidir}/python/tests find {toxinidir}/python/drydock_provisioner -name '__init__.py' -exec yapf -i --style=pep8 \{\} ; -[testenv:py36] +[testenv:py38] usedevelop=True setenv= PYTHONWARNING=all @@ -46,7 +46,6 @@ commands= {toxinidir}/python/tests/unit/{posargs} [testenv:integration] -basepython=python3 passenv=DOCKER_REGISTRY,IMAGE_NAME,IMAGE_PREFIX,IMAGE_TAG setenv= PYTHONWARNING=all @@ -57,7 +56,6 @@ commands= {toxinidir}/python/tests/integration/postgres/{posargs} [testenv:cover] -basepython=python3 usedevelop=True passenv=DOCKER_REGISTRY,IMAGE_NAME,IMAGE_PREFIX,IMAGE_TAG setenv= @@ -68,24 +66,20 @@ commands= {toxinidir}/python/tests/unit/ {toxinidir}/python/tests/integration/postgres [testenv:genconfig] -basepython=python3 allowlist_externals=tee sh commands = sh -c 'oslo-config-generator --config-file=etc/drydock/drydock-config-generator.conf | tee etc/drydock/drydock.conf.sample doc/source/_static/drydock.conf.sample' [testenv:genpolicy] -basepython=python3 allowlist_externals=tee sh commands = sh -c 'oslopolicy-sample-generator --config-file etc/drydock/drydock-policy-generator.conf | tee etc/drydock/policy.yaml.sample doc/source/_static/policy.yaml.sample' [testenv:pep8] -basepython=python3 commands = flake8 \ {posargs} [testenv:bandit] -basepython=python3 commands = bandit -r drydock_provisioner -n 5 [flake8] @@ -94,9 +88,9 @@ exclude= venv,.venv,.git,.idea,.tox,*.egg-info,*.eggs,bin,dist,./build/,alembic/ max-line-length=119 [testenv:docs] -basepython=python3 deps= -rdoc/requirements-doc.txt + -epython allowlist_externals=rm recreate=true commands =