We are chuffed to announce the release of: horizon 22.0.0: OpenStack Dashboard This release is part of the yoga release series. The source is available from: https://opendev.org/openstack/horizon Download the package from: https://tarballs.openstack.org/horizon/ Please report issues through: https://bugs.launchpad.net/horizon/+bugs For more details, please see below. 22.0.0 ^^^^^^ New Features ************ * [:blueprint:`handle-multiple-login-sessions-from-same-user-in- horizon`] This blueprint allows operators to control if multiple simultaneous dashboard sessions are allowed or not for a user. A new setting "SIMULTANEOUS_SESSIONS" controls the behavior. The default behavior allows multiple dashboard sessions for a user. The new setting allows operators to configure horizon to disallow multiple sessions per user. When multiple simultaneous sessions are disabled, the most recent authenticated session will be considered as the valid one and the previous session will be invalidated. * Add Rules CRUD operations to the Network QoS Policy. Added create, edit, and delete rules operation to the network qos policy. Rules supported - Bandwidth-Limit, Minimum-Bandwidth, DSCP- Marking, and Minimum-Packet-Rate. Upgrade Notes ************* * The default value of OPENSTACK_KEYSTONE_DEFAULT_ROLE is changed from _member_ to member to conform with what keystone-bootstrap creates. Bug Fixes ********* * Fixed lack of pagination for the networks page under Project and Admin Dashboard. * Previously, ToggleSuspend class checked os-rescue policy for resume operation. By this fix, the class checks 'os_compute_api:os- suspend- server:resume' policy to align to resume operation. Changes in horizon 21.0.0..22.0.0 --------------------------------- 05473b765 Sync default policy rules f2832f3b0 instance UT: Recover mock_server_get.return_value a7956cd00 Avoid extra flavor_get in resize server form 29da80152 Change to a proper policy for Resume operation 5d6eefa49 Create Horizon session control logic 9f5d659d1 Get ports directly instead of via loop 94e4e2df0 Imported Translations from Zanata aa83752f2 Add Rules operation to Network QoS Policy 196de449b Implement pagination in admin/proj network tab 3c4accf94 Follow-up: Drop Django launch instance (part 2) 115326769 Integration tests: Allow to run a specific test from tox d269b1640 Fix for "Resize instance" button dbaca46d0 Add a unit test for the password change form 569caf0b7 Add Python 3 only classifier fa29ed8e6 doc: Update setup file examples in the plugin tutorial 5d0b2b74d Replace deprecated imp module 88dd887ad Fix getting defaults from cookie for region field in password form 7052b7f06 Address RemovedInDjango40Warning (7) 00def145d Address RemovedInDjango40Warning (6) 94216e027 Address RemovedInDjango40Warning (5) e4444e697 Address RemovedInDjango40Warning (4) d9266fd82 Address RemovedInDjango40Warning (3) cd7c1b511 Address RemovedInDjango40Warning (2) b84701208 Mark "Source" tab in the launch instance form as required e2bb7d833 Fix Project Limits for resize instance dialog b430d5aa4 Follow-up: Drop Django based implementation of launch instance e34e0ea73 fix ValueError: invalid content length with swift over UWSGI a9d5273f3 Address RemovedInDjango40Warning (1) 0bba95f19 Make stack template page handle session expiration 029de21c1 Add a Note Under Install and configure Section in documentation a375c5418 Update default value of OPENSTACK_KEYSTONE_DEFAULT_ROLE e9ca00162 Modified the image page to use CSS class Diffstat (except docs and test files) ------------------------------------- .../contributor/topics/ini-based-configuration.rst | 2 +- .../locale/en_GB/LC_MESSAGES/doc-configuration.po | 101 +- .../locale/en_GB/LC_MESSAGES/doc-contributor.po | 97 +- .../locale/id/LC_MESSAGES/doc-configuration.po | 96 +- .../locale/id/LC_MESSAGES/doc-contributor.po | 98 +- horizon/base.py | 16 +- horizon/browsers/base.py | 2 +- horizon/browsers/views.py | 2 +- horizon/conf/default.py | 2 +- horizon/conf/panel_template/urls.py.tmpl | 4 +- horizon/decorators.py | 2 +- horizon/defaults.py | 5 +- horizon/exceptions.py | 12 +- horizon/forms/fields.py | 23 +- horizon/forms/views.py | 7 +- horizon/messages.py | 12 +- horizon/middleware/__init__.py | 2 + horizon/middleware/base.py | 7 +- horizon/middleware/simultaneous_sessions.py | 50 + horizon/notifications.py | 2 +- horizon/site_urls.py | 30 +- horizon/static/horizon/js/horizon.heattop.js | 5 + horizon/tables/actions.py | 2 +- horizon/tables/base.py | 15 +- horizon/tabs/views.py | 3 +- .../horizon/common/_data_table_table_actions.html | 2 +- horizon/templatetags/horizon.py | 12 +- horizon/templatetags/sizeformat.py | 12 +- horizon/test/helpers.py | 4 +- horizon/test/test_dashboards/cats/kittens/urls.py | 4 +- horizon/test/test_dashboards/cats/tigers/urls.py | 4 +- .../test/test_dashboards/dogs/puppies/tables.py | 6 +- horizon/test/test_dashboards/dogs/puppies/urls.py | 6 +- .../unit/middleware/test_simultaneous_sessions.py | 61 + horizon/test/unit/tables/test_tables.py | 14 +- horizon/test/unit/test_base.py | 2 +- horizon/test/unit/test_exceptions.py | 8 +- horizon/test/unit/test_messages.py | 6 +- horizon/test/unit/test_views.py | 2 +- horizon/test/urls.py | 22 +- horizon/utils/filters.py | 2 +- horizon/utils/functions.py | 7 +- horizon/utils/http.py | 28 + horizon/utils/lazy_encoder.py | 4 +- horizon/utils/validators.py | 2 +- horizon/views.py | 4 +- horizon/workflows/base.py | 15 +- horizon/workflows/views.py | 12 +- lower-constraints.txt | 24 +- openstack_auth/backend.py | 2 +- openstack_auth/forms.py | 5 +- openstack_auth/locale/ru/LC_MESSAGES/django.po | 12 +- openstack_auth/plugin/base.py | 2 +- openstack_auth/plugin/k2k.py | 2 +- openstack_auth/urls.py | 39 +- openstack_auth/views.py | 33 +- openstack_dashboard/api/cinder.py | 2 +- openstack_dashboard/api/glance.py | 2 +- openstack_dashboard/api/keystone.py | 2 +- openstack_dashboard/api/neutron.py | 595 +++++++- openstack_dashboard/api/nova.py | 2 +- openstack_dashboard/api/rest/cinder.py | 2 +- openstack_dashboard/api/rest/json_encoder.py | 2 +- openstack_dashboard/api/rest/neutron.py | 156 ++- openstack_dashboard/api/rest/nova.py | 9 +- openstack_dashboard/api/rest/swift.py | 7 +- openstack_dashboard/api/rest/urls.py | 5 +- openstack_dashboard/api/rest/utils.py | 3 +- openstack_dashboard/api/swift.py | 2 +- openstack_dashboard/conf/cinder_policy.yaml | 1229 ++++++++++++++-- .../conf/default_policies/cinder.yaml | 914 ++++++++++-- .../conf/default_policies/glance.yaml | 573 +++++--- .../conf/default_policies/keystone.yaml | 793 +++++------ .../conf/default_policies/neutron.yaml | 900 ++++++------ .../conf/default_policies/nova.yaml | 1439 +++++-------------- openstack_dashboard/conf/glance_policy.yaml | 212 ++- openstack_dashboard/conf/keystone_policy.yaml | 33 +- openstack_dashboard/conf/neutron_policy.yaml | 1478 +++++++++++--------- openstack_dashboard/conf/nova_policy.yaml | 841 +++++------ openstack_dashboard/contrib/developer/dashboard.py | 2 +- .../contrib/developer/form_builder/panel.py | 2 +- .../contrib/developer/form_builder/urls.py | 4 +- .../contrib/developer/profiler/middleware.py | 2 +- .../contrib/developer/profiler/panel.py | 2 +- .../contrib/developer/profiler/urls.py | 4 +- .../contrib/developer/profiler/views.py | 2 +- .../contrib/developer/resource_browser/panel.py | 2 +- .../contrib/developer/resource_browser/urls.py | 4 +- .../contrib/developer/theme_preview/panel.py | 2 +- .../contrib/developer/theme_preview/urls.py | 4 +- .../contrib/developer/theme_preview/views.py | 2 +- .../dashboards/admin/aggregates/forms.py | 2 +- .../dashboards/admin/aggregates/panel.py | 2 +- .../dashboards/admin/aggregates/tables.py | 8 +- .../dashboards/admin/aggregates/urls.py | 18 +- .../dashboards/admin/aggregates/views.py | 2 +- .../dashboards/admin/aggregates/workflows.py | 2 +- .../dashboards/admin/backups/forms.py | 2 +- .../dashboards/admin/backups/tables.py | 8 +- .../dashboards/admin/backups/urls.py | 22 +- .../dashboards/admin/backups/views.py | 2 +- openstack_dashboard/dashboards/admin/dashboard.py | 2 +- .../dashboards/admin/defaults/panel.py | 2 +- .../dashboards/admin/defaults/tables.py | 2 +- .../dashboards/admin/defaults/tabs.py | 2 +- .../dashboards/admin/defaults/urls.py | 8 +- .../dashboards/admin/defaults/views.py | 2 +- .../dashboards/admin/defaults/workflows.py | 2 +- .../dashboards/admin/flavors/panel.py | 2 +- .../dashboards/admin/flavors/tables.py | 8 +- .../dashboards/admin/flavors/urls.py | 23 +- .../dashboards/admin/flavors/views.py | 2 +- .../dashboards/admin/flavors/workflows.py | 2 +- .../dashboards/admin/floating_ips/forms.py | 2 +- .../dashboards/admin/floating_ips/panel.py | 2 +- .../dashboards/admin/floating_ips/tables.py | 2 +- .../dashboards/admin/floating_ips/urls.py | 10 +- .../dashboards/admin/floating_ips/views.py | 2 +- .../dashboards/admin/group_types/forms.py | 2 +- .../dashboards/admin/group_types/panel.py | 2 +- .../dashboards/admin/group_types/specs/forms.py | 2 +- .../dashboards/admin/group_types/specs/tables.py | 8 +- .../dashboards/admin/group_types/specs/urls.py | 10 +- .../dashboards/admin/group_types/specs/views.py | 2 +- .../dashboards/admin/group_types/tables.py | 8 +- .../dashboards/admin/group_types/urls.py | 18 +- .../dashboards/admin/group_types/views.py | 2 +- .../dashboards/admin/hypervisors/compute/forms.py | 2 +- .../dashboards/admin/hypervisors/compute/tables.py | 8 +- .../dashboards/admin/hypervisors/compute/tabs.py | 2 +- .../dashboards/admin/hypervisors/compute/urls.py | 20 +- .../dashboards/admin/hypervisors/compute/views.py | 2 +- .../dashboards/admin/hypervisors/panel.py | 2 +- .../dashboards/admin/hypervisors/tables.py | 2 +- .../dashboards/admin/hypervisors/tabs.py | 2 +- .../dashboards/admin/hypervisors/urls.py | 12 +- .../dashboards/admin/hypervisors/views.py | 2 +- .../dashboards/admin/images/panel.py | 2 +- .../dashboards/admin/images/tables.py | 2 +- .../dashboards/admin/images/urls.py | 22 +- .../dashboards/admin/images/views.py | 2 +- openstack_dashboard/dashboards/admin/info/panel.py | 2 +- .../dashboards/admin/info/tables.py | 2 +- openstack_dashboard/dashboards/admin/info/tabs.py | 2 +- openstack_dashboard/dashboards/admin/info/urls.py | 4 +- openstack_dashboard/dashboards/admin/info/views.py | 2 +- .../dashboards/admin/instances/forms.py | 2 +- .../dashboards/admin/instances/panel.py | 2 +- .../dashboards/admin/instances/tables.py | 8 +- .../dashboards/admin/instances/urls.py | 25 +- .../dashboards/admin/instances/views.py | 2 +- .../dashboards/admin/metadata_defs/forms.py | 2 +- .../dashboards/admin/metadata_defs/panel.py | 2 +- .../dashboards/admin/metadata_defs/tables.py | 8 +- .../dashboards/admin/metadata_defs/tabs.py | 2 +- .../dashboards/admin/metadata_defs/urls.py | 14 +- .../dashboards/admin/metadata_defs/views.py | 2 +- .../dashboards/admin/networks/agents/forms.py | 2 +- .../dashboards/admin/networks/agents/tables.py | 8 +- .../dashboards/admin/networks/agents/tabs.py | 2 +- .../dashboards/admin/networks/agents/views.py | 2 +- .../dashboards/admin/networks/forms.py | 2 +- .../dashboards/admin/networks/panel.py | 2 +- .../dashboards/admin/networks/ports/tables.py | 2 +- .../dashboards/admin/networks/ports/urls.py | 10 +- .../dashboards/admin/networks/ports/views.py | 2 +- .../dashboards/admin/networks/ports/workflows.py | 2 +- .../dashboards/admin/networks/subnets/tables.py | 2 +- .../dashboards/admin/networks/subnets/urls.py | 4 +- .../dashboards/admin/networks/subnets/workflows.py | 2 +- .../dashboards/admin/networks/tables.py | 2 +- .../dashboards/admin/networks/urls.py | 46 +- .../dashboards/admin/networks/views.py | 19 +- .../dashboards/admin/ngflavors/panel.py | 2 +- .../dashboards/admin/ngflavors/urls.py | 4 +- .../dashboards/admin/overview/panel.py | 2 +- .../dashboards/admin/overview/urls.py | 4 +- .../dashboards/admin/overview/views.py | 2 +- .../dashboards/admin/rbac_policies/forms.py | 2 +- .../dashboards/admin/rbac_policies/panel.py | 2 +- .../dashboards/admin/rbac_policies/tables.py | 8 +- .../dashboards/admin/rbac_policies/tabs.py | 2 +- .../dashboards/admin/rbac_policies/urls.py | 18 +- .../dashboards/admin/rbac_policies/views.py | 2 +- .../admin/routers/extensions/extraroutes/tables.py | 2 +- .../dashboards/admin/routers/forms.py | 2 +- .../dashboards/admin/routers/panel.py | 2 +- .../dashboards/admin/routers/ports/tables.py | 2 +- .../dashboards/admin/routers/ports/urls.py | 4 +- .../dashboards/admin/routers/tables.py | 2 +- .../dashboards/admin/routers/urls.py | 24 +- .../dashboards/admin/routers/views.py | 2 +- .../dashboards/admin/snapshots/forms.py | 2 +- .../dashboards/admin/snapshots/panel.py | 2 +- .../dashboards/admin/snapshots/tables.py | 2 +- .../dashboards/admin/snapshots/tabs.py | 2 +- .../dashboards/admin/snapshots/urls.py | 16 +- .../dashboards/admin/snapshots/views.py | 2 +- .../dashboards/admin/trunks/panel.py | 2 +- .../dashboards/admin/trunks/urls.py | 10 +- .../dashboards/admin/vg_snapshots/tables.py | 2 +- .../dashboards/admin/vg_snapshots/urls.py | 10 +- .../dashboards/admin/vg_snapshots/views.py | 2 +- .../dashboards/admin/volume_groups/tables.py | 2 +- .../dashboards/admin/volume_groups/urls.py | 28 +- .../dashboards/admin/volume_groups/views.py | 2 +- .../dashboards/admin/volume_types/extras/forms.py | 2 +- .../dashboards/admin/volume_types/extras/tables.py | 8 +- .../dashboards/admin/volume_types/extras/urls.py | 8 +- .../dashboards/admin/volume_types/extras/views.py | 2 +- .../dashboards/admin/volume_types/forms.py | 2 +- .../dashboards/admin/volume_types/panel.py | 2 +- .../admin/volume_types/qos_specs/forms.py | 2 +- .../admin/volume_types/qos_specs/tables.py | 8 +- .../admin/volume_types/qos_specs/urls.py | 13 +- .../admin/volume_types/qos_specs/views.py | 2 +- .../dashboards/admin/volume_types/tables.py | 16 +- .../dashboards/admin/volume_types/urls.py | 60 +- .../dashboards/admin/volume_types/views.py | 2 +- .../dashboards/admin/volumes/forms.py | 2 +- .../dashboards/admin/volumes/panel.py | 2 +- .../dashboards/admin/volumes/tables.py | 2 +- .../dashboards/admin/volumes/urls.py | 38 +- .../dashboards/admin/volumes/views.py | 2 +- .../identity/application_credentials/forms.py | 2 +- .../identity/application_credentials/panel.py | 2 +- .../identity/application_credentials/tables.py | 8 +- .../identity/application_credentials/urls.py | 26 +- .../identity/application_credentials/views.py | 2 +- .../dashboards/identity/dashboard.py | 2 +- .../dashboards/identity/domains/panel.py | 2 +- .../dashboards/identity/domains/tables.py | 16 +- .../dashboards/identity/domains/urls.py | 15 +- .../dashboards/identity/domains/views.py | 2 +- .../dashboards/identity/domains/workflows.py | 2 +- .../dashboards/identity/groups/forms.py | 2 +- .../dashboards/identity/groups/panel.py | 2 +- .../dashboards/identity/groups/tables.py | 16 +- .../dashboards/identity/groups/urls.py | 20 +- .../dashboards/identity/groups/views.py | 2 +- .../identity/identity_providers/forms.py | 2 +- .../identity/identity_providers/panel.py | 2 +- .../identity/identity_providers/protocols/forms.py | 2 +- .../identity_providers/protocols/tables.py | 8 +- .../identity/identity_providers/protocols/urls.py | 4 +- .../identity/identity_providers/protocols/views.py | 2 +- .../identity/identity_providers/tables.py | 8 +- .../dashboards/identity/identity_providers/tabs.py | 2 +- .../dashboards/identity/identity_providers/urls.py | 26 +- .../identity/identity_providers/views.py | 2 +- .../dashboards/identity/mappings/forms.py | 2 +- .../dashboards/identity/mappings/panel.py | 2 +- .../dashboards/identity/mappings/tables.py | 8 +- .../dashboards/identity/mappings/urls.py | 10 +- .../dashboards/identity/mappings/views.py | 2 +- .../dashboards/identity/projects/groups/tables.py | 2 +- .../dashboards/identity/projects/panel.py | 2 +- .../dashboards/identity/projects/tables.py | 8 +- .../dashboards/identity/projects/tabs.py | 2 +- .../dashboards/identity/projects/urls.py | 22 +- .../dashboards/identity/projects/users/tables.py | 2 +- .../dashboards/identity/projects/views.py | 2 +- .../dashboards/identity/projects/workflows.py | 2 +- .../dashboards/identity/roles/forms.py | 2 +- .../dashboards/identity/roles/panel.py | 2 +- .../dashboards/identity/roles/tables.py | 8 +- .../dashboards/identity/roles/urls.py | 14 +- .../dashboards/identity/roles/views.py | 2 +- .../dashboards/identity/users/forms.py | 2 +- .../dashboards/identity/users/groups/tables.py | 2 +- .../dashboards/identity/users/panel.py | 2 +- .../identity/users/role_assignments/tables.py | 2 +- .../dashboards/identity/users/tables.py | 16 +- .../dashboards/identity/users/tabs.py | 2 +- .../dashboards/identity/users/urls.py | 22 +- .../dashboards/identity/users/views.py | 2 +- .../dashboards/project/api_access/forms.py | 2 +- .../dashboards/project/api_access/panel.py | 2 +- .../dashboards/project/api_access/tables.py | 2 +- .../dashboards/project/api_access/urls.py | 21 +- .../dashboards/project/api_access/views.py | 2 +- .../dashboards/project/backups/forms.py | 2 +- .../dashboards/project/backups/panel.py | 2 +- .../dashboards/project/backups/tables.py | 8 +- .../dashboards/project/backups/tabs.py | 2 +- .../dashboards/project/backups/urls.py | 16 +- .../dashboards/project/backups/views.py | 2 +- .../dashboards/project/containers/panel.py | 2 +- .../dashboards/project/containers/urls.py | 12 +- .../dashboards/project/containers/utils.py | 2 +- .../dashboards/project/dashboard.py | 2 +- .../dashboards/project/floating_ips/forms.py | 2 +- .../dashboards/project/floating_ips/panel.py | 2 +- .../dashboards/project/floating_ips/tables.py | 8 +- .../dashboards/project/floating_ips/urls.py | 8 +- .../dashboards/project/floating_ips/views.py | 2 +- .../dashboards/project/floating_ips/workflows.py | 2 +- .../dashboards/project/images/images/forms.py | 2 +- .../dashboards/project/images/images/tables.py | 8 +- .../dashboards/project/images/images/tabs.py | 2 +- .../dashboards/project/images/images/urls.py | 19 +- .../dashboards/project/images/images/views.py | 2 +- .../dashboards/project/images/panel.py | 2 +- .../dashboards/project/images/snapshots/forms.py | 2 +- .../dashboards/project/images/snapshots/urls.py | 8 +- .../dashboards/project/images/snapshots/views.py | 2 +- .../dashboards/project/images/urls.py | 16 +- .../dashboards/project/images/utils.py | 2 +- .../dashboards/project/images/views.py | 2 +- .../dashboards/project/instances/audit_tables.py | 2 +- .../dashboards/project/instances/console.py | 2 +- .../dashboards/project/instances/forms.py | 2 +- .../project/instances/interfaces_tables.py | 2 +- .../dashboards/project/instances/panel.py | 2 +- .../dashboards/project/instances/tables.py | 66 +- .../dashboards/project/instances/tabs.py | 2 +- .../templates/instances/_flavors_and_quotas.html | 40 +- .../templates/instances/_launch_advanced_help.html | 2 - .../templates/instances/_launch_details_help.html | 7 - .../templates/instances/_launch_network_help.html | 3 - .../instances/_launch_network_ports_help.html | 7 - .../templates/instances/_launch_volumes_help.html | 3 - .../templates/instances/_update_networks.html | 36 - .../dashboards/project/instances/urls.py | 65 +- .../dashboards/project/instances/utils.py | 66 +- .../dashboards/project/instances/views.py | 19 +- .../project/instances/workflows/resize_instance.py | 46 +- .../project/instances/workflows/update_instance.py | 2 +- .../dashboards/project/key_pairs/forms.py | 2 +- .../dashboards/project/key_pairs/panel.py | 2 +- .../dashboards/project/key_pairs/tables.py | 8 +- .../dashboards/project/key_pairs/urls.py | 21 +- .../dashboards/project/key_pairs/views.py | 2 +- .../dashboards/project/network_qos/panel.py | 2 +- .../dashboards/project/network_qos/urls.py | 6 +- .../project/network_topology/instances/tables.py | 2 +- .../project/network_topology/networks/tables.py | 2 +- .../dashboards/project/network_topology/panel.py | 2 +- .../project/network_topology/ports/tables.py | 2 +- .../project/network_topology/routers/tables.py | 2 +- .../project/network_topology/subnets/tables.py | 2 +- .../dashboards/project/network_topology/tabs.py | 2 +- .../dashboards/project/network_topology/urls.py | 38 +- .../dashboards/project/network_topology/views.py | 2 +- .../dashboards/project/networks/forms.py | 2 +- .../dashboards/project/networks/panel.py | 2 +- .../extensions/allowed_address_pairs/forms.py | 2 +- .../extensions/allowed_address_pairs/tables.py | 8 +- .../ports/extensions/allowed_address_pairs/tabs.py | 2 +- .../extensions/allowed_address_pairs/views.py | 2 +- .../dashboards/project/networks/ports/sg_base.py | 2 +- .../dashboards/project/networks/ports/tables.py | 8 +- .../dashboards/project/networks/ports/tabs.py | 2 +- .../dashboards/project/networks/ports/urls.py | 10 +- .../dashboards/project/networks/ports/views.py | 2 +- .../dashboards/project/networks/ports/workflows.py | 2 +- .../dashboards/project/networks/subnets/tables.py | 8 +- .../dashboards/project/networks/subnets/tabs.py | 2 +- .../dashboards/project/networks/subnets/urls.py | 4 +- .../dashboards/project/networks/subnets/utils.py | 2 +- .../dashboards/project/networks/subnets/views.py | 2 +- .../project/networks/subnets/workflows.py | 2 +- .../dashboards/project/networks/tables.py | 8 +- .../dashboards/project/networks/tabs.py | 2 +- .../dashboards/project/networks/urls.py | 42 +- .../dashboards/project/networks/views.py | 25 +- .../dashboards/project/networks/workflows.py | 2 +- .../dashboards/project/overview/panel.py | 2 +- .../dashboards/project/overview/urls.py | 6 +- .../dashboards/project/overview/views.py | 2 +- .../routers/extensions/extraroutes/forms.py | 2 +- .../routers/extensions/extraroutes/tables.py | 8 +- .../project/routers/extensions/extraroutes/tabs.py | 2 +- .../routers/extensions/extraroutes/views.py | 2 +- .../dashboards/project/routers/forms.py | 2 +- .../dashboards/project/routers/panel.py | 2 +- .../dashboards/project/routers/ports/forms.py | 2 +- .../dashboards/project/routers/ports/tables.py | 8 +- .../dashboards/project/routers/ports/tabs.py | 2 +- .../dashboards/project/routers/ports/urls.py | 4 +- .../dashboards/project/routers/ports/views.py | 2 +- .../dashboards/project/routers/tables.py | 12 +- .../dashboards/project/routers/tabs.py | 2 +- .../dashboards/project/routers/urls.py | 36 +- .../dashboards/project/routers/views.py | 2 +- .../dashboards/project/security_groups/forms.py | 2 +- .../dashboards/project/security_groups/panel.py | 2 +- .../dashboards/project/security_groups/tables.py | 12 +- .../dashboards/project/security_groups/urls.py | 24 +- .../dashboards/project/security_groups/views.py | 2 +- .../dashboards/project/server_groups/panel.py | 2 +- .../dashboards/project/server_groups/urls.py | 6 +- .../dashboards/project/snapshots/forms.py | 2 +- .../dashboards/project/snapshots/panel.py | 2 +- .../dashboards/project/snapshots/tables.py | 8 +- .../dashboards/project/snapshots/tabs.py | 2 +- .../dashboards/project/snapshots/urls.py | 16 +- .../dashboards/project/snapshots/views.py | 2 +- .../workflow/launch-instance/source/source.html | 1 + .../dashboards/project/trunks/panel.py | 2 +- .../dashboards/project/trunks/urls.py | 10 +- .../dashboards/project/vg_snapshots/forms.py | 2 +- .../dashboards/project/vg_snapshots/panel.py | 2 +- .../dashboards/project/vg_snapshots/tables.py | 8 +- .../dashboards/project/vg_snapshots/tabs.py | 2 +- .../dashboards/project/vg_snapshots/urls.py | 16 +- .../dashboards/project/vg_snapshots/views.py | 2 +- .../dashboards/project/volume_groups/forms.py | 2 +- .../dashboards/project/volume_groups/panel.py | 2 +- .../dashboards/project/volume_groups/tables.py | 2 +- .../dashboards/project/volume_groups/tabs.py | 2 +- .../dashboards/project/volume_groups/urls.py | 52 +- .../dashboards/project/volume_groups/views.py | 2 +- .../dashboards/project/volume_groups/workflows.py | 2 +- .../dashboards/project/volumes/forms.py | 2 +- .../dashboards/project/volumes/panel.py | 2 +- .../dashboards/project/volumes/tables.py | 8 +- .../dashboards/project/volumes/tabs.py | 2 +- .../dashboards/project/volumes/urls.py | 96 +- .../dashboards/project/volumes/views.py | 7 +- .../dashboards/settings/dashboard.py | 2 +- .../dashboards/settings/password/forms.py | 2 +- .../dashboards/settings/password/panel.py | 2 +- .../dashboards/settings/password/urls.py | 4 +- .../dashboards/settings/password/views.py | 2 +- .../dashboards/settings/user/forms.py | 4 +- .../dashboards/settings/user/panel.py | 2 +- .../dashboards/settings/user/urls.py | 4 +- .../dashboards/settings/user/views.py | 2 +- openstack_dashboard/defaults.py | 4 +- .../enabled/_1010_compute_panel_group.py | 2 +- .../enabled/_1310_volumes_panel_group.py | 2 +- .../enabled/_1410_network_panel_group.py | 2 +- .../enabled/_1910_object_store_panel_group.py | 2 +- .../enabled/_2110_admin_compute_panel_group.py | 2 +- .../enabled/_2210_admin_volume_panel_group.py | 2 +- .../enabled/_2300_admin_network_panel_group.py | 2 +- .../enabled/_2810_admin_system_panel_group.py | 2 +- .../enabled/_3060_federation_panel_group.py | 2 +- .../local/local_settings.py.example | 2 +- .../locale/as/LC_MESSAGES/django.po | 261 +--- .../locale/bn_IN/LC_MESSAGES/django.po | 257 +--- .../locale/brx/LC_MESSAGES/django.po | 255 +--- .../locale/cs/LC_MESSAGES/django.po | 315 +---- .../locale/de/LC_MESSAGES/django.po | 326 +---- .../locale/en_AU/LC_MESSAGES/django.po | 321 +---- .../locale/en_GB/LC_MESSAGES/django.po | 335 +---- .../locale/eo/LC_MESSAGES/django.po | 318 +---- .../locale/es/LC_MESSAGES/django.po | 338 +---- .../locale/fr/LC_MESSAGES/django.po | 329 +---- .../locale/gu/LC_MESSAGES/django.po | 257 +--- .../locale/hi/LC_MESSAGES/django.po | 190 +-- .../locale/id/LC_MESSAGES/django.po | 326 +---- .../locale/it/LC_MESSAGES/django.po | 307 +--- .../locale/ja/LC_MESSAGES/django.po | 337 +---- .../locale/kn/LC_MESSAGES/django.po | 263 +--- .../locale/ko_KR/LC_MESSAGES/django.po | 318 +---- .../locale/kok/LC_MESSAGES/django.po | 253 +--- .../locale/ks/LC_MESSAGES/django.po | 253 +--- .../locale/mai/LC_MESSAGES/django.po | 255 +--- .../locale/mni/LC_MESSAGES/django.po | 263 +--- .../locale/mr/LC_MESSAGES/django.po | 252 +--- .../locale/ne/LC_MESSAGES/django.po | 256 +--- .../locale/pa_IN/LC_MESSAGES/django.po | 264 +--- .../locale/pl_PL/LC_MESSAGES/django.po | 270 +--- .../locale/pt_BR/LC_MESSAGES/django.po | 325 +---- .../locale/ru/LC_MESSAGES/django.po | 351 +---- .../locale/ta/LC_MESSAGES/django.po | 261 +--- .../locale/tr_TR/LC_MESSAGES/django.po | 322 +---- .../locale/ur/LC_MESSAGES/django.po | 264 +--- .../locale/zh_Hans/LC_MESSAGES/django.po | 296 +--- .../locale/zh_Hant/LC_MESSAGES/django.po | 300 +--- .../management/commands/migrate_settings.py | 13 +- .../management/commands/upgrade_check.py | 2 +- openstack_dashboard/settings.py | 3 +- .../app/core/network_qos/actions/actions.module.js | 34 + .../network_qos/actions/actions.module.spec.js | 15 + .../network_qos/actions/add-rule.action.service.js | 182 +++ .../actions/add-rule.action.service.spec.js | 154 ++ .../network_qos/actions/add-rule.controller.js | 74 + .../actions/add-rule.controller.spec.js | 130 ++ .../app/core/network_qos/actions/add-rule.html | 98 ++ .../actions/delete-rule.action.service.js | 117 ++ .../actions/delete-rule.action.service.spec.js | 224 +++ .../actions/edit-rule.action.service.js | 173 +++ .../actions/edit-rule.action.service.spec.js | 244 ++++ .../network_qos/actions/edit-rule.controller.js | 104 ++ .../actions/edit-rule.controller.spec.js | 161 +++ .../app/core/network_qos/actions/edit-rule.html | 106 ++ .../core/network_qos/actions/rule.description.html | 18 + .../workflow/delete-rule.workflow.service.js | 118 ++ .../workflow/delete-rule.workflow.service.spec.js | 97 ++ .../network_qos/details/overview.controller.js | 58 +- .../app/core/network_qos/details/overview.html | 37 +- .../core/openstack-service-api/neutron.service.js | 366 ++++- .../openstack-service-api/neutron.service.spec.js | 108 ++ .../static/dashboard/scss/_util.scss | 3 +- openstack_dashboard/test/error_pages_urls.py | 4 +- openstack_dashboard/test/extensible_header_urls.py | 4 +- openstack_dashboard/test/helpers.py | 13 +- .../pages/admin/network/networkspage.py | 22 +- .../pages/project/network/networkspage.py | 14 +- openstack_dashboard/test/test_data/neutron_data.py | 298 +++- openstack_dashboard/test/test_data/swift_data.py | 8 +- .../test/test_panels/another_panel/urls.py | 4 +- .../test/test_panels/another_panel/views.py | 2 +- .../test/test_panels/nonloading_panel/urls.py | 4 +- .../test/test_panels/plugin_panel/urls.py | 4 +- .../test/test_panels/second_panel/urls.py | 4 +- .../test/unit/api/rest/test_cinder.py | 2 +- .../test/unit/api/rest/test_config.py | 2 +- .../test/unit/api/rest/test_glance.py | 2 +- .../test/unit/api/rest/test_keystone.py | 2 +- .../test/unit/api/rest/test_network.py | 4 +- .../test/unit/api/rest/test_neutron.py | 16 +- .../test/unit/api/rest/test_nova.py | 2 +- .../test/unit/api/rest/test_policy.py | 11 +- .../test/unit/api/rest/test_swift.py | 2 +- .../test/unit/api/rest/test_utils.py | 4 +- openstack_dashboard/test/unit/api/test_neutron.py | 1054 +++++++++++++- openstack_dashboard/test/unit/usage/test_quotas.py | 4 +- openstack_dashboard/test/urls.py | 20 +- openstack_dashboard/urls.py | 20 +- openstack_dashboard/usage/base.py | 2 +- openstack_dashboard/usage/quotas.py | 2 +- openstack_dashboard/usage/tables.py | 2 +- openstack_dashboard/usage/views.py | 2 +- openstack_dashboard/utils/config_types.py | 4 +- openstack_dashboard/views.py | 4 +- .../add-networks-pagination-4c05d784998fafb2.yaml | 5 + ...from-same-user-in-horizon-448baa6534a8a451.yaml | 11 + ...652_fix_policy_for_resume-a719efb23054c708.yaml | 6 + ...nge-keystone-default-role-3f95b6af11aed63b.yaml | 5 + ...ango-launch-instance-form-c6543e1d52786b79.yaml | 4 +- .../notes/network_qos_rules-cd103f9383b6cdf9.yaml | 8 + .../source/locale/fr/LC_MESSAGES/releasenotes.po | 280 ---- requirements.txt | 18 +- setup.cfg | 1 + tox.ini | 2 +- 575 files changed, 11737 insertions(+), 15355 deletions(-) Requirements updates -------------------- diff --git a/requirements.txt b/requirements.txt index 151359316..f1f245993 100644 --- a/requirements.txt +++ b/requirements.txt @@ -23,8 +23,8 @@ netaddr>=0.7.18 # BSD -oslo.concurrency>=3.26.0 # Apache-2.0 -oslo.config>=5.2.0 # Apache-2.0 -oslo.i18n>=5.0.1 # Apache-2.0 -oslo.policy>=3.2.0 # Apache-2.0 -oslo.serialization!=2.19.1,>=2.18.0 # Apache-2.0 -oslo.upgradecheck>=0.1.1 # Apache-2.0 -oslo.utils>=4.8.0 # Apache-2.0 -osprofiler>=2.3.0 # Apache-2.0 +oslo.concurrency>=4.5.0 # Apache-2.0 +oslo.config>=8.8.0 # Apache-2.0 +oslo.i18n>=5.1.0 # Apache-2.0 +oslo.policy>=3.11.0 # Apache-2.0 +oslo.serialization>=4.3.0 # Apache-2.0 +oslo.upgradecheck>=1.5.0 # Apache-2.0 +oslo.utils>=4.12.0 # Apache-2.0 +osprofiler>=3.4.2 # Apache-2.0 @@ -40 +40 @@ pytz>=2013.6 # MIT -PyYAML>=3.12 # MIT +PyYAML>=6.0 # MIT