mirror of https://github.com/apache/jclouds.git
Merge pull request #1558 from whitlockjc/master
Complete CloudWatch API by adding Alarm APIs
This commit is contained in:
commit
20763b70e5
|
@ -20,6 +20,8 @@ package org.jclouds.cloudwatch;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.google.common.base.Function;
|
||||||
|
import com.google.common.collect.Iterables;
|
||||||
import org.jclouds.cloudwatch.domain.Metric;
|
import org.jclouds.cloudwatch.domain.Metric;
|
||||||
import org.jclouds.cloudwatch.domain.MetricDatum;
|
import org.jclouds.cloudwatch.domain.MetricDatum;
|
||||||
import org.jclouds.cloudwatch.features.MetricApi;
|
import org.jclouds.cloudwatch.features.MetricApi;
|
||||||
|
@ -27,9 +29,6 @@ import org.jclouds.cloudwatch.options.ListMetricsOptions;
|
||||||
import org.jclouds.collect.IterableWithMarker;
|
import org.jclouds.collect.IterableWithMarker;
|
||||||
import org.jclouds.collect.PagedIterables;
|
import org.jclouds.collect.PagedIterables;
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
|
||||||
import com.google.common.collect.Iterables;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utilities for using CloudWatch.
|
* Utilities for using CloudWatch.
|
||||||
*
|
*
|
||||||
|
|
|
@ -21,14 +21,14 @@ package org.jclouds.cloudwatch;
|
||||||
import java.io.Closeable;
|
import java.io.Closeable;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.google.inject.Provides;
|
||||||
|
import org.jclouds.cloudwatch.features.AlarmApi;
|
||||||
import org.jclouds.cloudwatch.features.MetricApi;
|
import org.jclouds.cloudwatch.features.MetricApi;
|
||||||
import org.jclouds.javax.annotation.Nullable;
|
import org.jclouds.javax.annotation.Nullable;
|
||||||
import org.jclouds.location.Region;
|
import org.jclouds.location.Region;
|
||||||
import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
|
import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
|
||||||
import org.jclouds.rest.annotations.Delegate;
|
import org.jclouds.rest.annotations.Delegate;
|
||||||
import org.jclouds.rest.annotations.EndpointParam;
|
import org.jclouds.rest.annotations.EndpointParam;
|
||||||
|
|
||||||
import com.google.inject.Provides;
|
|
||||||
/**
|
/**
|
||||||
* Provides access to Amazon CloudWatch via the Query API
|
* Provides access to Amazon CloudWatch via the Query API
|
||||||
* <p/>
|
* <p/>
|
||||||
|
@ -58,4 +58,16 @@ public interface CloudWatchApi extends Closeable {
|
||||||
*/
|
*/
|
||||||
@Delegate
|
@Delegate
|
||||||
MetricApi getMetricApiForRegion(@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region);
|
MetricApi getMetricApiForRegion(@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides synchronous access to Alarm features.
|
||||||
|
*/
|
||||||
|
@Delegate
|
||||||
|
AlarmApi getAlarmApi();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides synchronous access to Alarm features.
|
||||||
|
*/
|
||||||
|
@Delegate
|
||||||
|
AlarmApi getAlarmApiForRegion(@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region);
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,12 +24,11 @@ import static org.jclouds.aws.reference.AWSConstants.PROPERTY_HEADER_TAG;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import com.google.common.reflect.TypeToken;
|
||||||
import org.jclouds.apis.ApiMetadata;
|
import org.jclouds.apis.ApiMetadata;
|
||||||
import org.jclouds.cloudwatch.config.CloudWatchRestClientModule;
|
import org.jclouds.cloudwatch.config.CloudWatchRestClientModule;
|
||||||
import org.jclouds.rest.internal.BaseRestApiMetadata;
|
import org.jclouds.rest.internal.BaseRestApiMetadata;
|
||||||
|
|
||||||
import com.google.common.reflect.TypeToken;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of {@link ApiMetadata} for Amazon's CloudWatch api.
|
* Implementation of {@link ApiMetadata} for Amazon's CloudWatch api.
|
||||||
*
|
*
|
||||||
|
|
|
@ -21,6 +21,8 @@ package org.jclouds.cloudwatch;
|
||||||
import java.io.Closeable;
|
import java.io.Closeable;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.google.inject.Provides;
|
||||||
|
import org.jclouds.cloudwatch.features.AlarmAsyncApi;
|
||||||
import org.jclouds.cloudwatch.features.MetricAsyncApi;
|
import org.jclouds.cloudwatch.features.MetricAsyncApi;
|
||||||
import org.jclouds.javax.annotation.Nullable;
|
import org.jclouds.javax.annotation.Nullable;
|
||||||
import org.jclouds.location.Region;
|
import org.jclouds.location.Region;
|
||||||
|
@ -28,8 +30,6 @@ import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
|
||||||
import org.jclouds.rest.annotations.Delegate;
|
import org.jclouds.rest.annotations.Delegate;
|
||||||
import org.jclouds.rest.annotations.EndpointParam;
|
import org.jclouds.rest.annotations.EndpointParam;
|
||||||
|
|
||||||
import com.google.inject.Provides;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides access to Amazon CloudWatch via the Query API
|
* Provides access to Amazon CloudWatch via the Query API
|
||||||
* <p/>
|
* <p/>
|
||||||
|
@ -57,7 +57,21 @@ public interface CloudWatchAsyncApi extends Closeable {
|
||||||
@Delegate
|
@Delegate
|
||||||
MetricAsyncApi getMetricApi();
|
MetricAsyncApi getMetricApi();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides asynchronous access to Metric features.
|
||||||
|
*/
|
||||||
@Delegate
|
@Delegate
|
||||||
MetricAsyncApi getMetricApiForRegion(@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region);
|
MetricAsyncApi getMetricApiForRegion(@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides asynchronous access to Alarm features.
|
||||||
|
*/
|
||||||
|
@Delegate
|
||||||
|
AlarmAsyncApi getAlarmApi();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides asynchronous access to Metric features.
|
||||||
|
*/
|
||||||
|
@Delegate
|
||||||
|
AlarmAsyncApi getAlarmApiForRegion(@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.binders;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
import com.google.common.annotations.Beta;
|
||||||
|
import com.google.common.collect.ImmutableMultimap;
|
||||||
|
import org.jclouds.http.HttpRequest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Binds the alarm names request to the http request
|
||||||
|
*
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
@Beta
|
||||||
|
public class AlarmNamesBinder implements org.jclouds.rest.Binder {
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Override
|
||||||
|
public <R extends HttpRequest> R bindToRequest(R request, Object input) {
|
||||||
|
Iterable<String> alarmNames = (Iterable<String>) checkNotNull(input, "alarm names must be set");
|
||||||
|
ImmutableMultimap.Builder<String, String> formParameters = ImmutableMultimap.builder();
|
||||||
|
int alarmNameIndex = 1;
|
||||||
|
|
||||||
|
for (String alarmName : alarmNames) {
|
||||||
|
formParameters.put("AlarmNames.member." + alarmNameIndex, alarmName);
|
||||||
|
alarmNameIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (R) request.toBuilder().replaceFormParams(formParameters.build()).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -18,18 +18,23 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.cloudwatch.config;
|
package org.jclouds.cloudwatch.config;
|
||||||
|
|
||||||
import static org.jclouds.reflect.Reflection2.typeToken;
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.jclouds.aws.config.FormSigningRestClientModule;
|
import org.jclouds.aws.config.FormSigningRestClientModule;
|
||||||
import org.jclouds.cloudwatch.CloudWatchApi;
|
import org.jclouds.cloudwatch.CloudWatchApi;
|
||||||
import org.jclouds.cloudwatch.CloudWatchAsyncApi;
|
import org.jclouds.cloudwatch.CloudWatchAsyncApi;
|
||||||
|
import org.jclouds.cloudwatch.features.AlarmApi;
|
||||||
|
import org.jclouds.cloudwatch.features.AlarmAsyncApi;
|
||||||
import org.jclouds.cloudwatch.features.MetricApi;
|
import org.jclouds.cloudwatch.features.MetricApi;
|
||||||
import org.jclouds.cloudwatch.features.MetricAsyncApi;
|
import org.jclouds.cloudwatch.features.MetricAsyncApi;
|
||||||
|
import org.jclouds.cloudwatch.handlers.CloudWatchErrorHandler;
|
||||||
|
import org.jclouds.http.HttpErrorHandler;
|
||||||
|
import org.jclouds.http.annotation.ClientError;
|
||||||
|
import org.jclouds.http.annotation.ServerError;
|
||||||
import org.jclouds.rest.ConfiguresRestClient;
|
import org.jclouds.rest.ConfiguresRestClient;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableMap;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static org.jclouds.reflect.Reflection2.typeToken;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configures the Monitoring connection.
|
* Configures the Monitoring connection.
|
||||||
|
@ -40,10 +45,17 @@ import com.google.common.collect.ImmutableMap;
|
||||||
public class CloudWatchRestClientModule extends FormSigningRestClientModule<CloudWatchApi, CloudWatchAsyncApi> {
|
public class CloudWatchRestClientModule extends FormSigningRestClientModule<CloudWatchApi, CloudWatchAsyncApi> {
|
||||||
public static final Map<Class<?>, Class<?>> DELEGATE_MAP = ImmutableMap.<Class<?>, Class<?>> builder()//
|
public static final Map<Class<?>, Class<?>> DELEGATE_MAP = ImmutableMap.<Class<?>, Class<?>> builder()//
|
||||||
.put(MetricApi.class, MetricAsyncApi.class)
|
.put(MetricApi.class, MetricAsyncApi.class)
|
||||||
|
.put(AlarmApi.class, AlarmAsyncApi.class)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
public CloudWatchRestClientModule() {
|
public CloudWatchRestClientModule() {
|
||||||
super(typeToken(CloudWatchApi.class), typeToken(CloudWatchAsyncApi.class), DELEGATE_MAP);
|
super(typeToken(CloudWatchApi.class), typeToken(CloudWatchAsyncApi.class), DELEGATE_MAP);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void bindErrorHandlers() {
|
||||||
|
bind(HttpErrorHandler.class).annotatedWith(ClientError.class).to(CloudWatchErrorHandler.class);
|
||||||
|
bind(HttpErrorHandler.class).annotatedWith(ServerError.class).to(CloudWatchErrorHandler.class);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,329 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.domain;
|
||||||
|
|
||||||
|
import static com.google.common.base.Objects.equal;
|
||||||
|
import static com.google.common.base.Objects.toStringHelper;
|
||||||
|
import static com.google.common.base.Preconditions.checkArgument;
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.google.common.annotations.Beta;
|
||||||
|
import com.google.common.base.Objects;
|
||||||
|
import com.google.common.base.Optional;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see <a href="http://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_MetricAlarm.html" />
|
||||||
|
*
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
@Beta
|
||||||
|
public class Alarm {
|
||||||
|
|
||||||
|
public static enum State {
|
||||||
|
ALARM,
|
||||||
|
INSUFFICIENT_DATA,
|
||||||
|
OK,
|
||||||
|
UNRECOGNIZED;
|
||||||
|
|
||||||
|
public static State fromValue(String value) {
|
||||||
|
try {
|
||||||
|
return State.valueOf(checkNotNull(value, "value"));
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
return UNRECOGNIZED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private final boolean areActionsEnabled;
|
||||||
|
private final Set<String> alarmActions;
|
||||||
|
private final String alarmARN;
|
||||||
|
private final Date alarmConfigurationUpdatedTimestamp;
|
||||||
|
private final String alarmDescription;
|
||||||
|
private final String alarmName;
|
||||||
|
private final ComparisonOperator comparisonOperator;
|
||||||
|
private final Set<Dimension> dimensions;
|
||||||
|
private final int evaluationPeriods;
|
||||||
|
private final Set<String> insufficientDataActions;
|
||||||
|
private final String metricName;
|
||||||
|
private final String namespace;
|
||||||
|
private final Set<String> okActions;
|
||||||
|
private final int period;
|
||||||
|
private final String stateReason;
|
||||||
|
private final Optional<String> stateReasonData;
|
||||||
|
private final Date stateUpdatedTimestamp;
|
||||||
|
private final State state;
|
||||||
|
private final Statistics statistic;
|
||||||
|
private final double threshold;
|
||||||
|
private final Optional<Unit> unit;
|
||||||
|
|
||||||
|
public Alarm(boolean areActionsEnabled, Set<String> alarmActions, String alarmARN,
|
||||||
|
Date alarmConfigurationUpdatedTimestamp, String alarmDescription, String alarmName,
|
||||||
|
ComparisonOperator comparisonOperator, Set<Dimension> dimensions, int evaluationPeriods,
|
||||||
|
Set<String> insufficientDataActions, String metricName, String namespace, Set<String> okActions,
|
||||||
|
int period, String stateReason, Optional<String> stateReasonData, Date stateUpdatedTimestamp,
|
||||||
|
State state, Statistics statistic, double threshold, Optional<Unit> unit) {
|
||||||
|
this.alarmName = checkNotNull(alarmName, "alarmName");
|
||||||
|
this.areActionsEnabled = checkNotNull(areActionsEnabled, "actionsEnabled for %s", alarmName);
|
||||||
|
this.alarmActions = checkNotNull(alarmActions, "alarmActions for %s", alarmName);
|
||||||
|
this.alarmARN = checkNotNull(alarmARN, "alarmArn for %s", alarmName);
|
||||||
|
this.alarmConfigurationUpdatedTimestamp = checkNotNull(alarmConfigurationUpdatedTimestamp,
|
||||||
|
"alarmConfigurationUpdatedTimestamp for %s", alarmName);
|
||||||
|
this.alarmDescription = checkNotNull(alarmDescription, "alarmDescription for %s", alarmName);
|
||||||
|
this.comparisonOperator = checkNotNull(comparisonOperator, "comparisonOperator for %s", alarmName);
|
||||||
|
checkArgument(comparisonOperator != ComparisonOperator.UNRECOGNIZED, "comparisonOperator unrecognized");
|
||||||
|
this.dimensions = checkNotNull(dimensions, "dimensions for %s", alarmName);
|
||||||
|
this.evaluationPeriods = checkNotNull(evaluationPeriods, "evaluationPeriods for %s", alarmName);
|
||||||
|
this.insufficientDataActions = checkNotNull(insufficientDataActions, "insufficientDataActions for %s", alarmName);
|
||||||
|
this.metricName = checkNotNull(metricName, "metricName for %s", alarmName);
|
||||||
|
this.namespace = checkNotNull(namespace, "namespace for %s", alarmName);
|
||||||
|
this.okActions = checkNotNull(okActions, "okActions for %s", alarmName);
|
||||||
|
this.period = checkNotNull(period, "period for %s", alarmName);
|
||||||
|
this.stateReason = checkNotNull(stateReason, "stateReason for %s", alarmName);
|
||||||
|
this.stateReasonData = checkNotNull(stateReasonData, "stateReasonData for %s", alarmName);
|
||||||
|
this.stateUpdatedTimestamp = checkNotNull(stateUpdatedTimestamp, "stateUpdatedTimestamp for %s", alarmName);
|
||||||
|
this.state = checkNotNull(state, "state for %s", alarmName);
|
||||||
|
checkArgument(state != State.UNRECOGNIZED, "state unrecognized");
|
||||||
|
this.statistic = checkNotNull(statistic, "statistic for %s", alarmName);
|
||||||
|
checkArgument(statistic != Statistics.UNRECOGNIZED, "statistic unrecognized");
|
||||||
|
this.threshold = checkNotNull(threshold, "threshold for %s", alarmName);
|
||||||
|
this.unit = checkNotNull(unit, "unit for %s", alarmName);
|
||||||
|
if (unit.isPresent()) {
|
||||||
|
checkArgument(unit.get() != Unit.UNRECOGNIZED, "unit unrecognized");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return whether actions are enabled if the alarm state changes
|
||||||
|
*/
|
||||||
|
public boolean areActionsEnabled() {
|
||||||
|
return areActionsEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return list of actions to perform when the alarm state changes to {@link org.jclouds.cloudwatch.domain.Alarm.State#ALARM} from any other state
|
||||||
|
*/
|
||||||
|
public Set<String> getAlarmActions() {
|
||||||
|
return alarmActions;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the Amazon Resource Name (ARN) of the alarm
|
||||||
|
*/
|
||||||
|
public String getAlarmARN() {
|
||||||
|
return alarmARN;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the date timestamp of when the alarm was last updated
|
||||||
|
*/
|
||||||
|
public Date getAlarmConfigurationUpdatedTimestamp() {
|
||||||
|
return alarmConfigurationUpdatedTimestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the description of the alarm
|
||||||
|
*/
|
||||||
|
public String getAlarmDescription() {
|
||||||
|
return alarmDescription;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the name of the alarm
|
||||||
|
*/
|
||||||
|
public String getAlarmName() {
|
||||||
|
return alarmName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the arithmetic operation to use when comparing the specified statistic and threshold
|
||||||
|
*/
|
||||||
|
public ComparisonOperator getComparisonOperator() {
|
||||||
|
return comparisonOperator;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the list of dimensions associated with the alarm's associated metric
|
||||||
|
*/
|
||||||
|
public Set<Dimension> getDimensions() {
|
||||||
|
return dimensions;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the number of periods over which data is compared to the specified threshold
|
||||||
|
*/
|
||||||
|
public int getEvaluationPeriods() {
|
||||||
|
return evaluationPeriods;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the list of actions to execute when this alarm transitions into an {@link org.jclouds.cloudwatch.domain.Alarm.State#INSUFFICIENT_DATA} state
|
||||||
|
* from any other state
|
||||||
|
*/
|
||||||
|
public Set<String> getInsufficientDataActions() {
|
||||||
|
return insufficientDataActions;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the name of the alarm's metric
|
||||||
|
*/
|
||||||
|
public String getMetricName() {
|
||||||
|
return metricName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the namespace of alarm's associated metric
|
||||||
|
*/
|
||||||
|
public String getNamespace() {
|
||||||
|
return namespace;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the list of actions to execute when this alarm transitions into an {@link org.jclouds.cloudwatch.domain.Alarm.State#OK} state from any other
|
||||||
|
* state
|
||||||
|
*/
|
||||||
|
public Set<String> getOkActions() {
|
||||||
|
return okActions;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the period in seconds over which the statistic is applied
|
||||||
|
*/
|
||||||
|
public int getPeriod() {
|
||||||
|
return period;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the human-readable explanation for the alarm's state
|
||||||
|
*/
|
||||||
|
public String getStateReason() {
|
||||||
|
return stateReason;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the explanation for the alarm's state in machine-readable JSON format
|
||||||
|
*/
|
||||||
|
public Optional<String> getStateReasonData() {
|
||||||
|
return stateReasonData;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the time stamp of the last update to the alarm's state
|
||||||
|
*/
|
||||||
|
public Date getStateUpdatedTimestamp() {
|
||||||
|
return stateUpdatedTimestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the state value for the alarm
|
||||||
|
*/
|
||||||
|
public State getState() {
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the statistic to apply to the alarm's associated metric
|
||||||
|
*/
|
||||||
|
public Statistics getStatistic() {
|
||||||
|
return statistic;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the value against which the specified statistic is compared
|
||||||
|
*/
|
||||||
|
public double getThreshold() {
|
||||||
|
return threshold;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the unit of the alarm's associated metric
|
||||||
|
*/
|
||||||
|
public Optional<Unit> getUnit() {
|
||||||
|
return unit;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hashCode(alarmActions, alarmARN, alarmConfigurationUpdatedTimestamp, alarmDescription, alarmName,
|
||||||
|
areActionsEnabled, comparisonOperator, dimensions, evaluationPeriods,
|
||||||
|
insufficientDataActions, metricName, namespace, okActions, period, stateReason,
|
||||||
|
stateReasonData, stateUpdatedTimestamp, state, statistic, threshold, unit);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj)
|
||||||
|
return true;
|
||||||
|
if (obj == null)
|
||||||
|
return false;
|
||||||
|
if (getClass() != obj.getClass())
|
||||||
|
return false;
|
||||||
|
Alarm other = (Alarm) obj;
|
||||||
|
return equal(this.alarmActions, other.alarmActions) &&
|
||||||
|
equal(this.alarmARN, other.alarmARN) &&
|
||||||
|
equal(this.alarmConfigurationUpdatedTimestamp, other.alarmConfigurationUpdatedTimestamp) &&
|
||||||
|
equal(this.alarmDescription, other.alarmDescription) &&
|
||||||
|
equal(this.alarmName, other.alarmName) &&
|
||||||
|
equal(this.areActionsEnabled, other.areActionsEnabled) &&
|
||||||
|
equal(this.comparisonOperator, other.comparisonOperator) &&
|
||||||
|
equal(this.dimensions, other.dimensions) &&
|
||||||
|
equal(this.evaluationPeriods, other.evaluationPeriods) &&
|
||||||
|
equal(this.insufficientDataActions, other.insufficientDataActions) &&
|
||||||
|
equal(this.metricName, other.metricName) &&
|
||||||
|
equal(this.namespace, other.namespace) &&
|
||||||
|
equal(this.okActions, other.okActions) &&
|
||||||
|
equal(this.period, other.period) &&
|
||||||
|
equal(this.stateReason, other.stateReason) &&
|
||||||
|
equal(this.stateReasonData, other.stateReasonData) &&
|
||||||
|
equal(this.stateUpdatedTimestamp, other.stateUpdatedTimestamp) &&
|
||||||
|
equal(this.state, other.state) &&
|
||||||
|
equal(this.statistic, other.statistic) &&
|
||||||
|
equal(this.threshold, other.threshold) &&
|
||||||
|
equal(this.unit, other.unit);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return toStringHelper(this)
|
||||||
|
.add("alarmActions", alarmActions)
|
||||||
|
.add("alarmARN", alarmARN)
|
||||||
|
.add("alarmConfigurationUpdateTimestamp", alarmConfigurationUpdatedTimestamp)
|
||||||
|
.add("alarmDescription", alarmDescription)
|
||||||
|
.add("alarmName", alarmName)
|
||||||
|
.add("areActionsEnabled", areActionsEnabled)
|
||||||
|
.add("comparisonOperator", comparisonOperator)
|
||||||
|
.add("dimensions", dimensions)
|
||||||
|
.add("evaluationPeriods", evaluationPeriods)
|
||||||
|
.add("insufficientDataActions", insufficientDataActions)
|
||||||
|
.add("metricName", metricName)
|
||||||
|
.add("namespace", namespace)
|
||||||
|
.add("okActions", okActions)
|
||||||
|
.add("period", period)
|
||||||
|
.add("stateReason", stateReason)
|
||||||
|
.add("stateReasonData", stateReasonData.orNull())
|
||||||
|
.add("stateUpdatedTimestamp", stateUpdatedTimestamp)
|
||||||
|
.add("state", state)
|
||||||
|
.add("statistic", statistic)
|
||||||
|
.add("threshold", threshold)
|
||||||
|
.add("unit", unit.orNull()).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,119 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.domain;
|
||||||
|
|
||||||
|
import static com.google.common.base.Objects.equal;
|
||||||
|
import static com.google.common.base.Objects.toStringHelper;
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import com.google.common.annotations.Beta;
|
||||||
|
import com.google.common.base.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see <a href="http://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_AlarmHistoryItem.html" />
|
||||||
|
*
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
@Beta
|
||||||
|
public class AlarmHistoryItem {
|
||||||
|
|
||||||
|
private final String alarmName;
|
||||||
|
private final String historyData;
|
||||||
|
private final HistoryItemType historyItemType;
|
||||||
|
private final String historySummary;
|
||||||
|
private final Date timestamp;
|
||||||
|
|
||||||
|
public AlarmHistoryItem(String alarmName, String historyData, HistoryItemType historyItemType,
|
||||||
|
String historySummary, Date timestamp) {
|
||||||
|
this.alarmName = checkNotNull(alarmName, "alarmName");
|
||||||
|
this.historyData = checkNotNull(historyData, "historyData for %s", alarmName);
|
||||||
|
this.historyItemType = checkNotNull(historyItemType, "historyItemType for %s", alarmName);
|
||||||
|
this.historySummary = checkNotNull(historySummary, "historySummary for %s", alarmName);
|
||||||
|
this.timestamp = checkNotNull(timestamp, "timestamp for %s", alarmName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the descriptive name for the alarm
|
||||||
|
*/
|
||||||
|
public String getAlarmName() {
|
||||||
|
return alarmName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the machine-readable data about the alarm in JSON format
|
||||||
|
*/
|
||||||
|
public String getHistoryData() {
|
||||||
|
return historyData;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the type of alarm history item
|
||||||
|
*/
|
||||||
|
public HistoryItemType getHistoryItemType() {
|
||||||
|
return historyItemType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the human-readable summary of the alarm history
|
||||||
|
*/
|
||||||
|
public String getHistorySummary() {
|
||||||
|
return historySummary;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the time stamp for the alarm history item
|
||||||
|
*/
|
||||||
|
public Date getTimestamp() {
|
||||||
|
return timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hashCode(alarmName, historyData, historyItemType, historySummary, timestamp);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj)
|
||||||
|
return true;
|
||||||
|
if (obj == null)
|
||||||
|
return false;
|
||||||
|
if (getClass() != obj.getClass())
|
||||||
|
return false;
|
||||||
|
AlarmHistoryItem other = (AlarmHistoryItem) obj;
|
||||||
|
return equal(this.alarmName, other.alarmName) &&
|
||||||
|
equal(this.historyData, other.historyData) &&
|
||||||
|
equal(this.historyItemType, other.historyItemType) &&
|
||||||
|
equal(this.historySummary, other.historySummary) &&
|
||||||
|
equal(this.timestamp, other.timestamp);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return toStringHelper(this)
|
||||||
|
.add("alarmName", alarmName)
|
||||||
|
.add("historyData", historyData)
|
||||||
|
.add("historyItemType", historyItemType)
|
||||||
|
.add("historySummary", historySummary)
|
||||||
|
.add("timestamp", timestamp).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.domain;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
import com.google.common.annotations.Beta;
|
||||||
|
import com.google.common.base.CaseFormat;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see <a href="http://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_MetricAlarm.html" />
|
||||||
|
*
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
@Beta
|
||||||
|
public enum ComparisonOperator {
|
||||||
|
|
||||||
|
GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
|
||||||
|
GREATER_THAN_THRESHOLD,
|
||||||
|
LESS_THAN_THRESHOLD,
|
||||||
|
LESS_THAN_OR_EQUAL_TO_THRESHOLD,
|
||||||
|
UNRECOGNIZED;
|
||||||
|
|
||||||
|
public String value() {
|
||||||
|
return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, name());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return value();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ComparisonOperator fromValue(String value) {
|
||||||
|
try {
|
||||||
|
return valueOf(CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, checkNotNull(value, "value")));
|
||||||
|
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
return UNRECOGNIZED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.domain;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
import com.google.common.annotations.Beta;
|
||||||
|
import com.google.common.base.CaseFormat;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see <a href="http://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_AlarmHistoryItem.html" />
|
||||||
|
*
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
@Beta
|
||||||
|
public enum HistoryItemType {
|
||||||
|
|
||||||
|
CONFIGURATION_UPDATE,
|
||||||
|
STATE_UPDATE,
|
||||||
|
ACTION,
|
||||||
|
UNRECOGNIZED;
|
||||||
|
|
||||||
|
public String value() {
|
||||||
|
return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, name());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return value();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HistoryItemType fromValue(String value) {
|
||||||
|
try {
|
||||||
|
return valueOf(CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, checkNotNull(value, "value")));
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
return UNRECOGNIZED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -66,10 +66,10 @@ public enum Unit {
|
||||||
return value();
|
return value();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Unit fromValue(String state) {
|
public static Unit fromValue(String value) {
|
||||||
try {
|
try {
|
||||||
return valueOf(CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, checkNotNull(state, "state").replace(
|
return valueOf(CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, checkNotNull(value, "value").replace(
|
||||||
"/", "_PER_")));
|
"/", "Per")));
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
return UNRECOGNIZED;
|
return UNRECOGNIZED;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,142 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.features;
|
||||||
|
|
||||||
|
import com.google.common.annotations.Beta;
|
||||||
|
import com.google.common.collect.FluentIterable;
|
||||||
|
import org.jclouds.cloudwatch.domain.Alarm;
|
||||||
|
import org.jclouds.cloudwatch.domain.AlarmHistoryItem;
|
||||||
|
import org.jclouds.cloudwatch.options.ListAlarmHistoryOptions;
|
||||||
|
import org.jclouds.cloudwatch.options.ListAlarmsForMetric;
|
||||||
|
import org.jclouds.cloudwatch.options.ListAlarmsOptions;
|
||||||
|
import org.jclouds.cloudwatch.options.SaveAlarmOptions;
|
||||||
|
import org.jclouds.collect.IterableWithMarker;
|
||||||
|
import org.jclouds.collect.PagedIterable;
|
||||||
|
import org.jclouds.javax.annotation.Nullable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides access to Amazon CloudWatch via the Query API
|
||||||
|
* <p/>
|
||||||
|
*
|
||||||
|
* @see AlarmAsyncApi
|
||||||
|
* @see <a href="http://docs.amazonwebservices.com/AmazonCloudWatch/latest/APIReference" />
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
@Beta
|
||||||
|
public interface AlarmApi {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes all specified alarms.
|
||||||
|
*
|
||||||
|
* <p/>
|
||||||
|
* <h3>Note</h3> In the event of an error, no alarms are deleted.
|
||||||
|
*
|
||||||
|
* @param alarmNames the list of alarms to delete
|
||||||
|
*/
|
||||||
|
void delete(Iterable<String> alarmNames);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return all history for all alarms.
|
||||||
|
*
|
||||||
|
* @return the response object
|
||||||
|
*/
|
||||||
|
PagedIterable<AlarmHistoryItem> listHistory();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return all history based on the options query
|
||||||
|
*
|
||||||
|
* @return the response object
|
||||||
|
*/
|
||||||
|
PagedIterable<AlarmHistoryItem> listHistory(ListAlarmHistoryOptions options);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a single page of history for the specified alarm.
|
||||||
|
*
|
||||||
|
* @param nextToken the token corresponding with the data you want to get
|
||||||
|
*
|
||||||
|
* @return the response object
|
||||||
|
*/
|
||||||
|
IterableWithMarker<AlarmHistoryItem> listHistoryAt(String nextToken);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return all alarms.
|
||||||
|
*
|
||||||
|
* @return the response object
|
||||||
|
*/
|
||||||
|
PagedIterable<Alarm> list();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return all alarms based on the options query
|
||||||
|
*
|
||||||
|
* @param options the options describing the alarms query
|
||||||
|
*
|
||||||
|
* @return the response object
|
||||||
|
*/
|
||||||
|
PagedIterable<Alarm> list(ListAlarmsOptions options);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a single page of alarms based on the options query
|
||||||
|
*
|
||||||
|
* @param nextToken the token corresponding with the data you want to get
|
||||||
|
*
|
||||||
|
* @return the response object
|
||||||
|
*/
|
||||||
|
IterableWithMarker<Alarm> listAt(String nextToken);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return alarms all alarms for a single metric.
|
||||||
|
*
|
||||||
|
* @param options the options describing the alarms for metric query
|
||||||
|
*
|
||||||
|
* @return the response object
|
||||||
|
*/
|
||||||
|
FluentIterable<Alarm> listForMetric(ListAlarmsForMetric options);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disables actions for the specified alarms.
|
||||||
|
*
|
||||||
|
* @param alarmNames the list of alarms to disable
|
||||||
|
*/
|
||||||
|
void disable(Iterable<String> alarmNames);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enables actions for the specified alarms.
|
||||||
|
*
|
||||||
|
* @param alarmNames the list of alarms to enable
|
||||||
|
*/
|
||||||
|
void enable(Iterable<String> alarmNames);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates or updates an alarm and associates it with the specified Amazon CloudWatch metric.
|
||||||
|
*
|
||||||
|
* @param options the options describing the metric alarm to create/update
|
||||||
|
*/
|
||||||
|
void save(SaveAlarmOptions options);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Temporarily sets the state of an alarm.
|
||||||
|
*
|
||||||
|
* @param alarmName the descriptive name for the alarm
|
||||||
|
* @param stateReason the reason that this alarm is set to this specific state (in human-readable text format)
|
||||||
|
* @param stateReasonData the reason that this alarm is set to this specific state (in machine-readable JSON format)
|
||||||
|
* @param state the value of the state
|
||||||
|
*/
|
||||||
|
void setState(String alarmName, String stateReason, @Nullable String stateReasonData, Alarm.State state);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,195 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.features;
|
||||||
|
|
||||||
|
import javax.inject.Named;
|
||||||
|
import javax.ws.rs.FormParam;
|
||||||
|
import javax.ws.rs.POST;
|
||||||
|
import javax.ws.rs.Path;
|
||||||
|
|
||||||
|
import com.google.common.annotations.Beta;
|
||||||
|
import com.google.common.collect.FluentIterable;
|
||||||
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
|
import org.jclouds.Fallbacks;
|
||||||
|
import org.jclouds.aws.filters.FormSigner;
|
||||||
|
import org.jclouds.cloudwatch.binders.AlarmNamesBinder;
|
||||||
|
import org.jclouds.cloudwatch.domain.Alarm;
|
||||||
|
import org.jclouds.cloudwatch.domain.AlarmHistoryItem;
|
||||||
|
import org.jclouds.cloudwatch.functions.ListAlarmsToPagedIterable;
|
||||||
|
import org.jclouds.cloudwatch.options.ListAlarmHistoryOptions;
|
||||||
|
import org.jclouds.cloudwatch.options.ListAlarmsForMetric;
|
||||||
|
import org.jclouds.cloudwatch.options.ListAlarmsOptions;
|
||||||
|
import org.jclouds.cloudwatch.options.SaveAlarmOptions;
|
||||||
|
import org.jclouds.cloudwatch.xml.ListAlarmHistoryResponseHandler;
|
||||||
|
import org.jclouds.cloudwatch.xml.ListAlarmsForMetricResponseHandler;
|
||||||
|
import org.jclouds.cloudwatch.xml.ListAlarmsResponseHandler;
|
||||||
|
import org.jclouds.collect.IterableWithMarker;
|
||||||
|
import org.jclouds.collect.PagedIterable;
|
||||||
|
import org.jclouds.javax.annotation.Nullable;
|
||||||
|
import org.jclouds.rest.annotations.BinderParam;
|
||||||
|
import org.jclouds.rest.annotations.Fallback;
|
||||||
|
import org.jclouds.rest.annotations.FormParams;
|
||||||
|
import org.jclouds.rest.annotations.RequestFilters;
|
||||||
|
import org.jclouds.rest.annotations.Transform;
|
||||||
|
import org.jclouds.rest.annotations.VirtualHost;
|
||||||
|
import org.jclouds.rest.annotations.XMLResponseParser;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides access to Amazon CloudWatch via the Query API
|
||||||
|
* <p/>
|
||||||
|
*
|
||||||
|
* @see <a href="http://docs.amazonwebservices.com/AmazonCloudWatch/latest/APIReference" />
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
@RequestFilters(FormSigner.class)
|
||||||
|
@VirtualHost
|
||||||
|
@Beta
|
||||||
|
public interface AlarmAsyncApi {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see AlarmApi#delete(Iterable)
|
||||||
|
*/
|
||||||
|
@Named("DeleteAlarms")
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@FormParams(keys = "Action", values = "DeleteAlarms")
|
||||||
|
ListenableFuture<Void> delete(@BinderParam(AlarmNamesBinder.class) Iterable<String> alarmNames);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see AlarmApi#listHistory()
|
||||||
|
*/
|
||||||
|
@Named("DescribeAlarmHistory")
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@XMLResponseParser(ListAlarmHistoryResponseHandler.class)
|
||||||
|
@FormParams(keys = "Action", values = "DescribeAlarmHistory")
|
||||||
|
@Transform(ListAlarmsToPagedIterable.class)
|
||||||
|
@Fallback(Fallbacks.EmptyIterableWithMarkerOnNotFoundOr404.class)
|
||||||
|
ListenableFuture<? extends PagedIterable<AlarmHistoryItem>> listHistory();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see AlarmApi#listHistory(org.jclouds.cloudwatch.options.ListAlarmHistoryOptions)
|
||||||
|
*/
|
||||||
|
@Named("DescribeAlarmHistory")
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@XMLResponseParser(ListAlarmHistoryResponseHandler.class)
|
||||||
|
@FormParams(keys = "Action", values = "DescribeAlarmHistory")
|
||||||
|
@Transform(ListAlarmsToPagedIterable.class)
|
||||||
|
@Fallback(Fallbacks.EmptyIterableWithMarkerOnNotFoundOr404.class)
|
||||||
|
ListenableFuture<? extends PagedIterable<AlarmHistoryItem>> listHistory(ListAlarmHistoryOptions options);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see AlarmApi#listHistoryAt(String)
|
||||||
|
*/
|
||||||
|
@Named("DescribeAlarmHistory")
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@XMLResponseParser(ListAlarmHistoryResponseHandler.class)
|
||||||
|
@FormParams(keys = "Action", values = "DescribeAlarmHistory")
|
||||||
|
@Fallback(Fallbacks.EmptyIterableWithMarkerOnNotFoundOr404.class)
|
||||||
|
ListenableFuture<? extends IterableWithMarker<AlarmHistoryItem>> listHistoryAt(@FormParam("NextToken")
|
||||||
|
String nextToken);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see org.jclouds.cloudwatch.features.AlarmApi#list()
|
||||||
|
*/
|
||||||
|
@Named("DescribeAlarms")
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@XMLResponseParser(ListAlarmsResponseHandler.class)
|
||||||
|
@FormParams(keys = "Action", values = "DescribeAlarms")
|
||||||
|
@Transform(ListAlarmsToPagedIterable.class)
|
||||||
|
@Fallback(Fallbacks.EmptyIterableWithMarkerOnNotFoundOr404.class)
|
||||||
|
ListenableFuture<? extends PagedIterable<Alarm>> list();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see AlarmApi#list(org.jclouds.cloudwatch.options.ListAlarmsOptions)
|
||||||
|
*/
|
||||||
|
@Named("DescribeAlarms")
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@XMLResponseParser(ListAlarmsResponseHandler.class)
|
||||||
|
@FormParams(keys = "Action", values = "DescribeAlarms")
|
||||||
|
@Transform(ListAlarmsToPagedIterable.class)
|
||||||
|
@Fallback(Fallbacks.EmptyIterableWithMarkerOnNotFoundOr404.class)
|
||||||
|
ListenableFuture<? extends PagedIterable<Alarm>> list(ListAlarmsOptions options);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see AlarmApi#listAt(String)
|
||||||
|
*/
|
||||||
|
@Named("DescribeAlarms")
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@XMLResponseParser(ListAlarmsResponseHandler.class)
|
||||||
|
@FormParams(keys = "Action", values = "DescribeAlarms")
|
||||||
|
@Fallback(Fallbacks.EmptyIterableWithMarkerOnNotFoundOr404.class)
|
||||||
|
ListenableFuture<? extends IterableWithMarker<Alarm>> listAt(@FormParam("NextToken") String nextToken);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see AlarmApi#listForMetric(org.jclouds.cloudwatch.options.ListAlarmsForMetric)
|
||||||
|
*/
|
||||||
|
@Named("DescribeAlarmsForMetric")
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@XMLResponseParser(ListAlarmsForMetricResponseHandler.class)
|
||||||
|
@FormParams(keys = "Action", values = "DescribeAlarmsForMetric")
|
||||||
|
@Fallback(Fallbacks.EmptyIterableWithMarkerOnNotFoundOr404.class)
|
||||||
|
ListenableFuture<? extends FluentIterable<Alarm>> listForMetric(ListAlarmsForMetric options);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see AlarmApi#disable(Iterable)
|
||||||
|
*/
|
||||||
|
@Named("DisableAlarmActions")
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@FormParams(keys = "Action", values = "DisableAlarmActions")
|
||||||
|
ListenableFuture<Void> disable(@BinderParam(AlarmNamesBinder.class) Iterable<String> alarmNames);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see AlarmApi#enable(Iterable)
|
||||||
|
*/
|
||||||
|
@Named("EnableAlarmActions")
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@FormParams(keys = "Action", values = "EnableAlarmActions")
|
||||||
|
ListenableFuture<Void> enable(@BinderParam(AlarmNamesBinder.class) Iterable<String> alarmNames);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see AlarmApi#save(org.jclouds.cloudwatch.options.SaveAlarmOptions)
|
||||||
|
*/
|
||||||
|
@Named("PutMetricAlarm")
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@FormParams(keys = "Action", values = "PutMetricAlarm")
|
||||||
|
ListenableFuture<Void> save(SaveAlarmOptions options);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see AlarmApi#setState(String, String, String, org.jclouds.cloudwatch.domain.Alarm.State)
|
||||||
|
*/
|
||||||
|
@Named("SetAlarmState")
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@FormParams(keys = "Action", values = "SetAlarmState")
|
||||||
|
ListenableFuture<Void> setState(@FormParam("AlarmName") String alarmName,
|
||||||
|
@FormParam("StateReason") String stateReason,
|
||||||
|
@FormParam("StateReasonData") @Nullable String stateReasonData,
|
||||||
|
@FormParam("StateValue") Alarm.State state);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.functions;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
import com.google.common.annotations.Beta;
|
||||||
|
import com.google.common.base.Function;
|
||||||
|
import com.google.inject.Inject;
|
||||||
|
import org.jclouds.cloudwatch.CloudWatchApi;
|
||||||
|
import org.jclouds.cloudwatch.domain.AlarmHistoryItem;
|
||||||
|
import org.jclouds.cloudwatch.features.AlarmApi;
|
||||||
|
import org.jclouds.collect.IterableWithMarker;
|
||||||
|
import org.jclouds.collect.internal.CallerArg0ToPagedIterable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
@Beta
|
||||||
|
public class ListAlarmHistoryToPagedIterable
|
||||||
|
extends CallerArg0ToPagedIterable<AlarmHistoryItem, ListAlarmHistoryToPagedIterable> {
|
||||||
|
|
||||||
|
private final CloudWatchApi api;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
ListAlarmHistoryToPagedIterable(CloudWatchApi api) {
|
||||||
|
this.api = checkNotNull(api, "api");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Function<Object, IterableWithMarker<AlarmHistoryItem>> markerToNextForCallingArg0(final String arg0) {
|
||||||
|
final AlarmApi alarmApi = api.getAlarmApiForRegion(arg0);
|
||||||
|
return new Function<Object, IterableWithMarker<AlarmHistoryItem>>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IterableWithMarker<AlarmHistoryItem> apply(Object input) {
|
||||||
|
return alarmApi.listHistoryAt(input.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "listHistory(" + arg0 + ")";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.functions;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
import com.google.common.annotations.Beta;
|
||||||
|
import com.google.common.base.Function;
|
||||||
|
import com.google.inject.Inject;
|
||||||
|
import org.jclouds.cloudwatch.CloudWatchApi;
|
||||||
|
import org.jclouds.cloudwatch.domain.Alarm;
|
||||||
|
import org.jclouds.cloudwatch.features.AlarmApi;
|
||||||
|
import org.jclouds.collect.IterableWithMarker;
|
||||||
|
import org.jclouds.collect.internal.CallerArg0ToPagedIterable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
@Beta
|
||||||
|
public class ListAlarmsToPagedIterable
|
||||||
|
extends CallerArg0ToPagedIterable<Alarm, ListAlarmsToPagedIterable> {
|
||||||
|
|
||||||
|
private final CloudWatchApi api;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
ListAlarmsToPagedIterable(CloudWatchApi api) {
|
||||||
|
this.api = checkNotNull(api, "api");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Function<Object, IterableWithMarker<Alarm>> markerToNextForCallingArg0(final String arg0) {
|
||||||
|
final AlarmApi alarmApi = api.getAlarmApiForRegion(arg0);
|
||||||
|
return new Function<Object, IterableWithMarker<Alarm>>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IterableWithMarker<Alarm> apply(Object input) {
|
||||||
|
return alarmApi.listAt(input.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "listAlarms(" + arg0 + ")";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,86 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.handlers;
|
||||||
|
|
||||||
|
import static org.jclouds.http.HttpUtils.closeClientButKeepContentStream;
|
||||||
|
import static org.jclouds.http.HttpUtils.releasePayload;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Provider;
|
||||||
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
|
import com.google.common.annotations.Beta;
|
||||||
|
import org.jclouds.aws.AWSResponseException;
|
||||||
|
import org.jclouds.aws.domain.AWSError;
|
||||||
|
import org.jclouds.aws.xml.ErrorHandler;
|
||||||
|
import org.jclouds.http.HttpCommand;
|
||||||
|
import org.jclouds.http.HttpErrorHandler;
|
||||||
|
import org.jclouds.http.HttpResponse;
|
||||||
|
import org.jclouds.http.HttpResponseException;
|
||||||
|
import org.jclouds.http.functions.ParseSax;
|
||||||
|
import org.jclouds.rest.InsufficientResourcesException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
@Beta
|
||||||
|
@Singleton
|
||||||
|
public class CloudWatchErrorHandler implements HttpErrorHandler {
|
||||||
|
|
||||||
|
private final ParseSax.Factory factory;
|
||||||
|
private final Provider<ErrorHandler> handlers;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
CloudWatchErrorHandler(ParseSax.Factory factory, Provider<ErrorHandler> handlers) {
|
||||||
|
this.factory = factory;
|
||||||
|
this.handlers = handlers;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleError(HttpCommand command, HttpResponse response) {
|
||||||
|
Exception exception = new HttpResponseException(command, response);
|
||||||
|
try {
|
||||||
|
if (response.getPayload() != null) {
|
||||||
|
AWSError error = factory.create(handlers.get())
|
||||||
|
.parse(new String(closeClientButKeepContentStream(response)));
|
||||||
|
exception = refineException(new AWSResponseException(command, response, error));
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
releasePayload(response);
|
||||||
|
command.setException(exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Exception refineException(AWSResponseException in) {
|
||||||
|
int statusCode = in.getResponse().getStatusCode();
|
||||||
|
String errorCode = in.getError().getCode();
|
||||||
|
String message = in.getError().getMessage();
|
||||||
|
|
||||||
|
if (statusCode == 400) {
|
||||||
|
if ("LimitExceeded".equals(errorCode)) {
|
||||||
|
return new InsufficientResourcesException(message, in);
|
||||||
|
} else if ("InvalidFormat".equals(errorCode)) {
|
||||||
|
return new IllegalArgumentException(message, in);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return in;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,108 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.options;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkArgument;
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import com.google.common.annotations.Beta;
|
||||||
|
import org.jclouds.cloudwatch.domain.HistoryItemType;
|
||||||
|
import org.jclouds.date.DateService;
|
||||||
|
import org.jclouds.date.internal.SimpleDateFormatDateService;
|
||||||
|
import org.jclouds.http.options.BaseHttpRequestOptions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Options used to describe alarm history.
|
||||||
|
*
|
||||||
|
* @see <a href="http://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_DescribeAlarmHistory.html" />
|
||||||
|
*
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
@Beta
|
||||||
|
public class ListAlarmHistoryOptions extends BaseHttpRequestOptions {
|
||||||
|
|
||||||
|
private static final DateService dateService = new SimpleDateFormatDateService();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the alarm you want to filter against.
|
||||||
|
*
|
||||||
|
* @param alarmName the name of the alarm you want to filter against
|
||||||
|
*
|
||||||
|
* @return this {@code ListAlarmHistoryOptions} object
|
||||||
|
*/
|
||||||
|
public ListAlarmHistoryOptions alarmName(String alarmName) {
|
||||||
|
checkNotNull(alarmName, "alarmName");
|
||||||
|
checkArgument(alarmName.length() <= 255, "alarmName must be between 1 and 255 characters in length");
|
||||||
|
formParameters.put("AlarmName", alarmName);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The ending date to retrieve alarm history.
|
||||||
|
*
|
||||||
|
* @param endDate the ending date to retrieve alarm history
|
||||||
|
*
|
||||||
|
* @return this {@code ListAlarmHistoryOptions} object
|
||||||
|
*/
|
||||||
|
public ListAlarmHistoryOptions endDate(Date endDate) {
|
||||||
|
formParameters.put("EndDate", dateService.iso8601DateFormat(checkNotNull(endDate, "endDate")));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type of alarm histories to retrieve.
|
||||||
|
*
|
||||||
|
* @param historyItemType type of alarm histories to retrieve
|
||||||
|
*
|
||||||
|
* @return this {@code ListAlarmHistoryOptions} object
|
||||||
|
*/
|
||||||
|
public ListAlarmHistoryOptions historyItemType(HistoryItemType historyItemType) {
|
||||||
|
checkNotNull(historyItemType, "historyItemType");
|
||||||
|
checkArgument(historyItemType != HistoryItemType.UNRECOGNIZED, "historyItemType unrecognized");
|
||||||
|
formParameters.put("HistoryItemType", historyItemType.toString());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The maximum number of alarm history records to retrieve.
|
||||||
|
*
|
||||||
|
* @param maxRecords maximum number of alarm history records to retrieve
|
||||||
|
*
|
||||||
|
* @return this {@code ListAlarmHistoryOptions} object
|
||||||
|
*/
|
||||||
|
public ListAlarmHistoryOptions maxRecords(int maxRecords) {
|
||||||
|
formParameters.put("MaxRecords", checkNotNull(maxRecords, "maxRecords").toString());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The starting date to retrieve alarm history.
|
||||||
|
*
|
||||||
|
* @param startDate the starting date to retrieve alarm history
|
||||||
|
*
|
||||||
|
* @return this {@code ListAlarmHistoryOptions} object
|
||||||
|
*/
|
||||||
|
public ListAlarmHistoryOptions startDate(Date startDate) {
|
||||||
|
formParameters.put("StartDate", dateService.iso8601DateFormat(checkNotNull(startDate, "startDate")));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,142 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.options;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkArgument;
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.google.common.annotations.Beta;
|
||||||
|
import org.jclouds.cloudwatch.domain.Dimension;
|
||||||
|
import org.jclouds.cloudwatch.domain.Statistics;
|
||||||
|
import org.jclouds.cloudwatch.domain.Unit;
|
||||||
|
import org.jclouds.http.options.BaseHttpRequestOptions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Options used to describe alarms for metric.
|
||||||
|
*
|
||||||
|
* @see <a href="http://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_DescribeAlarmsForMetric.html" />
|
||||||
|
*
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
@Beta
|
||||||
|
public class ListAlarmsForMetric extends BaseHttpRequestOptions {
|
||||||
|
|
||||||
|
int dimensionIndex = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The list of dimensions associated with the metric.
|
||||||
|
*
|
||||||
|
* @param dimensions the list of dimensions associated with the metric
|
||||||
|
*
|
||||||
|
* @return this {@code ListAlarmsForMetric} object
|
||||||
|
*/
|
||||||
|
public ListAlarmsForMetric dimensions(Set<Dimension> dimensions) {
|
||||||
|
for (Dimension dimension : checkNotNull(dimensions, "dimensions")) {
|
||||||
|
dimension(dimension);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The dimension associated with the metric.
|
||||||
|
*
|
||||||
|
* @param dimension the dimension associated with the metric
|
||||||
|
*
|
||||||
|
* @return this {@code ListAlarmsForMetric} object
|
||||||
|
*/
|
||||||
|
public ListAlarmsForMetric dimension(Dimension dimension) {
|
||||||
|
checkNotNull(dimension, "dimension");
|
||||||
|
checkArgument(dimensionIndex <= 10, "maximum number of dimensions is 10");
|
||||||
|
formParameters.put("Dimensions.member." + dimensionIndex + ".Name", dimension.getName());
|
||||||
|
formParameters.put("Dimensions.member." + dimensionIndex + ".Value", dimension.getValue());
|
||||||
|
dimensionIndex++;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the metric.
|
||||||
|
*
|
||||||
|
* @param metricName the name of the metric
|
||||||
|
*
|
||||||
|
* @return this {@code ListAlarmsForMetric} object
|
||||||
|
*/
|
||||||
|
public ListAlarmsForMetric metricName(String metricName) {
|
||||||
|
checkNotNull(metricName, "metricName");
|
||||||
|
checkArgument(metricName.length() <= 255, "metricName must be between 1 and 255 characters in length");
|
||||||
|
formParameters.put("MetricName", metricName);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The namespace of the metric.
|
||||||
|
*
|
||||||
|
* @param namespace namespace of the metric
|
||||||
|
*
|
||||||
|
* @return this {@code ListAlarmsForMetric} object
|
||||||
|
*/
|
||||||
|
public ListAlarmsForMetric namespace(String namespace) {
|
||||||
|
checkNotNull(namespace, "namespace");
|
||||||
|
checkArgument(namespace.length() <= 255, "namespace must be between 1 and 255 characters in length");
|
||||||
|
formParameters.put("Namespace", namespace);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The period in seconds over which the statistic is applied.
|
||||||
|
*
|
||||||
|
* @param period period in seconds over which the statistic is applied
|
||||||
|
*
|
||||||
|
* @return this {@code ListAlarmsForMetric} object
|
||||||
|
*/
|
||||||
|
public ListAlarmsForMetric period(int period) {
|
||||||
|
formParameters.put("Period", checkNotNull(period, "period").toString());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The statistic for the metric.
|
||||||
|
*
|
||||||
|
* @param statistic statistic for the metric
|
||||||
|
*
|
||||||
|
* @return this {@code ListAlarmsForMetric} object
|
||||||
|
*/
|
||||||
|
public ListAlarmsForMetric statistic(Statistics statistic) {
|
||||||
|
checkNotNull(statistic, "statistic");
|
||||||
|
checkArgument(statistic != Statistics.UNRECOGNIZED, "statistic unrecognized");
|
||||||
|
formParameters.put("Statistic", statistic.toString());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The unit for the metric.
|
||||||
|
*
|
||||||
|
* @param unit unit for the metric
|
||||||
|
*
|
||||||
|
* @return this {@code ListAlarmsForMetric} object
|
||||||
|
*/
|
||||||
|
public ListAlarmsForMetric unit(Unit unit) {
|
||||||
|
checkNotNull(unit, "unit");
|
||||||
|
checkArgument(unit != Unit.UNRECOGNIZED, "unit unrecognized");
|
||||||
|
formParameters.put("Unit", unit.toString());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,122 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.options;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkArgument;
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.jclouds.cloudwatch.domain.Alarm;
|
||||||
|
import org.jclouds.http.options.BaseHttpRequestOptions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Options used to describe alarms.
|
||||||
|
*
|
||||||
|
* @see <a href="http://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_DescribeAlarms.html" />
|
||||||
|
*
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
public class ListAlarmsOptions extends BaseHttpRequestOptions {
|
||||||
|
|
||||||
|
int alarmIndex = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The action name prefix.
|
||||||
|
*
|
||||||
|
* @param actionPrefix the action name prefix
|
||||||
|
*
|
||||||
|
* @return this {@code ListAlarmsOptions} object
|
||||||
|
*/
|
||||||
|
public ListAlarmsOptions actionPrefix(String actionPrefix) {
|
||||||
|
checkNotNull(actionPrefix, "actionPrefix");
|
||||||
|
checkArgument(actionPrefix.length() <= 1024, "actionPrefix must be between 1 and 1024 characters in length");
|
||||||
|
formParameters.put("ActionPrefix", actionPrefix);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The alarm name prefix.
|
||||||
|
*
|
||||||
|
* @param alarmNamePrefix the alarm name prefix
|
||||||
|
*
|
||||||
|
* @return this {@code ListAlarmsOptions} object
|
||||||
|
*/
|
||||||
|
public ListAlarmsOptions alarmNamePrefix(String alarmNamePrefix) {
|
||||||
|
checkNotNull(alarmNamePrefix, "alarmNamePrefix");
|
||||||
|
checkArgument(alarmNamePrefix.length() <= 255, "actionPrefix must be between 1 and 255 characters in length");
|
||||||
|
formParameters.put("AlarmNamePrefix", alarmNamePrefix);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The list of alarm names to retrieve information for.
|
||||||
|
*
|
||||||
|
* @param alarmNames the alarm names
|
||||||
|
*
|
||||||
|
* @return this {@code ListAlarmsOptions} object
|
||||||
|
*/
|
||||||
|
public ListAlarmsOptions alarmNames(Set<String> alarmNames) {
|
||||||
|
for (String alarmName : checkNotNull(alarmNames, "alarmNames")) {
|
||||||
|
alarmName(alarmName);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The alarm name to retrieve information for.
|
||||||
|
*
|
||||||
|
* @param alarmName the alarm name
|
||||||
|
*
|
||||||
|
* @return this {@code ListAlarmsOptions} object
|
||||||
|
*/
|
||||||
|
public ListAlarmsOptions alarmName(String alarmName) {
|
||||||
|
checkArgument(alarmIndex <= 100, "maximum number of alarm names is 100");
|
||||||
|
formParameters.put("AlarmNames.member." + alarmIndex, checkNotNull(alarmName, "alarmName"));
|
||||||
|
alarmIndex++;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The maximum number of alarm descriptions to retrieve.
|
||||||
|
*
|
||||||
|
* @param maxRecords maximum number of alarm descriptions to retrieve
|
||||||
|
*
|
||||||
|
* @return this {@code ListAlarmsOptions} object
|
||||||
|
*/
|
||||||
|
public ListAlarmsOptions maxRecords(int maxRecords) {
|
||||||
|
formParameters.put("MaxRecords", checkNotNull(maxRecords, "maxRecords").toString());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The state value to be used in matching alarms.
|
||||||
|
*
|
||||||
|
* @param state state value to be used in matching alarms
|
||||||
|
*
|
||||||
|
* @return this {@code ListAlarmsOptions} object
|
||||||
|
*/
|
||||||
|
public ListAlarmsOptions state(Alarm.State state) {
|
||||||
|
checkNotNull(state, "state");
|
||||||
|
checkArgument(state != Alarm.State.UNRECOGNIZED, "state unrecognized");
|
||||||
|
formParameters.put("StateValue", state.toString());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -166,14 +166,14 @@ public class ListMetricsOptions extends BaseHttpRequestOptions implements Clonea
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see ListMetricsOptions#dimension(String)
|
* @see ListMetricsOptions#dimension(Dimension)
|
||||||
*/
|
*/
|
||||||
public static ListMetricsOptions dimension(Dimension dimension) {
|
public static ListMetricsOptions dimension(Dimension dimension) {
|
||||||
return new ListMetricsOptions().dimension(dimension);
|
return new ListMetricsOptions().dimension(dimension);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see ListMetricsOptions#afterMarker(String)
|
* @see ListMetricsOptions#afterMarker(Object)
|
||||||
*/
|
*/
|
||||||
public static ListMetricsOptions afterMarker(Object afterMarker) {
|
public static ListMetricsOptions afterMarker(Object afterMarker) {
|
||||||
return new ListMetricsOptions().afterMarker(afterMarker);
|
return new ListMetricsOptions().afterMarker(afterMarker);
|
||||||
|
|
|
@ -0,0 +1,305 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.options;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkArgument;
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.google.common.annotations.Beta;
|
||||||
|
import org.jclouds.cloudwatch.domain.ComparisonOperator;
|
||||||
|
import org.jclouds.cloudwatch.domain.Dimension;
|
||||||
|
import org.jclouds.cloudwatch.domain.Statistics;
|
||||||
|
import org.jclouds.cloudwatch.domain.Unit;
|
||||||
|
import org.jclouds.http.options.BaseHttpRequestOptions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Options used to create/update an alarm.
|
||||||
|
*
|
||||||
|
* @see <a href="http://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_PutMetricAlarm.html" />
|
||||||
|
*
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
@Beta
|
||||||
|
public class SaveAlarmOptions extends BaseHttpRequestOptions {
|
||||||
|
|
||||||
|
int alarmActionIndex = 1;
|
||||||
|
int dimensionIndex = 1;
|
||||||
|
int insufficientDataActionsIndex = 1;
|
||||||
|
int okActionsIndex = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates whether or not actions should be executed during any changes to the alarm's state.
|
||||||
|
*
|
||||||
|
* @param actionsEnabled indicates whether or not actions should be executed during any changes to the alarm's state
|
||||||
|
*
|
||||||
|
* @return this {@code SaveAlarmOptions} object
|
||||||
|
*/
|
||||||
|
public SaveAlarmOptions actionsEnabled(boolean actionsEnabled) {
|
||||||
|
formParameters.put("ActionsEnabled", checkNotNull(actionsEnabled, "actionsEnabled").toString());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The list of actions to execute when this alarm transitions into an ALARM state from any other state.
|
||||||
|
*
|
||||||
|
* @param alarmActions the list of actions to execute when this alarm transitions into an ALARM state from any other
|
||||||
|
* state
|
||||||
|
*
|
||||||
|
* @return this {@code SaveAlarmOptions} object
|
||||||
|
*/
|
||||||
|
public SaveAlarmOptions alarmActions(Set<String> alarmActions) {
|
||||||
|
for (String alarmAction : checkNotNull(alarmActions, "alarmActions")) {
|
||||||
|
alarmAction(alarmAction);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The action to execute when this alarm transitions into an ALARM state from any other state.
|
||||||
|
*
|
||||||
|
* @param alarmAction the actions to execute when this alarm transitions into an ALARM state from any other state
|
||||||
|
*
|
||||||
|
* @return this {@code SaveAlarmOptions} object
|
||||||
|
*/
|
||||||
|
public SaveAlarmOptions alarmAction(String alarmAction) {
|
||||||
|
checkArgument(alarmActionIndex <= 5, "maximum number of alarm actions is 5");
|
||||||
|
formParameters.put("AlarmActions.member." + alarmActionIndex, checkNotNull(alarmAction, "alarmAction"));
|
||||||
|
alarmActionIndex++;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The description of the alarm.
|
||||||
|
*
|
||||||
|
* @param alarmDescription the description of the alarm
|
||||||
|
*
|
||||||
|
* @return this {@code SaveAlarmOptions} object
|
||||||
|
*/
|
||||||
|
public SaveAlarmOptions alarmDescription(String alarmDescription) {
|
||||||
|
formParameters.put("AlarmDescription", checkNotNull(alarmDescription, "alarmDescription"));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the alarm.
|
||||||
|
*
|
||||||
|
* @param alarmName the name of the alarm
|
||||||
|
*
|
||||||
|
* @return this {@code SaveAlarmOptions} object
|
||||||
|
*/
|
||||||
|
public SaveAlarmOptions alarmName(String alarmName) {
|
||||||
|
formParameters.put("AlarmName", checkNotNull(alarmName, "alarmName"));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The arithmetic operation to use when comparing the specified statistic and threshold.
|
||||||
|
*
|
||||||
|
* @param comparisonOperator the arithmetic operation to use when comparing the specified statistic and threshold
|
||||||
|
*
|
||||||
|
* @return this {@code SaveAlarmOptions} object
|
||||||
|
*/
|
||||||
|
public SaveAlarmOptions comparisonOperator(ComparisonOperator comparisonOperator) {
|
||||||
|
checkNotNull(comparisonOperator, "comparisonOperator");
|
||||||
|
checkArgument(comparisonOperator != ComparisonOperator.UNRECOGNIZED, "comparisonOperator unrecognized");
|
||||||
|
formParameters.put("ComparisonOperator", comparisonOperator.toString());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The dimensions for the alarm's associated metric.
|
||||||
|
*
|
||||||
|
* @param dimensions the dimensions for the alarm's associated metric
|
||||||
|
*
|
||||||
|
* @return this {@code SaveAlarmOptions} object
|
||||||
|
*/
|
||||||
|
public SaveAlarmOptions dimensions(Set<Dimension> dimensions) {
|
||||||
|
for (Dimension dimension : checkNotNull(dimensions, "dimensions")) {
|
||||||
|
dimension(dimension);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The dimension for the alarm's associated metric.
|
||||||
|
*
|
||||||
|
* @param dimension the dimension for the alarm's associated metric
|
||||||
|
*
|
||||||
|
* @return this {@code SaveAlarmOptions} object
|
||||||
|
*/
|
||||||
|
public SaveAlarmOptions dimension(Dimension dimension) {
|
||||||
|
checkNotNull(dimension, "dimension");
|
||||||
|
checkArgument(dimensionIndex <= 10, "maximum number of dimensions is 10");
|
||||||
|
formParameters.put("Dimensions.member." + dimensionIndex + ".Name", dimension.getName());
|
||||||
|
formParameters.put("Dimensions.member." + dimensionIndex + ".Value", dimension.getValue());
|
||||||
|
dimensionIndex++;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of periods over which data is compared to the specified threshold.
|
||||||
|
*
|
||||||
|
* @param evaluationPeriods the number of periods over which data is compared to the specified threshold
|
||||||
|
*
|
||||||
|
* @return this {@code SaveAlarmOptions} object
|
||||||
|
*/
|
||||||
|
public SaveAlarmOptions evaluationPeriods(int evaluationPeriods) {
|
||||||
|
formParameters.put("EvaluationPeriods", checkNotNull(evaluationPeriods, "evaluationPeriods").toString());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The list of actions to execute when this alarm transitions into an INSUFFICIENT_DATA state from any other state.
|
||||||
|
*
|
||||||
|
* @param insufficientDataActions the list of actions to execute when this alarm transitions into an
|
||||||
|
* INSUFFICIENT_DATA state from any other state
|
||||||
|
*
|
||||||
|
* @return this {@code SaveAlarmOptions} object
|
||||||
|
*/
|
||||||
|
public SaveAlarmOptions insufficientDataActions(Set<String> insufficientDataActions) {
|
||||||
|
for (String insufficientDataAction : checkNotNull(insufficientDataActions)) {
|
||||||
|
insufficientDataAction(insufficientDataAction);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The actions to execute when this alarm transitions into an INSUFFICIENT_DATA state from any other state.
|
||||||
|
*
|
||||||
|
* @param insufficientDataAction the action to execute when this alarm transitions into an INSUFFICIENT_DATA state
|
||||||
|
* from any other state
|
||||||
|
*
|
||||||
|
* @return this {@code SaveAlarmOptions} object
|
||||||
|
*/
|
||||||
|
public SaveAlarmOptions insufficientDataAction(String insufficientDataAction) {
|
||||||
|
checkNotNull(insufficientDataAction, "insufficientDataAction");
|
||||||
|
checkArgument(insufficientDataActionsIndex <= 5, "maximum number of insufficient data actions is 5");
|
||||||
|
formParameters.put("InsufficientDataActions.member." + insufficientDataActionsIndex, insufficientDataAction);
|
||||||
|
insufficientDataActionsIndex++;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name for the alarm's associated metric.
|
||||||
|
*
|
||||||
|
* @param metricName the name for the alarm's associated metric
|
||||||
|
*
|
||||||
|
* @return this {@code SaveAlarmOptions} object
|
||||||
|
*/
|
||||||
|
public SaveAlarmOptions metricName(String metricName) {
|
||||||
|
formParameters.put("MetricName", checkNotNull(metricName, "metricName"));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The namespace for the alarm's associated metric.
|
||||||
|
*
|
||||||
|
* @param namespace the namespace for the alarm's associated metric
|
||||||
|
*
|
||||||
|
* @return this {@code SaveAlarmOptions} object
|
||||||
|
*/
|
||||||
|
public SaveAlarmOptions namespace(String namespace) {
|
||||||
|
formParameters.put("Namespace", checkNotNull(namespace));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The list of actions to execute when this alarm transitions into an OK state from any other state.
|
||||||
|
*
|
||||||
|
* @param okActions the list of actions to execute when this alarm transitions into an OK state from any other state
|
||||||
|
*
|
||||||
|
* @return this {@code SaveAlarmOptions} object
|
||||||
|
*/
|
||||||
|
public SaveAlarmOptions okActions(Set<String> okActions) {
|
||||||
|
for (String okAction : checkNotNull(okActions, "okActions")) {
|
||||||
|
okAction(okAction);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The action to execute when this alarm transitions into an OK state from any other state.
|
||||||
|
*
|
||||||
|
* @param okAction the action to execute when this alarm transitions into an OK state from any other state
|
||||||
|
*
|
||||||
|
* @return this {@code SaveAlarmOptions} object
|
||||||
|
*/
|
||||||
|
public SaveAlarmOptions okAction(String okAction) {
|
||||||
|
checkNotNull(okAction, "okAction");
|
||||||
|
checkArgument(okActionsIndex <= 5, "maximum number of ok actions is 5");
|
||||||
|
formParameters.put("OKActions.member." + okActionsIndex, okAction);
|
||||||
|
okActionsIndex++;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The period in seconds over which the specified statistic is applied.
|
||||||
|
*
|
||||||
|
* @param period the period in seconds over which the specified statistic is applied
|
||||||
|
*
|
||||||
|
* @return this {@code SaveAlarmOptions} object
|
||||||
|
*/
|
||||||
|
public SaveAlarmOptions period(int period) {
|
||||||
|
formParameters.put("Period", checkNotNull(period, "period").toString());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The statistic to apply to the alarm's associated metric.
|
||||||
|
*
|
||||||
|
* @param statistic the statistic to apply to the alarm's associated metric
|
||||||
|
*
|
||||||
|
* @return this {@code SaveAlarmOptions} object
|
||||||
|
*/
|
||||||
|
public SaveAlarmOptions statistic(Statistics statistic) {
|
||||||
|
checkNotNull(statistic, "statistic");
|
||||||
|
checkArgument(statistic != Statistics.UNRECOGNIZED, "statistic unrecognized");
|
||||||
|
formParameters.put("Statistic", statistic.toString());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The value against which the specified statistic is compared.
|
||||||
|
*
|
||||||
|
* @param threshold the value against which the specified statistic is compared
|
||||||
|
*
|
||||||
|
* @return this {@code SaveAlarmOptions} object
|
||||||
|
*/
|
||||||
|
public SaveAlarmOptions threshold(double threshold) {
|
||||||
|
formParameters.put("Threshold", checkNotNull(threshold).toString());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The unit for the alarm's associated metric.
|
||||||
|
*
|
||||||
|
* @param unit the unit for the alarm's associated metric
|
||||||
|
*
|
||||||
|
* @return this {@code SaveAlarmOptions} object
|
||||||
|
*/
|
||||||
|
public SaveAlarmOptions unit(Unit unit) {
|
||||||
|
checkNotNull(unit, "unit");
|
||||||
|
checkArgument(unit != Unit.UNRECOGNIZED, "unit unrecognized");
|
||||||
|
formParameters.put("Unit", unit.toString());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,94 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.xml;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import com.google.common.annotations.Beta;
|
||||||
|
import org.jclouds.cloudwatch.domain.AlarmHistoryItem;
|
||||||
|
import org.jclouds.cloudwatch.domain.HistoryItemType;
|
||||||
|
import org.jclouds.date.DateService;
|
||||||
|
import org.jclouds.http.functions.ParseSax;
|
||||||
|
import org.jclouds.util.SaxUtils;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see <a href="http://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_AlarmHistoryItem.html" />
|
||||||
|
*
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
@Beta
|
||||||
|
public class AlarmHistoryItemHandler extends ParseSax.HandlerForGeneratedRequestWithResult<AlarmHistoryItem> {
|
||||||
|
|
||||||
|
protected final DateService dateService;
|
||||||
|
|
||||||
|
private StringBuilder currentText = new StringBuilder();
|
||||||
|
private String alarmName;
|
||||||
|
private String historyData;
|
||||||
|
private HistoryItemType historyItemType;
|
||||||
|
private String historySummary;
|
||||||
|
private Date timestamp;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public AlarmHistoryItemHandler(DateService dateService) {
|
||||||
|
this.dateService = dateService;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void endElement(String uri, String name, String qName) throws SAXException {
|
||||||
|
if (qName.equals("AlarmName")) {
|
||||||
|
alarmName = SaxUtils.currentOrNull(currentText);
|
||||||
|
} else if (qName.equals("HistoryData")) {
|
||||||
|
String rawJson = SaxUtils.currentOrNull(currentText);
|
||||||
|
|
||||||
|
if (rawJson != null) {
|
||||||
|
historyData = rawJson.trim();
|
||||||
|
}
|
||||||
|
} else if (qName.equals("HistoryItemType")) {
|
||||||
|
historyItemType = HistoryItemType.fromValue(SaxUtils.currentOrNull(currentText));
|
||||||
|
} else if (qName.equals("HistorySummary")) {
|
||||||
|
historySummary = SaxUtils.currentOrNull(currentText);
|
||||||
|
} else if (qName.equals("Timestamp")) {
|
||||||
|
timestamp = dateService.iso8601DateParse(currentText.toString().trim());
|
||||||
|
}
|
||||||
|
|
||||||
|
currentText = new StringBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void characters(char ch[], int start, int length) {
|
||||||
|
currentText.append(ch, start, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AlarmHistoryItem getResult() {
|
||||||
|
AlarmHistoryItem result = new AlarmHistoryItem(alarmName, historyData, historyItemType, historySummary,
|
||||||
|
timestamp);
|
||||||
|
|
||||||
|
alarmName = null;
|
||||||
|
historyData = null;
|
||||||
|
historyItemType = null;
|
||||||
|
historySummary = null;
|
||||||
|
timestamp = null;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,101 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.xml;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.google.common.annotations.Beta;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
import com.google.inject.Inject;
|
||||||
|
import org.jclouds.cloudwatch.domain.AlarmHistoryItem;
|
||||||
|
import org.jclouds.collect.IterableWithMarker;
|
||||||
|
import org.jclouds.collect.IterableWithMarkers;
|
||||||
|
import org.jclouds.http.functions.ParseSax;
|
||||||
|
import org.jclouds.util.SaxUtils;
|
||||||
|
import org.xml.sax.Attributes;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see <a href="http://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_DescribeAlarmHistory.html" />
|
||||||
|
*
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
@Beta
|
||||||
|
public class ListAlarmHistoryResponseHandler
|
||||||
|
extends ParseSax.HandlerForGeneratedRequestWithResult<IterableWithMarker<AlarmHistoryItem>> {
|
||||||
|
|
||||||
|
private final AlarmHistoryItemHandler alarmHistoryItemHandler;
|
||||||
|
|
||||||
|
private StringBuilder currentText = new StringBuilder();
|
||||||
|
private Set<AlarmHistoryItem> alarmHistoryItems = Sets.newLinkedHashSet();
|
||||||
|
private String nextToken;
|
||||||
|
private boolean inAlarmHistoryItems;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public ListAlarmHistoryResponseHandler(AlarmHistoryItemHandler alarmHistoryItemHandler) {
|
||||||
|
this.alarmHistoryItemHandler = alarmHistoryItemHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startElement(String url, String name, String qName, Attributes attributes) throws SAXException {
|
||||||
|
if (SaxUtils.equalsOrSuffix(qName, "AlarmHistoryItems")) {
|
||||||
|
inAlarmHistoryItems = true;
|
||||||
|
}
|
||||||
|
if (inAlarmHistoryItems) {
|
||||||
|
alarmHistoryItemHandler.startElement(url, name, qName, attributes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void endElement(String uri, String name, String qName) throws SAXException {
|
||||||
|
if (inAlarmHistoryItems) {
|
||||||
|
if (qName.equals("AlarmHistoryItems")) {
|
||||||
|
inAlarmHistoryItems = false;
|
||||||
|
} else if (qName.equals("member")) {
|
||||||
|
alarmHistoryItems.add(alarmHistoryItemHandler.getResult());
|
||||||
|
} else {
|
||||||
|
alarmHistoryItemHandler.endElement(uri, name, qName);
|
||||||
|
}
|
||||||
|
} else if (qName.equals("NextToken")) {
|
||||||
|
nextToken = SaxUtils.currentOrNull(currentText);
|
||||||
|
}
|
||||||
|
|
||||||
|
currentText = new StringBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void characters(char ch[], int start, int length) {
|
||||||
|
if (inAlarmHistoryItems) {
|
||||||
|
alarmHistoryItemHandler.characters(ch, start, length);
|
||||||
|
} else {
|
||||||
|
currentText.append(ch, start, length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IterableWithMarker<AlarmHistoryItem> getResult() {
|
||||||
|
IterableWithMarker<AlarmHistoryItem> result = IterableWithMarkers.from(alarmHistoryItems, nextToken);
|
||||||
|
|
||||||
|
alarmHistoryItems = Sets.newLinkedHashSet();
|
||||||
|
nextToken = null;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,95 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.xml;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.google.common.annotations.Beta;
|
||||||
|
import com.google.common.collect.FluentIterable;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
import com.google.inject.Inject;
|
||||||
|
import org.jclouds.cloudwatch.domain.Alarm;
|
||||||
|
import org.jclouds.http.functions.ParseSax;
|
||||||
|
import org.jclouds.util.SaxUtils;
|
||||||
|
import org.xml.sax.Attributes;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see <a href="http://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_DescribeAlarmsForMetric.html" />
|
||||||
|
*
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
@Beta
|
||||||
|
public class ListAlarmsForMetricResponseHandler
|
||||||
|
extends ParseSax.HandlerForGeneratedRequestWithResult<Iterable<Alarm>> {
|
||||||
|
|
||||||
|
private final MetricAlarmHandler metricAlarmHandler;
|
||||||
|
|
||||||
|
private StringBuilder currentText = new StringBuilder();
|
||||||
|
private Set<Alarm> alarms = Sets.newLinkedHashSet();
|
||||||
|
private boolean inMetricAlarms;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public ListAlarmsForMetricResponseHandler(MetricAlarmHandler metricAlarmHandler) {
|
||||||
|
this.metricAlarmHandler = metricAlarmHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startElement(String url, String name, String qName, Attributes attributes) throws SAXException {
|
||||||
|
if (SaxUtils.equalsOrSuffix(qName, "MetricAlarms")) {
|
||||||
|
inMetricAlarms = true;
|
||||||
|
}
|
||||||
|
if (inMetricAlarms) {
|
||||||
|
metricAlarmHandler.startElement(url, name, qName, attributes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void endElement(String uri, String name, String qName) throws SAXException {
|
||||||
|
if (inMetricAlarms) {
|
||||||
|
if (qName.equals("MetricAlarms")) {
|
||||||
|
inMetricAlarms = false;
|
||||||
|
} else if (qName.equals("member") && !metricAlarmHandler.shouldHandleMemberTag()) {
|
||||||
|
alarms.add(metricAlarmHandler.getResult());
|
||||||
|
} else {
|
||||||
|
metricAlarmHandler.endElement(uri, name, qName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
currentText = new StringBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void characters(char ch[], int start, int length) {
|
||||||
|
if (inMetricAlarms) {
|
||||||
|
metricAlarmHandler.characters(ch, start, length);
|
||||||
|
} else {
|
||||||
|
currentText.append(ch, start, length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FluentIterable<Alarm> getResult() {
|
||||||
|
FluentIterable<Alarm> result = FluentIterable.from(alarms);
|
||||||
|
|
||||||
|
alarms = Sets.newLinkedHashSet();
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,101 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.xml;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.google.common.annotations.Beta;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
import com.google.inject.Inject;
|
||||||
|
import org.jclouds.cloudwatch.domain.Alarm;
|
||||||
|
import org.jclouds.collect.IterableWithMarker;
|
||||||
|
import org.jclouds.collect.IterableWithMarkers;
|
||||||
|
import org.jclouds.http.functions.ParseSax;
|
||||||
|
import org.jclouds.util.SaxUtils;
|
||||||
|
import org.xml.sax.Attributes;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see <a href="http://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_DescribeAlarms.html" />
|
||||||
|
*
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
@Beta
|
||||||
|
public class ListAlarmsResponseHandler
|
||||||
|
extends ParseSax.HandlerForGeneratedRequestWithResult<IterableWithMarker<Alarm>> {
|
||||||
|
|
||||||
|
private final MetricAlarmHandler metricAlarmHandler;
|
||||||
|
|
||||||
|
private StringBuilder currentText = new StringBuilder();
|
||||||
|
private Set<Alarm> alarms = Sets.newLinkedHashSet();
|
||||||
|
private String nextToken;
|
||||||
|
private boolean inMetricAlarms;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public ListAlarmsResponseHandler(MetricAlarmHandler metricAlarmHandler) {
|
||||||
|
this.metricAlarmHandler = metricAlarmHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startElement(String url, String name, String qName, Attributes attributes) throws SAXException {
|
||||||
|
if (SaxUtils.equalsOrSuffix(qName, "MetricAlarms")) {
|
||||||
|
inMetricAlarms = true;
|
||||||
|
}
|
||||||
|
if (inMetricAlarms) {
|
||||||
|
metricAlarmHandler.startElement(url, name, qName, attributes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void endElement(String uri, String name, String qName) throws SAXException {
|
||||||
|
if (inMetricAlarms) {
|
||||||
|
if (qName.equals("MetricAlarms")) {
|
||||||
|
inMetricAlarms = false;
|
||||||
|
} else if (qName.equals("member") && !metricAlarmHandler.shouldHandleMemberTag()) {
|
||||||
|
alarms.add(metricAlarmHandler.getResult());
|
||||||
|
} else {
|
||||||
|
metricAlarmHandler.endElement(uri, name, qName);
|
||||||
|
}
|
||||||
|
} else if (qName.equals("NextToken")) {
|
||||||
|
nextToken = SaxUtils.currentOrNull(currentText);
|
||||||
|
}
|
||||||
|
|
||||||
|
currentText = new StringBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void characters(char ch[], int start, int length) {
|
||||||
|
if (inMetricAlarms) {
|
||||||
|
metricAlarmHandler.characters(ch, start, length);
|
||||||
|
} else {
|
||||||
|
currentText.append(ch, start, length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IterableWithMarker<Alarm> getResult() {
|
||||||
|
IterableWithMarker<Alarm> result = IterableWithMarkers.from(alarms, nextToken);
|
||||||
|
|
||||||
|
alarms = Sets.newLinkedHashSet();
|
||||||
|
nextToken = null;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,218 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.xml;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.google.common.annotations.Beta;
|
||||||
|
import com.google.common.base.Optional;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
import com.google.inject.Inject;
|
||||||
|
import org.jclouds.cloudwatch.domain.Alarm;
|
||||||
|
import org.jclouds.cloudwatch.domain.ComparisonOperator;
|
||||||
|
import org.jclouds.cloudwatch.domain.Dimension;
|
||||||
|
import org.jclouds.cloudwatch.domain.Statistics;
|
||||||
|
import org.jclouds.cloudwatch.domain.Unit;
|
||||||
|
import org.jclouds.date.DateService;
|
||||||
|
import org.jclouds.http.functions.ParseSax;
|
||||||
|
import org.jclouds.util.SaxUtils;
|
||||||
|
import org.xml.sax.Attributes;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see <a href="http://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_MetricAlarm.html" />
|
||||||
|
*
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
@Beta
|
||||||
|
public class MetricAlarmHandler extends ParseSax.HandlerForGeneratedRequestWithResult<Alarm> {
|
||||||
|
|
||||||
|
protected final DateService dateService;
|
||||||
|
protected final DimensionHandler dimensionHandler;
|
||||||
|
|
||||||
|
private StringBuilder currentText = new StringBuilder();
|
||||||
|
private Set<String> alarmActions = Sets.newLinkedHashSet();
|
||||||
|
private Set<Dimension> dimensions = Sets.newLinkedHashSet();
|
||||||
|
private Set<String> insufficientDataActions = Sets.newLinkedHashSet();
|
||||||
|
private Set<String> okActions = Sets.newLinkedHashSet();
|
||||||
|
private boolean inAlarmActions = false;
|
||||||
|
private boolean inDimensions = false;
|
||||||
|
private boolean inInsufficientDataActions = false;
|
||||||
|
private boolean inOkActions = false;
|
||||||
|
private boolean actionsEnabled;
|
||||||
|
private String alarmARN;
|
||||||
|
private Date alarmConfigurationUpdatedTimestamp;
|
||||||
|
private String alarmDescription;
|
||||||
|
private String alarmName;
|
||||||
|
private ComparisonOperator comparisonOperator;
|
||||||
|
private int evaluationPeriods;
|
||||||
|
private String metricName;
|
||||||
|
private String namespace;
|
||||||
|
private int period;
|
||||||
|
private String stateReason;
|
||||||
|
private String stateReasonData;
|
||||||
|
private Date stateUpdatedTimestamp;
|
||||||
|
private Alarm.State state;
|
||||||
|
private Statistics statistic;
|
||||||
|
private double threshold;
|
||||||
|
private Unit unit;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public MetricAlarmHandler(DateService dateService, DimensionHandler dimensionHandler) {
|
||||||
|
this.dateService = dateService;
|
||||||
|
this.dimensionHandler = dimensionHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean shouldHandleMemberTag() {
|
||||||
|
return inAlarmActions || inDimensions || inInsufficientDataActions || inOkActions;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startElement(String url, String name, String qName, Attributes attributes) throws SAXException {
|
||||||
|
if (SaxUtils.equalsOrSuffix(qName, "AlarmActions")) {
|
||||||
|
inAlarmActions = true;
|
||||||
|
} else if (SaxUtils.equalsOrSuffix(qName, "Dimensions")) {
|
||||||
|
inDimensions = true;
|
||||||
|
} else if (SaxUtils.equalsOrSuffix(qName, "InsufficientDataActions") ||
|
||||||
|
SaxUtils.equalsOrSuffix(qName, "UnknownActions")) {
|
||||||
|
inInsufficientDataActions = true;
|
||||||
|
} else if (SaxUtils.equalsOrSuffix(qName, "OKActions")) {
|
||||||
|
inOkActions = true;
|
||||||
|
}
|
||||||
|
if (inDimensions) {
|
||||||
|
dimensionHandler.startElement(url, name, qName, attributes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void endElement(String uri, String name, String qName) throws SAXException {
|
||||||
|
if (inAlarmActions) {
|
||||||
|
if (qName.equals("AlarmActions")) {
|
||||||
|
inAlarmActions = false;
|
||||||
|
} else if (qName.equals("member")) {
|
||||||
|
alarmActions.add(SaxUtils.currentOrNull(currentText));
|
||||||
|
}
|
||||||
|
} else if (inDimensions) {
|
||||||
|
if (qName.equals("Dimensions")) {
|
||||||
|
inDimensions = false;
|
||||||
|
} else if (qName.equals("member")) {
|
||||||
|
dimensions.add(dimensionHandler.getResult());
|
||||||
|
} else {
|
||||||
|
dimensionHandler.endElement(uri, name, qName);
|
||||||
|
}
|
||||||
|
} else if (inInsufficientDataActions) {
|
||||||
|
if (qName.equals("InsufficientDataActions") || qName.equals("UnknownActions")) {
|
||||||
|
inInsufficientDataActions = false;
|
||||||
|
} else if (qName.equals("member")) {
|
||||||
|
insufficientDataActions.add(SaxUtils.currentOrNull(currentText));
|
||||||
|
}
|
||||||
|
} else if (inOkActions) {
|
||||||
|
if (qName.equals("OKActions")) {
|
||||||
|
inOkActions = false;
|
||||||
|
} else if (qName.equals("member")) {
|
||||||
|
okActions.add(SaxUtils.currentOrNull(currentText));
|
||||||
|
}
|
||||||
|
} else if (qName.equals("ActionsEnabled")) {
|
||||||
|
actionsEnabled = Boolean.valueOf(SaxUtils.currentOrNull(currentText));
|
||||||
|
} else if (qName.equals("AlarmArn")) {
|
||||||
|
alarmARN = SaxUtils.currentOrNull(currentText);
|
||||||
|
} else if (qName.equals("AlarmConfigurationUpdatedTimestamp")) {
|
||||||
|
alarmConfigurationUpdatedTimestamp = dateService.iso8601DateParse(currentText.toString().trim());
|
||||||
|
} else if (qName.equals("AlarmDescription")) {
|
||||||
|
alarmDescription = SaxUtils.currentOrNull(currentText);
|
||||||
|
} else if (qName.equals("AlarmName")) {
|
||||||
|
alarmName = SaxUtils.currentOrNull(currentText);
|
||||||
|
} else if (qName.equals("ComparisonOperator")) {
|
||||||
|
comparisonOperator = ComparisonOperator.fromValue(SaxUtils.currentOrNull(currentText));
|
||||||
|
} else if (qName.equals("EvaluationPeriods")) {
|
||||||
|
evaluationPeriods = Integer.valueOf(SaxUtils.currentOrNull(currentText));
|
||||||
|
} else if (qName.equals("MetricName")) {
|
||||||
|
metricName = SaxUtils.currentOrNull(currentText);
|
||||||
|
} else if (qName.equals("Namespace")) {
|
||||||
|
namespace = SaxUtils.currentOrNull(currentText);
|
||||||
|
} else if (qName.equals("Period")) {
|
||||||
|
period = Integer.valueOf(SaxUtils.currentOrNull(currentText));
|
||||||
|
} else if (qName.equals("StateReason")) {
|
||||||
|
stateReason = SaxUtils.currentOrNull(currentText);
|
||||||
|
} else if (qName.equals("StateReasonData")) {
|
||||||
|
String rawJson = SaxUtils.currentOrNull(currentText);
|
||||||
|
|
||||||
|
if (rawJson != null) {
|
||||||
|
stateReasonData = rawJson.trim();
|
||||||
|
}
|
||||||
|
} else if (qName.equals("StateUpdatedTimestamp")) {
|
||||||
|
stateUpdatedTimestamp = dateService.iso8601DateParse(currentText.toString().trim());
|
||||||
|
} else if (qName.equals("StateValue")) {
|
||||||
|
state = Alarm.State.fromValue(SaxUtils.currentOrNull(currentText));
|
||||||
|
} else if (qName.equals("Statistic")) {
|
||||||
|
statistic = Statistics.fromValue(SaxUtils.currentOrNull(currentText));
|
||||||
|
} else if (qName.equals("Threshold")) {
|
||||||
|
threshold = Double.valueOf(SaxUtils.currentOrNull(currentText));
|
||||||
|
} else if (qName.equals("Unit")) {
|
||||||
|
unit = Unit.fromValue(SaxUtils.currentOrNull(currentText));
|
||||||
|
}
|
||||||
|
|
||||||
|
currentText = new StringBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void characters(char ch[], int start, int length) {
|
||||||
|
if (inDimensions) {
|
||||||
|
dimensionHandler.characters(ch, start, length);
|
||||||
|
} else {
|
||||||
|
currentText.append(ch, start, length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Alarm getResult() {
|
||||||
|
Alarm result = new Alarm(actionsEnabled, alarmActions, alarmARN, alarmConfigurationUpdatedTimestamp,
|
||||||
|
alarmDescription, alarmName, comparisonOperator, dimensions,
|
||||||
|
evaluationPeriods, insufficientDataActions, metricName, namespace, okActions,
|
||||||
|
period, stateReason, Optional.fromNullable(stateReasonData),
|
||||||
|
stateUpdatedTimestamp, state, statistic, threshold,
|
||||||
|
Optional.fromNullable(unit));
|
||||||
|
|
||||||
|
actionsEnabled = false;
|
||||||
|
alarmActions = Sets.newLinkedHashSet();
|
||||||
|
alarmARN = null;
|
||||||
|
alarmConfigurationUpdatedTimestamp = null;
|
||||||
|
alarmDescription = null;
|
||||||
|
alarmName = null;
|
||||||
|
comparisonOperator = null;
|
||||||
|
dimensions = Sets.newLinkedHashSet();
|
||||||
|
evaluationPeriods = 0;
|
||||||
|
insufficientDataActions = Sets.newLinkedHashSet();
|
||||||
|
metricName = null;
|
||||||
|
namespace = null;
|
||||||
|
okActions = Sets.newLinkedHashSet();
|
||||||
|
period = 0;
|
||||||
|
stateReason = null;
|
||||||
|
stateReasonData = null;
|
||||||
|
stateUpdatedTimestamp = null;
|
||||||
|
state = null;
|
||||||
|
statistic = null;
|
||||||
|
threshold = 0.0;
|
||||||
|
unit = null;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -18,44 +18,36 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.cloudwatch;
|
package org.jclouds.cloudwatch;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkArgument;
|
|
||||||
import static java.util.concurrent.TimeUnit.MINUTES;
|
import static java.util.concurrent.TimeUnit.MINUTES;
|
||||||
import static org.jclouds.util.Predicates2.retry;
|
import static org.jclouds.util.Predicates2.retry;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.jclouds.apis.BaseApiLiveTest;
|
|
||||||
import org.jclouds.cloudwatch.domain.Dimension;
|
|
||||||
import org.jclouds.cloudwatch.domain.MetricDatum;
|
|
||||||
import org.jclouds.cloudwatch.domain.Unit;
|
|
||||||
import org.jclouds.cloudwatch.options.ListMetricsOptions;
|
|
||||||
import org.testng.Assert;
|
|
||||||
import org.testng.annotations.Test;
|
|
||||||
|
|
||||||
import com.google.common.base.Predicate;
|
import com.google.common.base.Predicate;
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
|
import org.jclouds.cloudwatch.domain.Dimension;
|
||||||
|
import org.jclouds.cloudwatch.domain.MetricDatum;
|
||||||
|
import org.jclouds.cloudwatch.domain.Unit;
|
||||||
|
import org.jclouds.cloudwatch.internal.BaseCloudWatchApiLiveTest;
|
||||||
|
import org.jclouds.cloudwatch.options.ListMetricsOptions;
|
||||||
|
import org.testng.Assert;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests behavior of {@code CloudWatch}.
|
* Tests behavior of {@code CloudWatch}.
|
||||||
*
|
*
|
||||||
* @author Jeremy Whitlock
|
* @author Jeremy Whitlock
|
||||||
*/
|
*/
|
||||||
public class CloudWatchLiveTest extends BaseApiLiveTest<CloudWatchApi> {
|
public class CloudWatchLiveTest extends BaseCloudWatchApiLiveTest {
|
||||||
|
|
||||||
public CloudWatchLiveTest() {
|
public CloudWatchLiveTest() {
|
||||||
provider = "cloudwatch";
|
provider = "cloudwatch";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
protected void testCloudWatchListMetrics() {
|
protected void testCloudWatch() {
|
||||||
// Just make sure there is at least one metric returned (Much better if the account you use has more than 500)
|
|
||||||
checkArgument(CloudWatch.listMetrics(api, null, new ListMetricsOptions()).iterator().hasNext());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
protected void testCloudWatchPutMetrics() {
|
|
||||||
String metricName = "TestMetricName" + System.currentTimeMillis();
|
String metricName = "TestMetricName" + System.currentTimeMillis();
|
||||||
String namespace = "JCLOUDS/Test";
|
String namespace = "JCLOUDS/Test";
|
||||||
Date metricTimestamp = new Date();
|
Date metricTimestamp = new Date();
|
||||||
|
|
|
@ -25,6 +25,9 @@ import static org.easymock.EasyMock.expect;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.common.collect.Iterables;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
import org.easymock.EasyMock;
|
import org.easymock.EasyMock;
|
||||||
import org.jclouds.cloudwatch.domain.Metric;
|
import org.jclouds.cloudwatch.domain.Metric;
|
||||||
import org.jclouds.cloudwatch.domain.MetricDatum;
|
import org.jclouds.cloudwatch.domain.MetricDatum;
|
||||||
|
@ -35,10 +38,6 @@ import org.jclouds.collect.IterableWithMarkers;
|
||||||
import org.testng.Assert;
|
import org.testng.Assert;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableSet;
|
|
||||||
import com.google.common.collect.Iterables;
|
|
||||||
import com.google.common.collect.Sets;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests behavior of {@code CloudWatch}.
|
* Tests behavior of {@code CloudWatch}.
|
||||||
*
|
*
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.binders;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.inject.Guice;
|
||||||
|
import com.google.inject.Injector;
|
||||||
|
import org.jclouds.http.HttpRequest;
|
||||||
|
import org.testng.Assert;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests behavior of {@link AlarmNamesBinder}.
|
||||||
|
*
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
@Test(groups = "unit", testName = "AlarmNamesBinderTest")
|
||||||
|
public class AlarmNamesBinderTest {
|
||||||
|
|
||||||
|
Injector injector = Guice.createInjector();
|
||||||
|
AlarmNamesBinder binder = injector.getInstance(AlarmNamesBinder.class);
|
||||||
|
|
||||||
|
HttpRequest request() {
|
||||||
|
return HttpRequest.builder().method("POST").endpoint("http://localhost").build();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testAlarmNamesBinder() throws Exception {
|
||||||
|
HttpRequest request = binder.bindToRequest(request(), ImmutableSet.of("TestAlarmName1", "TestAlarmName2"));
|
||||||
|
|
||||||
|
Assert.assertEquals(request.getPayload().getRawContent(),
|
||||||
|
"AlarmNames.member.1=TestAlarmName1&AlarmNames.member.2=TestAlarmName2");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,389 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.features;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.TimeZone;
|
||||||
|
|
||||||
|
import com.google.common.base.Joiner;
|
||||||
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.common.collect.Maps;
|
||||||
|
import org.jclouds.cloudwatch.CloudWatchApi;
|
||||||
|
import org.jclouds.cloudwatch.domain.Alarm;
|
||||||
|
import org.jclouds.cloudwatch.domain.ComparisonOperator;
|
||||||
|
import org.jclouds.cloudwatch.domain.Dimension;
|
||||||
|
import org.jclouds.cloudwatch.domain.HistoryItemType;
|
||||||
|
import org.jclouds.cloudwatch.domain.Namespaces;
|
||||||
|
import org.jclouds.cloudwatch.domain.Statistics;
|
||||||
|
import org.jclouds.cloudwatch.domain.Unit;
|
||||||
|
import org.jclouds.cloudwatch.internal.BaseCloudWatchApiExpectTest;
|
||||||
|
import org.jclouds.cloudwatch.options.ListAlarmHistoryOptions;
|
||||||
|
import org.jclouds.cloudwatch.options.ListAlarmsForMetric;
|
||||||
|
import org.jclouds.cloudwatch.options.ListAlarmsOptions;
|
||||||
|
import org.jclouds.cloudwatch.options.SaveAlarmOptions;
|
||||||
|
import org.jclouds.cloudwatch.xml.ListAlarmHistoryResponseHandlerTest;
|
||||||
|
import org.jclouds.cloudwatch.xml.ListAlarmsForMetricResponseHandlerTest;
|
||||||
|
import org.jclouds.cloudwatch.xml.ListAlarmsResponseHandlerTest;
|
||||||
|
import org.jclouds.date.DateService;
|
||||||
|
import org.jclouds.date.internal.SimpleDateFormatDateService;
|
||||||
|
import org.jclouds.http.HttpRequest;
|
||||||
|
import org.jclouds.http.HttpResponse;
|
||||||
|
import org.jclouds.io.Payload;
|
||||||
|
import org.jclouds.rest.InsufficientResourcesException;
|
||||||
|
import org.jclouds.rest.ResourceNotFoundException;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
@Test(groups = "unit", testName = "AlarmApiExpectTest")
|
||||||
|
public class AlarmApiExpectTest extends BaseCloudWatchApiExpectTest {
|
||||||
|
|
||||||
|
private DateService dateService = new SimpleDateFormatDateService();
|
||||||
|
private HttpRequest deleteAlarmsRequest = alarmRequest(ImmutableMap.of(
|
||||||
|
"Action", "DeleteAlarms",
|
||||||
|
"AlarmNames.member.1", "TestAlarmName1",
|
||||||
|
"AlarmNames.member.2", "TestAlarmName2",
|
||||||
|
"Signature", "w9dhEBQCsmOhYKDp9Ht7/Ra6/xZcgAzhF0Bgtj8vpwQ%3D"
|
||||||
|
));
|
||||||
|
private HttpRequest putMetricAlarmRequest = alarmRequest(
|
||||||
|
ImmutableMap.<String, String>builder()
|
||||||
|
.put("Action", "PutMetricAlarm")
|
||||||
|
.put("ActionsEnabled", "true")
|
||||||
|
.put("AlarmActions.member.1", "TestAlarmAction1")
|
||||||
|
.put("AlarmActions.member.2", "TestAlarmAction2")
|
||||||
|
.put("AlarmDescription", "Test%20alarm%20description.")
|
||||||
|
.put("AlarmName", "TestAlarmName")
|
||||||
|
.put("ComparisonOperator", ComparisonOperator.GREATER_THAN_THRESHOLD.toString())
|
||||||
|
.put("Dimensions.member.1.Name", "TestDimensionName1")
|
||||||
|
.put("Dimensions.member.1.Value", "TestDimensionValue1")
|
||||||
|
.put("Dimensions.member.2.Name", "TestDimensionName2")
|
||||||
|
.put("Dimensions.member.2.Value", "TestDimensionValue2")
|
||||||
|
.put("EvaluationPeriods", "60")
|
||||||
|
.put("InsufficientDataActions.member.1", "TestAlarmAction1")
|
||||||
|
.put("InsufficientDataActions.member.2", "TestAlarmAction2")
|
||||||
|
.put("MetricName", "TestMetricName")
|
||||||
|
.put("Namespace", Namespaces.EBS)
|
||||||
|
.put("OKActions.member.1", "TestAlarmAction1")
|
||||||
|
.put("OKActions.member.2", "TestAlarmAction2")
|
||||||
|
.put("Period", "60")
|
||||||
|
.put("Statistic", Statistics.SAMPLE_COUNT.toString())
|
||||||
|
.put("Threshold", "1.0")
|
||||||
|
.put("Unit", Unit.GIGABYTES_PER_SECOND.toString())
|
||||||
|
.put("Signature", "6RXD%2Bp1393a0maPdMLn%2Bv%2BbIcOJnAViAtbMgcA%2BogWs%3D").build()
|
||||||
|
);
|
||||||
|
private SaveAlarmOptions saveAlarmOptions = new SaveAlarmOptions()
|
||||||
|
.alarmActions(ImmutableSet.of("TestAlarmAction1", "TestAlarmAction2"))
|
||||||
|
.alarmDescription("Test alarm description.")
|
||||||
|
.alarmName("TestAlarmName")
|
||||||
|
.metricName("TestMetricName")
|
||||||
|
.actionsEnabled(true)
|
||||||
|
.comparisonOperator(ComparisonOperator.GREATER_THAN_THRESHOLD)
|
||||||
|
.dimensions(ImmutableSet.of(
|
||||||
|
new Dimension("TestDimensionName1",
|
||||||
|
"TestDimensionValue1"),
|
||||||
|
new Dimension("TestDimensionName2",
|
||||||
|
"TestDimensionValue2")
|
||||||
|
))
|
||||||
|
.evaluationPeriods(60)
|
||||||
|
.insufficientDataActions(ImmutableSet.of("TestAlarmAction1", "TestAlarmAction2"))
|
||||||
|
.namespace(Namespaces.EBS)
|
||||||
|
.okActions(ImmutableSet.of("TestAlarmAction1", "TestAlarmAction2"))
|
||||||
|
.period(60)
|
||||||
|
.statistic(Statistics.SAMPLE_COUNT)
|
||||||
|
.threshold(1.0)
|
||||||
|
.unit(Unit.GIGABYTES_PER_SECOND);
|
||||||
|
private HttpRequest setAlarmStateRequest = alarmRequest(
|
||||||
|
ImmutableMap.<String, String>builder()
|
||||||
|
.put("Action", "SetAlarmState")
|
||||||
|
.put("AlarmName", "TestAlarmName")
|
||||||
|
.put("StateReason", "TestStateReason")
|
||||||
|
.put("StateReasonData", "%7B%22reason%22%3A%20%22Some%20reason%22%7D")
|
||||||
|
.put("StateValue", Alarm.State.OK.toString())
|
||||||
|
.put("Signature", "W3juJzJEoSTPfYnrK7s/Pbj4uA/PGNF7eoxa7NhByqU%3D").build()
|
||||||
|
);
|
||||||
|
|
||||||
|
public AlarmApiExpectTest() {
|
||||||
|
TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testSetAlarmStateIs2xx() throws Exception {
|
||||||
|
Payload payload = payloadFromResourceWithContentType("/VoidResponse.xml", "text/xml");
|
||||||
|
CloudWatchApi cloudWatchApi = requestSendsResponse(setAlarmStateRequest,
|
||||||
|
HttpResponse.builder()
|
||||||
|
.payload(payload)
|
||||||
|
.statusCode(200)
|
||||||
|
.build());
|
||||||
|
|
||||||
|
// Ensure there is no error returned
|
||||||
|
cloudWatchApi.getAlarmApiForRegion(null).setState("TestAlarmName", "TestStateReason",
|
||||||
|
"{\"reason\": \"Some reason\"}",
|
||||||
|
Alarm.State.OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expectedExceptions = IllegalArgumentException.class)
|
||||||
|
public void testSetAlarmStateIs400() throws Exception {
|
||||||
|
Payload payload = payloadFromResourceWithContentType("/InvalidFormatResponse.xml", "text/xml");
|
||||||
|
CloudWatchApi cloudWatchApi = requestSendsResponse(setAlarmStateRequest,
|
||||||
|
HttpResponse.builder()
|
||||||
|
.payload(payload)
|
||||||
|
.statusCode(400)
|
||||||
|
.build());
|
||||||
|
|
||||||
|
// Ensure an IllegalArgumentException is thrown
|
||||||
|
cloudWatchApi.getAlarmApiForRegion(null).setState("TestAlarmName", "TestStateReason",
|
||||||
|
"{\"reason\": \"Some reason\"}",
|
||||||
|
Alarm.State.OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testPutMetricAlarmIs2xx() throws Exception {
|
||||||
|
Payload payload = payloadFromResourceWithContentType("/VoidResponse.xml", "text/xml");
|
||||||
|
CloudWatchApi cloudWatchApi = requestSendsResponse(putMetricAlarmRequest,
|
||||||
|
HttpResponse.builder()
|
||||||
|
.statusCode(200)
|
||||||
|
.payload(payload)
|
||||||
|
.build());
|
||||||
|
|
||||||
|
// Ensure there is no error returned
|
||||||
|
cloudWatchApi.getAlarmApiForRegion(null).save(saveAlarmOptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expectedExceptions = InsufficientResourcesException.class)
|
||||||
|
public void testPutMetricAlarmIs400() throws Exception {
|
||||||
|
Payload payload = payloadFromResourceWithContentType("/LimitExceededResponse.xml", "text/xml");
|
||||||
|
CloudWatchApi cloudWatchApi = requestSendsResponse(putMetricAlarmRequest,
|
||||||
|
HttpResponse.builder()
|
||||||
|
.payload(payload)
|
||||||
|
.statusCode(400)
|
||||||
|
.build());
|
||||||
|
|
||||||
|
// Ensure an InsufficientResourcesException is thrown
|
||||||
|
cloudWatchApi.getAlarmApiForRegion(null).save(saveAlarmOptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testEnableAlarmActions() throws Exception {
|
||||||
|
CloudWatchApi cloudWatchApi = requestSendsResponse(alarmRequest(ImmutableMap.of(
|
||||||
|
"Action", "EnableAlarmActions",
|
||||||
|
"AlarmNames.member.1", "TestAlarmName1",
|
||||||
|
"AlarmNames.member.2", "TestAlarmName2",
|
||||||
|
"Signature", "Q1VemnXpc57PKMs9NVCX6R%2B/TSDgsGzQwpOHQ70aJuU%3D"
|
||||||
|
)), HttpResponse.builder()
|
||||||
|
.statusCode(200)
|
||||||
|
.payload(payloadFromResourceWithContentType("/VoidResponse.xml", "text/xml"))
|
||||||
|
.build());
|
||||||
|
|
||||||
|
// Ensure there is no error returned
|
||||||
|
cloudWatchApi.getAlarmApiForRegion(null).enable(ImmutableSet.of(
|
||||||
|
"TestAlarmName1",
|
||||||
|
"TestAlarmName2"
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testDisableAlarmActions() throws Exception {
|
||||||
|
CloudWatchApi cloudWatchApi = requestSendsResponse(alarmRequest(ImmutableMap.of(
|
||||||
|
"Action", "DisableAlarmActions",
|
||||||
|
"AlarmNames.member.1", "TestAlarmName1",
|
||||||
|
"AlarmNames.member.2", "TestAlarmName2",
|
||||||
|
"Signature", "tvSfJ%2BgcrHowwUECSniV0TQP2OObpWCuba0S5dd723Y%3D"
|
||||||
|
)), HttpResponse.builder()
|
||||||
|
.statusCode(200)
|
||||||
|
.payload(payloadFromResourceWithContentType("/VoidResponse.xml", "text/xml"))
|
||||||
|
.build());
|
||||||
|
|
||||||
|
// Ensure there is no error returned
|
||||||
|
cloudWatchApi.getAlarmApiForRegion(null).disable(ImmutableSet.of(
|
||||||
|
"TestAlarmName1",
|
||||||
|
"TestAlarmName2"
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testDescribeAlarmsForMetric() throws Exception {
|
||||||
|
String metricName = "TestMetricName";
|
||||||
|
String namespace = Namespaces.EC2;
|
||||||
|
int period = 60;
|
||||||
|
Statistics statistics = Statistics.SAMPLE_COUNT;
|
||||||
|
Unit unit = Unit.SECONDS;
|
||||||
|
CloudWatchApi cloudWatchApi = requestSendsResponse(
|
||||||
|
alarmRequest(ImmutableMap.<String, String>builder()
|
||||||
|
.put("Action", "DescribeAlarmsForMetric")
|
||||||
|
.put("Dimensions.member.1.Name", "TestDimensionName1")
|
||||||
|
.put("Dimensions.member.1.Value", "TestDimensionValue1")
|
||||||
|
.put("Dimensions.member.2.Name", "TestDimensionName2")
|
||||||
|
.put("Dimensions.member.2.Value", "TestDimensionValue2")
|
||||||
|
.put("MetricName", metricName)
|
||||||
|
.put("Namespace", namespace)
|
||||||
|
.put("Period", Integer.toString(period))
|
||||||
|
.put("Statistic", statistics.toString())
|
||||||
|
.put("Unit", unit.toString())
|
||||||
|
.put("Signature", "y%2BpU0Lp6AAO2QSrNld1VQY4DhKVHcyn44dIfnrmJhpg%3D")
|
||||||
|
.build()),
|
||||||
|
HttpResponse.builder()
|
||||||
|
.statusCode(200)
|
||||||
|
.payload(payloadFromResourceWithContentType("/DescribeAlarmsForMetricResponse.xml", "text/xml"))
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
|
||||||
|
assertEquals(new ListAlarmsForMetricResponseHandlerTest().expected().toString(),
|
||||||
|
cloudWatchApi.getAlarmApiForRegion(null)
|
||||||
|
.listForMetric(new ListAlarmsForMetric()
|
||||||
|
.dimensions(ImmutableSet.of(
|
||||||
|
new Dimension("TestDimensionName1",
|
||||||
|
"TestDimensionValue1"),
|
||||||
|
new Dimension("TestDimensionName2",
|
||||||
|
"TestDimensionValue2")
|
||||||
|
))
|
||||||
|
.metricName(metricName)
|
||||||
|
.namespace(namespace)
|
||||||
|
.period(period)
|
||||||
|
.statistic(statistics)
|
||||||
|
.unit(unit)
|
||||||
|
).toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testDescribeAlarms() throws Exception {
|
||||||
|
String actionPrefix = "TestActionPrefix";
|
||||||
|
String alarmNamePrefix = "TestAlarmNamePrefix";
|
||||||
|
Set<String> alarmNames = ImmutableSet.of("TestAlarmName1", "TestAlarmName2");
|
||||||
|
int maxRecords = 10;
|
||||||
|
Alarm.State state = Alarm.State.ALARM;
|
||||||
|
CloudWatchApi cloudWatchApi = requestSendsResponse(
|
||||||
|
alarmRequest(ImmutableMap.<String, String>builder()
|
||||||
|
.put("Action", "DescribeAlarms")
|
||||||
|
.put("ActionPrefix", actionPrefix)
|
||||||
|
.put("AlarmNamePrefix", alarmNamePrefix)
|
||||||
|
.put("AlarmNames.member.1", "TestAlarmName1")
|
||||||
|
.put("AlarmNames.member.2", "TestAlarmName2")
|
||||||
|
.put("MaxRecords", Integer.toString(maxRecords))
|
||||||
|
.put("StateValue", state.toString())
|
||||||
|
.put("Signature", "jPP1enbHPfOphIZv796W0KN4/EsLdPp6nK1qpbt5Dog%3D")
|
||||||
|
.build()),
|
||||||
|
HttpResponse.builder()
|
||||||
|
.statusCode(200)
|
||||||
|
.payload(payloadFromResourceWithContentType("/DescribeAlarmsResponse.xml", "text/xml"))
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
|
||||||
|
assertEquals(new ListAlarmsResponseHandlerTest().expected().toString(),
|
||||||
|
cloudWatchApi.getAlarmApiForRegion(null)
|
||||||
|
.list(new ListAlarmsOptions()
|
||||||
|
.actionPrefix(actionPrefix)
|
||||||
|
.alarmNamePrefix(alarmNamePrefix)
|
||||||
|
.alarmNames(alarmNames)
|
||||||
|
.maxRecords(maxRecords)
|
||||||
|
.state(state)
|
||||||
|
).get(0).toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testDescribeAlarmHistory() throws Exception {
|
||||||
|
String alarmName = "TestAlarmName";
|
||||||
|
HistoryItemType historyItemType = HistoryItemType.ACTION;
|
||||||
|
int maxRecords = 10;
|
||||||
|
String endDateStr = "2013-01-02T00:00:00.000Z";
|
||||||
|
String startDateStr = "2013-01-01T00:00:00.000Z";
|
||||||
|
CloudWatchApi cloudWatchApi = requestSendsResponse(
|
||||||
|
alarmRequest(ImmutableMap.<String, String> builder()
|
||||||
|
.put("Action", "DescribeAlarmHistory")
|
||||||
|
.put("AlarmName", alarmName)
|
||||||
|
.put("EndDate", "2013-01-02T00%3A00%3A00.000Z")
|
||||||
|
.put("HistoryItemType", historyItemType.toString())
|
||||||
|
.put("MaxRecords", Integer.toString(maxRecords))
|
||||||
|
.put("StartDate", "2013-01-01T00%3A00%3A00.000Z")
|
||||||
|
.put("Signature", "O2u9yIQvCuVpKdUeUDJcswri0YD0sD4%2B/SR5TtYbPeQ%3D")
|
||||||
|
.build()),
|
||||||
|
HttpResponse.builder()
|
||||||
|
.statusCode(200)
|
||||||
|
.payload(payloadFromResourceWithContentType("/DescribeAlarmHistoryResponse.xml", "text/xml"))
|
||||||
|
.build());
|
||||||
|
|
||||||
|
assertEquals(new ListAlarmHistoryResponseHandlerTest().expected().toString(),
|
||||||
|
cloudWatchApi.getAlarmApiForRegion(null)
|
||||||
|
.listHistory(new ListAlarmHistoryOptions()
|
||||||
|
.alarmName("TestAlarmName")
|
||||||
|
.endDate(dateService.iso8601DateParse(endDateStr))
|
||||||
|
.historyItemType(HistoryItemType.ACTION)
|
||||||
|
.maxRecords(maxRecords)
|
||||||
|
.startDate(dateService.iso8601DateParse(startDateStr))
|
||||||
|
).get(0).toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expectedExceptions = ResourceNotFoundException.class)
|
||||||
|
public void testDeleteAlarmsIs404() throws Exception {
|
||||||
|
CloudWatchApi cloudWatchApi = requestSendsResponse(deleteAlarmsRequest,
|
||||||
|
HttpResponse.builder().statusCode(404).build());
|
||||||
|
|
||||||
|
// Ensure a ResourceNotFoundException is thrown
|
||||||
|
cloudWatchApi.getAlarmApiForRegion(null).delete(ImmutableSet.of(
|
||||||
|
"TestAlarmName1",
|
||||||
|
"TestAlarmName2"
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testDeleteAlarmsIs2xx() throws Exception {
|
||||||
|
Payload payload = payloadFromResourceWithContentType("/VoidResponse.xml", "text/xml");
|
||||||
|
CloudWatchApi cloudWatchApi = requestSendsResponse(deleteAlarmsRequest,
|
||||||
|
HttpResponse.builder()
|
||||||
|
.statusCode(200)
|
||||||
|
.payload(payload)
|
||||||
|
.build());
|
||||||
|
|
||||||
|
// Ensure there is no error returned
|
||||||
|
cloudWatchApi.getAlarmApiForRegion(null).delete(ImmutableSet.of(
|
||||||
|
"TestAlarmName1",
|
||||||
|
"TestAlarmName2"
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
private HttpRequest alarmRequest(Map<String, String> arguments) {
|
||||||
|
Map<String, String> sortedArguments = Maps.newTreeMap();
|
||||||
|
Map<String, String> defaultArguments =
|
||||||
|
ImmutableMap.<String, String> builder()
|
||||||
|
.put("SignatureMethod", "HmacSHA256")
|
||||||
|
.put("SignatureVersion", "2")
|
||||||
|
.put("Timestamp", "2009-11-08T15%3A54%3A08.897Z")
|
||||||
|
.put("Version", "2010-08-01")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
sortedArguments.putAll(arguments);
|
||||||
|
|
||||||
|
for (Map.Entry<String, String> defaultArgument : defaultArguments.entrySet()) {
|
||||||
|
if (!sortedArguments.containsKey(defaultArgument.getKey())) {
|
||||||
|
sortedArguments.put(defaultArgument.getKey(), defaultArgument.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, String> realArguments = Maps.newLinkedHashMap(sortedArguments);
|
||||||
|
|
||||||
|
realArguments.put("AWSAccessKeyId", "identity");
|
||||||
|
|
||||||
|
return HttpRequest.builder()
|
||||||
|
.method("POST")
|
||||||
|
.endpoint("https://monitoring.us-east-1.amazonaws.com/")
|
||||||
|
.addHeader("Host", "monitoring.us-east-1.amazonaws.com")
|
||||||
|
.payload(payloadFromStringWithContentType(Joiner.on("&")
|
||||||
|
.withKeyValueSeparator("=")
|
||||||
|
.join(realArguments).trim(),
|
||||||
|
"application/x-www-form-urlencoded"))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,274 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.features;
|
||||||
|
|
||||||
|
import static java.util.concurrent.TimeUnit.MINUTES;
|
||||||
|
import static org.jclouds.util.Predicates2.retry;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import com.google.common.base.Predicate;
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.common.collect.Iterables;
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import com.google.gson.JsonParser;
|
||||||
|
import org.jclouds.cloudwatch.domain.Alarm;
|
||||||
|
import org.jclouds.cloudwatch.domain.AlarmHistoryItem;
|
||||||
|
import org.jclouds.cloudwatch.domain.ComparisonOperator;
|
||||||
|
import org.jclouds.cloudwatch.domain.Dimension;
|
||||||
|
import org.jclouds.cloudwatch.domain.Metric;
|
||||||
|
import org.jclouds.cloudwatch.domain.MetricDatum;
|
||||||
|
import org.jclouds.cloudwatch.domain.StatisticValues;
|
||||||
|
import org.jclouds.cloudwatch.domain.Statistics;
|
||||||
|
import org.jclouds.cloudwatch.domain.Unit;
|
||||||
|
import org.jclouds.cloudwatch.internal.BaseCloudWatchApiLiveTest;
|
||||||
|
import org.jclouds.cloudwatch.options.ListAlarmHistoryOptions;
|
||||||
|
import org.jclouds.cloudwatch.options.ListAlarmsForMetric;
|
||||||
|
import org.jclouds.cloudwatch.options.ListAlarmsOptions;
|
||||||
|
import org.jclouds.cloudwatch.options.ListMetricsOptions;
|
||||||
|
import org.jclouds.cloudwatch.options.SaveAlarmOptions;
|
||||||
|
import org.jclouds.collect.IterableWithMarker;
|
||||||
|
import org.testng.Assert;
|
||||||
|
import org.testng.annotations.AfterClass;
|
||||||
|
import org.testng.annotations.BeforeClass;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
@Test(groups = "live", testName = "AlarmApiLiveTest")
|
||||||
|
public class AlarmApiLiveTest extends BaseCloudWatchApiLiveTest {
|
||||||
|
|
||||||
|
private String alarmName = "TestAlarmName" + System.currentTimeMillis();
|
||||||
|
private String metricName = "TestMetricForAlarms";
|
||||||
|
private String namespace = "JCLOUDS/Test";
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
protected void beforeClass() throws Exception {
|
||||||
|
IterableWithMarker<Metric> metrics = metricApi().list(new ListMetricsOptions().metricName(metricName));
|
||||||
|
|
||||||
|
if (Iterables.size(metrics) == 0) {
|
||||||
|
metricApi().putMetricsInNamespace(ImmutableSet.of(
|
||||||
|
MetricDatum.builder()
|
||||||
|
.metricName(metricName)
|
||||||
|
.statisticValues(StatisticValues.builder()
|
||||||
|
.maximum(4.0)
|
||||||
|
.minimum(1.0)
|
||||||
|
.sampleCount(4.0)
|
||||||
|
.sum(10.0)
|
||||||
|
.build())
|
||||||
|
.dimension(new Dimension("BaseMetricName", metricName))
|
||||||
|
.dimension(new Dimension("TestDimension2", "TEST2"))
|
||||||
|
.unit(Unit.COUNT)
|
||||||
|
.timestamp(new Date())
|
||||||
|
.build()
|
||||||
|
), namespace);
|
||||||
|
|
||||||
|
ListMetricsOptions lmo = ListMetricsOptions.Builder.namespace(namespace)
|
||||||
|
.metricName(metricName);
|
||||||
|
boolean success = retry(new Predicate<ListMetricsOptions>() {
|
||||||
|
public boolean apply(ListMetricsOptions options) {
|
||||||
|
return Iterables.size(metricApi().list(options)) == 1;
|
||||||
|
}
|
||||||
|
}, 5, 1, MINUTES).apply(lmo);
|
||||||
|
|
||||||
|
if (!success) {
|
||||||
|
Assert.fail("Unable to create the test CloudWatch metric within the time (5m) allotted.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
protected void afterClass() throws Exception {
|
||||||
|
IterableWithMarker<Alarm> alarms = api().list(new ListAlarmsOptions().alarmName(alarmName)).get(0);
|
||||||
|
if (Iterables.size(alarms) > 0) {
|
||||||
|
api().delete(ImmutableSet.of(alarmName));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
protected void testAlarmCRUD() throws Exception {
|
||||||
|
// Create new alarm
|
||||||
|
api().save(new SaveAlarmOptions()
|
||||||
|
.actionsEnabled(true)
|
||||||
|
.alarmDescription("This is a test alarm for jclouds.")
|
||||||
|
.alarmName(alarmName)
|
||||||
|
.comparisonOperator(ComparisonOperator.GREATER_THAN_THRESHOLD)
|
||||||
|
.evaluationPeriods(5)
|
||||||
|
.metricName(metricName)
|
||||||
|
.namespace(namespace)
|
||||||
|
.period(60)
|
||||||
|
.statistic(Statistics.SAMPLE_COUNT)
|
||||||
|
.threshold(1.0));
|
||||||
|
|
||||||
|
// Poll alarms until alarm is found
|
||||||
|
ListAlarmsOptions dmo = new ListAlarmsOptions().alarmName(alarmName);
|
||||||
|
boolean success = retry(new Predicate<ListAlarmsOptions>() {
|
||||||
|
public boolean apply(ListAlarmsOptions options) {
|
||||||
|
return Iterables.size(api().list(options).get(0)) == 1;
|
||||||
|
}
|
||||||
|
}, 5, 1, MINUTES).apply(dmo);
|
||||||
|
|
||||||
|
if (!success) {
|
||||||
|
Assert.fail("Unable to create the test CloudWatch alarm within the time (5m) allotted.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Poll all alarms until alarm is found
|
||||||
|
success = retry(new Predicate<Void>() {
|
||||||
|
public boolean apply(Void arg) {
|
||||||
|
for (IterableWithMarker<Alarm> page : api().list()) {
|
||||||
|
for (Alarm alarm : page) {
|
||||||
|
if (alarm.getAlarmName().equals(alarmName)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}, 5, 1, MINUTES).apply(null);
|
||||||
|
|
||||||
|
if (!success) {
|
||||||
|
Assert.fail("Unable to create the test CloudWatch alarm within the time (5m) allotted.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Poll for alarms for metric until alarm is found
|
||||||
|
ListAlarmsForMetric dafmo = new ListAlarmsForMetric()
|
||||||
|
.metricName(metricName)
|
||||||
|
.namespace(namespace);
|
||||||
|
success = retry(new Predicate<ListAlarmsForMetric>() {
|
||||||
|
public boolean apply(ListAlarmsForMetric options) {
|
||||||
|
for (Alarm alarm : api().listForMetric(options)) {
|
||||||
|
if (alarm.getAlarmName().equals(alarmName)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}, 5, 1, MINUTES).apply(dafmo);
|
||||||
|
|
||||||
|
if (!success) {
|
||||||
|
Assert.fail("Unable to create the test CloudWatch alarm history item within the time (5m) allotted.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create history item by changing its state
|
||||||
|
api().setState(alarmName, "Updating the state.", null, Alarm.State.OK);
|
||||||
|
|
||||||
|
// Poll for alarm history
|
||||||
|
ListAlarmHistoryOptions daho = new ListAlarmHistoryOptions().alarmName(alarmName);
|
||||||
|
success = retry(new Predicate<ListAlarmHistoryOptions>() {
|
||||||
|
public boolean apply(ListAlarmHistoryOptions options) {
|
||||||
|
for (IterableWithMarker<AlarmHistoryItem> page : api().listHistory(options)) {
|
||||||
|
for (AlarmHistoryItem alarmHistoryItem : page) {
|
||||||
|
if (alarmHistoryItem.getAlarmName().equals(alarmName)) {
|
||||||
|
JsonObject historyData = new JsonParser().parse(alarmHistoryItem.getHistoryData())
|
||||||
|
.getAsJsonObject();
|
||||||
|
|
||||||
|
if (historyData.has("newState") && historyData.getAsJsonObject("newState").has("stateReason") &&
|
||||||
|
historyData.getAsJsonObject("newState").get("stateReason").getAsString()
|
||||||
|
.equals("Updating the state.")) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}, 5, 1, MINUTES).apply(daho);
|
||||||
|
|
||||||
|
if (!success) {
|
||||||
|
Assert.fail("Unable to create the test CloudWatch alarm history item within the time (5m) allotted.");
|
||||||
|
}
|
||||||
|
|
||||||
|
success = retry(new Predicate<Void>() {
|
||||||
|
public boolean apply(Void arg) {
|
||||||
|
for (IterableWithMarker<AlarmHistoryItem> page : api().listHistory()) {
|
||||||
|
for (AlarmHistoryItem alarmHistoryItem : page) {
|
||||||
|
if (alarmHistoryItem.getAlarmName().equals(alarmName)) {
|
||||||
|
JsonObject historyData = new JsonParser().parse(alarmHistoryItem.getHistoryData())
|
||||||
|
.getAsJsonObject();
|
||||||
|
|
||||||
|
if (historyData.has("newState") && historyData.getAsJsonObject("newState").has("stateReason") &&
|
||||||
|
historyData.getAsJsonObject("newState").get("stateReason").getAsString()
|
||||||
|
.equals("Updating the state.")) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}, 5, 1, MINUTES).apply(null);
|
||||||
|
|
||||||
|
if (!success) {
|
||||||
|
Assert.fail("Unable to create the test CloudWatch alarm history item within the time (5m) allotted.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Disable alarm actions
|
||||||
|
api().disable(ImmutableSet.of(alarmName));
|
||||||
|
|
||||||
|
// Validate
|
||||||
|
success = retry(new Predicate<ListAlarmsOptions>() {
|
||||||
|
public boolean apply(ListAlarmsOptions options) {
|
||||||
|
Iterable<Alarm> alarms = api().list(options).get(0);
|
||||||
|
return Iterables.size(alarms) == 1 && !alarms.iterator().next().areActionsEnabled();
|
||||||
|
}
|
||||||
|
}, 5, 1, MINUTES).apply(dmo);
|
||||||
|
|
||||||
|
if (!success) {
|
||||||
|
Assert.fail("Unable to validate the test CloudWatch alarm disablement within the time (5m) allotted.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enable alarm actions
|
||||||
|
api().enable(ImmutableSet.of(alarmName));
|
||||||
|
|
||||||
|
// Validate
|
||||||
|
success = retry(new Predicate<ListAlarmsOptions>() {
|
||||||
|
public boolean apply(ListAlarmsOptions options) {
|
||||||
|
IterableWithMarker<Alarm> alarms = api().list(options).get(0);
|
||||||
|
return Iterables.size(alarms) == 1 && alarms.iterator().next().areActionsEnabled();
|
||||||
|
}
|
||||||
|
}, 5, 1, MINUTES).apply(dmo);
|
||||||
|
|
||||||
|
if (!success) {
|
||||||
|
Assert.fail("Unable to validate the test CloudWatch alarm enablement within the time (5m) allotted.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete the alarm
|
||||||
|
api().delete(ImmutableSet.of(alarmName));
|
||||||
|
|
||||||
|
success = retry(new Predicate<ListAlarmsOptions>() {
|
||||||
|
public boolean apply(ListAlarmsOptions options) {
|
||||||
|
return Iterables.size(api().list(options).get(0)) == 0;
|
||||||
|
}
|
||||||
|
}, 5, 1, MINUTES).apply(dmo);
|
||||||
|
|
||||||
|
if (!success) {
|
||||||
|
Assert.fail("Unable to delete the test CloudWatch alarm within the time (5m) allotted.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected AlarmApi api() {
|
||||||
|
return api.getAlarmApiForRegion(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected MetricApi metricApi() {
|
||||||
|
return api.getMetricApiForRegion(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -9,11 +9,11 @@
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unles required by applicable law or agreed to in writing,
|
* Unless required by applicable law or agreed to in writing,
|
||||||
* software distributed under the License is distributed on an
|
* software distributed under the License is distributed on an
|
||||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
* KIND, either expres or implied. See the License for the
|
* KIND, either express or implied. See the License for the
|
||||||
* specific language governing permisions and limitations
|
* specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
package org.jclouds.cloudwatch.features;
|
package org.jclouds.cloudwatch.features;
|
||||||
|
|
|
@ -269,13 +269,16 @@ public class MetricApiLiveTest extends BaseCloudWatchApiLiveTest {
|
||||||
|
|
||||||
for (Metric metric : response) {
|
for (Metric metric : response) {
|
||||||
Set<Dimension> dimensions = metric.getDimensions();
|
Set<Dimension> dimensions = metric.getDimensions();
|
||||||
|
boolean dimensionFound = false;
|
||||||
|
|
||||||
checkArgument(dimensions.size() == 1, "There should only be one Dimension.");
|
for (Dimension dimension : dimensions) {
|
||||||
|
if (dimension.getName().equals(testDimensionName)) {
|
||||||
|
dimensionFound = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Dimension dimension = dimensions.iterator().next();
|
checkArgument(dimensionFound, "All metrics should have the " + testDimensionName + " Dimension.Name.");
|
||||||
|
|
||||||
checkArgument(dimension.equals(testDimension),
|
|
||||||
"The retrieved Dimension and test Dimension should be equal.");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,9 @@ import org.testng.annotations.Test;
|
||||||
*/
|
*/
|
||||||
@Test(groups = "live")
|
@Test(groups = "live")
|
||||||
public class BaseCloudWatchApiLiveTest extends BaseApiLiveTest<CloudWatchApi> {
|
public class BaseCloudWatchApiLiveTest extends BaseApiLiveTest<CloudWatchApi> {
|
||||||
|
|
||||||
public BaseCloudWatchApiLiveTest() {
|
public BaseCloudWatchApiLiveTest() {
|
||||||
provider = "cloudwatch";
|
provider = "cloudwatch";
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,75 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.options;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
import static org.testng.Assert.assertFalse;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.common.collect.Multimap;
|
||||||
|
import org.jclouds.cloudwatch.domain.HistoryItemType;
|
||||||
|
import org.jclouds.date.DateService;
|
||||||
|
import org.jclouds.date.internal.SimpleDateFormatDateService;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests behavior of {@code ListAlarmHistoryOptions}.
|
||||||
|
*
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
@Test(groups = "unit")
|
||||||
|
public class ListAlarmHistoryOptionsTest {
|
||||||
|
|
||||||
|
private DateService dateService = new SimpleDateFormatDateService();
|
||||||
|
|
||||||
|
public void testEmptyOptions() throws Exception {
|
||||||
|
Multimap<String, String> formParameters = new ListAlarmHistoryOptions().buildFormParameters();
|
||||||
|
|
||||||
|
assertFalse(formParameters.containsKey("AlarmName"));
|
||||||
|
assertFalse(formParameters.containsKey("EndDate"));
|
||||||
|
assertFalse(formParameters.containsKey("HistoryItemType"));
|
||||||
|
assertFalse(formParameters.containsKey("MaxRecords"));
|
||||||
|
assertFalse(formParameters.containsKey("NextToken"));
|
||||||
|
assertFalse(formParameters.containsKey("StartDate"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testPopulatedOptions() throws Exception {
|
||||||
|
String alarmName = "TestAlarmName";
|
||||||
|
Date endDate = new Date(new Date().getTime() + 5000);
|
||||||
|
HistoryItemType historyItemType = HistoryItemType.ACTION;
|
||||||
|
int maxRecords = 5;
|
||||||
|
Date startDate = new Date();
|
||||||
|
Multimap<String, String> formParameters = new ListAlarmHistoryOptions()
|
||||||
|
.alarmName(alarmName)
|
||||||
|
.endDate(endDate)
|
||||||
|
.historyItemType(historyItemType)
|
||||||
|
.maxRecords(maxRecords)
|
||||||
|
.startDate(startDate)
|
||||||
|
.buildFormParameters();
|
||||||
|
|
||||||
|
assertEquals(formParameters.get("AlarmName"), ImmutableSet.of(alarmName));
|
||||||
|
assertEquals(formParameters.get("EndDate"), ImmutableSet.of(dateService.iso8601DateFormat(endDate)));
|
||||||
|
assertEquals(formParameters.get("HistoryItemType"), ImmutableSet.of(historyItemType.toString()));
|
||||||
|
assertEquals(formParameters.get("MaxRecords"), ImmutableSet.of(Integer.toString(maxRecords)));
|
||||||
|
assertEquals(formParameters.get("StartDate"), ImmutableSet.of(dateService.iso8601DateFormat(startDate)));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,89 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.options;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
import static org.testng.Assert.assertFalse;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.common.collect.Multimap;
|
||||||
|
import org.jclouds.cloudwatch.domain.Dimension;
|
||||||
|
import org.jclouds.cloudwatch.domain.Namespaces;
|
||||||
|
import org.jclouds.cloudwatch.domain.Statistics;
|
||||||
|
import org.jclouds.cloudwatch.domain.Unit;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests behavior of {@code ListAlarmsForMetric}.
|
||||||
|
*
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
@Test(groups = "unit")
|
||||||
|
public class ListAlarmsForMetricTest {
|
||||||
|
|
||||||
|
public void testEmptyOptions() throws Exception {
|
||||||
|
Multimap<String, String> formParameters = new ListAlarmsForMetric().buildFormParameters();
|
||||||
|
|
||||||
|
assertFalse(formParameters.containsKey("Dimensions.member.1.Name"));
|
||||||
|
assertFalse(formParameters.containsKey("Dimensions.member.1.Value"));
|
||||||
|
assertFalse(formParameters.containsKey("MetricName"));
|
||||||
|
assertFalse(formParameters.containsKey("Namespace"));
|
||||||
|
assertFalse(formParameters.containsKey("Period"));
|
||||||
|
assertFalse(formParameters.containsKey("Statistic"));
|
||||||
|
assertFalse(formParameters.containsKey("Unit"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testPopulatedOptions() throws Exception {
|
||||||
|
Set<Dimension> dimensions = ImmutableSet.of(
|
||||||
|
new Dimension("TestDimension1", "TestValue1"),
|
||||||
|
new Dimension("TestDimension2", "TestValue2")
|
||||||
|
);
|
||||||
|
String metricName = "TestMetricName";
|
||||||
|
String namespace = Namespaces.EC2;
|
||||||
|
int period = 60;
|
||||||
|
Statistics statistic = Statistics.AVERAGE;
|
||||||
|
Unit unit = Unit.COUNT;
|
||||||
|
Multimap<String, String> formParameters = new ListAlarmsForMetric()
|
||||||
|
.dimensions(dimensions)
|
||||||
|
.metricName(metricName)
|
||||||
|
.namespace(namespace)
|
||||||
|
.period(period)
|
||||||
|
.statistic(statistic)
|
||||||
|
.unit(unit)
|
||||||
|
.buildFormParameters();
|
||||||
|
int dimensionIndex = 1;
|
||||||
|
|
||||||
|
for (Dimension dimension : dimensions) {
|
||||||
|
assertEquals(formParameters.get("Dimensions.member." + dimensionIndex + ".Name"),
|
||||||
|
ImmutableSet.of(dimension.getName()));
|
||||||
|
assertEquals(formParameters.get("Dimensions.member." + dimensionIndex + ".Value"),
|
||||||
|
ImmutableSet.of(dimension.getValue()));
|
||||||
|
dimensionIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
assertEquals(formParameters.get("MetricName"), ImmutableSet.of(metricName));
|
||||||
|
assertEquals(formParameters.get("Namespace"), ImmutableSet.of(namespace));
|
||||||
|
assertEquals(formParameters.get("Period"), ImmutableSet.of(Integer.toString(period)));
|
||||||
|
assertEquals(formParameters.get("Statistic"), ImmutableSet.of(statistic.toString()));
|
||||||
|
assertEquals(formParameters.get("Unit"), ImmutableSet.of(unit.toString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,79 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.options;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
import static org.testng.Assert.assertFalse;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.common.collect.Multimap;
|
||||||
|
import org.jclouds.cloudwatch.domain.Alarm;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests behavior of {@code ListAlarmsOptions}.
|
||||||
|
*
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
@Test(groups = "unit")
|
||||||
|
public class ListAlarmsOptionsTest {
|
||||||
|
|
||||||
|
public void testEmptyOptions() throws Exception {
|
||||||
|
Multimap<String, String> formParameters = new ListAlarmsOptions().buildFormParameters();
|
||||||
|
|
||||||
|
assertFalse(formParameters.containsKey("ActionPrefix"));
|
||||||
|
assertFalse(formParameters.containsKey("AlarmNamePrefix"));
|
||||||
|
assertFalse(formParameters.containsKey("AlarmNames.member.1"));
|
||||||
|
assertFalse(formParameters.containsKey("MaxRecords"));
|
||||||
|
assertFalse(formParameters.containsKey("NextToken"));
|
||||||
|
assertFalse(formParameters.containsKey("StateValue"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testPopulatedOptions() throws Exception {
|
||||||
|
String actionPrefix = "TestActionPrefix";
|
||||||
|
String alarmNamePrefix = "TestAlarmNamePrefix";
|
||||||
|
Set<String> alarmNames = ImmutableSet.of(
|
||||||
|
"TestAlarmName1",
|
||||||
|
"TestAlarmName2"
|
||||||
|
);
|
||||||
|
int maxRecords = 5;
|
||||||
|
Alarm.State state = Alarm.State.ALARM;
|
||||||
|
int alarmNameIndex = 1;
|
||||||
|
Multimap<String, String> formParameters = new ListAlarmsOptions()
|
||||||
|
.actionPrefix(actionPrefix)
|
||||||
|
.alarmNamePrefix(alarmNamePrefix)
|
||||||
|
.alarmNames(alarmNames)
|
||||||
|
.maxRecords(maxRecords)
|
||||||
|
.state(state)
|
||||||
|
.buildFormParameters();
|
||||||
|
|
||||||
|
assertEquals(formParameters.get("ActionPrefix"), ImmutableSet.of(actionPrefix));
|
||||||
|
assertEquals(formParameters.get("AlarmNamePrefix"), ImmutableSet.of(alarmNamePrefix));
|
||||||
|
assertEquals(formParameters.get("MaxRecords"), ImmutableSet.of(Integer.toString(maxRecords)));
|
||||||
|
assertEquals(formParameters.get("StateValue"), ImmutableSet.of(state.toString()));
|
||||||
|
|
||||||
|
for (String alarmName : alarmNames) {
|
||||||
|
assertEquals(formParameters.get("AlarmNames.member." + alarmNameIndex), ImmutableSet.of(alarmName));
|
||||||
|
alarmNameIndex++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,151 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.options;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
import static org.testng.Assert.assertFalse;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.common.collect.Multimap;
|
||||||
|
import org.jclouds.cloudwatch.domain.ComparisonOperator;
|
||||||
|
import org.jclouds.cloudwatch.domain.Dimension;
|
||||||
|
import org.jclouds.cloudwatch.domain.Namespaces;
|
||||||
|
import org.jclouds.cloudwatch.domain.Statistics;
|
||||||
|
import org.jclouds.cloudwatch.domain.Unit;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests behavior of {@code SaveAlarmOptions}.
|
||||||
|
*
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
@Test(groups = "unit")
|
||||||
|
public class SaveAlarmOptionsTest {
|
||||||
|
|
||||||
|
public void testEmptyOptions() throws Exception {
|
||||||
|
Multimap<String, String> formParameters = new SaveAlarmOptions().buildFormParameters();
|
||||||
|
|
||||||
|
assertFalse(formParameters.containsKey("ActionsEnabled"));
|
||||||
|
assertFalse(formParameters.containsKey("AlarmActions.member.1"));
|
||||||
|
assertFalse(formParameters.containsKey("AlarmDescription"));
|
||||||
|
assertFalse(formParameters.containsKey("AlarmName"));
|
||||||
|
assertFalse(formParameters.containsKey("ComparisonOperator"));
|
||||||
|
assertFalse(formParameters.containsKey("Dimensions.member.1.Name"));
|
||||||
|
assertFalse(formParameters.containsKey("Dimensions.member.1.Value"));
|
||||||
|
assertFalse(formParameters.containsKey("EvaluationPeriods"));
|
||||||
|
assertFalse(formParameters.containsKey("InsufficientDataActions.member.1"));
|
||||||
|
assertFalse(formParameters.containsKey("MetricName"));
|
||||||
|
assertFalse(formParameters.containsKey("Namespace"));
|
||||||
|
assertFalse(formParameters.containsKey("OKActions.member.1"));
|
||||||
|
assertFalse(formParameters.containsKey("Period"));
|
||||||
|
assertFalse(formParameters.containsKey("Statistic"));
|
||||||
|
assertFalse(formParameters.containsKey("Threshold"));
|
||||||
|
assertFalse(formParameters.containsKey("Unit"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testPopulatedOptions() throws Exception {
|
||||||
|
boolean actionsEnabled = false;
|
||||||
|
Set<String> alarmActions = ImmutableSet.of(
|
||||||
|
"TestAlarmAction1",
|
||||||
|
"TestAlarmAction2"
|
||||||
|
);
|
||||||
|
String alarmDescription = "TestAlarmDescription";
|
||||||
|
String alarmName = "TestAlarmName";
|
||||||
|
ComparisonOperator comparisonOperator = ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD;
|
||||||
|
Set<Dimension> dimensions = ImmutableSet.of(
|
||||||
|
new Dimension("TestDimension1", "TestValue1"),
|
||||||
|
new Dimension("TestDimension2", "TestValue2")
|
||||||
|
);
|
||||||
|
int evaluationPeriods = 360;
|
||||||
|
Set<String> insufficientDataActions = ImmutableSet.of(
|
||||||
|
"TestInsufficientDataAction1",
|
||||||
|
"TestInsufficientDataAction2"
|
||||||
|
);
|
||||||
|
String metricName = "TestMetricName";
|
||||||
|
String namespace = Namespaces.AUTO_SCALING;
|
||||||
|
Set<String> okActions = ImmutableSet.of(
|
||||||
|
"TestOKAction1",
|
||||||
|
"TestOKAction2"
|
||||||
|
);
|
||||||
|
int period = 300;
|
||||||
|
Statistics statistic = Statistics.SAMPLE_COUNT;
|
||||||
|
double threshold = 1.0;
|
||||||
|
Unit unit = Unit.BITS;
|
||||||
|
Multimap<String, String> formParameters = new SaveAlarmOptions()
|
||||||
|
.actionsEnabled(actionsEnabled)
|
||||||
|
.alarmActions(alarmActions)
|
||||||
|
.alarmDescription(alarmDescription)
|
||||||
|
.alarmName(alarmName)
|
||||||
|
.comparisonOperator(comparisonOperator)
|
||||||
|
.dimensions(dimensions)
|
||||||
|
.evaluationPeriods(evaluationPeriods)
|
||||||
|
.insufficientDataActions(insufficientDataActions)
|
||||||
|
.metricName(metricName)
|
||||||
|
.namespace(namespace)
|
||||||
|
.okActions(okActions)
|
||||||
|
.period(period)
|
||||||
|
.statistic(statistic)
|
||||||
|
.threshold(threshold)
|
||||||
|
.unit(unit)
|
||||||
|
.buildFormParameters();
|
||||||
|
int alarmActionIndex = 1;
|
||||||
|
int dimensionIndex = 1;
|
||||||
|
int insufficientDataActionIndex = 1;
|
||||||
|
int okActionIndex = 1;
|
||||||
|
|
||||||
|
for (String alarmAction : alarmActions) {
|
||||||
|
assertEquals(formParameters.get("AlarmActions.member." + alarmActionIndex), ImmutableSet.of(alarmAction));
|
||||||
|
alarmActionIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Dimension dimension : dimensions) {
|
||||||
|
assertEquals(formParameters.get("Dimensions.member." + dimensionIndex + ".Name"),
|
||||||
|
ImmutableSet.of(dimension.getName()));
|
||||||
|
assertEquals(formParameters.get("Dimensions.member." + dimensionIndex + ".Value"),
|
||||||
|
ImmutableSet.of(dimension.getValue()));
|
||||||
|
dimensionIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (String insufficientDataAction : insufficientDataActions) {
|
||||||
|
assertEquals(formParameters.get("InsufficientDataActions.member." + insufficientDataActionIndex),
|
||||||
|
ImmutableSet.of(insufficientDataAction));
|
||||||
|
insufficientDataActionIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (String okAction : okActions) {
|
||||||
|
assertEquals(formParameters.get("OKActions.member." + okActionIndex), ImmutableSet.of(okAction));
|
||||||
|
okActionIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
assertEquals(formParameters.get("ActionsEnabled"), ImmutableSet.of(Boolean.toString(actionsEnabled)));
|
||||||
|
assertEquals(formParameters.get("AlarmDescription"), ImmutableSet.of(alarmDescription));
|
||||||
|
assertEquals(formParameters.get("AlarmName"), ImmutableSet.of(alarmName));
|
||||||
|
assertEquals(formParameters.get("ComparisonOperator"), ImmutableSet.of(comparisonOperator.toString()));
|
||||||
|
assertEquals(formParameters.get("EvaluationPeriods"), ImmutableSet.of(Integer.toString(evaluationPeriods)));
|
||||||
|
assertEquals(formParameters.get("MetricName"), ImmutableSet.of(metricName));
|
||||||
|
assertEquals(formParameters.get("Namespace"), ImmutableSet.of(namespace));
|
||||||
|
assertEquals(formParameters.get("Period"), ImmutableSet.of(Integer.toString(period)));
|
||||||
|
assertEquals(formParameters.get("Statistic"), ImmutableSet.of(statistic.toString()));
|
||||||
|
assertEquals(formParameters.get("Threshold"), ImmutableSet.of(Double.toString(threshold)));
|
||||||
|
assertEquals(formParameters.get("Unit"), ImmutableSet.of(unit.toString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,78 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.xml;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
import static org.testng.Assert.assertFalse;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
import org.jclouds.cloudwatch.domain.AlarmHistoryItem;
|
||||||
|
import org.jclouds.cloudwatch.domain.HistoryItemType;
|
||||||
|
import org.jclouds.collect.IterableWithMarker;
|
||||||
|
import org.jclouds.collect.IterableWithMarkers;
|
||||||
|
import org.jclouds.date.internal.SimpleDateFormatDateService;
|
||||||
|
import org.jclouds.http.functions.BaseHandlerTest;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests behavior of {@code ListAlarmHistoryResponseHandler}. Implicitly tests behavior of
|
||||||
|
* {@code MetricAlarmHandler}.
|
||||||
|
*
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
// NOTE: Without testName, this will not call @Before* and fail w/NPE during surefire
|
||||||
|
@Test(groups = "unit", testName = "ListAlarmHistoryResponseHandlerTest")
|
||||||
|
public class ListAlarmHistoryResponseHandlerTest extends BaseHandlerTest {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests parsing all possible XML elements that could be encountered by {@link ListAlarmHistoryResponseHandler}.
|
||||||
|
*
|
||||||
|
* @throws Exception if something goes wrong
|
||||||
|
*/
|
||||||
|
public void testParseFullResponse() throws Exception {
|
||||||
|
IterableWithMarker<AlarmHistoryItem> alarmHistoryItems =
|
||||||
|
factory.create(injector.getInstance(ListAlarmHistoryResponseHandler.class))
|
||||||
|
.parse(getClass().getResourceAsStream("/DescribeAlarmHistoryResponse.xml"));
|
||||||
|
|
||||||
|
assertEquals(alarmHistoryItems.toString(), expected().toString());
|
||||||
|
assertFalse(alarmHistoryItems.nextMarker().isPresent());
|
||||||
|
}
|
||||||
|
|
||||||
|
public IterableWithMarker<AlarmHistoryItem> expected() {
|
||||||
|
Set<AlarmHistoryItem> alarmHistoryItems = Sets.newLinkedHashSet();
|
||||||
|
|
||||||
|
for (int i = 1; i <= 2; i++) {
|
||||||
|
alarmHistoryItems.add(new AlarmHistoryItem(
|
||||||
|
"TestAlarmName" + i,
|
||||||
|
"{\"reason\": \"" + i + "\"}",
|
||||||
|
i == 1 ?
|
||||||
|
HistoryItemType.ACTION :
|
||||||
|
HistoryItemType.CONFIGURATION_UPDATE,
|
||||||
|
"This is test " + i + ".",
|
||||||
|
new SimpleDateFormatDateService()
|
||||||
|
.iso8601SecondsDateParse("2013-01-0" + i + "T00:00:00Z")
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
return IterableWithMarkers.from(alarmHistoryItems);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,107 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.xml;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.beust.jcommander.internal.Sets;
|
||||||
|
import com.google.common.base.Optional;
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import org.jclouds.cloudwatch.domain.Alarm;
|
||||||
|
import org.jclouds.cloudwatch.domain.ComparisonOperator;
|
||||||
|
import org.jclouds.cloudwatch.domain.Dimension;
|
||||||
|
import org.jclouds.cloudwatch.domain.Namespaces;
|
||||||
|
import org.jclouds.cloudwatch.domain.Statistics;
|
||||||
|
import org.jclouds.cloudwatch.domain.Unit;
|
||||||
|
import org.jclouds.date.DateService;
|
||||||
|
import org.jclouds.date.internal.SimpleDateFormatDateService;
|
||||||
|
import org.jclouds.http.functions.BaseHandlerTest;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests behavior of {@code ListAlarmsForMetricResponseHandler}. Implicitly tests behavior of
|
||||||
|
* {@code MetricAlarmHandler}.
|
||||||
|
*
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
// NOTE: Without testName, this will not call @Before* and fail w/NPE during surefire
|
||||||
|
@Test(groups = "unit", testName = "ListAlarmsForMetricResponseHandlerTest")
|
||||||
|
public class ListAlarmsForMetricResponseHandlerTest extends BaseHandlerTest {
|
||||||
|
|
||||||
|
private final DateService dateService = new SimpleDateFormatDateService();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests parsing all possible XML elements that could be encountered by {@link ListAlarmsForMetricResponseHandler}.
|
||||||
|
*
|
||||||
|
* @throws Exception if something goes wrong
|
||||||
|
*/
|
||||||
|
public void testParseFullResponse() throws Exception {
|
||||||
|
Iterable<Alarm> metricAlarms =
|
||||||
|
factory.create(injector.getInstance(ListAlarmsForMetricResponseHandler.class))
|
||||||
|
.parse(getClass().getResourceAsStream("/DescribeAlarmsForMetricResponse.xml"));
|
||||||
|
|
||||||
|
assertEquals(metricAlarms.toString(), expected().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Iterable<Alarm> expected() {
|
||||||
|
Set<Alarm> alarms = Sets.newLinkedHashSet();
|
||||||
|
|
||||||
|
for (int i = 1; i <= 2; i++) {
|
||||||
|
alarms.add(new Alarm(
|
||||||
|
i == 1,
|
||||||
|
ImmutableSet.of("TestAction1", "TestAction2"),
|
||||||
|
"TestAlarmARN" + i,
|
||||||
|
dateService.iso8601SecondsDateParse("2013-01-0" + i + "T00:00:00Z"),
|
||||||
|
"This is test alarm " + i + ".",
|
||||||
|
"TestAlarmName" + i,
|
||||||
|
i == 1 ?
|
||||||
|
ComparisonOperator.GREATER_THAN_THRESHOLD :
|
||||||
|
ComparisonOperator.LESS_THAN_THRESHOLD,
|
||||||
|
ImmutableSet.of(
|
||||||
|
new Dimension("TestDimensionName1", "TestDimensionValue1"),
|
||||||
|
new Dimension("TestDimensionName2", "TestDimensionValue2")
|
||||||
|
),
|
||||||
|
60 * i,
|
||||||
|
ImmutableSet.of("TestAction1", "TestAction2"),
|
||||||
|
"TestMetricName" + i,
|
||||||
|
Namespaces.EC2,
|
||||||
|
ImmutableSet.of("TestAction1", "TestAction2"),
|
||||||
|
60 * i,
|
||||||
|
"This is state reason " + i + ".",
|
||||||
|
Optional.of("{\"reason\": \"" + i + "\"}"),
|
||||||
|
dateService.iso8601SecondsDateParse("2013-01-0" + i + "T00:00:00Z"),
|
||||||
|
i == 1 ?
|
||||||
|
Alarm.State.INSUFFICIENT_DATA :
|
||||||
|
Alarm.State.OK,
|
||||||
|
i == 1 ?
|
||||||
|
Statistics.SAMPLE_COUNT :
|
||||||
|
Statistics.AVERAGE,
|
||||||
|
Double.valueOf(Integer.toString(i)),
|
||||||
|
i == 1 ?
|
||||||
|
Optional.of(Unit.SECONDS) :
|
||||||
|
Optional.of(Unit.COUNT_PER_SECOND)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
return alarms;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,112 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.cloudwatch.xml;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
import static org.testng.Assert.assertFalse;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.beust.jcommander.internal.Sets;
|
||||||
|
import com.google.common.base.Optional;
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import org.jclouds.cloudwatch.domain.Alarm;
|
||||||
|
import org.jclouds.cloudwatch.domain.ComparisonOperator;
|
||||||
|
import org.jclouds.cloudwatch.domain.Dimension;
|
||||||
|
import org.jclouds.cloudwatch.domain.Namespaces;
|
||||||
|
import org.jclouds.cloudwatch.domain.Statistics;
|
||||||
|
import org.jclouds.cloudwatch.domain.Unit;
|
||||||
|
import org.jclouds.collect.IterableWithMarker;
|
||||||
|
import org.jclouds.collect.IterableWithMarkers;
|
||||||
|
import org.jclouds.date.DateService;
|
||||||
|
import org.jclouds.date.internal.SimpleDateFormatDateService;
|
||||||
|
import org.jclouds.http.functions.BaseHandlerTest;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests behavior of {@code ListAlarmsResponseHandler}. Implicitly tests behavior of {@code MetricAlarmHandler}.
|
||||||
|
*
|
||||||
|
* @author Jeremy Whitlock
|
||||||
|
*/
|
||||||
|
// NOTE: Without testName, this will not call @Before* and fail w/NPE during surefire
|
||||||
|
@Test(groups = "unit", testName = "ListAlarmsResponseHandlerTest")
|
||||||
|
public class ListAlarmsResponseHandlerTest extends BaseHandlerTest {
|
||||||
|
|
||||||
|
private final DateService dateService = new SimpleDateFormatDateService();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests parsing all possible XML elements that could be encountered by {@link ListAlarmsResponseHandler}.
|
||||||
|
*
|
||||||
|
* @throws Exception if something goes wrong
|
||||||
|
*/
|
||||||
|
public void testParseFullResponse() throws Exception {
|
||||||
|
IterableWithMarker<Alarm> metricAlarms =
|
||||||
|
factory.create(injector.getInstance(ListAlarmsResponseHandler.class))
|
||||||
|
.parse(getClass().getResourceAsStream("/DescribeAlarmsResponse.xml"));
|
||||||
|
|
||||||
|
assertEquals(metricAlarms.toString(), expected().toString());
|
||||||
|
assertFalse(metricAlarms.nextMarker().isPresent());
|
||||||
|
}
|
||||||
|
|
||||||
|
public IterableWithMarker<Alarm> expected() {
|
||||||
|
Set<Alarm> alarms = Sets.newLinkedHashSet();
|
||||||
|
|
||||||
|
for (int i = 1; i <= 2; i++) {
|
||||||
|
alarms.add(new Alarm(
|
||||||
|
i == 1,
|
||||||
|
ImmutableSet.of("TestAction1", "TestAction2"),
|
||||||
|
"TestAlarmARN" + i,
|
||||||
|
dateService.iso8601SecondsDateParse("2013-01-0" + i + "T00:00:00Z"),
|
||||||
|
"This is test alarm " + i + ".",
|
||||||
|
"TestAlarmName" + i,
|
||||||
|
i == 1 ?
|
||||||
|
ComparisonOperator.GREATER_THAN_THRESHOLD :
|
||||||
|
ComparisonOperator.LESS_THAN_THRESHOLD,
|
||||||
|
ImmutableSet.of(
|
||||||
|
new Dimension("TestDimensionName1", "TestDimensionValue1"),
|
||||||
|
new Dimension("TestDimensionName2", "TestDimensionValue2")
|
||||||
|
),
|
||||||
|
60 * i,
|
||||||
|
ImmutableSet.of("TestAction1", "TestAction2"),
|
||||||
|
"TestMetricName" + i,
|
||||||
|
i == 1 ?
|
||||||
|
Namespaces.EC2 :
|
||||||
|
Namespaces.EBS,
|
||||||
|
ImmutableSet.of("TestAction1", "TestAction2"),
|
||||||
|
60 * i,
|
||||||
|
"This is state reason " + i + ".",
|
||||||
|
Optional.of("{\"reason\": \"" + i + "\"}"),
|
||||||
|
dateService.iso8601SecondsDateParse("2013-01-0" + i + "T00:00:00Z"),
|
||||||
|
i == 1 ?
|
||||||
|
Alarm.State.OK :
|
||||||
|
Alarm.State.ALARM,
|
||||||
|
i == 1 ?
|
||||||
|
Statistics.SAMPLE_COUNT :
|
||||||
|
Statistics.AVERAGE,
|
||||||
|
Double.valueOf(Integer.toString(i)),
|
||||||
|
i == 1 ?
|
||||||
|
Optional.of(Unit.SECONDS) :
|
||||||
|
Optional.of(Unit.COUNT_PER_SECOND)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
return IterableWithMarkers.from(alarms);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
<DescribeAlarmHistoryResponse xmlns="http://monitoring.amazonaws.com/doc/2010-08-01/">
|
||||||
|
<DescribeAlarmHistoryResult>
|
||||||
|
<AlarmHistoryItems>
|
||||||
|
<member>
|
||||||
|
<AlarmName>TestAlarmName1</AlarmName>
|
||||||
|
<HistoryData>{"reason": "1"}</HistoryData>
|
||||||
|
<HistoryItemType>Action</HistoryItemType>
|
||||||
|
<HistorySummary>This is test 1.</HistorySummary>
|
||||||
|
<Timestamp>2013-01-01T00:00:00.000+0000</Timestamp>
|
||||||
|
</member>
|
||||||
|
<member>
|
||||||
|
<AlarmName>TestAlarmName2</AlarmName>
|
||||||
|
<HistoryData>{"reason": "2"}</HistoryData>
|
||||||
|
<HistoryItemType>ConfigurationUpdate</HistoryItemType>
|
||||||
|
<HistorySummary>This is test 2.</HistorySummary>
|
||||||
|
<Timestamp>2013-01-02T00:00:00.000+0000</Timestamp>
|
||||||
|
</member>
|
||||||
|
</AlarmHistoryItems>
|
||||||
|
</DescribeAlarmHistoryResult>
|
||||||
|
</DescribeAlarmHistoryResponse>
|
|
@ -0,0 +1,88 @@
|
||||||
|
<DescribeAlarmsForMetricResponse xmlns="http://monitoring.amazonaws.com/doc/2010-08-01/">
|
||||||
|
<DescribeAlarmsForMetricResult>
|
||||||
|
<MetricAlarms>
|
||||||
|
<member>
|
||||||
|
<ActionsEnabled>true</ActionsEnabled>
|
||||||
|
<AlarmActions>
|
||||||
|
<member>TestAction1</member>
|
||||||
|
<member>TestAction2</member>
|
||||||
|
</AlarmActions>
|
||||||
|
<AlarmArn>TestAlarmARN1</AlarmArn>
|
||||||
|
<AlarmConfigurationUpdatedTimestamp>2013-01-01T00:00:00.000+0000</AlarmConfigurationUpdatedTimestamp>
|
||||||
|
<AlarmDescription>This is test alarm 1.</AlarmDescription>
|
||||||
|
<AlarmName>TestAlarmName1</AlarmName>
|
||||||
|
<ComparisonOperator>GreaterThanThreshold</ComparisonOperator>
|
||||||
|
<Dimensions>
|
||||||
|
<member>
|
||||||
|
<Name>TestDimensionName1</Name>
|
||||||
|
<Value>TestDimensionValue1</Value>
|
||||||
|
</member>
|
||||||
|
<member>
|
||||||
|
<Name>TestDimensionName2</Name>
|
||||||
|
<Value>TestDimensionValue2</Value>
|
||||||
|
</member>
|
||||||
|
</Dimensions>
|
||||||
|
<EvaluationPeriods>60</EvaluationPeriods>
|
||||||
|
<UnknownActions>
|
||||||
|
<member>TestAction1</member>
|
||||||
|
<member>TestAction2</member>
|
||||||
|
</UnknownActions>
|
||||||
|
<MetricName>TestMetricName1</MetricName>
|
||||||
|
<Namespace>AWS/EC2</Namespace>
|
||||||
|
<OKActions>
|
||||||
|
<member>TestAction1</member>
|
||||||
|
<member>TestAction2</member>
|
||||||
|
</OKActions>
|
||||||
|
<Period>60</Period>
|
||||||
|
<StateReason>This is state reason 1.</StateReason>
|
||||||
|
<StateReasonData>{"reason": "1"}</StateReasonData>
|
||||||
|
<StateUpdatedTimestamp>2013-01-01T00:00:00.000+0000</StateUpdatedTimestamp>
|
||||||
|
<StateValue>INSUFFICIENT_DATA</StateValue>
|
||||||
|
<Statistic>SampleCount</Statistic>
|
||||||
|
<Threshold>1.0</Threshold>
|
||||||
|
<Unit>Seconds</Unit>
|
||||||
|
</member>
|
||||||
|
<member>
|
||||||
|
<ActionsEnabled>false</ActionsEnabled>
|
||||||
|
<AlarmActions>
|
||||||
|
<member>TestAction1</member>
|
||||||
|
<member>TestAction2</member>
|
||||||
|
</AlarmActions>
|
||||||
|
<AlarmArn>TestAlarmARN2</AlarmArn>
|
||||||
|
<AlarmConfigurationUpdatedTimestamp>2013-01-02T00:00:00.000+0000</AlarmConfigurationUpdatedTimestamp>
|
||||||
|
<AlarmDescription>This is test alarm 2.</AlarmDescription>
|
||||||
|
<AlarmName>TestAlarmName2</AlarmName>
|
||||||
|
<ComparisonOperator>LessThanThreshold</ComparisonOperator>
|
||||||
|
<Dimensions>
|
||||||
|
<member>
|
||||||
|
<Name>TestDimensionName1</Name>
|
||||||
|
<Value>TestDimensionValue1</Value>
|
||||||
|
</member>
|
||||||
|
<member>
|
||||||
|
<Name>TestDimensionName2</Name>
|
||||||
|
<Value>TestDimensionValue2</Value>
|
||||||
|
</member>
|
||||||
|
</Dimensions>
|
||||||
|
<EvaluationPeriods>120</EvaluationPeriods>
|
||||||
|
<UnknownActions>
|
||||||
|
<member>TestAction1</member>
|
||||||
|
<member>TestAction2</member>
|
||||||
|
</UnknownActions>
|
||||||
|
<MetricName>TestMetricName2</MetricName>
|
||||||
|
<Namespace>AWS/EC2</Namespace>
|
||||||
|
<OKActions>
|
||||||
|
<member>TestAction1</member>
|
||||||
|
<member>TestAction2</member>
|
||||||
|
</OKActions>
|
||||||
|
<Period>120</Period>
|
||||||
|
<StateReason>This is state reason 2.</StateReason>
|
||||||
|
<StateReasonData>{"reason": "2"}</StateReasonData>
|
||||||
|
<StateUpdatedTimestamp>2013-01-02T00:00:00.000+0000</StateUpdatedTimestamp>
|
||||||
|
<StateValue>OK</StateValue>
|
||||||
|
<Statistic>Average</Statistic>
|
||||||
|
<Threshold>2.0</Threshold>
|
||||||
|
<Unit>Count/Second</Unit>
|
||||||
|
</member>
|
||||||
|
</MetricAlarms>
|
||||||
|
</DescribeAlarmsForMetricResult>
|
||||||
|
</DescribeAlarmsForMetricResponse>
|
|
@ -0,0 +1,88 @@
|
||||||
|
<DescribeAlarmsResponse xmlns="http://monitoring.amazonaws.com/doc/2010-08-01/">
|
||||||
|
<DescribeAlarmsResult>
|
||||||
|
<MetricAlarms>
|
||||||
|
<member>
|
||||||
|
<ActionsEnabled>true</ActionsEnabled>
|
||||||
|
<AlarmActions>
|
||||||
|
<member>TestAction1</member>
|
||||||
|
<member>TestAction2</member>
|
||||||
|
</AlarmActions>
|
||||||
|
<AlarmArn>TestAlarmARN1</AlarmArn>
|
||||||
|
<AlarmConfigurationUpdatedTimestamp>2013-01-01T00:00:00.000+0000</AlarmConfigurationUpdatedTimestamp>
|
||||||
|
<AlarmDescription>This is test alarm 1.</AlarmDescription>
|
||||||
|
<AlarmName>TestAlarmName1</AlarmName>
|
||||||
|
<ComparisonOperator>GreaterThanThreshold</ComparisonOperator>
|
||||||
|
<Dimensions>
|
||||||
|
<member>
|
||||||
|
<Name>TestDimensionName1</Name>
|
||||||
|
<Value>TestDimensionValue1</Value>
|
||||||
|
</member>
|
||||||
|
<member>
|
||||||
|
<Name>TestDimensionName2</Name>
|
||||||
|
<Value>TestDimensionValue2</Value>
|
||||||
|
</member>
|
||||||
|
</Dimensions>
|
||||||
|
<EvaluationPeriods>60</EvaluationPeriods>
|
||||||
|
<UnknownActions>
|
||||||
|
<member>TestAction1</member>
|
||||||
|
<member>TestAction2</member>
|
||||||
|
</UnknownActions>
|
||||||
|
<MetricName>TestMetricName1</MetricName>
|
||||||
|
<Namespace>AWS/EC2</Namespace>
|
||||||
|
<OKActions>
|
||||||
|
<member>TestAction1</member>
|
||||||
|
<member>TestAction2</member>
|
||||||
|
</OKActions>
|
||||||
|
<Period>60</Period>
|
||||||
|
<StateReason>This is state reason 1.</StateReason>
|
||||||
|
<StateReasonData>{"reason": "1"}</StateReasonData>
|
||||||
|
<StateUpdatedTimestamp>2013-01-01T00:00:00.000+0000</StateUpdatedTimestamp>
|
||||||
|
<StateValue>OK</StateValue>
|
||||||
|
<Statistic>SampleCount</Statistic>
|
||||||
|
<Threshold>1.0</Threshold>
|
||||||
|
<Unit>Seconds</Unit>
|
||||||
|
</member>
|
||||||
|
<member>
|
||||||
|
<ActionsEnabled>false</ActionsEnabled>
|
||||||
|
<AlarmActions>
|
||||||
|
<member>TestAction1</member>
|
||||||
|
<member>TestAction2</member>
|
||||||
|
</AlarmActions>
|
||||||
|
<AlarmArn>TestAlarmARN2</AlarmArn>
|
||||||
|
<AlarmConfigurationUpdatedTimestamp>2013-01-02T00:00:00.000+0000</AlarmConfigurationUpdatedTimestamp>
|
||||||
|
<AlarmDescription>This is test alarm 2.</AlarmDescription>
|
||||||
|
<AlarmName>TestAlarmName2</AlarmName>
|
||||||
|
<ComparisonOperator>LessThanThreshold</ComparisonOperator>
|
||||||
|
<Dimensions>
|
||||||
|
<member>
|
||||||
|
<Name>TestDimensionName1</Name>
|
||||||
|
<Value>TestDimensionValue1</Value>
|
||||||
|
</member>
|
||||||
|
<member>
|
||||||
|
<Name>TestDimensionName2</Name>
|
||||||
|
<Value>TestDimensionValue2</Value>
|
||||||
|
</member>
|
||||||
|
</Dimensions>
|
||||||
|
<EvaluationPeriods>120</EvaluationPeriods>
|
||||||
|
<UnknownActions>
|
||||||
|
<member>TestAction1</member>
|
||||||
|
<member>TestAction2</member>
|
||||||
|
</UnknownActions>
|
||||||
|
<MetricName>TestMetricName2</MetricName>
|
||||||
|
<Namespace>AWS/EBS</Namespace>
|
||||||
|
<OKActions>
|
||||||
|
<member>TestAction1</member>
|
||||||
|
<member>TestAction2</member>
|
||||||
|
</OKActions>
|
||||||
|
<Period>120</Period>
|
||||||
|
<StateReason>This is state reason 2.</StateReason>
|
||||||
|
<StateReasonData>{"reason": "2"}</StateReasonData>
|
||||||
|
<StateUpdatedTimestamp>2013-01-02T00:00:00.000+0000</StateUpdatedTimestamp>
|
||||||
|
<StateValue>ALARM</StateValue>
|
||||||
|
<Statistic>Average</Statistic>
|
||||||
|
<Threshold>2.0</Threshold>
|
||||||
|
<Unit>Count/Second</Unit>
|
||||||
|
</member>
|
||||||
|
</MetricAlarms>
|
||||||
|
</DescribeAlarmsResult>
|
||||||
|
</DescribeAlarmsResponse>
|
|
@ -0,0 +1,9 @@
|
||||||
|
<ErrorResponse>
|
||||||
|
<Errors>
|
||||||
|
<Error>
|
||||||
|
<Code>InvalidFormat</Code>
|
||||||
|
<Message>Data was not syntactically valid JSON.</Message>
|
||||||
|
</Error>
|
||||||
|
</Errors>
|
||||||
|
<RequestID>a9f8f3a3-e40f-11dd-af0f-cf11f65ec49d</RequestID>
|
||||||
|
</ErrorResponse>
|
|
@ -0,0 +1,9 @@
|
||||||
|
<ErrorResponse>
|
||||||
|
<Errors>
|
||||||
|
<Error>
|
||||||
|
<Code>LimitExceeded</Code>
|
||||||
|
<Message>The quota for alarms for this customer has already been reached.</Message>
|
||||||
|
</Error>
|
||||||
|
</Errors>
|
||||||
|
<RequestID>a9f8f3a3-e40f-11dd-af0f-cf11f65ec49d</RequestID>
|
||||||
|
</ErrorResponse>
|
|
@ -0,0 +1,5 @@
|
||||||
|
<VoidResponse xmlns="http://monitoring.amazonaws.com/doc/2010-08-01/">
|
||||||
|
<ResponseMetadata>
|
||||||
|
<RequestId>a9f8f3a3-e40f-11dd-af0f-cf11f65ec49d</RequestId>
|
||||||
|
</ResponseMetadata>
|
||||||
|
</VoidResponse>
|
Loading…
Reference in New Issue