/************************************************************************* * Copyright 2009-2015 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.loadbalancing.activities; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; import javax.annotation.Nullable; import com.amazonaws.services.s3.model.Bucket; import com.eucalyptus.auth.tokens.SecurityTokenAWSCredentialsProvider; import com.eucalyptus.compute.common.*; import com.eucalyptus.objectstorage.client.EucaS3Client; import com.eucalyptus.objectstorage.client.EucaS3ClientFactory; import org.apache.log4j.Logger; import com.eucalyptus.auth.Accounts; import com.eucalyptus.auth.AuthException; import com.eucalyptus.auth.euare.AddRoleToInstanceProfileType; import com.eucalyptus.auth.euare.CreateInstanceProfileResponseType; import com.eucalyptus.auth.euare.CreateInstanceProfileType; import com.eucalyptus.auth.euare.CreateRoleResponseType; import com.eucalyptus.auth.euare.CreateRoleType; import com.eucalyptus.auth.euare.DeleteInstanceProfileType; import com.eucalyptus.auth.euare.DeleteRolePolicyType; import com.eucalyptus.auth.euare.DeleteRoleType; import com.eucalyptus.auth.euare.EuareMessage; import com.eucalyptus.auth.euare.GetRolePolicyResponseType; import com.eucalyptus.auth.euare.GetRolePolicyResult; import com.eucalyptus.auth.euare.GetRolePolicyType; import com.eucalyptus.auth.euare.GetServerCertificateResponseType; import com.eucalyptus.auth.euare.GetServerCertificateType; import com.eucalyptus.auth.euare.InstanceProfileType; import com.eucalyptus.auth.euare.ListInstanceProfilesResponseType; import com.eucalyptus.auth.euare.ListInstanceProfilesType; import com.eucalyptus.auth.euare.ListRolePoliciesResponseType; import com.eucalyptus.auth.euare.ListRolePoliciesType; import com.eucalyptus.auth.euare.ListRolesResponseType; import com.eucalyptus.auth.euare.ListRolesType; import com.eucalyptus.auth.euare.PutRolePolicyType; import com.eucalyptus.auth.euare.RemoveRoleFromInstanceProfileType; import com.eucalyptus.auth.euare.RoleType; import com.eucalyptus.auth.euare.ServerCertificateType; import com.eucalyptus.auth.principal.AccountFullName; import com.eucalyptus.auth.principal.AccountIdentifiers; import com.eucalyptus.autoscaling.common.AutoScaling; import com.eucalyptus.autoscaling.common.msgs.AutoScalingGroupNames; import com.eucalyptus.autoscaling.common.msgs.AutoScalingMessage; import com.eucalyptus.autoscaling.common.msgs.AvailabilityZones; import com.eucalyptus.autoscaling.common.msgs.CreateAutoScalingGroupType; import com.eucalyptus.autoscaling.common.msgs.CreateLaunchConfigurationType; import com.eucalyptus.autoscaling.common.msgs.CreateOrUpdateTagsType; import com.eucalyptus.autoscaling.common.msgs.DeleteAutoScalingGroupType; import com.eucalyptus.autoscaling.common.msgs.DeleteLaunchConfigurationType; import com.eucalyptus.autoscaling.common.msgs.DescribeAutoScalingGroupsResponseType; import com.eucalyptus.autoscaling.common.msgs.DescribeAutoScalingGroupsType; import com.eucalyptus.autoscaling.common.msgs.DescribeLaunchConfigurationsResponseType; import com.eucalyptus.autoscaling.common.msgs.DescribeLaunchConfigurationsType; import com.eucalyptus.autoscaling.common.msgs.LaunchConfigurationNames; import com.eucalyptus.autoscaling.common.msgs.LaunchConfigurationType; import com.eucalyptus.autoscaling.common.msgs.SecurityGroups; import com.eucalyptus.autoscaling.common.msgs.TagType; import com.eucalyptus.autoscaling.common.msgs.Tags; import com.eucalyptus.autoscaling.common.msgs.UpdateAutoScalingGroupType; import com.eucalyptus.cloudwatch.common.CloudWatch; import com.eucalyptus.cloudwatch.common.msgs.CloudWatchMessage; import com.eucalyptus.cloudwatch.common.msgs.MetricData; import com.eucalyptus.cloudwatch.common.msgs.PutMetricDataType; import com.eucalyptus.component.ComponentId; import com.eucalyptus.component.id.Euare; import com.eucalyptus.compute.common.ClusterInfoType; import com.eucalyptus.compute.common.Compute; import com.eucalyptus.compute.common.ComputeMessage; import com.eucalyptus.compute.common.DeleteResourceTag; import com.eucalyptus.compute.common.DescribeImagesResponseType; import com.eucalyptus.compute.common.DescribeImagesType; import com.eucalyptus.compute.common.DescribeInstanceTypesResponseType; import com.eucalyptus.compute.common.DescribeInstanceTypesType; import com.eucalyptus.compute.common.DescribeInstancesResponseType; import com.eucalyptus.compute.common.DescribeInstancesType; import com.eucalyptus.compute.common.DescribeInternetGatewaysResponseType; import com.eucalyptus.compute.common.DescribeInternetGatewaysType; import com.eucalyptus.compute.common.DescribeSecurityGroupsResponseType; import com.eucalyptus.compute.common.DescribeSecurityGroupsType; import com.eucalyptus.compute.common.DescribeSubnetsResponseType; import com.eucalyptus.compute.common.DescribeSubnetsType; import com.eucalyptus.compute.common.DescribeVpcsResponseType; import com.eucalyptus.compute.common.DescribeVpcsType; import com.eucalyptus.compute.common.Filter; import com.eucalyptus.compute.common.GroupIdSetType; import com.eucalyptus.compute.common.ImageDetails; import com.eucalyptus.compute.common.InternetGatewayIdSetItemType; import com.eucalyptus.compute.common.InternetGatewayIdSetType; import com.eucalyptus.compute.common.InternetGatewayType; import com.eucalyptus.compute.common.IpPermissionType; import com.eucalyptus.compute.common.ReservationInfoType; import com.eucalyptus.compute.common.ResourceTag; import com.eucalyptus.compute.common.RunningInstancesItemType; import com.eucalyptus.compute.common.SecurityGroupIdSetItemType; import com.eucalyptus.compute.common.SecurityGroupItemType; import com.eucalyptus.compute.common.SubnetIdSetItemType; import com.eucalyptus.compute.common.SubnetIdSetType; import com.eucalyptus.compute.common.SubnetType; import com.eucalyptus.compute.common.VmTypeDetails; import com.eucalyptus.compute.common.VpcType; import com.eucalyptus.compute.common.backend.AuthorizeSecurityGroupIngressType; import com.eucalyptus.compute.common.backend.CreateSecurityGroupResponseType; import com.eucalyptus.compute.common.backend.CreateSecurityGroupType; import com.eucalyptus.compute.common.backend.DeleteSecurityGroupType; import com.eucalyptus.compute.common.backend.DescribeAvailabilityZonesResponseType; import com.eucalyptus.compute.common.backend.DescribeAvailabilityZonesType; import com.eucalyptus.compute.common.backend.ModifyInstanceAttributeType; import com.eucalyptus.compute.common.backend.RevokeSecurityGroupIngressType; import com.eucalyptus.empyrean.DescribeServicesResponseType; import com.eucalyptus.empyrean.DescribeServicesType; import com.eucalyptus.empyrean.Empyrean; import com.eucalyptus.empyrean.EmpyreanMessage; import com.eucalyptus.empyrean.ServiceStatusType; import com.eucalyptus.util.Callback; import com.eucalyptus.util.DispatchingClient; import com.eucalyptus.util.Exceptions; import com.eucalyptus.util.async.AsyncExceptions; import com.eucalyptus.util.async.AsyncExceptions.AsyncWebServiceError; import com.eucalyptus.util.async.CheckedListenableFuture; import com.eucalyptus.util.async.Futures; import com.google.common.base.Optional; import com.google.common.base.Predicates; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import edu.ucsb.eucalyptus.msgs.BaseMessage; /** * @author Sang-Min Park (spark@eucalyptus.com) * */ public class EucalyptusActivityTasks { private static final Logger LOG = Logger.getLogger( EucalyptusActivityTask.class ); private EucalyptusActivityTasks() {} private static EucalyptusActivityTasks _instance = new EucalyptusActivityTasks(); public static EucalyptusActivityTasks getInstance(){ return _instance; } private interface ActivityContext<TM extends BaseMessage, TC extends ComponentId> { DispatchingClient<TM, TC> getClient(); } private abstract class ActivityContextSupport<TM extends BaseMessage, TC extends ComponentId> implements ActivityContext<TM, TC>{ private final Class<TC> componentIdClass; private ActivityContextSupport( final Class<TC> componentIdClass ) { this.componentIdClass = componentIdClass; } abstract String getUserId( ); /** * Account to use if user identifier not set, should not be called otherwise. */ abstract AccountFullName getAccount( ); @Override public DispatchingClient<TM, TC> getClient() { try{ final DispatchingClient<TM, TC> client = getUserId( ) != null ? new DispatchingClient<TM, TC>( this.getUserId( ), this.componentIdClass ) : new DispatchingClient<TM, TC>( this.getAccount(), this.componentIdClass ); client.init(); return client; }catch(Exception ex){ throw Exceptions.toUndeclared(ex); } } } private abstract class SystemActivityContextSupport<TM extends BaseMessage, TC extends ComponentId> extends ActivityContextSupport<TM, TC>{ boolean useELBSystemAccount = true; private SystemActivityContextSupport( final Class<TC> componentIdClass ) { super( componentIdClass ); } private SystemActivityContextSupport( final Class<TC> componentIdClass, final boolean useELBSystemAccount ) { super( componentIdClass ); this.useELBSystemAccount = useELBSystemAccount; } @Override final String getUserId() { return null; } @Override AccountFullName getAccount() { try{ return AccountFullName.getInstance( Accounts.lookupAccountIdByAlias( this.useELBSystemAccount ? AccountIdentifiers.ELB_SYSTEM_ACCOUNT : AccountIdentifiers.SYSTEM_ACCOUNT ) ); }catch(AuthException ex){ throw Exceptions.toUndeclared(ex); } } } private abstract class UserActivityContextSupport<TM extends BaseMessage, TC extends ComponentId> extends ActivityContextSupport<TM, TC>{ private final String userId; private final AccountFullName accountFullName; private UserActivityContextSupport( final Class<TC> componentIdClass, final String userId ) { super( componentIdClass ); this.userId = userId; this.accountFullName = null; } private UserActivityContextSupport( final Class<TC> componentIdClass, final AccountFullName accountFullName ) { super( componentIdClass ); this.userId = null; this.accountFullName = accountFullName; } public final String getUserId() { return userId; } public final AccountFullName getAccount() { return accountFullName; } } private class EuareSystemActivity extends SystemActivityContextSupport<EuareMessage, Euare>{ private EuareSystemActivity( ){ super( Euare.class ); } private EuareSystemActivity( final boolean useELBSystemAccount ){ super( Euare.class, useELBSystemAccount ); } } private class EuareUserActivity extends UserActivityContextSupport<EuareMessage, Euare> { private EuareUserActivity(final AccountFullName accountFullName){ super( Euare.class, accountFullName ); } } private class AutoScalingSystemActivity extends SystemActivityContextSupport<AutoScalingMessage, AutoScaling>{ private AutoScalingSystemActivity(final boolean useELBSystemAccount){ super( AutoScaling.class, useELBSystemAccount ); } } private class CloudWatchUserActivity extends UserActivityContextSupport<CloudWatchMessage, CloudWatch>{ private CloudWatchUserActivity(final String userId){ super( CloudWatch.class, userId ); } } private class EmpyreanSystemActivity extends SystemActivityContextSupport<EmpyreanMessage, Empyrean>{ private EmpyreanSystemActivity() { super( Empyrean.class, false ); } } private class ComputeSystemActivity extends SystemActivityContextSupport<ComputeMessage, Compute>{ private ComputeSystemActivity() { super( Compute.class ); } private ComputeSystemActivity(final boolean useELBSystemAccount) { super( Compute.class , useELBSystemAccount); } } private class ComputeUserActivity extends UserActivityContextSupport<ComputeMessage, Compute>{ private ComputeUserActivity(final AccountFullName accountFullName){ super( Compute.class, accountFullName ); } } public List<RunningInstancesItemType> describeSystemInstancesWithVerbose(final List<String> instances){ if(instances.size() <=0) return Lists.newArrayList(); final EucalyptusDescribeInstanceTask describeTask = new EucalyptusDescribeInstanceTask(instances, true); return resultOf( describeTask, new ComputeSystemActivity(false), "failed to describe the instances" ); } public List<RunningInstancesItemType> describeSystemInstances(final List<String> instances){ return describeSystemInstancesImpl(instances, true); } public List<RunningInstancesItemType> describeSystemInstances(final List<String> instances, final boolean useELBSystemAccount){ return describeSystemInstancesImpl(instances, useELBSystemAccount); } private List<RunningInstancesItemType> describeSystemInstancesImpl(final List<String> instances, final boolean useELBSystemAccount){ if(instances.size() <=0) return Lists.newArrayList(); final EucalyptusDescribeInstanceTask describeTask = new EucalyptusDescribeInstanceTask(instances); return resultOf( describeTask, new ComputeSystemActivity(useELBSystemAccount), "failed to describe the instances" ); } public List<RunningInstancesItemType> describeUserInstances(final String accountNumber, final List<String> instances){ if(instances.size() <=0) return Lists.newArrayList(); final EucalyptusDescribeInstanceTask describeTask = new EucalyptusDescribeInstanceTask(instances); return resultOf( describeTask, new ComputeUserActivity( AccountFullName.getInstance( accountNumber )), "failed to describe the instances" ); } public List<ServiceStatusType> describeServices(final String componentType){ //LOG.info("calling describe-services -T "+componentType); final EucalyptusDescribeServicesTask serviceTask = new EucalyptusDescribeServicesTask(componentType); return resultOf( serviceTask, new EmpyreanSystemActivity(), "failed to describe services" ); } public List<ClusterInfoType> describeAvailabilityZonesWithVerbose(){ return resultOf( new EucalyptusDescribeAvailabilityZonesTask(true), new ComputeSystemActivity(false), "failed to describe the availability zones" ); } public List<ClusterInfoType> describeAvailabilityZones() { return describeAvailabilityZonesImpl(true); } public List<ClusterInfoType> describeAvailabilityZones(final boolean useELBSystemAccount) { return describeAvailabilityZonesImpl(useELBSystemAccount); } private List<ClusterInfoType> describeAvailabilityZonesImpl(final boolean useELBSystemAccount){ return resultOf( new EucalyptusDescribeAvailabilityZonesTask(false), new ComputeSystemActivity(useELBSystemAccount), "failed to describe the availability zones" ); } public void createSystemSecurityGroup( String groupName, String groupDesc ){ final EucalyptusCreateGroupTask task = new EucalyptusCreateGroupTask(groupName, groupDesc); checkResult( task, new ComputeSystemActivity(), "failed to create the group "+groupName ); } public void deleteSystemSecurityGroup( String groupName ){ deleteSystemSecurityGroupImpl(groupName, true); } public void deleteSystemSecurityGroup( String groupName , boolean useELBSystemAccount){ deleteSystemSecurityGroupImpl(groupName, useELBSystemAccount); } private void deleteSystemSecurityGroupImpl( String groupName, boolean useELBSystemAccount ){ final EucalyptusDeleteGroupTask task = new EucalyptusDeleteGroupTask(groupName); checkResult( task, new ComputeSystemActivity(useELBSystemAccount), "failed to delete the group "+groupName ); } public List<SecurityGroupItemType> describeSystemSecurityGroups( List<String> groupNames, boolean useElbSystemAccount ){ return describeSystemSecurityGroupsImpl(groupNames, null, useElbSystemAccount); } public List<SecurityGroupItemType> describeSystemSecurityGroups( List<String> groupNames ){ return describeSystemSecurityGroupsImpl(groupNames, null, true); } public List<SecurityGroupItemType> describeSystemSecurityGroupsByVpc(final String vpcId) { return describeSystemSecurityGroupsImpl(null, vpcId, true); } private List<SecurityGroupItemType> describeSystemSecurityGroupsImpl( final List<String> groupNames, final String vpcId, boolean useELBSystemAccount ){ final EucalyptusDescribeSecurityGroupTask task = new EucalyptusDescribeSecurityGroupTask(null, groupNames, vpcId); return resultOf( task, new ComputeSystemActivity(useELBSystemAccount), "failed to describe security groups" ); } public void authorizeSystemSecurityGroup( String groupNameOrId, String protocol, int portNum ){ this.authorizeSystemSecurityGroupImpl( groupNameOrId, protocol, portNum, new ComputeSystemActivity()); } public void authorizeSystemSecurityGroup( String groupNameOrId, String protocol, int portNum, boolean useELBSystemAccount ){ this.authorizeSystemSecurityGroupImpl( groupNameOrId, protocol, portNum, new ComputeSystemActivity(useELBSystemAccount)); } private void authorizeSystemSecurityGroupImpl( String groupNameOrId, String protocol, int portNum, ComputeSystemActivity context){ final EucalyptusAuthorizeIngressRuleTask task = new EucalyptusAuthorizeIngressRuleTask(groupNameOrId, protocol, portNum); checkResult( task, context, String.format("failed to authorize:%s, %s, %d ", groupNameOrId, protocol, portNum) ); } public void revokeSystemSecurityGroup( String groupName, String protocol, int portNum) { revokeSystemSecurityGroupImpl(groupName, protocol, portNum, true); } public void revokeSystemSecurityGroup( String groupName, String protocol, int portNum, boolean useELBSystemAccount ){ revokeSystemSecurityGroupImpl(groupName, protocol, portNum, useELBSystemAccount); } private void revokeSystemSecurityGroupImpl( String groupName, String protocol, int portNum, boolean useELBSystemAccount ){ final EucalyptusRevokeIngressRuleTask task = new EucalyptusRevokeIngressRuleTask(groupName, protocol, portNum); checkResult( task, new ComputeSystemActivity(useELBSystemAccount), String.format("failed to revoke:%s, %s, %d ", groupName, protocol, portNum) ); } public List<SecurityGroupItemType> describeUserSecurityGroupsByName( AccountFullName accountFullName, String vpcId, String groupName ){ final EucalyptusDescribeSecurityGroupTask task = new EucalyptusDescribeSecurityGroupTask( null, Lists.newArrayList( groupName), vpcId ); return resultOf( task, new ComputeUserActivity( accountFullName ), "failed to describe security groups" ); } public void createUserSecurityGroup( AccountFullName accountFullName, String groupName, String groupDesc ){ final EucalyptusCreateGroupTask task = new EucalyptusCreateGroupTask( groupName, groupDesc ); checkResult( task, new ComputeUserActivity( accountFullName ), "failed to create the group "+groupName ); } public void putCloudWatchMetricData(final String userId, final String namespace, final MetricData data){ final CloudWatchPutMetricDataTask task = new CloudWatchPutMetricDataTask(namespace, data); checkResult( task, new CloudWatchUserActivity(userId), "failed to put metric data" ); } private final EucaS3Client getS3Client(final AccountFullName account) throws AuthException { return EucaS3ClientFactory.getEucaS3Client( new SecurityTokenAWSCredentialsProvider( account ) ) ; } public List<Bucket> listBuckets(final AccountFullName account) { try ( final EucaS3Client s3c = getS3Client(account) ) { return s3c.listBuckets(); } catch (final AuthException e) { LOG.error("Failed to create s3 client for listing buckets"); return Lists.newArrayList(); } } public boolean bucketExists(final AccountFullName account, final String bucketName) { try ( final EucaS3Client s3c = getS3Client(account) ) { s3c.getBucketAcl(bucketName); return true; } catch (final AuthException e) { LOG.error("Failed to create s3 client for testing bucket"); return false; } catch (final Exception e) { return false; } } public void createLaunchConfiguration( final String imageId, final String instanceType, final String instanceProfileName, final String launchConfigName, final Collection<String> securityGroupNamesOrIds, final String keyName, final String userData, final Boolean associatePublicIp){ createLaunchConfigurationImpl(imageId, instanceType, instanceProfileName, launchConfigName, securityGroupNamesOrIds, keyName, userData, associatePublicIp, true); } public void createLaunchConfiguration( final String imageId, final String instanceType, final String instanceProfileName, final String launchConfigName, final Collection<String> securityGroupNamesOrIds, final String keyName, final String userData, final Boolean associatePublicIp, final boolean useELBSystemAccount) { createLaunchConfigurationImpl(imageId, instanceType, instanceProfileName, launchConfigName, securityGroupNamesOrIds, keyName, userData, associatePublicIp, useELBSystemAccount); } private void createLaunchConfigurationImpl( final String imageId, final String instanceType, final String instanceProfileName, final String launchConfigName, final Collection<String> securityGroupNamesOrIds, final String keyName, final String userData, final Boolean associatePublicIp, final boolean useELBSystemAccount ){ final AutoScalingCreateLaunchConfigTask task = new AutoScalingCreateLaunchConfigTask(imageId, instanceType, instanceProfileName, launchConfigName, securityGroupNamesOrIds, keyName, userData, associatePublicIp); checkResult( task, new AutoScalingSystemActivity( useELBSystemAccount ), "failed to create launch configuration" ); } public void createAutoScalingGroup(final String groupName, final List<String> availabilityZones, final String vpcZoneIdentifier, final int capacity, final String launchConfigName, final String tagKey, final String tagValue){ createAutoScalingGroupImpl(groupName, availabilityZones, vpcZoneIdentifier, capacity, launchConfigName, tagKey, tagValue, true); } public void createAutoScalingGroup(final String groupName, final List<String> availabilityZones, final String vpcZoneIdentifier, final int capacity, final String launchConfigName, final String tagKey, final String tagValue, final boolean useELBSystemAccount){ createAutoScalingGroupImpl(groupName, availabilityZones, vpcZoneIdentifier, capacity, launchConfigName, tagKey, tagValue, useELBSystemAccount); } private void createAutoScalingGroupImpl(final String groupName, final List<String> availabilityZones, final String vpcZoneIdentifier, final int capacity, final String launchConfigName, final String tagKey, final String tagValue, final boolean useELBSystemAccount){ final AutoScalingCreateGroupTask task = new AutoScalingCreateGroupTask(groupName, availabilityZones, vpcZoneIdentifier, capacity, launchConfigName, tagKey, tagValue); checkResult( task, new AutoScalingSystemActivity( useELBSystemAccount ), "failed to create autoscaling group" ); } public void createOrUpdateAutoscalingTags(final String tagKey, final String tagValue, final String asgName){ createOrUpdateAutoscalingTagsImpl(tagKey, tagValue, asgName, true); } public void createOrUpdateAutoscalingTags(final String tagKey, final String tagValue, final String asgName, final boolean useELBSystemAccount){ createOrUpdateAutoscalingTagsImpl(tagKey, tagValue, asgName, useELBSystemAccount); } public void createOrUpdateAutoscalingTagsImpl(final String tagKey, final String tagValue, final String asgName, final boolean useELBSystemAccount) { final AutoscalingCreateOrUpdateTagsTask task = new AutoscalingCreateOrUpdateTagsTask( tagKey, tagValue, asgName); checkResult( task, new AutoScalingSystemActivity(useELBSystemAccount), "failed to create/update autoscaling tags" ); } public LaunchConfigurationType describeLaunchConfiguration(final String launchConfigName){ return describeLaunchConfigurationImpl(launchConfigName, true); } public LaunchConfigurationType describeLaunchConfiguration(final String launchConfigName, boolean useELBSystemAccount){ return describeLaunchConfigurationImpl(launchConfigName, useELBSystemAccount); } private LaunchConfigurationType describeLaunchConfigurationImpl(final String launchConfigName, final boolean useELBSystemAccount){ return resultOf( new AutoScalingDescribeLaunchConfigsTask(launchConfigName), new AutoScalingSystemActivity(useELBSystemAccount), "failed to describe launch configuration" ); } public void deleteLaunchConfiguration(final String launchConfigName){ deleteLaunchConfigurationImpl(launchConfigName, true); } public void deleteLaunchConfiguration(final String launchConfigName, final boolean useELBSystemAccount){ deleteLaunchConfigurationImpl(launchConfigName, useELBSystemAccount); } private void deleteLaunchConfigurationImpl(final String launchConfigName, final boolean useELBSystemAccount){ checkResult( new AutoScalingDeleteLaunchConfigTask(launchConfigName), new AutoScalingSystemActivity( useELBSystemAccount ), "failed to delete launch configuration" ); } public void deleteAutoScalingGroup(final String groupName, final boolean terminateInstances){ deleteAutoScalingGroupImpl(groupName, terminateInstances, true); } public void deleteAutoScalingGroup(final String groupName, final boolean terminateInstances, final boolean useELBSystemAccount){ deleteAutoScalingGroupImpl(groupName, terminateInstances, useELBSystemAccount); } private void deleteAutoScalingGroupImpl(final String groupName, final boolean terminateInstances, final boolean useELBSystemAccount){ checkResult( new AutoScalingDeleteGroupTask(groupName, terminateInstances), new AutoScalingSystemActivity( useELBSystemAccount ), "failed to delete autoscaling group" ); } public DescribeAutoScalingGroupsResponseType describeAutoScalingGroupsWithVerbose(final List<String> groupNames){ final List<String> namesWithVerbose = Lists.newArrayList(); namesWithVerbose.addAll(groupNames); namesWithVerbose.add("verbose"); return describeAutoScalingGroupsImpl(namesWithVerbose, false); } public DescribeAutoScalingGroupsResponseType describeAutoScalingGroups(final List<String> groupNames){ return describeAutoScalingGroupsImpl(groupNames, true); } public DescribeAutoScalingGroupsResponseType describeAutoScalingGroups(final List<String> groupNames, final boolean useELBSystemAccount){ return describeAutoScalingGroupsImpl(groupNames, useELBSystemAccount); } private DescribeAutoScalingGroupsResponseType describeAutoScalingGroupsImpl(final List<String> groupNames, final boolean useELBSystemAccount){ return resultOf( new AutoScalingDescribeGroupsTask(groupNames), new AutoScalingSystemActivity(useELBSystemAccount), "failed to describe autoscaling groups" ); } public void updateAutoScalingGroup(final String groupName, final List<String> zones, final int capacity){ updateAutoScalingGroup(groupName, zones, capacity, null, true); } public void updateAutoScalingGroup(final String groupName, final List<String> zones, final int capacity, final boolean useELBSystemAccount){ updateAutoScalingGroup(groupName, zones, capacity, null, useELBSystemAccount); } public void updateAutoScalingGroup(final String groupName, final List<String> zones, final Integer capacity, final String launchConfigName){ updateAutoScalingGroupImpl(groupName, zones, capacity, launchConfigName, true); } public void updateAutoScalingGroup(final String groupName, final List<String> zones, final Integer capacity, final String launchConfigName, final boolean useELBSystemAccount){ updateAutoScalingGroupImpl(groupName, zones, capacity, launchConfigName, useELBSystemAccount); } private void updateAutoScalingGroupImpl(final String groupName, final List<String> zones, final Integer capacity, final String launchConfigName, final boolean useELBSystemAccount){ checkResult( new AutoScalingUpdateGroupTask(groupName, zones, capacity, launchConfigName), new AutoScalingSystemActivity( useELBSystemAccount ), "failed to update autoscaling group" ); } public List<RoleType> listRoles(final String pathPrefix){ return resultOf( new EuareListRolesTask(pathPrefix), new EuareSystemActivity(), "failed to list IAM roles" ); } public RoleType createRole(final String roleName, final String path, final String assumeRolePolicy){ return resultOf( new EuareCreateRoleTask(roleName, path, assumeRolePolicy), new EuareSystemActivity(), "failed to create IAM role" ); } public List<SecurityGroupItemType> describeUserSecurityGroupsById( final AccountFullName accountFullName, final String vpcId, final Collection<String> securityGroupIds ){ return resultOf( new EucaDescribeSecurityGroupsTask( vpcId, securityGroupIds ), new ComputeUserActivity( accountFullName ), "failed to describe security groups" ); } public void modifySecurityGroups( final String instanceId, final Collection<String> securityGroupIds ) { modifySecurityGroupsImpl(instanceId, securityGroupIds, true); } public void modifySecurityGroups( final String instanceId, final Collection<String> securityGroupIds, final boolean useELBSystemAccount ){ modifySecurityGroupsImpl(instanceId, securityGroupIds, useELBSystemAccount); } private void modifySecurityGroupsImpl( final String instanceId, final Collection<String> securityGroupIds, final boolean useELBSystemAccount ) { checkResult( new EucalyptusModifySecurityGroupsTask( instanceId, securityGroupIds ), new ComputeSystemActivity( useELBSystemAccount ), "failed to modify security groups" ); } public Optional<VpcType> defaultVpc( final AccountFullName accountFullName ) { return Iterables.tryFind( resultOf( new EucaDescribeVpcsTask( true ), new ComputeUserActivity( accountFullName ), "failed to describe default vpc" ), Predicates.alwaysTrue() ); } public List<VpcType> describeSystemVpcs(final List<String> vpcIds) { return resultOf( new EucaDescribeVpcsTask( null, vpcIds ), new ComputeSystemActivity(), "failed to describe system vpc" ); } //// FIXME: The usage from LoadBalancingBackendService is probably wrong. public List<SubnetType> describeSubnets(final Collection<String> subnetIds ){ return resultOf( new EucaDescribeSubnetsTask( subnetIds ), new ComputeSystemActivity(), "failed to describe subnets" ); } public List<SubnetType> describeSubnetsByZone( final String vpcId, final Boolean defaultSubnet, final Collection<String> zones ){ return resultOf( new EucaDescribeSubnetsTask( vpcId, defaultSubnet, zones ), new ComputeSystemActivity(), "failed to describe subnets" ); } public List<AddressInfoType> describeSystemAddresses(final boolean vpc) { return resultOf( new EucaDescribeAddressesTask( vpc? "vpc" : "standard"), new ComputeSystemActivity(), "failed to describe addresses" ); } public List<AddressInfoType> describeSystemAddresses(final boolean vpc, final String publicIp) { return resultOf( new EucaDescribeAddressesTask( vpc? "vpc" : "standard", publicIp), new ComputeSystemActivity(), "failed to describe addresses" ); } public List<InternetGatewayType> describeInternetGateways(final Collection<String> vpcIds ){ return resultOf( new EucaDescribeInternetGatewaysTask(vpcIds), new ComputeSystemActivity(), "failed to describe internet gateways" ); } public ServerCertificateType getServerCertificate(final String accountNumber, final String certName){ return resultOf( new EuareGetServerCertificateTask(certName), new EuareUserActivity( AccountFullName.getInstance( accountNumber ) ), "failed to get server certificate" ); } public void deleteRole(final String roleName){ deleteRoleImpl(roleName, true); } public void deleteRole(final String roleName, boolean useELBSystemAccount){ deleteRoleImpl(roleName, useELBSystemAccount); } private void deleteRoleImpl(final String roleName, boolean useELBSystemAccount){ checkResult( new EuareDeleteRoleTask(roleName), new EuareSystemActivity(useELBSystemAccount), "failed to delete IAM role" ); } public List<InstanceProfileType> listInstanceProfiles(String pathPrefix){ return resultOf( new EuareListInstanceProfilesTask(pathPrefix), new EuareSystemActivity(), "failed to list IAM instance profile" ); } public InstanceProfileType createInstanceProfile(String profileName, String path){ return resultOf( new EuareCreateInstanceProfileTask(profileName, path), new EuareSystemActivity(), "failed to create IAM instance profile" ); } public void deleteInstanceProfile(String profileName){ deleteInstanceProfileImpl(profileName, true); } public void deleteInstanceProfile(String profileName, boolean useELBSystemAccount){ deleteInstanceProfileImpl(profileName, useELBSystemAccount); } private void deleteInstanceProfileImpl(String profileName, boolean useELBSystemAccount){ checkResult( new EuareDeleteInstanceProfileTask(profileName), new EuareSystemActivity( useELBSystemAccount ), "failed to delete IAM instance profile" ); } public void addRoleToInstanceProfile(String instanceProfileName, String roleName){ checkResult( new EuareAddRoleToInstanceProfileTask(instanceProfileName, roleName), new EuareSystemActivity( ), "failed to add role to the instance profile" ); } public void removeRoleFromInstanceProfile(String instanceProfileName, String roleName){ removeRoleFromInstanceProfileImpl(instanceProfileName, roleName, true); } public void removeRoleFromInstanceProfile(String instanceProfileName, String roleName, boolean useELBSystemAccount){ removeRoleFromInstanceProfileImpl(instanceProfileName, roleName, useELBSystemAccount); } private void removeRoleFromInstanceProfileImpl(String instanceProfileName, String roleName, boolean useELBSystemAccount){ checkResult( new EuareRemoveRoleFromInstanceProfileTask(instanceProfileName, roleName), new EuareSystemActivity( useELBSystemAccount ), "failed to remove role from the instance profile" ); } public List<String> listRolePolicies(final String roleName){ return resultOf( new EuareListRolePoliciesTask(roleName), new EuareSystemActivity(), "failed to list role's policies" ); } public GetRolePolicyResult getRolePolicy(String roleName, String policyName){ return resultOf( new EuareGetRolePolicyTask(roleName, policyName), new EuareSystemActivity(), "failed to get role's policy" ); } public void putRolePolicy(String roleName, String policyName, String policyDocument){ putRolePolicyImpl(roleName, policyName, policyDocument, true); } public void putRolePolicy(String roleName, String policyName, String policyDocument, boolean useELBSystemAccount){ putRolePolicyImpl(roleName, policyName, policyDocument, useELBSystemAccount); } private void putRolePolicyImpl(String roleName, String policyName, String policyDocument, boolean useELBSystemAccount){ checkResult( new EuarePutRolePolicyTask(roleName, policyName, policyDocument), new EuareSystemActivity( useELBSystemAccount ), "failed to put role's policy" ); } public void deleteRolePolicy(String roleName, String policyName){ deleteRolePolicyImpl(roleName, policyName, true); } public void deleteRolePolicy(String roleName, String policyName, boolean useELBSystemAccount){ deleteRolePolicyImpl(roleName, policyName, useELBSystemAccount); } private void deleteRolePolicyImpl(String roleName, String policyName, boolean useELBSystemAccount){ checkResult( new EuareDeleteRolePolicyTask(roleName, policyName), new EuareSystemActivity( useELBSystemAccount ), "failed to delete role's policy" ); } public List<ImageDetails> describeImages(final List<String> imageIds){ return resultOf( new EucaDescribeImagesTask(imageIds), new ComputeSystemActivity(), "failed to describe images" ); } public List<VmTypeDetails> describeInstanceTypes(final List<String> instanceTypes) { return resultOf( new EucaDescribeInstanceTypesTask(instanceTypes), new ComputeSystemActivity(), "failed to describe instance types" ); } public List<ImageDetails> describeImagesWithVerbose(final List<String> imageIds){ final List<String> idsWithVerbose = Lists.newArrayList(imageIds); idsWithVerbose.add("verbose"); return resultOf( new EucaDescribeImagesTask(idsWithVerbose), new ComputeSystemActivity(false), "failed to describe images" ); } public void createTags(final String tagKey, final String tagValue, final List<String> resources){ checkResult( new EucaCreateTagsTask(tagKey, tagValue, resources), new ComputeSystemActivity( ), "failed to create tags" ); } public void deleteTags(final String tagKey, final String tagValue, final List<String> resources){ checkResult( new EucaDeleteTagsTask(tagKey, tagValue, resources), new ComputeSystemActivity( ), "failed to delete tags" ); } public String createSystemVpc(final String cidrBlock) { return resultOf( new EucaCreateVpcTask(cidrBlock), new ComputeSystemActivity( ), "failed to create system VPC" ); } public String createSystemInternetGateway() { return resultOf( new EucaCreateInternetGatewayTask(), new ComputeSystemActivity(), "failed to create Internet gateway" ); } public void attachSystemInternetGateway(final String vpcId, final String gatewayId) { checkResult( new EucaAttachInternetGatewayTask(vpcId, gatewayId), new ComputeSystemActivity(), "failed to attach Internet gateway" ); } public String createSystemSubnet(final String vpcId, final String availabilityZone, final String cidrBlock) { return resultOf( new EucaCreateSubnetTask(vpcId, availabilityZone, cidrBlock), new ComputeSystemActivity(), "failed to create subnet" ); } public List<RouteTableType> describeSystemRouteTables() { return describeSystemRouteTables(null, null); } public List<RouteTableType> describeSystemRouteTables(final String routeTableId, final String vpcId) { final List<RouteTableType> tables = resultOf( new EucaDescribeRouteTableTask(routeTableId, vpcId), new ComputeSystemActivity(), "failed to describe route table" ); return tables; } public String createSystemRouteTable(final String vpcId) { return resultOf( new EucaCreateRouteTableTask(vpcId), new ComputeSystemActivity(), "failed to create custom route table" ); } public void deleteSystemRoute(final String routeTableId, final String destCidr) { checkResult( new EucaDeleteRouteTask(routeTableId, destCidr), new ComputeSystemActivity(), "failed to delete route" ); } public void createSystemRouteToInternetGateway(final String routeTableId, final String destCidr, final String gatewayId ) { checkResult( new EucaCreateRouteTask(routeTableId, destCidr, gatewayId, null), new ComputeSystemActivity(), "failed to create a route" ); } public void createSystemRouteToNatGateway(final String routeTableId, final String destCidr, final String gatewayId) { checkResult( new EucaCreateRouteTask(routeTableId, destCidr, null, gatewayId), new ComputeSystemActivity(), "failed to create a route" ); } public void associateSystemRouteTable(final String subnetId, final String routeTableId) { checkResult( new EucaAssociateRouteTableTask(subnetId, routeTableId), new ComputeSystemActivity(), "failed to associate a route table with subnet" ); } public AllocateAddressResponseType allocateSystemVpcAddress() { return resultOf( new EucaAllocateAddressTask(true), new ComputeSystemActivity(), "failed to allocate address" ); } public void associateSystemVpcAddress(final String allocationId, final String networkInterfaceId) { checkResult( new EucaAssociateAddressTask(allocationId, networkInterfaceId), new ComputeSystemActivity(), "failed to associate EIP address with network interface" ); } public void disassociateSystemVpcAddress(final String publicIp) { checkResult( new EucaDisassociateAddressTask(publicIp), new ComputeSystemActivity(), "failed to disassociate EIP address" ); } public List<NatGatewayType> describeSystemNatGateway(final String subnetId) { return resultOf( new EucaDescribeNatGatewayTask(subnetId), new ComputeSystemActivity(), "failed to describe nat gateway" ); } public String createSystemNatGateway(final String subnetId, final String elasticIpAllocationId) { return resultOf( new EucaCreateNatGatewayTask(subnetId, elasticIpAllocationId), new ComputeSystemActivity(), "failed to create nat gateway" ); } public List<NetworkInterfaceType> describeSystemNetworkInterfaces(final String subnetId) { return resultOf( new EucaDescribeNetworkInterfacesTask(null, subnetId), new ComputeSystemActivity(), "failed to describe network interfaces" ); } public List<NetworkInterfaceType> describeSystemNetworkInterfaces(final List<String> networkInterfaceIds) { return resultOf( new EucaDescribeNetworkInterfacesTask(networkInterfaceIds, null), new ComputeSystemActivity(), "failed to describe network interfaces" ); } public NetworkInterfaceType createNetworkInterface(final String subnetId, final List<String> securityGroupIds) { return resultOf( new EucaCreateNetworkInterfaceTask(subnetId, securityGroupIds), new ComputeSystemActivity(), "failed to create network interface" ); } public void attachNetworkInterface(final String instanceId, final String networkInterfaceId, final int deviceIndex) { checkResult(new EucaAttachNetworkInterfaceTask(instanceId, networkInterfaceId, deviceIndex), new ComputeSystemActivity(), String.format("failed to attach network interface %s to %s at index %d", networkInterfaceId, instanceId, deviceIndex)); } public void modifyNetworkInterfaceSecurityGroups(final String networkInterfaceId, final List<String> securityGroupIds) { checkResult( new EucaModifyNetworkInterfaceAttribute(networkInterfaceId, securityGroupIds), new ComputeSystemActivity(), String.format("failed to modify network interface %s", networkInterfaceId) ); } public void modifyNetworkInterfaceDeleteOnTerminate(final String networkInterfaceId, final String attachmentId, final boolean deleteOnTerminate) { checkResult( new EucaModifyNetworkInterfaceAttribute(networkInterfaceId, attachmentId, deleteOnTerminate), new ComputeSystemActivity(), String.format("failed to modify network interface %s", networkInterfaceId) ); } public void revokePermissionFromOtherGroup(final String groupId, final String sourceAccountId, final String sourceGroupId, final String protocol) { checkResult( new EucalyptusRevokeIngressRuleFromOtherGroupTask(groupId, protocol, null, null, sourceAccountId, sourceGroupId), new ComputeSystemActivity(), "Failed to revoke security group permission" ); } public void revokeSystemSecurityGroupEgressRules(final String groupId) { checkResult( new EucalyptusRevokeEgressRuleTask(groupId, "-1", -1, -1, "0.0.0.0/0"), new ComputeSystemActivity(), "Failed to revoke egress rule" ); } public void authorizeSystemSecurityGroupEgressRule(final String groupId, final String protocol, int fromPort, int toPort, final String sourceCidrRange) { checkResult( new EucalyptusAuthorizeEgressRuleTask(groupId, protocol, fromPort, toPort, sourceCidrRange), new ComputeSystemActivity(), "Failed to authorize egress rule" ); } public void terminateInstances(final List<String> instanceIds) { checkResult( new EucaTerminateInstancesTask(instanceIds), new ComputeSystemActivity(), "Failed to terminate VMs" ); } private class EucaDescribeImagesTask extends EucalyptusActivityTaskWithResult<ComputeMessage, Compute, List<ImageDetails>> { private List<String> imageIds = null; private EucaDescribeImagesTask(final List<String> imageIds){ this.imageIds = imageIds; } DescribeImagesType getRequest(){ final DescribeImagesType req = new DescribeImagesType(); if(this.imageIds!=null && this.imageIds.size()>0){ req.setFilterSet( Lists.newArrayList( Filter.filter( "image-id", this.imageIds ) ) ); } return req; } @Override List<ImageDetails> extractResult(ComputeMessage response) { final DescribeImagesResponseType resp = (DescribeImagesResponseType) response; return resp.getImagesSet(); } } private class EucaDescribeInstanceTypesTask extends EucalyptusActivityTaskWithResult<ComputeMessage, Compute, List<VmTypeDetails>> { private List<String> instanceTypes = Lists.newArrayList(); private EucaDescribeInstanceTypesTask() { } private EucaDescribeInstanceTypesTask(final List<String> instanceTypes) { this.instanceTypes.addAll(instanceTypes); } @Override List<VmTypeDetails> extractResult(ComputeMessage response) { final DescribeInstanceTypesResponseType resp = (DescribeInstanceTypesResponseType) response; return resp.getInstanceTypeDetails(); } @Override DescribeInstanceTypesType getRequest() { final DescribeInstanceTypesType req = new DescribeInstanceTypesType(); req.setInstanceTypes((ArrayList<String>) instanceTypes); return req; } } private class EucaTerminateInstancesTask extends EucalyptusActivityTask<ComputeMessage, Compute> { private List<String> instanceIds = Lists.newArrayList(); private EucaTerminateInstancesTask(final List<String> instanceIds) { this.instanceIds.addAll(instanceIds); } ComputeMessage getRequest() { final TerminateInstancesType req = new TerminateInstancesType(); req.setInstancesSet((ArrayList<String>) this.instanceIds); return req; } } private class EucaDeleteTagsTask extends EucalyptusActivityTask<ComputeMessage, Compute>{ private String tagKey = null; private String tagValue = null; private List<String> resources = null; private EucaDeleteTagsTask(final String tagKey, final String tagValue, final List<String> resources){ this.tagKey = tagKey; this.tagValue = tagValue; this.resources = resources; } DeleteTagsType getRequest(){ final DeleteTagsType req = new DeleteTagsType(); req.setResourcesSet(Lists.newArrayList(this.resources)); final DeleteResourceTag tag = new DeleteResourceTag(); tag.setKey(this.tagKey); tag.setValue(this.tagValue); req.setTagSet(Lists.newArrayList(tag)); return req; } } private class EucaCreateTagsTask extends EucalyptusActivityTask<ComputeMessage, Compute>{ private String tagKey = null; private String tagValue = null; private List<String> resources = null; private EucaCreateTagsTask(final String tagKey, final String tagValue, final List<String> resources){ this.tagKey = tagKey; this.tagValue = tagValue; this.resources = resources; } CreateTagsType getRequest(){ final CreateTagsType req = new CreateTagsType(); req.setResourcesSet(Lists.newArrayList(this.resources)); final ResourceTag tag = new ResourceTag(); tag.setKey(this.tagKey); tag.setValue(this.tagValue); req.setTagSet(Lists.newArrayList(tag)); return req; } } private class EucaDescribeSecurityGroupsTask extends EucalyptusActivityTaskWithResult<ComputeMessage, Compute, List<SecurityGroupItemType>> { private String vpcId = null; private Collection<String> securityGroupIds = null; private EucaDescribeSecurityGroupsTask( final String vpcId, final Collection<String> securityGroupIds){ this.vpcId = vpcId; this.securityGroupIds = securityGroupIds; } DescribeSecurityGroupsType getRequest( ){ final DescribeSecurityGroupsType req = new DescribeSecurityGroupsType( ); if ( vpcId != null ) { req.getFilterSet( ).add( filter( "vpc-id", vpcId ) ); } req.getFilterSet( ).add( filter( "group-id", securityGroupIds ) ); return req; } @Override List<SecurityGroupItemType> extractResult( ComputeMessage response ) { final DescribeSecurityGroupsResponseType resp = (DescribeSecurityGroupsResponseType) response; return resp.getSecurityGroupInfo( ); } } private class EucaCreateVpcTask extends EucalyptusActivityTaskWithResult<ComputeMessage, Compute, String> { private String cidr = null; private EucaCreateVpcTask( final String cidr) { this.cidr = cidr; } ComputeMessage getRequest( ) { final CreateVpcType req = new CreateVpcType(); req.setCidrBlock(this.cidr); return req; } @Override String extractResult( ComputeMessage resp ) { final CreateVpcResponseType response = (CreateVpcResponseType) resp; return response.getVpc().getVpcId(); } } private class EucaCreateInternetGatewayTask extends EucalyptusActivityTaskWithResult<ComputeMessage, Compute, String> { private EucaCreateInternetGatewayTask() { } ComputeMessage getRequest( ) { final CreateInternetGatewayType req = new CreateInternetGatewayType(); return req; } @Override String extractResult( ComputeMessage resp ) { final CreateInternetGatewayResponseType response = (CreateInternetGatewayResponseType) resp; return response.getInternetGateway().getInternetGatewayId(); } } private class EucaAttachInternetGatewayTask extends EucalyptusActivityTask<ComputeMessage, Compute> { private String vpcId = null; private String gatewayId = null; private EucaAttachInternetGatewayTask(final String vpcId, final String gatewayId) { this.vpcId = vpcId; this.gatewayId = gatewayId; } ComputeMessage getRequest( ) { final AttachInternetGatewayType req = new AttachInternetGatewayType(); req.setVpcId(this.vpcId); req.setInternetGatewayId(this.gatewayId); return req; } } private class EucaCreateSubnetTask extends EucalyptusActivityTaskWithResult<ComputeMessage, Compute, String> { private String vpcId = null; private String availabilityZone = null; private String cidr = null; private EucaCreateSubnetTask(final String vpcId, final String availabilityZone, final String cidr) { this.vpcId = vpcId; this.availabilityZone = availabilityZone; this.cidr = cidr; } ComputeMessage getRequest( ) { final CreateSubnetType req = new CreateSubnetType(); req.setVpcId( this.vpcId ); req.setAvailabilityZone( this.availabilityZone ); req.setCidrBlock( this.cidr ); return req; } String extractResult( ComputeMessage resp ) { final CreateSubnetResponseType response = (CreateSubnetResponseType) resp; return response.getSubnet().getSubnetId(); } } private class EucaCreateRouteTableTask extends EucalyptusActivityTaskWithResult<ComputeMessage, Compute, String> { private String vpcId = null; private EucaCreateRouteTableTask(final String vpcId) { this.vpcId = vpcId; } ComputeMessage getRequest( ) { final CreateRouteTableType req = new CreateRouteTableType(); req.setVpcId( this.vpcId ); return req; } String extractResult( ComputeMessage resp) { final CreateRouteTableResponseType response = (CreateRouteTableResponseType) resp; return response.getRouteTable().getRouteTableId(); } } private class EucaDescribeRouteTableTask extends EucalyptusActivityTaskWithResult<ComputeMessage, Compute, List<RouteTableType>> { private String vpcId = null; private String routeTableId = null; private EucaDescribeRouteTableTask(final String routeTableId, final String vpcId) { this.routeTableId = routeTableId; this.vpcId = vpcId; } private EucaDescribeRouteTableTask(final String routeTableId) { this.routeTableId = routeTableId; } ComputeMessage getRequest( ) { final DescribeRouteTablesType req = new DescribeRouteTablesType(); if(this.routeTableId!=null) { req.getFilterSet().add( filter( "route-table-id", this.routeTableId) ); } if(this.vpcId != null) { req.getFilterSet().add( filter( "vpc-id", this.vpcId) ); } return req; } List<RouteTableType> extractResult(ComputeMessage resp) { final DescribeRouteTablesResponseType response = (DescribeRouteTablesResponseType) resp; return response.getRouteTableSet().getItem(); } } private class EucaAssociateRouteTableTask extends EucalyptusActivityTask<ComputeMessage, Compute> { private String subnetId = null; private String routeTableId = null; private EucaAssociateRouteTableTask(final String subnetId, final String routeTableId) { this.subnetId = subnetId; this.routeTableId = routeTableId; } ComputeMessage getRequest( ) { final AssociateRouteTableType req = new AssociateRouteTableType(); req.setSubnetId(this.subnetId); req.setRouteTableId(this.routeTableId); return req; } } private class EucaAssociateAddressTask extends EucalyptusActivityTask<ComputeMessage, Compute> { private String allocationId = null; private String networkInterfaceId = null; private EucaAssociateAddressTask(final String allocationId, final String networkInterfaceId) { this.allocationId = allocationId; this.networkInterfaceId = networkInterfaceId; } ComputeMessage getRequest() { final AssociateAddressType req = new AssociateAddressType(); req.setAllocationId( this.allocationId ); req.setNetworkInterfaceId( this.networkInterfaceId ); return req; } } private class EucaDisassociateAddressTask extends EucalyptusActivityTask<ComputeMessage, Compute> { private String publicIp = null; private EucaDisassociateAddressTask(final String publicIp) { this.publicIp = publicIp; } ComputeMessage getRequest() { final DisassociateAddressType req = new DisassociateAddressType(); req.setPublicIp(this.publicIp); return req; } } private class EucaDescribeAddressesTask extends EucalyptusActivityTaskWithResult<ComputeMessage, Compute, List<AddressInfoType>> { private String domain = null; private String publicIp = null; private EucaDescribeAddressesTask() {} private EucaDescribeAddressesTask(final String domain) { this.domain = domain; } private EucaDescribeAddressesTask(final String domain, final String publicIp) { this.domain = domain; this.publicIp = publicIp; } ComputeMessage getRequest( ) { final DescribeAddressesType req = new DescribeAddressesType(); if(this.domain!=null) { req.getFilterSet().add( filter("domain", domain)); } if(this.publicIp!=null) { req.getFilterSet().add( filter("public-ip", this.publicIp)); } return req; } List<AddressInfoType> extractResult(final ComputeMessage resp) { final DescribeAddressesResponseType response = (DescribeAddressesResponseType) resp; return response.getAddressesSet(); } } private class EucaAllocateAddressTask extends EucalyptusActivityTaskWithResult<ComputeMessage, Compute, AllocateAddressResponseType> { private boolean isVpc = false; private EucaAllocateAddressTask(final boolean isVpc) { this.isVpc = isVpc; } ComputeMessage getRequest() { final AllocateAddressType req = new AllocateAddressType(); if (this.isVpc) req.setDomain("vpc"); return req; } @Override AllocateAddressResponseType extractResult(final ComputeMessage resp) { final AllocateAddressResponseType response = (AllocateAddressResponseType) resp; return response; } } private class EucaAttachNetworkInterfaceTask extends EucalyptusActivityTask<ComputeMessage, Compute> { private String instanceId = null; private String interfaceId = null; private int deviceIdx = 1; private EucaAttachNetworkInterfaceTask(final String instanceId, final String interfaceId, final int deviceIndex) { this.instanceId = instanceId; this.interfaceId = interfaceId; this.deviceIdx = deviceIndex; } @Override ComputeMessage getRequest() { final AttachNetworkInterfaceType req = new AttachNetworkInterfaceType(); req.setInstanceId(this.instanceId); req.setNetworkInterfaceId(this.interfaceId); req.setDeviceIndex(this.deviceIdx); return req; } } private class EucaCreateNetworkInterfaceTask extends EucalyptusActivityTaskWithResult<ComputeMessage, Compute, NetworkInterfaceType> { private String subnetId = null; private List<String> securityGroupIds = null; private EucaCreateNetworkInterfaceTask(final String subnetId) { this.subnetId = subnetId; } private EucaCreateNetworkInterfaceTask(final String subnetId, final List<String> securityGrupIds) { this.subnetId = subnetId; this.securityGroupIds = securityGrupIds; } @Override ComputeMessage getRequest() { final CreateNetworkInterfaceType req = new CreateNetworkInterfaceType(); req.setSubnetId(this.subnetId); if(this.securityGroupIds!=null && ! this.securityGroupIds.isEmpty()) { final SecurityGroupIdSetType groupIds = new SecurityGroupIdSetType(); groupIds.setItem(new ArrayList( this.securityGroupIds.stream() .map(id -> { final SecurityGroupIdSetItemType item = new SecurityGroupIdSetItemType(); item.setGroupId(id); return item; }) .collect(Collectors.toList()))); req.setGroupSet( groupIds ); } return req; } @Override NetworkInterfaceType extractResult(ComputeMessage resp) { final CreateNetworkInterfaceResponseType response = (CreateNetworkInterfaceResponseType) resp; return response.getNetworkInterface(); } } private class EucaDescribeNetworkInterfacesTask extends EucalyptusActivityTaskWithResult<ComputeMessage, Compute, List<NetworkInterfaceType>> { private List<String> interfaceIds = null; private String subnetId = null; private EucaDescribeNetworkInterfacesTask(final List<String> interfaceIds, final String subnetId) { this.interfaceIds = interfaceIds; this.subnetId = subnetId; } @Override ComputeMessage getRequest() { final DescribeNetworkInterfacesType req = new DescribeNetworkInterfacesType(); if(this.interfaceIds!=null) { for (final String interfaceId: this.interfaceIds) { req.getFilterSet().add(filter("network-interface-id", interfaceId)); } } if(this.subnetId!=null) { req.getFilterSet().add(filter("subnet-id", this.subnetId)); } return req; } @Override List<NetworkInterfaceType> extractResult(ComputeMessage resp) { final DescribeNetworkInterfacesResponseType response = (DescribeNetworkInterfacesResponseType) resp; return response.getNetworkInterfaceSet().getItem(); } } private class EucaModifyNetworkInterfaceAttribute extends EucalyptusActivityTask<ComputeMessage, Compute> { private String networkInterfaceId = null; private List<String> securityGroupIds = null; private String attachmentId = null; private Optional<Boolean> deleteOnTerminate = Optional.absent(); private EucaModifyNetworkInterfaceAttribute(final String networkInterfaceId, final List<String> securityGroupIds) { this.networkInterfaceId = networkInterfaceId; this.securityGroupIds = securityGroupIds; } private EucaModifyNetworkInterfaceAttribute(final String networkInterfaceId, final String attachmentId, final boolean deleteOnTerminate) { this.networkInterfaceId = networkInterfaceId; this.attachmentId = attachmentId; this.deleteOnTerminate = Optional.of(deleteOnTerminate); } @Override ComputeMessage getRequest() { final ModifyNetworkInterfaceAttributeType req = new ModifyNetworkInterfaceAttributeType(); req.setNetworkInterfaceId(this.networkInterfaceId); if(this.securityGroupIds!=null) { final SecurityGroupIdSetType groupIds = new SecurityGroupIdSetType(); groupIds.setItem(new ArrayList( this.securityGroupIds.stream() .map(id -> { final SecurityGroupIdSetItemType item = new SecurityGroupIdSetItemType(); item.setGroupId(id); return item; }) .collect(Collectors.toList()))); req.setGroupSet(groupIds); } if(this.attachmentId!=null && this.deleteOnTerminate.isPresent()) { final ModifyNetworkInterfaceAttachmentType attachment = new ModifyNetworkInterfaceAttachmentType(); attachment.setAttachmentId(this.attachmentId); attachment.setDeleteOnTermination(this.deleteOnTerminate.get()); req.setAttachment(attachment); } return req; } } private class EucaDescribeNatGatewayTask extends EucalyptusActivityTaskWithResult<ComputeMessage, Compute, List<NatGatewayType>> { private String subnetId = null; private EucaDescribeNatGatewayTask(final String subnetId) { this.subnetId = subnetId; } @Override ComputeMessage getRequest() { final DescribeNatGatewaysType req = new DescribeNatGatewaysType(); if (this.subnetId != null) { req.getFilterSet().add(filter("subnet-id", this.subnetId)); } return req; } @Override List<NatGatewayType> extractResult( final ComputeMessage resp ) { final DescribeNatGatewaysResponseType response = (DescribeNatGatewaysResponseType) resp; return response.getNatGatewaySet().getItem(); } } private class EucaCreateNatGatewayTask extends EucalyptusActivityTaskWithResult<ComputeMessage, Compute, String> { private String subnetId = null; private String elasticIpAllocationId = null; private EucaCreateNatGatewayTask(final String subnetId, final String elasticIpAllocationId) { this.subnetId = subnetId; this.elasticIpAllocationId = elasticIpAllocationId; } @Override ComputeMessage getRequest() { final CreateNatGatewayType req = new CreateNatGatewayType(); req.setSubnetId(this.subnetId); req.setAllocationId(this.elasticIpAllocationId); return req; } @Override String extractResult(final ComputeMessage resp) { final CreateNatGatewayResponseType response = (CreateNatGatewayResponseType) resp; return response.getNatGateway().getNatGatewayId(); } } private class EucaDeleteRouteTask extends EucalyptusActivityTask<ComputeMessage, Compute> { private String routeTableId = null; private String destCidr = null; private EucaDeleteRouteTask(final String routeTableId, final String destCidr) { this.routeTableId = routeTableId; this.destCidr = destCidr; } ComputeMessage getRequest() { final DeleteRouteType req = new DeleteRouteType(); req.setRouteTableId(this.routeTableId); req.setDestinationCidrBlock(this.destCidr); return req; } } private class EucaCreateRouteTask extends EucalyptusActivityTask<ComputeMessage, Compute> { private String destCidr = null; private String internetGateway = null; private String natGateway = null; private String routeTable = null; private EucaCreateRouteTask(final String routeTable, final String destCidr, final String internetGateway, final String natGateway) { this.routeTable = routeTable; this.destCidr = destCidr; if(internetGateway!=null && natGateway!=null) { throw Exceptions.toUndeclared("Both internet gateway and nat gateway are specified"); } else if(internetGateway == null && natGateway == null) { throw Exceptions.toUndeclared("Internet or nat gateway must be specified"); } this.internetGateway = internetGateway; this.natGateway = natGateway; } ComputeMessage getRequest( ) { final CreateRouteType req = new CreateRouteType(); req.setRouteTableId( this.routeTable ); req.setDestinationCidrBlock( this.destCidr ); if (this.internetGateway != null) req.setGatewayId( this.internetGateway ); if (this.natGateway != null) req.setNatGatewayId( this.natGateway ); return req; } } private class EucaDescribeVpcsTask extends EucalyptusActivityTaskWithResult<ComputeMessage, Compute, List<VpcType>> { private Collection<String> vpcIds; private final Boolean defaultVpc; private EucaDescribeVpcsTask(final Boolean defaultVpc ) { this( defaultVpc, null ); } private EucaDescribeVpcsTask(final Collection<String> vpcIds){ this( null, vpcIds ); } private EucaDescribeVpcsTask(final Boolean defaultVpc, final Collection<String> vpcIds){ this.defaultVpc = defaultVpc; this.vpcIds = vpcIds; } ComputeMessage getRequest( ){ final DescribeVpcsType req = new DescribeVpcsType(); if(this.defaultVpc!=null){ req.getFilterSet().add( filter( "isDefault", String.valueOf( defaultVpc ) ) ); } if(this.vpcIds!=null){ final List<VpcIdSetItemType> idItems = this.vpcIds.stream().map(s -> { final VpcIdSetItemType item = new VpcIdSetItemType(); item.setVpcId(s); return item; }).collect(Collectors.toList()); req.setVpcSet( new VpcIdSetType() ); req.getVpcSet().setItem(new ArrayList(idItems)); } return req; } @Override List<VpcType> extractResult( final ComputeMessage response ) { final DescribeVpcsResponseType resp = (DescribeVpcsResponseType) response; return resp.getVpcSet( ).getItem(); } } private class EucaDescribeSubnetsTask extends EucalyptusActivityTaskWithResult<ComputeMessage, Compute, List<SubnetType>> { private String vpcId = null; private Collection<String> subnetIds = null; private Collection<String> zones = null; private Boolean defaultSubnet = null; private EucaDescribeSubnetsTask(final Collection<String> subnetIds){ this.subnetIds = subnetIds; } private EucaDescribeSubnetsTask(final String vpcId, final Boolean defaultSubnet, final Collection<String> zones){ this.vpcId = vpcId; this.defaultSubnet = defaultSubnet; this.zones = zones; } ComputeMessage getRequest( ){ final DescribeSubnetsType req = new DescribeSubnetsType(); req.setSubnetSet( new SubnetIdSetType( ) ); req.getSubnetSet( ).getItem( ).add( new SubnetIdSetItemType() ); req.getSubnetSet( ).getItem( ).get( 0 ).setSubnetId( "verbose" ); if(this.vpcId!=null){ req.getFilterSet( ).add( filter( "vpc-id", vpcId ) ); } if(this.subnetIds!=null){ req.getFilterSet( ).add( filter( "subnet-id", subnetIds ) ); } if(this.zones!=null){ req.getFilterSet( ).add( filter( "availability-zone", zones ) ); } if(this.defaultSubnet!=null){ req.getFilterSet( ).add( filter( "default-for-az", String.valueOf( this.defaultSubnet ) ) ); } return req; } @Override List<SubnetType> extractResult( final ComputeMessage response ) { final DescribeSubnetsResponseType resp = (DescribeSubnetsResponseType) response; return resp.getSubnetSet( ).getItem( ); } } private class EucaDescribeInternetGatewaysTask extends EucalyptusActivityTaskWithResult<ComputeMessage, Compute, List<InternetGatewayType>> { private Collection<String> vpcIds = null; private EucaDescribeInternetGatewaysTask(final Collection<String> vpcIds){ this.vpcIds = vpcIds; } ComputeMessage getRequest( ){ final DescribeInternetGatewaysType req = new DescribeInternetGatewaysType(); req.setInternetGatewayIdSet( new InternetGatewayIdSetType() ); req.getInternetGatewayIdSet().getItem( ).add( new InternetGatewayIdSetItemType() ); req.getInternetGatewayIdSet().getItem( ).get( 0 ).setInternetGatewayId( "verbose" ); if(this.vpcIds!=null){ req.getFilterSet( ).add( filter( "attachment.vpc-id", this.vpcIds ) ); } return req; } @Override List<InternetGatewayType> extractResult( final ComputeMessage response ) { final DescribeInternetGatewaysResponseType resp = (DescribeInternetGatewaysResponseType) response; return resp.getInternetGatewaySet( ).getItem( ); } } private class EuareGetServerCertificateTask extends EucalyptusActivityTaskWithResult<EuareMessage, Euare, ServerCertificateType> { private String certName = null; private EuareGetServerCertificateTask(final String certName){ this.certName = certName; } GetServerCertificateType getRequest( ){ final GetServerCertificateType req = new GetServerCertificateType(); req.setServerCertificateName(this.certName); return req; } @Override ServerCertificateType extractResult( EuareMessage response ) { final GetServerCertificateResponseType resp = (GetServerCertificateResponseType) response; if(resp.getGetServerCertificateResult()!= null) return resp.getGetServerCertificateResult().getServerCertificate(); return null; } } private class EuareDeleteInstanceProfileTask extends EucalyptusActivityTask<EuareMessage, Euare>{ private String profileName =null; private EuareDeleteInstanceProfileTask(String profileName){ this.profileName = profileName; } DeleteInstanceProfileType getRequest(){ final DeleteInstanceProfileType req = new DeleteInstanceProfileType(); req.setInstanceProfileName(this.profileName); return req; } } private class EuareAddRoleToInstanceProfileTask extends EucalyptusActivityTask<EuareMessage, Euare>{ private String instanceProfileName = null; private String roleName = null; private EuareAddRoleToInstanceProfileTask(final String instanceProfileName, final String roleName){ this.instanceProfileName = instanceProfileName; this.roleName = roleName; } AddRoleToInstanceProfileType getRequest(){ final AddRoleToInstanceProfileType req = new AddRoleToInstanceProfileType(); req.setRoleName(this.roleName); req.setInstanceProfileName(this.instanceProfileName); return req; } } private class EuareRemoveRoleFromInstanceProfileTask extends EucalyptusActivityTask<EuareMessage, Euare>{ private String instanceProfileName = null; private String roleName = null; private EuareRemoveRoleFromInstanceProfileTask(final String instanceProfileName, final String roleName){ this.instanceProfileName = instanceProfileName; this.roleName = roleName; } RemoveRoleFromInstanceProfileType getRequest(){ final RemoveRoleFromInstanceProfileType req = new RemoveRoleFromInstanceProfileType(); req.setRoleName(this.roleName); req.setInstanceProfileName(this.instanceProfileName); return req; } } private class EuareListInstanceProfilesTask extends EucalyptusActivityTaskWithResult<EuareMessage, Euare, List<InstanceProfileType>> { private String pathPrefix = null; private EuareListInstanceProfilesTask(final String pathPrefix){ this.pathPrefix = pathPrefix; } ListInstanceProfilesType getRequest(){ final ListInstanceProfilesType req = new ListInstanceProfilesType(); req.setPathPrefix(this.pathPrefix); return req; } @Override List<InstanceProfileType> extractResult(EuareMessage response) { ListInstanceProfilesResponseType resp = (ListInstanceProfilesResponseType) response; try{ return resp.getListInstanceProfilesResult().getInstanceProfiles().getMember(); }catch(Exception ex){ return null; } } } private class EuareCreateInstanceProfileTask extends EucalyptusActivityTaskWithResult<EuareMessage, Euare, InstanceProfileType>{ private String profileName = null; private String path = null; private EuareCreateInstanceProfileTask(String profileName, String path){ this.profileName = profileName; this.path = path; } CreateInstanceProfileType getRequest(){ final CreateInstanceProfileType req = new CreateInstanceProfileType(); req.setInstanceProfileName(this.profileName); req.setPath(this.path); return req; } @Override InstanceProfileType extractResult(EuareMessage response) { final CreateInstanceProfileResponseType resp = (CreateInstanceProfileResponseType) response; try{ return resp.getCreateInstanceProfileResult().getInstanceProfile(); }catch(Exception ex){ return null; } } } private class EuareDeleteRoleTask extends EucalyptusActivityTask<EuareMessage, Euare> { private String roleName = null; private EuareDeleteRoleTask(String roleName){ this.roleName = roleName; } DeleteRoleType getRequest(){ final DeleteRoleType req = new DeleteRoleType(); req.setRoleName(this.roleName); return req; } } private class EuareCreateRoleTask extends EucalyptusActivityTaskWithResult<EuareMessage, Euare, RoleType> { String roleName = null; String path = null; String assumeRolePolicy = null; private EuareCreateRoleTask(String roleName, String path, String assumeRolePolicy){ this.roleName = roleName; this.path = path; this.assumeRolePolicy = assumeRolePolicy; } CreateRoleType getRequest(){ final CreateRoleType req = new CreateRoleType(); req.setRoleName(this.roleName); req.setPath(this.path); req.setAssumeRolePolicyDocument(this.assumeRolePolicy); return req; } @Override RoleType extractResult( EuareMessage response) { CreateRoleResponseType resp = (CreateRoleResponseType) response; try{ return resp.getCreateRoleResult().getRole(); }catch(Exception ex){ return null; } } } private class EuareListRolesTask extends EucalyptusActivityTaskWithResult<EuareMessage, Euare, List<RoleType>> { private String pathPrefix = null; private EuareListRolesTask(String pathPrefix){ this.pathPrefix = pathPrefix; } ListRolesType getRequest(){ final ListRolesType req = new ListRolesType(); req.setPathPrefix(this.pathPrefix); return req; } @Override List<RoleType> extractResult(EuareMessage response) { ListRolesResponseType resp = (ListRolesResponseType) response; try{ return resp.getListRolesResult().getRoles().getMember(); }catch(Exception ex){ return null; } } } private class EuarePutRolePolicyTask extends EucalyptusActivityTask<EuareMessage, Euare> { private String roleName = null; private String policyName = null; private String policyDocument = null; private EuarePutRolePolicyTask(String roleName, String policyName, String policyDocument){ this.roleName = roleName; this.policyName = policyName; this.policyDocument = policyDocument; } PutRolePolicyType getRequest(){ final PutRolePolicyType req = new PutRolePolicyType(); req.setRoleName(this.roleName); req.setPolicyName(this.policyName); req.setPolicyDocument(this.policyDocument); return req; } } private class EuareListRolePoliciesTask extends EucalyptusActivityTaskWithResult<EuareMessage, Euare, List<String>> { private String roleName = null; private EuareListRolePoliciesTask(final String roleName){ this.roleName = roleName; } ListRolePoliciesType getRequest(){ final ListRolePoliciesType req = new ListRolePoliciesType(); req.setRoleName(this.roleName); return req; } @Override List<String> extractResult(EuareMessage response) { try{ final ListRolePoliciesResponseType resp = (ListRolePoliciesResponseType) response; return resp.getListRolePoliciesResult().getPolicyNames().getMemberList(); }catch(final Exception ex){ return Lists.newArrayList(); } } } private class EuareGetRolePolicyTask extends EucalyptusActivityTaskWithResult<EuareMessage, Euare, GetRolePolicyResult> { private String roleName = null; private String policyName = null; private EuareGetRolePolicyTask(final String roleName, final String policyName){ this.roleName = roleName; this.policyName = policyName; } GetRolePolicyType getRequest(){ final GetRolePolicyType req = new GetRolePolicyType(); req.setRoleName(this.roleName); req.setPolicyName(this.policyName); return req; } @Override GetRolePolicyResult extractResult( EuareMessage response) { try{ final GetRolePolicyResponseType resp = (GetRolePolicyResponseType) response; return resp.getGetRolePolicyResult(); }catch(final Exception ex){ return null; } } } private class EuareDeleteRolePolicyTask extends EucalyptusActivityTask<EuareMessage, Euare> { private String roleName= null; private String policyName = null; private EuareDeleteRolePolicyTask(final String roleName, final String policyName){ this.roleName = roleName; this.policyName = policyName; } DeleteRolePolicyType getRequest(){ final DeleteRolePolicyType req = new DeleteRolePolicyType(); req.setRoleName(this.roleName); req.setPolicyName(this.policyName); return req; } } private class AutoScalingUpdateGroupTask extends EucalyptusActivityTask<AutoScalingMessage, AutoScaling>{ private String groupName = null; private List<String> availabilityZones = null; private Integer capacity = null; private String launchConfigName = null; private AutoScalingUpdateGroupTask(final String groupName, final List<String> zones, final Integer capacity, final String launchConfig){ this.groupName = groupName; this.availabilityZones = zones; this.capacity = capacity; this.launchConfigName = launchConfig; } UpdateAutoScalingGroupType getRequest(){ final UpdateAutoScalingGroupType req = new UpdateAutoScalingGroupType(); req.setAutoScalingGroupName( this.groupName ); if(this.availabilityZones!=null && this.availabilityZones.size()>0){ AvailabilityZones zones = new AvailabilityZones(); zones.setMember(Lists.<String>newArrayList()); zones.getMember().addAll(this.availabilityZones); req.setAvailabilityZones(zones); } if(this.capacity!=null){ req.setDesiredCapacity(this.capacity); req.setMaxSize(this.capacity); req.setMinSize(this.capacity); } if(this.launchConfigName!=null){ req.setLaunchConfigurationName(this.launchConfigName); } return req; } } private class AutoScalingDescribeGroupsTask extends EucalyptusActivityTaskWithResult<AutoScalingMessage, AutoScaling, DescribeAutoScalingGroupsResponseType> { private List<String> groupNames = null; private AutoScalingDescribeGroupsTask(final List<String> groupNames){ this.groupNames = groupNames; } DescribeAutoScalingGroupsType getRequest( ){ final DescribeAutoScalingGroupsType req = new DescribeAutoScalingGroupsType(); final AutoScalingGroupNames names = new AutoScalingGroupNames(); names.setMember(Lists.<String>newArrayList()); names.getMember().addAll(this.groupNames); req.setAutoScalingGroupNames(names); return req; } @Override DescribeAutoScalingGroupsResponseType extractResult( final AutoScalingMessage response ) { return (DescribeAutoScalingGroupsResponseType) response; } } private class AutoScalingCreateGroupTask extends EucalyptusActivityTask<AutoScalingMessage, AutoScaling>{ private String groupName = null; private List<String> availabilityZones = null; private String vpcZoneIdentifier; private int capacity = 1; private String launchConfigName = null; private String tagKey = null; private String tagValue = null; private AutoScalingCreateGroupTask(final String groupName, final List<String> zones, final String vpcZoneIdentifier, final int capacity, final String launchConfig, final String tagKey, final String tagValue){ this.groupName = groupName; this.availabilityZones = zones; this.vpcZoneIdentifier = vpcZoneIdentifier; this.capacity = capacity; this.launchConfigName = launchConfig; this.tagKey = tagKey; this.tagValue = tagValue; } CreateAutoScalingGroupType getRequest(){ final CreateAutoScalingGroupType req = new CreateAutoScalingGroupType(); req.setAutoScalingGroupName(this.groupName); req.setAvailabilityZones( new AvailabilityZones( this.availabilityZones ) ); req.setVpcZoneIdentifier( this.vpcZoneIdentifier ); req.setDesiredCapacity(this.capacity); req.setMaxSize(this.capacity); req.setMinSize(this.capacity); req.setHealthCheckType("EC2"); req.setLaunchConfigurationName(this.launchConfigName); final Tags tags = new Tags(); final TagType tag = new TagType(); tag.setKey(this.tagKey); tag.setValue(this.tagValue); tag.setPropagateAtLaunch(true); tag.setResourceType("auto-scaling-group"); tag.setResourceId(this.groupName); tags.setMember(Lists.newArrayList(tag)); req.setTags(tags); return req; } } private class AutoscalingCreateOrUpdateTagsTask extends EucalyptusActivityTask<AutoScalingMessage, AutoScaling> { private String tagKey = null; private String tagValue = null; private String asgName = null; private AutoscalingCreateOrUpdateTagsTask(final String tagKey, final String tagValue, final String asgName) { this.tagKey = tagKey; this.tagValue = tagValue; this.asgName = asgName; } @Override AutoScalingMessage getRequest() { final CreateOrUpdateTagsType req = new CreateOrUpdateTagsType(); final Tags tags = new Tags(); final TagType tag = new TagType(); tag.setKey(this.tagKey); tag.setValue(this.tagValue); tag.setPropagateAtLaunch(true); tag.setResourceType("auto-scaling-group"); tag.setResourceId(this.asgName); tags.setMember(Lists.newArrayList(tag)); req.setTags(tags); return req; } } private class AutoScalingDeleteGroupTask extends EucalyptusActivityTask<AutoScalingMessage, AutoScaling>{ private String groupName = null; private boolean terminateInstances = false; private AutoScalingDeleteGroupTask(final String groupName, final boolean terminateInstances){ this.groupName = groupName; this.terminateInstances = terminateInstances; } DeleteAutoScalingGroupType getRequest(){ final DeleteAutoScalingGroupType req = new DeleteAutoScalingGroupType(); req.setAutoScalingGroupName(this.groupName); req.setForceDelete(this.terminateInstances); return req; } @Override boolean dispatchFailure(ActivityContext<AutoScalingMessage, AutoScaling> context, Throwable throwable) { if ( !AsyncExceptions.isWebServiceErrorCode( throwable, "ScalingActivityInProgress" ) ) { return super.dispatchFailure( context, throwable ); } return false; } } private class AutoScalingDeleteLaunchConfigTask extends EucalyptusActivityTask<AutoScalingMessage, AutoScaling>{ private String launchConfigName = null; private AutoScalingDeleteLaunchConfigTask(final String launchConfigName){ this.launchConfigName = launchConfigName; } DeleteLaunchConfigurationType getRequest(){ final DeleteLaunchConfigurationType req = new DeleteLaunchConfigurationType(); req.setLaunchConfigurationName(this.launchConfigName); return req; } } private class AutoScalingDescribeLaunchConfigsTask extends EucalyptusActivityTaskWithResult<AutoScalingMessage, AutoScaling, LaunchConfigurationType> { private String launchConfigName = null; private AutoScalingDescribeLaunchConfigsTask(final String launchConfigName){ this.launchConfigName = launchConfigName; } DescribeLaunchConfigurationsType getRequest(){ final DescribeLaunchConfigurationsType req = new DescribeLaunchConfigurationsType(); final LaunchConfigurationNames names = new LaunchConfigurationNames(); names.setMember(Lists.newArrayList(this.launchConfigName)); req.setLaunchConfigurationNames(names); return req; } @Override LaunchConfigurationType extractResult( AutoScalingMessage response) { final DescribeLaunchConfigurationsResponseType resp = (DescribeLaunchConfigurationsResponseType) response; try{ return resp.getDescribeLaunchConfigurationsResult().getLaunchConfigurations().getMember().get(0); }catch(final Exception ex){ LOG.error("Launch configuration is not found from the response"); return null; } } } private class AutoScalingCreateLaunchConfigTask extends EucalyptusActivityTask<AutoScalingMessage, AutoScaling>{ private final String imageId; private final String instanceType; private final String instanceProfileName; private final String launchConfigName; private final Collection<String> securityGroupNamesOrIds; private final String keyName; private final String userData; private final Boolean associatePublicIp; private AutoScalingCreateLaunchConfigTask(final String imageId, final String instanceType, String instanceProfileName, final String launchConfigName, final Collection<String> securityGroupNamesOrIds, final String keyName, final String userData, final Boolean associatePublicIp){ this.imageId = imageId; this.instanceType = instanceType; this.instanceProfileName = instanceProfileName; this.launchConfigName = launchConfigName; this.securityGroupNamesOrIds = securityGroupNamesOrIds; this.keyName = keyName; this.userData = userData; this.associatePublicIp = associatePublicIp; } CreateLaunchConfigurationType getRequest(){ final CreateLaunchConfigurationType req = new CreateLaunchConfigurationType(); req.setImageId(this.imageId); req.setInstanceType(this.instanceType); req.setIamInstanceProfile(this.instanceProfileName); if(this.keyName == null || this.keyName.length()<=0) req.setKeyName(null); else req.setKeyName(this.keyName); req.setLaunchConfigurationName(this.launchConfigName); req.setSecurityGroups( new SecurityGroups( this.securityGroupNamesOrIds ) ); req.setUserData(userData); req.setAssociatePublicIpAddress( associatePublicIp ); return req; } } private class CloudWatchPutMetricDataTask extends EucalyptusActivityTask<CloudWatchMessage, CloudWatch>{ private MetricData metricData = null; private String namespace = null; private CloudWatchPutMetricDataTask( final String namespace, final MetricData data){ this.namespace = namespace; this.metricData = data; } PutMetricDataType getRequest(){ final PutMetricDataType request = new PutMetricDataType(); request.setNamespace(this.namespace); request.setMetricData(this.metricData); return request; } } private class EucalyptusDescribeAvailabilityZonesTask extends EucalyptusActivityTaskWithResult<ComputeMessage, Compute, List<ClusterInfoType>> { private boolean verbose = false; private EucalyptusDescribeAvailabilityZonesTask(boolean verbose){ this.verbose = verbose; } DescribeAvailabilityZonesType getRequest(){ final DescribeAvailabilityZonesType req = new DescribeAvailabilityZonesType(); if(this.verbose){ req.setAvailabilityZoneSet(Lists.newArrayList("verbose")); } return req; } @Override List<ClusterInfoType> extractResult(ComputeMessage response) { final DescribeAvailabilityZonesResponseType resp = (DescribeAvailabilityZonesResponseType) response; return resp.getAvailabilityZoneInfo(); } } private class EucalyptusDescribeServicesTask extends EucalyptusActivityTaskWithResult<EmpyreanMessage, Empyrean,List<ServiceStatusType>> { private String componentType = null; private EucalyptusDescribeServicesTask(final String componentType){ this.componentType = componentType; } DescribeServicesType getRequest(){ final DescribeServicesType req = new DescribeServicesType(); req.setByServiceType(this.componentType); return req; } @Override List<ServiceStatusType> extractResult(EmpyreanMessage response) { final DescribeServicesResponseType resp = (DescribeServicesResponseType) response; return resp.getServiceStatuses(); } } private class EucalyptusDescribeInstanceTask extends EucalyptusActivityTaskWithResult<ComputeMessage, Compute,List<RunningInstancesItemType>> { private final List<String> instanceIds; private boolean verbose = false; private EucalyptusDescribeInstanceTask(final List<String> instanceId){ this.instanceIds = instanceId; } private EucalyptusDescribeInstanceTask(final List<String> instanceId, final boolean verbose){ this.instanceIds = instanceId; this.verbose = verbose; } DescribeInstancesType getRequest(){ final DescribeInstancesType req = new DescribeInstancesType(); if( this.verbose ) { req.setInstancesSet( Lists.newArrayList( "verbose" ) ); } req.getFilterSet( ).add( filter( "instance-id", this.instanceIds ) ); return req; } @Override List<RunningInstancesItemType> extractResult( ComputeMessage response) { final DescribeInstancesResponseType resp = (DescribeInstancesResponseType) response; final List<RunningInstancesItemType> resultInstances = Lists.newArrayList(); for(final ReservationInfoType res : resp.getReservationSet()){ resultInstances.addAll(res.getInstancesSet()); } return resultInstances; } @Override List<RunningInstancesItemType> getFailureResult( final String errorCode ) { return "InvalidInstanceID.NotFound".equals( errorCode ) ? Lists.<RunningInstancesItemType>newArrayList( ) : null; } } //SPARK: TODO: SYSTEM, STATIC MODE? private class EucalyptusCreateGroupTask extends EucalyptusActivityTaskWithResult<ComputeMessage, Compute, String> { private String groupName = null; private String groupDesc = null; EucalyptusCreateGroupTask(String groupName, String groupDesc){ this.groupName = groupName; this.groupDesc = groupDesc; } CreateSecurityGroupType getRequest(){ final CreateSecurityGroupType req = new CreateSecurityGroupType(); req.setGroupName(this.groupName); req.setGroupDescription(this.groupDesc); return req; } @Override String extractResult(ComputeMessage response) { final CreateSecurityGroupResponseType resp = (CreateSecurityGroupResponseType) response; return resp.getGroupId(); } } private class EucalyptusAuthorizeIngressRuleTask extends EucalyptusActivityTask<ComputeMessage, Compute> { String groupNameOrId=null; String protocol = null; int portNum = 1; EucalyptusAuthorizeIngressRuleTask(String groupNameOrId, String protocol, int portNum){ this.groupNameOrId = groupNameOrId; this.protocol=protocol; this.portNum = portNum; } AuthorizeSecurityGroupIngressType getRequest(){ AuthorizeSecurityGroupIngressType req = new AuthorizeSecurityGroupIngressType( ); if ( this.groupNameOrId.matches( "sg-[0-9a-fA-F]{8}" ) ) { req.setGroupId( this.groupNameOrId ); } else { req.setGroupName( this.groupNameOrId ); } IpPermissionType perm = new IpPermissionType(); perm.setFromPort(this.portNum); perm.setToPort(this.portNum); perm.setCidrIpRanges( Collections.singleton( "0.0.0.0/0" ) ); perm.setIpProtocol(this.protocol); // udp too? req.getIpPermissions( ).add( perm ); return req; } } private class EucalyptusRevokeIngressRuleTask extends EucalyptusActivityTask<ComputeMessage, Compute> { String groupName=null; String protocol=null; int portNum = 1; EucalyptusRevokeIngressRuleTask(String groupName, String protocol, int portNum){ this.groupName = groupName; this.protocol = protocol; this.portNum = portNum; } RevokeSecurityGroupIngressType getRequest(){ RevokeSecurityGroupIngressType req = new RevokeSecurityGroupIngressType(); req.setGroupName(this.groupName); IpPermissionType perm = new IpPermissionType(); perm.setFromPort(this.portNum); perm.setToPort(this.portNum); perm.setCidrIpRanges( Lists.newArrayList( Arrays.asList( "0.0.0.0/0" ) ) ); perm.setIpProtocol(this.protocol); req.setIpPermissions(Lists.newArrayList(Arrays.asList(perm))); return req; } } private class EucalyptusRevokeIngressRuleFromOtherGroupTask extends EucalyptusActivityTask<ComputeMessage, Compute> { private String groupId = null; private String protocol = null; private Integer fromPortNum = null; private Integer toPortNum = null; private String sourceGroupId = null; private String sourceAccountId = null; EucalyptusRevokeIngressRuleFromOtherGroupTask(final String groupId, final String protocol, final Integer fromPortNum, final Integer toPortNum, final String sourceAccountId, final String sourceGroupId) { this.groupId = groupId; this.protocol = protocol; this.fromPortNum = fromPortNum; this.toPortNum = toPortNum; this.sourceAccountId = sourceAccountId; this.sourceGroupId = sourceGroupId; } RevokeSecurityGroupIngressType getRequest() { final RevokeSecurityGroupIngressType req = new RevokeSecurityGroupIngressType(); req.setGroupId(this.groupId); req.setIpPermissions(new ArrayList<IpPermissionType>()); final IpPermissionType perm = new IpPermissionType(); perm.setIpProtocol(this.protocol); if(this.sourceAccountId!=null && this.sourceGroupId!=null) { perm.setGroups(new ArrayList<UserIdGroupPairType>()); final UserIdGroupPairType userGroup = new UserIdGroupPairType(); userGroup.setSourceGroupId( this.sourceGroupId ); userGroup.setSourceUserId( this.sourceAccountId ); perm.getGroups().add( userGroup ); } if(this.fromPortNum != null && this.toPortNum != null) { perm.setFromPort(this.fromPortNum); perm.setToPort(this.toPortNum); } req.getIpPermissions().add(perm); return req; } } private class EucalyptusAuthorizeEgressRuleTask extends EucalyptusActivityTask<ComputeMessage, Compute> { private String groupId = null; private String protocol = null; private int fromPort = -1; private int toPort = -1; private String cidrSourceRange = null; EucalyptusAuthorizeEgressRuleTask(final String groupId, final String protocol, final int fromPort, final int toPort, final String cidrSourceRange) { this.groupId = groupId; this.protocol = protocol; this.fromPort = fromPort; this.toPort = toPort; this.cidrSourceRange = cidrSourceRange; } AuthorizeSecurityGroupEgressType getRequest() { final AuthorizeSecurityGroupEgressType req = new AuthorizeSecurityGroupEgressType(); req.setGroupId(this.groupId); final IpPermissionType perm = new IpPermissionType(); perm.setIpProtocol(this.protocol); perm.setFromPort(this.fromPort); perm.setToPort(this.toPort); perm.setCidrIpRanges( Lists.newArrayList( Arrays.asList( this.cidrSourceRange ) ) ); req.setIpPermissions(Lists.newArrayList(Arrays.asList(perm))); return req; } } private class EucalyptusRevokeEgressRuleTask extends EucalyptusActivityTask<ComputeMessage, Compute> { private String groupId = null; private String protocol = null; private int fromPort = -1; private int toPort = -1; private String cidrSourceRange = null; EucalyptusRevokeEgressRuleTask(final String groupId, final String protocol, final int fromPort, final int toPort, final String cidrSourceRange) { this.groupId = groupId; this.protocol = protocol; this.fromPort = fromPort; this.toPort = toPort; this.cidrSourceRange = cidrSourceRange; } RevokeSecurityGroupEgressType getRequest() { final RevokeSecurityGroupEgressType req = new RevokeSecurityGroupEgressType(); req.setGroupId(this.groupId); final IpPermissionType perm = new IpPermissionType(); perm.setIpProtocol(this.protocol); perm.setFromPort(this.fromPort); perm.setToPort(this.toPort); perm.setCidrIpRanges( Lists.newArrayList( Arrays.asList( this.cidrSourceRange ) ) ); req.setIpPermissions(Lists.newArrayList(Arrays.asList(perm))); return req; } } private class EucalyptusDeleteGroupTask extends EucalyptusActivityTask<ComputeMessage, Compute>{ private String groupName = null; EucalyptusDeleteGroupTask(String groupName){ this.groupName = groupName; } DeleteSecurityGroupType getRequest(){ final DeleteSecurityGroupType req = new DeleteSecurityGroupType(); req.setGroupName(this.groupName); return req; } } private class EucalyptusDescribeSecurityGroupTask extends EucalyptusActivityTaskWithResult<ComputeMessage, Compute, List<SecurityGroupItemType>>{ @Nullable private List<String> groupIds = null; @Nullable private List<String> groupNames = null; @Nullable private String vpcId = null; EucalyptusDescribeSecurityGroupTask( @Nullable final List<String> groupIds, @Nullable final List<String> groupNames, @Nullable final String vpcId ){ this.groupIds = groupIds; this.groupNames = groupNames; this.vpcId = vpcId; } DescribeSecurityGroupsType getRequest( ) { final DescribeSecurityGroupsType req = new DescribeSecurityGroupsType( ); if ( groupIds != null && !groupIds.isEmpty( ) ) { req.getFilterSet().add( filter( "group-id", groupIds ) ); } if ( groupNames != null && !groupNames.isEmpty( ) ) { req.getFilterSet().add( filter( "group-name", groupNames ) ); } if ( vpcId != null ) { req.getFilterSet().add( filter( "vpc-id", vpcId ) ); } return req; } @Override List<SecurityGroupItemType> extractResult(ComputeMessage response) { final DescribeSecurityGroupsResponseType resp = (DescribeSecurityGroupsResponseType) response; return resp.getSecurityGroupInfo(); } } private class EucalyptusModifySecurityGroupsTask extends EucalyptusActivityTask<ComputeMessage, Compute> { private final String instanceId; private final Collection<String> securityGroupIds; EucalyptusModifySecurityGroupsTask( final String instanceId, final Collection<String> securityGroupIds ) { this.instanceId = instanceId; this.securityGroupIds = securityGroupIds; } @Override ComputeMessage getRequest( ) { final ModifyInstanceAttributeType modifyInstanceAttribute = new ModifyInstanceAttributeType( ); modifyInstanceAttribute.setInstanceId( instanceId ); modifyInstanceAttribute.setGroupIdSet( new GroupIdSetType( ) ); for ( final String securityGroupId : securityGroupIds ) { final SecurityGroupIdSetItemType id = new SecurityGroupIdSetItemType( ); id.setGroupId( securityGroupId ); modifyInstanceAttribute.getGroupIdSet().getItem().add( id ); } return modifyInstanceAttribute; } } private static Filter filter( final String name, String value ) { return filter( name, Collections.singleton( value ) ); } private static Filter filter( final String name, final Iterable<String> values ) { return Filter.filter( name, values ); } private abstract class EucalyptusActivityTask <TM extends BaseMessage, TC extends ComponentId>{ protected EucalyptusActivityTask(){} final CheckedListenableFuture<Boolean> dispatch( final ActivityContext<TM,TC> context ) { try { final CheckedListenableFuture<Boolean> future = Futures.newGenericeFuture(); dispatchInternal( context, new Callback.Checked<TM>(){ @Override public void fireException( final Throwable throwable ) { boolean result = false; try { result = dispatchFailure( context, throwable ); } finally { future.set( result ); } } @Override public void fire( final TM response ) { try { dispatchSuccess( context, response ); } finally { future.set( true ); } } } ); return future; } catch ( Exception e ) { LOG.error( e, e ); } return Futures.predestinedFuture( false ); } /** * Build the request message */ abstract TM getRequest( ); final void dispatchInternal( final ActivityContext<TM,TC> context, final Callback.Checked<TM> callback) { final DispatchingClient<TM, TC> client = context.getClient( ); client.dispatch( getRequest( ), callback ); } boolean dispatchFailure( ActivityContext<TM,TC> context, Throwable throwable ) { LOG.error( "Loadbalancer activity error", throwable ); return false; } void dispatchSuccess( ActivityContext<TM,TC> context, TM response ){ } } private abstract class EucalyptusActivityTaskWithResult<TM extends BaseMessage, TC extends ComponentId, R> extends EucalyptusActivityTask<TM,TC> { private final AtomicReference<R> r = new AtomicReference<>( ); /** * Extract/construct the result from the response message */ abstract R extractResult( TM response ); R failureResult( String errorCode ) { return null; } final R getResult( ) { return r.get( ); } R getFailureResult( final String errorCode ) { return null; } @Override void dispatchSuccess( final ActivityContext<TM,TC> context, final TM response) { r.set( extractResult( response ) ); } @Override boolean dispatchFailure( final ActivityContext<TM, TC> context, final Throwable throwable ) { final Optional<AsyncWebServiceError> serviceErrorOptional = AsyncExceptions.asWebServiceError( throwable ); if ( serviceErrorOptional.isPresent( ) ){ final R result = getFailureResult( serviceErrorOptional.get( ).getCode( ) ); if ( result != null ) { r.set( result ); return true; } else { return super.dispatchFailure( context, throwable ); } } else { return super.dispatchFailure( context, throwable ); } } } private <TM extends BaseMessage, TC extends ComponentId> void checkResult( final EucalyptusActivityTask<TM,TC> task, final ActivityContext<TM,TC> context, final String errorMessage ) { final CheckedListenableFuture<Boolean> result = task.dispatch( context ); try{ if ( !result.get( ) ) { throw new EucalyptusActivityException( errorMessage ); } }catch(Exception ex){ throw Exceptions.toUndeclared(ex); } } private <TM extends BaseMessage, TC extends ComponentId, R> R resultOf( final EucalyptusActivityTaskWithResult<TM,TC,R> task, final ActivityContext<TM,TC> context, final String errorMessage ) { final CheckedListenableFuture<Boolean> result = task.dispatch( context ); try{ if (result.get() ){ return task.getResult(); }else throw new EucalyptusActivityException( errorMessage ); }catch(Exception ex){ throw Exceptions.toUndeclared(ex); } } }