monasca-api/src/main/java/monasca/api/app/validation/AlarmValidation.java

118 lines
4.6 KiB
Java

/*
* Copyright (c) 2014 Hewlett-Packard Development Company, L.P.
*
* 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.
*/
package monasca.api.app.validation;
import java.util.Arrays;
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;
import monasca.api.resource.exception.Exceptions;
/**
* Utilities for validating AlarmExpressions.
*/
public final class AlarmValidation {
private static final List<String> VALID_ALARM_SERVERITY = Arrays.asList("low", "medium", "high",
"critical");
private AlarmValidation() {}
/**
* @throws WebApplicationException if validation fails
*/
public static void validate(String name, String description, String severity,
List<String> alarmActions, List<String> okActions, List<String> undeterminedActions) {
if (name != null && name.length() > 255)
throw Exceptions.unprocessableEntity("Name %s must be 255 characters or less", name);
if (description != null && description.length() > 255)
throw Exceptions.unprocessableEntity("Description %s must be 255 characters or less",
description);
if (alarmActions != null)
for (String action : alarmActions)
if (action.length() > 50)
throw Exceptions.unprocessableEntity("Alarm action %s must be 50 characters or less",
action);
if (okActions != null)
for (String action : okActions)
if (action.length() > 50)
throw Exceptions
.unprocessableEntity("Ok action %s must be 50 characters or less", action);
if (undeterminedActions != null)
for (String action : undeterminedActions)
if (action.length() > 50)
throw Exceptions.unprocessableEntity(
"Undetermined action %s must be 50 characters or less", action);
if (severity != null && !VALID_ALARM_SERVERITY.contains(severity.toLowerCase())) {
throw Exceptions.unprocessableEntity("%s is not a valid severity", severity);
}
}
/**
* Validates, normalizes and gets an AlarmExpression for the {@code expression}.
*
* @throws WebApplicationException if validation fails
*/
public static AlarmExpression validateNormalizeAndGet(String expression) {
AlarmExpression alarmExpression = null;
try {
alarmExpression = AlarmExpression.of(expression);
} catch (IllegalArgumentException e) {
throw Exceptions.unprocessableEntityDetails("The alarm expression is invalid",
e.getMessage(), e);
}
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);
// Normalize and validate dimensions
if (metricDef.dimensions != null) {
metricDef.setDimensions(DimensionValidation.normalize(metricDef.dimensions));
DimensionValidation.validate(metricDef.dimensions, service);
}
// Validate period
if (subExpression.getPeriod() == 0)
throw Exceptions.unprocessableEntity("Period must not be 0");
if (subExpression.getPeriod() % 60 != 0)
throw Exceptions.unprocessableEntity("Period %s must be a multiple of 60",
subExpression.getPeriod());
// Validate periods
if (subExpression.getPeriods() < 1)
throw Exceptions.unprocessableEntity("Periods %s must be greater than or equal to 1",
subExpression.getPeriods());
if (subExpression.getPeriod() * subExpression.getPeriods() > 1209600)
throw Exceptions.unprocessableEntity(
"Period %s times %s must total less than 2 weeks in seconds (1209600)",
subExpression.getPeriod(), subExpression.getPeriods());
}
return alarmExpression;
}
}