nuget-feed/src/jetbrains/buildServer/nuget/feed/server/NuGetFeedParametersProvider.kt (111 lines of code) (raw):
package jetbrains.buildServer.nuget.feed.server
import jetbrains.buildServer.BuildAuthUtil
import jetbrains.buildServer.agent.AgentRuntimeProperties
import jetbrains.buildServer.nuget.common.NuGetServerConstants.*
import jetbrains.buildServer.nuget.feed.server.packages.NuGetRepository
import jetbrains.buildServer.parameters.ReferencesResolverUtil
import jetbrains.buildServer.serverSide.*
import jetbrains.buildServer.serverSide.auth.LoginConfiguration
import jetbrains.buildServer.serverSide.crypt.EncryptUtil
import jetbrains.buildServer.serverSide.packages.impl.RepositoryManager
import jetbrains.buildServer.serverSide.parameters.AbstractBuildParametersProvider
import jetbrains.buildServer.web.util.WebUtil
/**
* @author Eugene Petrenko (eugene.petrenko@gmail.com)
* Date: 07.10.11 17:52
*/
class NuGetFeedParametersProvider(private val mySettings: NuGetServerSettings,
private val myProjectManager: ProjectManager,
private val myRepositoryManager: RepositoryManager,
private val myLoginConfiguration: LoginConfiguration)
: AbstractBuildParametersProvider(), BuildStartContextProcessor {
override fun getParameters(build: SBuild, emulationMode: Boolean): Map<String, String> {
if (!mySettings.isNuGetServerEnabled) {
return emptyMap()
}
val properties = mutableMapOf<String, String>()
build.buildType?.let {
properties.putAll(getBuildTypeParameters(it))
}
if (build is SRunningBuild) {
if (isFallbackModeEnabled()) {
build.buildType?.let {
properties.putAll(getFallbackParameters(it))
}
}
val buildToken = String.format("%s:%s", BuildAuthUtil.makeUserId(build.getBuildId()), build.agentAccessCode)
properties[FEED_REFERENCE_AGENT_API_KEY_PROVIDED] = EncryptUtil.scramble(buildToken)
} else {
properties[FEED_REFERENCE_AGENT_API_KEY_PROVIDED] = ""
}
return properties
}
private fun isFallbackModeEnabled() =
TeamCityProperties.getBoolean(FEED_PARAMETERS_PROVIDER_ENABLE_FALLBACK_PARAMETERS_FOR_RUNNING_BUILD)
override fun getPrefix(): String {
if (isFallbackModeEnabled()) return ""
return FEED_REF_PREFIX
}
private val fallBackParamsMap = mapOf(
Pair("teamcity.nuget.feed.server", ReferencesResolverUtil.makeReference("teamcity.nuget.feed.guestAuth._Root.default.v2")),
Pair("teamcity.nuget.feed.auth.server", ReferencesResolverUtil.makeReference("teamcity.nuget.feed.httpAuth._Root.default.v2")),
Pair("system.teamcity.nuget.feed.auth.serverRootUrlBased.server", ReferencesResolverUtil.makeReference("teamcity.nuget.feed.httpAuth._Root.default.v2")),
)
override fun updateParameters(context: BuildStartContext) {
if (!mySettings.isNuGetServerEnabled) {
return
}
// we need to check whether there are parameter references to some obsolete parameters
// if there are such references and the parameters themselves are not defined explicitly
// then we need to add them with a reference to the new parameter name
val params = context.sharedParameters
val foundObsoleteParams = mutableSetOf<String>()
params.forEach { (key, value) ->
fallBackParamsMap.keys.forEach { obsoleteParamName ->
if (value.contains(ReferencesResolverUtil.makeReference(obsoleteParamName))) {
foundObsoleteParams.add(obsoleteParamName)
}
}
}
if (foundObsoleteParams.isEmpty()) return
foundObsoleteParams.forEach{ paramName ->
context.addSharedParameter(paramName, fallBackParamsMap[paramName]!!)
}
}
fun getBuildTypeParameters(buildType: SBuildType): Map<String, String> {
if (!mySettings.isNuGetServerEnabled) {
return emptyMap()
}
val parameters = mutableMapOf<String, String>()
val repositories = myRepositoryManager
.getRepositories(buildType.project, true)
.filterIsInstance<NuGetRepository>()
val authTypes = getAuthTypes()
repositories.forEach { repository ->
val project = myProjectManager.findProjectById(repository.projectId) ?: return@forEach
NuGetAPIVersion.values().forEach { version ->
val feedPath = NuGetUtils.getProjectFeedPath(project.externalId, repository.name, version)
authTypes.forEach { authType ->
val referenceName = NuGetUtils.getProjectFeedReference(
authType, project.externalId, repository.name, version
)
val reference = ReferencesResolverUtil.makeReference(AgentRuntimeProperties.TEAMCITY_SERVER_URL) +
WebUtil.combineContextPath("/$authType/", feedPath)
parameters[referenceName] = reference
}
}
}
return parameters
}
private fun getFallbackParameters(buildType: SBuildType): Map<String, String> {
val parameters = mutableMapOf<String, String>()
// Add fallback for global nuget feed parameters
buildType.undefinedParameters.let { undefinedParameters ->
fallBackParamsMap.forEach { (key, value) ->
if (undefinedParameters.contains(key)) {
parameters[key] = value
}
}
}
return parameters
}
private fun getAuthTypes() : Set<String> {
return if (myLoginConfiguration.isGuestLoginAllowed) {
setOf("httpAuth", "guestAuth")
} else {
setOf("httpAuth")
}
}
}