/************************************************************************* * Copyright 2009-2013 Eucalyptus Systems, Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * Please contact Eucalyptus Systems, Inc., 6755 Hollister Ave., Goleta * CA 93117, USA or visit http://www.eucalyptus.com/licenses/ if you need * additional information or have any questions. ************************************************************************/ package com.eucalyptus.cloudwatch.service; import com.eucalyptus.auth.principal.AccountFullName; import com.eucalyptus.auth.principal.OwnerFullName; import com.eucalyptus.cloudwatch.common.CloudWatchMetadata; import com.eucalyptus.cloudwatch.common.internal.domain.DimensionEntity; import com.eucalyptus.cloudwatch.common.internal.domain.alarms.AlarmEntity; import com.eucalyptus.cloudwatch.common.internal.domain.alarms.AlarmHistory; import com.eucalyptus.cloudwatch.common.internal.domain.listmetrics.ListMetric; import com.eucalyptus.cloudwatch.common.msgs.AlarmHistoryItem; import com.eucalyptus.cloudwatch.common.msgs.Dimension; import com.eucalyptus.cloudwatch.common.msgs.DimensionFilter; import com.eucalyptus.cloudwatch.common.msgs.DimensionFilters; import com.eucalyptus.cloudwatch.common.msgs.Dimensions; import com.eucalyptus.cloudwatch.common.msgs.Metric; import com.eucalyptus.cloudwatch.common.msgs.MetricAlarm; import com.eucalyptus.cloudwatch.common.msgs.ResourceList; import com.google.common.base.Function; import com.google.common.collect.Collections2; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.apache.log4j.Logger; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Map; public class TransformationFunctions { private static final Logger LOG = Logger .getLogger(TransformationFunctions.class); public TransformationFunctions() { } enum DimensionEntityToDimension implements Function<DimensionEntity, Dimension> { INSTANCE { @Override public Dimension apply(@Nullable DimensionEntity listMetricDimension) { Dimension dimension = new Dimension(); dimension.setName(listMetricDimension.getName()); dimension.setValue(listMetricDimension.getValue()); return dimension; } } } enum ListMetricToMetric implements Function<ListMetric, Metric> { INSTANCE { @Override public Metric apply(@Nullable ListMetric listMetric) { Metric metric = new Metric(); metric.setMetricName(listMetric.getMetricName()); metric.setNamespace(listMetric.getNamespace()); Dimensions dimensions = new Dimensions(); dimensions.setMember(Lists.newArrayList(Collections2 .<DimensionEntity, Dimension> transform(listMetric.getDimensions(), TransformationFunctions.DimensionEntityToDimension.INSTANCE))); metric.setDimensions(dimensions); return metric; } } } enum AlarmEntityToMetricAlarm implements Function<AlarmEntity, MetricAlarm> { INSTANCE { @Override public MetricAlarm apply(@Nullable AlarmEntity alarmEntity) { LOG.trace("OK_ACTIONS=" + alarmEntity.getOkActions()); LOG.trace("ALARM_ACTIONS=" + alarmEntity.getAlarmActions()); LOG.trace("INSUFFICIENT_DATA_ACTIONS=" + alarmEntity.getInsufficientDataActions()); MetricAlarm metricAlarm = new MetricAlarm(); metricAlarm.setActionsEnabled(alarmEntity.getActionsEnabled()); ResourceList alarmActions = new ResourceList(); ArrayList<String> alarmActionsMember = new ArrayList<String>(); if (alarmEntity.getAlarmActions() != null) { alarmActionsMember.addAll(alarmEntity.getAlarmActions()); } alarmActions.setMember(alarmActionsMember); metricAlarm.setAlarmActions(alarmActions); metricAlarm.setAlarmArn(alarmEntity.getResourceName()); metricAlarm.setAlarmConfigurationUpdatedTimestamp(alarmEntity .getAlarmConfigurationUpdatedTimestamp()); metricAlarm.setAlarmDescription(alarmEntity.getAlarmDescription()); metricAlarm.setAlarmName(alarmEntity.getAlarmName()); metricAlarm .setComparisonOperator(alarmEntity.getComparisonOperator() == null ? null : alarmEntity.getComparisonOperator().toString()); Dimensions dimensions = new Dimensions(); dimensions.setMember(Lists.newArrayList(Collections2 .<DimensionEntity, Dimension> transform( alarmEntity.getDimensions(), TransformationFunctions.DimensionEntityToDimension.INSTANCE))); metricAlarm.setDimensions(dimensions); metricAlarm.setEvaluationPeriods(alarmEntity.getEvaluationPeriods()); metricAlarm.setMetricName(alarmEntity.getMetricName()); metricAlarm.setNamespace(alarmEntity.getNamespace()); ResourceList okActions = new ResourceList(); ArrayList<String> okActionsMember = new ArrayList<String>(); if (alarmEntity.getOkActions() != null) { okActionsMember.addAll(alarmEntity.getOkActions()); } okActions.setMember(okActionsMember); metricAlarm.setOkActions(okActions); metricAlarm.setPeriod(alarmEntity.getPeriod()); metricAlarm.setStateReason(alarmEntity.getStateReason()); metricAlarm.setStateReasonData(alarmEntity.getStateReasonData()); metricAlarm.setStateUpdatedTimestamp(alarmEntity .getStateUpdatedTimestamp()); metricAlarm.setStateValue(alarmEntity.getStateValue() == null ? null : alarmEntity.getStateValue().toString()); metricAlarm.setStatistic(alarmEntity.getStatistic() == null ? null : alarmEntity.getStatistic().toString()); metricAlarm.setThreshold(alarmEntity.getThreshold()); metricAlarm.setUnit(alarmEntity.getUnit() == null ? null : alarmEntity .getUnit().toString()); ResourceList insufficientDataActions = new ResourceList(); ArrayList<String> insufficientDataActionsMember = new ArrayList<String>(); if (alarmEntity.getInsufficientDataActions() != null) { insufficientDataActionsMember.addAll(alarmEntity .getInsufficientDataActions()); } insufficientDataActions.setMember(insufficientDataActionsMember); metricAlarm.setInsufficientDataActions(insufficientDataActions); return metricAlarm; } } } enum AlarmHistoryToAlarmMetadata implements Function<AlarmHistory, CloudWatchMetadata.AlarmMetadata> { INSTANCE { @Override public CloudWatchMetadata.AlarmMetadata apply( final AlarmHistory alarmHistory ) { return new CloudWatchMetadata.AlarmMetadata( ){ @Override public String getDisplayName() { return alarmHistory.getAlarmName(); } @Override public OwnerFullName getOwner() { return AccountFullName.getInstance( alarmHistory.getAccountId() ); } }; } } } enum AlarmHistoryToAlarmHistoryItem implements Function<AlarmHistory, AlarmHistoryItem> { INSTANCE { @Override public AlarmHistoryItem apply(@Nullable AlarmHistory alarmHistory) { AlarmHistoryItem alarmHistoryItem = new AlarmHistoryItem(); alarmHistoryItem.setAlarmName(alarmHistory.getAlarmName()); alarmHistoryItem.setHistoryData(alarmHistory.getHistoryData()); alarmHistoryItem .setHistoryItemType(alarmHistory.getHistoryItemType() == null ? null : alarmHistory.getHistoryItemType().toString()); alarmHistoryItem.setHistorySummary(alarmHistory.getHistorySummary()); alarmHistoryItem.setTimestamp(alarmHistory.getTimestamp()); return alarmHistoryItem; } } } enum DimensionFiltersToMap implements Function<DimensionFilters, Map<String, String>> { INSTANCE { @Override public Map<String, String> apply( @Nullable DimensionFilters dimensionFilters) { final Map<String, String> result = Maps.newHashMap(); if (dimensionFilters != null && dimensionFilters.getMember() != null) { for (DimensionFilter dimensionFilter : dimensionFilters.getMember()) { result.put(dimensionFilter.getName(), dimensionFilter.getValue()); } } return result; } } } enum DimensionsToMap implements Function<Dimensions, Map<String, String>> { INSTANCE; @Nonnull @Override public Map<String, String> apply(@Nullable Dimensions dimensions) { final Map<String, String> result = Maps.newHashMap(); if (dimensions != null && dimensions.getMember() != null) { for (Dimension dimension : dimensions.getMember()) { result.put(dimension.getName(), dimension.getValue()); } } return result; } } }