Merge "Always validate metric name even if no dimensions"

This commit is contained in:
Jenkins
2015-05-13 13:17:28 +00:00
committed by Gerrit Code Review
8 changed files with 11 additions and 63 deletions

View File

@@ -128,10 +128,9 @@ public class CreateMetricCommand {
public void validate() {
// Validate name and dimensions
MetricNameValidation.validate(name, true);
if (dimensions != null) {
String service = dimensions.get(Services.SERVICE_DIMENSION);
MetricNameValidation.validate(name, service, true);
DimensionValidation.validate(dimensions, service);
DimensionValidation.validate(dimensions);
}
if (valueMeta != null) {
ValueMetaValidation.validate(valueMeta);

View File

@@ -18,7 +18,6 @@ import java.util.List;
import javax.ws.rs.WebApplicationException;
import monasca.common.model.Services;
import monasca.common.model.alarm.AlarmExpression;
import monasca.common.model.alarm.AlarmSubExpression;
import monasca.common.model.metric.MetricDefinition;
@@ -81,18 +80,15 @@ public final class AlarmValidation {
for (AlarmSubExpression subExpression : alarmExpression.getSubExpressions()) {
MetricDefinition metricDef = subExpression.getMetricDefinition();
String service =
metricDef.dimensions == null ? null : metricDef.dimensions
.get(Services.SERVICE_DIMENSION);
// Normalize and validate namespace
metricDef.name = MetricNameValidation.normalize(metricDef.name);
MetricNameValidation.validate(metricDef.name, service, true);
MetricNameValidation.validate(metricDef.name, true);
// Normalize and validate dimensions
if (metricDef.dimensions != null) {
metricDef.setDimensions(DimensionValidation.normalize(metricDef.dimensions));
DimensionValidation.validate(metricDef.dimensions, service);
DimensionValidation.validate(metricDef.dimensions);
}
// Validate period

View File

@@ -18,7 +18,6 @@ import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import javax.annotation.Nullable;
import javax.ws.rs.WebApplicationException;
import com.google.common.base.CharMatcher;
@@ -112,7 +111,7 @@ public final class DimensionValidation {
*
* @throws WebApplicationException if validation fails
*/
public static void validate(Map<String, String> dimensions, @Nullable String service) {
public static void validate(Map<String, String> dimensions) {
// Validate dimension names and values
for (Map.Entry<String, String> dimension : dimensions.entrySet()) {
String name = dimension.getKey();
@@ -137,18 +136,6 @@ public final class DimensionValidation {
if (!VALID_DIMENSION_NAME.matcher(name).matches())
throw Exceptions.unprocessableEntity(
"Dimension name %s may not contain: %s", name, INVALID_CHAR_STRING);
// Service specific validations
if (service != null) {
if (!name.equals(Services.SERVICE_DIMENSION)
&& !Services.isValidDimensionName(service, name))
throw Exceptions.unprocessableEntity("%s is not a valid dimension name for service %s",
name, service);
DimensionValidator validator = VALIDATORS.get(service);
if (validator != null && !validator.isValidDimension(name, value))
throw Exceptions.unprocessableEntity("%s is not a valid dimension value for service %s",
value, service);
}
}
}

View File

@@ -15,11 +15,8 @@ package monasca.api.app.validation;
import java.util.regex.Pattern;
import javax.annotation.Nullable;
import com.google.common.base.CharMatcher;
import com.google.common.base.Strings;
import monasca.common.model.Services;
import monasca.api.app.command.CreateMetricCommand;
import monasca.api.resource.exception.Exceptions;
import com.sun.jersey.spi.container.WebApplication;
@@ -44,7 +41,7 @@ public class MetricNameValidation {
*
* @throws WebApplication if validation fails
*/
public static void validate(String metricName, @Nullable String service, boolean nameRequiredFlag) {
public static void validate(String metricName, boolean nameRequiredFlag) {
// General validations
@@ -59,16 +56,8 @@ public class MetricNameValidation {
if (metricName.length() > CreateMetricCommand.MAX_NAME_LENGTH)
throw Exceptions.unprocessableEntity("Metric name %s must be %d characters or less",
metricName, CreateMetricCommand.MAX_NAME_LENGTH);
if (!Services.isReserved(metricName) && !VALID_METRIC_NAME.matcher(metricName).matches())
if (!VALID_METRIC_NAME.matcher(metricName).matches())
throw Exceptions.unprocessableEntity("Metric name %s may not contain: > < = { } ( ) ' \" \\ , ; &",
metricName);
// Service specific validations
if (service != null && Services.isReserved(service)) {
if (!Strings.isNullOrEmpty(metricName) && !Services.isValidMetricName(service, metricName)) {
throw Exceptions.unprocessableEntity("%s is not a valid metric name for namespace %s",
metricName, service);
}
}
}
}

View File

@@ -32,7 +32,6 @@ import java.util.Map;
import javax.ws.rs.WebApplicationException;
import monasca.api.resource.exception.Exceptions;
import monasca.common.model.Services;
/**
* Validation related utilities.
@@ -89,8 +88,7 @@ public final class Validation {
boolean nameRequiredFlag) {
Map<String, String> dimensions = parseAndValidateDimensions(dimensionsStr);
String service = dimensions.get(Services.SERVICE_DIMENSION);
MetricNameValidation.validate(name, service, nameRequiredFlag);
MetricNameValidation.validate(name, nameRequiredFlag);
return dimensions;
}
@@ -107,8 +105,7 @@ public final class Validation {
dimensions.put(dimensionArr[0], dimensionArr[1]);
}
String service = dimensions.get(Services.SERVICE_DIMENSION);
DimensionValidation.validate(dimensions, service);
DimensionValidation.validate(dimensions);
return dimensions;
}

View File

@@ -119,7 +119,7 @@ public class MetricResource {
if (! Strings.isNullOrEmpty(dimensionsStr)) {
dimensions = Validation.parseAndValidateNameAndDimensions(name, dimensionsStr, false);
} else if (! Strings.isNullOrEmpty(name)) {
MetricNameValidation.validate(name, null, false);
MetricNameValidation.validate(name, false);
}
return Links.paginate(this.persistUtils.getLimit(limit),

View File

@@ -50,6 +50,6 @@ public class DimensionsTest {
put("ezaz", "do re mi");
put("abc", null);
}
}, "joe");
});
}
}

View File

@@ -127,26 +127,6 @@ public class AlarmDefinitionResourceTest extends AbstractMonApiResourceTest {
any(UpdateAlarmDefinitionCommand.class));
}
public void shouldErrorOnCreateWithInvalidMetricName() {
String expression = "avg(foo{service=hpcs.compute, instance_id=937}) >= 90";
ClientResponse response =
createResponseFor(new CreateAlarmDefinitionCommand("Disk Exceeds 1k Operations", null,
expression, Arrays.asList("service", "instance_id"), "LOW", alarmActions, null, null));
ErrorMessages.assertThat(response.getEntity(String.class)).matches("unprocessable_entity", 422,
"foo is not a valid metric name for namespace hpcs.compute");
}
public void shouldErrorOnCreateWithInvalidDimensions() {
String expression = "avg(disk_read_ops{service=hpcs.compute, instance_id=937, foo=bar}) >= 90";
ClientResponse response =
createResponseFor(new CreateAlarmDefinitionCommand("Disk Exceeds 1k Operations", null,
expression, Arrays.asList("service", "instance_id"), "LOW", alarmActions, null, null));
ErrorMessages.assertThat(response.getEntity(String.class)).matches("unprocessable_entity", 422,
"foo is not a valid dimension name for service hpcs.compute");
}
public void shouldErrorOnCreateWithDuplicateDimensions() {
String expression =
"avg(hpcs.compute{instance_id=937, instance_id=123, az=2, instance_uuid=abc123, metric_name=disk_read_ops}) >= 90";