Cache the client connector too

Otherwise, we negotiate for a fresh token on each request
This commit is contained in:
Graham Christensen 2019-04-11 22:27:28 -04:00
parent c0f724f200
commit 6cce1a6e62
No known key found for this signature in database
GPG key ID: ACA1C1D120C83D5C
2 changed files with 21 additions and 22 deletions

View file

@ -8,7 +8,6 @@ use std::collections::HashMap;
use std::fs::File;
use std::io::Read;
use std::path::{Path, PathBuf};
use std::cell::RefCell;
use ofborg::acl;
#[derive(Serialize, Deserialize, Debug)]
@ -119,8 +118,8 @@ impl Config {
{
GithubAppVendingMachine {
conf: self.github_app.clone().unwrap(),
id_cache: RefCell::new(HashMap::new()),
client_cache: RefCell::new(HashMap::new()),
id_cache: HashMap::new(),
client_cache: HashMap::new(),
}
}
@ -168,16 +167,12 @@ pub fn load(filename: &Path) -> Config {
pub struct GithubAppVendingMachine {
conf: GithubAppConfig,
id_cache: RefCell<HashMap<(String, String), i32>>,
client_cache: RefCell<HashMap<i32, Github>>
id_cache: HashMap<(String, String), i32>,
client_cache: HashMap<i32, Github>,
}
impl GithubAppVendingMachine {
pub fn for_repo(&self, owner: &str, repo: &str) -> Result<Github, hubcaps::Error> {
let mut id_cache = self.id_cache.borrow_mut();
// !!! Cache clients so we don't look up new tokens all the time
let mut _client_cache = self.client_cache.borrow_mut();
pub fn for_repo<'a>(&'a mut self, owner: &str, repo: &str) -> Result<&'a Github, hubcaps::Error> {
let useragent = "github.com/grahamc/ofborg (app)";
let jwt = JWTCredentials::new(self.conf.app_id,
self.conf.private_key.clone());
@ -185,8 +180,8 @@ impl GithubAppVendingMachine {
let install_id: i32;
let key = (owner.to_owned(), repo.to_owned());
if id_cache.contains_key(&key) {
install_id = *id_cache.get(&key).unwrap();
if self.id_cache.contains_key(&key) {
install_id = *self.id_cache.get(&key).unwrap();
debug!("Found install ID for {:?} in cache", key);
} else {
info!("Looking up install ID for {}/{}", owner, repo);
@ -200,17 +195,22 @@ impl GithubAppVendingMachine {
install_id = lookup_gh
.app()
.find_repo_installation(owner, repo)?.id;
id_cache.insert(key, install_id);
self.id_cache.insert(key, install_id);
debug!("Received install ID {}", install_id);
}
Ok(Github::new(
useragent,
Client::with_connector(HttpsConnector::new(NativeTlsClient::new().unwrap())),
Credentials::InstallationToken(InstallationTokenGenerator::new(
install_id,
jwt
)),
))
if ! self.client_cache.contains_key(&install_id) {
let new_client = Github::new(
useragent,
Client::with_connector(HttpsConnector::new(NativeTlsClient::new().unwrap())),
Credentials::InstallationToken(InstallationTokenGenerator::new(
install_id,
jwt
)),
);
self.client_cache.insert(install_id, new_client);
}
Ok(self.client_cache.get(&install_id).unwrap())
}
}

View file

@ -5,7 +5,6 @@ use serde_json;
use amqp::protocol::basic::{BasicProperties, Deliver};
use chrono::{DateTime, Utc};
use hubcaps;
use hubcaps::checks::{CheckRunOptions, CheckRunState, Conclusion, Output};
use message::buildjob::{BuildJob, QueuedBuildJobs};
use ofborg::message::buildresult::{BuildResult, BuildStatus, LegacyBuildResult};