[dev][cinder][keystone] Properly consuming system-scope in cinder

Gorka Eguileor geguileo at redhat.com
Mon Feb 1 12:57:17 UTC 2021


On 29/01, Ghanshyam Mann wrote:
>  ---- On Fri, 29 Jan 2021 11:23:47 -0600 Gorka Eguileor <geguileo at redhat.com> wrote ----
>  > On 28/01, Lance Bragstad wrote:
>  > > Hey folks,
>  > >
>  > > As I'm sure some of the cinder folks are aware, I'm updating cinder
>  > > policies to include support for some default personas keystone ships with.
>  > > Some of those personas use system-scope (e.g., system-reader and
>  > > system-admin) and I've already proposed a series of patches that describe
>  > > what those changes look like from a policy perspective [0].
>  > >
>  > > The question now is how we test those changes. To help guide that decision,
>  > > I worked on three different testing approaches. The first was to continue
>  > > testing policy using unit tests in cinder with mocked context objects. The
>  > > second was to use DDT with keystonemiddleware mocked to remove a dependency
>  > > on keystone. The third also used DDT, but included changes to update
>  > > NoAuthMiddleware so that it wasn't as opinionated about authentication or
>  > > authorization. I brought each approach in the cinder meeting this week
>  > > where we discussed a fourth approach, doing everything in tempest. I
>  > > summarized all of this in an etherpad [1]
>  > >
>  > > Up to yesterday morning, the only approach I hadn't tinkered with manually
>  > > was tempest. I spent some time today figuring that out, resulting in a
>  > > patch to cinderlib [2] to enable a protection test job, and
>  > > cinder_tempest_plugin [3] that adds the plumbing and some example tests.
>  > >
>  > > In the process of implementing support for tempest testing, I noticed that
>  > > service catalogs for system-scoped tokens don't contain cinder endpoints
>  > > [4]. This is because the cinder endpoint contains endpoint templating in
>  > > the URL [5], which keystone will substitute with the project ID of the
>  > > token, if and only if the catalog is built for a project-scoped token.
>  > > System and domain-scoped tokens do not have a reasonable project ID to use
>  > > in this case, so the templating is skipped, resulting in a cinder service
>  > > in the catalog without endpoints [6].
>  > >
>  > > This cascades in the client, specifically tempest's volume client, because
>  > > it can't find a suitable endpoint for request to the volume service [7].
>  > >
>  > > Initially, my testing approaches were to provide examples for cinder
>  > > developers to assess the viability of each approach before committing to a
>  > > protection testing strategy. But, the tempest approach highlighted a larger
>  > > issue for how we integrate system-scope support into cinder because of the
>  > > assumption there will always be a project ID in the path (for the majority
>  > > of the cinder API). I can think of two ways to approach the problem, but
>  > > I'm hoping others have more.
>  > >
>  >
>  > Hi Lance,
>  >
>  > Sorry to hear that the Cinder is giving you such trouble.
>  >
>  > > First, we remove project IDs from cinder's API path.
>  > >
>  > > This would be similar to how nova (and I assume other services) moved away
>  > > from project-specific URLs (e.g., /v3/%{project_id}s/volumes would become
>  > > /v3/volumes). This would obviously require refactoring to remove any
>  > > assumptions cinder has about project IDs being supplied on the request
>  > > path. But, this would force all authorization information to come from the
>  > > context object. Once a deployer removes the endpoint URL templating, the
>  > > endpoints will populate in the cinder entry of the service catalog. Brian's
>  > > been helping me understand this and we're unsure if this is something we
>  > > could even do with a microversion. I think nova did it moving from /v2/ to
>  > > /v2.0/, which was technically classified as a major bump? This feels like a
>  > > moon shot.
>  > >
>  >
>  > In my opinion such a change should not be treated as a microversion and
>  > would require us to go into v4, which is not something that is feasible
>  > in the short term.
>
> We can do it by supporting both URL with and without project_id. Nova did the same way

Hi,

I was not doubting that this was technically possible, I was arguing
that a change that affects every single API endpoint in Cinder would not
be described as "micro" and doing so could be considered a bit of abuse
to the microversion infrastructure.

This is just my opinion, not the Cinder official position.


> in Mitaka cycle and also bumped the microversion but just for
> notification. It was done in 2.18 microversion[1].
>
> That way you can request compute API with or without project_id and later is recommended.
> I think the same approach Cinder can consider.
>

Thanks for this information.  It will definitely come in handy knowing
where we have code references if we decide to go with the microversion
route.

Cheers,
Gorka.


> [1] https://docs.openstack.org/nova/latest/reference/api-microversion-history.html#id16
>
> -gmann
>
>  >
>  >
>  > > Second, we update cinder's clients, including tempest, to put the project
>  > > ID on the URL.
>  > >
>  > > After we update the clients to append the project ID for cinder endpoints,
>  > > we should be able to remove the URL templating in keystone, allowing cinder
>  > > endpoints to appear in system-scoped service catalogs (just like the first
>  > > approach). Clients can use the base URL from the catalog and append the
>  >
>  > I'm not familiar with keystone catalog entries, so maybe I'm saying
>  > something stupid, but couldn't we have multiple entries?  A
>  > project-specific URL and another one for the project and system scoped
>  > requests?
>  >
>  > I know it sounds kind of hackish, but if we add them in the right order,
>  > first the project one and then the new one, it would probably be
>  > backward compatible, as older clients would get the first endpoint and
>  > new clients would be able to select the right one.
>  >
>  > > admin project ID before putting the request on the wire. Even though the
>  > > request has a project ID in the path, cinder would ignore it for
>  > > system-specific APIs. This is already true for users with an admin role on
>  > > a project because cinder will allow you to get volumes in one project if
>  > > you have a token scoped to another with the admin role [8]. One potential
>  > > side-effect is that cinder clients would need *a* project ID to build a
>  > > request, potentially requiring another roundtrip to keystone.
>  >
>  > What would happen in this additional roundtrip? Would we be converting
>  > provided project's name into its UUID?
>  >
>  > If that's the case then it wouldn't happen when UUIDs are being
>  > provided, so for cases where this extra request means a performance
>  > problem they could just provide the UUID.
>  >
>  > >
>  > > Thoughts?
>  >
>  > Truth is that I would love to see the Cinder API move into URLs without
>  > the project id as well as move out everything from contrib, but that
>  > doesn't seem like a realistic piece of work we can bite right now.
>  >
>  > So I think your second proposal is the way to go.
>  >
>  > Thanks for all the work you are putting into this.
>  >
>  > Cheers,
>  > Gorka.
>  >
>  >
>  > >
>  > > [0] https://review.opendev.org/q/project:openstack/cinder+topic:secure-rbac
>  > > [1] https://etherpad.opendev.org/p/cinder-secure-rbac-protection-testing
>  > > [2] https://review.opendev.org/c/openstack/cinderlib/+/772770
>  > > [3] https://review.opendev.org/c/openstack/cinder-tempest-plugin/+/772915
>  > > [4] http://paste.openstack.org/show/802117/
>  > > [5] http://paste.openstack.org/show/802097/
>  > > [6]
>  > > https://opendev.org/openstack/keystone/src/commit/c239cc66615b41a0c09e031b3e268c82678bac12/keystone/catalog/backends/sql.py
>  > > [7] http://paste.openstack.org/show/802092/
>  > > [8] http://paste.openstack.org/show/802118/
>  >
>  >
>  >
>




More information about the openstack-discuss mailing list