diff options
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" |