Merge "Always validate metric name even if no dimensions"
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -50,6 +50,6 @@ public class DimensionsTest {
|
||||
put("ezaz", "do re mi");
|
||||
put("abc", null);
|
||||
}
|
||||
}, "joe");
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
|
||||
Reference in New Issue
Block a user