Merge "Implement system scoped RBAC for volume APIs"

This commit is contained in:
Zuul 2021-02-23 15:11:53 +00:00 committed by Gerrit Code Review
commit 9760e66f83
4 changed files with 142 additions and 88 deletions

View File

@ -1062,41 +1062,92 @@ utility_policies = [
),
]
deprecated_volume_get = policy.DeprecatedRule(
name='baremetal:volume:get',
check_str='rule:is_admin or rule:is_observer'
)
deprecated_volume_create = policy.DeprecatedRule(
name='baremetal:volume:create',
check_str='rule:is_admin'
)
deprecated_volume_delete = policy.DeprecatedRule(
name='baremetal:volume:delete',
check_str='rule:is_admin'
)
deprecated_volume_update = policy.DeprecatedRule(
name='baremetal:volume:update',
check_str='rule:is_admin'
)
deprecated_volume_reason = """
The baremetal volume API is now aware of system scope and default
roles.
"""
volume_policies = [
policy.DocumentedRuleDefault(
'baremetal:volume:get',
'rule:is_admin or rule:is_observer',
'Retrieve Volume connector and target records',
[{'path': '/volume', 'method': 'GET'},
{'path': '/volume/connectors', 'method': 'GET'},
{'path': '/volume/connectors/{volume_connector_id}', 'method': 'GET'},
{'path': '/volume/targets', 'method': 'GET'},
{'path': '/volume/targets/{volume_target_id}', 'method': 'GET'},
{'path': '/nodes/{node_ident}/volume', 'method': 'GET'},
{'path': '/nodes/{node_ident}/volume/connectors', 'method': 'GET'},
{'path': '/nodes/{node_ident}/volume/targets', 'method': 'GET'}]),
name='baremetal:volume:get',
check_str=SYSTEM_READER,
scope_types=['system'],
description='Retrieve Volume connector and target records',
operations=[
{'path': '/volume', 'method': 'GET'},
{'path': '/volume/connectors', 'method': 'GET'},
{'path': '/volume/connectors/{volume_connector_id}',
'method': 'GET'},
{'path': '/volume/targets', 'method': 'GET'},
{'path': '/volume/targets/{volume_target_id}', 'method': 'GET'},
{'path': '/nodes/{node_ident}/volume', 'method': 'GET'},
{'path': '/nodes/{node_ident}/volume/connectors', 'method': 'GET'},
{'path': '/nodes/{node_ident}/volume/targets', 'method': 'GET'}
],
deprecated_rule=deprecated_volume_get,
deprecated_reason=deprecated_volume_reason,
deprecated_since=versionutils.deprecated.WALLABY
),
policy.DocumentedRuleDefault(
'baremetal:volume:create',
'rule:is_admin',
'Create Volume connector and target records',
[{'path': '/volume/connectors', 'method': 'POST'},
{'path': '/volume/targets', 'method': 'POST'}]),
name='baremetal:volume:create',
check_str=SYSTEM_MEMBER,
scope_types=['system'],
description='Create Volume connector and target records',
operations=[
{'path': '/volume/connectors', 'method': 'POST'},
{'path': '/volume/targets', 'method': 'POST'}
],
deprecated_rule=deprecated_volume_create,
deprecated_reason=deprecated_volume_reason,
deprecated_since=versionutils.deprecated.WALLABY
),
policy.DocumentedRuleDefault(
'baremetal:volume:delete',
'rule:is_admin',
'Delete Volume connector and target records',
[{'path': '/volume/connectors/{volume_connector_id}',
'method': 'DELETE'},
{'path': '/volume/targets/{volume_target_id}',
'method': 'DELETE'}]),
name='baremetal:volume:delete',
check_str=SYSTEM_MEMBER,
scope_types=['system'],
description='Delete Volume connector and target records',
operations=[
{'path': '/volume/connectors/{volume_connector_id}',
'method': 'DELETE'},
{'path': '/volume/targets/{volume_target_id}',
'method': 'DELETE'}
],
deprecated_rule=deprecated_volume_delete,
deprecated_reason=deprecated_volume_reason,
deprecated_since=versionutils.deprecated.WALLABY
),
policy.DocumentedRuleDefault(
'baremetal:volume:update',
'rule:is_admin',
'Update Volume connector and target records',
[{'path': '/volume/connectors/{volume_connector_id}',
'method': 'PATCH'},
{'path': '/volume/targets/{volume_target_id}',
'method': 'PATCH'}]),
name='baremetal:volume:update',
check_str=SYSTEM_MEMBER,
scope_types=['system'],
description='Update Volume connector and target records',
operations=[
{'path': '/volume/connectors/{volume_connector_id}',
'method': 'PATCH'},
{'path': '/volume/targets/{volume_target_id}',
'method': 'PATCH'}
],
deprecated_rule=deprecated_volume_update,
deprecated_reason=deprecated_volume_reason,
deprecated_since=versionutils.deprecated.WALLABY
),
]
conductor_policies = [

View File

@ -1270,18 +1270,21 @@ volume_get_admin:
method: get
headers: *admin_headers
assert_status: 200
deprecated: true
volume_get_member:
path: '/v1/volume'
method: get
headers: *member_headers
assert_status: 403
deprecated: true
volume_get_observer:
path: '/v1/volume'
method: get
headers: *observer_headers
assert_status: 200
deprecated: true
# Volume connectors
@ -1290,18 +1293,21 @@ volume_connectors_get_admin:
method: get
headers: *admin_headers
assert_status: 200
deprecated: true
volume_connectors_get_member:
path: '/v1/volume/connectors'
method: get
headers: *member_headers
assert_status: 403
deprecated: true
volume_connectors_get_observer:
path: '/v1/volume/connectors'
method: get
headers: *observer_headers
assert_status: 200
deprecated: true
# NOTE(TheJulia): This ends up returning a 400 due to the
# UUID not already being in ironic.
@ -1314,6 +1320,7 @@ volume_connectors_post_admin:
node_uuid: 68a552fb-dcd2-43bf-9302-e4c93287be16
type: ip
connector_id: 192.168.1.100
deprecated: true
volume_connectors_post_member:
path: '/v1/volume/connectors'
@ -1321,6 +1328,7 @@ volume_connectors_post_member:
headers: *member_headers
assert_status: 403
body: *volume_connector_body
deprecated: true
volume_connectors_post_observer:
path: '/v1/volume/connectors'
@ -1328,24 +1336,28 @@ volume_connectors_post_observer:
headers: *observer_headers
assert_status: 403
body: *volume_connector_body
deprecated: true
volume_volume_connector_id_get_admin:
path: '/v1/volume/connectors/{volume_connector_ident}'
method: get
headers: *admin_headers
assert_status: 200
deprecated: true
volume_volume_connector_id_get_member:
path: '/v1/volume/connectors/{volume_connector_ident}'
method: get
headers: *member_headers
assert_status: 403
deprecated: true
volume_volume_connector_id_get_observer:
path: '/v1/volume/connectors/{volume_connector_ident}'
method: get
headers: *observer_headers
assert_status: 200
deprecated: true
volume_volume_connector_id_patch_admin:
path: '/v1/volume/connectors/{volume_connector_ident}'
@ -1356,6 +1368,7 @@ volume_volume_connector_id_patch_admin:
path: /extra
value: {'test': 'testing'}
assert_status: 503
deprecated: true
volume_volume_connector_id_patch_member:
path: '/v1/volume/connectors/{volume_connector_ident}'
@ -1363,6 +1376,7 @@ volume_volume_connector_id_patch_member:
headers: *member_headers
body: *connector_patch_body
assert_status: 403
deprecated: true
volume_volume_connector_id_patch_observer:
path: '/v1/volume/connectors/{volume_connector_ident}'
@ -1370,24 +1384,28 @@ volume_volume_connector_id_patch_observer:
headers: *observer_headers
body: *connector_patch_body
assert_status: 403
deprecated: true
volume_volume_connector_id_delete_admin:
path: '/v1/volume/connectors/{volume_connector_ident}'
method: delete
headers: *admin_headers
assert_status: 503
deprecated: true
volume_volume_connector_id_delete_member:
path: '/v1/volume/connectors/{volume_connector_ident}'
method: delete
headers: *member_headers
assert_status: 403
deprecated: true
volume_volume_connector_id_delete_observer:
path: '/v1/volume/connectors/{volume_connector_ident}'
method: delete
headers: *observer_headers
assert_status: 403
deprecated: true
# Volume targets
@ -1396,11 +1414,13 @@ volume_targets_get_admin:
method: get
headers: *admin_headers
assert_status: 200
deprecated: true
volume_targets_get_member:
path: '/v1/volume/targets'
method: get
headers: *member_headers
deprecated: true
assert_status: 403
volume_targets_get_observer:
@ -1408,6 +1428,7 @@ volume_targets_get_observer:
method: get
headers: *observer_headers
assert_status: 200
deprecated: true
# NOTE(TheJulia): Because we can't seem to get the uuid
# to load from an existing uuid, since we're not subsituting
@ -1422,6 +1443,7 @@ volume_targets_post_admin:
volume_type: iscsi
boot_index: 0
volume_id: 'test-id'
deprecated: true
volume_targets_post_member:
path: '/v1/volume/targets'
@ -1429,6 +1451,7 @@ volume_targets_post_member:
headers: *member_headers
assert_status: 403
body: *volume_target_body
deprecated: true
volume_targets_post_observer:
path: '/v1/volume/targets'
@ -1436,24 +1459,28 @@ volume_targets_post_observer:
headers: *observer_headers
assert_status: 403
body: *volume_target_body
deprecated: true
volume_volume_target_id_get_admin:
path: '/v1/volume/targets/{volume_target_ident}'
method: get
headers: *admin_headers
assert_status: 200
deprecated: true
volume_volume_target_id_get_member:
path: '/v1/volume/targets/{volume_target_ident}'
method: get
headers: *member_headers
assert_status: 403
deprecated: true
volume_volume_target_id_get_observer:
path: '/v1/volume/targets/{volume_target_ident}'
method: get
headers: *observer_headers
assert_status: 200
deprecated: true
volume_volume_target_id_patch_admin:
path: '/v1/volume/targets/{volume_target_ident}'
@ -1464,6 +1491,7 @@ volume_volume_target_id_patch_admin:
value: {'test': 'testing'}
headers: *admin_headers
assert_status: 503
deprecated: true
volume_volume_target_id_patch_admin:
path: '/v1/volume/targets/{volume_target_ident}'
@ -1471,6 +1499,7 @@ volume_volume_target_id_patch_admin:
body: *volume_target_patch
headers: *member_headers
assert_status: 403
deprecated: true
volume_volume_target_id_patch_observer:
path: '/v1/volume/targets/{volume_target_ident}'
@ -1478,24 +1507,28 @@ volume_volume_target_id_patch_observer:
body: *volume_target_patch
headers: *observer_headers
assert_status: 403
deprecated: true
volume_volume_target_id_delete_admin:
path: '/v1/volume/targets/{volume_target_ident}'
method: delete
headers: *admin_headers
assert_status: 503
deprecated: true
volume_volume_target_id_delete_member:
path: '/v1/volume/targets/{volume_target_ident}'
method: delete
headers: *member_headers
assert_status: 403
deprecated: true
volume_volume_target_id_delete_observer:
path: '/v1/volume/targets/{volume_target_ident}'
method: delete
headers: *observer_headers
assert_status: 403
deprecated: true
# Get Volumes by Node - https://docs.openstack.org/api-ref/baremetal/#listing-volume-resources-by-node-nodes-volume
@ -1504,54 +1537,63 @@ nodes_volume_get_admin:
method: get
headers: *admin_headers
assert_status: 200
deprecated: true
nodes_volume_get_member:
path: '/v1/nodes/{node_ident}/volume'
method: get
headers: *member_headers
assert_status: 403
deprecated: true
nodes_volume_get_observer:
path: '/v1/nodes/{node_ident}/volume'
method: get
headers: *observer_headers
assert_status: 200
deprecated: true
nodes_volume_connectors_get_admin:
path: '/v1/nodes/{node_ident}/volume/connectors'
method: get
headers: *admin_headers
assert_status: 200
deprecated: true
nodes_volume_connectors_get_member:
path: '/v1/nodes/{node_ident}/volume/connectors'
method: get
headers: *member_headers
assert_status: 403
deprecated: true
nodes_volume_connectors_get_observer:
path: '/v1/nodes/{node_ident}/volume/connectors'
method: get
headers: *observer_headers
assert_status: 200
deprecated: true
nodes_volume_targets_get_admin:
path: '/v1/nodes/{node_ident}/volume/targets'
method: get
headers: *admin_headers
assert_status: 200
deprecated: true
nodes_volume_targets_get_member:
path: '/v1/nodes/{node_ident}/volume/targets'
method: get
headers: *member_headers
assert_status: 403
deprecated: true
nodes_volume_targets_get_observer:
path: '/v1/nodes/{node_ident}/volume/targets'
method: get
headers: *observer_headers
assert_status: 200
deprecated: true
# Drivers - https://docs.openstack.org/api-ref/baremetal/#drivers-drivers

View File

@ -1100,21 +1100,18 @@ volume_get_admin:
method: get
headers: *admin_headers
assert_status: 200
skip_reason: not updated for scope testing
volume_get_member:
path: '/v1/volume'
method: get
headers: *scoped_member_headers
assert_status: 403
skip_reason: not updated for scope testing
assert_status: 200
volume_get_observer:
path: '/v1/volume'
method: get
headers: *observer_headers
assert_status: 200
skip_reason: not updated for scope testing
# Volume connectors
@ -1123,23 +1120,20 @@ volume_connectors_get_admin:
method: get
headers: *admin_headers
assert_status: 200
skip_reason: not updated for scope testing
volume_connectors_get_member:
path: '/v1/volume/connectors'
method: get
headers: *scoped_member_headers
assert_status: 403
skip_reason: not updated for scope testing
assert_status: 200
volume_connectors_get_observer:
path: '/v1/volume/connectors'
method: get
headers: *observer_headers
assert_status: 200
skip_reason: not updated for scope testing
# NOTE(TheJulia): This ends up returning a 403 due to the
# NOTE(TheJulia): This ends up returning a 400 due to the
# UUID not already being in ironic.
volume_connectors_post_admin:
path: '/v1/volume/connectors'
@ -1150,15 +1144,15 @@ volume_connectors_post_admin:
node_uuid: 68a552fb-dcd2-43bf-9302-e4c93287be16
type: ip
connector_id: 192.168.1.100
skip_reason: not updated for scope testing
# If nova-compute is to operate as member rights, it needs to be able
# to add volumes.
volume_connectors_post_member:
path: '/v1/volume/connectors'
method: post
headers: *scoped_member_headers
assert_status: 403
assert_status: 400
body: *volume_connector_body
skip_reason: not updated for scope testing
volume_connectors_post_observer:
path: '/v1/volume/connectors'
@ -1166,28 +1160,24 @@ volume_connectors_post_observer:
headers: *observer_headers
assert_status: 403
body: *volume_connector_body
skip_reason: not updated for scope testing
volume_volume_connector_id_get_admin:
path: '/v1/volume/connectors/{volume_connector_ident}'
method: get
headers: *admin_headers
assert_status: 200
skip_reason: not updated for scope testing
volume_volume_connector_id_get_member:
path: '/v1/volume/connectors/{volume_connector_ident}'
method: get
headers: *scoped_member_headers
assert_status: 403
skip_reason: not updated for scope testing
assert_status: 200
volume_volume_connector_id_get_observer:
path: '/v1/volume/connectors/{volume_connector_ident}'
method: get
headers: *observer_headers
assert_status: 200
skip_reason: not updated for scope testing
volume_volume_connector_id_patch_admin:
path: '/v1/volume/connectors/{volume_connector_ident}'
@ -1198,15 +1188,13 @@ volume_volume_connector_id_patch_admin:
path: /extra
value: {'test': 'testing'}
assert_status: 503
skip_reason: not updated for scope testing
volume_volume_connector_id_patch_member:
path: '/v1/volume/connectors/{volume_connector_ident}'
method: patch
headers: *scoped_member_headers
body: *connector_patch_body
assert_status: 403
skip_reason: not updated for scope testing
assert_status: 503
volume_volume_connector_id_patch_observer:
path: '/v1/volume/connectors/{volume_connector_ident}'
@ -1214,28 +1202,24 @@ volume_volume_connector_id_patch_observer:
headers: *observer_headers
body: *connector_patch_body
assert_status: 403
skip_reason: not updated for scope testing
volume_volume_connector_id_delete_admin:
path: '/v1/volume/connectors/{volume_connector_ident}'
method: delete
headers: *admin_headers
assert_status: 503
skip_reason: not updated for scope testing
volume_volume_connector_id_delete_member:
path: '/v1/volume/connectors/{volume_connector_ident}'
method: delete
headers: *scoped_member_headers
assert_status: 403
skip_reason: not updated for scope testing
assert_status: 503
volume_volume_connector_id_delete_observer:
path: '/v1/volume/connectors/{volume_connector_ident}'
method: delete
headers: *observer_headers
assert_status: 403
skip_reason: not updated for scope testing
# Volume targets
@ -1244,21 +1228,18 @@ volume_targets_get_admin:
method: get
headers: *admin_headers
assert_status: 200
skip_reason: not updated for scope testing
volume_targets_get_member:
path: '/v1/volume/targets'
method: get
headers: *scoped_member_headers
assert_status: 403
skip_reason: not updated for scope testing
assert_status: 200
volume_targets_get_observer:
path: '/v1/volume/targets'
method: get
headers: *observer_headers
assert_status: 200
skip_reason: not updated for scope testing
# NOTE(TheJulia): Because we can't seem to get the uuid
# to load from an existing uuid, since we're not subsituting
@ -1273,15 +1254,13 @@ volume_targets_post_admin:
volume_type: iscsi
boot_index: 0
volume_id: 'test-id'
skip_reason: not updated for scope testing
volume_targets_post_member:
path: '/v1/volume/targets'
method: post
headers: *scoped_member_headers
assert_status: 403
assert_status: 400
body: *volume_target_body
skip_reason: not updated for scope testing
volume_targets_post_observer:
path: '/v1/volume/targets'
@ -1289,28 +1268,24 @@ volume_targets_post_observer:
headers: *observer_headers
assert_status: 403
body: *volume_target_body
skip_reason: not updated for scope testing
volume_volume_target_id_get_admin:
path: '/v1/volume/targets/{volume_target_ident}'
method: get
headers: *admin_headers
assert_status: 200
skip_reason: not updated for scope testing
volume_volume_target_id_get_member:
path: '/v1/volume/targets/{volume_target_ident}'
method: get
headers: *scoped_member_headers
assert_status: 403
skip_reason: not updated for scope testing
assert_status: 200
volume_volume_target_id_get_observer:
path: '/v1/volume/targets/{volume_target_ident}'
method: get
headers: *observer_headers
assert_status: 200
skip_reason: not updated for scope testing
# NOTE(TheJulia): This triggers a call to the conductor and
# thus will fail, but does not return a 403 which means success.
@ -1323,15 +1298,13 @@ volume_volume_target_id_patch_admin:
value: {'test': 'testing'}
headers: *admin_headers
assert_status: 503
skip_reason: not updated for scope testing
volume_volume_target_id_patch_admin:
path: '/v1/volume/targets/{volume_target_ident}'
method: patch
body: *volume_target_patch
headers: *scoped_member_headers
assert_status: 403
skip_reason: not updated for scope testing
assert_status: 503
volume_volume_target_id_patch_observer:
path: '/v1/volume/targets/{volume_target_ident}'
@ -1339,28 +1312,24 @@ volume_volume_target_id_patch_observer:
body: *volume_target_patch
headers: *observer_headers
assert_status: 403
skip_reason: not updated for scope testing
volume_volume_target_id_delete_admin:
path: '/v1/volume/targets/{volume_target_ident}'
method: delete
headers: *admin_headers
assert_status: 503
skip_reason: not updated for scope testing
volume_volume_target_id_delete_member:
path: '/v1/volume/targets/{volume_target_ident}'
method: delete
headers: *scoped_member_headers
assert_status: 403
skip_reason: not updated for scope testing
assert_status: 503
volume_volume_target_id_delete_observer:
path: '/v1/volume/targets/{volume_target_ident}'
method: delete
headers: *observer_headers
assert_status: 403
skip_reason: not updated for scope testing
# Get Volumes by Node - https://docs.openstack.org/api-ref/baremetal/#listing-volume-resources-by-node-nodes-volume
@ -1369,63 +1338,54 @@ nodes_volume_get_admin:
method: get
headers: *admin_headers
assert_status: 200
skip_reason: not updated for scope testing
nodes_volume_get_member:
path: '/v1/nodes/{node_ident}/volume'
method: get
headers: *scoped_member_headers
assert_status: 403
skip_reason: not updated for scope testing
assert_status: 200
nodes_volume_get_observer:
path: '/v1/nodes/{node_ident}/volume'
method: get
headers: *observer_headers
assert_status: 200
skip_reason: not updated for scope testing
nodes_volume_connectors_get_admin:
path: '/v1/nodes/{node_ident}/volume/connectors'
method: get
headers: *admin_headers
assert_status: 200
skip_reason: not updated for scope testing
nodes_volume_connectors_get_member:
path: '/v1/nodes/{node_ident}/volume/connectors'
method: get
headers: *scoped_member_headers
assert_status: 403
skip_reason: not updated for scope testing
assert_status: 200
nodes_volume_connectors_get_observer:
path: '/v1/nodes/{node_ident}/volume/connectors'
method: get
headers: *observer_headers
assert_status: 200
skip_reason: not updated for scope testing
nodes_volume_targets_get_admin:
path: '/v1/nodes/{node_ident}/volume/targets'
method: get
headers: *admin_headers
assert_status: 200
skip_reason: not updated for scope testing
nodes_volume_targets_get_member:
path: '/v1/nodes/{node_ident}/volume/targets'
method: get
headers: *scoped_member_headers
assert_status: 403
skip_reason: not updated for scope testing
assert_status: 200
nodes_volume_targets_get_observer:
path: '/v1/nodes/{node_ident}/volume/targets'
method: get
headers: *observer_headers
assert_status: 200
skip_reason: not updated for scope testing
# Drivers - https://docs.openstack.org/api-ref/baremetal/#drivers-drivers

View File

@ -3,7 +3,8 @@ features:
- |
The Baremetal API, provided by the ironic-api process, now supports use of
``system`` scoped ``keystone`` authentication for the following endpoints:
nodes, ports, portgroups, chassis, drivers, vendor passthru.
nodes, ports, portgroups, chassis, drivers, driver vendor passthru,
volume targets, volume connectors
upgrade:
- |
Deprecated policy rules are not expressed via a default policy file