¡@

Home 

OpenStack Study: validators.py

OpenStack Index

**** CubicPower OpenStack Study ****

# Copyright 2013 NEC Corporation. All rights reserved.

#

# Licensed under the Apache License, Version 2.0 (the "License"); you may

# not use this file except in compliance with the License. You may obtain

# a copy of the License at

#

# http://www.apache.org/licenses/LICENSE-2.0

#

# Unless required by applicable law or agreed to in writing, software

# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT

# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the

# License for the specific language governing permissions and limitations

# under the License.

"""

Internal implementation of request Body validating middleware.

"""

import jsonschema

from nova import exception

from nova.openstack.common.gettextutils import _

from nova.openstack.common import uuidutils

@jsonschema.FormatChecker.cls_checks('uuid')

**** CubicPower OpenStack Study ****

def _validate_uuid_format(instance):

    return uuidutils.is_uuid_like(instance)

**** CubicPower OpenStack Study ****

class _SchemaValidator(object):

"""A validator class

This class is changed from Draft4Validator to validate minimum/maximum

value of a string number(e.g. '10'). This changes can be removed when

we tighten up the API

**** CubicPower OpenStack Study ****

    def __init__(self, schema):

        validators = {

            'minimum': self._validate_minimum,

            'maximum': self._validate_maximum,

        }

        validator_cls = jsonschema.validators.extend(self.validator_org,

                                                     validators)

        format_checker = jsonschema.FormatChecker()

        self.validator = validator_cls(schema, format_checker=format_checker)

**** CubicPower OpenStack Study ****

    def validate(self, *args, **kwargs):

        try:

            self.validator.validate(*args, **kwargs)

        except jsonschema.ValidationError as ex:

            # NOTE: For whole OpenStack message consistency, this error

            #       message has been written as the similar format of WSME.

            if len(ex.path) > 0:

                detail = _("Invalid input for field/attribute %(path)s."

                           " Value: %(value)s. %(message)s") % {

                               'path': ex.path.pop(), 'value': ex.instance,

                               'message': ex.message

                           }

            else:

                detail = ex.message

            raise exception.ValidationError(detail=detail)

**** CubicPower OpenStack Study ****

    def _number_from_str(self, instance):

        try:

            value = int(instance)

        except (ValueError, TypeError):

            try:

                value = float(instance)

            except (ValueError, TypeError):

                return None

        return value

**** CubicPower OpenStack Study ****

    def _validate_minimum(self, validator, minimum, instance, schema):

        instance = self._number_from_str(instance)

        if instance is None:

            return

        return self.validator_org.VALIDATORS['minimum'](validator, minimum,

                                                        instance, schema)

**** CubicPower OpenStack Study ****

    def _validate_maximum(self, validator, maximum, instance, schema):

        instance = self._number_from_str(instance)

        if instance is None:

            return

        return self.validator_org.VALIDATORS['maximum'](validator, maximum,

                                                        instance, schema)