f82d108200
* Update cliff from branch 'master' to a5bdcc6e789adb0182df0721909d7b657f9a50b5 - Merge "Handle null values when sorting" - Handle null values when sorting One unfortunate change (or fortunate, depending on how you look at types) in Python 3 is the inability to sort iterables of different types. For example: >>> x = ['foo', 'bar', None, 'qux'] >>> sorted(x) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: '<' not supported between instances of 'NoneType' and 'str' Fortunately, we can take advantage of the fact that by providing a function for the 'key' that returns a tuple, we can sort on multiple conditions. In this case, "when the first key returns that two elements are equal, the second key is used to compare." [1] We can use this to first separate the values by whether they are None or not, punting those that are not to the end, before sorting the non-None values normally. For example: >>> x = ['foo', 'bar', None, 'qux'] >>> sorted(x, key=lambda k: (k is None, k)) ['bar', 'foo', 'qux', None] We were already using this feature implicitly through our use of 'operator.itemgetter(*indexes)', which will return a tuple if there is more than one item in 'indexes', and now we simply make that explicit, fixing the case where we're attempting to compare a comparable type with None. For all other cases, such as comparing a value that isn't comparable, we surround things with a try-catch and a debug logging statement to allow things to continue. Note that we could optimize what we're done further by building a key value that covers all indexes, rather than using a for loop to do so. For example: >>> x = [('baz', 2), (None, 0), ('bar', 3), ('baz', 4), ('qux', 0)] >>> sorted(x, key=lambda k: list( ... itertools.chain((k[i] is None, k[i]) for i in (0, 1))) ... ) [('bar', 3), ('baz', 2), ('baz', 4), ('qux', 0), (None, 0)] However, this would be harder to grok and would also mean we're unable to handle exceptions on a single column where e.g. there are mixed types or types that are not comparable while still sorting on the other columns. Perhaps this would be desirable for some users, but sorting on a best-effort basis does seem wiser and generally more user friendly. Anyone that wants to sort on such columns should ensure their types are comparable or implement their own sorting implementation. [1] https://www.kite.com/python/answers/how-to-sort-by-two-keys-in-python Change-Id: I4803051a6dd05c143a15923254af97e32cd39693 Signed-off-by: Stephen Finucane <sfinucan@redhat.com> Story: 2008456 Task: 41466 |
||
---|---|---|
adjutant@e940fd4925 | ||
adjutant-ui@bb92841b5b | ||
ansible-config_template@a6347c3811 | ||
ansible-hardening@b7b945b21e | ||
ansible-role-atos-hsm@c5e5b2427b | ||
ansible-role-chrony@b25e82c0e3 | ||
ansible-role-collect-logs@3f0881dfff | ||
ansible-role-container-registry@dc3a577652 | ||
ansible-role-lunasa-hsm@b3981c6f8b | ||
ansible-role-openstack-operations@3937ea4e7e | ||
ansible-role-python_venv_build@9e7877d55a | ||
ansible-role-qdrouterd@1c06fe38f0 | ||
ansible-role-redhat-subscription@ca1fcceeb3 | ||
ansible-role-systemd_mount@483b10e5e9 | ||
ansible-role-systemd_networkd@5b327a5ca5 | ||
ansible-role-systemd_service@3c924d2531 | ||
ansible-role-thales-hsm@8590934320 | ||
ansible-role-tripleo-modify-image@9961cf84a3 | ||
ansible-role-uwsgi@498241e2e1 | ||
aodh@418d17c34b | ||
automaton@155c7c104e | ||
barbican@4b26965651 | ||
barbican-specs@d062723f97 | ||
barbican-tempest-plugin@1972c46924 | ||
barbican-ui@3a78a74342 | ||
bashate@389f8917cd | ||
bifrost@422bafd6ea | ||
blazar@345d945571 | ||
blazar-dashboard@9120374151 | ||
blazar-nova@ae65a5ce2c | ||
blazar-specs@e8615903e8 | ||
blazar-tempest-plugin@d952210ecd | ||
castellan@35f1a20d51 | ||
ceilometer@76d3d61cb2 | ||
ceilometermiddleware@caeeb51c70 | ||
charm-aodh@62aa75b7ab | ||
charm-barbican@8c4c1a23d0 | ||
charm-barbican-softhsm@927eeac5f6 | ||
charm-barbican-vault@4e32c58d75 | ||
charm-ceilometer@397d315af7 | ||
charm-ceilometer-agent@4f711cdf8f | ||
charm-ceph-fs@c592e43e86 | ||
charm-ceph-mon@6c7a168f81 | ||
charm-ceph-osd@da7953396f | ||
charm-ceph-proxy@6cdbf7f367 | ||
charm-ceph-radosgw@2d292253ed | ||
charm-ceph-rbd-mirror@18880c11c2 | ||
charm-cinder@f4e552de22 | ||
charm-cinder-backup@96076e3f1c | ||
charm-cinder-backup-swift-proxy@92eab5025f | ||
charm-cinder-ceph@165da3b811 | ||
charm-cinder-purestorage@9e09a38e91 | ||
charm-cloudkitty@3b9b265469 | ||
charm-deployment-guide@6e5c08c5d1 | ||
charm-designate@38c8fc48d2 | ||
charm-designate-bind@40f66dca81 | ||
charm-glance@f83ab69d75 | ||
charm-glance-simplestreams-sync@a8405ab0b0 | ||
charm-glusterfs@e006377f21 | ||
charm-gnocchi@710ef8118a | ||
charm-guide@e71b06319b | ||
charm-hacluster@49a9b21e57 | ||
charm-heat@29be9de9ea | ||
charm-interface-barbican-secrets@deb7f5df41 | ||
charm-interface-bgp@e134357244 | ||
charm-interface-bind-rndc@129240c190 | ||
charm-interface-ceph-client@b143db91de | ||
charm-interface-ceph-mds@dcd0b5f2bb | ||
charm-interface-ceph-rbd-mirror@61c94148d9 | ||
charm-interface-cinder-backend@7b184e580d | ||
charm-interface-cinder-backup@a1cdf71ad6 | ||
charm-interface-dashboard-plugin@91c271b120 | ||
charm-interface-designate@5f13163013 | ||
charm-interface-gnocchi@62618955c7 | ||
charm-interface-hacluster@9ea447c296 | ||
charm-interface-keystone@a48a1e826a | ||
charm-interface-keystone-admin@0fc663f575 | ||
charm-interface-keystone-credentials@9686efab18 | ||
charm-interface-keystone-domain-backend@47e50853a2 | ||
charm-interface-keystone-fid-service-provider@fb9b06d5ca | ||
charm-interface-keystone-notifications@02655dc99a | ||
charm-interface-manila-plugin@4233290785 | ||
charm-interface-mysql-innodb-cluster@5f87bb1dde | ||
charm-interface-mysql-router@6a163e702f | ||
charm-interface-mysql-shared@06675c43c9 | ||
charm-interface-neutron-load-balancer@980f971e71 | ||
charm-interface-neutron-plugin@bc908fb587 | ||
charm-interface-neutron-plugin-api-subordinate@c3d9d2ad6d | ||
charm-interface-nova-cell@663e6b741e | ||
charm-interface-nova-compute@ca95a73d6c | ||
charm-interface-odl-controller-api@199c67b69f | ||
charm-interface-openstack-ha@75286e5117 | ||
charm-interface-ovsdb-manager@6a1671abcc | ||
charm-interface-pacemaker-remote@87dc3baa21 | ||
charm-interface-placement@6c9ba2c5d8 | ||
charm-interface-rabbitmq@571f4864c2 | ||
charm-interface-service-control@7896d6766f | ||
charm-interface-websso-fid-service-provider@470348aa64 | ||
charm-ironic@cd3c8395f8 | ||
charm-keystone@e8c74b9327 | ||
charm-keystone-ldap@3bdafbaf95 | ||
charm-keystone-saml-mellon@a408b53adc | ||
charm-layer-ceph@17d40abd8d | ||
charm-layer-ceph-base@f9e75ab187 | ||
charm-layer-openstack@91e6caf3be | ||
charm-layer-openstack-api@9d208bbe54 | ||
charm-layer-openstack-principle@8100de4b24 | ||
charm-manila@1e42ff4c36 | ||
charm-manila-ganesha@f47f97d6cf | ||
charm-manila-generic@f769d9c413 | ||
charm-manila-glusterfs@145eefebe3 | ||
charm-masakari@479d1bdaf0 | ||
charm-masakari-monitors@1804db80d2 | ||
charm-mistral@2fc24d6c1d | ||
charm-murano@2af6f86f1b | ||
charm-mysql-innodb-cluster@19aa620069 | ||
charm-mysql-router@7c8acbc18f | ||
charm-neutron-api@d4e4eeb743 | ||
charm-neutron-api-odl@31954eb8de | ||
charm-neutron-api-plugin-ovn@cfbe5d5972 | ||
charm-neutron-dynamic-routing@d83bf07623 | ||
charm-neutron-gateway@75fccfb230 | ||
charm-neutron-openvswitch@292876f387 | ||
charm-nova-cell-controller@12a56051a0 | ||
charm-nova-cloud-controller@0e02c9a207 | ||
charm-nova-compute@e316cc66c3 | ||
charm-nova-compute-proxy@91d8c4f9f4 | ||
charm-nova-lxd@7b1a5ec19f | ||
charm-octavia@ba786d566c | ||
charm-octavia-dashboard@843652597c | ||
charm-octavia-diskimage-retrofit@72e5d7cb7d | ||
charm-odl-controller@51b76b3cb8 | ||
charm-openstack-dashboard@87e6acf25c | ||
charm-openvswitch-odl@e133119e9b | ||
charm-pacemaker-remote@339f023f49 | ||
charm-panko@b08168a166 | ||
charm-percona-cluster@af9c467e35 | ||
charm-placement@a2ead078ab | ||
charm-rabbitmq-server@9ec3f64119 | ||
charm-specs@8cbfdbc908 | ||
charm-swift-proxy@dee0aa7c2e | ||
charm-swift-storage@19d5010902 | ||
charm-tempest@6e19511813 | ||
charm-trilio-data-mover@d1a0122ecc | ||
charm-trilio-dm-api@10cd6cd2b8 | ||
charm-trilio-horizon-plugin@3bba36a9bd | ||
charm-trilio-wlm@2598bff3ca | ||
charm-trove@9679e95a17 | ||
charm-vault@0b569e20e2 | ||
charm-watcher@f55c13932e | ||
charm-watcher-dashboard@04886e4524 | ||
charms.ceph@a14800daa1 | ||
charms.openstack@6a050f5b3c | ||
cinder@798cb4ec05 | ||
cinder-specs@bb8e6bc242 | ||
cinder-tempest-plugin@26807d154a | ||
cinderlib@45c7b02ba5 | ||
cliff@a5bdcc6e78 | ||
cloudkitty@b0d5e455fc | ||
cloudkitty-dashboard@3439344923 | ||
cloudkitty-specs@e7f07732a3 | ||
cloudkitty-tempest-plugin@0044403c8a | ||
compute-hyperv@1c35c12ed0 | ||
cookbook-openstack-application-catalog@74d5e833b8 | ||
cookbook-openstack-bare-metal@315e9d77a7 | ||
cookbook-openstack-block-storage@2e5dd8c317 | ||
cookbook-openstack-client@cf0dff54c9 | ||
cookbook-openstack-common@f888e048e7 | ||
cookbook-openstack-compute@af47ea6ef5 | ||
cookbook-openstack-dashboard@8612724097 | ||
cookbook-openstack-dns@97a980eac7 | ||
cookbook-openstack-identity@9ed88a8ff4 | ||
cookbook-openstack-image@d60c618b4e | ||
cookbook-openstack-integration-test@6f6e3ec9fd | ||
cookbook-openstack-network@8f5801890f | ||
cookbook-openstack-ops-database@7190cf204c | ||
cookbook-openstack-ops-messaging@89013931c2 | ||
cookbook-openstack-orchestration@5178e1c937 | ||
cookbook-openstack-telemetry@c13ea35e3d | ||
cookbook-openstackclient@e216cc621e | ||
cookiecutter@f1036368c7 | ||
coverage2sql@599e92589a | ||
cyborg@82d1ed968b | ||
cyborg-specs@b5061dbe3d | ||
cyborg-tempest-plugin@f135c2ea97 | ||
debtcollector@e9db67850d | ||
designate@e8c901c323 | ||
designate-dashboard@0fb4e2e99e | ||
designate-specs@d274df4969 | ||
designate-tempest-plugin@5da3047851 | ||
devstack@aa2821eb89 | ||
devstack-plugin-amqp1@3becff51a5 | ||
devstack-plugin-ceph@f06b985abc | ||
devstack-plugin-container@d4de1bb990 | ||
devstack-plugin-cookiecutter@65c498db14 | ||
devstack-plugin-kafka@4e1c82f637 | ||
devstack-plugin-nfs@8313334259 | ||
devstack-plugin-open-cas@9ffadd7ee6 | ||
devstack-plugin-pika@2835a8cf91 | ||
devstack-plugin-zmq@98f602bbf3 | ||
devstack-tools@2381d9112d | ||
devstack-vagrant@566a3afe75 | ||
dib-utils@964784880d | ||
django_openstack_auth@58e881ec93 | ||
ec2-api@eb3b4851a9 | ||
ec2api-tempest-plugin@a086dcfa5c | ||
eslint-config-openstack@6f6fa9f2f8 | ||
freezer@9773f99feb | ||
freezer-api@d971f29f28 | ||
freezer-dr@599c2bedb3 | ||
freezer-specs@d9c1dc80ae | ||
freezer-tempest-plugin@564b03758e | ||
freezer-web-ui@312064be40 | ||
futurist@bd2356bfcf | ||
glance@2c893fbd80 | ||
glance-specs@6de8257026 | ||
glance_store@d05024afc3 | ||
grenade@0e92ea75ee | ||
hacking@213936559e | ||
heat@32f9014207 | ||
heat-agents@7b525d8eeb | ||
heat-cfnclient@48f12a2f38 | ||
heat-cfntools@c32963fdea | ||
heat-dashboard@934c8e1bba | ||
heat-specs@f26534191e | ||
heat-tempest-plugin@c5e1603fb6 | ||
heat-templates@64f020b602 | ||
heat-translator@91c4415c42 | ||
horizon@944902c5c2 | ||
instack-undercloud@87abe05ba0 | ||
ironic@af29f398cc | ||
ironic-inspector@86b974b75c | ||
ironic-inspector-specs@034bdae33e | ||
ironic-lib@7fa890fb01 | ||
ironic-prometheus-exporter@198f07df9a | ||
ironic-python-agent@68d9c70fba | ||
ironic-python-agent-builder@7e2ba37e4a | ||
ironic-specs@94a49ee021 | ||
ironic-tempest-plugin@13de53a462 | ||
ironic-ui@12eca8ae61 | ||
js-openstack-lib@346f7eeda0 | ||
karbor@353f75eca0 | ||
karbor-dashboard@1d52e37d0a | ||
karma-subunit-reporter@87c01132ab | ||
kayobe@c01099c07f | ||
kayobe-config@9813f25f45 | ||
kayobe-config-dev@4eeef973b8 | ||
keystone@d67975e7b9 | ||
keystone-specs@70f9caa740 | ||
keystone-tempest-plugin@774bb4f905 | ||
keystoneauth@6a662719ce | ||
keystonemiddleware@3659bdad86 | ||
kolla@383b1aef6f | ||
kolla-ansible@ddf462d2a0 | ||
kolla-cli@3b56a5e0f7 | ||
kuryr@f973749816 | ||
kuryr-kubernetes@2611dc3b3a | ||
kuryr-libnetwork@8f78668092 | ||
kuryr-tempest-plugin@a9114ee09a | ||
ldappool@bbc0e139d5 | ||
liberasurecode@9dccbc9ff1 | ||
loci@43b006dc79 | ||
magnum@252d722c06 | ||
magnum-specs@188a3338f7 | ||
magnum-tempest-plugin@b68a678f37 | ||
magnum-ui@a09bcb0623 | ||
manila@8c85cf31a5 | ||
manila-image-elements@d6220444fd | ||
manila-specs@ff21e8fa5a | ||
manila-tempest-plugin@d213876588 | ||
manila-test-image@1c16a41181 | ||
manila-ui@777bfd9be8 | ||
masakari@7f76081ccf | ||
masakari-dashboard@4c423195e8 | ||
masakari-monitors@6dfc7fc148 | ||
masakari-specs@46a6675b88 | ||
metalsmith@338d798018 | ||
microversion-parse@4ea5fb3285 | ||
mistral@3c83837f6c | ||
mistral-dashboard@63fa310920 | ||
mistral-extra@dfc6c56490 | ||
mistral-lib@95724c5ad0 | ||
mistral-specs@8af0629e7e | ||
mistral-tempest-plugin@776b590bd6 | ||
molteniron@524d1f1c7d | ||
monasca-agent@abc8f5982e | ||
monasca-analytics@aea6e4858d | ||
monasca-api@dea6f95c15 | ||
monasca-ceilometer@e3bfafdeb6 | ||
monasca-common@f59a2f296e | ||
monasca-events-api@fc97ceed7a | ||
monasca-grafana-datasource@e076ee51d2 | ||
monasca-kibana-plugin@b5843673c3 | ||
monasca-log-api@f73bff83cb | ||
monasca-notification@d3a6a068f0 | ||
monasca-persister@caac9719c7 | ||
monasca-specs@a9a886f326 | ||
monasca-statsd@ed2c0d24f7 | ||
monasca-tempest-plugin@74ad064fba | ||
monasca-thresh@0ee0e79a73 | ||
monasca-transform@811acd76c9 | ||
monasca-ui@6f429c8664 | ||
mox3@b22c58fcfc | ||
murano@e5d9d1b74f | ||
murano-agent@7d481ad60e | ||
murano-apps@74a0cb9580 | ||
murano-dashboard@7d710044b6 | ||
murano-pkg-check@9ab562f003 | ||
murano-specs@347b27bf90 | ||
murano-tempest-plugin@730a7f1b5c | ||
networking-bagpipe@0867e02215 | ||
networking-baremetal@7b55f069dc | ||
networking-bgpvpn@2722d5a0ad | ||
networking-generic-switch@6b1fca9439 | ||
networking-hyperv@1f6462a76e | ||
networking-midonet@1dcb2d2947 | ||
networking-odl@94edf39f3d | ||
networking-ovn@0f98803fdf | ||
networking-sfc@c1fd7280d4 | ||
neutron@a3dc80b509 | ||
neutron-dynamic-routing@d7a66c491e | ||
neutron-fwaas@caae7b6a6f | ||
neutron-fwaas-dashboard@4a0f1a3ae5 | ||
neutron-lbaas@f8d023fbfe | ||
neutron-lbaas-dashboard@7d60958b8c | ||
neutron-lib@2dabcc5cf7 | ||
neutron-specs@3f645640d9 | ||
neutron-tempest-plugin@0f13fee983 | ||
neutron-vpnaas@3d084bf483 | ||
neutron-vpnaas-dashboard@b3b63987fa | ||
nova@21e3d8ba5d | ||
nova-specs@95e7b32e7b | ||
octavia@a822f30eb1 | ||
octavia-dashboard@1a29983ebc | ||
octavia-lib@0bc8c6a0b8 | ||
octavia-tempest-plugin@2d19795b84 | ||
openstack-ansible@faf24a42f6 | ||
openstack-ansible-apt_package_pinning@2eec061c1b | ||
openstack-ansible-ceph_client@0c4498c307 | ||
openstack-ansible-galera_client@d3ef8b1256 | ||
openstack-ansible-galera_server@ec58c1d6cc | ||
openstack-ansible-haproxy_server@fbc7a600c4 | ||
openstack-ansible-lxc_container_create@9a397730b4 | ||
openstack-ansible-lxc_hosts@bd40afa00a | ||
openstack-ansible-memcached_server@ef259f76f5 | ||
openstack-ansible-nspawn_container_create@e20e45fd41 | ||
openstack-ansible-nspawn_hosts@cb736cbc02 | ||
openstack-ansible-openstack_hosts@a1d970fe55 | ||
openstack-ansible-openstack_openrc@b5b040dcc6 | ||
openstack-ansible-ops@5ea9543b23 | ||
openstack-ansible-os_aodh@c6392f9797 | ||
openstack-ansible-os_barbican@67b3512613 | ||
openstack-ansible-os_blazar@40944ad5a3 | ||
openstack-ansible-os_ceilometer@58039e36b6 | ||
openstack-ansible-os_cinder@2cbdaf9c63 | ||
openstack-ansible-os_cloudkitty@264f97d87c | ||
openstack-ansible-os_congress@e6683eac63 | ||
openstack-ansible-os_designate@8b28984a5c | ||
openstack-ansible-os_glance@e29ffd4e8e | ||
openstack-ansible-os_gnocchi@ce339f4233 | ||
openstack-ansible-os_heat@baceb2e03b | ||
openstack-ansible-os_horizon@33461af97d | ||
openstack-ansible-os_ironic@67733c8f0c | ||
openstack-ansible-os_karbor@7b44052e18 | ||
openstack-ansible-os_keystone@20cf64fa0c | ||
openstack-ansible-os_magnum@2b30c0e8c1 | ||
openstack-ansible-os_manila@f404eb46c4 | ||
openstack-ansible-os_masakari@0d76e90d10 | ||
openstack-ansible-os_mistral@2ecd74897e | ||
openstack-ansible-os_murano@5e0a408fdb | ||
openstack-ansible-os_neutron@f441b212f5 | ||
openstack-ansible-os_nova@7dd9f42945 | ||
openstack-ansible-os_octavia@3f7a572ebe | ||
openstack-ansible-os_panko@cfd201d5c7 | ||
openstack-ansible-os_placement@b58217c787 | ||
openstack-ansible-os_rally@6e0ac66be3 | ||
openstack-ansible-os_sahara@966bcd1693 | ||
openstack-ansible-os_swift@3c16888e1a | ||
openstack-ansible-os_tacker@ea34449293 | ||
openstack-ansible-os_tempest@082cc2b366 | ||
openstack-ansible-os_trove@1b779c231c | ||
openstack-ansible-os_zun@fe94ff67b3 | ||
openstack-ansible-plugins@7fccf1b43a | ||
openstack-ansible-rabbitmq_server@38abc1d954 | ||
openstack-ansible-repo_server@46c4b8e104 | ||
openstack-ansible-rsyslog_client@06593fb6ee | ||
openstack-ansible-rsyslog_server@d522633042 | ||
openstack-ansible-specs@eb2f69cfb2 | ||
openstack-ansible-tests@7fb5312be3 | ||
openstack-chef@baf017a2b6 | ||
openstack-chef-repo@5f5a010013 | ||
openstack-chef-specs@1eaa0d539b | ||
openstack-doc-tools@e1150ab84a | ||
openstack-health@f23b3622f7 | ||
openstack-helm@04ab75b4ae | ||
openstack-helm-addons@f28cae9aed | ||
openstack-helm-docs@ec436cc34f | ||
openstack-helm-images@a262c243d2 | ||
openstack-helm-infra@edcf774dea | ||
openstack-tempest-skiplist@5cfe9aa689 | ||
openstack-virtual-baremetal@5f3febe70f | ||
openstackclient@5e98b3c8a4 | ||
openstackdocstheme@a1156110c9 | ||
openstacksdk@f4dd6fe5fd | ||
os-api-ref@fc3f5d0538 | ||
os-apply-config@96ff0a9997 | ||
os-brick@9b0a91039a | ||
os-client-config@82a708b09f | ||
os-collect-config@cc519a7d48 | ||
os-ken@ee19c59a9b | ||
os-net-config@84a1a5222d | ||
os-performance-tools@40057a3409 | ||
os-refresh-config@754bb751e6 | ||
os-resource-classes@364f85e71d | ||
os-service-types@5056a77a18 | ||
os-testr@6baebaccf5 | ||
os-traits@89f7117704 | ||
os-vif@0aa1ac3859 | ||
os-win@80315f7658 | ||
osc-lib@2b7a679a42 | ||
osc-placement@f7640c9efa | ||
oslo-cookiecutter@4552af7774 | ||
oslo-specs@b467cae06c | ||
oslo.cache@ebf180e6a2 | ||
oslo.concurrency@7dcf9e9da3 | ||
oslo.config@3767cfebb1 | ||
oslo.context@3542beac23 | ||
oslo.db@9aa6114d74 | ||
oslo.i18n@8609dc2c4c | ||
oslo.limit@a5c678ce8b | ||
oslo.log@17be566d54 | ||
oslo.messaging@11a49a0a3e | ||
oslo.metrics@ef4a4e3b24 | ||
oslo.middleware@672919216b | ||
oslo.policy@d0d8ca541b | ||
oslo.privsep@83870bd265 | ||
oslo.reports@e56daeda1a | ||
oslo.rootwrap@127d938253 | ||
oslo.serialization@8445e61e93 | ||
oslo.service@d25e454d2b | ||
oslo.tools@10cb40e016 | ||
oslo.upgradecheck@a962943bda | ||
oslo.utils@3288539a0b | ||
oslo.versionedobjects@425b8d9aa1 | ||
oslo.vmware@f1a3f78ead | ||
oslotest@3539da4479 | ||
osprofiler@bcca5bd4a8 | ||
oswin-tempest-plugin@4e2b705bc0 | ||
ovn-octavia-provider@ae455d3b33 | ||
ovsdbapp@aac2da8f0c | ||
panko@8bc176fdbd | ||
patrole@0bfba962e8 | ||
paunch@d0e81c22ca | ||
pbr@f5e4c6577a | ||
performance-docs@542aedaf3a | ||
placement@d3f42f463a | ||
puppet-aodh@e05af2b3f1 | ||
puppet-barbican@de19fdedf7 | ||
puppet-ceilometer@d27fbd3fed | ||
puppet-ceph@74c698339e | ||
puppet-cinder@b420a5e7f4 | ||
puppet-cloudkitty@bee6d42b45 | ||
puppet-congress@110346a30f | ||
puppet-designate@03afe4fe47 | ||
puppet-ec2api@2d2c4b6599 | ||
puppet-freezer@dace20c940 | ||
puppet-glance@9f99b918f1 | ||
puppet-glare@bf947a6749 | ||
puppet-gnocchi@3da62d2c18 | ||
puppet-heat@8aa892a54c | ||
puppet-horizon@c14fbc28f8 | ||
puppet-ironic@c68470678a | ||
puppet-keystone@b2481b0ec0 | ||
puppet-magnum@c4cb4a12a8 | ||
puppet-manila@eed9bbd8ef | ||
puppet-mistral@b0589d88b0 | ||
puppet-monasca@00b5658c9d | ||
puppet-murano@066cd2e583 | ||
puppet-neutron@135713be4d | ||
puppet-nova@8ab07ef0a5 | ||
puppet-octavia@07d702b0c9 | ||
puppet-openstack-cookiecutter@930ffd4c8c | ||
puppet-openstack-guide@d789d0e828 | ||
puppet-openstack-integration@ad94a7f237 | ||
puppet-openstack-specs@a37891321a | ||
puppet-openstack_extras@ecd46284c3 | ||
puppet-openstack_spec_helper@a42be876c9 | ||
puppet-openstacklib@f8c74c7681 | ||
puppet-oslo@17fffffa87 | ||
puppet-ovn@3aa6ee0de9 | ||
puppet-pacemaker@2f4b6fafcb | ||
puppet-panko@47b3fac0e7 | ||
puppet-placement@f005cde832 | ||
puppet-qdr@5c6da3e066 | ||
puppet-rally@1b806a0250 | ||
puppet-sahara@c3660ea067 | ||
puppet-senlin@490af73d55 | ||
puppet-swift@3bcbf44125 | ||
puppet-tacker@2d27e156f9 | ||
puppet-tempest@1b6aced5a1 | ||
puppet-tripleo@9466c801bc | ||
puppet-trove@68f32eb70a | ||
puppet-vitrage@424864bc34 | ||
puppet-vswitch@352a0d3ad5 | ||
puppet-watcher@8015ae602a | ||
puppet-zaqar@0056ac9dc1 | ||
pycadf@2b697886a0 | ||
pyeclib@f2f83215b6 | ||
pymod2pkg@d14d9ddfc7 | ||
python-adjutantclient@32ef2538fc | ||
python-aodhclient@b747ae3161 | ||
python-barbicanclient@ad49c406fe | ||
python-blazarclient@e875b75392 | ||
python-brick-cinderclient-ext@0259467434 | ||
python-cinderclient@1abc1b5d40 | ||
python-cloudkittyclient@1e8b06243e | ||
python-cyborgclient@db8479f5c2 | ||
python-designateclient@4e4684d2d7 | ||
python-freezerclient@2fe404f68f | ||
python-glanceclient@e8f427e108 | ||
python-heatclient@b2a601c7e8 | ||
python-ironic-inspector-client@c4919b8265 | ||
python-ironicclient@1e02b3e5eb | ||
python-karborclient@e1087267bb | ||
python-keystoneclient@d5cb761763 | ||
python-magnumclient@201b3527b0 | ||
python-manilaclient@68052cd26b | ||
python-masakariclient@334a792e70 | ||
python-mistralclient@63e20bff29 | ||
python-monascaclient@952c4c12fc | ||
python-muranoclient@8a6848e402 | ||
python-neutronclient@4963c7ae14 | ||
python-novaclient@9b474afdb2 | ||
python-octaviaclient@f0554b50e7 | ||
python-openstackclient@01a53fa96f | ||
python-pankoclient@a20549e143 | ||
python-qinlingclient@4d184021c2 | ||
python-saharaclient@401e663f67 | ||
python-searchlightclient@31410355d4 | ||
python-senlinclient@e6edaee892 | ||
python-solumclient@00e7fdeecc | ||
python-swiftclient@e6876361f0 | ||
python-tackerclient@bbe6d2c7e0 | ||
python-tripleoclient@da75777ebf | ||
python-troveclient@5188cc77c5 | ||
python-vitrageclient@8293be5fed | ||
python-watcherclient@6a33b44d7f | ||
python-zaqarclient@e388947aae | ||
python-zunclient@751df7101f | ||
qa-specs@3349e897b9 | ||
qinling@77474eb9bb | ||
qinling-dashboard@ce8599cf34 | ||
rally@a72a6e1ce5 | ||
rally-openstack@ec1f31a685 | ||
release-test@455083be7e | ||
releases@143b935aee | ||
renderspec@6c13cc24f1 | ||
reno@35c0a43c39 | ||
requestsexceptions@0fda055a68 | ||
requirements@102af36c75 | ||
rpm-packaging@3a09516b12 | ||
rpm-packaging-tools@668aaf91d5 | ||
sahara@f186115958 | ||
sahara-dashboard@98bf558d77 | ||
sahara-extra@cf5762829e | ||
sahara-image-elements@ded80db266 | ||
sahara-plugin-ambari@a02327853d | ||
sahara-plugin-cdh@c3ba703098 | ||
sahara-plugin-mapr@f9c6df0c6d | ||
sahara-plugin-spark@31fc4cbef8 | ||
sahara-plugin-storm@c123704698 | ||
sahara-plugin-vanilla@07e627e3e8 | ||
sahara-specs@89194cc275 | ||
sahara-tests@98063d3fd9 | ||
searchlight@7331642231 | ||
searchlight-specs@93dde42fec | ||
searchlight-ui@30108528e7 | ||
senlin@f99412750c | ||
senlin-dashboard@eed67d5e8b | ||
senlin-tempest-plugin@a85b110a1d | ||
shade@0ced9b5a75 | ||
solum@956079ed25 | ||
solum-dashboard@874e693c34 | ||
solum-specs@71013aed21 | ||
solum-tempest-plugin@80e23bb979 | ||
specs-cookiecutter@9238dbe1c0 | ||
sphinx-feature-classification@5495c1dbcf | ||
stackviz@fd251b544b | ||
stevedore@6cd09a820e | ||
storlets@93fc96b3b1 | ||
sushy@d9004ec7d5 | ||
sushy-cli@9116165938 | ||
sushy-tools@57d05d944b | ||
swift@0c072e244c | ||
swift-bench@8845f72f40 | ||
tacker@ae3beb1fd3 | ||
tacker-horizon@70566f4861 | ||
tacker-specs@a0e237ccfb | ||
taskflow@0f7c6e94a9 | ||
telemetry-specs@039cfd4854 | ||
telemetry-tempest-plugin@6d8e8eb83f | ||
tempest@ef8e054b6b | ||
tempest-horizon@6883d8ff5a | ||
tempest-lib@000c2b49ee | ||
tempest-plugin-cookiecutter@72f0dc204a | ||
tempest-stress@0d1b2d9f2a | ||
tenks@f34bb772a0 | ||
tooz@54448e9d8b | ||
tosca-parser@1f6f7a064c | ||
tripleo-ansible@0e8c301559 | ||
tripleo-ci@8b23749692 | ||
tripleo-common@4a395662f5 | ||
tripleo-common-tempest-plugin@1b89b73011 | ||
tripleo-docs@174dd94a09 | ||
tripleo-ha-utils@c873c8e18a | ||
tripleo-heat-templates@f68a949987 | ||
tripleo-image-elements@d072a79acf | ||
tripleo-ipsec@3e445d6add | ||
tripleo-operator-ansible@b12211cf51 | ||
tripleo-puppet-elements@ad31a40211 | ||
tripleo-quickstart@79f8c6b2e4 | ||
tripleo-quickstart-extras@a3e82dd2cb | ||
tripleo-repos@2cfaa481b3 | ||
tripleo-specs@2af3ab41eb | ||
tripleo-upgrade@b9882bec2b | ||
tripleo-validations@f6144ea95f | ||
trove@6edd3332b6 | ||
trove-dashboard@c9d6d03a0f | ||
trove-specs@09b0eaace5 | ||
trove-tempest-plugin@355a351fcc | ||
ui-cookiecutter@3b5d1a5de3 | ||
validations-common@dea7b49f7e | ||
validations-libs@e4eaf3fda1 | ||
virtualbmc@5630176fd0 | ||
vitrage@fd833604d7 | ||
vitrage-dashboard@227cf73781 | ||
vitrage-specs@099e9fd543 | ||
vitrage-tempest-plugin@35d27c8157 | ||
watcher@58de9c405a | ||
watcher-dashboard@02bdd270ee | ||
watcher-specs@86df397e3e | ||
watcher-tempest-plugin@f5913409a5 | ||
whereto@eb2ca597f0 | ||
whitebox-tempest-plugin@a3a92253e8 | ||
xstatic-angular@74c316c6f7 | ||
xstatic-angular-bootstrap@fa90c1da36 | ||
xstatic-angular-gettext@6b7ba0f82b | ||
xstatic-angular-lrdragndrop@2192eb008f | ||
xstatic-angular-material@77a1575aab | ||
xstatic-angular-notify@83d3b65b76 | ||
xstatic-angular-smart-table@6d35558306 | ||
xstatic-angular-uuid@20ec6e6360 | ||
xstatic-angular-vis@da9ba723e8 | ||
xstatic-bootstrap-datepicker@f1fc9efd5e | ||
xstatic-bootstrap-scss@1ba0b95386 | ||
xstatic-bootswatch@79fa5eb9aa | ||
xstatic-d3@f66bbbf9bf | ||
xstatic-dagre@f3fd721b7b | ||
xstatic-dagre-d3@80d7aed8cf | ||
xstatic-filesaver@02800208ef | ||
xstatic-font-awesome@b8a162a5fc | ||
xstatic-graphlib@32eecfeb24 | ||
xstatic-hogan@d9d52a3631 | ||
xstatic-jasmine@f8db790b64 | ||
xstatic-jquery-migrate@2d1952a662 | ||
xstatic-jquery.quicksearch@6459ef2119 | ||
xstatic-jquery.tablesorter@09a700b565 | ||
xstatic-js-yaml@ed5ce7005b | ||
xstatic-jsencrypt@00696018e4 | ||
xstatic-json2yaml@f1e1b9f062 | ||
xstatic-lodash@3bbd3db102 | ||
xstatic-magic-search@119f1348af | ||
xstatic-mdi@64dca40a7c | ||
xstatic-moment@7734ce759a | ||
xstatic-moment-timezone@84f71a2e95 | ||
xstatic-rickshaw@8ceea48e79 | ||
xstatic-roboto-fontface@0b87d4184d | ||
xstatic-spin@14237451ba | ||
yaql@c3bda9eeb1 | ||
zaqar@656b93733e | ||
zaqar-specs@40bf1fc0ca | ||
zaqar-tempest-plugin@fef59164aa | ||
zaqar-ui@bbf27033bf | ||
zun@6ac7a3ee53 | ||
zun-tempest-plugin@749acf98d6 | ||
zun-ui@193614093d | ||
.gitmodules | ||
.gitreview | ||
LICENSE | ||
README.rst | ||
generate-gitmodules.py |
README.rst
OpenStack
OpenStack is a collection of interoperable components that can be deployed to provide computing, networking and storage resources. Those infrastructure resources can then be accessed by end users through programmable APIs.
This repository just represents OpenStack as a collection of git submodules. You can find the repositories for individual components at: https://opendev.org/openstack
You can learn more about the various components in OpenStack at: https://openstack.org/software
To learn more about how to contribute to OpenStack, please head to our Contributor portal: https://www.openstack.org/community/
To learn more about how OpenStack is governed, you can visit: https://governance.openstack.org/
Why this repository ?
Our continuous integration system, Zuul, gates all of the contained projects in an effective single timeline. This means that OpenStack, across all of the projects, does already have a sequence of combinations that have been explicitly tested, but it's non-trivial to go from a single commit of a particular project to the commits that were tested with it.
Gerrit's submodule tracking feature will update a super project every time a subproject is updated, so the specific sequence created by zuul will be captured by the super project commits.
This repo is intended to be used in a read-only manner. Any commit in this repo will get a collection of commits in the other repos that have explicitly been tested with each other, if that sort of thing is important to you.