Merge "tests: Ensure API schemas are valid"
This commit is contained in:
		@@ -10,7 +10,10 @@
 | 
				
			|||||||
# License for the specific language governing permissions and limitations
 | 
					# License for the specific language governing permissions and limitations
 | 
				
			||||||
# under the License.
 | 
					# under the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import jsonschema.exceptions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from nova.api.openstack import compute
 | 
					from nova.api.openstack import compute
 | 
				
			||||||
 | 
					from nova.api.validation import validators
 | 
				
			||||||
from nova import test
 | 
					from nova import test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -19,15 +22,22 @@ class SchemaTest(test.NoDBTestCase):
 | 
				
			|||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        super().setUp()
 | 
					        super().setUp()
 | 
				
			||||||
        self.router = compute.APIRouterV21()
 | 
					        self.router = compute.APIRouterV21()
 | 
				
			||||||
 | 
					        self.meta_schema = validators._SchemaValidator.validator_org
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_schemas(self):
 | 
					    def test_schemas(self):
 | 
				
			||||||
        missing_schemas = set()
 | 
					        missing_schemas = set()
 | 
				
			||||||
 | 
					        invalid_schemas = set()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        def _validate_func(func, method):
 | 
					        def _validate_func(func, method):
 | 
				
			||||||
            if method in ("POST", "PUT", "PATCH"):
 | 
					            if method in ("POST", "PUT", "PATCH"):
 | 
				
			||||||
                # request body validation
 | 
					                # request body validation
 | 
				
			||||||
                if not hasattr(func, '_request_schema'):
 | 
					                if not hasattr(func, '_request_schema'):
 | 
				
			||||||
                    missing_schemas.add(func.__qualname__)
 | 
					                    missing_schemas.add(func.__qualname__)
 | 
				
			||||||
 | 
					                else:
 | 
				
			||||||
 | 
					                    try:
 | 
				
			||||||
 | 
					                        self.meta_schema.check_schema(func._request_schema)
 | 
				
			||||||
 | 
					                    except jsonschema.exceptions.SchemaError:
 | 
				
			||||||
 | 
					                        invalid_schemas.add(func.__qualname__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for route in self.router.map.matchlist:
 | 
					        for route in self.router.map.matchlist:
 | 
				
			||||||
            if 'controller' not in route.defaults:
 | 
					            if 'controller' not in route.defaults:
 | 
				
			||||||
@@ -104,3 +114,9 @@ class SchemaTest(test.NoDBTestCase):
 | 
				
			|||||||
                f"Found API resources without schemas: "
 | 
					                f"Found API resources without schemas: "
 | 
				
			||||||
                f"{sorted(missing_schemas)}"
 | 
					                f"{sorted(missing_schemas)}"
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if invalid_schemas:
 | 
				
			||||||
 | 
					            raise test.TestingException(
 | 
				
			||||||
 | 
					                f"Found API resources with invalid schemas: "
 | 
				
			||||||
 | 
					                f"{sorted(invalid_schemas)}"
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user