/************************************************************************* * 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.autoscaling.common.internal.policies; import static com.eucalyptus.autoscaling.common.AutoScalingMetadata.ScalingPolicyMetadata; import java.util.List; import javax.persistence.EntityTransaction; import com.eucalyptus.autoscaling.common.msgs.ScalingPolicyType; import com.eucalyptus.autoscaling.common.internal.metadata.AutoScalingMetadataException; import com.eucalyptus.autoscaling.common.AutoScalingMetadatas; import com.eucalyptus.autoscaling.common.internal.groups.AutoScalingGroup; import com.eucalyptus.entities.Entities; import com.eucalyptus.util.Callback; import com.eucalyptus.auth.principal.OwnerFullName; import com.eucalyptus.util.RestrictedTypes; import com.eucalyptus.util.Strings; import com.eucalyptus.util.TypeMapper; import com.google.common.base.Function; import com.google.common.base.Predicate; /** * */ public abstract class ScalingPolicies { public abstract <T> List<T> list( OwnerFullName ownerFullName, Predicate<? super ScalingPolicy> filter, Function<? super ScalingPolicy,T> transform ) throws AutoScalingMetadataException; public abstract <T> T lookup( OwnerFullName ownerFullName, String autoScalingGroupName, String policyName, Function<? super ScalingPolicy,T> transform ) throws AutoScalingMetadataException; public abstract ScalingPolicy update( OwnerFullName ownerFullName, String autoScalingGroupName, String policyName, Callback<ScalingPolicy> policyUpdateCallback ) throws AutoScalingMetadataException; public abstract boolean delete( ScalingPolicyMetadata scalingPolicy ) throws AutoScalingMetadataException; public abstract ScalingPolicy save( ScalingPolicy scalingPolicy ) throws AutoScalingMetadataException; public final PersistingBuilder create( final OwnerFullName ownerFullName, final AutoScalingGroup autoScalingGroup, final String policyName, final AdjustmentType adjustmentType, final Integer scalingAdjustment ) { return new PersistingBuilder( this, ownerFullName, autoScalingGroup, policyName, adjustmentType, scalingAdjustment ); } public static Function<ScalingPolicy,String> toGroupName() { return ScalingPolicyProperties.GROUP_NAME; } public static Function<ScalingPolicy,String> toGroupUuid() { return ScalingPolicyProperties.GROUP_UUID; } public static class PersistingBuilder extends ScalingPolicy.BaseBuilder<PersistingBuilder> { private final ScalingPolicies scalingPolicies; PersistingBuilder( final ScalingPolicies scalingPolicies, final OwnerFullName ownerFullName, final AutoScalingGroup autoScalingGroup, final String name, final AdjustmentType adjustmentType, final Integer scalingAdjustment ) { super( ownerFullName, autoScalingGroup, name, adjustmentType, scalingAdjustment ); this.scalingPolicies = scalingPolicies; } @Override protected PersistingBuilder builder() { return this; } public ScalingPolicy persist() throws AutoScalingMetadataException { return scalingPolicies.save( build() ); } } @TypeMapper public enum ScalingPolicyViewTransform implements Function<ScalingPolicy, ScalingPolicyView> { INSTANCE; @Override public ScalingPolicyView apply( final ScalingPolicy scalingPolicy ) { return new ScalingPolicyView( scalingPolicy ); } } @TypeMapper public enum ScalingPolicyTransform implements Function<ScalingPolicy, ScalingPolicyType> { INSTANCE; @Override public ScalingPolicyType apply( final ScalingPolicy policy ) { final ScalingPolicyType type = new ScalingPolicyType(); type.setPolicyARN( policy.getArn() ); type.setPolicyName( policy.getPolicyName() ); if ( policy.getGroup() != null ) type.setAutoScalingGroupName( policy.getGroup().getAutoScalingGroupName() ); type.setAdjustmentType( Strings.toString( policy.getAdjustmentType() ) ); type.setScalingAdjustment( policy.getScalingAdjustment() ); type.setMinAdjustmentStep( policy.getMinAdjustmentStep() ); type.setCooldown( policy.getCooldown() ); return type; } } @RestrictedTypes.QuantityMetricFunction( ScalingPolicyMetadata.class ) public enum CountScalingPolicies implements Function<OwnerFullName, Long> { INSTANCE; @Override public Long apply( final OwnerFullName input ) { final EntityTransaction db = Entities.get( ScalingPolicy.class ); try { return Entities.count( ScalingPolicy.withOwner( input ) ); } finally { db.rollback( ); } } } private enum ScalingPolicyProperties implements Function<ScalingPolicy,String> { GROUP_NAME { @Override public String apply( final ScalingPolicy scalingPolicy ) { return AutoScalingMetadatas.toDisplayName().apply( scalingPolicy.getGroup() ); } }, GROUP_UUID { @Override public String apply( final ScalingPolicy scalingPolicy ) { return scalingPolicy.getGroup() == null ? null : scalingPolicy.getGroup().getNaturalId(); } } } }