in aws-ecs-server/src/main/kotlin/jetbrains/buildServer/clouds/ecs/EcsCloudImageImpl.kt [231:275]
override fun startNewInstance(userData: CloudInstanceUserData): EcsCloudInstance {
if (!canStartNewInstanceWithDetails().isPositive) {
return BrokenEcsCloudInstance("cantStart", this, CloudErrorInfo("limit reached"))
}
val instanceId = generateNewInstanceId()
val startingInstance = StartingEcsCloudInstance(instanceId, this)
myIdToInstanceMap[instanceId] = startingInstance
LOG.debug("attempting to start new ECS instance with generated instanceId: $instanceId")
try {
val taskDefinition = apiConnector.describeTaskDefinition(taskDefinition) ?: throw CloudException("""Task definition $taskDefinition is missing""")
val additionalEnvironment = HashMap<String, String>()
additionalEnvironment[SERVER_UUID_ECS_ENV] = serverUUID
additionalEnvironment[SERVER_URL_ECS_ENV] = userData.serverAddress
additionalEnvironment[OFFICIAL_IMAGE_SERVER_URL_ECS_ENV] = userData.serverAddress
additionalEnvironment[PROFILE_ID_ECS_ENV] = userData.profileId
additionalEnvironment[IMAGE_ID_ECS_ENV] = id
additionalEnvironment[INSTANCE_ID_ECS_ENV] = instanceId
additionalEnvironment[AGENT_NAME_ECS_ENV] = generateAgentName(instanceId)
for (pair in userData.customAgentConfigurationParameters){
if (pair.key.equals(STARTING_INSTANCE_ID_CONFIG_PARAM)) {
additionalEnvironment[STARTING_INSTANCE_ID_ECS_ENV] = pair.value
} else {
additionalEnvironment[TEAMCITY_ECS_PROVIDED_PREFIX + pair.key] = pair.value
}
}
val tasks = apiConnector.runTask(launchType, taskDefinition, cluster, taskGroup, subnets, securityGroups,
assignPublicIp, additionalEnvironment, startedByTeamCity(serverUUID), fargatePlatformVersion)
LOG.info("Started ECS instance ${tasks[0].id}, generatedInstanceId: $instanceId")
val startedInstance = EcsCloudInstanceImpl(instanceId, this, tasks[0], apiConnector)
myIdToInstanceMap[instanceId] = startedInstance
if (startingInstance.terminateRequested){
startedInstance.terminate()
}
return startedInstance
} catch (ex: Throwable){
val errInstance = BrokenEcsCloudInstance(instanceId, this, CloudErrorInfo(ex.message.toString(), ex.message.toString(), ex))
myIdToInstanceMap[instanceId] = errInstance
errorInstances[instanceId] = Pair(errInstance, System.currentTimeMillis() + ERROR_INSTANCES_TIMEOUT)
muteTime.set(System.currentTimeMillis() + ERROR_INSTANCES_TIMEOUT)
return errInstance
}
}