in rest-api/src/jetbrains/buildServer/server/rest/model/agent/Agent.java [144:291]
public Agent(@NotNull final SBuildAgent agent, final @NotNull Fields fields, @NotNull final BeanContext beanContext) {
final int agentId = agent.getId();
final boolean unknownAgent = agentId == UNKNOWN_AGENT_ID;
name = ValueWithDefault.decideIncludeByDefault(fields.isIncluded("name"), agent.getName());
typeId = ValueWithDefault.decideIncludeByDefault(fields.isIncluded("typeId"), agent.getAgentTypeId());
if (!unknownAgent) {
id = ValueWithDefault.decideIncludeByDefault(fields.isIncluded("id"), agentId);
href = ValueWithDefault.decideDefault(fields.isIncluded("href"), beanContext.getApiUrlBuilder().getHref(agent));
connected = ValueWithDefault.decideIncludeByDefault(fields.isIncluded("connected", false), agent.isRegistered());
enabled = ValueWithDefault.decideIncludeByDefault(fields.isIncluded("enabled", false), agent.isEnabled());
authorized = ValueWithDefault.decideIncludeByDefault(fields.isIncluded("authorized", false), agent.isAuthorized());
build = ValueWithDefault.decideDefault(fields.isIncluded("build", false), () -> {
SRunningBuild runningBuild = agent.getRunningBuild();
if (runningBuild == null) return null;
try {
beanContext.getSingletonService(PermissionChecker.class).checkPermission(Permission.VIEW_PROJECT, runningBuild.getBuildPromotion());
return new Build(runningBuild, fields.getNestedField("build"), beanContext);
} catch (AuthorizationFailedException e) {
return Build.getNoPermissionsBuild(runningBuild, fields.getNestedField("build"),
beanContext); //should probably include "empty" build node instead so that it's clear some build is running
}
});
}
boolean hasMeaningfulData = !unknownAgent ||
!(((BuildAgentEx)agent).getAgentType() instanceof DummyAgentType); //agent type is still in the system
//check permission to match UI
if (hasMeaningfulData) {
if (AuthUtil.canViewAgentDetails(beanContext.getSingletonService(PermissionChecker.class).getCurrent(), agent)) {
WebLinks webLinks = beanContext.getSingletonService(WebLinks.class);
webUrl = ValueWithDefault.decideDefault(fields.isIncluded("webUrl", true), () -> webLinks.getAgentUrl(agent, agent.getAgentTypeId()));
links = ValueWithDefault.decideDefault(fields.isIncluded("links", false, false), () -> {
Links.LinksBuilder builder = new Links.LinksBuilder();
String absoluteUrl = webLinks.getAgentUrl(agent, agent.getAgentTypeId());
String relativeUrl = new RelativeWebLinks().getAgentUrl(agent, agent.getAgentTypeId());
if (absoluteUrl != null && relativeUrl != null) {
builder.add(Link.WEB_VIEW_TYPE, absoluteUrl, relativeUrl);
}
return builder.build(fields.getNestedField("links"));
});
environment = ValueWithDefault.decideDefaultIgnoringAccessDenied(
fields.isIncluded("environment", false, false),
() -> new Environment(agent, fields.getNestedField("environment", Fields.NONE, Fields.LONG))
);
if (!unknownAgent) {
uptodate = ValueWithDefault.decideIncludeByDefault(fields.isIncluded("uptodate", false), !agent.isOutdated() && !agent.isPluginsOutdated());
outdated = ValueWithDefault.decideIncludeByDefault(fields.isIncluded("outdated", false, false), agent::isOutdated);
pluginsOutdated = ValueWithDefault.decideIncludeByDefault(fields.isIncluded("pluginsOutdated", false, false), agent::isPluginsOutdated);
javaOutdated = ValueWithDefault
.decideIncludeByDefault(fields.isIncluded("javaOutdated", false, false), () -> AgentUpgradeUtil.isAgentUsesOldJava(((BuildAgentEx)agent).getAgentType()));
host = ValueWithDefault.decideDefault(fields.isIncluded("host", false), agent::getHostName);
cpuRank = ValueWithDefault.decideDefault(fields.isIncluded("cpuRank", false), agent::getCpuBenchmarkIndex);
port = ValueWithDefault.decideDefault(fields.isIncluded("port", false), agent::getPort);
ip = ValueWithDefault.decideDefaultIgnoringAccessDenied(fields.isIncluded("ip", false), () -> {
final String hostAddress = agent.getHostAddress();
return DeadAgent.NA.equals(hostAddress) ? null : hostAddress;
});
protocol = ValueWithDefault.decideDefaultIgnoringAccessDenied(fields.isIncluded("protocol", false, false), () -> getAgentProtocol(agent));
version = ValueWithDefault.decideDefault(fields.isIncluded("version", false, false), agent::getVersion);
currentAgentVersion = ValueWithDefault.decideDefault(fields.isIncluded("currentAgentVersion", false, false), ((BuildAgentEx)agent)::getCurrentAgentVersion);
lastActivityTime = ValueWithDefault.decideDefault(fields.isIncluded("lastActivityTime", false, false),
() -> Util.formatTime(agent.getLastCommunicationTimestamp()));
idleSinceTime = ValueWithDefault.decideDefault(fields.isIncluded("idleSinceTime", false, false),
() -> {
long idleTime = agent.getIdleTime();
return idleTime <= 0 ? null : Util.formatTime(new Date(Dates.now().getTime() - idleTime));
});
disconnectionComment = ValueWithDefault.decideDefault(fields.isIncluded("disconnectionComment", false, false),
agent::getUnregistrationComment);
registrationTimestamp = ValueWithDefault.decideDefault(fields.isIncluded("registrationTimestamp", false, false),
() -> Util.formatTime(agent.getRegistrationTimestamp()));
enabledInfo = ValueWithDefault.decideIncludeByDefault(fields.isIncluded("enabledInfo", false),
() -> new AgentEnabledInfo(agent, fields.getNestedField("enabledInfo", Fields.NONE, Fields.LONG), beanContext));
authorizedInfo = ValueWithDefault.decideIncludeByDefault(fields.isIncluded("authorizedInfo", false),
() -> new AgentAuthorizedInfo(agent, fields.getNestedField("authorizedInfo", Fields.NONE, Fields.LONG),
beanContext));
//TODO: review, if it should return all parameters on agent, use #getDefinedParameters()
properties = ValueWithDefault.decideDefaultIgnoringAccessDenied(fields.isIncluded("properties", false), () -> new Properties(agent.getAvailableParameters(), null, fields
.getNestedField("properties", Fields.NONE, Fields.LONG), beanContext));
cloudInstance = ValueWithDefault.decideDefaultIgnoringAccessDenied(fields.isIncluded("cloudInstance", false, false),
() -> {
try {
return new CloudInstance(
beanContext.getSingletonService(CloudInstanceFinder.class)
.getItem(CloudInstanceFinder.getLocator(agent)),
fields.getNestedField("cloudInstance"), beanContext);
} catch (NotFoundException e) {
return null;
}
});
cloudImage = ValueWithDefault.decideDefaultIgnoringAccessDenied(fields.isIncluded("cloudImage", false, false), () -> {
try {
if (!agent.isCloudAgent()) {
return null;
} else {
return new CloudImage(beanContext.getSingletonService(CloudImageFinder.class).getItem(CloudImageFinder.getLocator(agent)), fields.getNestedField("cloudImage"), beanContext);
}
} catch (Exception e) {
LOGGER.warnAndDebugDetails("Unable to get the cloud image for agent " + LogUtil.describe(agent), e);
return null;
}
});
compatibilityPolicy = ValueWithDefault.decideDefaultIgnoringAccessDenied(fields.isIncluded(COMPATIBILITY_POLICY, false, false),
() -> CompatibilityPolicy
.getCompatibilityPolicy(agent, fields.getNestedField(COMPATIBILITY_POLICY), beanContext));
compatibleBuildTypes = ValueWithDefault.decideDefault(
fields.isIncluded(COMPATIBLE_BUILD_TYPES, false, false),
() -> resolveCompatibleBuildTypes(agent, fields.getNestedField(COMPATIBLE_BUILD_TYPES), beanContext)
);
incompatibleBuildTypes = ValueWithDefault.decideDefault(fields.isIncluded(INCOMPATIBLE_BUILD_TYPES, false, false),
() -> new Compatibilities(AgentFinder.getIncompatible(agent, null, beanContext.getServiceLocator()), agent, null,
fields.getNestedField(INCOMPATIBLE_BUILD_TYPES), beanContext));
}
}
builds = ValueWithDefault.decideDefault(fields.isIncluded("builds", false, false),
() -> {
Fields nestedFields = fields.getNestedField("builds", Fields.NONE, Fields.SHORT);
String locator = Locator.merge(nestedFields.getLocator(),
LocatorUtil.setDimension(BuildPromotionFinder.getLocator(agent), PagerData.COUNT, "1"));
return Builds.createFromPrefilteredBuildPromotions(
beanContext.getServiceLocator().getSingletonService(BuildPromotionFinder.class).getItems(locator).getEntries(),
new SinglePagePagerData(BuildRequest.getHref(locator)), fields, beanContext);
});
if (!unknownAgent) {
pool = ValueWithDefault.decideDefault(fields.isIncluded("pool", false),
() -> new AgentPool(beanContext.getSingletonService(AgentPoolFinder.class).getAgentPool(agent), fields.getNestedField("pool"),
beanContext));
}
}
}