Class ElasticInstanceManagerImpl
- java.lang.Object
-
- com.atlassian.bamboo.agent.elastic.server.ElasticInstanceManagerImpl
-
- All Implemented Interfaces:
ElasticInstanceManager
,ElasticAgentTunnelPorts
public class ElasticInstanceManagerImpl extends Object implements ElasticInstanceManager
-
-
Field Summary
-
Fields inherited from interface com.atlassian.bamboo.agent.elastic.server.ElasticInstanceManager
DEFAULT_INSTANCE_TYPE_32, DEFAULT_INSTANCE_TYPE_64, DEFAULT_PRODUCT_FOR_LINUX_PLATFORM, DEFAULT_PRODUCT_FOR_WINDOWS_PLATFORM, ELASTIC_BAMBOO_KEY_PAIR, ELASTIC_BAMBOO_KEY_PAIR_FILE, ELASTIC_BAMBOO_SECURITY_GROUP
-
-
Constructor Summary
Constructors Constructor Description ElasticInstanceManagerImpl(AwsAccountBean awsAccountBean, AdministrationConfigurationAccessor administrationConfigurationAccessor, int startupTimeoutSeconds, ScheduledExecutorService executor, KeyStoreFactory keyStoreFactory, SSLContextFactory sslContextFactory, BootstrapManager bootstrapManager, ErrorHandler errorHandler, SpotInstanceConfigurationAccessor spotInstanceConfigurationAccessor, com.atlassian.event.api.EventPublisher eventPublisher, SecretEncryptionService secretEncryptionService)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
addElasticLogEntry(org.apache.log4j.Logger log, String logEntry)
void
addElasticLogEntry(org.apache.logging.log4j.Logger log, String logEntry)
boolean
cancelSpotRequests(@NotNull com.atlassian.aws.AWSAccount awsAccount)
Cancel spot instance requests.void
ensureLoginKeyPairExists(com.atlassian.aws.AWSAccount awsAccount, String keyPair)
Ensures that a key pair, named "elasticbamboo", has been defined in the configured AWS account.int
getAgentSideHttpPort()
The TCP port upon which the Elastic Agent listens for HTTP traffic intended for the Bamboo Server.int
getAgentSideJmsPort()
The TCP port upon which the Elastic Agent listens for JMS traffic intended for the Bamboo Server.com.google.common.collect.SetMultimap<ElasticImageConfiguration,RemoteElasticInstance>
getAllElasticAgentsAsMap()
Returns all elastic instances in aSetMultimap
, keyed by theElasticImageConfiguration
List<RemoteElasticInstance>
getAllElasticRemoteAgents()
Returns all elastic instances.@NotNull Set<com.atlassian.aws.ec2.EC2InstanceType>
getAllowedInstanceTypes()
String
getBambooControlTag()
Returns the name of the security group used to indicate that this instance belongs to Bamboo.List<String>
getElasticAgentLogs()
Retrieve activity logs@Nullable RemoteElasticInstance
getElasticRemoteAgentByInstanceId(String instanceId)
Retrieve elastic instance of the given ID.@NotNull List<RemoteElasticInstance>
getElasticRemoteAgents()
Retrieve a readonly list of any currently existing EC2 instances@NotNull List<RemoteElasticInstance>
getElasticRemoteAgentsByConfiguration(long id)
@NotNull List<RemoteElasticInstance>
getElasticRemoteAgentsByConfiguration(@NotNull ElasticImageConfiguration elasticImageConfiguration)
@NotNull String
getInstanceLogs(@NotNull String instanceId)
Fetch console output of a running EC2 instance.@NotNull List<RemoteElasticInstance>
getInstancesWithStartingAgents()
Returns those elastic instances that have already started but their agents have not yet connected to the bamboo server.@NotNull List<RemoteElasticInstance>
getRequestedElasticRemoteAgents()
Returns the elastic instances which have been requested but not yet identified.@NotNull List<RemoteElasticInstance>
getStartingElasticInstances()
Return the elastic instances which have been identified but not started up yet, i.e.int
getTotalNumElasticRemoteAgents()
Return how many license spots are currently being occupied by elastic instances (pending and running)int
getTunnelPort()
The TCP port upon which Elastic Agents listens for incoming tunnel connections from the Bamboo Server.boolean
isElasticSupportEnabled()
boolean
isInstanceKnown(@NotNull String instanceId)
Checks if an AWS instance with the given ID exists and is managed by this Bamboo server.RemoteElasticInstance
newElasticAgent(RemoteElasticInstanceListener listener, com.atlassian.aws.AWSAccount awsAccount, @NotNull AgentManager agentManager, @NotNull ElasticImageConfiguration elasticImageConfiguration, @NotNull com.atlassian.aws.ec2.InstanceLaunchConfigurationBuilder instanceLaunchConfigurationBuilder)
void
onInstanceIdentified(@NotNull RemoteElasticInstance instance)
Tell the manager that the instance is up and runningvoid
onInstanceRunning(@NotNull RemoteElasticInstance instance)
Invoked when the instance enters the 'running' statevoid
registerElasticAgentStopped(@NotNull RemoteElasticInstance instance)
Remove and EC2 instance from the "currently Running mapRemoteElasticInstance
restoreElasticAgent(@NotNull ElasticAgentDefinition elasticAgentDefinition, @Nullable ElasticTunnelDefinition elasticTunnelDefinition, @NotNull com.amazonaws.services.ec2.model.Instance instance, @NotNull RemoteElasticInstanceListener listener, @NotNull com.atlassian.aws.AWSAccount awsAccount, @NotNull AgentManager agentManager, @NotNull com.atlassian.aws.ec2.InstanceLaunchConfigurationBuilder instanceLaunchConfigurationBuilder)
After Bamboo server restart, reconnect to elastic agent.void
setTunnelTimeoutMinutes(int tunnelTimeoutMinutes)
boolean
validateAwsCredentials(com.atlassian.aws.ec2.awssdk.AwsSupportConstants.Region region, com.atlassian.aws.credentials.AWSCredentials awsCredentials, ErrorCollection errorCollection)
Validate supplied AWS credentials.boolean
validateAwsCredentials(com.atlassian.aws.ec2.awssdk.AwsSupportConstants.Region region, String awsAccessID, String awsSecretKey, ErrorCollection errorCollection)
Validate a set of supplied AWS credentials.
-
-
-
Constructor Detail
-
ElasticInstanceManagerImpl
public ElasticInstanceManagerImpl(AwsAccountBean awsAccountBean, AdministrationConfigurationAccessor administrationConfigurationAccessor, int startupTimeoutSeconds, ScheduledExecutorService executor, KeyStoreFactory keyStoreFactory, SSLContextFactory sslContextFactory, BootstrapManager bootstrapManager, ErrorHandler errorHandler, SpotInstanceConfigurationAccessor spotInstanceConfigurationAccessor, com.atlassian.event.api.EventPublisher eventPublisher, SecretEncryptionService secretEncryptionService)
-
-
Method Detail
-
newElasticAgent
public RemoteElasticInstance newElasticAgent(RemoteElasticInstanceListener listener, com.atlassian.aws.AWSAccount awsAccount, @NotNull @NotNull AgentManager agentManager, @NotNull @NotNull ElasticImageConfiguration elasticImageConfiguration, @NotNull @NotNull com.atlassian.aws.ec2.InstanceLaunchConfigurationBuilder instanceLaunchConfigurationBuilder) throws NoSuchAlgorithmException, KeyManagementException, IOException, CertificateException, UnrecoverableKeyException, KeyStoreException
- Specified by:
newElasticAgent
in interfaceElasticInstanceManager
- Throws:
NoSuchAlgorithmException
KeyManagementException
IOException
CertificateException
UnrecoverableKeyException
KeyStoreException
-
restoreElasticAgent
public RemoteElasticInstance restoreElasticAgent(@NotNull @NotNull ElasticAgentDefinition elasticAgentDefinition, @Nullable @Nullable ElasticTunnelDefinition elasticTunnelDefinition, @NotNull @NotNull com.amazonaws.services.ec2.model.Instance instance, @NotNull @NotNull RemoteElasticInstanceListener listener, @NotNull @NotNull com.atlassian.aws.AWSAccount awsAccount, @NotNull @NotNull AgentManager agentManager, @NotNull @NotNull com.atlassian.aws.ec2.InstanceLaunchConfigurationBuilder instanceLaunchConfigurationBuilder) throws Exception
Description copied from interface:ElasticInstanceManager
After Bamboo server restart, reconnect to elastic agent.- Specified by:
restoreElasticAgent
in interfaceElasticInstanceManager
- Throws:
Exception
-
ensureLoginKeyPairExists
public void ensureLoginKeyPairExists(com.atlassian.aws.AWSAccount awsAccount, String keyPair) throws com.atlassian.aws.AWSException
Description copied from interface:ElasticInstanceManager
Ensures that a key pair, named "elasticbamboo", has been defined in the configured AWS account.
- Specified by:
ensureLoginKeyPairExists
in interfaceElasticInstanceManager
- Parameters:
awsAccount
- that should contain the key pair- Throws:
com.atlassian.aws.AWSException
- if there is a problem communicating with EC2.
-
validateAwsCredentials
public boolean validateAwsCredentials(com.atlassian.aws.ec2.awssdk.AwsSupportConstants.Region region, String awsAccessID, String awsSecretKey, ErrorCollection errorCollection)
Description copied from interface:ElasticInstanceManager
Validate a set of supplied AWS credentials.
- Specified by:
validateAwsCredentials
in interfaceElasticInstanceManager
awsAccessID
- The Access ID of the Amazon Web Services AccountawsSecretKey
- The Secret Key of the Amazon Web Services AccounterrorCollection
- AnErrorCollection
to which validation errors should be added, ornull
if validation errors are not required.- Returns:
true
if the supplied credentials are successfully validated;false
otherwise.
-
validateAwsCredentials
public boolean validateAwsCredentials(com.atlassian.aws.ec2.awssdk.AwsSupportConstants.Region region, com.atlassian.aws.credentials.AWSCredentials awsCredentials, ErrorCollection errorCollection)
Description copied from interface:ElasticInstanceManager
Validate supplied AWS credentials.
- Specified by:
validateAwsCredentials
in interfaceElasticInstanceManager
awsCredentials
- Amazon Web Services Account credentialserrorCollection
- AnErrorCollection
to which validation errors should be added, ornull
if validation errors are not required.- Returns:
true
if the supplied credentials are successfully validated;false
otherwise.
-
getElasticRemoteAgents
@NotNull public @NotNull List<RemoteElasticInstance> getElasticRemoteAgents()
Description copied from interface:ElasticInstanceManager
Retrieve a readonly list of any currently existing EC2 instances- Specified by:
getElasticRemoteAgents
in interfaceElasticInstanceManager
- Returns:
- List of
RemoteElasticInstance
-
getElasticRemoteAgentsByConfiguration
@NotNull public @NotNull List<RemoteElasticInstance> getElasticRemoteAgentsByConfiguration(@NotNull @NotNull ElasticImageConfiguration elasticImageConfiguration)
- Specified by:
getElasticRemoteAgentsByConfiguration
in interfaceElasticInstanceManager
-
getElasticRemoteAgentsByConfiguration
@NotNull public @NotNull List<RemoteElasticInstance> getElasticRemoteAgentsByConfiguration(long id)
- Specified by:
getElasticRemoteAgentsByConfiguration
in interfaceElasticInstanceManager
-
getElasticRemoteAgentByInstanceId
@Nullable public @Nullable RemoteElasticInstance getElasticRemoteAgentByInstanceId(String instanceId)
Description copied from interface:ElasticInstanceManager
Retrieve elastic instance of the given ID.- Specified by:
getElasticRemoteAgentByInstanceId
in interfaceElasticInstanceManager
- Parameters:
instanceId
- of the instance- Returns:
- the elastic remote agent specific to the provided instance id
-
getRequestedElasticRemoteAgents
@NotNull public @NotNull List<RemoteElasticInstance> getRequestedElasticRemoteAgents()
Description copied from interface:ElasticInstanceManager
Returns the elastic instances which have been requested but not yet identified.- Specified by:
getRequestedElasticRemoteAgents
in interfaceElasticInstanceManager
- Returns:
- List of elastic instances which have been requested but not yet started up yet..
-
getStartingElasticInstances
@NotNull public @NotNull List<RemoteElasticInstance> getStartingElasticInstances()
Description copied from interface:ElasticInstanceManager
Return the elastic instances which have been identified but not started up yet, i.e. those instances that are IDENTIFIED pending to move to RUNNING state. The list does not include those instances that have been requested but not yet identified.- Specified by:
getStartingElasticInstances
in interfaceElasticInstanceManager
- Returns:
- List of elastic instances which have been requested and identified but not yet started up yet..
-
getInstancesWithStartingAgents
@NotNull public @NotNull List<RemoteElasticInstance> getInstancesWithStartingAgents()
Description copied from interface:ElasticInstanceManager
Returns those elastic instances that have already started but their agents have not yet connected to the bamboo server. Once the elastic instance is started it launches a bamboo agents that connects to the bamboo server. There is a period of time when the instance has already started (and therefore it is not returned byElasticInstanceManager.getRequestedElasticRemoteAgents()
) but the agent on the instance has not yet connected to the bamboo server. Elastic instances in such state are returned by this method and the list is a subset of the list returned byElasticInstanceManager.getElasticRemoteAgents()
.- Specified by:
getInstancesWithStartingAgents
in interfaceElasticInstanceManager
- Returns:
- List of
RemoteElasticInstance
-
getAllElasticRemoteAgents
public List<RemoteElasticInstance> getAllElasticRemoteAgents()
Description copied from interface:ElasticInstanceManager
Returns all elastic instances. It includes requested agents as well as active agents- Specified by:
getAllElasticRemoteAgents
in interfaceElasticInstanceManager
- Returns:
-
getAllElasticAgentsAsMap
public com.google.common.collect.SetMultimap<ElasticImageConfiguration,RemoteElasticInstance> getAllElasticAgentsAsMap()
Description copied from interface:ElasticInstanceManager
Returns all elastic instances in aSetMultimap
, keyed by theElasticImageConfiguration
- Specified by:
getAllElasticAgentsAsMap
in interfaceElasticInstanceManager
- Returns:
-
getTotalNumElasticRemoteAgents
public int getTotalNumElasticRemoteAgents()
Description copied from interface:ElasticInstanceManager
Return how many license spots are currently being occupied by elastic instances (pending and running)- Specified by:
getTotalNumElasticRemoteAgents
in interfaceElasticInstanceManager
- Returns:
- Number of license slots currently occupied by elastic instances (pending and running).
-
onInstanceIdentified
public void onInstanceIdentified(@NotNull @NotNull RemoteElasticInstance instance)
Description copied from interface:ElasticInstanceManager
Tell the manager that the instance is up and running- Specified by:
onInstanceIdentified
in interfaceElasticInstanceManager
- Parameters:
instance
- the instance identified
-
onInstanceRunning
public void onInstanceRunning(@NotNull @NotNull RemoteElasticInstance instance)
Description copied from interface:ElasticInstanceManager
Invoked when the instance enters the 'running' state- Specified by:
onInstanceRunning
in interfaceElasticInstanceManager
- Parameters:
instance
- the instance that entered running state
-
cancelSpotRequests
public boolean cancelSpotRequests(@NotNull @NotNull com.atlassian.aws.AWSAccount awsAccount)
Description copied from interface:ElasticInstanceManager
Cancel spot instance requests.- Specified by:
cancelSpotRequests
in interfaceElasticInstanceManager
- Parameters:
awsAccount
- account- Returns:
- true if at least one request was found and cancelled
-
registerElasticAgentStopped
public void registerElasticAgentStopped(@NotNull @NotNull RemoteElasticInstance instance)
Description copied from interface:ElasticInstanceManager
Remove and EC2 instance from the "currently Running map- Specified by:
registerElasticAgentStopped
in interfaceElasticInstanceManager
- Parameters:
instance
- - the one to be deleted from the map
-
addElasticLogEntry
public void addElasticLogEntry(org.apache.log4j.Logger log, String logEntry)
- Specified by:
addElasticLogEntry
in interfaceElasticInstanceManager
-
addElasticLogEntry
public void addElasticLogEntry(org.apache.logging.log4j.Logger log, String logEntry)
- Specified by:
addElasticLogEntry
in interfaceElasticInstanceManager
-
getElasticAgentLogs
public List<String> getElasticAgentLogs()
Description copied from interface:ElasticInstanceManager
Retrieve activity logs- Specified by:
getElasticAgentLogs
in interfaceElasticInstanceManager
- Returns:
- a copy of the current elastic agent logs
-
isElasticSupportEnabled
public boolean isElasticSupportEnabled()
- Specified by:
isElasticSupportEnabled
in interfaceElasticInstanceManager
- Returns:
- true, if elastic support is turned on
-
getAllowedInstanceTypes
@NotNull public @NotNull Set<com.atlassian.aws.ec2.EC2InstanceType> getAllowedInstanceTypes()
- Specified by:
getAllowedInstanceTypes
in interfaceElasticInstanceManager
- Returns:
- Set of allowed instance types.
-
getTunnelPort
public int getTunnelPort()
Description copied from interface:ElasticAgentTunnelPorts
The TCP port upon which Elastic Agents listens for incoming tunnel connections from the Bamboo Server.
- Specified by:
getTunnelPort
in interfaceElasticAgentTunnelPorts
-
getAgentSideHttpPort
public int getAgentSideHttpPort()
Description copied from interface:ElasticAgentTunnelPorts
The TCP port upon which the Elastic Agent listens for HTTP traffic intended for the Bamboo Server.
- Specified by:
getAgentSideHttpPort
in interfaceElasticAgentTunnelPorts
-
getAgentSideJmsPort
public int getAgentSideJmsPort()
Description copied from interface:ElasticAgentTunnelPorts
The TCP port upon which the Elastic Agent listens for JMS traffic intended for the Bamboo Server.
- Specified by:
getAgentSideJmsPort
in interfaceElasticAgentTunnelPorts
-
setTunnelTimeoutMinutes
public void setTunnelTimeoutMinutes(int tunnelTimeoutMinutes)
-
getInstanceLogs
@NotNull public @NotNull String getInstanceLogs(@NotNull @NotNull String instanceId) throws com.atlassian.aws.AWSException
Description copied from interface:ElasticInstanceManager
Fetch console output of a running EC2 instance.- Specified by:
getInstanceLogs
in interfaceElasticInstanceManager
- Parameters:
instanceId
- id of the instance- Returns:
- Logs from the instance, empty string if no logs were available.
- Throws:
com.atlassian.aws.AWSException
- if an error occurs while fetching the console output
-
isInstanceKnown
public boolean isInstanceKnown(@NotNull @NotNull String instanceId)
Description copied from interface:ElasticInstanceManager
Checks if an AWS instance with the given ID exists and is managed by this Bamboo server.- Specified by:
isInstanceKnown
in interfaceElasticInstanceManager
- Parameters:
instanceId
- id of the instance- Returns:
- true, if the instance exists and is managed by this Bamboo server
-
getBambooControlTag
public String getBambooControlTag()
Description copied from interface:ElasticInstanceManager
Returns the name of the security group used to indicate that this instance belongs to Bamboo.- Specified by:
getBambooControlTag
in interfaceElasticInstanceManager
-
-