aboutsummaryrefslogtreecommitdiff
path: root/zenserver/upstream
diff options
context:
space:
mode:
authorPer Larsson <[email protected]>2022-02-01 13:19:52 +0100
committerPer Larsson <[email protected]>2022-02-01 13:19:52 +0100
commit14b1cd4930f5bf94ddf0a6979097d27892497523 (patch)
treeed596aca1a53173aa723978a8bec31296e72c735 /zenserver/upstream
parentParital completed cloud cache token provider interface. (diff)
downloadzen-14b1cd4930f5bf94ddf0a6979097d27892497523.tar.xz
zen-14b1cd4930f5bf94ddf0a6979097d27892497523.zip
Refactored cloud cache access token provider.
Diffstat (limited to 'zenserver/upstream')
-rw-r--r--zenserver/upstream/jupiter.cpp48
-rw-r--r--zenserver/upstream/jupiter.h8
-rw-r--r--zenserver/upstream/upstreamapply.cpp8
-rw-r--r--zenserver/upstream/upstreamapply.h4
-rw-r--r--zenserver/upstream/upstreamcache.cpp8
-rw-r--r--zenserver/upstream/upstreamcache.h2
6 files changed, 50 insertions, 28 deletions
diff --git a/zenserver/upstream/jupiter.cpp b/zenserver/upstream/jupiter.cpp
index 86c7e1611..f141856c1 100644
--- a/zenserver/upstream/jupiter.cpp
+++ b/zenserver/upstream/jupiter.cpp
@@ -33,7 +33,15 @@ namespace detail {
{
CloudCacheSessionState(CloudCacheClient& Client) : m_Client(Client) {}
- const CloudCacheAccessToken& GetAccessToken() { return m_AccessToken; }
+ const CloudCacheAccessToken& GetAccessToken(bool RefreshToken)
+ {
+ if (RefreshToken)
+ {
+ m_AccessToken = m_Client.AcquireAccessToken();
+ }
+
+ return m_AccessToken;
+ }
cpr::Session& GetSession() { return m_Session; }
@@ -68,7 +76,9 @@ CloudCacheSession::~CloudCacheSession()
CloudCacheResult
CloudCacheSession::Authenticate()
{
- const CloudCacheAccessToken& AccessToken = GetAccessToken();
+ const bool RefreshToken = true;
+ const CloudCacheAccessToken& AccessToken = GetAccessToken(RefreshToken);
+
return {.Success = AccessToken.IsValid()};
}
@@ -679,9 +689,9 @@ CloudCacheSession::GetSession()
}
CloudCacheAccessToken
-CloudCacheSession::GetAccessToken()
+CloudCacheSession::GetAccessToken(bool RefreshToken)
{
- return m_SessionState->GetAccessToken();
+ return m_SessionState->GetAccessToken(RefreshToken);
}
bool
@@ -778,7 +788,7 @@ public:
virtual ~StaticTokenProvider() = default;
- virtual CloudCacheAccessToken GetAccessToken() final override { return m_Token; }
+ virtual CloudCacheAccessToken AcquireAccessToken() final override { return m_Token; }
private:
CloudCacheAccessToken m_Token;
@@ -802,12 +812,12 @@ public:
virtual ~OAuthClientCredentialsTokenProvider() = default;
- virtual CloudCacheAccessToken GetAccessToken() final override
+ virtual CloudCacheAccessToken AcquireAccessToken() final override
{
using namespace std::chrono;
std::string Body =
- fmt::format("client_id={}&scope=cache_access&grant_type=client_credentials&client_secret={k}", m_ClientId, m_ClientSecret);
+ fmt::format("client_id={}&scope=cache_access&grant_type=client_credentials&client_secret={}", m_ClientId, m_ClientSecret);
cpr::Response Response =
cpr::Post(cpr::Url{m_Url}, cpr::Header{{"Content-Type", "application/x-www-form-urlencoded"}}, cpr::Body{std::move(Body)});
@@ -844,13 +854,14 @@ CloudCacheTokenProvider::MakeFromOAuthClientCredentials(const OAuthClientCredent
return std::make_unique<OAuthClientCredentialsTokenProvider>(Params);
}
-CloudCacheClient::CloudCacheClient(const CloudCacheClientOptions& Options)
+CloudCacheClient::CloudCacheClient(CloudCacheClientOptions&& Options)
: m_Log(zen::logging::Get("jupiter"))
, m_ServiceUrl(Options.ServiceUrl)
, m_DdcNamespace(Options.DdcNamespace)
, m_BlobStoreNamespace(Options.BlobStoreNamespace)
, m_ConnectTimeout(Options.ConnectTimeout)
, m_Timeout(Options.Timeout)
+, m_TokenProvider(std::move(Options.TokenProvider))
{
}
@@ -869,7 +880,7 @@ CloudCacheClient::AcquireAccessToken()
{
ZEN_TRACE_CPU("HordeClient::AcquireAccessToken");
- return m_TokenProvider->GetAccessToken();
+ return m_TokenProvider->AcquireAccessToken();
}
detail::CloudCacheSessionState*
@@ -877,10 +888,18 @@ CloudCacheClient::AllocSessionState()
{
detail::CloudCacheSessionState* State = nullptr;
- if (RwLock::ExclusiveLockScope _(m_SessionStateLock); !m_SessionStateCache.empty())
+ bool IsTokenValid = false;
+
{
- State = m_SessionStateCache.front();
- m_SessionStateCache.pop_front();
+ RwLock::ExclusiveLockScope _(m_SessionStateLock);
+
+ if (m_SessionStateCache.empty() == false)
+ {
+ State = m_SessionStateCache.front();
+ IsTokenValid = State->m_AccessToken.IsValid();
+
+ m_SessionStateCache.pop_front();
+ }
}
if (State == nullptr)
@@ -890,6 +909,11 @@ CloudCacheClient::AllocSessionState()
State->Reset(m_ConnectTimeout, m_Timeout);
+ if (IsTokenValid == false)
+ {
+ State->m_AccessToken = m_TokenProvider->AcquireAccessToken();
+ }
+
return State;
}
diff --git a/zenserver/upstream/jupiter.h b/zenserver/upstream/jupiter.h
index 057488bcc..82b67b8e1 100644
--- a/zenserver/upstream/jupiter.h
+++ b/zenserver/upstream/jupiter.h
@@ -125,7 +125,7 @@ public:
private:
inline spdlog::logger& Log() { return m_Log; }
cpr::Session& GetSession();
- CloudCacheAccessToken GetAccessToken();
+ CloudCacheAccessToken GetAccessToken(bool RefreshToken = false);
bool VerifyAccessToken(long StatusCode);
CloudCacheResult CacheTypeExists(std::string_view TypeId, const IoHash& Key);
@@ -145,7 +145,7 @@ class CloudCacheTokenProvider
public:
virtual ~CloudCacheTokenProvider() = default;
- virtual CloudCacheAccessToken GetAccessToken() = 0;
+ virtual CloudCacheAccessToken AcquireAccessToken() = 0;
static std::unique_ptr<CloudCacheTokenProvider> MakeFromStaticToken(CloudCacheAccessToken Token);
@@ -177,7 +177,7 @@ struct CloudCacheClientOptions
class CloudCacheClient : public RefCounted
{
public:
- CloudCacheClient(const CloudCacheClientOptions& Options);
+ CloudCacheClient(CloudCacheClientOptions&& Options);
~CloudCacheClient();
CloudCacheAccessToken AcquireAccessToken();
@@ -191,12 +191,12 @@ public:
private:
spdlog::logger& m_Log;
- std::unique_ptr<CloudCacheTokenProvider> m_TokenProvider;
std::string m_ServiceUrl;
std::string m_DdcNamespace;
std::string m_BlobStoreNamespace;
std::chrono::milliseconds m_ConnectTimeout{};
std::chrono::milliseconds m_Timeout{};
+ std::unique_ptr<CloudCacheTokenProvider> m_TokenProvider;
bool m_IsValid = false;
RwLock m_SessionStateLock;
diff --git a/zenserver/upstream/upstreamapply.cpp b/zenserver/upstream/upstreamapply.cpp
index fe7f7d9c8..220daab27 100644
--- a/zenserver/upstream/upstreamapply.cpp
+++ b/zenserver/upstream/upstreamapply.cpp
@@ -48,13 +48,13 @@ namespace detail {
class HordeUpstreamApplyEndpoint final : public UpstreamApplyEndpoint
{
public:
- HordeUpstreamApplyEndpoint(const CloudCacheClientOptions& Options, CasStore& CasStore, CidStore& CidStore)
+ HordeUpstreamApplyEndpoint(CloudCacheClientOptions&& Options, CasStore& CasStore, CidStore& CidStore)
: m_Log(logging::Get("upstream-apply"))
, m_CasStore(CasStore)
, m_CidStore(CidStore)
{
m_DisplayName = fmt::format("Horde - '{}'", Options.ServiceUrl);
- m_Client = new CloudCacheClient(Options);
+ m_Client = new CloudCacheClient(std::move(Options));
m_ChannelId = fmt::format("zen-{}", zen::GetSessionIdString());
}
@@ -1561,9 +1561,9 @@ MakeUpstreamApply(const UpstreamApplyOptions& Options, CasStore& CasStore, CidSt
}
std::unique_ptr<UpstreamApplyEndpoint>
-MakeHordeUpstreamEndpoint(const CloudCacheClientOptions& Options, CasStore& CasStore, CidStore& CidStore)
+MakeHordeUpstreamEndpoint(CloudCacheClientOptions&& Options, CasStore& CasStore, CidStore& CidStore)
{
- return std::make_unique<detail::HordeUpstreamApplyEndpoint>(Options, CasStore, CidStore);
+ return std::make_unique<detail::HordeUpstreamApplyEndpoint>(std::move(Options), CasStore, CidStore);
}
} // namespace zen
diff --git a/zenserver/upstream/upstreamapply.h b/zenserver/upstream/upstreamapply.h
index ed73ec7f8..114364581 100644
--- a/zenserver/upstream/upstreamapply.h
+++ b/zenserver/upstream/upstreamapply.h
@@ -169,9 +169,7 @@ public:
std::unique_ptr<UpstreamApply> MakeUpstreamApply(const UpstreamApplyOptions& Options, CasStore& CasStore, CidStore& CidStore);
-std::unique_ptr<UpstreamApplyEndpoint> MakeHordeUpstreamEndpoint(const CloudCacheClientOptions& Options,
- CasStore& CasStore,
- CidStore& CidStore);
+std::unique_ptr<UpstreamApplyEndpoint> MakeHordeUpstreamEndpoint(CloudCacheClientOptions&& Options, CasStore& CasStore, CidStore& CidStore);
} // namespace zen
diff --git a/zenserver/upstream/upstreamcache.cpp b/zenserver/upstream/upstreamcache.cpp
index 44a8274da..f432d322c 100644
--- a/zenserver/upstream/upstreamcache.cpp
+++ b/zenserver/upstream/upstreamcache.cpp
@@ -85,7 +85,7 @@ namespace detail {
class JupiterUpstreamEndpoint final : public UpstreamEndpoint
{
public:
- JupiterUpstreamEndpoint(const CloudCacheClientOptions& Options, AuthMgr& Mgr)
+ JupiterUpstreamEndpoint(CloudCacheClientOptions&& Options, AuthMgr& Mgr)
: m_AuthMgr(Mgr)
, m_Log(zen::logging::Get("upstream"))
, m_UseLegacyDdc(Options.UseLegacyDdc)
@@ -93,7 +93,7 @@ namespace detail {
ZEN_ASSERT(!Options.Name.empty());
m_Info.Name = Options.Name;
m_Info.Url = Options.ServiceUrl;
- m_Client = new CloudCacheClient(Options);
+ m_Client = new CloudCacheClient(std::move(Options));
}
virtual ~JupiterUpstreamEndpoint() = default;
@@ -1490,9 +1490,9 @@ MakeUpstreamCache(const UpstreamCacheOptions& Options, ZenCacheStore& CacheStore
}
std::unique_ptr<UpstreamEndpoint>
-MakeJupiterUpstreamEndpoint(const CloudCacheClientOptions& Options, AuthMgr& Mgr)
+MakeJupiterUpstreamEndpoint(CloudCacheClientOptions&& Options, AuthMgr& Mgr)
{
- return std::make_unique<detail::JupiterUpstreamEndpoint>(Options, Mgr);
+ return std::make_unique<detail::JupiterUpstreamEndpoint>(std::move(Options), Mgr);
}
std::unique_ptr<UpstreamEndpoint>
diff --git a/zenserver/upstream/upstreamcache.h b/zenserver/upstream/upstreamcache.h
index 5bc9f58d7..8eb852c53 100644
--- a/zenserver/upstream/upstreamcache.h
+++ b/zenserver/upstream/upstreamcache.h
@@ -204,7 +204,7 @@ public:
std::unique_ptr<UpstreamCache> MakeUpstreamCache(const UpstreamCacheOptions& Options, ZenCacheStore& CacheStore, CidStore& CidStore);
-std::unique_ptr<UpstreamEndpoint> MakeJupiterUpstreamEndpoint(const CloudCacheClientOptions& Options, AuthMgr& Mgr);
+std::unique_ptr<UpstreamEndpoint> MakeJupiterUpstreamEndpoint(CloudCacheClientOptions&& Options, AuthMgr& Mgr);
std::unique_ptr<UpstreamEndpoint> MakeZenUpstreamEndpoint(const ZenStructuredCacheClientOptions& Options);