/*************************************************************************
* 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.configurations;
import static com.eucalyptus.autoscaling.common.AutoScalingMetadata.LaunchConfigurationMetadata;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.Lob;
import javax.persistence.OrderColumn;
import javax.persistence.PersistenceContext;
import javax.persistence.Table;
import org.hibernate.annotations.Type;
import com.eucalyptus.entities.AbstractOwnedPersistent;
import com.eucalyptus.auth.principal.OwnerFullName;
import com.google.common.base.Objects;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
/**
*
*/
@Entity
@PersistenceContext( name = "eucalyptus_autoscaling" )
@Table( name = "metadata_launch_configurations" )
public class LaunchConfiguration extends AbstractOwnedPersistent implements LaunchConfigurationMetadata {
private static final long serialVersionUID = 1L;
@Column( name = "metadata_image_id", nullable = false )
private String imageId;
@Column( name = "metadata_kernel_id" )
private String kernelId;
@Column( name = "metadata_ramdisk_id" )
private String ramdiskId;
@Column( name = "metadata_key_name" )
private String keyName;
/**
* Security groups can be names or identifiers, but not a mix.
*/
@ElementCollection
@CollectionTable( name = "metadata_launch_configuration_security_groups" )
@Column( name = "metadata_security_group" )
@OrderColumn( name = "metadata_security_group_index")
private List<String> securityGroups = Lists.newArrayList();
@Column( name = "metadata_user_data" )
@Lob
@Type(type="org.hibernate.type.StringClobType")
private String userData;
@Column( name = "metadata_instance_type", nullable = false )
private String instanceType;
@ElementCollection
@CollectionTable( name = "metadata_launch_configuration_block_device_mappings" )
@OrderColumn( name = "metadata_device_mapping_index")
private List<BlockDeviceMapping> blockDeviceMappings = Lists.newArrayList();
@Column( name = "metadata_associate_public_ip" )
private Boolean associatePublicIpAddress;
@Column( name = "metadata_instance_monitoring" )
private Boolean instanceMonitoring;
@Column( name = "metadata_instance_profile", length = 1600)
private String iamInstanceProfile;
protected LaunchConfiguration() {
}
protected LaunchConfiguration( final OwnerFullName owner ) {
super( owner );
}
protected LaunchConfiguration( final OwnerFullName owner, final String displayName ) {
super( owner, displayName );
}
public String getLaunchConfigurationName() {
return getDisplayName();
}
public String getImageId() {
return imageId;
}
public void setImageId( final String imageId ) {
this.imageId = imageId;
}
public String getKernelId() {
return kernelId;
}
public void setKernelId( final String kernelId ) {
this.kernelId = kernelId;
}
public String getRamdiskId() {
return ramdiskId;
}
public void setRamdiskId( final String ramdiskId ) {
this.ramdiskId = ramdiskId;
}
public String getKeyName() {
return keyName;
}
public void setKeyName( final String keyName ) {
this.keyName = keyName;
}
public List<String> getSecurityGroups() {
return securityGroups;
}
public void setSecurityGroups( final List<String> securityGroups ) {
this.securityGroups = securityGroups;
}
public String getUserData() {
return userData;
}
public void setUserData( final String userData ) {
this.userData = userData;
}
public String getInstanceType() {
return instanceType;
}
public void setInstanceType( final String instanceType ) {
this.instanceType = instanceType;
}
public List<BlockDeviceMapping> getBlockDeviceMappings() {
return blockDeviceMappings;
}
public void setBlockDeviceMappings( final List<BlockDeviceMapping> blockDeviceMappings ) {
this.blockDeviceMappings = blockDeviceMappings;
}
public Boolean getAssociatePublicIpAddress( ) {
return associatePublicIpAddress;
}
public void setAssociatePublicIpAddress( final Boolean associatePublicIpAddress ) {
this.associatePublicIpAddress = associatePublicIpAddress;
}
public Boolean getInstanceMonitoring() {
return instanceMonitoring;
}
public void setInstanceMonitoring( final Boolean instanceMonitoring ) {
this.instanceMonitoring = instanceMonitoring;
}
public String getIamInstanceProfile() {
return iamInstanceProfile;
}
public void setIamInstanceProfile( final String iamInstanceProfile ) {
this.iamInstanceProfile = iamInstanceProfile;
}
@Override
public String getArn() {
return String.format(
"arn:aws:autoscaling::%1s:launchConfiguration:%2s:launchConfigurationName/%3s",
getOwnerAccountNumber(),
getNaturalId(),
getDisplayName() );
}
/**
* Create an example LaunchConfiguration for the given owner.
*
* @param ownerFullName The owner
* @return The example
*/
public static LaunchConfiguration withOwner( final OwnerFullName ownerFullName ) {
return new LaunchConfiguration( ownerFullName );
}
/**
* Create an example LaunchConfiguration for the given owner and name.
*
* @param ownerFullName The owner
* @param name The name
* @return The example
*/
public static LaunchConfiguration named( final OwnerFullName ownerFullName,
final String name ) {
return new LaunchConfiguration( ownerFullName, name );
}
public static LaunchConfiguration withId( final String id ) {
final LaunchConfiguration example = new LaunchConfiguration();
example.setId( id );
return example;
}
public static LaunchConfiguration withUuid( final String uuid ) {
final LaunchConfiguration example = new LaunchConfiguration();
example.setNaturalId( uuid );
return example;
}
public static LaunchConfiguration create( final OwnerFullName ownerFullName,
final String name,
final String imageId,
final String instanceType ) {
final LaunchConfiguration launchConfiguration = new LaunchConfiguration( ownerFullName, name );
launchConfiguration.setImageId( imageId );
launchConfiguration.setInstanceType( instanceType );
return launchConfiguration;
}
protected static abstract class BaseBuilder<T extends BaseBuilder<T>> {
private OwnerFullName ownerFullName;
private String name;
private String instanceType;
private String imageId;
private String kernelId;
private String ramdiskId;
private String keyName;
private String userData;
private Boolean associatePublicIpAddress;
private Boolean instanceMonitoring;
private String iamInstanceProfile;
private Set<String> securityGroups = Sets.newLinkedHashSet();
private Set<BlockDeviceMapping> blockDeviceMappings = Sets.newLinkedHashSet();
BaseBuilder( final OwnerFullName ownerFullName,
final String name,
final String imageId,
final String instanceType ) {
this.ownerFullName = ownerFullName;
this.name = name;
this.imageId = imageId;
this.instanceType = instanceType;
}
protected abstract T builder();
public T withKernelId( final String kernelId ) {
this.kernelId = kernelId;
return builder();
}
public T withRamdiskId( final String ramdiskId ) {
this.ramdiskId = ramdiskId;
return builder();
}
public T withKeyName( final String keyName ) {
this.keyName = keyName;
return builder();
}
public T withUserData( final String userData ) {
this.userData = userData;
return builder();
}
public T withAssociatePublicIpAddress( final Boolean associatePublicIpAddress ) {
this.associatePublicIpAddress = associatePublicIpAddress;
return builder();
}
public T withInstanceMonitoring( final Boolean instanceMonitoring ) {
this.instanceMonitoring = instanceMonitoring;
return builder();
}
public T withInstanceProfile( final String iamInstanceProfile ) {
this.iamInstanceProfile = iamInstanceProfile;
return builder();
}
public T withSecurityGroups( final Collection<String> securityGroups ) {
if ( securityGroups != null ) {
this.securityGroups.addAll( securityGroups );
}
return builder();
}
public T withBlockDeviceMapping( final String deviceName,
final String virtualName,
final String snapshotId,
final Integer volumeSize ) {
this.blockDeviceMappings.add(
new BlockDeviceMapping( deviceName, virtualName, snapshotId, volumeSize ) );
return builder();
}
protected LaunchConfiguration build() {
final LaunchConfiguration configuration =
LaunchConfiguration.create( ownerFullName, name, imageId, instanceType );
configuration.setKernelId( kernelId );
configuration.setRamdiskId( ramdiskId );
configuration.setKeyName( keyName );
configuration.setUserData( userData );
configuration.setAssociatePublicIpAddress( associatePublicIpAddress );
configuration.setInstanceMonitoring( Objects.firstNonNull( instanceMonitoring, Boolean.TRUE ) );
configuration.setIamInstanceProfile( iamInstanceProfile );
configuration.setSecurityGroups( Lists.newArrayList( securityGroups ) );
configuration.setBlockDeviceMappings( Lists.newArrayList( blockDeviceMappings ) );
return configuration;
}
}
}