Skip to content

Commit

Permalink
feat: optimizing retrieval of jobs when using token to auth
Browse files Browse the repository at this point in the history
  • Loading branch information
tomasbjerre committed Apr 14, 2024
1 parent 026c2c8 commit 53825a1
Show file tree
Hide file tree
Showing 4 changed files with 106 additions and 22 deletions.
4 changes: 2 additions & 2 deletions logging.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Logging
handlers = java.util.logging.ConsoleHandler
org.jenkinsci.plugins.gwt.level = FINE
org.jenkinsci.plugins.gwt.level = FINEST

# Console Logging
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.level = FINEST
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.jenkinsci.plugins.gwt.jobfinder;

import hudson.triggers.Trigger;
import hudson.triggers.TriggerDescriptor;
import java.util.Map;
import org.jenkinsci.plugins.gwt.GenericTrigger;

public class GenericTriggerFinder {

Check warning on line 8 in src/main/java/org/jenkinsci/plugins/gwt/jobfinder/GenericTriggerFinder.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered line

Line 8 is not covered by tests
public static GenericTrigger findGenericTrigger(
final Map<TriggerDescriptor, Trigger<?>> triggers) {
if (triggers == null) {

Check warning on line 11 in src/main/java/org/jenkinsci/plugins/gwt/jobfinder/GenericTriggerFinder.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Partially covered line

Line 11 is only partially covered, one branch is missing
return null;

Check warning on line 12 in src/main/java/org/jenkinsci/plugins/gwt/jobfinder/GenericTriggerFinder.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered line

Line 12 is not covered by tests
}
for (final Trigger<?> candidate : triggers.values()) {

Check warning on line 14 in src/main/java/org/jenkinsci/plugins/gwt/jobfinder/GenericTriggerFinder.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Partially covered line

Line 14 is only partially covered, one branch is missing
if (candidate instanceof GenericTrigger) {

Check warning on line 15 in src/main/java/org/jenkinsci/plugins/gwt/jobfinder/GenericTriggerFinder.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Partially covered line

Line 15 is only partially covered, one branch is missing
return (GenericTrigger) candidate;
}
}
return null;

Check warning on line 19 in src/main/java/org/jenkinsci/plugins/gwt/jobfinder/GenericTriggerFinder.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered lines

Lines 18-19 are not covered by tests
}
}
19 changes: 2 additions & 17 deletions src/main/java/org/jenkinsci/plugins/gwt/jobfinder/JobFinder.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,8 @@
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Optional;
import hudson.model.Item;
import hudson.triggers.Trigger;
import hudson.triggers.TriggerDescriptor;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import jenkins.model.ParameterizedJobMixIn.ParameterizedJob;
Expand Down Expand Up @@ -40,7 +37,8 @@ public static List<FoundJob> findAllJobsWithTrigger(final String givenToken) {
final List<ParameterizedJob> candidateProjects =
jobFinderImpersonater.getAllParameterizedJobs(impersonate);
for (final ParameterizedJob candidateJob : candidateProjects) {
final GenericTrigger genericTriggerOpt = findGenericTrigger(candidateJob.getTriggers());
final GenericTrigger genericTriggerOpt =
GenericTriggerFinder.findGenericTrigger(candidateJob.getTriggers());
if (genericTriggerOpt != null) {
final String configuredToken =
determineTokenValue(
Expand Down Expand Up @@ -116,17 +114,4 @@ private static boolean authenticationTokenMatchesGeneric(
}
return false;
}

private static GenericTrigger findGenericTrigger(
final Map<TriggerDescriptor, Trigger<?>> triggers) {
if (triggers == null) {
return null;
}
for (final Trigger<?> candidate : triggers.values()) {
if (candidate instanceof GenericTrigger) {
return (GenericTrigger) candidate;
}
}
return null;
}
}
Original file line number Diff line number Diff line change
@@ -1,19 +1,47 @@
package org.jenkinsci.plugins.gwt.jobfinder;

import hudson.Extension;
import hudson.model.Item;
import hudson.model.listeners.ItemListener;
import hudson.security.ACL;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeSet;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import jenkins.model.Jenkins;
import jenkins.model.ParameterizedJobMixIn.ParameterizedJob;
import org.acegisecurity.context.SecurityContext;
import org.acegisecurity.context.SecurityContextHolder;

public class JobFinderImpersonater {
@Extension
public class JobFinderImpersonater extends ItemListener {
private static Logger LOGGER = Logger.getLogger(JobFinderImpersonater.class.getName());

public JobFinderImpersonater() {}
private static final Map<String, ParameterizedJob> JOBS_WITH_GWT = new ConcurrentHashMap<>();

public List<ParameterizedJob> getAllParameterizedJobs(final boolean impersonate) {
if (LOGGER.isLoggable(Level.FINEST)) {
LOGGER.finest("There are " + this.JOBS_WITH_GWT.size() + " jobs in cache:");
final TreeSet<String> sortedSet = new TreeSet<>(this.JOBS_WITH_GWT.keySet());
for (final String job : sortedSet) {
LOGGER.finest(" " + job);
}
}
if (impersonate) {
LOGGER.log(Level.FINE, "Using the cache");
return new ArrayList<>(this.JOBS_WITH_GWT.values());

Check warning on line 34 in src/main/java/org/jenkinsci/plugins/gwt/jobfinder/JobFinderImpersonater.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered lines

Lines 25-34 are not covered by tests
}
LOGGER.log(
Level.FINE,
"Not using the cache because jobs are not retreieved with impersonation SYSTEM. "
+ "SYSTEM is only impersonated when using a token."
+ " If SYSTEM is not impersonated, only jobs available for the currently authenticated user is found.");
return doGetAllParameterizedJobs(impersonate);
}

private static List<ParameterizedJob> doGetAllParameterizedJobs(final boolean impersonate) {
SecurityContext orig = null;
try {
if (impersonate) {
Expand All @@ -26,4 +54,54 @@ public List<ParameterizedJob> getAllParameterizedJobs(final boolean impersonate)
}
}
}

@Override
public void onLoaded() {
for (final ParameterizedJob job : doGetAllParameterizedJobs(true)) {

Check warning on line 60 in src/main/java/org/jenkinsci/plugins/gwt/jobfinder/JobFinderImpersonater.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Partially covered line

Line 60 is only partially covered, one branch is missing
this.putJob(job);
}

Check warning on line 62 in src/main/java/org/jenkinsci/plugins/gwt/jobfinder/JobFinderImpersonater.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered lines

Lines 61-62 are not covered by tests
LOGGER.info("Loaded " + this.JOBS_WITH_GWT.size() + " jobs in cache");
}

@Override
public void onUpdated(final Item job) {
this.putJob(job);
}

@Override
public void onCreated(final Item job) {
this.putJob(job);
}

@Override
public void onDeleted(final Item job) {
this.deleteJob(job);
}

@Override
public void onCopied(final Item src, final Item job) {
this.putJob(job);
}

@Override
public void onLocationChanged(
final Item item, final String oldFullName, final String newFullName) {
this.JOBS_WITH_GWT.remove(oldFullName);
this.putJob(item);
}

private void putJob(final Item job) {
if (job instanceof ParameterizedJob) {
final ParameterizedJob parameterizedJob = (ParameterizedJob) job;
final boolean hasGenericTrigger =
GenericTriggerFinder.findGenericTrigger(parameterizedJob.getTriggers()) != null;
if (hasGenericTrigger) {
this.JOBS_WITH_GWT.put(parameterizedJob.getFullName(), parameterizedJob);
}
}
}

private void deleteJob(final Item job) {
this.JOBS_WITH_GWT.remove(job.getFullName());
}

Check warning on line 106 in src/main/java/org/jenkinsci/plugins/gwt/jobfinder/JobFinderImpersonater.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered lines

Lines 68-106 are not covered by tests
}

0 comments on commit 53825a1

Please sign in to comment.