We are thrilled to announce the release of:
magnum 7.0.0: Container Management project for OpenStack
This release is part of the rocky release series.
The source is available from:
** http://git.openstack.org/cgit/openstack/magnum
Download the package from:
https://tarballs.openstack.org/magnum/
Please report issues through launchpad:
** http://bugs.launchpad.net/magnum
For more details, please see below.
7.0.0 ^^^^^
New Features ************
* k8s_fedora_atomic clusters are deployed with RBAC support. Along with RBAC Node authorization is added so the appropriate certificates are generated.
* This release introduces 'federations' endpoint to Magnum API, which allows an admin to create and manage federations of clusters through Magnum. As the feature is still under development, the endpoints are not bound to any driver yet. For more details, please refer to bp /federation-api [1].
[1] https://review.openstack.org/#/q/topic:bp/federation-api
* This is allowing no floating IP to be usable with a multimaster configuration in terms of load balancers.
* Add new label 'cert_manager_api' enabling the kubernetes certificate manager api.
* Embed certificates in kubernetes config file when issuing 'cluster config', instead of generating additional files with the certificates. This is now the default behavior. To get the old behavior and still generate cert files, pass --output-certs.
* Add 'cloud_provider_enabled' label for the k8s_fedora_atomic driver. Defaults to true. For specific kubernetes versions if 'cinder' is selected as a 'volume_driver', it is implied that the cloud provider will be enabled since they are combined.
* Add new labels 'ingress_controller' and 'ingress_controller_role' enabling the deployment of a Kubernetes Ingress Controller backend for clusters. Default for 'ingress_controller' is '' (meaning no controller deployed), with possible values being 'traefik'. Default for 'ingress_controller_role' is 'ingress'.
* In the OpenStack deployment with Octavia service enabled, the Octavia service should be used not only for master nodes high availability, but also for k8s LoadBalancer type service implementation as well.
* Update kubernetes dashboard to *v1.8.3* which is compatible via kubectl proxy. Addionally, heapster is deployed as standalone deployemt and the user can enable a grafana-influx stack with the *influx_grafana_dashboard_enabled* label. See the kubernetes dashboard documenation for more details. https://github.com/kubernetes/dashboard/wiki
* Update k8s_fedora_atomic driver to the latest Fedora Atomic 27 release and run etcd and flanneld in system containers which are removed from the base OS.
Known Issues ************
* Adding 'calico' as network driver for Kubernetes so as to support network isolation between namespace with k8s network policy.
* Currently, the replicas of coreDNS pod is hardcoded as 1. It's not a reasonable number for such a critical service. Without DNS, probably all workloads running on the k8s cluster will be broken. Now Magnum is making the coreDNS pod autoscaling based on the nodes and cores number.
Upgrade Notes *************
* Using the queens (>=2.9.0) python-magnumclient, when a user executes openstack coe cluster config, the client certificate has admin as Common Name (CN) and system:masters for Organization which are required for authorization with RBAC enabled clusters. This change in the client is backwards compatible, so old clusters (without RBAC enabled) can be reached with certificates generated by the new client. However, old magnum clients will generate certificates that will not be able to contact RBAC enabled clusters. This issue affects only k8s_fedora_atomic clusters and clients <=2.8.0, note that 2.8.0 is still a queens release but only 2.9.0 includes the relevant patch. Finally, users can always generate and sign the certificates using this [0] procedure even with old clients since only the cluster config command is affected. [0] https://docs.openstack.org/magnum/latest/user/index.html #interfacing-with-a-secure-cluster
* New clusters should be created with kube_tag=v1.9.3 or later. v1.9.3 is the default version in the queens release.
* New clusters will be created with kube_tag=v1.11.1 or later. v1.11.1 is the default version in the Rocky release.
Security Issues ***************
* k8s_fedora Remove cluster role from the kubernetes-dashboard account. When accessing the dashboard and skip authentication, users login with the kunernetes-dashboard service account, if that service account has the cluster role, users have admin access without authentication. Create an admin service account for this use case and others.
Bug Fixes *********
* Add *region* parameter to the Global configuration section of the Kubernetes configuration file. Setting this parameter will allow Magnum cluster to be created in the multi-regional OpenStack installation.
* Add *trustee_keystone_region_name* optional parameter to the *trust* section. This parameter is useful for multi-regional OpenStack installations with different Identity service for every region. In such installation it is necessary to specify a region when searching for *auth_url* to authenticate a trustee user.
* Now user can update labels in cluster-template. Previously string is passed as a value to labels, but we know that labels can only hold dictionary values. Now we are parsing the string and storing it as dictionary for labels in cluster-template.
* Fix etcd configuration in k8s_fedora_atomic driver. Explicitly enable client and peer authentication and set trusted CA (ETCD_TRUSTED_CA_FILE, ETCD_PEER_TRUSTED_CA_FILE, ETCD_CLIENT_CERT_AUTH, ETCD_PEER_CLIENT_CERT_AUTH). Only new clusters will benefit from the fix.
* When creating a multi-master cluster, all master nodes will attempt to create kubernetes resources in the cluster at this same time, like coredns, the dashboard, calico etc. This race conditon shouldn't be a problem when doing declarative calls instead of imperative (kubectl apply instead of create). However, due to [1], kubectl fails to apply the changes and the deployemnt scripts fail causing cluster to creation to fail in the case of Heat SoftwareDeployments. This patch passes the ResourceGroup index of every master so that resource creation will be attempted only from the first master node. [1] https://github.com/kubernetes/kubernetes/issues/44165
* Create admin cluster role for k8s_fedora_atomic, it is defined in the configuration but it wasn't applied.
* Fix bug #1758672 [1] to protect kubelet in the k8s_fedora_atomic driver. Before this patch kubelet was listening to 0.0.0.0 and for clusters with floating IPs the kubelet was exposed. Also, even on clusters without fips the kubelet was exposed inside the cluster. This patch allows access to the kubelet only over https and with the appropriate roles. The apiserver and heapster have the appropriate roles to access it. Finally, all read-only ports have been closed to not expose any cluster data. The only remaining open ports without authentication are for healthz. [1] https://bugs.launchpad.net/magnum/+bug/1758672
* Strip signed certificate. Certificate (ca.crt) has to be striped for some application parsers as they might require pure base64 representation of the certificate itself, without empty characters at the beginning nor the end of file.
* Multi master deployments for k8s driver use different service account keys for each api/controller manager server which leads to 401 errors for service accounts. This patch will create a signed cert and private key for k8s service account keys explicitly, dedicatedly for the k8s cluster to avoid the inconsistent keys issue.
Changes in magnum 6.0.1..7.0.0 ------------------------------
cf12bb7 Bump k8s version to v1.11.1 feed29d Using cgroupfs as default cgroup-driver 2535915 [k8s] Fix docker volume issue 9d147fa Reno for embed certs in kubernetes config b991838 Using simple public/private key for k8s service account keys eb930a3 Create /etc/kubernetes/manifests on k8s master 1b0fbc2 Change Kubelet flexvolume directory a127c66 Trustee: provide region_name to auth_url searching 4751d32 Fix the heat-container-agent docker image 797f015 Resolve stack outputs only on COMPLETE d417395 Add etcd_volume_size parameter in coreos template ae158f3 Update the default admission control list 974399a k8s_fedora: Add cloud_provider_enabled label ff67ac8 Switch to stestr f6d1c0d Fix etcd race condition issue b7bfee5 Support disabling floating IPs in swarm mode c069cfb Add release notes link in README a28e560 Provide a region to the K8S Fedora Atomic config cff4823 Rename scripts 80f806f Make service account private key hidden 2521afa Pass in `region_name` to get correct heat endpoint 97f086c Revert "Rename scripts" 591a2dc Rename scripts 393e70f Allow multimaster lb with no floating ip option 043c57d Sync service account keys for multi masters 003e27f Added error handling for discoveryurl 4c5d38a k8s_fedora: Create admin cluster-role 4292b86 k8s_fedora: enable tls in traefik ingress 1710f3a k8s_fedora: set ingress traefik log level to INFO e8ac68b Use HostAddressOpt for opts that accept IP and hostnames 3c72d7b Fix race condition issue for k8s multi masters ec58c23 Add option to specify Cgroup driver for Kubelet da910ac fix tox python3 overrides edee703 Strip signed certificate d66b4f2 Revert "Strip signed certificate" 9e97c8b Devicemapper storage driver need specified volume 8996e35 Release note for supporting Octavia as LoadBalancer type service backend 69ffdae Strip signed certificate 2cc57c5 Use Octavia for LoadBalancer type service 38878fd k8s_fedora: Make CoreDNS config a SoftwareDeployment a015193 Update ca related magnum comands to osc b319f72 [doc] fix coredns correct image verison b8fb70d [doc] Correct the non-existent link for the Fedora image 8729997 Open the 8472 port of master for vxlan 91d5229 k8s_fedora: Add admin user 6215887 Follow the new PTI for document build 9eac5ed Imported Translations from Zanata 338b045 Fix incompatible requirement f6ed7d3 Add and improve tests for certificate manager 3d1ee57 Stop using slave_scripts/install-distro-packages.sh 449c8f2 Add bindep.txt file 79c002c Add calico-node on k8s master node 54a4ac9 Make DNS pod autoscale 1c0b972 fix a typo d179c37 Adding documentations about network in vms 16ce059 Adding glossary.rst 405b0c2 k8s_fedora: Add flannel to master nodes d9e590b Cache barbican certs for periodic tasks a1fb448 k8s_fedora: Explicitly set etcd authentication 205e8ad k8s_fedora: Add kubelet authentication/authorization c0f8db9 Updated from global requirements 96e8e6c add lower-constraints job 79f4cc0 Add service account to daemonset in traefik d07fb7f Add missing RBAC config for Prometheus a56c14d TrivialFix: Correcting JSON syntax dd7ed64 Update minimum version of docker in unit tests 1431be0 Add reno for RBAC and client incompatibility 57b9457 Add minimum system requirements to docs 14bf2b2 Use pip_check_reqs module 3721e6b Specify grafana version 21b50f6 Imported Translations from Zanata 30785ac Update kubernetes dashboard to v1.8.3 1eb9bf1 kuberntes: Disable the scale_manager for scale down 4efb58b k8s: allow passing extra options to kube daemons 0b18989 [kubernetes] add ingress controller 6aac363 Admin can now delete clusters in any project d95ba4d Run etcd and flanneld in a system container 838b8da Support calico as network driver 05c7f35 Add disabled_drivers config option 1e36980 Using v1.9.3 as default k8s version 0e6e27e Enables MySQL Cluster Support for Magnum 5a34d7d Check CERT_MANAGER_API if True or False 0e95314 Add missed space in k8s template file 3c8edd4 Add support for Octavia resources in Heat faa9e90 [k8s] allow enabling kubernetes cert manager api 11e7f33 Document use of kube_tag label 1caa885 Change swarm ClusterTemplate coe to swarm-mode 21c87f3 Now user can update label values in cluster-template ec950be federation api: api endpoints 4d39559 Driver's name are case sensitive 38e1051 Update reno for stable/queens 5b45639 Replace CentOS package mysql-devel > mariadb-devel 2329cb7 k8s: Fix kubelet, add RBAC and pass e2e tests 7142ba7 Corrected some misspellings in magnum
Diffstat (except docs and test files) -------------------------------------
.gitignore | 6 +- .stestr.conf | 4 + .zuul.yaml | 2 + README.rst | 1 + .../source/samples/certificates-ca-show-resp.json | 2 +- api-ref/source/samples/cluster-get-one-resp.json | 2 +- bindep.txt | 4 + devstack/lib/magnum | 15 +- devstack/plugin.sh | 2 +- lower-constraints.txt | 172 +++++ magnum/api/attr_validator.py | 27 + magnum/api/controllers/v1/__init__.py | 12 + magnum/api/controllers/v1/cluster.py | 8 +- magnum/api/controllers/v1/cluster_template.py | 6 + magnum/api/controllers/v1/federation.py | 454 ++++++++++++ magnum/api/utils.py | 9 + magnum/api/validation.py | 41 +- magnum/cmd/conductor.py | 2 + magnum/common/exception.py | 9 + magnum/common/keystone.py | 29 + magnum/common/policies/__init__.py | 2 + magnum/common/policies/cluster.py | 11 + magnum/common/policies/cluster_template.py | 11 + magnum/common/policies/federation.py | 91 +++ magnum/common/x509/operations.py | 52 +- magnum/conductor/api.py | 23 + magnum/conductor/handlers/common/cert_manager.py | 91 ++- magnum/conductor/handlers/federation_conductor.py | 32 + magnum/conf/cluster.py | 4 + magnum/conf/drivers.py | 8 +- magnum/conf/services.py | 13 +- magnum/conf/trust.py | 5 +- .../versions/05d3e97de9ee_add_volume_driver.py | 7 +- .../versions/2581ebaf0cb2_initial_migration.py | 8 +- ...35cff7c86221_add_private_network_to_baymodel.py | 8 +- ...65537a94a_add_network_driver_baymodel_column.py | 7 +- .../versions/4956f03cabad_add_cluster_distro.py | 7 +- .../4ea34a59a64c_add_discovery_url_to_bay.py | 8 +- .../versions/5518af8dbc21_rename_cert_uuid.py | 9 +- .../592131657ca1_add_coe_column_to_baymodel.py | 10 +- .../5d4caa6e0a42_create_trustee_for_each_bay.py | 11 +- .../alembic/versions/966a99e70ff_add_proxy.py | 14 +- ...71_add_fixed_subnet_column_to_baymodel_table.py | 8 +- ...47f5931da8_add_insecure_registry_to_baymodel.py | 8 +- .../fcb4efee8f8b_add_version_info_to_bay.py | 11 +- magnum/db/sqlalchemy/models.py | 40 +- magnum/drivers/common/driver.py | 18 +- .../common/image/heat-container-agent/Dockerfile | 26 +- .../scripts/heat-config-notify | 6 +- .../scripts/write-os-apply-config-templates.sh | 2 + .../environments/disable_floating_ip.yaml | 6 + .../environments/disable_lb_floating_ip.yaml | 4 + .../templates/environments/enable_floating_ip.yaml | 6 + .../environments/enable_lb_floating_ip.yaml | 4 + .../templates/environments/with_master_lb.yaml | 1 - .../environments/with_master_lb_octavia.yaml | 13 + .../configure_docker_storage_driver_atomic.sh | 12 +- .../kubernetes/fragments/calico-service.sh | 465 ++++++++++++ .../kubernetes/fragments/configure-etcd.sh | 13 +- .../fragments/configure-kubernetes-master.sh | 115 ++- .../fragments/configure-kubernetes-minion.sh | 169 +++-- .../kubernetes/fragments/core-dns-service.sh | 172 ++++- .../fragments/enable-cert-api-manager.sh | 15 + .../fragments/enable-ingress-controller.sh | 23 + .../kubernetes/fragments/enable-ingress-traefik.sh | 165 +++++ .../fragments/enable-prometheus-monitoring | 434 ----------- .../fragments/enable-prometheus-monitoring.sh | 484 +++++++++++++ .../kubernetes/fragments/enable-services-master.sh | 18 +- .../kubernetes/fragments/flannel-config-service.sh | 73 ++ .../kubernetes/fragments/flannel-service.sh | 82 +++ .../fragments/kube-apiserver-to-kubelet-role.sh | 86 +++ .../kubernetes/fragments/kube-dashboard-service.sh | 491 ++++++++++--- .../fragments/kube-system-namespace-service.sh | 71 -- .../kubernetes/fragments/make-cert-client.sh | 115 ++- .../templates/kubernetes/fragments/make-cert.sh | 124 ++-- .../kubernetes/fragments/network-config-service.sh | 79 -- .../kubernetes/fragments/network-service.sh | 82 --- .../kubernetes/fragments/wc-notify-master.sh | 7 +- .../kubernetes/fragments/write-flannel-config.sh | 28 + .../fragments/write-heat-params-master.yaml | 24 + .../kubernetes/fragments/write-heat-params.yaml | 6 + .../kubernetes/fragments/write-kube-os-config.sh | 7 + .../kubernetes/fragments/write-network-config.sh | 28 - .../common/templates/swarm/fragments/make-cert.py | 42 +- magnum/drivers/heat/driver.py | 20 +- magnum/drivers/heat/k8s_fedora_template_def.py | 45 +- magnum/drivers/heat/k8s_template_def.py | 14 +- magnum/drivers/heat/swarm_mode_template_def.py | 53 +- magnum/drivers/heat/template_def.py | 28 +- magnum/drivers/k8s_coreos_v1/driver.py | 6 +- .../fragments/write-heat-params-master.yaml | 1 + .../templates/fragments/write-heat-params.yaml | 1 + .../k8s_coreos_v1/templates/kubecluster.yaml | 22 +- .../k8s_coreos_v1/templates/kubemaster.yaml | 12 + .../k8s_coreos_v1/templates/kubeminion.yaml | 7 + magnum/drivers/k8s_fedora_atomic_v1/driver.py | 6 +- .../templates/kubecluster.yaml | 170 ++++- .../k8s_fedora_atomic_v1/templates/kubemaster.yaml | 267 ++++++- .../k8s_fedora_atomic_v1/templates/kubeminion.yaml | 49 +- magnum/drivers/k8s_fedora_ironic_v1/driver.py | 6 +- .../templates/kubecluster.yaml | 18 +- .../k8s_fedora_ironic_v1/templates/kubemaster.yaml | 38 +- .../templates/kubeminion_software_configs.yaml | 13 +- .../templates/swarmcluster.yaml | 14 +- .../templates/swarmmaster.yaml | 2 +- .../templates/swarmnode.yaml | 2 +- magnum/objects/__init__.py | 6 +- magnum/objects/federation.py | 215 ++++++ magnum/objects/fields.py | 26 + .../api/controllers/v1/test_cluster_template.py | 32 + .../unit/api/controllers/v1/test_federation.py | 415 +++++++++++ .../conductor/handlers/common/test_cert_manager.py | 234 +++++- .../conductor/handlers/test_cluster_conductor.py | 2 +- .../handlers/test_federation_conductor.py | 38 + .../handlers/test_k8s_cluster_conductor.py | 200 ++++- .../handlers/test_mesos_cluster_conductor.py | 78 +- .../handlers/test_swarm_cluster_conductor.py | 92 ++- playbooks/pre/prepare-workspace-images.yaml | 8 +- ...nd-client-incompatibility-fdfeab326dfda3bf.yaml | 20 + .../notes/add-federation-api-cf55d04f96772b0f.yaml | 11 + .../allow-multimaster-no-fip-b11520485012d949.yaml | 5 + ...broken-kuberenetes-client-d2d1da6029825208.yaml | 4 + ...284-k8s-fedora-admin-user-e760f9b0edf49391.yaml | 8 + ...02728-kube-os-conf-region-46cd60537bdabdb2.yaml | 6 + ...-trustee-auth-region-name-37796a4e6a274fb8.yaml | 8 + .../calico-network-driver-0199c2459041ae81.yaml | 5 + .../notes/cert-manager-api-ee0cf7f3b767bb5d.yaml | 5 + .../notes/client-embed-certs-322701471e4d6e1d.yaml | 6 + ...er_template_update_labels-10ce66c87795f11c.yaml | 7 + ...ure-etcd-auth-bug-1759813-baac5e0fe8a2e97f.yaml | 7 + .../notes/dns-autoscale-90b63e3d71d7794e.yaml | 8 + ...able_cloud_provider_label-ed79295041bc46a8.yaml | 7 + ...ion-for-k8s-multi-masters-29bd36de57df355a.yaml | 13 + .../notes/ingress-controller-552ea956ceabdd25.yaml | 8 + ...atomic_apply_cluster_role-8a46c881de1a1fa3.yaml | 5 + ...8s_fedora_protect_kubelet-8468ddcb92c2a624.yaml | 12 + .../strip-ca-certificate-a09d0c31c45973df.yaml | 7 + ...t-octavia-for-k8s-service-d5d7fd041f9d76fa.yaml | 6 + ...nt-keys-for-multi-masters-71217c4cf4dd472c.yaml | 9 + ...date-kubernetes-dashboard-5196831c32d55aee.yaml | 8 + .../notes/update-to-f27-cc8aa873cdf111bc.yaml | 10 + .../upgrade-to-k8s-v1.11.1-8065fd768873295d.yaml | 5 + releasenotes/source/index.rst | 1 + .../locale/en_GB/LC_MESSAGES/releasenotes.po | 806 +++++++++++++++++++++ .../source/locale/fr/LC_MESSAGES/releasenotes.po | 64 -- releasenotes/source/queens.rst | 6 + requirements.txt | 28 +- setup.cfg | 8 - specs/containers-service.rst | 2 +- test-requirements.txt | 9 +- tools/pretty_tox.sh | 16 - tox.ini | 59 +- 175 files changed, 7977 insertions(+), 1389 deletions(-)
Requirements updates --------------------
diff --git a/requirements.txt b/requirements.txt index cf3e3d1..0e5ffaa 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9 +9 @@ Babel!=2.4.0,>=2.3.4 # BSD -PyYAML>=3.10 # MIT +PyYAML>=3.12 # MIT @@ -18 +18 @@ enum34>=1.0.4;python_version=='2.7' or python_version=='2.6' or python_version== -eventlet!=0.18.3,!=0.20.1,<0.21.0,>=0.18.2 # MIT +eventlet!=0.18.3,!=0.20.1,>=0.18.2 # MIT @@ -21 +21 @@ jsonpatch!=1.20,>=1.16 # BSD -keystoneauth1>=3.3.0 # Apache-2.0 +keystoneauth1>=3.4.0 # Apache-2.0 @@ -23 +23 @@ keystonemiddleware>=4.17.0 # Apache-2.0 -kubernetes>=4.0.0 # Apache-2.0 +kubernetes>=5.0.0 # Apache-2.0 @@ -26,2 +26,2 @@ netaddr>=0.7.18 # BSD -oslo.concurrency>=3.20.0 # Apache-2.0 -oslo.config>=5.1.0 # Apache-2.0 +oslo.concurrency>=3.26.0 # Apache-2.0 +oslo.config>=5.2.0 # Apache-2.0 @@ -31 +31 @@ oslo.i18n>=3.15.3 # Apache-2.0 -oslo.log>=3.30.0 # Apache-2.0 +oslo.log>=3.36.0 # Apache-2.0 @@ -38 +38 @@ oslo.utils>=3.33.0 # Apache-2.0 -oslo.versionedobjects>=1.28.0 # Apache-2.0 +oslo.versionedobjects>=1.31.2 # Apache-2.0 @@ -43 +43 @@ pycadf!=2.0.0,>=1.1.0 # Apache-2.0 -python-barbicanclient!=4.5.0,!=4.5.1,>=4.0.0 # Apache-2.0 +python-barbicanclient>=4.5.2 # Apache-2.0 @@ -46 +46 @@ python-heatclient>=1.10.0 # Apache-2.0 -python-neutronclient>=6.3.0 # Apache-2.0 +python-neutronclient>=6.7.0 # Apache-2.0 @@ -50 +50 @@ requests>=2.14.2 # Apache-2.0 -setuptools!=24.0.0,!=34.0.0,!=34.0.1,!=34.0.2,!=34.0.3,!=34.1.0,!=34.1.1,!=34.2.0,!=34.3.0,!=34.3.1,!=34.3.2,!=36.2.0,>=16.0 # PSF/ZPL +setuptools!=24.0.0,!=34.0.0,!=34.0.1,!=34.0.2,!=34.0.3,!=34.1.0,!=34.1.1,!=34.2.0,!=34.3.0,!=34.3.1,!=34.3.2,!=36.2.0,>=21.0.0 # PSF/ZPL @@ -53,3 +53,3 @@ stevedore>=1.20.0 # Apache-2.0 -taskflow>=2.7.0 # Apache-2.0 -cryptography!=2.0,>=1.9 # BSD/Apache-2.0 -Werkzeug>=0.7 # BSD License +taskflow>=2.16.0 # Apache-2.0 +cryptography>=2.1 # BSD/Apache-2.0 +Werkzeug>=0.9 # BSD License diff --git a/test-requirements.txt b/test-requirements.txt index 12535af..209b0c4 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -15,2 +15 @@ mock>=2.0.0 # BSD -openstackdocstheme>=1.17.0 # Apache-2.0 -oslotest>=1.10.0 # Apache-2.0 +oslotest>=3.2.0 # Apache-2.0 @@ -18 +16,0 @@ osprofiler>=1.4.0 # Apache-2.0 -os-api-ref>=1.4.0 # Apache-2.0 @@ -22 +20 @@ pytz>=2013.6 # MIT -sphinx>=1.6.2 # BSD +sphinx!=1.6.6,!=1.6.7,>=1.6.2 # BSD @@ -23,0 +22 @@ testrepository>=0.0.18 # Apache-2.0/BSD +stestr>=2.0.0 # Apache-2.0 @@ -26,2 +24,0 @@ testtools>=2.2.0 # MIT -# releasenotes -reno>=2.5.0 # Apache-2.0
participants (1)
-
no-reply@openstack.org