Expose `user visible
` extra specs
so that regular users can know the abstract back end independent capabilities and features in volume types. Implements: https://blueprints.launchpad.net/cinder/+spec/expose-user-visible-extra-specs APIImpact DocImpact Co-Authored-By: Tom Barron <tpb@dyncloud.net> Co-Authored-By: Alan Bishop <abishop@redhat.com> Change-Id: Id236326dca9ee08aad8427ea6cb400e25e7ac09e
This commit is contained in:
parent
eff52b7353
commit
7d0785fa5a
433
specs/xena/expose-cinder-user-visible-extra-specs-spec.rst
Normal file
433
specs/xena/expose-cinder-user-visible-extra-specs-spec.rst
Normal file
@ -0,0 +1,433 @@
|
||||
..
|
||||
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||
License.
|
||||
|
||||
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||
|
||||
=================================================
|
||||
Expose user-visible extra specs in volume types
|
||||
=================================================
|
||||
|
||||
https://blueprints.launchpad.net/cinder/+spec/expose-user-visible-extra-specs
|
||||
|
||||
This spec proposes definition of a class of *user visible* extra specs.
|
||||
These will be shown to regular users (members or readers in a keystone
|
||||
project) when they list extra specs or show volume types or extra specs.
|
||||
|
||||
Problem description
|
||||
-------------------
|
||||
|
||||
Cinder only allows cloud administrators to see the extra specs in volume
|
||||
types. This makes sense for specs that control knobs for use by drivers,
|
||||
that select a particular backend, or that would otherwise reveal backend
|
||||
specifics. But it is problematic for backend independent extra specs
|
||||
like ``multiattach`` or ``RESKEY:availability_zones`` – specs that
|
||||
carry critical information for regular users when they select volume
|
||||
types to use as they create volumes.
|
||||
|
||||
The traditional response to this problem has been that cloud
|
||||
administrators should add this critical information to the volume-type
|
||||
``description`` field or provide it in the user documentation for their
|
||||
cloud.
|
||||
|
||||
Whatever one thinks of the adequacy of that response when the cloud
|
||||
users are human beings, it clearly fails when the end user is an
|
||||
automated agent.
|
||||
|
||||
Use Cases
|
||||
---------
|
||||
|
||||
OpenShift cluster storage operators are automated agents that set up
|
||||
Kubernetes Storage Classes on underlying infrastructure. When that
|
||||
infrastructure is provided by OpenStack, the Cinder CSI operator will
|
||||
create a Storage Class corresponding to each Cinder volume type.
|
||||
OpenShift users in turn reference these Storage Classes in Persistent
|
||||
Volume Claims when dynamically provisioning Persistent Volumes for use
|
||||
by containerized applications.
|
||||
|
||||
When provisioning a persistent volume via Cinder CSI with ReadWriteMany
|
||||
access mode, the persistent volume claim should specify ``block``
|
||||
volumeMode (default is ``filesystem``) and reference a Storage Class
|
||||
corresponding to a Cinder volume type with a ``"multiattach": "<is> True"``
|
||||
extra spec.
|
||||
|
||||
Because OpenShift administrators and all the software that runs on their
|
||||
behalf are in the general case just regular OpenStack users rather
|
||||
than OpenStack administrators, they currently lack the ability to
|
||||
discover extra specs for volume types corresponding to their Storage
|
||||
Classes and are hindered in their ability to “do the right thing” for
|
||||
OpenShift users.
|
||||
|
||||
Cinder CSI now has a ``topology`` feature as well where it will likely
|
||||
make sense to be able to see ``RESKEY:availability_zones`` extra specs when
|
||||
setting up Storage Classes corresponding to volume types.
|
||||
|
||||
Proposed change
|
||||
---------------
|
||||
|
||||
Define a set of ``user visible`` extra specs in the Cinder code and modify the
|
||||
REST API view for showing extra specs to reveal these in policy based
|
||||
request contexts. The initial set of ``user visible`` extra specs is
|
||||
sufficient to establish a framework, and meet the immediate needs described in
|
||||
the use cases. The set is intentionally small, and leverages existing extra
|
||||
specs. The following extra spec keys are to be treated as ``user visible``:
|
||||
|
||||
- ``multiattach``
|
||||
- ``RESKEY:availability_zones``
|
||||
- ``replication_enabled``
|
||||
|
||||
The set of ``user visible`` extra specs will be a fixed list defined in the
|
||||
Cinder code, and can be extended but only by enhancing the code. Future
|
||||
updates can support additional volume characteristics that can be expressed with
|
||||
an extra spec. For example, it might be useful for users to know whether a
|
||||
volume type provides volumes that support online extend, but there currently
|
||||
is no extra spec associated with that feature.
|
||||
|
||||
The REST API behavior will be policy based, and not require a new
|
||||
microversion. The existing policies for accessing extra specs will remain, but
|
||||
the default values will be changed to grant access to any authorized user. A
|
||||
new policy will determine whether access is granted to all extra specs, or
|
||||
just ``user visible`` extra specs. The policies will allow users to view
|
||||
extra specs, but the view will be restricted to the extra specs that are
|
||||
considered ``user visible``. A new policy will control access to all extra
|
||||
specs, including the ones that are ``user visible``.
|
||||
|
||||
The current policies (and their default values) for accessing extra specs are:
|
||||
|
||||
========================================= ==========
|
||||
Policy Default
|
||||
========================================= ==========
|
||||
volume_extension:access_types_extra_specs admin-only
|
||||
volume_extension:types_extra_specs:index admin-only
|
||||
volume_extension:types_extra_specs:show admin-only
|
||||
========================================= ==========
|
||||
|
||||
The proposed policies, and their new default values, will be:
|
||||
|
||||
================================================= ==========
|
||||
Policy Default
|
||||
================================================= ==========
|
||||
volume_extension:access_types_extra_specs any authorized user
|
||||
volume_extension:types_extra_specs:index any authorized user
|
||||
volume_extension:types_extra_specs:show any authorized user
|
||||
volume_extension:types_extra_specs:read_sensitive admin-only
|
||||
================================================= ==========
|
||||
|
||||
The new ``volume_extension:types_extra_specs:read_sensitive`` policy will
|
||||
govern whether access is granted to all extra specs, or is limited to just
|
||||
``user visible`` extra specs. Hereafter in this spec, the new policy will
|
||||
be abbreviated as ``read_sensitive``.
|
||||
|
||||
Alternatives
|
||||
------------
|
||||
|
||||
Build a new API to return user visible capabilities and features from
|
||||
volume types without exposing them as “extra specs.” Although this
|
||||
alternative would also solve the problem, it requires more code to
|
||||
write, test, and document.
|
||||
|
||||
Control exposure of each individual extra spec entirely by policy. It is
|
||||
not clear how to do this without significant changes to the existing
|
||||
REST API. Nor in our opinion is it desirable. There are clear cut
|
||||
examples of backend independent capabilities and features that are
|
||||
properly the business of any user who is authorized to create volumes, so
|
||||
users should have a reasonable expectation that these can be discovered
|
||||
without burdening the cloud administrator with the task of constructing
|
||||
policies for them one by one.
|
||||
|
||||
The new ``volume_extension:types_extra_specs:read_sensitive`` policy is
|
||||
introduced, but the existing policies remain defaulting to admin-only. The
|
||||
downside is this would require cloud administrators to modify the default
|
||||
policies for the ``user visible`` extra specs to be available to non-
|
||||
administrative API requests. However, the entire premise is that ``user
|
||||
visible`` extra specs are, by definition, intended to be visible to users.
|
||||
Cloud administrators shouldn't need to opt-in to reap the benefits of this
|
||||
feature. Cloud administrators who wish to retain the current behavior, where
|
||||
users are not authorized to see any extra specs, may do so by explicitly
|
||||
setting these policies to admin-only (the previous default value).
|
||||
|
||||
- volume_extension:access_types_extra_specs
|
||||
- volume_extension:types_extra_specs:index
|
||||
- volume_extension:types_extra_specs:show
|
||||
|
||||
Data model impact
|
||||
-----------------
|
||||
|
||||
None
|
||||
|
||||
REST API impact
|
||||
---------------
|
||||
|
||||
The REST API affected by this spec are:
|
||||
|
||||
#. /v3/{project_id}/types
|
||||
#. /v3/{project_id}/types/{volume_type_id}
|
||||
#. /v3/{project_id}/types/{volume_type_id}/extra_specs
|
||||
#. /v3/{project_id}/types/{volume_type_id}/extra_specs/{key}
|
||||
|
||||
The following examples document the behavior for a volume type with two
|
||||
extra specs:
|
||||
|
||||
- ``multiattach`` (a ``user visible`` extra spec)
|
||||
- ``volume_backend_name`` (which will be visible only when the context
|
||||
satisfies the ``read_sensitive`` policy)
|
||||
|
||||
GET /v3/{project_id}/types
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
This REST API returns a list of volume types, and the following example
|
||||
shows just a single volume type.
|
||||
When the context doesn't satisfy the ``read_sensitive`` policy, the
|
||||
``extra_specs`` field is included but only ``user visible`` entries are
|
||||
present.
|
||||
|
||||
================================================= =======
|
||||
Policy Context
|
||||
================================================= =======
|
||||
volume_extension:access_types_extra_specs True
|
||||
volume_extension:types_extra_specs:read_sensitive False
|
||||
================================================= =======
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
{
|
||||
"volume_types": [
|
||||
{
|
||||
"id": "6685584b-1eac-4da6-b5c3-555430cf68ff",
|
||||
"qos_specs_id": null,
|
||||
"name": "vol-type-001",
|
||||
"description": "volume type 0001",
|
||||
"os-volume-type-access:is_public": true,
|
||||
"is_public": true,
|
||||
"extra_specs": {
|
||||
"multiattach": "<is> True"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
When the ``read_sensitive`` policy is satisfied (by default, this will be the
|
||||
case only for administrators) the full list of ``extra_specs`` is returned.
|
||||
|
||||
================================================= =======
|
||||
Policy Context
|
||||
================================================= =======
|
||||
volume_extension:access_types_extra_specs True
|
||||
volume_extension:types_extra_specs:read_sensitive True
|
||||
================================================= =======
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
{
|
||||
"volume_types": [
|
||||
{
|
||||
"id": "6685584b-1eac-4da6-b5c3-555430cf68ff",
|
||||
"qos_specs_id": null,
|
||||
"name": "vol-type-001",
|
||||
"description": "volume type 0001",
|
||||
"os-volume-type-access:is_public": true,
|
||||
"is_public": true,
|
||||
"extra_specs": {
|
||||
"multiattach": "<is> True",
|
||||
"volume_backend_name": "SecretName"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
GET /v3/{project_id}/types/{volume_type_id}
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The REST API shows the details for the specified volume type, and the behavior
|
||||
is similar to the to the /v3/{project_id}/types API.
|
||||
|
||||
- The ``extra_specs`` field will contain any ``user visible`` extra specs.
|
||||
- When the ``read_sensitive`` policy is satisfied, the full list of
|
||||
``extra_specs`` is returned.
|
||||
|
||||
GET /v3/{project_id}/types/{volume_type_id}/extra_specs
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The policy will be updated to allow any authorized user access to this
|
||||
API. But, similar to above, for non ``read_sensitive`` requests the list of
|
||||
``extra_specs`` will be limited to those that are ``user visible``.
|
||||
|
||||
================================================= =======
|
||||
Policy Context
|
||||
================================================= =======
|
||||
volume_extension:types_extra_specs:index True
|
||||
volume_extension:types_extra_specs:read_sensitive False
|
||||
================================================= =======
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
{
|
||||
"extra_specs": {
|
||||
"multiattach": "<is> True"
|
||||
}
|
||||
}
|
||||
|
||||
If there are no ``user visible`` extra specs defined for the specified
|
||||
volume type, then an empty dictionary will be returned.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
{
|
||||
"extra_specs": {}
|
||||
}
|
||||
|
||||
When made by an administrator, the response will be the complete set of extra
|
||||
specs (no change from current behavior).
|
||||
|
||||
================================================= =======
|
||||
Policy Context
|
||||
================================================= =======
|
||||
volume_extension:types_extra_specs:index True
|
||||
volume_extension:types_extra_specs:read_sensitive True
|
||||
================================================= =======
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
{
|
||||
"extra_specs": {
|
||||
"multiattach": "<is> True",
|
||||
"volume_backend_name": "SecretName"
|
||||
}
|
||||
}
|
||||
|
||||
GET /v3/{project_id}/types/{volume_type_id}/extra_specs/{key}
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
When the specified extra-specs {key} is in the ``user visible`` set, the value
|
||||
will be returned regardless of whether the requester satisfies the
|
||||
``read_sensitive`` policy.
|
||||
|
||||
================================================= =======
|
||||
Policy Context
|
||||
================================================= =======
|
||||
volume_extension:types_extra_specs:show True
|
||||
volume_extension:types_extra_specs:read_sensitive N/A
|
||||
================================================= =======
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
{
|
||||
"multiattach": "<is> True"
|
||||
}
|
||||
|
||||
The response to requests for extra specs that are not ``user visible`` will
|
||||
depend on the context. If the request satisfies the ``read_sensitive`` policy
|
||||
then the appropriate response is returned.
|
||||
|
||||
================================================= =======
|
||||
Policy Context
|
||||
================================================= =======
|
||||
volume_extension:types_extra_specs:show True
|
||||
volume_extension:types_extra_specs:read_sensitive True
|
||||
================================================= =======
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
{
|
||||
"volume_backend_name": "SecretName"
|
||||
}
|
||||
|
||||
But if the request does not satisfy the ``read_sensitive`` policy then the
|
||||
API will return 404 NOTFOUND. Returning 404 (instead of 403) prevents leakage
|
||||
of the names of ``read_sensitive`` extra spec keys.
|
||||
|
||||
================================================= =======
|
||||
Policy Context
|
||||
================================================= =======
|
||||
volume_extension:types_extra_specs:show True
|
||||
volume_extension:types_extra_specs:read_sensitive False
|
||||
================================================= =======
|
||||
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
{
|
||||
"itemNotFound": {
|
||||
"code": 404
|
||||
"message": "Volume Type 6685584b-1eac-4da6-b5c3-555430cf68ff has no extra specs with key volume_backend_name."
|
||||
}
|
||||
}
|
||||
|
||||
Security impact
|
||||
---------------
|
||||
|
||||
None. The set of ``user visible`` extra specs is hard coded and does not
|
||||
include extra specs that reveal back end details.
|
||||
|
||||
Active/Active HA impact
|
||||
-----------------------
|
||||
|
||||
None. REST API layer change with no locking or exclusion or service
|
||||
restart implications.
|
||||
|
||||
Notifications impact
|
||||
--------------------
|
||||
|
||||
None – no asynchronous operations involved.
|
||||
|
||||
Other end user impact
|
||||
---------------------
|
||||
|
||||
Cinderclient and OSC and Horizon should not need changes. Regular
|
||||
users will see some new information but no new fields are required.
|
||||
|
||||
Performance Impact
|
||||
------------------
|
||||
|
||||
None
|
||||
|
||||
Other deployer impact
|
||||
---------------------
|
||||
|
||||
No impact on OpenStack deployment tools or deployment planning/design.
|
||||
|
||||
Developer impact
|
||||
----------------
|
||||
|
||||
No impact on OpenStack development outside the scope of this change.
|
||||
|
||||
Implementation
|
||||
--------------
|
||||
|
||||
Assignee(s)
|
||||
~~~~~~~~~~~
|
||||
|
||||
Primary assignee: abishop
|
||||
|
||||
Work Items
|
||||
~~~~~~~~~~
|
||||
|
||||
- Define list of user visible extra specs.
|
||||
- Define the ``read_sensitive`` policy, and modify the existing default
|
||||
policy rules that govern access to extra specs to allow access to any
|
||||
authorized user.
|
||||
- Update the API responses per this spec.
|
||||
- Modify unit tests to check for exposure of exactly and only the
|
||||
user visible extra specs without ``read_sensitive`` authorization.
|
||||
- Tempest tests
|
||||
|
||||
Dependencies
|
||||
~~~~~~~~~~~~
|
||||
|
||||
Testing
|
||||
~~~~~~~
|
||||
|
||||
- New tempest tests in cinder-tempest-plugin
|
||||
|
||||
Documentation Impact
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- Add section to Cinder Administration that defines and lists user
|
||||
visible extra specs. Describe the new ``read_sensitive`` policy, and
|
||||
explain the policy settings that will give an operator "legacy" behavior.
|
||||
- Update API reference
|
||||
|
||||
References
|
||||
----------
|
||||
|
||||
None
|
Loading…
Reference in New Issue
Block a user