summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.zuul.d/xstatic-master.yaml1
-rw-r--r--openstack_dashboard/conf/cinder_policy.yaml176
-rw-r--r--openstack_dashboard/conf/default_policies/neutron.yaml204
-rw-r--r--openstack_dashboard/conf/default_policies/nova.yaml4
-rw-r--r--openstack_dashboard/conf/neutron_policy.yaml558
-rw-r--r--openstack_dashboard/conf/nova_policy.yaml8
-rw-r--r--openstack_dashboard/locale/as/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/bn_IN/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/brx/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/cs/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/de/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/en_AU/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/en_GB/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/es/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/fr/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/gu/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/hi/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/id/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/it/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/ja/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/kn/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/ko_KR/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/kok/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/ks/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/mai/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/mni/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/mr/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/ne/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/pa_IN/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/pl_PL/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/pt_BR/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/ru/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/ta/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/tr_TR/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/ur/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/zh_Hans/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/zh_Hant/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/static/app/core/openstack-service-api/swift.service.js3
-rw-r--r--openstack_dashboard/static/app/core/openstack-service-api/swift.service.spec.js1
-rw-r--r--openstack_dashboard/test/integration_tests/helpers.py6
-rw-r--r--openstack_dashboard/test/integration_tests/horizon.conf2
-rw-r--r--openstack_dashboard/test/integration_tests/pages/basepage.py25
-rw-r--r--openstack_dashboard/test/integration_tests/pages/project/compute/imagespage.py2
-rw-r--r--openstack_dashboard/test/integration_tests/pages/project/compute/instancespage.py3
-rw-r--r--openstack_dashboard/test/integration_tests/regions/messages.py32
-rw-r--r--openstack_dashboard/test/integration_tests/tests/test_defaults.py16
-rw-r--r--openstack_dashboard/test/integration_tests/tests/test_flavors.py12
-rw-r--r--openstack_dashboard/test/integration_tests/tests/test_floatingips.py53
-rw-r--r--openstack_dashboard/test/integration_tests/tests/test_groups.py18
-rw-r--r--openstack_dashboard/test/integration_tests/tests/test_grouptypes.py12
-rw-r--r--openstack_dashboard/test/integration_tests/tests/test_host_aggregates.py12
-rw-r--r--openstack_dashboard/test/integration_tests/tests/test_images.py77
-rw-r--r--openstack_dashboard/test/integration_tests/tests/test_instances.py62
-rw-r--r--openstack_dashboard/test/integration_tests/tests/test_keypairs.py8
-rw-r--r--openstack_dashboard/test/integration_tests/tests/test_metadata_definitions.py8
-rw-r--r--openstack_dashboard/test/integration_tests/tests/test_networks.py27
-rw-r--r--openstack_dashboard/test/integration_tests/tests/test_projects.py22
-rw-r--r--openstack_dashboard/test/integration_tests/tests/test_router.py47
-rw-r--r--openstack_dashboard/test/integration_tests/tests/test_router_gateway.py20
-rw-r--r--openstack_dashboard/test/integration_tests/tests/test_security_groups.py25
-rw-r--r--openstack_dashboard/test/integration_tests/tests/test_user_settings.py24
-rw-r--r--openstack_dashboard/test/integration_tests/tests/test_users.py8
-rw-r--r--openstack_dashboard/test/integration_tests/tests/test_volume_snapshots.py53
-rw-r--r--openstack_dashboard/test/integration_tests/tests/test_volumes.py104
-rw-r--r--openstack_dashboard/test/integration_tests/tests/test_volumetypes.py56
-rw-r--r--releasenotes/source/2023.1.rst6
-rw-r--r--releasenotes/source/index.rst1
-rw-r--r--releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po7
-rw-r--r--releasenotes/source/locale/fr/LC_MESSAGES/releasenotes.po280
69 files changed, 1260 insertions, 878 deletions
diff --git a/.zuul.d/xstatic-master.yaml b/.zuul.d/xstatic-master.yaml
index 0baa4c2e3..1243d6f42 100644
--- a/.zuul.d/xstatic-master.yaml
+++ b/.zuul.d/xstatic-master.yaml
@@ -12,7 +12,6 @@
- openstack/xstatic-bootstrap-scss
- openstack/xstatic-bootswatch
- openstack/xstatic-d3
- - openstack/xstatic-font-awesome
- openstack/xstatic-hogan
- openstack/xstatic-jasmine
- openstack/xstatic-jquery-migrate
diff --git a/openstack_dashboard/conf/cinder_policy.yaml b/openstack_dashboard/conf/cinder_policy.yaml
index ab30bae09..f4d54075d 100644
--- a/openstack_dashboard/conf/cinder_policy.yaml
+++ b/openstack_dashboard/conf/cinder_policy.yaml
@@ -454,7 +454,16 @@
# since X in favor of "group:group_types:create":"rule:admin_api".
# group:group_types_manage has been replaced by more granular policies
# that separately govern POST, PUT, and DELETE operations.
-#"group:group_types_manage": "rule:group:group_types:create"
+# WARNING: A rule name change has been identified.
+# This may be an artifact of new rules being
+# included which require legacy fallback
+# rules to ensure proper policy behavior.
+# Alternatively, this may just be an alias.
+# Please evaluate on a case by case basis
+# keeping in mind the format for aliased
+# rules is:
+# "old_rule_name": "new_rule_name".
+# "group:group_types_manage": "rule:group:group_types:create"
# Update a group type.
# PUT /group_types/{group_type_id}
@@ -465,7 +474,16 @@
# since X in favor of "group:group_types:update":"rule:admin_api".
# group:group_types_manage has been replaced by more granular policies
# that separately govern POST, PUT, and DELETE operations.
-#"group:group_types_manage": "rule:group:group_types:update"
+# WARNING: A rule name change has been identified.
+# This may be an artifact of new rules being
+# included which require legacy fallback
+# rules to ensure proper policy behavior.
+# Alternatively, this may just be an alias.
+# Please evaluate on a case by case basis
+# keeping in mind the format for aliased
+# rules is:
+# "old_rule_name": "new_rule_name".
+# "group:group_types_manage": "rule:group:group_types:update"
# Delete a group type.
# DELETE /group_types/{group_type_id}
@@ -476,7 +494,16 @@
# since X in favor of "group:group_types:delete":"rule:admin_api".
# group:group_types_manage has been replaced by more granular policies
# that separately govern POST, PUT, and DELETE operations.
-#"group:group_types_manage": "rule:group:group_types:delete"
+# WARNING: A rule name change has been identified.
+# This may be an artifact of new rules being
+# included which require legacy fallback
+# rules to ensure proper policy behavior.
+# Alternatively, this may just be an alias.
+# Please evaluate on a case by case basis
+# keeping in mind the format for aliased
+# rules is:
+# "old_rule_name": "new_rule_name".
+# "group:group_types_manage": "rule:group:group_types:delete"
# Show group type with type specs attributes.
# GET /group_types/{group_type_id}
@@ -491,7 +518,16 @@
# X in favor of "group:group_types_specs:get":"rule:admin_api".
# group:group_types_specs has been replaced by more granular policies
# that separately govern GET, POST, PUT, and DELETE operations.
-#"group:group_types_specs": "rule:group:group_types_specs:get"
+# WARNING: A rule name change has been identified.
+# This may be an artifact of new rules being
+# included which require legacy fallback
+# rules to ensure proper policy behavior.
+# Alternatively, this may just be an alias.
+# Please evaluate on a case by case basis
+# keeping in mind the format for aliased
+# rules is:
+# "old_rule_name": "new_rule_name".
+# "group:group_types_specs": "rule:group:group_types_specs:get"
# List group type specs.
# GET /group_types/{group_type_id}/group_specs
@@ -502,7 +538,16 @@
# X in favor of "group:group_types_specs:get_all":"rule:admin_api".
# group:group_types_specs has been replaced by more granular policies
# that separately govern GET, POST, PUT, and DELETE operations.
-#"group:group_types_specs": "rule:group:group_types_specs:get_all"
+# WARNING: A rule name change has been identified.
+# This may be an artifact of new rules being
+# included which require legacy fallback
+# rules to ensure proper policy behavior.
+# Alternatively, this may just be an alias.
+# Please evaluate on a case by case basis
+# keeping in mind the format for aliased
+# rules is:
+# "old_rule_name": "new_rule_name".
+# "group:group_types_specs": "rule:group:group_types_specs:get_all"
# Create a group type spec.
# POST /group_types/{group_type_id}/group_specs
@@ -513,7 +558,16 @@
# X in favor of "group:group_types_specs:create":"rule:admin_api".
# group:group_types_specs has been replaced by more granular policies
# that separately govern GET, POST, PUT, and DELETE operations.
-#"group:group_types_specs": "rule:group:group_types_specs:create"
+# WARNING: A rule name change has been identified.
+# This may be an artifact of new rules being
+# included which require legacy fallback
+# rules to ensure proper policy behavior.
+# Alternatively, this may just be an alias.
+# Please evaluate on a case by case basis
+# keeping in mind the format for aliased
+# rules is:
+# "old_rule_name": "new_rule_name".
+# "group:group_types_specs": "rule:group:group_types_specs:create"
# Update a group type spec.
# PUT /group_types/{group_type_id}/group_specs/{g_spec_id}
@@ -524,7 +578,16 @@
# X in favor of "group:group_types_specs:update":"rule:admin_api".
# group:group_types_specs has been replaced by more granular policies
# that separately govern GET, POST, PUT, and DELETE operations.
-#"group:group_types_specs": "rule:group:group_types_specs:update"
+# WARNING: A rule name change has been identified.
+# This may be an artifact of new rules being
+# included which require legacy fallback
+# rules to ensure proper policy behavior.
+# Alternatively, this may just be an alias.
+# Please evaluate on a case by case basis
+# keeping in mind the format for aliased
+# rules is:
+# "old_rule_name": "new_rule_name".
+# "group:group_types_specs": "rule:group:group_types_specs:update"
# Delete a group type spec.
# DELETE /group_types/{group_type_id}/group_specs/{g_spec_id}
@@ -535,7 +598,16 @@
# X in favor of "group:group_types_specs:delete":"rule:admin_api".
# group:group_types_specs has been replaced by more granular policies
# that separately govern GET, POST, PUT, and DELETE operations.
-#"group:group_types_specs": "rule:group:group_types_specs:delete"
+# WARNING: A rule name change has been identified.
+# This may be an artifact of new rules being
+# included which require legacy fallback
+# rules to ensure proper policy behavior.
+# Alternatively, this may just be an alias.
+# Please evaluate on a case by case basis
+# keeping in mind the format for aliased
+# rules is:
+# "old_rule_name": "new_rule_name".
+# "group:group_types_specs": "rule:group:group_types_specs:delete"
# List group snapshots.
# GET /group_snapshots
@@ -715,7 +787,16 @@
# "volume_extension:quota_classes:get":"rule:admin_api".
# volume_extension:quota_classes has been replaced by more granular
# policies that separately govern GET and PUT operations.
-#"volume_extension:quota_classes": "rule:volume_extension:quota_classes:get"
+# WARNING: A rule name change has been identified.
+# This may be an artifact of new rules being
+# included which require legacy fallback
+# rules to ensure proper policy behavior.
+# Alternatively, this may just be an alias.
+# Please evaluate on a case by case basis
+# keeping in mind the format for aliased
+# rules is:
+# "old_rule_name": "new_rule_name".
+# "volume_extension:quota_classes": "rule:volume_extension:quota_classes:get"
# Update project quota class.
# PUT /os-quota-class-sets/{project_id}
@@ -727,7 +808,16 @@
# "volume_extension:quota_classes:update":"rule:admin_api".
# volume_extension:quota_classes has been replaced by more granular
# policies that separately govern GET and PUT operations.
-#"volume_extension:quota_classes": "rule:volume_extension:quota_classes:update"
+# WARNING: A rule name change has been identified.
+# This may be an artifact of new rules being
+# included which require legacy fallback
+# rules to ensure proper policy behavior.
+# Alternatively, this may just be an alias.
+# Please evaluate on a case by case basis
+# keeping in mind the format for aliased
+# rules is:
+# "old_rule_name": "new_rule_name".
+# "volume_extension:quota_classes": "rule:volume_extension:quota_classes:update"
# Show project quota (including usage and default).
# GET /os-quota-sets/{project_id}
@@ -819,7 +909,16 @@
# since X in favor of "volume_extension:type_create":"rule:admin_api".
# volume_extension:types_manage has been replaced by more granular
# policies that separately govern POST, PUT, and DELETE operations.
-#"volume_extension:types_manage": "rule:volume_extension:type_create"
+# WARNING: A rule name change has been identified.
+# This may be an artifact of new rules being
+# included which require legacy fallback
+# rules to ensure proper policy behavior.
+# Alternatively, this may just be an alias.
+# Please evaluate on a case by case basis
+# keeping in mind the format for aliased
+# rules is:
+# "old_rule_name": "new_rule_name".
+# "volume_extension:types_manage": "rule:volume_extension:type_create"
# Update volume type.
# PUT /types
@@ -830,7 +929,16 @@
# since X in favor of "volume_extension:type_update":"rule:admin_api".
# volume_extension:types_manage has been replaced by more granular
# policies that separately govern POST, PUT, and DELETE operations.
-#"volume_extension:types_manage": "rule:volume_extension:type_update"
+# WARNING: A rule name change has been identified.
+# This may be an artifact of new rules being
+# included which require legacy fallback
+# rules to ensure proper policy behavior.
+# Alternatively, this may just be an alias.
+# Please evaluate on a case by case basis
+# keeping in mind the format for aliased
+# rules is:
+# "old_rule_name": "new_rule_name".
+# "volume_extension:types_manage": "rule:volume_extension:type_update"
# Delete volume type.
# DELETE /types
@@ -841,7 +949,16 @@
# since X in favor of "volume_extension:type_delete":"rule:admin_api".
# volume_extension:types_manage has been replaced by more granular
# policies that separately govern POST, PUT, and DELETE operations.
-#"volume_extension:types_manage": "rule:volume_extension:type_delete"
+# WARNING: A rule name change has been identified.
+# This may be an artifact of new rules being
+# included which require legacy fallback
+# rules to ensure proper policy behavior.
+# Alternatively, this may just be an alias.
+# Please evaluate on a case by case basis
+# keeping in mind the format for aliased
+# rules is:
+# "old_rule_name": "new_rule_name".
+# "volume_extension:types_manage": "rule:volume_extension:type_delete"
# Get one specific volume type.
# GET /types/{type_id}
@@ -1351,7 +1468,16 @@
# volume_extension:volume_image_metadata has been replaced by more
# granular policies that separately govern show, set, and remove
# operations.
-#"volume_extension:volume_image_metadata": "rule:volume_extension:volume_image_metadata:show"
+# WARNING: A rule name change has been identified.
+# This may be an artifact of new rules being
+# included which require legacy fallback
+# rules to ensure proper policy behavior.
+# Alternatively, this may just be an alias.
+# Please evaluate on a case by case basis
+# keeping in mind the format for aliased
+# rules is:
+# "old_rule_name": "new_rule_name".
+# "volume_extension:volume_image_metadata": "rule:volume_extension:volume_image_metadata:show"
# Set image metadata for a volume
# POST /volumes/{volume_id}/action (os-set_image_metadata)
@@ -1364,7 +1490,16 @@
# volume_extension:volume_image_metadata has been replaced by more
# granular policies that separately govern show, set, and remove
# operations.
-#"volume_extension:volume_image_metadata": "rule:volume_extension:volume_image_metadata:set"
+# WARNING: A rule name change has been identified.
+# This may be an artifact of new rules being
+# included which require legacy fallback
+# rules to ensure proper policy behavior.
+# Alternatively, this may just be an alias.
+# Please evaluate on a case by case basis
+# keeping in mind the format for aliased
+# rules is:
+# "old_rule_name": "new_rule_name".
+# "volume_extension:volume_image_metadata": "rule:volume_extension:volume_image_metadata:set"
# Remove specific image metadata from a volume
# POST /volumes/{volume_id}/action (os-unset_image_metadata)
@@ -1377,7 +1512,16 @@
# volume_extension:volume_image_metadata has been replaced by more
# granular policies that separately govern show, set, and remove
# operations.
-#"volume_extension:volume_image_metadata": "rule:volume_extension:volume_image_metadata:remove"
+# WARNING: A rule name change has been identified.
+# This may be an artifact of new rules being
+# included which require legacy fallback
+# rules to ensure proper policy behavior.
+# Alternatively, this may just be an alias.
+# Please evaluate on a case by case basis
+# keeping in mind the format for aliased
+# rules is:
+# "old_rule_name": "new_rule_name".
+# "volume_extension:volume_image_metadata": "rule:volume_extension:volume_image_metadata:remove"
# Update volume admin metadata. This permission is required to
# complete these API calls, though the ability to make these calls is
diff --git a/openstack_dashboard/conf/default_policies/neutron.yaml b/openstack_dashboard/conf/default_policies/neutron.yaml
index 403f35923..ca2d544b4 100644
--- a/openstack_dashboard/conf/default_policies/neutron.yaml
+++ b/openstack_dashboard/conf/default_policies/neutron.yaml
@@ -73,7 +73,7 @@
name: shared_address_groups
operations: []
scope_types: null
-- check_str: role:reader and project_id:%(project_id)s or rule:shared_address_groups
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s) or rule:shared_address_groups
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner or rule:shared_address_groups
@@ -93,7 +93,7 @@
name: shared_address_scopes
operations: []
scope_types: null
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:regular_user
@@ -134,7 +134,7 @@
path: /address-scopes/{id}
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -160,7 +160,7 @@
path: /address-scopes/{id}
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -318,7 +318,7 @@
path: /routers/{router_id}/l3-agents
scope_types:
- project
-- check_str: role:reader and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -331,7 +331,7 @@
path: /auto-allocated-topology/{project_id}
scope_types:
- project
-- check_str: role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -370,7 +370,7 @@
path: /flavors
scope_types:
- project
-- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s)
+- check_str: role:reader
deprecated_reason: null
deprecated_rule:
check_str: rule:regular_user
@@ -504,7 +504,7 @@
path: /flavors/{flavor_id}/service_profiles/{profile_id}
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:regular_user
@@ -530,7 +530,7 @@
path: /floatingips
scope_types:
- project
-- check_str: rule:admin_only or role:reader and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -545,7 +545,7 @@
path: /floatingips/{id}
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -558,7 +558,7 @@
path: /floatingips/{id}
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -571,7 +571,7 @@
path: /floatingips/{id}
scope_types:
- project
-- check_str: role:reader and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:regular_user
@@ -584,7 +584,7 @@
path: /floatingip_pools
scope_types:
- project
-- check_str: role:member and project_id:%(project_id)s or rule:ext_parent_owner
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s) or rule:ext_parent_owner
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_ext_parent_owner
@@ -597,7 +597,7 @@
path: /floatingips/{floatingip_id}/port_forwardings
scope_types:
- project
-- check_str: role:reader and project_id:%(project_id)s or rule:ext_parent_owner
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s) or rule:ext_parent_owner
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_ext_parent_owner
@@ -612,7 +612,7 @@
path: /floatingips/{floatingip_id}/port_forwardings/{port_forwarding_id}
scope_types:
- project
-- check_str: role:member and project_id:%(project_id)s or rule:ext_parent_owner
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s) or rule:ext_parent_owner
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_ext_parent_owner
@@ -625,7 +625,7 @@
path: /floatingips/{floatingip_id}/port_forwardings/{port_forwarding_id}
scope_types:
- project
-- check_str: role:member and project_id:%(project_id)s or rule:ext_parent_owner
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s) or rule:ext_parent_owner
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_ext_parent_owner
@@ -638,7 +638,7 @@
path: /floatingips/{floatingip_id}/port_forwardings/{port_forwarding_id}
scope_types:
- project
-- check_str: role:member and project_id:%(project_id)s or rule:ext_parent_owner
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s) or rule:ext_parent_owner
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_ext_parent_owner
@@ -651,7 +651,7 @@
path: /routers/{router_id}/conntrack_helpers
scope_types:
- project
-- check_str: role:reader and project_id:%(project_id)s or rule:ext_parent_owner
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s) or rule:ext_parent_owner
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_ext_parent_owner
@@ -666,7 +666,7 @@
path: /routers/{router_id}/conntrack_helpers/{conntrack_helper_id}
scope_types:
- project
-- check_str: role:member and project_id:%(project_id)s or rule:ext_parent_owner
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s) or rule:ext_parent_owner
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_ext_parent_owner
@@ -679,7 +679,7 @@
path: /routers/{router_id}/conntrack_helpers/{conntrack_helper_id}
scope_types:
- project
-- check_str: role:member and project_id:%(project_id)s or rule:ext_parent_owner
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s) or rule:ext_parent_owner
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_ext_parent_owner
@@ -692,7 +692,7 @@
path: /routers/{router_id}/conntrack_helpers/{conntrack_helper_id}
scope_types:
- project
-- check_str: role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:regular_user
@@ -705,7 +705,7 @@
path: /local-ips
scope_types:
- project
-- check_str: role:reader and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -720,7 +720,7 @@
path: /local-ips/{id}
scope_types:
- project
-- check_str: role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -733,7 +733,7 @@
path: /local-ips/{id}
scope_types:
- project
-- check_str: role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -746,7 +746,7 @@
path: /local-ips/{id}
scope_types:
- project
-- check_str: role:member and project_id:%(project_id)s or rule:ext_parent_owner
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s) or rule:ext_parent_owner
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_ext_parent_owner
@@ -759,7 +759,7 @@
path: /local_ips/{local_ip_id}/port_associations
scope_types:
- project
-- check_str: role:reader and project_id:%(project_id)s or rule:ext_parent_owner
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s) or rule:ext_parent_owner
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_ext_parent_owner
@@ -774,7 +774,7 @@
path: /local_ips/{local_ip_id}/port_associations/{fixed_port_id}
scope_types:
- project
-- check_str: role:member and project_id:%(project_id)s or rule:ext_parent_owner
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s) or rule:ext_parent_owner
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_ext_parent_owner
@@ -867,7 +867,7 @@
path: /metering/metering-labels
scope_types:
- project
-- check_str: rule:admin_only or role:reader and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_only
@@ -908,7 +908,7 @@
path: /metering/metering-label-rules
scope_types:
- project
-- check_str: rule:admin_only or role:reader and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_only
@@ -936,7 +936,7 @@
path: /metering/metering-label-rules/{id}
scope_types:
- project
-- check_str: role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:regular_user
@@ -949,7 +949,7 @@
path: /ndp_proxies
scope_types:
- project
-- check_str: role:reader and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -964,7 +964,7 @@
path: /ndp_proxies/{id}
scope_types:
- project
-- check_str: role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -977,7 +977,7 @@
path: /ndp_proxies/{id}
scope_types:
- project
-- check_str: role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -995,7 +995,7 @@
name: external
operations: []
scope_types: null
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:regular_user
@@ -1041,7 +1041,7 @@
operations: *id001
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:regular_user
@@ -1096,7 +1096,7 @@
operations: *id001
scope_types:
- project
-- check_str: rule:admin_only or role:reader and project_id:%(project_id)s or rule:shared
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s) or rule:shared
or rule:external or rule:context_is_advsvc
deprecated_reason: null
deprecated_rule:
@@ -1112,17 +1112,6 @@
path: /networks/{id}
scope_types:
- project
-- check_str: rule:admin_only or role:reader and project_id:%(project_id)s
- deprecated_reason: null
- deprecated_rule:
- check_str: rule:regular_user
- name: get_network:router:external
- deprecated_since: null
- description: Get ``router:external`` attribute of a network
- name: get_network:router:external
- operations: *id002
- scope_types:
- - project
- check_str: rule:admin_only
deprecated_reason: null
deprecated_rule:
@@ -1167,7 +1156,7 @@
operations: *id002
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -1257,7 +1246,7 @@
operations: *id003
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -1268,7 +1257,7 @@
operations: *id003
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -1360,7 +1349,7 @@
name: admin_or_data_plane_int
operations: []
scope_types: null
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:regular_user
@@ -1462,7 +1451,7 @@
operations: *id004
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:regular_user
@@ -1737,6 +1726,7 @@
scope_types:
- project
- check_str: rule:admin_only or rule:context_is_advsvc or role:member and project_id:%(project_id)s
+ or rule:network_owner
deprecated_reason: null
deprecated_rule:
check_str: rule:context_is_advsvc or rule:admin_owner_or_network_owner
@@ -1749,7 +1739,12 @@
path: /ports/{id}
scope_types:
- project
-- check_str: rule:admin_only or role:reader and project_id:%(project_id)s
+- check_str: field:policies:shared=True
+ description: Rule of shared qos policy
+ name: shared_qos_policy
+ operations: []
+ scope_types: null
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s) or rule:shared_qos_policy
deprecated_reason: null
deprecated_rule:
check_str: rule:regular_user
@@ -1818,7 +1813,7 @@
path: /qos/rule-types/{rule_type}
scope_types:
- project
-- check_str: rule:admin_only or role:reader and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:regular_user
@@ -1872,7 +1867,7 @@
path: /qos/policies/{policy_id}/bandwidth_limit_rules/{rule_id}
scope_types:
- project
-- check_str: rule:admin_only or role:reader and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s)
description: Get a QoS packet rate limit rule
name: get_policy_packet_rate_limit_rule
operations:
@@ -1906,7 +1901,7 @@
path: /qos/policies/{policy_id}/packet_rate_limit_rules/{rule_id}
scope_types:
- project
-- check_str: rule:admin_only or role:reader and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:regular_user
@@ -1960,7 +1955,7 @@
path: /qos/policies/{policy_id}/dscp_marking_rules/{rule_id}
scope_types:
- project
-- check_str: rule:admin_only or role:reader and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:regular_user
@@ -2014,7 +2009,7 @@
path: /qos/policies/{policy_id}/minimum_bandwidth_rules/{rule_id}
scope_types:
- project
-- check_str: rule:admin_only or role:reader and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s)
description: Get a QoS minimum packet rate rule
name: get_policy_minimum_packet_rate_rule
operations:
@@ -2048,7 +2043,7 @@
path: /qos/policies/{policy_id}/minimum_packet_rate_rules/{rule_id}
scope_types:
- project
-- check_str: rule:admin_only or role:reader and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:regular_user
@@ -2087,7 +2082,7 @@
path: /qos/alias_bandwidth_limit_rules/{rule_id}/
scope_types:
- project
-- check_str: rule:admin_only or role:reader and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:regular_user
@@ -2126,7 +2121,7 @@
path: /qos/alias_dscp_marking_rules/{rule_id}/
scope_types:
- project
-- check_str: rule:admin_only or role:reader and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:regular_user
@@ -2236,7 +2231,7 @@
name: restrict_wildcard
operations: []
scope_types: null
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:regular_user
@@ -2262,7 +2257,7 @@
path: /rbac-policies
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -2288,7 +2283,7 @@
path: /rbac-policies/{id}
scope_types:
- project
-- check_str: rule:admin_only or role:reader and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -2303,7 +2298,7 @@
path: /rbac-policies/{id}
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -2316,7 +2311,7 @@
path: /rbac-policies/{id}
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:regular_user
@@ -2351,7 +2346,7 @@
operations: *id007
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -2362,7 +2357,7 @@
operations: *id007
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -2398,7 +2393,7 @@
operations: *id007
scope_types:
- project
-- check_str: rule:admin_only or role:reader and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -2435,7 +2430,7 @@
operations: *id008
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -2470,7 +2465,7 @@
operations: *id009
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -2481,7 +2476,7 @@
operations: *id009
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -2517,7 +2512,7 @@
operations: *id009
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -2530,7 +2525,7 @@
path: /routers/{id}
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -2543,7 +2538,7 @@
path: /routers/{id}/add_router_interface
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -2556,7 +2551,7 @@
path: /routers/{id}/remove_router_interface
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -2569,7 +2564,7 @@
path: /routers/{id}/add_extraroutes
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -2592,7 +2587,12 @@
name: admin_owner_or_sg_owner
operations: []
scope_types: null
-- check_str: role:member and project_id:%(project_id)s
+- check_str: field:security_groups:shared=True
+ description: Definition of a shared security group
+ name: shared_security_group
+ operations: []
+ scope_types: null
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -2605,7 +2605,7 @@
path: /security-groups
scope_types:
- project
-- check_str: role:reader and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s) or rule:shared_security_group
deprecated_reason: null
deprecated_rule:
check_str: rule:regular_user
@@ -2620,7 +2620,7 @@
path: /security-groups/{id}
scope_types:
- project
-- check_str: role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -2633,7 +2633,7 @@
path: /security-groups/{id}
scope_types:
- project
-- check_str: role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -2646,7 +2646,7 @@
path: /security-groups/{id}
scope_types:
- project
-- check_str: role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -2659,7 +2659,7 @@
path: /security-group-rules
scope_types:
- project
-- check_str: role:reader and project_id:%(project_id)s or rule:sg_owner
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s) or rule:sg_owner
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_owner_or_sg_owner
@@ -2674,7 +2674,7 @@
path: /security-group-rules/{id}
scope_types:
- project
-- check_str: role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -2754,7 +2754,7 @@
path: /service-providers
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s or rule:network_owner
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s) or rule:network_owner
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_network_owner
@@ -2789,7 +2789,7 @@
operations: *id010
scope_types:
- project
-- check_str: rule:admin_only or role:reader and project_id:%(project_id)s or rule:shared
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s) or rule:shared
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner or rule:shared
@@ -2815,7 +2815,7 @@
operations: *id011
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s or rule:network_owner
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s) or rule:network_owner
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_network_owner
@@ -2850,7 +2850,7 @@
operations: *id012
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s or rule:network_owner
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s) or rule:network_owner
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_network_owner
@@ -2868,7 +2868,7 @@
name: shared_subnetpools
operations: []
scope_types: null
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:regular_user
@@ -2907,7 +2907,7 @@
path: /subnetpools
scope_types:
- project
-- check_str: rule:admin_only or role:reader and project_id:%(project_id)s or rule:shared_subnetpools
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s) or rule:shared_subnetpools
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner or rule:shared_subnetpools
@@ -2922,7 +2922,7 @@
path: /subnetpools/{id}
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -2948,7 +2948,7 @@
path: /subnetpools/{id}
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -2961,7 +2961,7 @@
path: /subnetpools/{id}
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -2974,7 +2974,7 @@
path: /subnetpools/{id}/onboard_network_subnets
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -2987,7 +2987,7 @@
path: /subnetpools/{id}/add_prefixes
scope_types:
- project
-- check_str: rule:admin_only or role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -3000,7 +3000,7 @@
path: /subnetpools/{id}/remove_prefixes
scope_types:
- project
-- check_str: role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:regular_user
@@ -3013,7 +3013,7 @@
path: /trunks
scope_types:
- project
-- check_str: role:reader and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -3028,7 +3028,7 @@
path: /trunks/{id}
scope_types:
- project
-- check_str: role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -3041,7 +3041,7 @@
path: /trunks/{id}
scope_types:
- project
-- check_str: role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -3054,7 +3054,7 @@
path: /trunks/{id}
scope_types:
- project
-- check_str: role:reader and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:reader and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:regular_user
@@ -3067,7 +3067,7 @@
path: /trunks/{id}/get_subports
scope_types:
- project
-- check_str: role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -3080,7 +3080,7 @@
path: /trunks/{id}/add_subports
scope_types:
- project
-- check_str: role:member and project_id:%(project_id)s
+- check_str: (rule:admin_only) or (role:member and project_id:%(project_id)s)
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
diff --git a/openstack_dashboard/conf/default_policies/nova.yaml b/openstack_dashboard/conf/default_policies/nova.yaml
index 016f30a4c..5b0f4b21c 100644
--- a/openstack_dashboard/conf/default_policies/nova.yaml
+++ b/openstack_dashboard/conf/default_policies/nova.yaml
@@ -2055,7 +2055,7 @@
path: /servers/{server_id}/action (suspend)
scope_types:
- project
-- check_str: rule:project_reader_api
+- check_str: rule:project_reader_or_admin
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
@@ -2071,7 +2071,7 @@
path: /os-tenant-networks
scope_types:
- project
-- check_str: rule:project_reader_api
+- check_str: rule:project_reader_or_admin
deprecated_reason: null
deprecated_rule:
check_str: rule:admin_or_owner
diff --git a/openstack_dashboard/conf/neutron_policy.yaml b/openstack_dashboard/conf/neutron_policy.yaml
index 92f13daa8..00f28fe36 100644
--- a/openstack_dashboard/conf/neutron_policy.yaml
+++ b/openstack_dashboard/conf/neutron_policy.yaml
@@ -47,13 +47,13 @@
# GET /address-groups
# GET /address-groups/{id}
# Intended scope(s): project
-#"get_address_group": "role:reader and project_id:%(project_id)s or rule:shared_address_groups"
+#"get_address_group": "(rule:admin_only) or (role:reader and project_id:%(project_id)s) or rule:shared_address_groups"
# DEPRECATED
# "get_address_group":"rule:admin_or_owner or
# rule:shared_address_groups" has been deprecated since W in favor of
-# "get_address_group":"role:reader and project_id:%(project_id)s or
-# rule:shared_address_groups".
+# "get_address_group":"(rule:admin_only) or (role:reader and
+# project_id:%(project_id)s) or rule:shared_address_groups".
# The Address scope API now supports system scope and default roles.
# Definition of a shared address scope
@@ -62,12 +62,12 @@
# Create an address scope
# POST /address-scopes
# Intended scope(s): project
-#"create_address_scope": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"create_address_scope": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "create_address_scope":"rule:regular_user" has been deprecated since
-# W in favor of "create_address_scope":"rule:admin_only or role:member
-# and project_id:%(project_id)s".
+# W in favor of "create_address_scope":"(rule:admin_only) or
+# (role:member and project_id:%(project_id)s)".
# The Address scope API now supports system scope and default roles.
# Create a shared address scope
@@ -96,12 +96,12 @@
# Update an address scope
# PUT /address-scopes/{id}
# Intended scope(s): project
-#"update_address_scope": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"update_address_scope": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "update_address_scope":"rule:admin_or_owner" has been deprecated
-# since W in favor of "update_address_scope":"rule:admin_only or
-# role:member and project_id:%(project_id)s".
+# since W in favor of "update_address_scope":"(rule:admin_only) or
+# (role:member and project_id:%(project_id)s)".
# The Address scope API now supports system scope and default roles.
# Update ``shared`` attribute of an address scope
@@ -117,12 +117,12 @@
# Delete an address scope
# DELETE /address-scopes/{id}
# Intended scope(s): project
-#"delete_address_scope": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"delete_address_scope": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "delete_address_scope":"rule:admin_or_owner" has been deprecated
-# since W in favor of "delete_address_scope":"rule:admin_only or
-# role:member and project_id:%(project_id)s".
+# since W in favor of "delete_address_scope":"(rule:admin_only) or
+# (role:member and project_id:%(project_id)s)".
# The Address scope API now supports system scope and default roles.
# Get an agent
@@ -239,26 +239,26 @@
# Get a project's auto-allocated topology
# GET /auto-allocated-topology/{project_id}
# Intended scope(s): project
-#"get_auto_allocated_topology": "role:reader and project_id:%(project_id)s"
+#"get_auto_allocated_topology": "(rule:admin_only) or (role:reader and project_id:%(project_id)s)"
# DEPRECATED
# "get_auto_allocated_topology":"rule:admin_or_owner" has been
# deprecated since W in favor of
-# "get_auto_allocated_topology":"role:reader and
-# project_id:%(project_id)s".
+# "get_auto_allocated_topology":"(rule:admin_only) or (role:reader and
+# project_id:%(project_id)s)".
# The Auto allocated topology API now supports system scope and
# default roles.
# Delete a project's auto-allocated topology
# DELETE /auto-allocated-topology/{project_id}
# Intended scope(s): project
-#"delete_auto_allocated_topology": "role:member and project_id:%(project_id)s"
+#"delete_auto_allocated_topology": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "delete_auto_allocated_topology":"rule:admin_or_owner" has been
# deprecated since W in favor of
-# "delete_auto_allocated_topology":"role:member and
-# project_id:%(project_id)s".
+# "delete_auto_allocated_topology":"(rule:admin_only) or (role:member
+# and project_id:%(project_id)s)".
# The Auto allocated topology API now supports system scope and
# default roles.
@@ -287,12 +287,11 @@
# GET /flavors
# GET /flavors/{id}
# Intended scope(s): project
-#"get_flavor": "(rule:admin_only) or (role:reader and project_id:%(project_id)s)"
+#"get_flavor": "role:reader"
# DEPRECATED
# "get_flavor":"rule:regular_user" has been deprecated since W in
-# favor of "get_flavor":"(rule:admin_only) or (role:reader and
-# project_id:%(project_id)s)".
+# favor of "get_flavor":"role:reader".
# The flavor API now supports project scope and default roles.
# Update a flavor
@@ -393,12 +392,12 @@
# Create a floating IP
# POST /floatingips
# Intended scope(s): project
-#"create_floatingip": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"create_floatingip": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "create_floatingip":"rule:regular_user" has been deprecated since W
-# in favor of "create_floatingip":"rule:admin_only or role:member and
-# project_id:%(project_id)s".
+# in favor of "create_floatingip":"(rule:admin_only) or (role:member
+# and project_id:%(project_id)s)".
# The Floating IP API now supports system scope and default roles.
# Create a floating IP with a specific IP address
@@ -416,58 +415,59 @@
# GET /floatingips
# GET /floatingips/{id}
# Intended scope(s): project
-#"get_floatingip": "rule:admin_only or role:reader and project_id:%(project_id)s"
+#"get_floatingip": "(rule:admin_only) or (role:reader and project_id:%(project_id)s)"
# DEPRECATED
# "get_floatingip":"rule:admin_or_owner" has been deprecated since W
-# in favor of "get_floatingip":"rule:admin_only or role:reader and
-# project_id:%(project_id)s".
+# in favor of "get_floatingip":"(rule:admin_only) or (role:reader and
+# project_id:%(project_id)s)".
# The Floating IP API now supports system scope and default roles.
# Update a floating IP
# PUT /floatingips/{id}
# Intended scope(s): project
-#"update_floatingip": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"update_floatingip": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "update_floatingip":"rule:admin_or_owner" has been deprecated since
-# W in favor of "update_floatingip":"rule:admin_only or role:member
-# and project_id:%(project_id)s".
+# W in favor of "update_floatingip":"(rule:admin_only) or (role:member
+# and project_id:%(project_id)s)".
# The Floating IP API now supports system scope and default roles.
# Delete a floating IP
# DELETE /floatingips/{id}
# Intended scope(s): project
-#"delete_floatingip": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"delete_floatingip": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "delete_floatingip":"rule:admin_or_owner" has been deprecated since
-# W in favor of "delete_floatingip":"rule:admin_only or role:member
-# and project_id:%(project_id)s".
+# W in favor of "delete_floatingip":"(rule:admin_only) or (role:member
+# and project_id:%(project_id)s)".
# The Floating IP API now supports system scope and default roles.
# Get floating IP pools
# GET /floatingip_pools
# Intended scope(s): project
-#"get_floatingip_pool": "role:reader and project_id:%(project_id)s"
+#"get_floatingip_pool": "(rule:admin_only) or (role:reader and project_id:%(project_id)s)"
# DEPRECATED
# "get_floatingip_pool":"rule:regular_user" has been deprecated since
-# W in favor of "get_floatingip_pool":"role:reader and
-# project_id:%(project_id)s".
+# W in favor of "get_floatingip_pool":"(rule:admin_only) or
+# (role:reader and project_id:%(project_id)s)".
# The Floating IP Pool API now supports system scope and default
# roles.
# Create a floating IP port forwarding
# POST /floatingips/{floatingip_id}/port_forwardings
# Intended scope(s): project
-#"create_floatingip_port_forwarding": "role:member and project_id:%(project_id)s or rule:ext_parent_owner"
+#"create_floatingip_port_forwarding": "(rule:admin_only) or (role:member and project_id:%(project_id)s) or rule:ext_parent_owner"
# DEPRECATED
# "create_floatingip_port_forwarding":"rule:admin_or_ext_parent_owner"
# has been deprecated since W in favor of
-# "create_floatingip_port_forwarding":"role:member and
-# project_id:%(project_id)s or rule:ext_parent_owner".
+# "create_floatingip_port_forwarding":"(rule:admin_only) or
+# (role:member and project_id:%(project_id)s) or
+# rule:ext_parent_owner".
# The floating IP port forwarding API now supports system scope and
# default roles.
@@ -475,52 +475,54 @@
# GET /floatingips/{floatingip_id}/port_forwardings
# GET /floatingips/{floatingip_id}/port_forwardings/{port_forwarding_id}
# Intended scope(s): project
-#"get_floatingip_port_forwarding": "role:reader and project_id:%(project_id)s or rule:ext_parent_owner"
+#"get_floatingip_port_forwarding": "(rule:admin_only) or (role:reader and project_id:%(project_id)s) or rule:ext_parent_owner"
# DEPRECATED
# "get_floatingip_port_forwarding":"rule:admin_or_ext_parent_owner"
# has been deprecated since W in favor of
-# "get_floatingip_port_forwarding":"role:reader and
-# project_id:%(project_id)s or rule:ext_parent_owner".
+# "get_floatingip_port_forwarding":"(rule:admin_only) or (role:reader
+# and project_id:%(project_id)s) or rule:ext_parent_owner".
# The floating IP port forwarding API now supports system scope and
# default roles.
# Update a floating IP port forwarding
# PUT /floatingips/{floatingip_id}/port_forwardings/{port_forwarding_id}
# Intended scope(s): project
-#"update_floatingip_port_forwarding": "role:member and project_id:%(project_id)s or rule:ext_parent_owner"
+#"update_floatingip_port_forwarding": "(rule:admin_only) or (role:member and project_id:%(project_id)s) or rule:ext_parent_owner"
# DEPRECATED
# "update_floatingip_port_forwarding":"rule:admin_or_ext_parent_owner"
# has been deprecated since W in favor of
-# "update_floatingip_port_forwarding":"role:member and
-# project_id:%(project_id)s or rule:ext_parent_owner".
+# "update_floatingip_port_forwarding":"(rule:admin_only) or
+# (role:member and project_id:%(project_id)s) or
+# rule:ext_parent_owner".
# The floating IP port forwarding API now supports system scope and
# default roles.
# Delete a floating IP port forwarding
# DELETE /floatingips/{floatingip_id}/port_forwardings/{port_forwarding_id}
# Intended scope(s): project
-#"delete_floatingip_port_forwarding": "role:member and project_id:%(project_id)s or rule:ext_parent_owner"
+#"delete_floatingip_port_forwarding": "(rule:admin_only) or (role:member and project_id:%(project_id)s) or rule:ext_parent_owner"
# DEPRECATED
# "delete_floatingip_port_forwarding":"rule:admin_or_ext_parent_owner"
# has been deprecated since W in favor of
-# "delete_floatingip_port_forwarding":"role:member and
-# project_id:%(project_id)s or rule:ext_parent_owner".
+# "delete_floatingip_port_forwarding":"(rule:admin_only) or
+# (role:member and project_id:%(project_id)s) or
+# rule:ext_parent_owner".
# The floating IP port forwarding API now supports system scope and
# default roles.
# Create a router conntrack helper
# POST /routers/{router_id}/conntrack_helpers
# Intended scope(s): project
-#"create_router_conntrack_helper": "role:member and project_id:%(project_id)s or rule:ext_parent_owner"
+#"create_router_conntrack_helper": "(rule:admin_only) or (role:member and project_id:%(project_id)s) or rule:ext_parent_owner"
# DEPRECATED
# "create_router_conntrack_helper":"rule:admin_or_ext_parent_owner"
# has been deprecated since W in favor of
-# "create_router_conntrack_helper":"role:member and
-# project_id:%(project_id)s or rule:ext_parent_owner".
+# "create_router_conntrack_helper":"(rule:admin_only) or (role:member
+# and project_id:%(project_id)s) or rule:ext_parent_owner".
# The router conntrack API now supports system scope and default
# roles.
@@ -528,121 +530,124 @@
# GET /routers/{router_id}/conntrack_helpers
# GET /routers/{router_id}/conntrack_helpers/{conntrack_helper_id}
# Intended scope(s): project
-#"get_router_conntrack_helper": "role:reader and project_id:%(project_id)s or rule:ext_parent_owner"
+#"get_router_conntrack_helper": "(rule:admin_only) or (role:reader and project_id:%(project_id)s) or rule:ext_parent_owner"
# DEPRECATED
# "get_router_conntrack_helper":"rule:admin_or_ext_parent_owner" has
# been deprecated since W in favor of
-# "get_router_conntrack_helper":"role:reader and
-# project_id:%(project_id)s or rule:ext_parent_owner".
+# "get_router_conntrack_helper":"(rule:admin_only) or (role:reader and
+# project_id:%(project_id)s) or rule:ext_parent_owner".
# The router conntrack API now supports system scope and default
# roles.
# Update a router conntrack helper
# PUT /routers/{router_id}/conntrack_helpers/{conntrack_helper_id}
# Intended scope(s): project
-#"update_router_conntrack_helper": "role:member and project_id:%(project_id)s or rule:ext_parent_owner"
+#"update_router_conntrack_helper": "(rule:admin_only) or (role:member and project_id:%(project_id)s) or rule:ext_parent_owner"
# DEPRECATED
# "update_router_conntrack_helper":"rule:admin_or_ext_parent_owner"
# has been deprecated since W in favor of
-# "update_router_conntrack_helper":"role:member and
-# project_id:%(project_id)s or rule:ext_parent_owner".
+# "update_router_conntrack_helper":"(rule:admin_only) or (role:member
+# and project_id:%(project_id)s) or rule:ext_parent_owner".
# The router conntrack API now supports system scope and default
# roles.
# Delete a router conntrack helper
# DELETE /routers/{router_id}/conntrack_helpers/{conntrack_helper_id}
# Intended scope(s): project
-#"delete_router_conntrack_helper": "role:member and project_id:%(project_id)s or rule:ext_parent_owner"
+#"delete_router_conntrack_helper": "(rule:admin_only) or (role:member and project_id:%(project_id)s) or rule:ext_parent_owner"
# DEPRECATED
# "delete_router_conntrack_helper":"rule:admin_or_ext_parent_owner"
# has been deprecated since W in favor of
-# "delete_router_conntrack_helper":"role:member and
-# project_id:%(project_id)s or rule:ext_parent_owner".
+# "delete_router_conntrack_helper":"(rule:admin_only) or (role:member
+# and project_id:%(project_id)s) or rule:ext_parent_owner".
# The router conntrack API now supports system scope and default
# roles.
# Create a Local IP
# POST /local-ips
# Intended scope(s): project
-#"create_local_ip": "role:member and project_id:%(project_id)s"
+#"create_local_ip": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "create_local_ip":"rule:regular_user" has been deprecated since W in
-# favor of "create_local_ip":"role:member and
-# project_id:%(project_id)s".
+# favor of "create_local_ip":"(rule:admin_only) or (role:member and
+# project_id:%(project_id)s)".
# The Local IP API now supports system scope and default roles.
# Get a Local IP
# GET /local-ips
# GET /local-ips/{id}
# Intended scope(s): project
-#"get_local_ip": "role:reader and project_id:%(project_id)s"
+#"get_local_ip": "(rule:admin_only) or (role:reader and project_id:%(project_id)s)"
# DEPRECATED
# "get_local_ip":"rule:admin_or_owner" has been deprecated since W in
-# favor of "get_local_ip":"role:reader and project_id:%(project_id)s".
+# favor of "get_local_ip":"(rule:admin_only) or (role:reader and
+# project_id:%(project_id)s)".
# The Local IP API now supports system scope and default roles.
# Update a Local IP
# PUT /local-ips/{id}
# Intended scope(s): project
-#"update_local_ip": "role:member and project_id:%(project_id)s"
+#"update_local_ip": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "update_local_ip":"rule:admin_or_owner" has been deprecated since W
-# in favor of "update_local_ip":"role:member and
-# project_id:%(project_id)s".
+# in favor of "update_local_ip":"(rule:admin_only) or (role:member and
+# project_id:%(project_id)s)".
# The Local IP API now supports system scope and default roles.
# Delete a Local IP
# DELETE /local-ips/{id}
# Intended scope(s): project
-#"delete_local_ip": "role:member and project_id:%(project_id)s"
+#"delete_local_ip": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "delete_local_ip":"rule:admin_or_owner" has been deprecated since W
-# in favor of "delete_local_ip":"role:member and
-# project_id:%(project_id)s".
+# in favor of "delete_local_ip":"(rule:admin_only) or (role:member and
+# project_id:%(project_id)s)".
# The Local IP API now supports system scope and default roles.
# Create a Local IP port association
# POST /local_ips/{local_ip_id}/port_associations
# Intended scope(s): project
-#"create_local_ip_port_association": "role:member and project_id:%(project_id)s or rule:ext_parent_owner"
+#"create_local_ip_port_association": "(rule:admin_only) or (role:member and project_id:%(project_id)s) or rule:ext_parent_owner"
# DEPRECATED
# "create_local_ip_port_association":"rule:admin_or_ext_parent_owner"
# has been deprecated since W in favor of
-# "create_local_ip_port_association":"role:member and
-# project_id:%(project_id)s or rule:ext_parent_owner".
+# "create_local_ip_port_association":"(rule:admin_only) or
+# (role:member and project_id:%(project_id)s) or
+# rule:ext_parent_owner".
# The Local IP API now supports system scope and default roles.
# Get a Local IP port association
# GET /local_ips/{local_ip_id}/port_associations
# GET /local_ips/{local_ip_id}/port_associations/{fixed_port_id}
# Intended scope(s): project
-#"get_local_ip_port_association": "role:reader and project_id:%(project_id)s or rule:ext_parent_owner"
+#"get_local_ip_port_association": "(rule:admin_only) or (role:reader and project_id:%(project_id)s) or rule:ext_parent_owner"
# DEPRECATED
# "get_local_ip_port_association":"rule:admin_or_ext_parent_owner" has
# been deprecated since W in favor of
-# "get_local_ip_port_association":"role:reader and
-# project_id:%(project_id)s or rule:ext_parent_owner".
+# "get_local_ip_port_association":"(rule:admin_only) or (role:reader
+# and project_id:%(project_id)s) or rule:ext_parent_owner".
# The Local IP API now supports system scope and default roles.
# Delete a Local IP port association
# DELETE /local_ips/{local_ip_id}/port_associations/{fixed_port_id}
# Intended scope(s): project
-#"delete_local_ip_port_association": "role:member and project_id:%(project_id)s or rule:ext_parent_owner"
+#"delete_local_ip_port_association": "(rule:admin_only) or (role:member and project_id:%(project_id)s) or rule:ext_parent_owner"
# DEPRECATED
# "delete_local_ip_port_association":"rule:admin_or_ext_parent_owner"
# has been deprecated since W in favor of
-# "delete_local_ip_port_association":"role:member and
-# project_id:%(project_id)s or rule:ext_parent_owner".
+# "delete_local_ip_port_association":"(rule:admin_only) or
+# (role:member and project_id:%(project_id)s) or
+# rule:ext_parent_owner".
# The Local IP API now supports system scope and default roles.
# Get loggable resources
@@ -710,12 +715,12 @@
# GET /metering/metering-labels
# GET /metering/metering-labels/{id}
# Intended scope(s): project
-#"get_metering_label": "rule:admin_only or role:reader and project_id:%(project_id)s"
+#"get_metering_label": "(rule:admin_only) or (role:reader and project_id:%(project_id)s)"
# DEPRECATED
# "get_metering_label":"rule:admin_only" has been deprecated since W
-# in favor of "get_metering_label":"rule:admin_only or role:reader and
-# project_id:%(project_id)s".
+# in favor of "get_metering_label":"(rule:admin_only) or (role:reader
+# and project_id:%(project_id)s)".
# The metering API now supports system scope and default roles.
# Delete a metering label
@@ -742,12 +747,12 @@
# GET /metering/metering-label-rules
# GET /metering/metering-label-rules/{id}
# Intended scope(s): project
-#"get_metering_label_rule": "rule:admin_only or role:reader and project_id:%(project_id)s"
+#"get_metering_label_rule": "(rule:admin_only) or (role:reader and project_id:%(project_id)s)"
# DEPRECATED
# "get_metering_label_rule":"rule:admin_only" has been deprecated
-# since W in favor of "get_metering_label_rule":"rule:admin_only or
-# role:reader and project_id:%(project_id)s".
+# since W in favor of "get_metering_label_rule":"(rule:admin_only) or
+# (role:reader and project_id:%(project_id)s)".
# The metering API now supports system scope and default roles.
# Delete a metering label rule
@@ -763,46 +768,46 @@
# Create a ndp proxy
# POST /ndp_proxies
# Intended scope(s): project
-#"create_ndp_proxy": "role:member and project_id:%(project_id)s"
+#"create_ndp_proxy": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "create_ndp_proxy":"rule:regular_user" has been deprecated since W
-# in favor of "create_ndp_proxy":"role:member and
-# project_id:%(project_id)s".
+# in favor of "create_ndp_proxy":"(rule:admin_only) or (role:member
+# and project_id:%(project_id)s)".
# The ndp proxy API now supports system scope and default roles.
# Get a ndp proxy
# GET /ndp_proxies
# GET /ndp_proxies/{id}
# Intended scope(s): project
-#"get_ndp_proxy": "role:reader and project_id:%(project_id)s"
+#"get_ndp_proxy": "(rule:admin_only) or (role:reader and project_id:%(project_id)s)"
# DEPRECATED
# "get_ndp_proxy":"rule:admin_or_owner" has been deprecated since W in
-# favor of "get_ndp_proxy":"role:reader and
-# project_id:%(project_id)s".
+# favor of "get_ndp_proxy":"(rule:admin_only) or (role:reader and
+# project_id:%(project_id)s)".
# The ndp proxy API now supports system scope and default roles.
# Update a ndp proxy
# PUT /ndp_proxies/{id}
# Intended scope(s): project
-#"update_ndp_proxy": "role:member and project_id:%(project_id)s"
+#"update_ndp_proxy": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "update_ndp_proxy":"rule:admin_or_owner" has been deprecated since W
-# in favor of "update_ndp_proxy":"role:member and
-# project_id:%(project_id)s".
+# in favor of "update_ndp_proxy":"(rule:admin_only) or (role:member
+# and project_id:%(project_id)s)".
# The ndp proxy API now supports system scope and default roles.
# Delete a ndp proxy
# DELETE /ndp_proxies/{id}
# Intended scope(s): project
-#"delete_ndp_proxy": "role:member and project_id:%(project_id)s"
+#"delete_ndp_proxy": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "delete_ndp_proxy":"rule:admin_or_owner" has been deprecated since W
-# in favor of "delete_ndp_proxy":"role:member and
-# project_id:%(project_id)s".
+# in favor of "delete_ndp_proxy":"(rule:admin_only) or (role:member
+# and project_id:%(project_id)s)".
# The ndp proxy API now supports system scope and default roles.
# Definition of an external network
@@ -811,12 +816,12 @@
# Create a network
# POST /networks
# Intended scope(s): project
-#"create_network": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"create_network": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "create_network":"rule:regular_user" has been deprecated since W in
-# favor of "create_network":"rule:admin_only or role:member and
-# project_id:%(project_id)s".
+# favor of "create_network":"(rule:admin_only) or (role:member and
+# project_id:%(project_id)s)".
# The network API now supports system scope and default roles.
# Create a shared network
@@ -853,13 +858,13 @@
# Specify ``port_security_enabled`` attribute when creating a network
# POST /networks
# Intended scope(s): project
-#"create_network:port_security_enabled": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"create_network:port_security_enabled": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "create_network:port_security_enabled":"rule:regular_user" has been
# deprecated since W in favor of
-# "create_network:port_security_enabled":"rule:admin_only or
-# role:member and project_id:%(project_id)s".
+# "create_network:port_security_enabled":"(rule:admin_only) or
+# (role:member and project_id:%(project_id)s)".
# The network API now supports system scope and default roles.
# Specify ``segments`` attribute when creating a network
@@ -909,29 +914,16 @@
# GET /networks
# GET /networks/{id}
# Intended scope(s): project
-#"get_network": "rule:admin_only or role:reader and project_id:%(project_id)s or rule:shared or rule:external or rule:context_is_advsvc"
+#"get_network": "(rule:admin_only) or (role:reader and project_id:%(project_id)s) or rule:shared or rule:external or rule:context_is_advsvc"
# DEPRECATED
# "get_network":"rule:admin_or_owner or rule:shared or rule:external
# or rule:context_is_advsvc" has been deprecated since W in favor of
-# "get_network":"rule:admin_only or role:reader and
-# project_id:%(project_id)s or rule:shared or rule:external or
+# "get_network":"(rule:admin_only) or (role:reader and
+# project_id:%(project_id)s) or rule:shared or rule:external or
# rule:context_is_advsvc".
# The network API now supports system scope and default roles.
-# Get ``router:external`` attribute of a network
-# GET /networks
-# GET /networks/{id}
-# Intended scope(s): project
-#"get_network:router:external": "rule:admin_only or role:reader and project_id:%(project_id)s"
-
-# DEPRECATED
-# "get_network:router:external":"rule:regular_user" has been
-# deprecated since W in favor of
-# "get_network:router:external":"rule:admin_only or role:reader and
-# project_id:%(project_id)s".
-# The network API now supports system scope and default roles.
-
# Get ``segments`` attribute of a network
# GET /networks
# GET /networks/{id}
@@ -982,12 +974,12 @@
# Update a network
# PUT /networks/{id}
# Intended scope(s): project
-#"update_network": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"update_network": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "update_network":"rule:admin_or_owner" has been deprecated since W
-# in favor of "update_network":"rule:admin_only or role:member and
-# project_id:%(project_id)s".
+# in favor of "update_network":"(rule:admin_only) or (role:member and
+# project_id:%(project_id)s)".
# The network API now supports system scope and default roles.
# Update ``segments`` attribute of a network
@@ -1067,24 +1059,24 @@
# Update ``port_security_enabled`` attribute of a network
# PUT /networks/{id}
# Intended scope(s): project
-#"update_network:port_security_enabled": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"update_network:port_security_enabled": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "update_network:port_security_enabled":"rule:admin_or_owner" has
# been deprecated since W in favor of
-# "update_network:port_security_enabled":"rule:admin_only or
-# role:member and project_id:%(project_id)s".
+# "update_network:port_security_enabled":"(rule:admin_only) or
+# (role:member and project_id:%(project_id)s)".
# The network API now supports system scope and default roles.
# Delete a network
# DELETE /networks/{id}
# Intended scope(s): project
-#"delete_network": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"delete_network": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "delete_network":"rule:admin_or_owner" has been deprecated since W
-# in favor of "delete_network":"rule:admin_only or role:member and
-# project_id:%(project_id)s".
+# in favor of "delete_network":"(rule:admin_only) or (role:member and
+# project_id:%(project_id)s)".
# The network API now supports system scope and default roles.
# Get network IP availability
@@ -1156,12 +1148,12 @@
# Create a port
# POST /ports
# Intended scope(s): project
-#"create_port": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"create_port": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "create_port":"rule:regular_user" has been deprecated since W in
-# favor of "create_port":"rule:admin_only or role:member and
-# project_id:%(project_id)s".
+# favor of "create_port":"(rule:admin_only) or (role:member and
+# project_id:%(project_id)s)".
# The port API now supports project scope and default roles.
# Specify ``device_owner`` attribute when creating a port
@@ -1261,13 +1253,13 @@
# Specify ``binding:vnic_type`` attribute when creating a port
# POST /ports
# Intended scope(s): project
-#"create_port:binding:vnic_type": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"create_port:binding:vnic_type": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "create_port:binding:vnic_type":"rule:regular_user" has been
# deprecated since W in favor of
-# "create_port:binding:vnic_type":"rule:admin_only or role:member and
-# project_id:%(project_id)s".
+# "create_port:binding:vnic_type":"(rule:admin_only) or (role:member
+# and project_id:%(project_id)s)".
# The port API now supports project scope and default roles.
# Specify ``allowed_address_pairs`` attribute when creating a port
@@ -1548,25 +1540,28 @@
# Delete a port
# DELETE /ports/{id}
# Intended scope(s): project
-#"delete_port": "rule:admin_only or rule:context_is_advsvc or role:member and project_id:%(project_id)s"
+#"delete_port": "rule:admin_only or rule:context_is_advsvc or role:member and project_id:%(project_id)s or rule:network_owner"
# DEPRECATED
# "delete_port":"rule:context_is_advsvc or
# rule:admin_owner_or_network_owner" has been deprecated since W in
# favor of "delete_port":"rule:admin_only or rule:context_is_advsvc or
-# role:member and project_id:%(project_id)s".
+# role:member and project_id:%(project_id)s or rule:network_owner".
# The port API now supports project scope and default roles.
+# Rule of shared qos policy
+#"shared_qos_policy": "field:policies:shared=True"
+
# Get QoS policies
# GET /qos/policies
# GET /qos/policies/{id}
# Intended scope(s): project
-#"get_policy": "rule:admin_only or role:reader and project_id:%(project_id)s"
+#"get_policy": "(rule:admin_only) or (role:reader and project_id:%(project_id)s) or rule:shared_qos_policy"
# DEPRECATED
# "get_policy":"rule:regular_user" has been deprecated since W in
-# favor of "get_policy":"rule:admin_only or role:reader and
-# project_id:%(project_id)s".
+# favor of "get_policy":"(rule:admin_only) or (role:reader and
+# project_id:%(project_id)s) or rule:shared_qos_policy".
# The QoS API now supports project scope and default roles.
# Create a QoS policy
@@ -1614,13 +1609,13 @@
# GET /qos/policies/{policy_id}/bandwidth_limit_rules
# GET /qos/policies/{policy_id}/bandwidth_limit_rules/{rule_id}
# Intended scope(s): project
-#"get_policy_bandwidth_limit_rule": "rule:admin_only or role:reader and project_id:%(project_id)s"
+#"get_policy_bandwidth_limit_rule": "(rule:admin_only) or (role:reader and project_id:%(project_id)s)"
# DEPRECATED
# "get_policy_bandwidth_limit_rule":"rule:regular_user" has been
# deprecated since W in favor of
-# "get_policy_bandwidth_limit_rule":"rule:admin_only or role:reader
-# and project_id:%(project_id)s".
+# "get_policy_bandwidth_limit_rule":"(rule:admin_only) or (role:reader
+# and project_id:%(project_id)s)".
# The QoS API now supports project scope and default roles.
# Create a QoS bandwidth limit rule
@@ -1660,7 +1655,7 @@
# GET /qos/policies/{policy_id}/packet_rate_limit_rules
# GET /qos/policies/{policy_id}/packet_rate_limit_rules/{rule_id}
# Intended scope(s): project
-#"get_policy_packet_rate_limit_rule": "rule:admin_only or role:reader and project_id:%(project_id)s"
+#"get_policy_packet_rate_limit_rule": "(rule:admin_only) or (role:reader and project_id:%(project_id)s)"
# Create a QoS packet rate limit rule
# POST /qos/policies/{policy_id}/packet_rate_limit_rules
@@ -1681,13 +1676,13 @@
# GET /qos/policies/{policy_id}/dscp_marking_rules
# GET /qos/policies/{policy_id}/dscp_marking_rules/{rule_id}
# Intended scope(s): project
-#"get_policy_dscp_marking_rule": "rule:admin_only or role:reader and project_id:%(project_id)s"
+#"get_policy_dscp_marking_rule": "(rule:admin_only) or (role:reader and project_id:%(project_id)s)"
# DEPRECATED
# "get_policy_dscp_marking_rule":"rule:regular_user" has been
# deprecated since W in favor of
-# "get_policy_dscp_marking_rule":"rule:admin_only or role:reader and
-# project_id:%(project_id)s".
+# "get_policy_dscp_marking_rule":"(rule:admin_only) or (role:reader
+# and project_id:%(project_id)s)".
# The QoS API now supports project scope and default roles.
# Create a QoS DSCP marking rule
@@ -1727,13 +1722,13 @@
# GET /qos/policies/{policy_id}/minimum_bandwidth_rules
# GET /qos/policies/{policy_id}/minimum_bandwidth_rules/{rule_id}
# Intended scope(s): project
-#"get_policy_minimum_bandwidth_rule": "rule:admin_only or role:reader and project_id:%(project_id)s"
+#"get_policy_minimum_bandwidth_rule": "(rule:admin_only) or (role:reader and project_id:%(project_id)s)"
# DEPRECATED
# "get_policy_minimum_bandwidth_rule":"rule:regular_user" has been
# deprecated since W in favor of
-# "get_policy_minimum_bandwidth_rule":"rule:admin_only or role:reader
-# and project_id:%(project_id)s".
+# "get_policy_minimum_bandwidth_rule":"(rule:admin_only) or
+# (role:reader and project_id:%(project_id)s)".
# The QoS API now supports project scope and default roles.
# Create a QoS minimum bandwidth rule
@@ -1773,7 +1768,7 @@
# GET /qos/policies/{policy_id}/minimum_packet_rate_rules
# GET /qos/policies/{policy_id}/minimum_packet_rate_rules/{rule_id}
# Intended scope(s): project
-#"get_policy_minimum_packet_rate_rule": "rule:admin_only or role:reader and project_id:%(project_id)s"
+#"get_policy_minimum_packet_rate_rule": "(rule:admin_only) or (role:reader and project_id:%(project_id)s)"
# Create a QoS minimum packet rate rule
# POST /qos/policies/{policy_id}/minimum_packet_rate_rules
@@ -1793,13 +1788,13 @@
# Get a QoS bandwidth limit rule through alias
# GET /qos/alias_bandwidth_limit_rules/{rule_id}/
# Intended scope(s): project
-#"get_alias_bandwidth_limit_rule": "rule:admin_only or role:reader and project_id:%(project_id)s"
+#"get_alias_bandwidth_limit_rule": "(rule:admin_only) or (role:reader and project_id:%(project_id)s)"
# DEPRECATED
# "get_alias_bandwidth_limit_rule":"rule:regular_user" has been
# deprecated since W in favor of
-# "get_alias_bandwidth_limit_rule":"rule:admin_only or role:reader and
-# project_id:%(project_id)s".
+# "get_alias_bandwidth_limit_rule":"(rule:admin_only) or (role:reader
+# and project_id:%(project_id)s)".
# The QoS API now supports project scope and default roles.
# Update a QoS bandwidth limit rule through alias
@@ -1827,13 +1822,13 @@
# Get a QoS DSCP marking rule through alias
# GET /qos/alias_dscp_marking_rules/{rule_id}/
# Intended scope(s): project
-#"get_alias_dscp_marking_rule": "rule:admin_only or role:reader and project_id:%(project_id)s"
+#"get_alias_dscp_marking_rule": "(rule:admin_only) or (role:reader and project_id:%(project_id)s)"
# DEPRECATED
# "get_alias_dscp_marking_rule":"rule:regular_user" has been
# deprecated since W in favor of
-# "get_alias_dscp_marking_rule":"rule:admin_only or role:reader and
-# project_id:%(project_id)s".
+# "get_alias_dscp_marking_rule":"(rule:admin_only) or (role:reader and
+# project_id:%(project_id)s)".
# The QoS API now supports project scope and default roles.
# Update a QoS DSCP marking rule through alias
@@ -1861,13 +1856,13 @@
# Get a QoS minimum bandwidth rule through alias
# GET /qos/alias_minimum_bandwidth_rules/{rule_id}/
# Intended scope(s): project
-#"get_alias_minimum_bandwidth_rule": "rule:admin_only or role:reader and project_id:%(project_id)s"
+#"get_alias_minimum_bandwidth_rule": "(rule:admin_only) or (role:reader and project_id:%(project_id)s)"
# DEPRECATED
# "get_alias_minimum_bandwidth_rule":"rule:regular_user" has been
# deprecated since W in favor of
-# "get_alias_minimum_bandwidth_rule":"rule:admin_only or role:reader
-# and project_id:%(project_id)s".
+# "get_alias_minimum_bandwidth_rule":"(rule:admin_only) or
+# (role:reader and project_id:%(project_id)s)".
# The QoS API now supports project scope and default roles.
# Update a QoS minimum bandwidth rule through alias
@@ -1944,12 +1939,12 @@
# Create an RBAC policy
# POST /rbac-policies
# Intended scope(s): project
-#"create_rbac_policy": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"create_rbac_policy": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "create_rbac_policy":"rule:regular_user" has been deprecated since W
-# in favor of "create_rbac_policy":"rule:admin_only or role:member and
-# project_id:%(project_id)s".
+# in favor of "create_rbac_policy":"(rule:admin_only) or (role:member
+# and project_id:%(project_id)s)".
# The RBAC API now supports system scope and default roles.
# Specify ``target_tenant`` when creating an RBAC policy
@@ -1968,12 +1963,12 @@
# Update an RBAC policy
# PUT /rbac-policies/{id}
# Intended scope(s): project
-#"update_rbac_policy": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"update_rbac_policy": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "update_rbac_policy":"rule:admin_or_owner" has been deprecated since
-# W in favor of "update_rbac_policy":"rule:admin_only or role:member
-# and project_id:%(project_id)s".
+# W in favor of "update_rbac_policy":"(rule:admin_only) or
+# (role:member and project_id:%(project_id)s)".
# The RBAC API now supports system scope and default roles.
# Update ``target_tenant`` attribute of an RBAC policy
@@ -1993,34 +1988,34 @@
# GET /rbac-policies
# GET /rbac-policies/{id}
# Intended scope(s): project
-#"get_rbac_policy": "rule:admin_only or role:reader and project_id:%(project_id)s"
+#"get_rbac_policy": "(rule:admin_only) or (role:reader and project_id:%(project_id)s)"
# DEPRECATED
# "get_rbac_policy":"rule:admin_or_owner" has been deprecated since W
-# in favor of "get_rbac_policy":"rule:admin_only or role:reader and
-# project_id:%(project_id)s".
+# in favor of "get_rbac_policy":"(rule:admin_only) or (role:reader and
+# project_id:%(project_id)s)".
# The RBAC API now supports system scope and default roles.
# Delete an RBAC policy
# DELETE /rbac-policies/{id}
# Intended scope(s): project
-#"delete_rbac_policy": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"delete_rbac_policy": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "delete_rbac_policy":"rule:admin_or_owner" has been deprecated since
-# W in favor of "delete_rbac_policy":"rule:admin_only or role:member
-# and project_id:%(project_id)s".
+# W in favor of "delete_rbac_policy":"(rule:admin_only) or
+# (role:member and project_id:%(project_id)s)".
# The RBAC API now supports system scope and default roles.
# Create a router
# POST /routers
# Intended scope(s): project
-#"create_router": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"create_router": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "create_router":"rule:regular_user" has been deprecated since W in
-# favor of "create_router":"rule:admin_only or role:member and
-# project_id:%(project_id)s".
+# favor of "create_router":"(rule:admin_only) or (role:member and
+# project_id:%(project_id)s)".
# The router API now supports system scope and default roles.
# Specify ``distributed`` attribute when creating a router
@@ -2046,26 +2041,26 @@
# Specify ``external_gateway_info`` information when creating a router
# POST /routers
# Intended scope(s): project
-#"create_router:external_gateway_info": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"create_router:external_gateway_info": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "create_router:external_gateway_info":"rule:admin_or_owner" has been
# deprecated since W in favor of
-# "create_router:external_gateway_info":"rule:admin_only or
-# role:member and project_id:%(project_id)s".
+# "create_router:external_gateway_info":"(rule:admin_only) or
+# (role:member and project_id:%(project_id)s)".
# The router API now supports system scope and default roles.
# Specify ``network_id`` in ``external_gateway_info`` information when
# creating a router
# POST /routers
# Intended scope(s): project
-#"create_router:external_gateway_info:network_id": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"create_router:external_gateway_info:network_id": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "create_router:external_gateway_info:network_id":"rule:admin_or_owne
# r" has been deprecated since W in favor of
-# "create_router:external_gateway_info:network_id":"rule:admin_only or
-# role:member and project_id:%(project_id)s".
+# "create_router:external_gateway_info:network_id":"(rule:admin_only)
+# or (role:member and project_id:%(project_id)s)".
# The router API now supports system scope and default roles.
# Specify ``enable_snat`` in ``external_gateway_info`` information
@@ -2096,12 +2091,12 @@
# GET /routers
# GET /routers/{id}
# Intended scope(s): project
-#"get_router": "rule:admin_only or role:reader and project_id:%(project_id)s"
+#"get_router": "(rule:admin_only) or (role:reader and project_id:%(project_id)s)"
# DEPRECATED
# "get_router":"rule:admin_or_owner" has been deprecated since W in
-# favor of "get_router":"rule:admin_only or role:reader and
-# project_id:%(project_id)s".
+# favor of "get_router":"(rule:admin_only) or (role:reader and
+# project_id:%(project_id)s)".
# The router API now supports system scope and default roles.
# Get ``distributed`` attribute of a router
@@ -2129,12 +2124,12 @@
# Update a router
# PUT /routers/{id}
# Intended scope(s): project
-#"update_router": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"update_router": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "update_router":"rule:admin_or_owner" has been deprecated since W in
-# favor of "update_router":"rule:admin_only or role:member and
-# project_id:%(project_id)s".
+# favor of "update_router":"(rule:admin_only) or (role:member and
+# project_id:%(project_id)s)".
# The router API now supports system scope and default roles.
# Update ``distributed`` attribute of a router
@@ -2160,26 +2155,26 @@
# Update ``external_gateway_info`` information of a router
# PUT /routers/{id}
# Intended scope(s): project
-#"update_router:external_gateway_info": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"update_router:external_gateway_info": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "update_router:external_gateway_info":"rule:admin_or_owner" has been
# deprecated since W in favor of
-# "update_router:external_gateway_info":"rule:admin_only or
-# role:member and project_id:%(project_id)s".
+# "update_router:external_gateway_info":"(rule:admin_only) or
+# (role:member and project_id:%(project_id)s)".
# The router API now supports system scope and default roles.
# Update ``network_id`` attribute of ``external_gateway_info``
# information of a router
# PUT /routers/{id}
# Intended scope(s): project
-#"update_router:external_gateway_info:network_id": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"update_router:external_gateway_info:network_id": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "update_router:external_gateway_info:network_id":"rule:admin_or_owne
# r" has been deprecated since W in favor of
-# "update_router:external_gateway_info:network_id":"rule:admin_only or
-# role:member and project_id:%(project_id)s".
+# "update_router:external_gateway_info:network_id":"(rule:admin_only)
+# or (role:member and project_id:%(project_id)s)".
# The router API now supports system scope and default roles.
# Update ``enable_snat`` attribute of ``external_gateway_info``
@@ -2209,56 +2204,56 @@
# Delete a router
# DELETE /routers/{id}
# Intended scope(s): project
-#"delete_router": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"delete_router": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "delete_router":"rule:admin_or_owner" has been deprecated since W in
-# favor of "delete_router":"rule:admin_only or role:member and
-# project_id:%(project_id)s".
+# favor of "delete_router":"(rule:admin_only) or (role:member and
+# project_id:%(project_id)s)".
# The router API now supports system scope and default roles.
# Add an interface to a router
# PUT /routers/{id}/add_router_interface
# Intended scope(s): project
-#"add_router_interface": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"add_router_interface": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "add_router_interface":"rule:admin_or_owner" has been deprecated
-# since W in favor of "add_router_interface":"rule:admin_only or
-# role:member and project_id:%(project_id)s".
+# since W in favor of "add_router_interface":"(rule:admin_only) or
+# (role:member and project_id:%(project_id)s)".
# The router API now supports system scope and default roles.
# Remove an interface from a router
# PUT /routers/{id}/remove_router_interface
# Intended scope(s): project
-#"remove_router_interface": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"remove_router_interface": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "remove_router_interface":"rule:admin_or_owner" has been deprecated
-# since W in favor of "remove_router_interface":"rule:admin_only or
-# role:member and project_id:%(project_id)s".
+# since W in favor of "remove_router_interface":"(rule:admin_only) or
+# (role:member and project_id:%(project_id)s)".
# The router API now supports system scope and default roles.
# Add extra route to a router
# PUT /routers/{id}/add_extraroutes
# Intended scope(s): project
-#"add_extraroutes": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"add_extraroutes": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "add_extraroutes":"rule:admin_or_owner" has been deprecated since
-# Xena in favor of "add_extraroutes":"rule:admin_only or role:member
-# and project_id:%(project_id)s".
+# Xena in favor of "add_extraroutes":"(rule:admin_only) or
+# (role:member and project_id:%(project_id)s)".
# The router API now supports system scope and default roles.
# Remove extra route from a router
# PUT /routers/{id}/remove_extraroutes
# Intended scope(s): project
-#"remove_extraroutes": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"remove_extraroutes": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "remove_extraroutes":"rule:admin_or_owner" has been deprecated since
-# Xena in favor of "remove_extraroutes":"rule:admin_only or
-# role:member and project_id:%(project_id)s".
+# Xena in favor of "remove_extraroutes":"(rule:admin_only) or
+# (role:member and project_id:%(project_id)s)".
# The router API now supports system scope and default roles.
# Rule for admin or security group owner access
@@ -2267,86 +2262,89 @@
# Rule for resource owner, admin or security group owner access
#"admin_owner_or_sg_owner": "rule:owner or rule:admin_or_sg_owner"
+# Definition of a shared security group
+#"shared_security_group": "field:security_groups:shared=True"
+
# Create a security group
# POST /security-groups
# Intended scope(s): project
-#"create_security_group": "role:member and project_id:%(project_id)s"
+#"create_security_group": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "create_security_group":"rule:admin_or_owner" has been deprecated
-# since W in favor of "create_security_group":"role:member and
-# project_id:%(project_id)s".
+# since W in favor of "create_security_group":"(rule:admin_only) or
+# (role:member and project_id:%(project_id)s)".
# The security group API now supports system scope and default roles.
# Get a security group
# GET /security-groups
# GET /security-groups/{id}
# Intended scope(s): project
-#"get_security_group": "role:reader and project_id:%(project_id)s"
+#"get_security_group": "(rule:admin_only) or (role:reader and project_id:%(project_id)s) or rule:shared_security_group"
# DEPRECATED
# "get_security_group":"rule:regular_user" has been deprecated since W
-# in favor of "get_security_group":"role:reader and
-# project_id:%(project_id)s".
+# in favor of "get_security_group":"(rule:admin_only) or (role:reader
+# and project_id:%(project_id)s) or rule:shared_security_group".
# The security group API now supports system scope and default roles.
# Update a security group
# PUT /security-groups/{id}
# Intended scope(s): project
-#"update_security_group": "role:member and project_id:%(project_id)s"
+#"update_security_group": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "update_security_group":"rule:admin_or_owner" has been deprecated
-# since W in favor of "update_security_group":"role:member and
-# project_id:%(project_id)s".
+# since W in favor of "update_security_group":"(rule:admin_only) or
+# (role:member and project_id:%(project_id)s)".
# The security group API now supports system scope and default roles.
# Delete a security group
# DELETE /security-groups/{id}
# Intended scope(s): project
-#"delete_security_group": "role:member and project_id:%(project_id)s"
+#"delete_security_group": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "delete_security_group":"rule:admin_or_owner" has been deprecated
-# since W in favor of "delete_security_group":"role:member and
-# project_id:%(project_id)s".
+# since W in favor of "delete_security_group":"(rule:admin_only) or
+# (role:member and project_id:%(project_id)s)".
# The security group API now supports system scope and default roles.
# Create a security group rule
# POST /security-group-rules
# Intended scope(s): project
-#"create_security_group_rule": "role:member and project_id:%(project_id)s"
+#"create_security_group_rule": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "create_security_group_rule":"rule:admin_or_owner" has been
# deprecated since W in favor of
-# "create_security_group_rule":"role:member and
-# project_id:%(project_id)s".
+# "create_security_group_rule":"(rule:admin_only) or (role:member and
+# project_id:%(project_id)s)".
# The security group API now supports system scope and default roles.
# Get a security group rule
# GET /security-group-rules
# GET /security-group-rules/{id}
# Intended scope(s): project
-#"get_security_group_rule": "role:reader and project_id:%(project_id)s or rule:sg_owner"
+#"get_security_group_rule": "(rule:admin_only) or (role:reader and project_id:%(project_id)s) or rule:sg_owner"
# DEPRECATED
# "get_security_group_rule":"rule:admin_owner_or_sg_owner" has been
# deprecated since W in favor of
-# "get_security_group_rule":"role:reader and project_id:%(project_id)s
-# or rule:sg_owner".
+# "get_security_group_rule":"(rule:admin_only) or (role:reader and
+# project_id:%(project_id)s) or rule:sg_owner".
# The security group API now supports system scope and default roles.
# Delete a security group rule
# DELETE /security-group-rules/{id}
# Intended scope(s): project
-#"delete_security_group_rule": "role:member and project_id:%(project_id)s"
+#"delete_security_group_rule": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "delete_security_group_rule":"rule:admin_or_owner" has been
# deprecated since W in favor of
-# "delete_security_group_rule":"role:member and
-# project_id:%(project_id)s".
+# "delete_security_group_rule":"(rule:admin_only) or (role:member and
+# project_id:%(project_id)s)".
# The security group API now supports system scope and default roles.
# Create a segment
@@ -2404,12 +2402,12 @@
# Create a subnet
# POST /subnets
# Intended scope(s): project
-#"create_subnet": "rule:admin_only or role:member and project_id:%(project_id)s or rule:network_owner"
+#"create_subnet": "(rule:admin_only) or (role:member and project_id:%(project_id)s) or rule:network_owner"
# DEPRECATED
# "create_subnet":"rule:admin_or_network_owner" has been deprecated
-# since W in favor of "create_subnet":"rule:admin_only or role:member
-# and project_id:%(project_id)s or rule:network_owner".
+# since W in favor of "create_subnet":"(rule:admin_only) or
+# (role:member and project_id:%(project_id)s) or rule:network_owner".
# The subnet API now supports system scope and default roles.
# Specify ``segment_id`` attribute when creating a subnet
@@ -2436,12 +2434,12 @@
# GET /subnets
# GET /subnets/{id}
# Intended scope(s): project
-#"get_subnet": "rule:admin_only or role:reader and project_id:%(project_id)s or rule:shared"
+#"get_subnet": "(rule:admin_only) or (role:reader and project_id:%(project_id)s) or rule:shared"
# DEPRECATED
# "get_subnet":"rule:admin_or_owner or rule:shared" has been
-# deprecated since W in favor of "get_subnet":"rule:admin_only or
-# role:reader and project_id:%(project_id)s or rule:shared".
+# deprecated since W in favor of "get_subnet":"(rule:admin_only) or
+# (role:reader and project_id:%(project_id)s) or rule:shared".
# The subnet API now supports system scope and default roles.
# Get ``segment_id`` attribute of a subnet
@@ -2458,12 +2456,12 @@
# Update a subnet
# PUT /subnets/{id}
# Intended scope(s): project
-#"update_subnet": "rule:admin_only or role:member and project_id:%(project_id)s or rule:network_owner"
+#"update_subnet": "(rule:admin_only) or (role:member and project_id:%(project_id)s) or rule:network_owner"
# DEPRECATED
# "update_subnet":"rule:admin_or_network_owner" has been deprecated
-# since W in favor of "update_subnet":"rule:admin_only or role:member
-# and project_id:%(project_id)s or rule:network_owner".
+# since W in favor of "update_subnet":"(rule:admin_only) or
+# (role:member and project_id:%(project_id)s) or rule:network_owner".
# The subnet API now supports system scope and default roles.
# Update ``segment_id`` attribute of a subnet
@@ -2489,12 +2487,12 @@
# Delete a subnet
# DELETE /subnets/{id}
# Intended scope(s): project
-#"delete_subnet": "rule:admin_only or role:member and project_id:%(project_id)s or rule:network_owner"
+#"delete_subnet": "(rule:admin_only) or (role:member and project_id:%(project_id)s) or rule:network_owner"
# DEPRECATED
# "delete_subnet":"rule:admin_or_network_owner" has been deprecated
-# since W in favor of "delete_subnet":"rule:admin_only or role:member
-# and project_id:%(project_id)s or rule:network_owner".
+# since W in favor of "delete_subnet":"(rule:admin_only) or
+# (role:member and project_id:%(project_id)s) or rule:network_owner".
# The subnet API now supports system scope and default roles.
# Definition of a shared subnetpool
@@ -2503,12 +2501,12 @@
# Create a subnetpool
# POST /subnetpools
# Intended scope(s): project
-#"create_subnetpool": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"create_subnetpool": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "create_subnetpool":"rule:regular_user" has been deprecated since W
-# in favor of "create_subnetpool":"rule:admin_only or role:member and
-# project_id:%(project_id)s".
+# in favor of "create_subnetpool":"(rule:admin_only) or (role:member
+# and project_id:%(project_id)s)".
# The subnet pool API now supports system scope and default roles.
# Create a shared subnetpool
@@ -2536,24 +2534,24 @@
# GET /subnetpools
# GET /subnetpools/{id}
# Intended scope(s): project
-#"get_subnetpool": "rule:admin_only or role:reader and project_id:%(project_id)s or rule:shared_subnetpools"
+#"get_subnetpool": "(rule:admin_only) or (role:reader and project_id:%(project_id)s) or rule:shared_subnetpools"
# DEPRECATED
# "get_subnetpool":"rule:admin_or_owner or rule:shared_subnetpools"
# has been deprecated since W in favor of
-# "get_subnetpool":"rule:admin_only or role:reader and
-# project_id:%(project_id)s or rule:shared_subnetpools".
+# "get_subnetpool":"(rule:admin_only) or (role:reader and
+# project_id:%(project_id)s) or rule:shared_subnetpools".
# The subnet pool API now supports system scope and default roles.
# Update a subnetpool
# PUT /subnetpools/{id}
# Intended scope(s): project
-#"update_subnetpool": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"update_subnetpool": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "update_subnetpool":"rule:admin_or_owner" has been deprecated since
-# W in favor of "update_subnetpool":"rule:admin_only or role:member
-# and project_id:%(project_id)s".
+# W in favor of "update_subnetpool":"(rule:admin_only) or (role:member
+# and project_id:%(project_id)s)".
# The subnet pool API now supports system scope and default roles.
# Update ``is_default`` attribute of a subnetpool
@@ -2570,116 +2568,122 @@
# Delete a subnetpool
# DELETE /subnetpools/{id}
# Intended scope(s): project
-#"delete_subnetpool": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"delete_subnetpool": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "delete_subnetpool":"rule:admin_or_owner" has been deprecated since
-# W in favor of "delete_subnetpool":"rule:admin_only or role:member
-# and project_id:%(project_id)s".
+# W in favor of "delete_subnetpool":"(rule:admin_only) or (role:member
+# and project_id:%(project_id)s)".
# The subnet pool API now supports system scope and default roles.
# Onboard existing subnet into a subnetpool
# PUT /subnetpools/{id}/onboard_network_subnets
# Intended scope(s): project
-#"onboard_network_subnets": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"onboard_network_subnets": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "onboard_network_subnets":"rule:admin_or_owner" has been deprecated
-# since W in favor of "onboard_network_subnets":"rule:admin_only or
-# role:member and project_id:%(project_id)s".
+# since W in favor of "onboard_network_subnets":"(rule:admin_only) or
+# (role:member and project_id:%(project_id)s)".
# The subnet pool API now supports system scope and default roles.
# Add prefixes to a subnetpool
# PUT /subnetpools/{id}/add_prefixes
# Intended scope(s): project
-#"add_prefixes": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"add_prefixes": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "add_prefixes":"rule:admin_or_owner" has been deprecated since W in
-# favor of "add_prefixes":"rule:admin_only or role:member and
-# project_id:%(project_id)s".
+# favor of "add_prefixes":"(rule:admin_only) or (role:member and
+# project_id:%(project_id)s)".
# The subnet pool API now supports system scope and default roles.
# Remove unallocated prefixes from a subnetpool
# PUT /subnetpools/{id}/remove_prefixes
# Intended scope(s): project
-#"remove_prefixes": "rule:admin_only or role:member and project_id:%(project_id)s"
+#"remove_prefixes": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "remove_prefixes":"rule:admin_or_owner" has been deprecated since W
-# in favor of "remove_prefixes":"rule:admin_only or role:member and
-# project_id:%(project_id)s".
+# in favor of "remove_prefixes":"(rule:admin_only) or (role:member and
+# project_id:%(project_id)s)".
# The subnet pool API now supports system scope and default roles.
# Create a trunk
# POST /trunks
# Intended scope(s): project
-#"create_trunk": "role:member and project_id:%(project_id)s"
+#"create_trunk": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "create_trunk":"rule:regular_user" has been deprecated since W in
-# favor of "create_trunk":"role:member and project_id:%(project_id)s".
+# favor of "create_trunk":"(rule:admin_only) or (role:member and
+# project_id:%(project_id)s)".
# The trunks API now supports system scope and default roles.
# Get a trunk
# GET /trunks
# GET /trunks/{id}
# Intended scope(s): project
-#"get_trunk": "role:reader and project_id:%(project_id)s"
+#"get_trunk": "(rule:admin_only) or (role:reader and project_id:%(project_id)s)"
# DEPRECATED
# "get_trunk":"rule:admin_or_owner" has been deprecated since W in
-# favor of "get_trunk":"role:reader and project_id:%(project_id)s".
+# favor of "get_trunk":"(rule:admin_only) or (role:reader and
+# project_id:%(project_id)s)".
# The trunks API now supports system scope and default roles.
# Update a trunk
# PUT /trunks/{id}
# Intended scope(s): project
-#"update_trunk": "role:member and project_id:%(project_id)s"
+#"update_trunk": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "update_trunk":"rule:admin_or_owner" has been deprecated since W in
-# favor of "update_trunk":"role:member and project_id:%(project_id)s".
+# favor of "update_trunk":"(rule:admin_only) or (role:member and
+# project_id:%(project_id)s)".
# The trunks API now supports system scope and default roles.
# Delete a trunk
# DELETE /trunks/{id}
# Intended scope(s): project
-#"delete_trunk": "role:member and project_id:%(project_id)s"
+#"delete_trunk": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "delete_trunk":"rule:admin_or_owner" has been deprecated since W in
-# favor of "delete_trunk":"role:member and project_id:%(project_id)s".
+# favor of "delete_trunk":"(rule:admin_only) or (role:member and
+# project_id:%(project_id)s)".
# The trunks API now supports system scope and default roles.
# List subports attached to a trunk
# GET /trunks/{id}/get_subports
# Intended scope(s): project
-#"get_subports": "role:reader and project_id:%(project_id)s"
+#"get_subports": "(rule:admin_only) or (role:reader and project_id:%(project_id)s)"
# DEPRECATED
# "get_subports":"rule:regular_user" has been deprecated since W in
-# favor of "get_subports":"role:reader and project_id:%(project_id)s".
+# favor of "get_subports":"(rule:admin_only) or (role:reader and
+# project_id:%(project_id)s)".
# The trunks API now supports system scope and default roles.
# Add subports to a trunk
# PUT /trunks/{id}/add_subports
# Intended scope(s): project
-#"add_subports": "role:member and project_id:%(project_id)s"
+#"add_subports": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "add_subports":"rule:admin_or_owner" has been deprecated since W in
-# favor of "add_subports":"role:member and project_id:%(project_id)s".
+# favor of "add_subports":"(rule:admin_only) or (role:member and
+# project_id:%(project_id)s)".
# The trunks API now supports system scope and default roles.
# Delete subports from a trunk
# PUT /trunks/{id}/remove_subports
# Intended scope(s): project
-#"remove_subports": "role:member and project_id:%(project_id)s"
+#"remove_subports": "(rule:admin_only) or (role:member and project_id:%(project_id)s)"
# DEPRECATED
# "remove_subports":"rule:admin_or_owner" has been deprecated since W
-# in favor of "remove_subports":"role:member and
-# project_id:%(project_id)s".
+# in favor of "remove_subports":"(rule:admin_only) or (role:member and
+# project_id:%(project_id)s)".
# The trunks API now supports system scope and default roles.
diff --git a/openstack_dashboard/conf/nova_policy.yaml b/openstack_dashboard/conf/nova_policy.yaml
index 824854b54..46868868f 100644
--- a/openstack_dashboard/conf/nova_policy.yaml
+++ b/openstack_dashboard/conf/nova_policy.yaml
@@ -2119,12 +2119,12 @@
# This API is proxy calls to the Network service. This is deprecated.
# GET /os-tenant-networks
# Intended scope(s): project
-#"os_compute_api:os-tenant-networks:list": "rule:project_reader_api"
+#"os_compute_api:os-tenant-networks:list": "rule:project_reader_or_admin"
# DEPRECATED
# "os_compute_api:os-tenant-networks":"rule:admin_or_owner" has been
# deprecated since 22.0.0 in favor of "os_compute_api:os-tenant-
-# networks:list":"rule:project_reader_api".
+# networks:list":"rule:project_reader_or_admin".
# Nova API policies are introducing new default roles with scope_type
# capabilities. Old policies are deprecated and silently going to be
# ignored in nova 23.0.0 release.
@@ -2144,12 +2144,12 @@
# This API is proxy calls to the Network service. This is deprecated.
# GET /os-tenant-networks/{network_id}
# Intended scope(s): project
-#"os_compute_api:os-tenant-networks:show": "rule:project_reader_api"
+#"os_compute_api:os-tenant-networks:show": "rule:project_reader_or_admin"
# DEPRECATED
# "os_compute_api:os-tenant-networks":"rule:admin_or_owner" has been
# deprecated since 22.0.0 in favor of "os_compute_api:os-tenant-
-# networks:show":"rule:project_reader_api".
+# networks:show":"rule:project_reader_or_admin".
# Nova API policies are introducing new default roles with scope_type
# capabilities. Old policies are deprecated and silently going to be
# ignored in nova 23.0.0 release.
diff --git a/openstack_dashboard/locale/as/LC_MESSAGES/django.po b/openstack_dashboard/locale/as/LC_MESSAGES/django.po
index 2ff82a74e..fc5bfb8b8 100644
--- a/openstack_dashboard/locale/as/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/as/LC_MESSAGES/django.po
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -2260,6 +2260,9 @@ msgstr "প্ৰক্ষেপবোৰ:"
msgid "Protected"
msgstr "সুৰক্ষিত"
+msgid "Protocol"
+msgstr "প্ৰটকল"
+
msgid "Provider"
msgstr "আগবঢ়াওতা"
diff --git a/openstack_dashboard/locale/bn_IN/LC_MESSAGES/django.po b/openstack_dashboard/locale/bn_IN/LC_MESSAGES/django.po
index e40e1fbd6..30c25808f 100644
--- a/openstack_dashboard/locale/bn_IN/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/bn_IN/LC_MESSAGES/django.po
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -2155,6 +2155,9 @@ msgstr "প্রোজেক্ট:"
msgid "Protected"
msgstr "সুরক্ষিত"
+msgid "Protocol"
+msgstr "প্রোটোকল"
+
msgid "Provider"
msgstr "সরবরাহকারী"
diff --git a/openstack_dashboard/locale/brx/LC_MESSAGES/django.po b/openstack_dashboard/locale/brx/LC_MESSAGES/django.po
index 5a01c886a..25da40518 100644
--- a/openstack_dashboard/locale/brx/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/brx/LC_MESSAGES/django.po
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -2253,6 +2253,9 @@ msgstr "प्रजेक्ट:"
msgid "Protected"
msgstr "रैखाथि खालामबाय"
+msgid "Protocol"
+msgstr "प्र'ट'कल"
+
msgid "Provider"
msgstr "होग्रा"
diff --git a/openstack_dashboard/locale/cs/LC_MESSAGES/django.po b/openstack_dashboard/locale/cs/LC_MESSAGES/django.po
index 2f825ad23..d4c230625 100644
--- a/openstack_dashboard/locale/cs/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/cs/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-06-21 10:46+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -3891,6 +3891,9 @@ msgstr "Vlastnosti cíle:"
msgid "Protected"
msgstr "Chráněno"
+msgid "Protocol"
+msgstr "Protokol"
+
msgid "Protocol ID"
msgstr "ID protokolu"
diff --git a/openstack_dashboard/locale/de/LC_MESSAGES/django.po b/openstack_dashboard/locale/de/LC_MESSAGES/django.po
index 44d08e212..02a619fca 100644
--- a/openstack_dashboard/locale/de/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/de/LC_MESSAGES/django.po
@@ -19,7 +19,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-11-04 11:42+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -4963,6 +4963,9 @@ msgstr "Eigenschaftsziel: "
msgid "Protected"
msgstr "Geschützt"
+msgid "Protocol"
+msgstr "Protokoll"
+
msgid "Protocol ID"
msgstr "Protokoll-ID"
diff --git a/openstack_dashboard/locale/en_AU/LC_MESSAGES/django.po b/openstack_dashboard/locale/en_AU/LC_MESSAGES/django.po
index 612dcdb84..168e4ffa6 100644
--- a/openstack_dashboard/locale/en_AU/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/en_AU/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-06-21 10:46+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -4062,6 +4062,9 @@ msgstr "Properties Target: "
msgid "Protected"
msgstr "Protected"
+msgid "Protocol"
+msgstr "Protocol"
+
msgid "Protocol ID"
msgstr "Protocol ID"
diff --git a/openstack_dashboard/locale/en_GB/LC_MESSAGES/django.po b/openstack_dashboard/locale/en_GB/LC_MESSAGES/django.po
index 740213dd4..d0d064f34 100644
--- a/openstack_dashboard/locale/en_GB/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/en_GB/LC_MESSAGES/django.po
@@ -14,7 +14,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2023-01-25 15:43+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -4955,6 +4955,9 @@ msgstr "Properties Target: "
msgid "Protected"
msgstr "Protected"
+msgid "Protocol"
+msgstr "Protocol"
+
msgid "Protocol ID"
msgstr "Protocol ID"
diff --git a/openstack_dashboard/locale/es/LC_MESSAGES/django.po b/openstack_dashboard/locale/es/LC_MESSAGES/django.po
index 0dde555aa..685174f88 100644
--- a/openstack_dashboard/locale/es/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/es/LC_MESSAGES/django.po
@@ -15,7 +15,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-11-04 11:42+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -5014,6 +5014,9 @@ msgstr "Propiedades del Objetivo:"
msgid "Protected"
msgstr "Protegida"
+msgid "Protocol"
+msgstr "Protocolo"
+
msgid "Protocol ID"
msgstr "ID de protocolo"
diff --git a/openstack_dashboard/locale/fr/LC_MESSAGES/django.po b/openstack_dashboard/locale/fr/LC_MESSAGES/django.po
index 8dba330e3..140e907b5 100644
--- a/openstack_dashboard/locale/fr/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/fr/LC_MESSAGES/django.po
@@ -27,7 +27,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2023-01-13 13:15+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -4773,6 +4773,9 @@ msgstr "Propriétes cible:"
msgid "Protected"
msgstr "Protégée"
+msgid "Protocol"
+msgstr "Protocole"
+
msgid "Protocol ID"
msgstr "ID du protocole"
diff --git a/openstack_dashboard/locale/gu/LC_MESSAGES/django.po b/openstack_dashboard/locale/gu/LC_MESSAGES/django.po
index be115175d..115626aeb 100644
--- a/openstack_dashboard/locale/gu/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/gu/LC_MESSAGES/django.po
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -2247,6 +2247,9 @@ msgstr "પ્રોજેક્ટો:"
msgid "Protected"
msgstr "સંરક્ષિત"
+msgid "Protocol"
+msgstr "પ્રોટોકોલ"
+
msgid "Provider"
msgstr "પૂરુ પાડનાર"
diff --git a/openstack_dashboard/locale/hi/LC_MESSAGES/django.po b/openstack_dashboard/locale/hi/LC_MESSAGES/django.po
index a405e9e5b..62439d1b1 100644
--- a/openstack_dashboard/locale/hi/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/hi/LC_MESSAGES/django.po
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -2164,6 +2164,9 @@ msgstr "परियोजनाएँ:"
msgid "Protected"
msgstr "सुरक्षित"
+msgid "Protocol"
+msgstr "प्रोटोकाल"
+
msgid "Provider"
msgstr "प्रदाता"
diff --git a/openstack_dashboard/locale/id/LC_MESSAGES/django.po b/openstack_dashboard/locale/id/LC_MESSAGES/django.po
index 39fd03f21..521705dd2 100644
--- a/openstack_dashboard/locale/id/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/id/LC_MESSAGES/django.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-11-04 11:42+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -4839,6 +4839,9 @@ msgstr "Properties Target: "
msgid "Protected"
msgstr "Dilindungi"
+msgid "Protocol"
+msgstr "Protocol (protokol)"
+
msgid "Protocol ID"
msgstr "Protocol ID"
diff --git a/openstack_dashboard/locale/it/LC_MESSAGES/django.po b/openstack_dashboard/locale/it/LC_MESSAGES/django.po
index a137fd522..0811ab814 100644
--- a/openstack_dashboard/locale/it/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/it/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -3581,6 +3581,9 @@ msgstr "Destinazione proprietà:"
msgid "Protected"
msgstr "Protetto"
+msgid "Protocol"
+msgstr "Protocollo"
+
msgid "Protocol ID"
msgstr "ID protocollo"
diff --git a/openstack_dashboard/locale/ja/LC_MESSAGES/django.po b/openstack_dashboard/locale/ja/LC_MESSAGES/django.po
index c39527cfc..0efa1ed00 100644
--- a/openstack_dashboard/locale/ja/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/ja/LC_MESSAGES/django.po
@@ -16,7 +16,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2023-02-04 14:47+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -4906,6 +4906,9 @@ msgstr "属性ターゲット: "
msgid "Protected"
msgstr "保護"
+msgid "Protocol"
+msgstr "プロトコル"
+
msgid "Protocol ID"
msgstr "プロトコル ID"
diff --git a/openstack_dashboard/locale/kn/LC_MESSAGES/django.po b/openstack_dashboard/locale/kn/LC_MESSAGES/django.po
index 2dd5b3c41..112bff5ae 100644
--- a/openstack_dashboard/locale/kn/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/kn/LC_MESSAGES/django.po
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -2289,6 +2289,9 @@ msgstr "ಪರಿಯೋಜನೆಗಳು:"
msgid "Protected"
msgstr "ಸಂರಕ್ಷಿತ"
+msgid "Protocol"
+msgstr "ಪ್ರೊಟೊಕಾಲ್"
+
msgid "Provider"
msgstr "ಪೂರೈಕೆದಾರ"
diff --git a/openstack_dashboard/locale/ko_KR/LC_MESSAGES/django.po b/openstack_dashboard/locale/ko_KR/LC_MESSAGES/django.po
index 706a335c5..808175aef 100644
--- a/openstack_dashboard/locale/ko_KR/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/ko_KR/LC_MESSAGES/django.po
@@ -30,7 +30,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-11-04 11:42+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -4767,6 +4767,9 @@ msgstr "속성 타깃:"
msgid "Protected"
msgstr "보호됨"
+msgid "Protocol"
+msgstr "프로토콜"
+
msgid "Protocol ID"
msgstr "프로토콜 ID"
diff --git a/openstack_dashboard/locale/kok/LC_MESSAGES/django.po b/openstack_dashboard/locale/kok/LC_MESSAGES/django.po
index 819651990..c82409f4d 100644
--- a/openstack_dashboard/locale/kok/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/kok/LC_MESSAGES/django.po
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -2241,6 +2241,9 @@ msgstr "प्रकल्प:"
msgid "Protected"
msgstr "सुरक्षित"
+msgid "Protocol"
+msgstr "शिष्टाचार"
+
msgid "Provider"
msgstr "पुरोवपी"
diff --git a/openstack_dashboard/locale/ks/LC_MESSAGES/django.po b/openstack_dashboard/locale/ks/LC_MESSAGES/django.po
index 1f37a2962..8e4121060 100644
--- a/openstack_dashboard/locale/ks/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/ks/LC_MESSAGES/django.po
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -2159,6 +2159,9 @@ msgstr "پروجیکٹس:"
msgid "Protected"
msgstr "بَچآویتھ"
+msgid "Protocol"
+msgstr "پروٹوکال"
+
msgid "Provider"
msgstr "پرووایڈر"
diff --git a/openstack_dashboard/locale/mai/LC_MESSAGES/django.po b/openstack_dashboard/locale/mai/LC_MESSAGES/django.po
index 879cae6d5..aafa628f0 100644
--- a/openstack_dashboard/locale/mai/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/mai/LC_MESSAGES/django.po
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -2254,6 +2254,9 @@ msgstr "परियोजना:"
msgid "Protected"
msgstr "सुरक्षित"
+msgid "Protocol"
+msgstr "प्रोटोकाल"
+
msgid "Provider"
msgstr "प्रदाता"
diff --git a/openstack_dashboard/locale/mni/LC_MESSAGES/django.po b/openstack_dashboard/locale/mni/LC_MESSAGES/django.po
index a935f0ed5..31b9de9f2 100644
--- a/openstack_dashboard/locale/mni/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/mni/LC_MESSAGES/django.po
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -2164,6 +2164,9 @@ msgstr "প্রোজেক্তশীং:"
msgid "Protected"
msgstr "প্রোতেক্ত তৌরে"
+msgid "Protocol"
+msgstr "প্রোতোকোল"
+
msgid "Provider"
msgstr "প্রোভাইদর"
diff --git a/openstack_dashboard/locale/mr/LC_MESSAGES/django.po b/openstack_dashboard/locale/mr/LC_MESSAGES/django.po
index 9263cd619..9708b59fc 100644
--- a/openstack_dashboard/locale/mr/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/mr/LC_MESSAGES/django.po
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -2253,6 +2253,9 @@ msgstr "प्रकल्प:"
msgid "Protected"
msgstr "सुरक्षित"
+msgid "Protocol"
+msgstr "प्रोटोकॉल"
+
msgid "Provider"
msgstr "पुरवठादार"
diff --git a/openstack_dashboard/locale/ne/LC_MESSAGES/django.po b/openstack_dashboard/locale/ne/LC_MESSAGES/django.po
index 0581cdaee..9be8ee2c0 100644
--- a/openstack_dashboard/locale/ne/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/ne/LC_MESSAGES/django.po
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -2152,6 +2152,9 @@ msgstr "प्रोडेक्टहरबः"
msgid "Protected"
msgstr "संरक्षित"
+msgid "Protocol"
+msgstr "सन्धिपत्र"
+
msgid "Provider"
msgstr "प्रदाता"
diff --git a/openstack_dashboard/locale/pa_IN/LC_MESSAGES/django.po b/openstack_dashboard/locale/pa_IN/LC_MESSAGES/django.po
index 10d7ba7b7..d8e81323d 100644
--- a/openstack_dashboard/locale/pa_IN/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/pa_IN/LC_MESSAGES/django.po
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -2180,6 +2180,9 @@ msgstr "پروجیكٹ :"
msgid "Protected"
msgstr "محفوظ"
+msgid "Protocol"
+msgstr "پروٹوكول"
+
msgid "Provider"
msgstr "فراہم کنندہ"
diff --git a/openstack_dashboard/locale/pl_PL/LC_MESSAGES/django.po b/openstack_dashboard/locale/pl_PL/LC_MESSAGES/django.po
index fa5fcb75a..0f1642eab 100644
--- a/openstack_dashboard/locale/pl_PL/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/pl_PL/LC_MESSAGES/django.po
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -3347,6 +3347,9 @@ msgstr "Cel właściwości:"
msgid "Protected"
msgstr "Chroniony"
+msgid "Protocol"
+msgstr "Protokół"
+
msgid "Provider"
msgstr "Dostawca"
diff --git a/openstack_dashboard/locale/pt_BR/LC_MESSAGES/django.po b/openstack_dashboard/locale/pt_BR/LC_MESSAGES/django.po
index ac89bd3a3..adc912666 100644
--- a/openstack_dashboard/locale/pt_BR/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/pt_BR/LC_MESSAGES/django.po
@@ -17,7 +17,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-11-04 11:42+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -4591,6 +4591,9 @@ msgstr "Propriedades dos Alvos:"
msgid "Protected"
msgstr "Protegido"
+msgid "Protocol"
+msgstr "Protocolo"
+
msgid "Protocol ID"
msgstr "ID do Protocolo"
diff --git a/openstack_dashboard/locale/ru/LC_MESSAGES/django.po b/openstack_dashboard/locale/ru/LC_MESSAGES/django.po
index b46174599..e986b403b 100644
--- a/openstack_dashboard/locale/ru/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/ru/LC_MESSAGES/django.po
@@ -41,7 +41,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-11-04 11:42+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -5104,6 +5104,9 @@ msgstr "Цель свойств:"
msgid "Protected"
msgstr "Защищенный"
+msgid "Protocol"
+msgstr "Протокол"
+
msgid "Protocol ID"
msgstr "Идентификатор протокола"
diff --git a/openstack_dashboard/locale/ta/LC_MESSAGES/django.po b/openstack_dashboard/locale/ta/LC_MESSAGES/django.po
index 9a0a3696a..9a447cb55 100644
--- a/openstack_dashboard/locale/ta/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/ta/LC_MESSAGES/django.po
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -2274,6 +2274,9 @@ msgstr "பிராஜக்டுகள்:"
msgid "Protected"
msgstr "பாதுகாக்கப்பட்ட"
+msgid "Protocol"
+msgstr "வரைமுறை:"
+
msgid "Provider"
msgstr "வழங்குநர்"
diff --git a/openstack_dashboard/locale/tr_TR/LC_MESSAGES/django.po b/openstack_dashboard/locale/tr_TR/LC_MESSAGES/django.po
index 8fbf8bd80..c6c783bea 100644
--- a/openstack_dashboard/locale/tr_TR/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/tr_TR/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-06-21 10:46+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -4087,6 +4087,9 @@ msgstr "Özellikler Hedefi: "
msgid "Protected"
msgstr "Korumalı"
+msgid "Protocol"
+msgstr "İletişim Kuralı"
+
msgid "Protocol ID"
msgstr "İletişim Kuralı ID'si"
diff --git a/openstack_dashboard/locale/ur/LC_MESSAGES/django.po b/openstack_dashboard/locale/ur/LC_MESSAGES/django.po
index c451e801d..9f89f09d4 100644
--- a/openstack_dashboard/locale/ur/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/ur/LC_MESSAGES/django.po
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -2164,6 +2164,9 @@ msgstr "پروجیكٹ :"
msgid "Protected"
msgstr "محفوظ"
+msgid "Protocol"
+msgstr "پروٹوكول"
+
msgid "Provider"
msgstr "فراہم کنندہ"
diff --git a/openstack_dashboard/locale/zh_Hans/LC_MESSAGES/django.po b/openstack_dashboard/locale/zh_Hans/LC_MESSAGES/django.po
index b6ee05bef..30e3699f5 100644
--- a/openstack_dashboard/locale/zh_Hans/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/zh_Hans/LC_MESSAGES/django.po
@@ -33,7 +33,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-11-04 11:42+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -4566,6 +4566,9 @@ msgstr "属性目标:"
msgid "Protected"
msgstr "受保护的"
+msgid "Protocol"
+msgstr "协议"
+
msgid "Protocol ID"
msgstr "协议编号"
diff --git a/openstack_dashboard/locale/zh_Hant/LC_MESSAGES/django.po b/openstack_dashboard/locale/zh_Hant/LC_MESSAGES/django.po
index 444b28889..aaf7d8ec6 100644
--- a/openstack_dashboard/locale/zh_Hant/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/zh_Hant/LC_MESSAGES/django.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-11-04 11:42+0000\n"
+"POT-Creation-Date: 2023-03-07 08:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -4351,6 +4351,9 @@ msgstr "屬性目標:"
msgid "Protected"
msgstr "保護"
+msgid "Protocol"
+msgstr "協定"
+
msgid "Protocol ID"
msgstr "通訊協定 ID"
diff --git a/openstack_dashboard/static/app/core/openstack-service-api/swift.service.js b/openstack_dashboard/static/app/core/openstack-service-api/swift.service.js
index b2b170efe..daafd8ead 100644
--- a/openstack_dashboard/static/app/core/openstack-service-api/swift.service.js
+++ b/openstack_dashboard/static/app/core/openstack-service-api/swift.service.js
@@ -296,8 +296,7 @@
service.getObjectURL(container, objectName, 'metadata')
);
if (ignoreError) {
- // provide a noop error handler so the error is ignored
- return promise.catch(angular.noop);
+ return promise;
}
return promise.catch(function onError() {
toastService.add('error', gettext('Unable to get details of the object.'));
diff --git a/openstack_dashboard/static/app/core/openstack-service-api/swift.service.spec.js b/openstack_dashboard/static/app/core/openstack-service-api/swift.service.spec.js
index 40ec0002d..06a64908d 100644
--- a/openstack_dashboard/static/app/core/openstack-service-api/swift.service.spec.js
+++ b/openstack_dashboard/static/app/core/openstack-service-api/swift.service.spec.js
@@ -256,7 +256,6 @@
spyOn(promise, 'catch');
spyOn(toastService, 'add');
service.getObjectDetails('spam', 'ham', true);
- expect(promise.catch).toHaveBeenCalledWith(angular.noop);
expect(toastService.add).not.toHaveBeenCalled();
});
diff --git a/openstack_dashboard/test/integration_tests/helpers.py b/openstack_dashboard/test/integration_tests/helpers.py
index 0e2ef5fde..17f9d60e7 100644
--- a/openstack_dashboard/test/integration_tests/helpers.py
+++ b/openstack_dashboard/test/integration_tests/helpers.py
@@ -332,10 +332,8 @@ class TestCase(BaseTestCase, AssertsMixin):
self.home_pg = self.login_pg.login(self.TEST_USER_NAME,
self.TEST_PASSWORD)
self.home_pg.change_project(self.HOME_PROJECT)
- self.assertTrue(
- self.home_pg.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- self.home_pg.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ self.home_pg.find_messages_and_dismiss(), {messages.SUCCESS})
def cleanup():
if self.home_pg.is_logged_in:
diff --git a/openstack_dashboard/test/integration_tests/horizon.conf b/openstack_dashboard/test/integration_tests/horizon.conf
index 52db2a69c..531f7e55d 100644
--- a/openstack_dashboard/test/integration_tests/horizon.conf
+++ b/openstack_dashboard/test/integration_tests/horizon.conf
@@ -12,7 +12,7 @@ help_url=https://docs.openstack.org/
[selenium]
# Timeout in seconds to wait for message confirmation modal
# (float value)
-message_implicit_wait=0.1
+message_implicit_wait=3
# Timeout in seconds to wait for a page to become available
# (integer value)
diff --git a/openstack_dashboard/test/integration_tests/pages/basepage.py b/openstack_dashboard/test/integration_tests/pages/basepage.py
index b3fdaae4f..62827f598 100644
--- a/openstack_dashboard/test/integration_tests/pages/basepage.py
+++ b/openstack_dashboard/test/integration_tests/pages/basepage.py
@@ -10,6 +10,7 @@
# License for the specific language governing permissions and limitations
# under the License.
+import selenium.common.exceptions as Exceptions
from selenium.webdriver.common import by
from openstack_dashboard.test.integration_tests.pages import navigation
@@ -24,6 +25,7 @@ class BasePage(pageobject.PageObject):
_heading_locator = (by.By.CSS_SELECTOR, 'div.page-header > h2')
_help_page_brand = (by.By.CSS_SELECTOR, '.navbar-brand')
+ _default_message_locator = (by.By.CSS_SELECTOR, 'div.alert')
@property
def heading(self):
@@ -59,12 +61,25 @@ class BasePage(pageobject.PageObject):
def choose_theme(self, theme_name):
self.topbar.user_dropdown_menu.choose_theme(theme_name)
- def find_message_and_dismiss(self, message_level=messages.SUCCESS):
- message = messages.MessageRegion(self.driver, self.conf, message_level)
- is_message_present = message.exists()
- if is_message_present:
+ def find_all_messages(self):
+ self.driver.implicitly_wait(self.conf.selenium.message_implicit_wait)
+ try:
+ msg_elements = self.driver.find_elements(
+ *self._default_message_locator)
+ except Exceptions.NoSuchElementException:
+ msg_elements = []
+ finally:
+ self._turn_on_implicit_wait()
+ return msg_elements
+
+ def find_messages_and_dismiss(self):
+ messages_level_present = set()
+ for message_element in self.find_all_messages():
+ message = messages.MessageRegion(
+ self.driver, self.conf, message_element)
+ messages_level_present.add(message.message_class)
message.close()
- return is_message_present
+ return messages_level_present
def change_project(self, name):
self.topbar.user_dropdown_project.click_on_project(name)
diff --git a/openstack_dashboard/test/integration_tests/pages/project/compute/imagespage.py b/openstack_dashboard/test/integration_tests/pages/project/compute/imagespage.py
index 0c61bfcea..c3795a9ec 100644
--- a/openstack_dashboard/test/integration_tests/pages/project/compute/imagespage.py
+++ b/openstack_dashboard/test/integration_tests/pages/project/compute/imagespage.py
@@ -215,6 +215,7 @@ class ImagesPage(basepage.BaseNavigationPage):
confirm_edit_images_form.protected.pick('No')
confirm_edit_images_form.submit()
+ self.wait_till_element_disappears(self.wizard_getter)
def delete_image_via_row_action(self, name):
row = self._get_row_with_image_name(name)
@@ -289,6 +290,7 @@ class ImagesPage(basepage.BaseNavigationPage):
create_volume_form.availability_zone.value = \
self.conf.launch_instances.available_zone
create_volume_form.submit()
+ self.wait_till_element_disappears(self.wizard_getter)
def launch_instance_from_image(self, name, instance_name,
instance_count=1, flavor=None):
diff --git a/openstack_dashboard/test/integration_tests/pages/project/compute/instancespage.py b/openstack_dashboard/test/integration_tests/pages/project/compute/instancespage.py
index 236d9465d..92a292347 100644
--- a/openstack_dashboard/test/integration_tests/pages/project/compute/instancespage.py
+++ b/openstack_dashboard/test/integration_tests/pages/project/compute/instancespage.py
@@ -97,6 +97,7 @@ class InstancesPage(basepage.BaseNavigationPage):
instance_count=DEFAULT_COUNT,
flavor=DEFAULT_FLAVOR,
boot_source=DEFAULT_BOOT_SOURCE,
+ network_type=DEFAULT_NETWORK_TYPE,
source_name=None,
device_size=None,
vol_delete_on_instance_delete=DEFAULT_VOL_DELETE_ON_INSTANCE_DELETE
@@ -187,6 +188,6 @@ class InstancesPage(basepage.BaseNavigationPage):
def get_fixed_ipv4(self, name):
row = self._get_row_with_instance_name(name)
ips = row.cells[self.INSTANCES_TABLE_IP_COLUMN].text
- for ip in ips.split():
+ for ip in ips.split(','):
if netaddr.valid_ipv4(ip):
return ip
diff --git a/openstack_dashboard/test/integration_tests/regions/messages.py b/openstack_dashboard/test/integration_tests/regions/messages.py
index 68f50f11b..9860ec25d 100644
--- a/openstack_dashboard/test/integration_tests/regions/messages.py
+++ b/openstack_dashboard/test/integration_tests/regions/messages.py
@@ -10,7 +10,6 @@
# License for the specific language governing permissions and limitations
# under the License.
-from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common import by
from openstack_dashboard.test.integration_tests.regions import baseregion
@@ -18,28 +17,31 @@ from openstack_dashboard.test.integration_tests.regions import baseregion
ERROR = 'alert-danger'
INFO = 'alert-info'
SUCCESS = 'alert-success'
+WARNING = 'alert-warning'
class MessageRegion(baseregion.BaseRegion):
_close_locator = (by.By.CSS_SELECTOR, 'a.close')
- def _msg_locator(self, level):
- return (by.By.CSS_SELECTOR, 'div.alert.%s' % level)
-
- def __init__(self, driver, conf, level=SUCCESS):
- self._default_src_locator = self._msg_locator(level)
- # NOTE(nhelgeson): Running selenium on remote servers
- # requires extra time to wait for message to pop up.
- driver.implicitly_wait(conf.selenium.message_implicit_wait)
- try:
- super().__init__(driver, conf)
- except NoSuchElementException:
- self.src_elem = None
- finally:
- self._turn_on_implicit_wait()
+ def __init__(self, driver, conf, src_elem):
+ self.src_elem = src_elem
+ self.message_class = self.get_message_class()
def exists(self):
return self._is_element_displayed(self.src_elem)
def close(self):
self._get_element(*self._close_locator).click()
+
+ def get_message_class(self):
+ message_class = self.src_elem.get_attribute("class")
+ if SUCCESS in message_class:
+ return SUCCESS
+ elif ERROR in message_class:
+ return ERROR
+ elif INFO in message_class:
+ return INFO
+ elif WARNING in message_class:
+ return WARNING
+ else:
+ return "Unknown"
diff --git a/openstack_dashboard/test/integration_tests/tests/test_defaults.py b/openstack_dashboard/test/integration_tests/tests/test_defaults.py
index 3a6d782b3..b4c887b5e 100644
--- a/openstack_dashboard/test/integration_tests/tests/test_defaults.py
+++ b/openstack_dashboard/test/integration_tests/tests/test_defaults.py
@@ -34,12 +34,8 @@ class TestDefaults(helpers.AdminTestCase):
"""
default_quota_values = self.defaults_page.compute_quota_values
self.defaults_page.update_compute_defaults(self.add_up)
-
- self.assertTrue(
- self.defaults_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- self.defaults_page.find_message_and_dismiss(messages.ERROR))
-
+ self.assertEqual(
+ self.defaults_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertGreater(len(default_quota_values), 0)
for quota_name in default_quota_values:
@@ -63,12 +59,8 @@ class TestDefaults(helpers.AdminTestCase):
self.defaults_page.go_to_volume_quotas_tab()
default_quota_values = self.defaults_page.volume_quota_values
self.defaults_page.update_volume_defaults(self.add_up)
-
- self.assertTrue(
- self.defaults_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- self.defaults_page.find_message_and_dismiss(messages.ERROR))
-
+ self.assertEqual(
+ self.defaults_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertGreater(len(default_quota_values), 0)
for quota_name in default_quota_values:
diff --git a/openstack_dashboard/test/integration_tests/tests/test_flavors.py b/openstack_dashboard/test/integration_tests/tests/test_flavors.py
index 2bd18051c..b541bb49e 100644
--- a/openstack_dashboard/test/integration_tests/tests/test_flavors.py
+++ b/openstack_dashboard/test/integration_tests/tests/test_flavors.py
@@ -43,19 +43,15 @@ class TestFlavors(helpers.AdminTestCase):
ephemeral_disk=0,
swap_disk=0
)
- self.assertTrue(
- self.flavors_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- self.flavors_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ self.flavors_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertTrue(
self.flavors_page.is_flavor_present(self.FLAVOR_NAME))
def _delete_flavor(self, flavor_name):
self.flavors_page.delete_flavor_by_row(flavor_name)
- self.assertTrue(
- self.flavors_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- self.flavors_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ self.flavors_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertFalse(
self.flavors_page.is_flavor_present(self.FLAVOR_NAME))
diff --git a/openstack_dashboard/test/integration_tests/tests/test_floatingips.py b/openstack_dashboard/test/integration_tests/tests/test_floatingips.py
index 29b57843d..8711cf216 100644
--- a/openstack_dashboard/test/integration_tests/tests/test_floatingips.py
+++ b/openstack_dashboard/test/integration_tests/tests/test_floatingips.py
@@ -12,7 +12,6 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
-import pytest
from openstack_dashboard.test.integration_tests import helpers
from openstack_dashboard.test.integration_tests.regions import messages
@@ -25,33 +24,26 @@ class TestFloatingip(helpers.TestCase):
floatingip_page = \
self.home_pg.go_to_project_network_floatingipspage()
floating_ip = floatingip_page.allocate_floatingip()
- self.assertTrue(
- floatingip_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- floatingip_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ floatingip_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertTrue(floatingip_page.is_floatingip_present(floating_ip))
floatingip_page.release_floatingip(floating_ip)
- self.assertTrue(
- floatingip_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- floatingip_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ floatingip_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertFalse(floatingip_page.is_floatingip_present(floating_ip))
class TestFloatingipAssociateDisassociate(helpers.TestCase):
"""Checks that the user is able to Associate/Disassociate floatingip."""
- @pytest.mark.skip(reason="Bug 1920010 fix")
def test_floatingip_associate_disassociate(self):
instance_name = helpers.gen_random_resource_name('instance',
timestamp=False)
instances_page = self.home_pg.go_to_project_compute_instancespage()
- instances_page.create_instance(instance_name)
- self.assertTrue(
- instances_page.find_message_and_dismiss(messages.INFO))
- self.assertFalse(
- instances_page.find_message_and_dismiss(messages.ERROR))
+ instances_page.create_instance(instance_name, network_type='internal')
+ self.assertEqual(
+ instances_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(instances_page.is_instance_active(instance_name))
instance_ipv4 = instances_page.get_fixed_ipv4(instance_name)
instance_info = "{} {}".format(instance_name, instance_ipv4)
@@ -59,40 +51,29 @@ class TestFloatingipAssociateDisassociate(helpers.TestCase):
floatingip_page = \
self.home_pg.go_to_project_network_floatingipspage()
floating_ip = floatingip_page.allocate_floatingip()
- self.assertTrue(
- floatingip_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- floatingip_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ floatingip_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertTrue(floatingip_page.is_floatingip_present(floating_ip))
-
self.assertEqual('-', floatingip_page.get_fixed_ip(floating_ip))
floatingip_page.associate_floatingip(floating_ip, instance_name,
instance_ipv4)
- self.assertTrue(
- floatingip_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- floatingip_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ floatingip_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertEqual(instance_info,
floatingip_page.get_fixed_ip(floating_ip))
floatingip_page.disassociate_floatingip(floating_ip)
- self.assertTrue(
- floatingip_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- floatingip_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ floatingip_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertEqual('-', floatingip_page.get_fixed_ip(floating_ip))
floatingip_page.release_floatingip(floating_ip)
- self.assertTrue(
- floatingip_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- floatingip_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ floatingip_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertFalse(floatingip_page.is_floatingip_present(floating_ip))
instances_page = self.home_pg.go_to_project_compute_instancespage()
instances_page.delete_instance(instance_name)
- self.assertTrue(
- instances_page.find_message_and_dismiss(messages.INFO))
- self.assertFalse(
- instances_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ floatingip_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(instances_page.is_instance_deleted(instance_name))
diff --git a/openstack_dashboard/test/integration_tests/tests/test_groups.py b/openstack_dashboard/test/integration_tests/tests/test_groups.py
index 2e78807f1..9b3da22fb 100644
--- a/openstack_dashboard/test/integration_tests/tests/test_groups.py
+++ b/openstack_dashboard/test/integration_tests/tests/test_groups.py
@@ -31,18 +31,14 @@ class TestGroup(helpers.AdminTestCase):
def _test_create_group(self, group_name, group_desc=None):
self.groups_page.create_group(name=group_name, description=group_desc)
- self.assertTrue(
- self.groups_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- self.groups_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ self.groups_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertTrue(self.groups_page.is_group_present(group_name))
def _test_delete_group(self, group_name):
self.groups_page.delete_group(name=group_name)
- self.assertTrue(
- self.groups_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- self.groups_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ self.groups_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertFalse(self.groups_page.is_group_present(group_name))
def test_create_delete_group(self):
@@ -58,9 +54,7 @@ class TestGroup(helpers.AdminTestCase):
new_group_name = self.group_name
new_group_desc = self.group_description
self.groups_page.edit_group(group_name, new_group_name, new_group_desc)
- self.assertTrue(
- self.groups_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- self.groups_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ self.groups_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertTrue(self.groups_page.is_group_present(new_group_name))
self._test_delete_group(new_group_name)
diff --git a/openstack_dashboard/test/integration_tests/tests/test_grouptypes.py b/openstack_dashboard/test/integration_tests/tests/test_grouptypes.py
index 4e2d980fb..d94fcadd6 100644
--- a/openstack_dashboard/test/integration_tests/tests/test_grouptypes.py
+++ b/openstack_dashboard/test/integration_tests/tests/test_grouptypes.py
@@ -32,16 +32,12 @@ class TestAdminGroupTypes(helpers.AdminTestCase):
"""
group_types_page = self.home_pg.go_to_admin_volume_grouptypespage()
group_types_page.create_group_type(self.GROUP_TYPE_NAME)
- self.assertTrue(
- group_types_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- group_types_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ group_types_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertTrue(group_types_page.is_group_type_present(
self.GROUP_TYPE_NAME))
group_types_page.delete_group_type(self.GROUP_TYPE_NAME)
- self.assertTrue(
- group_types_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- group_types_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ group_types_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertTrue(group_types_page.is_group_type_deleted(
self.GROUP_TYPE_NAME))
diff --git a/openstack_dashboard/test/integration_tests/tests/test_host_aggregates.py b/openstack_dashboard/test/integration_tests/tests/test_host_aggregates.py
index f6f373dd0..4fc6b686e 100644
--- a/openstack_dashboard/test/integration_tests/tests/test_host_aggregates.py
+++ b/openstack_dashboard/test/integration_tests/tests/test_host_aggregates.py
@@ -34,17 +34,13 @@ class TestHostAggregates(helpers.AdminTestCase):
hostaggregates_page.create_host_aggregate(
name=self.HOST_AGGREGATE_NAME,
availability_zone=self.HOST_AGGREGATE_AVAILABILITY_ZONE)
- self.assertTrue(
- hostaggregates_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(hostaggregates_page.find_message_and_dismiss(
- messages.ERROR))
+ self.assertEqual(
+ hostaggregates_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertTrue(hostaggregates_page.is_host_aggregate_present(
self.HOST_AGGREGATE_NAME))
hostaggregates_page.delete_host_aggregate(self.HOST_AGGREGATE_NAME)
- self.assertTrue(
- hostaggregates_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(hostaggregates_page.find_message_and_dismiss(
- messages.ERROR))
+ self.assertEqual(
+ hostaggregates_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertFalse(hostaggregates_page.is_host_aggregate_present(
self.HOST_AGGREGATE_NAME))
diff --git a/openstack_dashboard/test/integration_tests/tests/test_images.py b/openstack_dashboard/test/integration_tests/tests/test_images.py
index 8065eaa92..ddf9db1f4 100644
--- a/openstack_dashboard/test/integration_tests/tests/test_images.py
+++ b/openstack_dashboard/test/integration_tests/tests/test_images.py
@@ -43,8 +43,8 @@ class TestImagesBasicAngular(helpers.TestCase):
images_page.create_image(self.IMAGE_NAME,
image_source_type='url',
**kwargs)
- self.assertTrue(images_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(images_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ images_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertTrue(images_page.is_image_present(self.IMAGE_NAME))
self.assertTrue(images_page.is_image_active(self.IMAGE_NAME))
return images_page
@@ -52,8 +52,8 @@ class TestImagesBasicAngular(helpers.TestCase):
def image_delete(self, image_name):
images_page = self.images_page
images_page.delete_image(image_name)
- self.assertTrue(images_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(images_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ images_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertFalse(images_page.is_image_present(self.IMAGE_NAME))
def test_image_create_delete_from_local_file(self):
@@ -111,8 +111,8 @@ class TestImagesBasicAngular(helpers.TestCase):
garbage = [i for i in image_list if i not in default_image_list]
if garbage:
images_page.delete_images(garbage)
- self.assertTrue(
- images_page.find_message_and_dismiss(messages.SUCCESS))
+ self.assertEqual(
+ images_page.find_messages_and_dismiss(), {messages.SUCCESS})
items_per_page = 1
images_count = 2
@@ -121,10 +121,8 @@ class TestImagesBasicAngular(helpers.TestCase):
for image_name in images_names:
with helpers.gen_temporary_file() as file_name:
images_page.create_image(image_name, image_file=file_name)
- self.assertTrue(
- images_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- images_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ images_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertTrue(images_page.is_image_present(image_name))
first_page_definition = {'Next': True, 'Prev': False,
@@ -139,7 +137,7 @@ class TestImagesBasicAngular(helpers.TestCase):
settings_page = self.home_pg.go_to_settings_usersettingspage()
settings_page.change_pagesize(items_per_page)
- settings_page.find_message_and_dismiss(messages.SUCCESS)
+ settings_page.find_messages_and_dismiss()
images_page = self.images_page
if not images_page.is_image_present(default_image_list[0]):
@@ -160,13 +158,13 @@ class TestImagesBasicAngular(helpers.TestCase):
settings_page = self.home_pg.go_to_settings_usersettingspage()
settings_page.change_pagesize()
- settings_page.find_message_and_dismiss(messages.SUCCESS)
+ settings_page.find_messages_and_dismiss()
images_page = self.images_page
images_page.wait_until_image_present(default_image_list[0])
images_page.delete_images(images_names)
- self.assertTrue(images_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(images_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ images_page.find_messages_and_dismiss(), {messages.SUCCESS})
class TestImagesAdminAngular(helpers.AdminTestCase, TestImagesBasicAngular):
@@ -220,8 +218,8 @@ class TestImagesAdminAngular(helpers.AdminTestCase, TestImagesBasicAngular):
with helpers.gen_temporary_file() as file_name:
images_page = self.image_create(local_file=file_name)
images_page.edit_image(self.IMAGE_NAME, protected=True)
- self.assertTrue(
- images_page.find_message_and_dismiss(messages.SUCCESS))
+ self.assertEqual(
+ images_page.find_messages_and_dismiss(), {messages.SUCCESS})
# Check that Delete action is not available in the action list.
# The below action will generate exception since the bind fails.
@@ -235,15 +233,9 @@ class TestImagesAdminAngular(helpers.AdminTestCase, TestImagesBasicAngular):
images_page = self.images_page
images_page.edit_image(self.IMAGE_NAME, protected=False)
- self.assertTrue(
- images_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- images_page.find_message_and_dismiss(messages.ERROR))
-
+ self.assertEqual(
+ images_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.image_delete(self.IMAGE_NAME)
- self.assertFalse(
- images_page.find_message_and_dismiss(messages.ERROR))
- self.assertFalse(images_page.is_image_present(self.IMAGE_NAME))
def test_edit_image_description_and_name(self):
"""tests that image description is editable
@@ -265,10 +257,8 @@ class TestImagesAdminAngular(helpers.AdminTestCase, TestImagesBasicAngular):
images_page = self.image_create(local_file=file_name)
images_page.edit_image(self.IMAGE_NAME,
description=new_description_text)
- self.assertTrue(
- images_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- images_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ images_page.find_messages_and_dismiss(), {messages.SUCCESS})
results = images_page.check_image_details(self.IMAGE_NAME,
{'Description':
@@ -279,20 +269,14 @@ class TestImagesAdminAngular(helpers.AdminTestCase, TestImagesBasicAngular):
images_page = self.images_page
images_page.edit_image(self.IMAGE_NAME,
new_name=new_image_name)
- self.assertTrue(
- images_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- images_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ images_page.find_messages_and_dismiss(), {messages.SUCCESS})
results = images_page.check_image_details(new_image_name,
{'Name':
new_image_name})
self.assertSequenceTrue(results)
-
self.image_delete(new_image_name)
- self.assertFalse(
- images_page.find_message_and_dismiss(messages.ERROR))
- self.assertFalse(images_page.is_image_present(self.IMAGE_NAME))
def test_filter_images(self):
"""This test checks filtering of images
@@ -354,10 +338,8 @@ class TestImagesAdvancedAngular(helpers.TestCase):
images_page.create_volume_from_image(
source_image, volume_name=target_volume)
- self.assertTrue(
- images_page.find_message_and_dismiss(messages.INFO))
- self.assertFalse(
- images_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ images_page.find_messages_and_dismiss(), {messages.INFO})
volumes_page = self.volumes_page()
@@ -365,8 +347,7 @@ class TestImagesAdvancedAngular(helpers.TestCase):
self.assertTrue(volumes_page.is_volume_status(target_volume,
'Available'))
volumes_page.delete_volume(target_volume)
- volumes_page.find_message_and_dismiss(messages.SUCCESS)
- volumes_page.find_message_and_dismiss(messages.ERROR)
+ volumes_page.find_messages_and_dismiss()
volumes_page = self.volumes_page()
self.assertTrue(volumes_page.is_volume_deleted(target_volume))
@@ -387,10 +368,8 @@ class TestImagesAdvancedAngular(helpers.TestCase):
target_instance = "created_from_{0}".format(source_image)
images_page.launch_instance_from_image(source_image, target_instance)
- self.assertTrue(
- images_page.find_message_and_dismiss(messages.INFO))
- self.assertFalse(
- images_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ images_page.find_messages_and_dismiss(), {messages.INFO})
instances_page = self.instances_page()
self.assertTrue(instances_page.is_instance_active(target_instance))
@@ -399,8 +378,6 @@ class TestImagesAdvancedAngular(helpers.TestCase):
self.assertEqual(source_image, actual_image_name)
instances_page.delete_instance(target_instance)
- self.assertTrue(
- instances_page.find_message_and_dismiss(messages.INFO))
- self.assertFalse(
- instances_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ instances_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(instances_page.is_instance_deleted(target_instance))
diff --git a/openstack_dashboard/test/integration_tests/tests/test_instances.py b/openstack_dashboard/test/integration_tests/tests/test_instances.py
index da510b268..ebf784714 100644
--- a/openstack_dashboard/test/integration_tests/tests/test_instances.py
+++ b/openstack_dashboard/test/integration_tests/tests/test_instances.py
@@ -33,16 +33,14 @@ class TestInstances(helpers.TestCase):
instances_page = self.home_pg.go_to_project_compute_instancespage()
instances_page.create_instance(self.INSTANCE_NAME)
- self.assertTrue(instances_page.find_message_and_dismiss(messages.INFO))
- self.assertFalse(
- instances_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ instances_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(instances_page.is_instance_active(self.INSTANCE_NAME))
instances_page = self.instances_page
instances_page.delete_instance(self.INSTANCE_NAME)
- self.assertTrue(instances_page.find_message_and_dismiss(messages.INFO))
- self.assertFalse(
- instances_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ instances_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(instances_page.is_instance_deleted(self.INSTANCE_NAME))
@@ -68,33 +66,33 @@ class TestInstancesPagination(helpers.TestCase):
name_column='Instance Name')
if garbage:
instances_page.delete_instances(garbage)
- self.assertTrue(
- instances_page.find_message_and_dismiss(messages.INFO))
+ self.assertEqual(
+ instances_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(
instances_page.are_instances_deleted(garbage))
instances_page.create_instance(self.INSTANCE_NAME,
instance_count=self.INSTANCE_COUNT)
- self.assertTrue(
- instances_page.find_message_and_dismiss(messages.INFO))
+ self.assertEqual(
+ instances_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(
instances_page.is_instance_active(self.instance_list[1]))
settings_page = self.home_pg.go_to_settings_usersettingspage()
settings_page.change_pagesize(self.ITEMS_PER_PAGE)
- self.assertTrue(
- settings_page.find_message_and_dismiss(messages.SUCCESS))
+ self.assertEqual(
+ settings_page.find_messages_and_dismiss(), {messages.SUCCESS})
def cleanup():
settings_page = self.home_pg.go_to_settings_usersettingspage()
settings_page.change_pagesize()
- self.assertTrue(
- settings_page.find_message_and_dismiss(messages.SUCCESS))
+ self.assertEqual(
+ settings_page.find_messages_and_dismiss(), {messages.SUCCESS})
instances_page = self.instances_page
instances_page.delete_instances(self.instance_list)
- self.assertTrue(
- instances_page.find_message_and_dismiss(messages.INFO))
+ self.assertEqual(
+ instances_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(
instances_page.are_instances_deleted(self.instance_list))
@@ -207,23 +205,23 @@ class TestInstancesFilter(helpers.TestCase):
name_column='Instance Name')
if garbage:
instances_page.delete_instances(garbage)
- self.assertTrue(
- instances_page.find_message_and_dismiss(messages.INFO))
+ self.assertEqual(
+ instances_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(
instances_page.are_instances_deleted(garbage))
instances_page.create_instance(self.INSTANCE_NAME,
instance_count=self.INSTANCE_COUNT)
- self.assertTrue(
- instances_page.find_message_and_dismiss(messages.INFO))
+ self.assertEqual(
+ instances_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(
instances_page.is_instance_active(self.instance_list[1]))
def cleanup():
instances_page = self.instances_page
instances_page.delete_instances(self.instance_list)
- self.assertTrue(
- instances_page.find_message_and_dismiss(messages.INFO))
+ self.assertEqual(
+ instances_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(
instances_page.are_instances_deleted(self.instance_list))
@@ -289,33 +287,33 @@ class TestAdminInstancesPagination(helpers.AdminTestCase, TestInstances):
name_column='Instance Name')
if garbage:
instances_page.delete_instances(garbage)
- self.assertTrue(
- instances_page.find_message_and_dismiss(messages.INFO))
+ self.assertEqual(
+ instances_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(
instances_page.are_instances_deleted(garbage))
instances_page.create_instance(self.INSTANCE_NAME,
instance_count=self.INSTANCE_COUNT)
- self.assertTrue(
- instances_page.find_message_and_dismiss(messages.INFO))
+ self.assertEqual(
+ instances_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(
instances_page.is_instance_active(self.instance_list[1]))
settings_page = self.home_pg.go_to_settings_usersettingspage()
settings_page.change_pagesize(self.ITEMS_PER_PAGE)
- self.assertTrue(
- settings_page.find_message_and_dismiss(messages.SUCCESS))
+ self.assertEqual(
+ settings_page.find_messages_and_dismiss(), {messages.SUCCESS})
def cleanup():
settings_page = self.home_pg.go_to_settings_usersettingspage()
settings_page.change_pagesize()
- self.assertTrue(
- settings_page.find_message_and_dismiss(messages.SUCCESS))
+ self.assertEqual(
+ settings_page.find_messages_and_dismiss(), {messages.SUCCESS})
instances_page = self.instances_page
instances_page.delete_instances(self.instance_list)
- self.assertTrue(
- instances_page.find_message_and_dismiss(messages.INFO))
+ self.assertEqual(
+ instances_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(
instances_page.are_instances_deleted(self.instance_list))
diff --git a/openstack_dashboard/test/integration_tests/tests/test_keypairs.py b/openstack_dashboard/test/integration_tests/tests/test_keypairs.py
index c3f0f8397..62b5a32df 100644
--- a/openstack_dashboard/test/integration_tests/tests/test_keypairs.py
+++ b/openstack_dashboard/test/integration_tests/tests/test_keypairs.py
@@ -27,14 +27,14 @@ class TestKeypair(helpers.TestCase):
keypair_page = self.home_pg.\
go_to_project_compute_keypairspage()
keypair_page.create_keypair(self.KEYPAIR_NAME)
- self.assertFalse(keypair_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ keypair_page.find_messages_and_dismiss(), {messages.SUCCESS})
keypair_page = self.home_pg.\
go_to_project_compute_keypairspage()
self.assertTrue(keypair_page.is_keypair_present(self.KEYPAIR_NAME))
keypair_page.delete_keypair(self.KEYPAIR_NAME)
- self.assertTrue(
- keypair_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(keypair_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ keypair_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertFalse(keypair_page.is_keypair_present(self.KEYPAIR_NAME))
diff --git a/openstack_dashboard/test/integration_tests/tests/test_metadata_definitions.py b/openstack_dashboard/test/integration_tests/tests/test_metadata_definitions.py
index 4cf248663..be64edec5 100644
--- a/openstack_dashboard/test/integration_tests/tests/test_metadata_definitions.py
+++ b/openstack_dashboard/test/integration_tests/tests/test_metadata_definitions.py
@@ -54,8 +54,8 @@ class TestMetadataDefinitions(helpers.AdminTestCase):
is_protected=is_protected,
namespace_source_type=template_source_type)
# Checks
- self.assertTrue(page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertTrue(page.is_namespace_present(namespace_name))
row = page._get_row_with_namespace_name(namespace_name)
if checks:
@@ -79,8 +79,8 @@ class TestMetadataDefinitions(helpers.AdminTestCase):
"""
page.delete_namespace(name=namespace_name)
# Checks
- self.assertTrue(page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertFalse(page.is_namespace_present(namespace_name))
def test_namespace_create_delete(self):
diff --git a/openstack_dashboard/test/integration_tests/tests/test_networks.py b/openstack_dashboard/test/integration_tests/tests/test_networks.py
index 6c56fdb2a..a1bdf6fbc 100644
--- a/openstack_dashboard/test/integration_tests/tests/test_networks.py
+++ b/openstack_dashboard/test/integration_tests/tests/test_networks.py
@@ -37,18 +37,14 @@ class TestNetworks(helpers.TestCase):
networks_page = self.networks_page
networks_page.create_network(self.NETWORK_NAME, self.SUBNET_NAME)
- self.assertTrue(
- networks_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- networks_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ networks_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertTrue(networks_page.is_network_present(self.NETWORK_NAME))
self.assertTrue(networks_page.is_network_active(self.NETWORK_NAME))
networks_page.delete_network(self.NETWORK_NAME)
- self.assertTrue(
- networks_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- networks_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ networks_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertFalse(networks_page.is_network_present(self.NETWORK_NAME))
@@ -81,10 +77,8 @@ class TestNetworksPagination(helpers.TestCase):
networks_page = self.networks_page
for network_name in networks_names:
networks_page.create_network(network_name, self.SUBNET_NAME)
- self.assertTrue(
- networks_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- networks_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ networks_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertTrue(networks_page.is_network_present(network_name))
self.assertTrue(networks_page.is_network_active(network_name))
# we have to get this now, before we change page size
@@ -98,10 +92,9 @@ class TestNetworksPagination(helpers.TestCase):
networks_page = self.networks_page
for network_name in networks_names:
networks_page.delete_network(network_name)
- self.assertTrue(
- networks_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- networks_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ networks_page.find_messages_and_dismiss(),
+ {messages.SUCCESS})
self.assertFalse(networks_page.is_network_present(network_name))
self.addCleanup(cleanup)
@@ -166,4 +159,4 @@ class TestNetworksPagination(helpers.TestCase):
settings_page.change_pagesize(items_per_page)
else:
settings_page.change_pagesize()
- settings_page.find_message_and_dismiss(messages.SUCCESS)
+ settings_page.find_messages_and_dismiss()
diff --git a/openstack_dashboard/test/integration_tests/tests/test_projects.py b/openstack_dashboard/test/integration_tests/tests/test_projects.py
index 0b06c8528..f85958640 100644
--- a/openstack_dashboard/test/integration_tests/tests/test_projects.py
+++ b/openstack_dashboard/test/integration_tests/tests/test_projects.py
@@ -24,17 +24,13 @@ class TestCreateDeleteProject(helpers.AdminTestCase):
def test_create_delete_project(self):
self.projects_page.create_project(PROJECT_NAME)
- self.assertTrue(
- self.projects_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- self.projects_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ self.projects_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertTrue(self.projects_page.is_project_present(PROJECT_NAME))
self.projects_page.delete_project(PROJECT_NAME)
- self.assertTrue(
- self.projects_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- self.projects_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ self.projects_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertFalse(self.projects_page.is_project_present(PROJECT_NAME))
@@ -44,8 +40,8 @@ class TestModifyProject(helpers.AdminTestCase):
super().setUp()
self.projects_page = self.home_pg.go_to_identity_projectspage()
self.projects_page.create_project(PROJECT_NAME)
- self.assertTrue(
- self.projects_page.find_message_and_dismiss(messages.SUCCESS))
+ self.assertEqual(
+ self.projects_page.find_messages_and_dismiss(), {messages.SUCCESS})
def cleanup():
if not self.projects_page.is_the_current_page():
@@ -62,10 +58,8 @@ class TestModifyProject(helpers.AdminTestCase):
self.projects_page.allocate_user_to_project(
admin_name, roles2add, PROJECT_NAME)
- self.assertTrue(
- self.projects_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- self.projects_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ self.projects_page.find_messages_and_dismiss(), {messages.SUCCESS})
user_roles = self.projects_page.get_user_roles_at_project(
admin_name, PROJECT_NAME)
diff --git a/openstack_dashboard/test/integration_tests/tests/test_router.py b/openstack_dashboard/test/integration_tests/tests/test_router.py
index feba833e0..a462e3330 100644
--- a/openstack_dashboard/test/integration_tests/tests/test_router.py
+++ b/openstack_dashboard/test/integration_tests/tests/test_router.py
@@ -28,18 +28,16 @@ class TestRouters(helpers.TestCase):
routers_page = self.routers_page
routers_page.create_router(self.ROUTER_NAME)
- self.assertTrue(
- routers_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(routers_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ routers_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertTrue(routers_page.is_router_present(self.ROUTER_NAME))
self.assertTrue(routers_page.is_router_active(self.ROUTER_NAME))
def _delete_router(self):
routers_page = self.routers_page
routers_page.delete_router(self.ROUTER_NAME)
- self.assertTrue(
- routers_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(routers_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ routers_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertFalse(routers_page.is_router_present(self.ROUTER_NAME))
def test_router_create(self):
@@ -55,32 +53,28 @@ class TestRouters(helpers.TestCase):
def _create_interface(self, interfaces_page):
interfaces_page.create_interface(self.SUBNET_NAME)
- self.assertTrue(
- interfaces_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- interfaces_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ interfaces_page.find_messages_and_dismiss(), {messages.SUCCESS})
interface_name = interfaces_page.interface_name
self.assertTrue(interfaces_page.is_interface_present(interface_name))
def _delete_interface(self, interfaces_page, interface_name):
interfaces_page.delete_interface(interface_name)
- self.assertTrue(
- interfaces_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- interfaces_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ interfaces_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertFalse(interfaces_page.is_interface_present(interface_name))
def _create_subnet(self):
networks_page = self.home_pg.go_to_project_network_networkspage()
networks_page.create_network(self.NETWORK_NAME, self.SUBNET_NAME)
- self.assertTrue(
- networks_page.find_message_and_dismiss(messages.SUCCESS))
+ self.assertEqual(
+ networks_page.find_messages_and_dismiss(), {messages.SUCCESS})
def _delete_subnet(self):
networks_page = self.home_pg.go_to_project_network_networkspage()
networks_page.delete_network(self.NETWORK_NAME)
- self.assertTrue(
- networks_page.find_message_and_dismiss(messages.SUCCESS))
+ self.assertEqual(
+ networks_page.find_messages_and_dismiss(), {messages.SUCCESS})
def test_router_add_delete_interface(self):
"""Tests the router interface creation and deletion functionalities:
@@ -191,9 +185,8 @@ class TestAdminRouters(helpers.AdminTestCase):
routers_page = self.home_pg.go_to_project_network_routerspage()
routers_page.create_router(self.ROUTER_NAME)
- self.assertTrue(
- routers_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(routers_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ routers_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertTrue(routers_page.is_router_present(self.ROUTER_NAME))
self.assertTrue(routers_page.is_router_active(self.ROUTER_NAME))
@@ -204,18 +197,14 @@ class TestAdminRouters(helpers.AdminTestCase):
new_name = "edited_" + self.ROUTER_NAME
admin_routers_page.edit_router(self.ROUTER_NAME, new_name=new_name)
- self.assertTrue(
- admin_routers_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- admin_routers_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ admin_routers_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertTrue(
admin_routers_page.is_router_present(new_name))
self.assertTrue(
admin_routers_page.is_router_active(new_name))
admin_routers_page.delete_router(new_name)
- self.assertTrue(
- admin_routers_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- admin_routers_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ admin_routers_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertFalse(admin_routers_page.is_router_present(new_name))
diff --git a/openstack_dashboard/test/integration_tests/tests/test_router_gateway.py b/openstack_dashboard/test/integration_tests/tests/test_router_gateway.py
index 8f10c7589..8c17c44b6 100644
--- a/openstack_dashboard/test/integration_tests/tests/test_router_gateway.py
+++ b/openstack_dashboard/test/integration_tests/tests/test_router_gateway.py
@@ -45,26 +45,22 @@ class TestRouters(helpers.TestCase):
routers_page = self.home_pg.go_to_project_network_routerspage()
routers_page.create_router(self.ROUTER_NAME)
- self.assertTrue(
- routers_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(routers_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ routers_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertTrue(routers_page.is_router_present(self.ROUTER_NAME))
self.assertTrue(routers_page.is_router_active(self.ROUTER_NAME))
routers_page.clear_gateway(self.ROUTER_NAME)
- self.assertTrue(
- routers_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(routers_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ routers_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertTrue(routers_page.is_gateway_cleared(self.ROUTER_NAME))
routers_page.set_gateway(self.ROUTER_NAME)
- self.assertTrue(
- routers_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(routers_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ routers_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertTrue(routers_page.is_gateway_set(self.ROUTER_NAME))
routers_page.delete_router(self.ROUTER_NAME)
- self.assertTrue(
- routers_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(routers_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ routers_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertFalse(routers_page.is_router_present(self.ROUTER_NAME))
diff --git a/openstack_dashboard/test/integration_tests/tests/test_security_groups.py b/openstack_dashboard/test/integration_tests/tests/test_security_groups.py
index da6f8f248..6d3f99b54 100644
--- a/openstack_dashboard/test/integration_tests/tests/test_security_groups.py
+++ b/openstack_dashboard/test/integration_tests/tests/test_security_groups.py
@@ -29,45 +29,44 @@ class TestSecuritygroup(helpers.TestCase):
page = self.securitygroup_page
rule_page = page.create_securitygroup(self.SEC_GROUP_NAME)
if rule_page:
- self.assertTrue(
- rule_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- rule_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ rule_page.find_messages_and_dismiss(), {messages.SUCCESS})
page = self.securitygroup_page
self.assertTrue(page.is_securitygroup_present(self.SEC_GROUP_NAME))
else:
- self.assertTrue(page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertTrue(page.is_securitygroup_present(self.SEC_GROUP_NAME))
def _delete_securitygroup(self):
page = self.securitygroup_page
page.delete_securitygroup(self.SEC_GROUP_NAME)
- self.assertTrue(page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertFalse(page.is_securitygroup_present(self.SEC_GROUP_NAME))
def _add_rule(self):
page = self.securitygroup_page
page = page.go_to_manage_rules(self.SEC_GROUP_NAME)
page.create_rule(self.RULE_PORT)
- self.assertTrue(page.find_message_and_dismiss(messages.SUCCESS))
+ self.assertEqual(
+ page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertTrue(page.is_port_present(self.RULE_PORT))
def _delete_rule_by_table_action(self):
page = self.securitygroup_page
page = page.go_to_manage_rules(self.SEC_GROUP_NAME)
page.delete_rules(self.RULE_PORT)
- self.assertTrue(page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertFalse(page.is_port_present(self.RULE_PORT))
def _delete_rule_by_row_action(self):
page = self.securitygroup_page
page = page.go_to_manage_rules(self.SEC_GROUP_NAME)
page.delete_rule(self.RULE_PORT)
- self.assertTrue(page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertFalse(page.is_port_present(self.RULE_PORT))
def test_securitygroup_create_delete(self):
diff --git a/openstack_dashboard/test/integration_tests/tests/test_user_settings.py b/openstack_dashboard/test/integration_tests/tests/test_user_settings.py
index f48ae6da7..161fbf239 100644
--- a/openstack_dashboard/test/integration_tests/tests/test_user_settings.py
+++ b/openstack_dashboard/test/integration_tests/tests/test_user_settings.py
@@ -135,28 +135,20 @@ class TestUserSettings(helpers.TestCase):
"""
settings_page = self.home_pg.go_to_settings_usersettingspage()
settings_page.change_language("es")
- self.assertTrue(
- settings_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- settings_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ settings_page.find_messages_and_dismiss(), {messages.SUCCESS})
settings_page.change_timezone("Asia/Jerusalem")
- self.assertTrue(
- settings_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- settings_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ settings_page.find_messages_and_dismiss(), {messages.SUCCESS})
settings_page.change_pagesize("30")
- self.assertTrue(
- settings_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- settings_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ settings_page.find_messages_and_dismiss(), {messages.SUCCESS})
settings_page.change_loglines("50")
- self.assertTrue(
- settings_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- settings_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ settings_page.find_messages_and_dismiss(), {messages.SUCCESS})
changed_settings = {
"language": "es",
diff --git a/openstack_dashboard/test/integration_tests/tests/test_users.py b/openstack_dashboard/test/integration_tests/tests/test_users.py
index e1b09b14b..d7fad4a58 100644
--- a/openstack_dashboard/test/integration_tests/tests/test_users.py
+++ b/openstack_dashboard/test/integration_tests/tests/test_users.py
@@ -23,11 +23,11 @@ class TestUser(helpers.AdminTestCase):
users_page.create_user(self.USER_NAME, password=password,
project='admin', role='admin')
- self.assertTrue(users_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(users_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ users_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertTrue(users_page.is_user_present(self.USER_NAME))
users_page.delete_user(self.USER_NAME)
- self.assertTrue(users_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(users_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ users_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertFalse(users_page.is_user_present(self.USER_NAME))
diff --git a/openstack_dashboard/test/integration_tests/tests/test_volume_snapshots.py b/openstack_dashboard/test/integration_tests/tests/test_volume_snapshots.py
index 172b47962..e218ac165 100644
--- a/openstack_dashboard/test/integration_tests/tests/test_volume_snapshots.py
+++ b/openstack_dashboard/test/integration_tests/tests/test_volume_snapshots.py
@@ -32,14 +32,14 @@ class TestVolumeSnapshotsBasic(helpers.TestCase):
super().setUp()
volumes_page = self.home_pg.go_to_project_volumes_volumespage()
volumes_page.create_volume(self.VOLUME_NAME)
- volumes_page.find_message_and_dismiss(messages.INFO)
+ volumes_page.find_messages_and_dismiss()
self.assertTrue(volumes_page.is_volume_status(self.VOLUME_NAME,
'Available'))
def cleanup():
volumes_page = self.home_pg.go_to_project_volumes_volumespage()
volumes_page.delete_volume(self.VOLUME_NAME)
- volumes_page.find_message_and_dismiss(messages.INFO)
+ volumes_page.find_messages_and_dismiss()
self.assertTrue(volumes_page.is_volume_deleted(self.VOLUME_NAME))
self.addCleanup(cleanup)
@@ -61,8 +61,8 @@ class TestVolumeSnapshotsBasic(helpers.TestCase):
volumes_page = self.home_pg.go_to_project_volumes_volumespage()
volumes_snapshot_page = volumes_page.create_volume_snapshot(
self.VOLUME_NAME, self.VOLUME_SNAPSHOT_NAME)
- self.assertTrue(volumes_page.find_message_and_dismiss(messages.INFO))
- self.assertFalse(volumes_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ volumes_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(volumes_snapshot_page.is_volume_snapshot_available(
self.VOLUME_SNAPSHOT_NAME))
actual_volume_name = volumes_snapshot_page.get_volume_name(
@@ -74,18 +74,15 @@ class TestVolumeSnapshotsBasic(helpers.TestCase):
self.home_pg.go_to_project_volumes_snapshotspage()
volumes_snapshot_page.edit_snapshot(self.VOLUME_SNAPSHOT_NAME,
new_name, "description")
- self.assertTrue(
- volumes_snapshot_page.find_message_and_dismiss(messages.INFO))
- self.assertFalse(
- volumes_snapshot_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ volumes_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(volumes_snapshot_page.
is_volume_snapshot_available(new_name))
volumes_snapshot_page.delete_volume_snapshot(new_name)
- self.assertTrue(
- volumes_snapshot_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- volumes_snapshot_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ volumes_snapshot_page.find_messages_and_dismiss(),
+ {messages.SUCCESS})
self.assertTrue(volumes_snapshot_page.is_volume_snapshot_deleted(
new_name))
@@ -120,7 +117,7 @@ class TestVolumeSnapshotsBasic(helpers.TestCase):
for i, name in enumerate(snapshot_names):
volumes_snapshot_page = volumes_page.create_volume_snapshot(
self.VOLUME_NAME, name)
- volumes_page.find_message_and_dismiss(messages.INFO)
+ volumes_page.find_messages_and_dismiss()
self.assertTrue(
volumes_snapshot_page.is_volume_snapshot_available(name))
if i < count - 1:
@@ -138,7 +135,7 @@ class TestVolumeSnapshotsBasic(helpers.TestCase):
settings_page = self.home_pg.go_to_settings_usersettingspage()
settings_page.change_pagesize(items_per_page)
- settings_page.find_message_and_dismiss(messages.SUCCESS)
+ settings_page.find_messages_and_dismiss()
volumes_snapshot_page = self.volumes_snapshot_page
volumes_snapshot_page.volumesnapshots_table.assert_definition(
@@ -162,11 +159,11 @@ class TestVolumeSnapshotsBasic(helpers.TestCase):
settings_page = self.home_pg.go_to_settings_usersettingspage()
settings_page.change_pagesize()
- settings_page.find_message_and_dismiss(messages.SUCCESS)
+ settings_page.find_messages_and_dismiss()
volumes_snapshot_page = self.volumes_snapshot_page
volumes_snapshot_page.delete_volume_snapshots(snapshot_names)
- volumes_snapshot_page.find_message_and_dismiss(messages.SUCCESS)
+ volumes_snapshot_page.find_messages_and_dismiss()
for name in snapshot_names:
volumes_snapshot_page.is_volume_snapshot_deleted(name)
@@ -202,17 +199,15 @@ class TestVolumeSnapshotsAdvanced(helpers.TestCase):
super().setUp()
volumes_page = self.home_pg.go_to_project_volumes_volumespage()
volumes_page.create_volume(self.VOLUME_NAME)
- volumes_page.find_message_and_dismiss(messages.INFO)
+ volumes_page.find_messages_and_dismiss()
self.assertTrue(volumes_page.is_volume_status(self.VOLUME_NAME,
'Available'))
def cleanup():
volumes_page = self.home_pg.go_to_project_volumes_volumespage()
volumes_page.delete_volume(self.VOLUME_NAME)
- self.assertTrue(
- volumes_page.find_message_and_dismiss(messages.INFO))
- self.assertFalse(
- volumes_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ volumes_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(volumes_page.is_volume_deleted(self.VOLUME_NAME))
self.addCleanup(cleanup)
@@ -221,8 +216,8 @@ class TestVolumeSnapshotsAdvanced(helpers.TestCase):
volumes_page = self.home_pg.go_to_project_volumes_volumespage()
volumes_snapshot_page = volumes_page.create_volume_snapshot(
self.VOLUME_NAME, self.VOLUME_SNAPSHOT_NAME)
- self.assertTrue(volumes_page.find_message_and_dismiss(messages.INFO))
- self.assertFalse(volumes_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ volumes_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(volumes_snapshot_page.is_volume_snapshot_available(
self.VOLUME_SNAPSHOT_NAME))
@@ -236,19 +231,17 @@ class TestVolumeSnapshotsAdvanced(helpers.TestCase):
def delete_snapshot(self):
volumes_snapshot_page = self.volumes_snapshot_page
volumes_snapshot_page.delete_volume_snapshot(self.VOLUME_SNAPSHOT_NAME)
- self.assertTrue(
- volumes_snapshot_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- volumes_snapshot_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ volumes_snapshot_page.find_messages_and_dismiss(),
+ {messages.SUCCESS})
self.assertTrue(volumes_snapshot_page.is_volume_snapshot_deleted(
self.VOLUME_SNAPSHOT_NAME))
def delete_volume(self, new_volume):
volumes_page = self.home_pg.go_to_project_volumes_volumespage()
volumes_page.delete_volume(new_volume)
- self.assertTrue(
- volumes_page.find_message_and_dismiss(messages.INFO))
- self.assertFalse(volumes_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ volumes_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(volumes_page.is_volume_deleted(new_volume))
@pytest.mark.skipif(
diff --git a/openstack_dashboard/test/integration_tests/tests/test_volumes.py b/openstack_dashboard/test/integration_tests/tests/test_volumes.py
index 3d8727b70..52f8a715b 100644
--- a/openstack_dashboard/test/integration_tests/tests/test_volumes.py
+++ b/openstack_dashboard/test/integration_tests/tests/test_volumes.py
@@ -44,29 +44,23 @@ class TestVolumesBasic(helpers.TestCase):
"""
volumes_page = self.home_pg.go_to_project_volumes_volumespage()
volumes_page.create_volume(self.VOLUME_NAME)
- self.assertTrue(
- volumes_page.find_message_and_dismiss(messages.INFO))
- self.assertFalse(
- volumes_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ volumes_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(volumes_page.is_volume_present(self.VOLUME_NAME))
self.assertTrue(volumes_page.is_volume_status(self.VOLUME_NAME,
'Available'))
new_name = "edited_" + self.VOLUME_NAME
volumes_page.edit_volume(self.VOLUME_NAME, new_name, "description")
- self.assertTrue(
- volumes_page.find_message_and_dismiss(messages.INFO))
- self.assertFalse(
- volumes_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ volumes_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(volumes_page.is_volume_present(new_name))
self.assertTrue(volumes_page.is_volume_status(new_name, 'Available'))
volumes_page = self.volumes_page
volumes_page.delete_volume(new_name)
- self.assertTrue(
- volumes_page.find_message_and_dismiss(messages.INFO))
- self.assertFalse(
- volumes_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ volumes_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(volumes_page.is_volume_deleted(new_name))
# NOTE(tsufiev): A short regression test on bug 1553314: we try to
# re-open 'Create Volume' button after the volume was deleted. If the
@@ -107,8 +101,8 @@ class TestVolumesBasic(helpers.TestCase):
name_column='Name')
if garbage:
volumes_page.delete_volumes(garbage)
- self.assertTrue(
- volumes_page.find_message_and_dismiss(messages.INFO))
+ self.assertEqual(
+ volumes_page.find_messages_and_dismiss(), {messages.INFO})
count = 3
items_per_page = 1
@@ -116,10 +110,8 @@ class TestVolumesBasic(helpers.TestCase):
range(count)]
for volume_name in volumes_names:
volumes_page.create_volume(volume_name)
- self.assertTrue(
- volumes_page.find_message_and_dismiss(messages.INFO))
- self.assertFalse(
- volumes_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ volumes_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(volumes_page.is_volume_present(volume_name))
self.assertTrue(volumes_page.is_volume_status(volume_name,
'Available'))
@@ -135,7 +127,7 @@ class TestVolumesBasic(helpers.TestCase):
'Names': [volumes_names[0]]}
settings_page = self.home_pg.go_to_settings_usersettingspage()
settings_page.change_pagesize(items_per_page)
- settings_page.find_message_and_dismiss(messages.SUCCESS)
+ settings_page.find_messages_and_dismiss()
volumes_page = self.volumes_page
volumes_page.volumes_table.assert_definition(first_page_definition)
@@ -154,14 +146,12 @@ class TestVolumesBasic(helpers.TestCase):
settings_page = self.home_pg.go_to_settings_usersettingspage()
settings_page.change_pagesize()
- settings_page.find_message_and_dismiss(messages.SUCCESS)
+ settings_page.find_messages_and_dismiss()
volumes_page = self.volumes_page
volumes_page.delete_volumes(volumes_names)
- self.assertTrue(
- volumes_page.find_message_and_dismiss(messages.INFO))
- self.assertFalse(
- volumes_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ volumes_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(volumes_page.are_volumes_deleted(volumes_names))
@@ -200,21 +190,20 @@ class TestVolumesAdvanced(helpers.TestCase):
instance_name = helpers.gen_random_resource_name('instance')
instances_page = self.home_pg.go_to_project_compute_instancespage()
instances_page.create_instance(instance_name)
- instances_page.find_message_and_dismiss(messages.INFO)
- self.assertFalse(
- instances_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ instances_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(instances_page.is_instance_active(instance_name))
volumes_page = self.volumes_page
volumes_page.create_volume(self.VOLUME_NAME)
- volumes_page.find_message_and_dismiss(messages.INFO)
- self.assertFalse(volumes_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ volumes_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(volumes_page.is_volume_status(self.VOLUME_NAME,
'Available'))
volumes_page.attach_volume_to_instance(self.VOLUME_NAME, instance_name)
- volumes_page.find_message_and_dismiss(messages.INFO)
- self.assertFalse(volumes_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ volumes_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(volumes_page.is_volume_status(self.VOLUME_NAME,
'In-use'))
self.assertTrue(
@@ -223,21 +212,20 @@ class TestVolumesAdvanced(helpers.TestCase):
volumes_page.detach_volume_from_instance(self.VOLUME_NAME,
instance_name)
- volumes_page.find_message_and_dismiss(messages.SUCCESS)
- self.assertFalse(volumes_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ volumes_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertTrue(volumes_page.is_volume_status(self.VOLUME_NAME,
'Available'))
volumes_page.delete_volume(self.VOLUME_NAME)
- volumes_page.find_message_and_dismiss(messages.SUCCESS)
- self.assertFalse(volumes_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ volumes_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(volumes_page.is_volume_deleted(self.VOLUME_NAME))
instances_page = self.home_pg.go_to_project_compute_instancespage()
instances_page.delete_instance(instance_name)
- instances_page.find_message_and_dismiss(messages.INFO)
- self.assertFalse(
- instances_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ instances_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(instances_page.is_instance_deleted(instance_name))
@@ -258,10 +246,8 @@ class TestVolumesActions(helpers.TestCase):
super().setUp()
volumes_page = self.volumes_page
volumes_page.create_volume(self.VOLUME_NAME)
- self.assertTrue(
- volumes_page.find_message_and_dismiss(messages.INFO))
- self.assertFalse(
- volumes_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ volumes_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(volumes_page.is_volume_present(self.VOLUME_NAME))
self.assertTrue(
volumes_page.is_volume_status(self.VOLUME_NAME, 'Available'))
@@ -269,10 +255,8 @@ class TestVolumesActions(helpers.TestCase):
def cleanup():
volumes_page = self.volumes_page
volumes_page.delete_volume(self.VOLUME_NAME)
- self.assertTrue(
- volumes_page.find_message_and_dismiss(messages.INFO))
- self.assertFalse(
- volumes_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ volumes_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(
volumes_page.is_volume_deleted(self.VOLUME_NAME))
@@ -291,10 +275,8 @@ class TestVolumesActions(helpers.TestCase):
volumes_page = self.volumes_page
orig_size = volumes_page.get_size(self.VOLUME_NAME)
volumes_page.extend_volume(self.VOLUME_NAME, orig_size + 1)
- self.assertTrue(
- volumes_page.find_message_and_dismiss(messages.INFO))
- self.assertFalse(
- volumes_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ volumes_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(
volumes_page.is_volume_status(self.VOLUME_NAME, 'Available'))
new_size = volumes_page.get_size(self.VOLUME_NAME)
@@ -316,8 +298,8 @@ class TestVolumesActions(helpers.TestCase):
for disk_format in all_formats:
volumes_page.upload_volume_to_image(
self.VOLUME_NAME, self.IMAGE_NAME, disk_format)
- self.assertFalse(
- volumes_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ volumes_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(volumes_page.is_volume_status(
self.VOLUME_NAME, 'Available'))
images_page = self.images_page
@@ -326,10 +308,8 @@ class TestVolumesActions(helpers.TestCase):
self.assertEqual(images_page.get_image_format(self.IMAGE_NAME),
all_formats[disk_format])
images_page.delete_image(self.IMAGE_NAME)
- self.assertTrue(images_page.find_message_and_dismiss(
- messages.SUCCESS))
- self.assertFalse(images_page.find_message_and_dismiss(
- messages.ERROR))
+ self.assertEqual(
+ images_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertFalse(images_page.is_image_present(self.IMAGE_NAME))
volumes_page = \
self.home_pg.go_to_project_volumes_volumespage()
@@ -347,10 +327,8 @@ class TestVolumesActions(helpers.TestCase):
6. Delete instance
"""
self.volumes_page.launch_instance(self.VOLUME_NAME, self.INSTANCE_NAME)
- self.assertTrue(
- self.volumes_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- self.volumes_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ self.volumes_page.find_messages_and_dismiss(), {messages.SUCCESS})
instances_page = self.home_pg.go_to_project_compute_instancespage()
self.assertTrue(instances_page.is_instance_active(self.INSTANCE_NAME))
self.volumes_page = self.home_pg.go_to_project_volumes_volumespage()
@@ -360,9 +338,7 @@ class TestVolumesActions(helpers.TestCase):
self.volumes_page.get_attach_instance(self.VOLUME_NAME))
instances_page = self.home_pg.go_to_project_compute_instancespage()
instances_page.delete_instance(self.INSTANCE_NAME)
- self.assertTrue(
- instances_page.find_message_and_dismiss(messages.INFO))
- self.assertFalse(
- instances_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ instances_page.find_messages_and_dismiss(), {messages.INFO})
self.assertTrue(instances_page.is_instance_deleted(self.INSTANCE_NAME))
self.volumes_page = self.home_pg.go_to_project_volumes_volumespage()
diff --git a/openstack_dashboard/test/integration_tests/tests/test_volumetypes.py b/openstack_dashboard/test/integration_tests/tests/test_volumetypes.py
index 8c3cc3e7c..37b243a84 100644
--- a/openstack_dashboard/test/integration_tests/tests/test_volumetypes.py
+++ b/openstack_dashboard/test/integration_tests/tests/test_volumetypes.py
@@ -33,20 +33,14 @@ class TestAdminVolumeTypes(helpers.AdminTestCase):
volume_types_page = self.home_pg.go_to_admin_volume_volumetypespage()
volume_types_page.create_volume_type(self.VOLUME_TYPE_NAME)
-
- self.assertTrue(
- volume_types_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- volume_types_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ volume_types_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertTrue(volume_types_page.is_volume_type_present(
self.VOLUME_TYPE_NAME))
volume_types_page.delete_volume_type(self.VOLUME_TYPE_NAME)
-
- self.assertTrue(
- volume_types_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- volume_types_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ volume_types_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertTrue(volume_types_page.is_volume_type_deleted(
self.VOLUME_TYPE_NAME))
@@ -65,17 +59,13 @@ class TestQoSSpec(helpers.AdminTestCase):
qos_spec_page = self.home_pg.go_to_admin_volume_volumetypespage()
qos_spec_page.create_qos_spec(self.QOS_SPEC_NAME)
- self.assertTrue(
- qos_spec_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- qos_spec_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ qos_spec_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertTrue(qos_spec_page.is_qos_spec_present(self.QOS_SPEC_NAME))
qos_spec_page.delete_qos_specs(self.QOS_SPEC_NAME)
- self.assertTrue(
- qos_spec_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- qos_spec_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ qos_spec_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertFalse(qos_spec_page.is_qos_spec_present(self.QOS_SPEC_NAME))
def test_qos_spec_edit_consumer(self):
@@ -96,39 +86,29 @@ class TestQoSSpec(helpers.AdminTestCase):
cinder_consumer = 'back-end'
qos_spec_page.create_qos_spec(qos_spec_name)
- self.assertTrue(
- qos_spec_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- qos_spec_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ qos_spec_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertTrue(qos_spec_page.is_qos_spec_present(qos_spec_name))
qos_spec_page.edit_consumer(qos_spec_name, nova_compute_consumer)
- self.assertTrue(
- qos_spec_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- qos_spec_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ qos_spec_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertEqual(
qos_spec_page.get_consumer(qos_spec_name), nova_compute_consumer)
qos_spec_page.edit_consumer(qos_spec_name, both_consumers)
- self.assertTrue(
- qos_spec_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- qos_spec_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ qos_spec_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertEqual(
qos_spec_page.get_consumer(qos_spec_name), both_consumers)
qos_spec_page.edit_consumer(qos_spec_name, cinder_consumer)
- self.assertTrue(
- qos_spec_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- qos_spec_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ qos_spec_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertEqual(
qos_spec_page.get_consumer(qos_spec_name), cinder_consumer)
qos_spec_page.delete_qos_specs(qos_spec_name)
- self.assertTrue(
- qos_spec_page.find_message_and_dismiss(messages.SUCCESS))
- self.assertFalse(
- qos_spec_page.find_message_and_dismiss(messages.ERROR))
+ self.assertEqual(
+ qos_spec_page.find_messages_and_dismiss(), {messages.SUCCESS})
self.assertFalse(qos_spec_page.is_qos_spec_present(qos_spec_name))
diff --git a/releasenotes/source/2023.1.rst b/releasenotes/source/2023.1.rst
new file mode 100644
index 000000000..d1238479b
--- /dev/null
+++ b/releasenotes/source/2023.1.rst
@@ -0,0 +1,6 @@
+===========================
+2023.1 Series Release Notes
+===========================
+
+.. release-notes::
+ :branch: stable/2023.1
diff --git a/releasenotes/source/index.rst b/releasenotes/source/index.rst
index efe84a294..bf5e89484 100644
--- a/releasenotes/source/index.rst
+++ b/releasenotes/source/index.rst
@@ -6,6 +6,7 @@
:maxdepth: 1
unreleased
+ 2023.1
zed
yoga
xena
diff --git a/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po b/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
index aae2c34ff..f406bcc44 100644
--- a/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
+++ b/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
@@ -10,11 +10,11 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-02-06 04:52+0000\n"
+"POT-Creation-Date: 2023-03-07 08:34+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"PO-Revision-Date: 2023-02-10 12:13+0000\n"
+"PO-Revision-Date: 2023-02-03 04:35+0000\n"
"Last-Translator: Andi Chandler <andi@gowling.com>\n"
"Language-Team: English (United Kingdom)\n"
"Language: en_GB\n"
@@ -220,9 +220,6 @@ msgstr "22.2.0"
msgid "23.0.0"
msgstr "23.0.0"
-msgid "23.0.0-43"
-msgstr "23.0.0-43"
-
msgid "8.0.1"
msgstr "8.0.1"
diff --git a/releasenotes/source/locale/fr/LC_MESSAGES/releasenotes.po b/releasenotes/source/locale/fr/LC_MESSAGES/releasenotes.po
new file mode 100644
index 000000000..a4edd2273
--- /dev/null
+++ b/releasenotes/source/locale/fr/LC_MESSAGES/releasenotes.po
@@ -0,0 +1,280 @@
+# Benjamin ACH <benjamin_ach@hotmail.com>, 2016. #zanata
+# Gérald LONLAS <g.lonlas@gmail.com>, 2016. #zanata
+# Marcellin Fom Tchassem <mf6510@att.com>, 2016. #zanata
+# Cédric Savignan <liced@liced.fr>, 2017. #zanata
+# Loic Nicolle <loic.nicolle@orange.com>, 2017. #zanata
+# Marcellin Fom Tchassem <mf6510@att.com>, 2017. #zanata
+msgid ""
+msgstr ""
+"Project-Id-Version: horizon\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-03-07 08:34+0000\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"PO-Revision-Date: 2017-07-21 11:31+0000\n"
+"Last-Translator: Loic Nicolle <loic.nicolle@orange.com>\n"
+"Language-Team: French\n"
+"Language: fr\n"
+"X-Generator: Zanata 4.3.3\n"
+"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+
+msgid ""
+"(optional) Use the common Angular template as the basis of any Angular pages "
+"to minimize boilerplate code and to ensure that we use similar features/"
+"framing."
+msgstr ""
+"(Optionel) Comme base pour les pages Angular, bien vouloir utiliser le "
+"commun modèle Angular, pour minimiser la répétition des codes et s'assurer "
+"de l'utilisation de pareilles fonctionnalités."
+
+msgid "10.0.0"
+msgstr "10.0.0"
+
+msgid "10.0.1"
+msgstr "10.0.1"
+
+msgid "10.0.2"
+msgstr "10.0.2"
+
+msgid "11.0.0"
+msgstr "11.0.0"
+
+msgid "11.0.3"
+msgstr "11.0.3"
+
+msgid "8.0.1"
+msgstr "8.0.1"
+
+msgid "9.0.0"
+msgstr "9.0.0"
+
+msgid "9.1.0"
+msgstr "9.1.0"
+
+msgid ""
+"A Descriptor concept allows convenient passing of information that can "
+"globally identify an object, for use in generic views and actions."
+msgstr ""
+"Un concept descripteur permet le passage adéquat d'informations qui peuvent "
+"globalement identifier un objet, pour usage dans les vues et actions "
+"communes."
+
+msgid ""
+"A Details page for a resource type (e.g. Images) may now use the Angular "
+"application-level registry to register views so developers may easily create "
+"or extend details views. In this implementation these views are presented as "
+"tabs within the Details page."
+msgstr ""
+"Une page détaillée pour un type particulier de ressource (I.e. Images) peut "
+"maintenant utiliser une application Angular de niveau registre, pour "
+"enregistrer les vues et permettre aux développeurs de facilement créer ou "
+"ajouter des vues détaillées. Dans cette implementation, ces vues sont "
+"presentées sous forme d'onglets au sein de pages détaillées."
+
+#, fuzzy
+msgid ""
+"A directive (hz-details) provides the ability to intelligently display a set "
+"of views (typically for a Details context)."
+msgstr ""
+"Une directive (hz-details) permet d'afficher intelligemment un ensemble de "
+"vues (généralement pour un contexte Détails)."
+
+#, fuzzy
+msgid ""
+"A generic Details display parses the location to determine the resource "
+"type, and displays relevant details views for that type."
+msgstr ""
+"Un affichage générique Details analyse l'emplacement pour déterminer le type "
+"de ressource et affiche des vues de détails pertinentes pour ce type."
+
+msgid ""
+"A new Profiler panel in the Developer dashboard is introduced. It integrates "
+"`osprofiler library <http://docs.openstack.org/developer/osprofiler/>`_ into "
+"horizon, thus implementing `blueprint openstack-profiler-at-developer-"
+"dashboard <https://blueprints.launchpad.net/horizon/+spec/openstack-profiler-"
+"at-developer-dashboard>`_. Initially profiler is disabled. To enable it the "
+"value ``OPENSTACK_PROFILER['enabled']`` has to be ``True``. This in turn can "
+"be achieved by copying files _9030_profiler_settings.py.example and "
+"_9030_profiler.py to openstack_dashboard/local/local_settings.d/"
+"_9030_profiler_settings.py and openstack_dashboard/local/enabled/"
+"_9030_profiler.py respectively. Also, by default it expects MongoDB cluster "
+"to be present on the same host where Keystone is located (say, in a Devstack "
+"VM). But it also can be configured with params with "
+"``OPENSTACK_PROFILER['notifier_connection_string]'`` and "
+"``OPENSTACK_PROFILER['receiver_connection_string']`` values. MongoDB should "
+"be installed `manually <https://docs.mongodb.com/manual/tutorial/install-"
+"mongodb-on-ubuntu/#install-mongodb-community-edition>`_ and allowed to "
+"receive requests on 0.0.0.0 interface."
+msgstr "Un nouveau panneau profileur"
+
+msgid "A shared Django template is now available for use by any Angular page."
+msgstr ""
+"Un modèle partagé de Django est maintenant disponible pour usage par toute "
+"page Angular."
+
+msgid ""
+"ANGULAR_FEATURES now allows for a key 'flavors_panel' to be specified as "
+"True or False indicating whether the Angular version of the panel is enabled."
+msgstr ""
+"ANGULAR_FEATURES permet désormais de spécifier une clé 'flavors_panel' comme "
+"vrai ou Faux, indiquant si la version Angular du panneau est active."
+
+msgid ""
+"Add a new setting OVERVIEW_DAYS_RANGE. It defines the default date range in "
+"the Overview panel meters - either today minus N days (if the value is "
+"integer N), or from the beginning of the current month until today (if set "
+"to None). This setting is be used to limit the amount of data fetched by "
+"default when rendering the Overview panel. The default value is 1, which "
+"differs from the past behaviour, since it caused serious lags on large "
+"deployments."
+msgstr ""
+"Ajouter une nouvelle configuration OVERVIEW_DAYS_RANGE. Elle définit "
+"l'intervalle par défaut de la date dans l'aperçu du panneau de compteurs - "
+"soit le jour courant moins N jours (si la valeur est l'entier N), soit du "
+"début du mois courant jusqu'au jour courant (si la valeur est fixée à None). "
+"Cette configuration est utilisée pour limiter la quantité de données "
+"établies par défaut lors de l'affichage de l'aperçu. La valeur par défaut "
+"est 1, laquelle est différente du comportement précédent, puisqu'elle "
+"causait d'importants décalages au cours de larges déploiements."
+
+msgid ""
+"Added ESLint for JavaScript linting, using the eslint-config-openstack "
+"rules. See `this <https://blueprints.launchpad.net/horizon/+spec/jscs-"
+"cleanup>`__ for more details."
+msgstr ""
+"Ajout de ESLint pour les listes JavaScript, utilisant les règles reslint-"
+"config-openstack. Voir `this <https://blueprints.launchpad.net/horizon/+spec/"
+"jscs-cleanup>`__ pour plus de détails."
+
+msgid ""
+"Added Karma for JavaScript testing. See `this <https://blueprints.launchpad."
+"net/horizon/+spec/karma>`__ for more details."
+msgstr ""
+"Ajout de Karma pour les tests de JavaScript. Voir `this <https://blueprints."
+"launchpad.net/horizon/+spec/karma>`__ pour plus de détails."
+
+msgid ""
+"Added Keystone to Keystone (K2K) federation support in Horizon. If Keystone "
+"is configured with K2K and has service providers, the list of Keystone "
+"providers will appear in a dropdown. In local_settings.py you can optionally "
+"set the identity provider display name with ``KEYSTONE_PROVIDER_IDP_NAME`` "
+"or set the provider id that is used to compare with the other service "
+"providers ``KEYSTONE_PROVIDER_IDP_ID``. [`blueprint k2k-horizon <https://"
+"blueprints.launchpad.net/horizon/+spec/k2k-horizon>`_]."
+msgstr ""
+"Ajout du support de Kestone to Keystone (K2K) federation dans Horizon. Si "
+"Keystone est configuré avec K2K et possède des fournisseurs de services, la "
+"liste des fournisseurs de Keystone apparaîtra dans un menu déroulant. Dans "
+"local_settings.py vous pouvez optionnellement définir l'affichage du nom du "
+"service identité avec ``KEYSTONE_PROVIDER_IDP_NAME`` ou définir l'id du "
+"fournisseur utilisé pour comparer avec d'autres fournisseurs de services "
+"``KEYSTONE_PROVIDER_IDP_ID``. [`blueprint k2k-horizon <https://blueprints."
+"launchpad.net/horizon/+spec/k2k-horizon>`_]."
+
+msgid ""
+"Added a new ``ANGULAR FEATURES`` dictionary to the settings. This allows "
+"simple toggling of new AngularJS features."
+msgstr ""
+"Ajout d'un nouveau dictionnaire ``ANGULAR FEATURES`` pour le paramétrage. "
+"Ceci permet l'activation de nouvelles fonctionnalités AngularJS."
+
+msgid ""
+"Added actions to easily associate LBaaS VIP with a floating IP. See `this "
+"<https://blueprints.launchpad.net/horizon/+spec/lbaas-vip-fip-associate>`__ "
+"for more details."
+msgstr ""
+"Ajout d'actions pour facilement associer LBaaS VIP avec une IP flottante. "
+"Voir `ici <https://blueprints.launchpad.net/horizon/+spec/lbaas-vip-fip-"
+"associate>`__ pour plus de détails."
+
+msgid "Added mapping for Identity Provider and Protocol specific WebSSO."
+msgstr ""
+"Ajout du mappage pour les fournisseurs d'identité et le protocoles "
+"spécifique WebSSO."
+
+msgid "Added new Trove features."
+msgstr "Ajout des nouvelles fonctionnalités de Trove."
+
+msgid "Added support for shell job types and multiple Sahara improvements."
+msgstr ""
+"Ajout du support pour les jobs shell ainsi que plusieurs améliorations de "
+"Sahara."
+
+msgid "Added the Update Encryption action for encrypted volume types."
+msgstr ""
+"Ajout de l'action mise à jour du cryptage pour les types de volume cryptés."
+
+msgid ""
+"Allow to override settings from local_settings.py with file snippets dropped "
+"into local_settings.d/ directory."
+msgstr ""
+"Permet de remplacer les configurations du fichier local_settings.py par des "
+"fragments de fichier supprimés du fichier local_settings.d/ directory."
+
+msgid ""
+"Allows to attach ports during instance launch <https://blueprints.launchpad."
+"net/horizon/+spec/allow-launching-ports>"
+msgstr ""
+"Permets de connecter les ports lors du lancement de l'instance <https://"
+"blueprints.launchpad.net/horizon/+spec/allow-launching-ports>"
+
+msgid ""
+"Although it's not required, it's best to make your actions return promises "
+"with the expected structure."
+msgstr ""
+"Quoique pas requis, il serait mieux de faire retourner des promises par vos "
+"actions avec la structure prévue."
+
+msgid ""
+"An action-result service provides convenience methods for construction of "
+"the result, and for parsing of a resolved object"
+msgstr ""
+"Un service action-résultat fournit les méthodes adéquates pour la "
+"construction du résultat, et pour l'analyse d'un objet résolu"
+
+msgid ""
+"Angular actions now should return a promise that resolves with an object "
+"structured in a way to indicate what the action did (or didn't do)."
+msgstr ""
+"Les actions Angular devraient retourner une promise qui s'ajuste en fonction "
+"d'un objet structuré tel qu'il puisse indiquer le résultat de l'action."
+
+msgid ""
+"Angular components now exist to provide simple-to- configure panels and "
+"tables, based off of registry information about resources (e.g. Instances)."
+msgstr ""
+"Les composants Angular serviront à fournir de simples-à-configurés panneaux "
+"et tables, basés sur un registre d'informations sur les resources (i.e. "
+"Instances)."
+
+msgid "Bug Fixes"
+msgstr "Résolutions de Bugs"
+
+msgid ""
+"Cinder defines storage size in gibibytes (GiB), which is inconsistent with "
+"Horizon panels that show/request storage size in gigabytes (GB)."
+msgstr ""
+"Cinder définit la taille de stockage en gibibytes (GiB), laquelle est "
+"consistante avec les panneaux de Horizon qui montrent/demandent la taille de "
+"stockage en gigabytes (GB)."
+
+msgid "Cloud Admin - View and manage identity resources across domains"
+msgstr ""
+"Administrateur du cloud - Afficher et gérer les resources identitaires à "
+"travers les domaines"
+
+msgid "Current Series Release Notes"
+msgstr "Note de la release actuelle"
+
+msgid "Deprecation Notes"
+msgstr "Notes dépréciées "
+
+msgid "Liberty Series Release Notes"
+msgstr "Note de release pour Liberty"
+
+msgid "Mitaka Series Release Notes"
+msgstr "Note de release pour Mitaka"
+
+msgid "Newton Series Release Notes"
+msgstr "Note de release pour Newton"