diff --git a/.zuul.yaml b/.zuul.yaml index fd20909..399a09b 100644 --- a/.zuul.yaml +++ b/.zuul.yaml @@ -2,3 +2,8 @@ templates: - openstack-python3-charm-jobs - openstack-cover-jobs + check: + jobs: + - charmbuild + vars: + charm_build_name: heat diff --git a/charmcraft.yaml b/charmcraft.yaml index 09f0342..0b09957 100644 --- a/charmcraft.yaml +++ b/charmcraft.yaml @@ -21,13 +21,17 @@ parts: - metadata.yaml - README.md -bases: - - build-on: - - name: ubuntu - channel: "22.04" - architectures: - - amd64 - run-on: - - name: ubuntu - channel: "22.04" - architectures: [amd64, s390x, ppc64el, arm64] +base: ubuntu@24.04 +platforms: + amd64: + build-on: amd64 + build-for: amd64 + arm64: + build-on: arm64 + build-for: arm64 + ppc64el: + build-on: ppc64el + build-for: ppc64el + s390x: + build-on: s390x + build-for: s390x diff --git a/config.yaml b/config.yaml index 17c6e00..f813b29 100644 --- a/config.yaml +++ b/config.yaml @@ -19,7 +19,7 @@ options: Enable Keystone auditing middleware for logging API calls. openstack-origin: type: string - default: bobcat + default: caracal description: | Repository from which to install. May be one of the following: distro (default), ppa:somecustom/ppa, a deb url sources entry, diff --git a/hooks/charmhelpers/core/host_factory/ubuntu.py b/hooks/charmhelpers/core/host_factory/ubuntu.py index 732d76c..e87595e 100644 --- a/hooks/charmhelpers/core/host_factory/ubuntu.py +++ b/hooks/charmhelpers/core/host_factory/ubuntu.py @@ -33,6 +33,8 @@ UBUNTU_RELEASES = ( 'kinetic', 'lunar', 'mantic', + 'noble', + 'oracular', ) diff --git a/metadata.yaml b/metadata.yaml index 1c7a2c8..0384cf1 100644 --- a/metadata.yaml +++ b/metadata.yaml @@ -7,8 +7,6 @@ description: | templates in the form of text files that can be treated like code. tags: - openstack -series: - - jammy extra-bindings: public: admin: diff --git a/osci.yaml b/osci.yaml index 9a51b06..5b22ae8 100644 --- a/osci.yaml +++ b/osci.yaml @@ -6,4 +6,4 @@ needs_charm_build: true charm_build_name: heat build_type: charmcraft - charmcraft_channel: 2.x/stable + charmcraft_channel: 3.x/stable diff --git a/tests/bundles/jammy-antelope.yaml b/tests/bundles/jammy-antelope.yaml deleted file mode 100644 index fe8e408..0000000 --- a/tests/bundles/jammy-antelope.yaml +++ /dev/null @@ -1,240 +0,0 @@ -variables: - openstack-origin: &openstack-origin cloud:jammy-antelope - -series: &series jammy - -machines: - 0: - constraints: "mem=3072M" - 1: - constraints: "mem=3072M" - 2: - constraints: "mem=3072M" - 3: - 4: - 5: - 6: - 7: - constraints: "root-disk=20G mem=4G cores=4" - 8: - 9: - 10: - 11: - constaints: "mem=2048M" - 12: - constaints: "mem=2048M" - -# We specify machine placements for these to improve iteration -# time, given that machine "0" comes up way before machine "7" -applications: - - heat-mysql-router: - charm: ch:mysql-router - channel: latest/edge - nova-cloud-controller-mysql-router: - charm: ch:mysql-router - channel: latest/edge - placement-mysql-router: - charm: ch:mysql-router - channel: latest/edge - keystone-mysql-router: - charm: ch:mysql-router - channel: latest/edge - glance-mysql-router: - charm: ch:mysql-router - channel: latest/edge - neutron-api-mysql-router: - charm: ch:mysql-router - channel: latest/edge - - mysql-innodb-cluster: - charm: ch:mysql-innodb-cluster - num_units: 3 - options: - source: *openstack-origin - to: - - '0' - - '1' - - '2' - channel: latest/edge - - keystone: - charm: ch:keystone - num_units: 1 - options: - openstack-origin: *openstack-origin - to: - - '3' - channel: 2024.1/edge - - rabbitmq-server: - charm: ch:rabbitmq-server - num_units: 1 - to: - - '4' - channel: latest/edge - - glance: - charm: ch:glance - num_units: 1 - options: - openstack-origin: *openstack-origin - to: - - '5' - channel: 2024.1/edge - - nova-cloud-controller: - charm: ch:nova-cloud-controller - num_units: 1 - options: - openstack-origin: *openstack-origin - api-rate-limit-rules: "( POST, '*', .*, 9999, MINUTE );" - network-manager: Neutron - to: - - '6' - channel: 2024.1/edge - - nova-compute: - charm: ch:nova-compute - num_units: 1 - options: - openstack-origin: *openstack-origin - config-flags: 'auto_assign_floating_ip=False' - enable-live-migration: "False" - to: - - '7' - channel: 2024.1/edge - - placement: - charm: ch:placement - num_units: 1 - options: - openstack-origin: *openstack-origin - debug: "True" - to: - - '8' - channel: 2024.1/edge - - neutron-gateway: - charm: ch:neutron-gateway - num_units: 1 - options: - openstack-origin: *openstack-origin - to: - - '9' - channel: 2024.1/edge - - neutron-api: - charm: ch:neutron-api - num_units: 1 - options: - manage-neutron-plugin-legacy-mode: true - neutron-plugin: ovs - openstack-origin: *openstack-origin - to: - - '10' - channel: 2024.1/edge - - neutron-openvswitch: - charm: ch:neutron-openvswitch - channel: 2024.1/edge - - heat: - charm: ../../heat.charm - num_units: 2 - constraints: mem=2048 - options: - openstack-origin: *openstack-origin - debug: "True" - verbose: "True" - to: - - '11' - - '12' - -relations: - - - 'heat:amqp' - - 'rabbitmq-server:amqp' - - - - 'heat:identity-service' - - 'keystone:identity-service' - - - - "heat:shared-db" - - "heat-mysql-router:shared-db" - - - "heat-mysql-router:db-router" - - "mysql-innodb-cluster:db-router" - - - - 'nova-compute:image-service' - - 'glance:image-service' - - - - 'nova-compute:amqp' - - 'rabbitmq-server:amqp' - - - - "nova-cloud-controller:shared-db" - - "nova-cloud-controller-mysql-router:shared-db" - - - "nova-cloud-controller-mysql-router:db-router" - - "mysql-innodb-cluster:db-router" - - - - 'nova-cloud-controller:identity-service' - - 'keystone:identity-service' - - - - 'nova-cloud-controller:amqp' - - 'rabbitmq-server:amqp' - - - - 'nova-cloud-controller:cloud-compute' - - 'nova-compute:cloud-compute' - - - - 'nova-cloud-controller:image-service' - - 'glance:image-service' - - - - "placement:shared-db" - - "placement-mysql-router:shared-db" - - - "placement-mysql-router:db-router" - - "mysql-innodb-cluster:db-router" - - - - 'placement:identity-service' - - 'keystone:identity-service' - - - - 'placement:placement' - - 'nova-cloud-controller:placement' - - - - "keystone:shared-db" - - "keystone-mysql-router:shared-db" - - - "keystone-mysql-router:db-router" - - "mysql-innodb-cluster:db-router" - - - - 'glance:identity-service' - - 'keystone:identity-service' - - - - "glance:shared-db" - - "glance-mysql-router:shared-db" - - - "glance-mysql-router:db-router" - - "mysql-innodb-cluster:db-router" - - - - 'glance:amqp' - - 'rabbitmq-server:amqp' - - - - 'neutron-gateway:amqp' - - 'rabbitmq-server:amqp' - - - - 'nova-cloud-controller:quantum-network-service' - - 'neutron-gateway:quantum-network-service' - - - - "neutron-api:shared-db" - - "neutron-api-mysql-router:shared-db" - - - "neutron-api-mysql-router:db-router" - - "mysql-innodb-cluster:db-router" - - - - 'neutron-api:amqp' - - 'rabbitmq-server:amqp' - - - - 'neutron-api:neutron-api' - - 'nova-cloud-controller:neutron-api' - - - - 'neutron-api:identity-service' - - 'keystone:identity-service' - - - - 'nova-compute:neutron-plugin' - - 'neutron-openvswitch:neutron-plugin' - - - - 'rabbitmq-server:amqp' - - 'neutron-openvswitch:amqp' diff --git a/tests/bundles/jammy-bobcat.yaml b/tests/bundles/jammy-bobcat.yaml deleted file mode 100644 index b4275eb..0000000 --- a/tests/bundles/jammy-bobcat.yaml +++ /dev/null @@ -1,240 +0,0 @@ -variables: - openstack-origin: &openstack-origin cloud:jammy-bobcat - -series: &series jammy - -machines: - 0: - constraints: "mem=3072M" - 1: - constraints: "mem=3072M" - 2: - constraints: "mem=3072M" - 3: - 4: - 5: - 6: - 7: - constraints: "root-disk=20G mem=4G cores=4" - 8: - 9: - 10: - 11: - constaints: "mem=2048M" - 12: - constaints: "mem=2048M" - -# We specify machine placements for these to improve iteration -# time, given that machine "0" comes up way before machine "7" -applications: - - heat-mysql-router: - charm: ch:mysql-router - channel: latest/edge - nova-cloud-controller-mysql-router: - charm: ch:mysql-router - channel: latest/edge - placement-mysql-router: - charm: ch:mysql-router - channel: latest/edge - keystone-mysql-router: - charm: ch:mysql-router - channel: latest/edge - glance-mysql-router: - charm: ch:mysql-router - channel: latest/edge - neutron-api-mysql-router: - charm: ch:mysql-router - channel: latest/edge - - mysql-innodb-cluster: - charm: ch:mysql-innodb-cluster - num_units: 3 - options: - source: *openstack-origin - to: - - '0' - - '1' - - '2' - channel: latest/edge - - keystone: - charm: ch:keystone - num_units: 1 - options: - openstack-origin: *openstack-origin - to: - - '3' - channel: 2024.1/edge - - rabbitmq-server: - charm: ch:rabbitmq-server - num_units: 1 - to: - - '4' - channel: latest/edge - - glance: - charm: ch:glance - num_units: 1 - options: - openstack-origin: *openstack-origin - to: - - '5' - channel: 2024.1/edge - - nova-cloud-controller: - charm: ch:nova-cloud-controller - num_units: 1 - options: - openstack-origin: *openstack-origin - api-rate-limit-rules: "( POST, '*', .*, 9999, MINUTE );" - network-manager: Neutron - to: - - '6' - channel: 2024.1/edge - - nova-compute: - charm: ch:nova-compute - num_units: 1 - options: - openstack-origin: *openstack-origin - config-flags: 'auto_assign_floating_ip=False' - enable-live-migration: "False" - to: - - '7' - channel: 2024.1/edge - - placement: - charm: ch:placement - num_units: 1 - options: - openstack-origin: *openstack-origin - debug: "True" - to: - - '8' - channel: 2024.1/edge - - neutron-gateway: - charm: ch:neutron-gateway - num_units: 1 - options: - openstack-origin: *openstack-origin - to: - - '9' - channel: 2024.1/edge - - neutron-api: - charm: ch:neutron-api - num_units: 1 - options: - manage-neutron-plugin-legacy-mode: true - neutron-plugin: ovs - openstack-origin: *openstack-origin - to: - - '10' - channel: 2024.1/edge - - neutron-openvswitch: - charm: ch:neutron-openvswitch - channel: 2024.1/edge - - heat: - charm: ../../heat.charm - num_units: 2 - constraints: mem=2048 - options: - openstack-origin: *openstack-origin - debug: "True" - verbose: "True" - to: - - '11' - - '12' - -relations: - - - 'heat:amqp' - - 'rabbitmq-server:amqp' - - - - 'heat:identity-service' - - 'keystone:identity-service' - - - - "heat:shared-db" - - "heat-mysql-router:shared-db" - - - "heat-mysql-router:db-router" - - "mysql-innodb-cluster:db-router" - - - - 'nova-compute:image-service' - - 'glance:image-service' - - - - 'nova-compute:amqp' - - 'rabbitmq-server:amqp' - - - - "nova-cloud-controller:shared-db" - - "nova-cloud-controller-mysql-router:shared-db" - - - "nova-cloud-controller-mysql-router:db-router" - - "mysql-innodb-cluster:db-router" - - - - 'nova-cloud-controller:identity-service' - - 'keystone:identity-service' - - - - 'nova-cloud-controller:amqp' - - 'rabbitmq-server:amqp' - - - - 'nova-cloud-controller:cloud-compute' - - 'nova-compute:cloud-compute' - - - - 'nova-cloud-controller:image-service' - - 'glance:image-service' - - - - "placement:shared-db" - - "placement-mysql-router:shared-db" - - - "placement-mysql-router:db-router" - - "mysql-innodb-cluster:db-router" - - - - 'placement:identity-service' - - 'keystone:identity-service' - - - - 'placement:placement' - - 'nova-cloud-controller:placement' - - - - "keystone:shared-db" - - "keystone-mysql-router:shared-db" - - - "keystone-mysql-router:db-router" - - "mysql-innodb-cluster:db-router" - - - - 'glance:identity-service' - - 'keystone:identity-service' - - - - "glance:shared-db" - - "glance-mysql-router:shared-db" - - - "glance-mysql-router:db-router" - - "mysql-innodb-cluster:db-router" - - - - 'glance:amqp' - - 'rabbitmq-server:amqp' - - - - 'neutron-gateway:amqp' - - 'rabbitmq-server:amqp' - - - - 'nova-cloud-controller:quantum-network-service' - - 'neutron-gateway:quantum-network-service' - - - - "neutron-api:shared-db" - - "neutron-api-mysql-router:shared-db" - - - "neutron-api-mysql-router:db-router" - - "mysql-innodb-cluster:db-router" - - - - 'neutron-api:amqp' - - 'rabbitmq-server:amqp' - - - - 'neutron-api:neutron-api' - - 'nova-cloud-controller:neutron-api' - - - - 'neutron-api:identity-service' - - 'keystone:identity-service' - - - - 'nova-compute:neutron-plugin' - - 'neutron-openvswitch:neutron-plugin' - - - - 'rabbitmq-server:amqp' - - 'neutron-openvswitch:amqp' diff --git a/tests/bundles/jammy-caracal.yaml b/tests/bundles/jammy-caracal.yaml deleted file mode 100644 index 52ba230..0000000 --- a/tests/bundles/jammy-caracal.yaml +++ /dev/null @@ -1,240 +0,0 @@ -variables: - openstack-origin: &openstack-origin cloud:jammy-caracal - -series: &series jammy - -machines: - 0: - constraints: "mem=3072M" - 1: - constraints: "mem=3072M" - 2: - constraints: "mem=3072M" - 3: - 4: - 5: - 6: - 7: - constraints: "root-disk=20G mem=4G cores=4" - 8: - 9: - 10: - 11: - constaints: "mem=2048M" - 12: - constaints: "mem=2048M" - -# We specify machine placements for these to improve iteration -# time, given that machine "0" comes up way before machine "7" -applications: - - heat-mysql-router: - charm: ch:mysql-router - channel: latest/edge - nova-cloud-controller-mysql-router: - charm: ch:mysql-router - channel: latest/edge - placement-mysql-router: - charm: ch:mysql-router - channel: latest/edge - keystone-mysql-router: - charm: ch:mysql-router - channel: latest/edge - glance-mysql-router: - charm: ch:mysql-router - channel: latest/edge - neutron-api-mysql-router: - charm: ch:mysql-router - channel: latest/edge - - mysql-innodb-cluster: - charm: ch:mysql-innodb-cluster - num_units: 3 - options: - source: *openstack-origin - to: - - '0' - - '1' - - '2' - channel: latest/edge - - keystone: - charm: ch:keystone - num_units: 1 - options: - openstack-origin: *openstack-origin - to: - - '3' - channel: 2024.1/edge - - rabbitmq-server: - charm: ch:rabbitmq-server - num_units: 1 - to: - - '4' - channel: latest/edge - - glance: - charm: ch:glance - num_units: 1 - options: - openstack-origin: *openstack-origin - to: - - '5' - channel: 2024.1/edge - - nova-cloud-controller: - charm: ch:nova-cloud-controller - num_units: 1 - options: - openstack-origin: *openstack-origin - api-rate-limit-rules: "( POST, '*', .*, 9999, MINUTE );" - network-manager: Neutron - to: - - '6' - channel: 2024.1/edge - - nova-compute: - charm: ch:nova-compute - num_units: 1 - options: - openstack-origin: *openstack-origin - config-flags: 'auto_assign_floating_ip=False' - enable-live-migration: "False" - to: - - '7' - channel: 2024.1/edge - - placement: - charm: ch:placement - num_units: 1 - options: - openstack-origin: *openstack-origin - debug: "True" - to: - - '8' - channel: 2024.1/edge - - neutron-gateway: - charm: ch:neutron-gateway - num_units: 1 - options: - openstack-origin: *openstack-origin - to: - - '9' - channel: 2024.1/edge - - neutron-api: - charm: ch:neutron-api - num_units: 1 - options: - manage-neutron-plugin-legacy-mode: true - neutron-plugin: ovs - openstack-origin: *openstack-origin - to: - - '10' - channel: 2024.1/edge - - neutron-openvswitch: - charm: ch:neutron-openvswitch - channel: 2024.1/edge - - heat: - charm: ../../heat.charm - num_units: 2 - constraints: mem=2048 - options: - openstack-origin: *openstack-origin - debug: "True" - verbose: "True" - to: - - '11' - - '12' - -relations: - - - 'heat:amqp' - - 'rabbitmq-server:amqp' - - - - 'heat:identity-service' - - 'keystone:identity-service' - - - - "heat:shared-db" - - "heat-mysql-router:shared-db" - - - "heat-mysql-router:db-router" - - "mysql-innodb-cluster:db-router" - - - - 'nova-compute:image-service' - - 'glance:image-service' - - - - 'nova-compute:amqp' - - 'rabbitmq-server:amqp' - - - - "nova-cloud-controller:shared-db" - - "nova-cloud-controller-mysql-router:shared-db" - - - "nova-cloud-controller-mysql-router:db-router" - - "mysql-innodb-cluster:db-router" - - - - 'nova-cloud-controller:identity-service' - - 'keystone:identity-service' - - - - 'nova-cloud-controller:amqp' - - 'rabbitmq-server:amqp' - - - - 'nova-cloud-controller:cloud-compute' - - 'nova-compute:cloud-compute' - - - - 'nova-cloud-controller:image-service' - - 'glance:image-service' - - - - "placement:shared-db" - - "placement-mysql-router:shared-db" - - - "placement-mysql-router:db-router" - - "mysql-innodb-cluster:db-router" - - - - 'placement:identity-service' - - 'keystone:identity-service' - - - - 'placement:placement' - - 'nova-cloud-controller:placement' - - - - "keystone:shared-db" - - "keystone-mysql-router:shared-db" - - - "keystone-mysql-router:db-router" - - "mysql-innodb-cluster:db-router" - - - - 'glance:identity-service' - - 'keystone:identity-service' - - - - "glance:shared-db" - - "glance-mysql-router:shared-db" - - - "glance-mysql-router:db-router" - - "mysql-innodb-cluster:db-router" - - - - 'glance:amqp' - - 'rabbitmq-server:amqp' - - - - 'neutron-gateway:amqp' - - 'rabbitmq-server:amqp' - - - - 'nova-cloud-controller:quantum-network-service' - - 'neutron-gateway:quantum-network-service' - - - - "neutron-api:shared-db" - - "neutron-api-mysql-router:shared-db" - - - "neutron-api-mysql-router:db-router" - - "mysql-innodb-cluster:db-router" - - - - 'neutron-api:amqp' - - 'rabbitmq-server:amqp' - - - - 'neutron-api:neutron-api' - - 'nova-cloud-controller:neutron-api' - - - - 'neutron-api:identity-service' - - 'keystone:identity-service' - - - - 'nova-compute:neutron-plugin' - - 'neutron-openvswitch:neutron-plugin' - - - - 'rabbitmq-server:amqp' - - 'neutron-openvswitch:amqp' diff --git a/tests/bundles/noble-caracal.yaml b/tests/bundles/noble-caracal.yaml index aa0241e..793043e 100644 --- a/tests/bundles/noble-caracal.yaml +++ b/tests/bundles/noble-caracal.yaml @@ -65,7 +65,7 @@ applications: openstack-origin: *openstack-origin to: - '3' - channel: 2024.1/edge + channel: latest/edge rabbitmq-server: charm: ch:rabbitmq-server @@ -81,7 +81,7 @@ applications: openstack-origin: *openstack-origin to: - '5' - channel: 2024.1/edge + channel: latest/edge nova-cloud-controller: charm: ch:nova-cloud-controller @@ -92,7 +92,7 @@ applications: network-manager: Neutron to: - '6' - channel: 2024.1/edge + channel: latest/edge nova-compute: charm: ch:nova-compute @@ -103,7 +103,7 @@ applications: enable-live-migration: "False" to: - '7' - channel: 2024.1/edge + channel: latest/edge placement: charm: ch:placement @@ -113,7 +113,7 @@ applications: debug: "True" to: - '8' - channel: 2024.1/edge + channel: latest/edge neutron-gateway: charm: ch:neutron-gateway @@ -122,7 +122,7 @@ applications: openstack-origin: *openstack-origin to: - '9' - channel: 2024.1/edge + channel: latest/edge neutron-api: charm: ch:neutron-api @@ -133,11 +133,11 @@ applications: openstack-origin: *openstack-origin to: - '10' - channel: 2024.1/edge + channel: latest/edge neutron-openvswitch: charm: ch:neutron-openvswitch - channel: 2024.1/edge + channel: latest/edge heat: charm: ../../heat.charm diff --git a/tests/tests.yaml b/tests/tests.yaml index 6154d3b..5359303 100644 --- a/tests/tests.yaml +++ b/tests/tests.yaml @@ -1,11 +1,9 @@ charm_name: heat smoke_bundles: - - jammy-caracal + - noble-caracal gate_bundles: - - jammy-antelope - - jammy-bobcat - - jammy-caracal + - noble-caracal dev_bundles: - noble-caracal configure: diff --git a/tox.ini b/tox.ini index 0a594c8..d66d51a 100644 --- a/tox.ini +++ b/tox.ini @@ -22,6 +22,7 @@ skip_install = True setenv = VIRTUAL_ENV={envdir} PYTHONHASHSEED=0 CHARM_DIR={envdir} + TEST_JUJU3=1 # Note(mylesjp): Force Juju 3 commands = stestr run --slowest {posargs} allowlist_externals = charmcraft @@ -33,7 +34,7 @@ passenv = OS_* TEST_* deps = - -c {env:TEST_CONSTRAINTS_FILE:https://raw.githubusercontent.com/openstack-charmers/zaza-openstack-tests/master/constraints/constraints-2024.1.txt} + -c {env:TEST_CONSTRAINTS_FILE:https://raw.githubusercontent.com/openstack-charmers/zaza-openstack-tests/master/constraints/constraints-noble.txt} -r{toxinidir}/test-requirements.txt [testenv:build] @@ -52,14 +53,14 @@ commands = [testenv:py310] basepython = python3.10 deps = - -c {env:TEST_CONSTRAINTS_FILE:https://raw.githubusercontent.com/openstack-charmers/zaza-openstack-tests/master/constraints/constraints-2024.1.txt} + -c {env:TEST_CONSTRAINTS_FILE:https://raw.githubusercontent.com/openstack-charmers/zaza-openstack-tests/master/constraints/constraints-noble.txt} -r{toxinidir}/requirements.txt -r{toxinidir}/test-requirements.txt [testenv:py3] basepython = python3 deps = - -c {env:TEST_CONSTRAINTS_FILE:https://raw.githubusercontent.com/openstack-charmers/zaza-openstack-tests/master/constraints/constraints-2024.1.txt} + -c {env:TEST_CONSTRAINTS_FILE:https://raw.githubusercontent.com/openstack-charmers/zaza-openstack-tests/master/constraints/constraints-noble.txt} -r{toxinidir}/requirements.txt -r{toxinidir}/test-requirements.txt @@ -75,7 +76,7 @@ commands = flake8 {posargs} hooks unit_tests tests actions lib files # https://github.com/openstack/nova/blob/master/tox.ini basepython = python3 deps = - -c {env:TEST_CONSTRAINTS_FILE:https://raw.githubusercontent.com/openstack-charmers/zaza-openstack-tests/master/constraints/constraints-2024.1.txt} + -c {env:TEST_CONSTRAINTS_FILE:https://raw.githubusercontent.com/openstack-charmers/zaza-openstack-tests/master/constraints/constraints-noble.txt} -r{toxinidir}/requirements.txt -r{toxinidir}/test-requirements.txt setenv =