override fun startNewInstance()

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
        }
    }