summaryrefslogtreecommitdiff
path: root/trove/configuration
diff options
context:
space:
mode:
authorekotowski <ekotowski@gmail.com>2014-10-08 15:28:14 -0700
committerekotowski <ekotowski@gmail.com>2014-10-20 13:03:57 -0700
commit0c4e06c69f4b7180f65d51b5b06000a033b17e69 (patch)
tree2cd6e12bb5aa6b99e46ea0ade5fb05f951ab9cdb /trove/configuration
parent89bf927ae93b85c49a352cc22f2fe20533b3c6a4 (diff)
downloadtrove-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.py44
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