diff options
author | ekotowski <ekotowski@gmail.com> | 2014-10-08 15:28:14 -0700 |
---|---|---|
committer | ekotowski <ekotowski@gmail.com> | 2014-10-20 13:03:57 -0700 |
commit | 0c4e06c69f4b7180f65d51b5b06000a033b17e69 (patch) | |
tree | 2cd6e12bb5aa6b99e46ea0ade5fb05f951ab9cdb /trove/configuration | |
parent | 89bf927ae93b85c49a352cc22f2fe20533b3c6a4 (diff) | |
download | trove-0c4e06c69f4b7180f65d51b5b06000a033b17e69.tar.gz |
Configuration group checking 0 validation rules
- Updated _validate_configuration
- Updated from querying the database every parameter to fetching
all the db rules in one call and passing them as a parameter.
- Check for empty rules set and raise a 422
- New error response: Configuration groups are not supported for this
datastore: mysql 5.5.
- Updated invalid parameter to raise a 422 instead of the previous
404 that the load_parameters_by_name call used to raise.
- New error response message for parameter not found: "The configuration
parameter auto_increment_offset is not support for this datastore:
mysql 5.5.
- Added unit tests covering the _validation_configuration method
- Modified test_configurations_create_invalid_values integration test
to handle new error status code 422 instead of 404 for invalid
configuration values
Closes-Bug: 1367107
Change-Id: I9cc873745afe19336c1fe5ef35ffdd3efde127b3
Diffstat (limited to 'trove/configuration')
-rw-r--r-- | trove/configuration/service.py | 44 |
1 files changed, 33 insertions, 11 deletions
diff --git a/trove/configuration/service.py b/trove/configuration/service.py index 115ca3a3..fb9403e7 100644 --- a/trove/configuration/service.py +++ b/trove/configuration/service.py @@ -21,7 +21,6 @@ from trove.common import wsgi from trove.configuration import models from trove.configuration import views from trove.configuration.models import DBConfigurationParameter -from trove.configuration.models import DatastoreConfigurationParameters from trove.datastore import models as ds_models from trove.openstack.common import log as logging from trove.openstack.common.gettextutils import _ @@ -101,7 +100,9 @@ class ConfigurationsController(wsgi.Controller): # validate that the values passed in are permitted by the operator. ConfigurationsController._validate_configuration( body['configuration']['values'], - datastore_version=datastore_version) + datastore_version, + models.DatastoreConfigurationParameters.load_parameters( + datastore_version.id)) for k, v in values.iteritems(): configItems.append(DBConfigurationParameter( @@ -180,7 +181,10 @@ class ConfigurationsController(wsgi.Controller): if 'values' in configuration: # validate that the values passed in are permitted by the operator. ConfigurationsController._validate_configuration( - configuration['values'], datastore_version=ds_version) + configuration['values'], + ds_version, + models.DatastoreConfigurationParameters.load_parameters( + ds_version.id)) for k, v in configuration['values'].iteritems(): items.append(DBConfigurationParameter( configuration_id=group.id, @@ -190,18 +194,36 @@ class ConfigurationsController(wsgi.Controller): return items @staticmethod - def _validate_configuration(values, datastore_version=None): + def _validate_configuration(values, datastore_version, config_rules): LOG.info(_("Validating configuration values")) - for k, v in values.iteritems(): - rule = DatastoreConfigurationParameters.load_parameter_by_name( - datastore_version.id, k) - if not rule or rule.deleted: - output = {"key": k} - msg = _("The parameter provided for the configuration " - "%(key)s is not available.") % output + # create rules dictionary based on parameter name + rules_lookup = {} + for item in config_rules: + rules_lookup[item.name.lower()] = item + + # checking if there are any rules for the datastore + if not rules_lookup: + output = {"version": datastore_version.name, + "name": datastore_version.datastore_name} + msg = _("Configuration groups are not supported for this " + "datastore: %(name)s %(version)s") % output + raise exception.UnprocessableEntity(message=msg) + + for k, v in values.iteritems(): + key = k.lower() + # parameter name validation + if key not in rules_lookup: + output = {"key": k, + "version": datastore_version.name, + "name": datastore_version.datastore_name} + msg = _("The configuration parameter %(key)s is not " + "supported for this datastore: " + "%(name)s %(version)s.") % output raise exception.UnprocessableEntity(message=msg) + rule = rules_lookup[key] + # type checking value_type = rule.data_type |