We are overjoyed to announce the release of: horizon 19.0.0: OpenStack Dashboard This release is part of the wallaby 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. 19.0.0 ^^^^^^ New Features ************ * A new setting "OPENSTACK_USE_SIMPLE_TENANT_USAGE" was introduced as a replacement of "SimpleTenantUsage" in the deprecated "OPENSTACK_NOVA_EXTENSIONS_BLACKLIST" setting. This new setting controls whether "SimpleTenantUsage" nova API is used in the usage overview. According to feedbacks to the horizon team, the usage of "SimpleTenantUsage" can cause performance issues in the nova API in larger deployments. Try to set this to "False" for such cases. Upgrade Notes ************* * Deprecated "opensatck_dashboard/wsgi/django.wsgi" is removed. If you still use it, please change your configuration to use "openstack_dashboard/wsgi.py" now. * The legacy way to retrive neutron resource usages was dropped and horizon now assumes the "quota_details" neutron API extension implemented in Pike release (over three years ago), so we expect this is available in all Wallaby neutron deployments. * "OPENSTACK_NOVA_EXTENSIONS_BLACKLIST" setting is now dropped. If you specify "SimpleTenantUsage" in this setting, consider setting "OPENSTACK_USE_SIMPLE_TENANT_USAGE" to "False" instead. For other effective values in this setting, no replacement is provided as nova provides all features in recent versions of nova API. Note that you can enable/disable table actions via policy rules. * Password forms in horizon now does not strip leading/trailing spaces included in input passwords. Previously horizon stripped leading/trailing spaces in input passwords but on the other hand keystone accepts leading/trailing spaces and it can be an issue when such passwords are set via keystone API. To handle this situation horizon no longer strips leading/trailing spaces in passwords. See [:bug:`1861224`] and the related mailing thread for more detail. (Note that this change is part of horizon 18.5.0 release but we forgot to mention it.) * Considering the deprecation of "OPENSTACK_NOVA_EXTENSIONS_BLACKLIST", set a new setting "OPENSTACK_USE_SIMPLE_TENANT_USAGE" to "False" if you specify "SimpleTenantUsage" in "OPENSTACK_USE_SIMPLE_TENANT_USAGE" Changes in horizon 18.6.0..19.0.0 --------------------------------- 7e682a2d5 Remove depretaced django.wsgi 94707c743 Remove retired searchlight-ui usage 0335f2f37 Remove retired qinling-dashbaord usage 02aa5dd7c Imported Translations from Zanata 0a4fda0c0 Add default index URL to Server Groups module 85d75107c Add integration-test for Volume Group Type 08878b6b0 doc: Drop old Django information 1986bb538 Imported Translations from Zanata a20a275ef Fix AttributeError in the project instance detail view f3927ffb3 Fix create/update_port with python3 57999617e Update docs for Ubuntu 20.04 1cf8ddcd8 Imported Translations from Zanata a8158f6c3 On the create instance from, when the image name is empty, show id 989eeb41d [cleanup] Remove test-data for heat d73e7022c Imported Translations from Zanata 6b79cdcc1 Non-api filters not working with admin instance tab 672c43c43 Drop OPENSTACK_NOVA_EXTENSIONS_BLACKLIST finally 3c6286a9e Drop the usage of nova extensions in JavaScript code c45cc6b1c Drop the usage of nova extensions in python code c9e47d659 Add new setting for SimpleTenantUsage 4046ef661 Recover scenario settings in openstack_auth test_auth 22741aaa3 Drop the legacy way to retrieve neutron quotas and usages b89c70516 Refactor quota related unit tests 197c304af Imported Translations from Zanata e5d09edc2 Use python3-style super() 29473d80c Imported Translations from Zanata 8a963626e Added validation for csrf_failure GET argument ec6fbe3eb Imported Translations from Zanata 3a9439114 Make timezone tests work 1b8bf35b9 doc: Document teams in horizon 91c529bc1 Imported Translations from Zanata 612942bdf users: Correct lock_password status visibility (Yes/No) in user details 8acd5c352 Imported Translations from Zanata 1202faa70 Fix coverage job 40c760437 Imported Translations from Zanata 52ea7d265 doc: Change reference to logos from PNG to SVG ade7c0fa3 Imported Translations from Zanata 74df97f57 pylint: Fix unnecessary-comprehension warning 692778f8c pylint: Address no-else-return warning b67ad564c pylint: Address no-else-continue/no-else-raise warnings de509f991 Follow-up on pylint upgrade 5be1202d7 Fix Jasmine Spec Runner for Django messages patch 106e713ee Add Python3 wallaby unit tests c58ab9245 Update master for stable/victoria 37ea4159f Relnote on disabling stripping leading/trailing spaces in password 533892f08 Make text download and load groups tests work 370d1739c Make permissions tests work b79ebc85b Drop remaining glance v1 related code Diffstat (except docs and test files) ------------------------------------- .gitignore | 2 +- .pylintrc | 15 +- .zuul.d/django-jobs.yaml | 2 +- .zuul.d/project.yaml | 2 +- .../locale/en_GB/LC_MESSAGES/doc-configuration.po | 38 +- .../locale/en_GB/LC_MESSAGES/doc-contributor.po | 119 +++- .../locale/id/LC_MESSAGES/doc-configuration.po | 32 +- .../locale/id/LC_MESSAGES/doc-contributor.po | 7 +- horizon/base.py | 36 +- horizon/browsers/base.py | 2 +- horizon/browsers/breadcrumb.py | 2 +- horizon/browsers/views.py | 10 +- horizon/contrib/staticfiles/finders.py | 2 +- horizon/decorators.py | 3 +- horizon/exceptions.py | 5 +- horizon/forms/base.py | 4 +- horizon/forms/fields.py | 34 +- horizon/forms/views.py | 18 +- horizon/management/commands/startdash.py | 2 +- horizon/management/commands/startpanel.py | 2 +- .../framework/conf/permissions.service.spec.js | 54 +- .../util/file/text-download.service.spec.js | 10 +- .../util/timezones/timezone.service.spec.js | 29 +- horizon/tables/actions.py | 26 +- horizon/tables/base.py | 36 +- horizon/tables/formset.py | 8 +- horizon/tables/views.py | 26 +- horizon/tabs/base.py | 12 +- horizon/tabs/views.py | 7 +- horizon/templates/horizon/jasmine/jasmine.html | 1 + horizon/templatetags/angular.py | 2 +- horizon/templatetags/horizon.py | 15 +- horizon/templatetags/truncate_filter.py | 3 +- horizon/test/firefox_binary.py | 2 +- horizon/test/helpers.py | 18 +- horizon/test/unit/forms/test_fields.py | 8 +- horizon/test/unit/forms/test_forms.py | 2 +- horizon/test/unit/middleware/test_base.py | 4 +- horizon/test/unit/middleware/test_operation_log.py | 2 +- horizon/test/unit/tabs/test_tabs.py | 4 +- horizon/test/unit/test_base.py | 21 +- horizon/test/unit/test_views.py | 4 +- horizon/test/unit/workflows/test_workflows.py | 4 +- horizon/test/utils.py | 2 +- horizon/test/webdriver.py | 10 +- horizon/utils/babel_extract_angular.py | 2 +- horizon/utils/csvbase.py | 6 +- horizon/utils/filters.py | 3 +- horizon/utils/lazy_encoder.py | 2 +- horizon/utils/scss_filter.py | 2 +- horizon/views.py | 7 +- horizon/workflows/base.py | 33 +- horizon/workflows/views.py | 4 +- openstack_auth/backend.py | 6 +- openstack_auth/forms.py | 4 +- openstack_auth/locale/en_GB/LC_MESSAGES/django.po | 9 +- openstack_auth/plugin/base.py | 3 +- openstack_auth/utils.py | 9 +- openstack_auth/views.py | 30 +- openstack_dashboard/api/_nova.py | 25 +- openstack_dashboard/api/base.py | 2 +- openstack_dashboard/api/glance.py | 15 +- openstack_dashboard/api/keystone.py | 5 +- openstack_dashboard/api/neutron.py | 79 ++- openstack_dashboard/api/nova.py | 133 +--- openstack_dashboard/api/rest/cinder.py | 59 +- openstack_dashboard/api/rest/glance.py | 3 +- openstack_dashboard/api/rest/json_encoder.py | 2 +- openstack_dashboard/api/rest/neutron.py | 40 +- openstack_dashboard/api/rest/nova.py | 66 +- openstack_dashboard/api/rest/utils.py | 10 +- openstack_dashboard/api/swift.py | 22 +- openstack_dashboard/contrib/developer/dashboard.py | 2 +- .../contrib/developer/profiler/middleware.py | 2 +- .../contrib/developer/profiler/views.py | 2 +- .../dashboards/admin/aggregates/forms.py | 2 +- .../dashboards/admin/aggregates/panel.py | 16 - .../dashboards/admin/aggregates/tables.py | 4 +- .../dashboards/admin/aggregates/views.py | 4 +- .../dashboards/admin/aggregates/workflows.py | 10 +- .../dashboards/admin/defaults/views.py | 2 +- .../dashboards/admin/defaults/workflows.py | 6 +- .../dashboards/admin/flavors/tables.py | 2 +- .../dashboards/admin/flavors/workflows.py | 4 +- .../dashboards/admin/floating_ips/forms.py | 2 +- .../dashboards/admin/floating_ips/views.py | 2 +- .../dashboards/admin/group_types/specs/views.py | 8 +- .../dashboards/admin/group_types/views.py | 2 +- .../dashboards/admin/hypervisors/compute/forms.py | 2 +- .../dashboards/admin/hypervisors/compute/tables.py | 14 +- .../dashboards/admin/hypervisors/compute/views.py | 12 +- .../dashboards/admin/hypervisors/views.py | 4 +- .../dashboards/admin/images/tables.py | 5 +- .../dashboards/admin/images/views.py | 2 +- .../dashboards/admin/info/tables.py | 8 +- openstack_dashboard/dashboards/admin/info/views.py | 2 +- .../dashboards/admin/instances/forms.py | 2 +- .../dashboards/admin/instances/tables.py | 2 +- .../dashboards/admin/instances/views.py | 32 +- .../dashboards/admin/metadata_defs/forms.py | 2 +- .../dashboards/admin/metadata_defs/views.py | 6 +- .../dashboards/admin/networks/agents/forms.py | 2 +- .../dashboards/admin/networks/agents/views.py | 4 +- .../dashboards/admin/networks/forms.py | 4 +- .../dashboards/admin/networks/ports/tables.py | 2 +- .../dashboards/admin/networks/ports/views.py | 4 +- .../dashboards/admin/networks/ports/workflows.py | 4 +- .../dashboards/admin/networks/subnets/tables.py | 23 +- .../dashboards/admin/networks/subnets/views.py | 2 +- .../dashboards/admin/networks/tables.py | 12 +- .../dashboards/admin/networks/views.py | 4 +- .../dashboards/admin/networks/workflows.py | 18 +- .../dashboards/admin/overview/views.py | 4 +- .../dashboards/admin/rbac_policies/forms.py | 6 +- .../dashboards/admin/rbac_policies/tabs.py | 2 +- .../dashboards/admin/rbac_policies/views.py | 2 +- .../dashboards/admin/routers/forms.py | 2 +- .../dashboards/admin/routers/views.py | 4 +- .../dashboards/admin/snapshots/forms.py | 2 +- .../dashboards/admin/snapshots/tables.py | 2 +- .../dashboards/admin/snapshots/views.py | 4 +- .../dashboards/admin/trunks/panel.py | 2 +- .../dashboards/admin/vg_snapshots/views.py | 2 +- .../dashboards/admin/volume_groups/tables.py | 2 +- .../dashboards/admin/volume_groups/views.py | 2 +- .../dashboards/admin/volume_types/extras/forms.py | 2 +- .../dashboards/admin/volume_types/extras/views.py | 8 +- .../dashboards/admin/volume_types/forms.py | 8 +- .../admin/volume_types/qos_specs/views.py | 7 +- .../dashboards/admin/volume_types/tables.py | 2 +- .../dashboards/admin/volume_types/views.py | 19 +- .../dashboards/admin/volumes/forms.py | 6 +- .../dashboards/admin/volumes/views.py | 15 +- .../identity/application_credentials/forms.py | 5 +- .../identity/application_credentials/views.py | 8 +- .../dashboards/identity/domains/panel.py | 2 +- .../dashboards/identity/domains/tables.py | 6 +- .../dashboards/identity/domains/views.py | 2 +- .../dashboards/identity/domains/workflows.py | 12 +- .../dashboards/identity/groups/panel.py | 2 +- .../dashboards/identity/groups/views.py | 6 +- .../identity/identity_providers/protocols/forms.py | 2 +- .../identity/identity_providers/protocols/views.py | 2 +- .../identity/identity_providers/views.py | 4 +- .../dashboards/identity/mappings/views.py | 2 +- .../dashboards/identity/projects/tables.py | 21 +- .../dashboards/identity/projects/views.py | 12 +- .../dashboards/identity/projects/workflows.py | 48 +- .../dashboards/identity/roles/panel.py | 2 +- .../dashboards/identity/roles/views.py | 2 +- .../identity/groups/groups.module.spec.js | 10 +- .../dashboards/identity/users/forms.py | 18 +- .../dashboards/identity/users/panel.py | 2 +- .../dashboards/identity/users/tabs.py | 2 + .../dashboards/identity/users/views.py | 14 +- .../dashboards/project/api_access/views.py | 2 +- .../dashboards/project/backups/forms.py | 4 +- .../dashboards/project/backups/views.py | 6 +- .../dashboards/project/dashboard.py | 2 +- .../dashboards/project/floating_ips/forms.py | 2 +- .../dashboards/project/floating_ips/tables.py | 18 +- .../dashboards/project/floating_ips/views.py | 2 +- .../dashboards/project/floating_ips/workflows.py | 7 +- .../dashboards/project/images/images/forms.py | 15 +- .../dashboards/project/images/images/tables.py | 6 +- .../dashboards/project/images/images/views.py | 6 +- .../dashboards/project/images/snapshots/views.py | 2 +- .../dashboards/project/instances/forms.py | 39 +- .../dashboards/project/instances/tables.py | 36 +- .../dashboards/project/instances/views.py | 32 +- .../project/instances/workflows/create_instance.py | 172 ++--- .../project/instances/workflows/resize_instance.py | 5 +- .../project/instances/workflows/update_instance.py | 4 +- .../dashboards/project/key_pairs/tables.py | 15 +- .../dashboards/project/key_pairs/views.py | 2 +- .../dashboards/project/network_qos/panel.py | 2 +- .../dashboards/project/network_topology/views.py | 4 +- .../dashboards/project/networks/forms.py | 2 +- .../extensions/allowed_address_pairs/forms.py | 2 +- .../extensions/allowed_address_pairs/tables.py | 9 +- .../extensions/allowed_address_pairs/views.py | 2 +- .../dashboards/project/networks/ports/sg_base.py | 4 +- .../dashboards/project/networks/ports/tables.py | 13 +- .../dashboards/project/networks/ports/views.py | 2 +- .../dashboards/project/networks/ports/workflows.py | 5 +- .../dashboards/project/networks/subnets/tables.py | 5 +- .../dashboards/project/networks/subnets/views.py | 4 +- .../project/networks/subnets/workflows.py | 3 +- .../dashboards/project/networks/tables.py | 14 +- .../dashboards/project/networks/tabs.py | 2 +- .../dashboards/project/networks/views.py | 6 +- .../dashboards/project/networks/workflows.py | 19 +- .../dashboards/project/overview/views.py | 2 +- .../routers/extensions/extraroutes/tables.py | 2 +- .../routers/extensions/extraroutes/views.py | 2 +- .../dashboards/project/routers/forms.py | 4 +- .../dashboards/project/routers/ports/forms.py | 4 +- .../dashboards/project/routers/ports/tables.py | 5 +- .../dashboards/project/routers/ports/views.py | 4 +- .../dashboards/project/routers/tables.py | 15 +- .../dashboards/project/routers/views.py | 8 +- .../dashboards/project/security_groups/forms.py | 4 +- .../dashboards/project/security_groups/tables.py | 17 +- .../dashboards/project/security_groups/views.py | 8 +- .../dashboards/project/server_groups/panel.py | 2 +- .../dashboards/project/snapshots/tables.py | 4 +- .../dashboards/project/snapshots/views.py | 4 +- .../configuration/configuration.html | 38 +- .../launch-instance-model.service.js | 11 +- .../launch-instance-model.service.spec.js | 40 +- .../launch-instance-workflow.service.js | 9 +- .../launch-instance-workflow.service.spec.js | 12 - .../launch-instance/source/source.controller.js | 2 +- .../dashboards/project/trunks/panel.py | 2 +- .../dashboards/project/vg_snapshots/forms.py | 2 +- .../dashboards/project/vg_snapshots/panel.py | 2 +- .../dashboards/project/vg_snapshots/views.py | 9 +- .../dashboards/project/volume_groups/forms.py | 2 +- .../dashboards/project/volume_groups/panel.py | 2 +- .../dashboards/project/volume_groups/tables.py | 9 +- .../dashboards/project/volume_groups/views.py | 24 +- .../dashboards/project/volume_groups/workflows.py | 14 +- .../dashboards/project/volumes/forms.py | 18 +- .../dashboards/project/volumes/tables.py | 17 +- .../dashboards/project/volumes/views.py | 31 +- .../dashboards/settings/password/forms.py | 2 +- .../dashboards/settings/user/forms.py | 2 +- openstack_dashboard/defaults.py | 7 +- .../locale/cs/LC_MESSAGES/django.po | 5 +- .../locale/de/LC_MESSAGES/django.po | 74 ++- .../locale/en_AU/LC_MESSAGES/django.po | 5 +- .../locale/en_GB/LC_MESSAGES/django.po | 28 +- .../locale/eo/LC_MESSAGES/django.po | 10 +- .../locale/es/LC_MESSAGES/django.po | 10 +- .../locale/fr/LC_MESSAGES/django.po | 10 +- .../locale/id/LC_MESSAGES/django.po | 45 +- .../locale/it/LC_MESSAGES/django.po | 5 +- .../locale/ja/LC_MESSAGES/django.po | 18 +- .../locale/ko_KR/LC_MESSAGES/django.po | 10 +- .../locale/pl_PL/LC_MESSAGES/django.po | 5 +- .../locale/pt_BR/LC_MESSAGES/django.po | 10 +- .../locale/ru/LC_MESSAGES/django.po | 10 +- .../locale/tr_TR/LC_MESSAGES/django.po | 5 +- .../locale/zh_CN/LC_MESSAGES/django.po | 8 +- .../locale/zh_TW/LC_MESSAGES/django.po | 8 +- .../management/commands/make_web_conf.py | 7 +- .../management/commands/migrate_settings.py | 2 +- .../hz-if-nova-extensions.directive.js | 76 --- .../hz-if-nova-extensions.directive.spec.js | 89 --- .../extensions.service.spec.js | 2 +- .../nova-extensions.service.js | 55 -- .../nova-extensions.service.spec.js | 91 --- .../app/core/openstack-service-api/nova.service.js | 28 - .../openstack-service-api/nova.service.spec.js | 10 - .../app/core/server_groups/server-groups.module.js | 1 + .../static/app/core/workflow/decorator.service.js | 8 +- .../app/core/workflow/decorator.service.spec.js | 11 +- openstack_dashboard/test/helpers.py | 30 +- .../pages/admin/compute/flavorspage.py | 2 +- .../pages/admin/compute/hostaggregatespage.py | 2 +- .../pages/admin/compute/hypervisorspage.py | 2 +- .../pages/admin/system/defaultspage.py | 2 +- .../pages/admin/system/metadatadefinitionspage.py | 2 +- .../pages/admin/volume/grouptypespage.py | 70 ++ .../pages/admin/volume/volumetypespage.py | 2 +- .../pages/identity/projectspage.py | 6 +- .../pages/project/apiaccesspage.py | 2 +- .../pages/project/compute/imagespage.py | 2 +- .../pages/project/compute/instancespage.py | 2 +- .../pages/project/compute/keypairspage.py | 2 +- .../pages/project/compute/overviewpage.py | 2 +- .../pages/project/compute/servergroupspage.py | 2 +- .../pages/project/network/floatingipspage.py | 2 +- .../pages/project/network/networkoverviewpage.py | 2 +- .../pages/project/network/networkspage.py | 2 +- .../pages/project/network/networktopologypage.py | 2 +- .../pages/project/network/routerinterfacespage.py | 2 +- .../pages/project/network/routeroverviewpage.py | 2 +- .../pages/project/network/routerspage.py | 2 +- .../network/security_groups/managerulespage.py | 2 +- .../pages/project/network/securitygroupspage.py | 2 +- .../pages/project/volumes/snapshotspage.py | 2 +- .../pages/project/volumes/volumespage.py | 2 +- .../pages/settings/usersettingspage.py | 2 +- openstack_dashboard/test/test_data/glance_data.py | 2 +- openstack_dashboard/test/test_data/nova_data.py | 2 +- .../test/test_panels/plugin_panel/views.py | 2 +- .../test/test_plugins/test_panel.py | 2 +- .../test/test_plugins/test_panel_group.py | 2 +- .../test/unit/api/rest/test_glance.py | 2 +- .../test/unit/api/rest/test_nova.py | 19 +- openstack_dashboard/test/unit/api/test_base.py | 2 +- openstack_dashboard/test/unit/api/test_cinder.py | 2 +- openstack_dashboard/test/unit/api/test_glance.py | 2 +- openstack_dashboard/test/unit/api/test_keystone.py | 2 +- openstack_dashboard/test/unit/api/test_network.py | 2 +- openstack_dashboard/test/unit/api/test_neutron.py | 28 +- openstack_dashboard/test/unit/api/test_nova.py | 9 - openstack_dashboard/test/unit/usage/test_quotas.py | 161 +---- openstack_dashboard/usage/base.py | 7 +- openstack_dashboard/usage/quotas.py | 81 +-- openstack_dashboard/usage/tables.py | 3 +- openstack_dashboard/usage/views.py | 14 +- openstack_dashboard/utils/config_types.py | 12 +- openstack_dashboard/views.py | 8 +- openstack_dashboard/wsgi/django.wsgi | 40 -- plugin-registry.csv | 2 - .../notes/drop-django-wsgi-a6a1ae2df4e05118.yaml | 6 + ...drop-neutron-quota-legacy-1efd1f1924ae3489.yaml | 7 + ...nova-extensions-blacklist-7718f0ef622e3af8.yaml | 9 + ...p-trailing-space-password-856bd5595938a094.yaml | 14 + .../use-simple-tenant-usage-f713a2eff9357458.yaml | 17 + releasenotes/source/index.rst | 1 + .../source/locale/de/LC_MESSAGES/releasenotes.po | 22 +- .../locale/en_GB/LC_MESSAGES/releasenotes.po | 121 +++- .../source/locale/id/LC_MESSAGES/releasenotes.po | 69 +- .../source/locale/ja/LC_MESSAGES/releasenotes.po | 34 +- releasenotes/source/victoria.rst | 6 + tox.ini | 9 +- 376 files changed, 2262 insertions(+), 3298 deletions(-)
participants (1)
-
no-reply@openstack.org