1
1
Fork 0
mirror of https://github.com/NixOS/nix.git synced 2025-11-09 20:16:03 +01:00

Merge pull request #14295 from NixOS/s3-store-human-readable-uri

libstore: Implement getHumanReadableURI for S3BinaryCacheStoreConfig
This commit is contained in:
Sergei Zimmerman 2025-10-23 19:33:49 +00:00 committed by GitHub
commit b9af19cedf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 28 additions and 10 deletions

View file

@ -21,8 +21,6 @@ struct S3BinaryCacheStoreConfig : HttpBinaryCacheStoreConfig
Nix uses the `default` profile. Nix uses the `default` profile.
)"}; )"};
public:
const Setting<std::string> region{ const Setting<std::string> region{
this, this,
"us-east-1", "us-east-1",
@ -63,6 +61,12 @@ public:
> addressing instead of virtual host based addressing. > addressing instead of virtual host based addressing.
)"}; )"};
/**
* Set of settings that are part of the S3 URI itself.
* These are needed for region specification and other S3-specific settings.
*/
const std::set<const AbstractSetting *> s3UriSettings = {&profile, &region, &scheme, &endpoint};
static const std::string name() static const std::string name()
{ {
return "S3 Binary Cache Store"; return "S3 Binary Cache Store";
@ -71,6 +75,8 @@ public:
static StringSet uriSchemes(); static StringSet uriSchemes();
static std::string doc(); static std::string doc();
std::string getHumanReadableURI() const override;
}; };
} // namespace nix } // namespace nix

View file

@ -1,10 +1,10 @@
#include "nix/store/s3-binary-cache-store.hh" #include "nix/store/s3-binary-cache-store.hh"
#include <cassert>
#include "nix/store/http-binary-cache-store.hh" #include "nix/store/http-binary-cache-store.hh"
#include "nix/store/store-registration.hh" #include "nix/store/store-registration.hh"
#include <cassert>
#include <ranges>
namespace nix { namespace nix {
StringSet S3BinaryCacheStoreConfig::uriSchemes() StringSet S3BinaryCacheStoreConfig::uriSchemes()
@ -17,19 +17,31 @@ S3BinaryCacheStoreConfig::S3BinaryCacheStoreConfig(
: StoreConfig(params) : StoreConfig(params)
, HttpBinaryCacheStoreConfig(scheme, _cacheUri, params) , HttpBinaryCacheStoreConfig(scheme, _cacheUri, params)
{ {
// For S3 stores, preserve S3-specific query parameters as part of the URL
// These are needed for region specification and other S3-specific settings
assert(cacheUri.query.empty()); assert(cacheUri.query.empty());
assert(cacheUri.scheme == "s3");
// Only copy S3-specific parameters to the URL query
static const std::set<std::string> s3Params = {"region", "endpoint", "profile", "scheme"};
for (const auto & [key, value] : params) { for (const auto & [key, value] : params) {
if (s3Params.contains(key)) { auto s3Params =
std::views::transform(s3UriSettings, [](const AbstractSetting * setting) { return setting->name; });
if (std::ranges::contains(s3Params, key)) {
cacheUri.query[key] = value; cacheUri.query[key] = value;
} }
} }
} }
std::string S3BinaryCacheStoreConfig::getHumanReadableURI() const
{
auto reference = getReference();
reference.params = [&]() {
Params relevantParams;
for (auto & setting : s3UriSettings)
if (setting->overridden)
relevantParams.insert({setting->name, reference.params.at(setting->name)});
return relevantParams;
}();
return reference.render();
}
std::string S3BinaryCacheStoreConfig::doc() std::string S3BinaryCacheStoreConfig::doc()
{ {
return R"( return R"(