From 2bb2f13de33d509967560d5df0b47c32bdd17007 Mon Sep 17 00:00:00 2001 From: Rajat Dhasmana Date: Thu, 23 May 2024 22:56:55 +0530 Subject: [PATCH] Make default-types APIs compatible with V3.67 In microversion 3.67, we made project_id optional in the URL for all Cinder APIs. However, the default-types APIs (set, unset, get, list) were implemented without the project_id in the URL to make it ready for SRBAC and anticipating the new endpoint for cinder without project_id. This is causing issues while implementing the SDK support for default-types APIs since we fetch the endpoint containing project_id (http://127.0.0.1/volume/v3//default-types) but the default-types API doesn't expect it (http://127.0.0.1/volume/v3/default-types) resulting in 404 resource not found error. ResourceNotFound: 404: Client Error for url: http://127.0.0.1/volume/v3/default_types/12a1b5e507e7497db79707b0ddedf1a4, : 404 Not Found: The resource could not be found. This patch makes the default-types APIs consistent with the other cinder APIs that accept URL with/without project_id. NOTE: This patch doesn't require a microversion bump or releasenote since the expectation with MV3.67 is that all APIs support request irrespective of project_id in the URL and this change is making default-types APIs consisitent with MV3.67. Also MV3.67 is just an indication of the behavior change otherwise supplying URLs without project ID with MV < 3.67 also works. Change-Id: I63efc0598d501d77474588a02582f5338bb8d345 (cherry picked from commit 9afa19e9c96831b319c53fd222d7b822e52da967) --- cinder/api/v3/router.py | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/cinder/api/v3/router.py b/cinder/api/v3/router.py index e31c9b1f1a0..6c98b1a387f 100644 --- a/cinder/api/v3/router.py +++ b/cinder/api/v3/router.py @@ -210,22 +210,28 @@ class APIRouter(cinder.api.openstack.APIRouter): member={'accept': 'POST'}) self.resources['default_types'] = default_types.create_resource() - mapper.connect("default-types", "/default-types/{id}", - controller=self.resources['default_types'], - action='create_update', - conditions={"method": ['PUT']}) + for path_prefix in ['/{project_id}', '']: + # project_id is optional + mapper.connect( + "default-types", "%s/default-types/{id}" % path_prefix, + controller=self.resources['default_types'], + action='create_update', + conditions={"method": ['PUT']}) - mapper.connect("default-types", "/default-types", - controller=self.resources['default_types'], - action='index', - conditions={"method": ['GET']}) + mapper.connect( + "default-types", "%s/default-types" % path_prefix, + controller=self.resources['default_types'], + action='index', + conditions={"method": ['GET']}) - mapper.connect("default-types", "/default-types/{id}", - controller=self.resources['default_types'], - action='detail', - conditions={"method": ['GET']}) + mapper.connect( + "default-types", "%s/default-types/{id}" % path_prefix, + controller=self.resources['default_types'], + action='detail', + conditions={"method": ['GET']}) - mapper.connect("default-types", "/default-types/{id}", - controller=self.resources['default_types'], - action='delete', - conditions={"method": ['DELETE']}) + mapper.connect( + "default-types", "%s/default-types/{id}" % path_prefix, + controller=self.resources['default_types'], + action='delete', + conditions={"method": ['DELETE']})