Ensure we can construct remote store configs in isolation

Progress towards #10766

I thought that #10768 achieved, but when I went to use this stuff (in
Hydra), turns out it did not. (Those `using FooConfig;` lines were not
working --- they are so finicky!) This PR gets the job done, and adds
some trivial unit tests to make sure I did what I intended.

I had to add add a header to expose `SSHStoreConfig`, after which the
preexisting `ssh-store-config.*` were very confusingly named files, so I
renamed them to `common-ssh-store-config.hh` to match the type defined
therein.
This commit is contained in:
John Ericson 2024-07-15 13:13:11 -04:00
parent 846869da0e
commit 808082ea03
11 changed files with 120 additions and 26 deletions

View File

@ -143,6 +143,7 @@
''^src/libstore/common-protocol-impl\.hh$'' ''^src/libstore/common-protocol-impl\.hh$''
''^src/libstore/common-protocol\.cc$'' ''^src/libstore/common-protocol\.cc$''
''^src/libstore/common-protocol\.hh$'' ''^src/libstore/common-protocol\.hh$''
''^src/libstore/common-ssh-store-config\.hh$''
''^src/libstore/content-address\.cc$'' ''^src/libstore/content-address\.cc$''
''^src/libstore/content-address\.hh$'' ''^src/libstore/content-address\.hh$''
''^src/libstore/daemon\.cc$'' ''^src/libstore/daemon\.cc$''
@ -215,7 +216,6 @@
''^src/libstore/serve-protocol\.hh$'' ''^src/libstore/serve-protocol\.hh$''
''^src/libstore/sqlite\.cc$'' ''^src/libstore/sqlite\.cc$''
''^src/libstore/sqlite\.hh$'' ''^src/libstore/sqlite\.hh$''
''^src/libstore/ssh-store-config\.hh$''
''^src/libstore/ssh-store\.cc$'' ''^src/libstore/ssh-store\.cc$''
''^src/libstore/ssh\.cc$'' ''^src/libstore/ssh\.cc$''
''^src/libstore/ssh\.hh$'' ''^src/libstore/ssh\.hh$''

View File

@ -1,6 +1,6 @@
#include <regex> #include <regex>
#include "ssh-store-config.hh" #include "common-ssh-store-config.hh"
#include "ssh.hh" #include "ssh.hh"
namespace nix { namespace nix {

View File

@ -1,5 +1,5 @@
#include "legacy-ssh-store.hh" #include "legacy-ssh-store.hh"
#include "ssh-store-config.hh" #include "common-ssh-store-config.hh"
#include "archive.hh" #include "archive.hh"
#include "pool.hh" #include "pool.hh"
#include "remote-store.hh" #include "remote-store.hh"
@ -15,6 +15,15 @@
namespace nix { namespace nix {
LegacySSHStoreConfig::LegacySSHStoreConfig(
std::string_view scheme,
std::string_view authority,
const Params & params)
: StoreConfig(params)
, CommonSSHStoreConfig(scheme, authority, params)
{
}
std::string LegacySSHStoreConfig::doc() std::string LegacySSHStoreConfig::doc()
{ {
return return
@ -35,7 +44,7 @@ LegacySSHStore::LegacySSHStore(
const Params & params) const Params & params)
: StoreConfig(params) : StoreConfig(params)
, CommonSSHStoreConfig(scheme, host, params) , CommonSSHStoreConfig(scheme, host, params)
, LegacySSHStoreConfig(params) , LegacySSHStoreConfig(scheme, host, params)
, Store(params) , Store(params)
, connections(make_ref<Pool<Connection>>( , connections(make_ref<Pool<Connection>>(
std::max(1, (int) maxConnections), std::max(1, (int) maxConnections),

View File

@ -1,7 +1,7 @@
#pragma once #pragma once
///@file ///@file
#include "ssh-store-config.hh" #include "common-ssh-store-config.hh"
#include "store-api.hh" #include "store-api.hh"
#include "ssh.hh" #include "ssh.hh"
#include "callback.hh" #include "callback.hh"
@ -13,6 +13,11 @@ struct LegacySSHStoreConfig : virtual CommonSSHStoreConfig
{ {
using CommonSSHStoreConfig::CommonSSHStoreConfig; using CommonSSHStoreConfig::CommonSSHStoreConfig;
LegacySSHStoreConfig(
std::string_view scheme,
std::string_view authority,
const Params & params);
const Setting<Strings> remoteProgram{this, {"nix-store"}, "remote-program", const Setting<Strings> remoteProgram{this, {"nix-store"}, "remote-program",
"Path to the `nix-store` executable on the remote machine."}; "Path to the `nix-store` executable on the remote machine."};

View File

@ -162,6 +162,7 @@ sources = files(
'builtins/fetchurl.cc', 'builtins/fetchurl.cc',
'builtins/unpack-channel.cc', 'builtins/unpack-channel.cc',
'common-protocol.cc', 'common-protocol.cc',
'common-ssh-store-config.cc',
'content-address.cc', 'content-address.cc',
'daemon.cc', 'daemon.cc',
'derivations.cc', 'derivations.cc',
@ -206,7 +207,6 @@ sources = files(
'serve-protocol-connection.cc', 'serve-protocol-connection.cc',
'serve-protocol.cc', 'serve-protocol.cc',
'sqlite.cc', 'sqlite.cc',
'ssh-store-config.cc',
'ssh-store.cc', 'ssh-store.cc',
'ssh.cc', 'ssh.cc',
'store-api.cc', 'store-api.cc',
@ -233,6 +233,7 @@ headers = [config_h] + files(
'builtins/buildenv.hh', 'builtins/buildenv.hh',
'common-protocol-impl.hh', 'common-protocol-impl.hh',
'common-protocol.hh', 'common-protocol.hh',
'common-ssh-store-config.hh',
'content-address.hh', 'content-address.hh',
'daemon.hh', 'daemon.hh',
'derivations.hh', 'derivations.hh',
@ -272,11 +273,11 @@ headers = [config_h] + files(
'remote-store.hh', 'remote-store.hh',
's3-binary-cache-store.hh', 's3-binary-cache-store.hh',
's3.hh', 's3.hh',
'ssh-store.hh',
'serve-protocol-connection.hh', 'serve-protocol-connection.hh',
'serve-protocol-impl.hh', 'serve-protocol-impl.hh',
'serve-protocol.hh', 'serve-protocol.hh',
'sqlite.hh', 'sqlite.hh',
'ssh-store-config.hh',
'ssh.hh', 'ssh.hh',
'store-api.hh', 'store-api.hh',
'store-cast.hh', 'store-cast.hh',

View File

@ -1,7 +1,5 @@
#include "ssh-store-config.hh" #include "ssh-store.hh"
#include "store-api.hh"
#include "local-fs-store.hh" #include "local-fs-store.hh"
#include "remote-store.hh"
#include "remote-store-connection.hh" #include "remote-store-connection.hh"
#include "source-accessor.hh" #include "source-accessor.hh"
#include "archive.hh" #include "archive.hh"
@ -12,23 +10,22 @@
namespace nix { namespace nix {
struct SSHStoreConfig : virtual RemoteStoreConfig, virtual CommonSSHStoreConfig SSHStoreConfig::SSHStoreConfig(
std::string_view scheme,
std::string_view authority,
const Params & params)
: StoreConfig(params)
, RemoteStoreConfig(params)
, CommonSSHStoreConfig(scheme, authority, params)
{ {
using RemoteStoreConfig::RemoteStoreConfig; }
using CommonSSHStoreConfig::CommonSSHStoreConfig;
const Setting<Strings> remoteProgram{this, {"nix-daemon"}, "remote-program", std::string SSHStoreConfig::doc()
"Path to the `nix-daemon` executable on the remote machine."}; {
return
const std::string name() override { return "Experimental SSH Store"; } #include "ssh-store.md"
;
std::string doc() override }
{
return
#include "ssh-store.md"
;
}
};
class SSHStore : public virtual SSHStoreConfig, public virtual RemoteStore class SSHStore : public virtual SSHStoreConfig, public virtual RemoteStore
{ {
@ -41,7 +38,7 @@ public:
: StoreConfig(params) : StoreConfig(params)
, RemoteStoreConfig(params) , RemoteStoreConfig(params)
, CommonSSHStoreConfig(scheme, host, params) , CommonSSHStoreConfig(scheme, host, params)
, SSHStoreConfig(params) , SSHStoreConfig(scheme, host, params)
, Store(params) , Store(params)
, RemoteStore(params) , RemoteStore(params)
, master(createSSHMaster( , master(createSSHMaster(

28
src/libstore/ssh-store.hh Normal file
View File

@ -0,0 +1,28 @@
#pragma once
///@file
#include "common-ssh-store-config.hh"
#include "store-api.hh"
#include "remote-store.hh"
namespace nix {
struct SSHStoreConfig : virtual RemoteStoreConfig, virtual CommonSSHStoreConfig
{
using CommonSSHStoreConfig::CommonSSHStoreConfig;
using RemoteStoreConfig::RemoteStoreConfig;
SSHStoreConfig(std::string_view scheme, std::string_view authority, const Params & params);
const Setting<Strings> remoteProgram{
this, {"nix-daemon"}, "remote-program", "Path to the `nix-daemon` executable on the remote machine."};
const std::string name() override
{
return "Experimental SSH Store";
}
std::string doc() override;
};
}

View File

@ -0,0 +1,26 @@
#include <gtest/gtest.h>
#include "legacy-ssh-store.hh"
namespace nix {
TEST(LegacySSHStore, constructConfig)
{
LegacySSHStoreConfig config{
"ssh",
"localhost",
StoreConfig::Params{
{
"remote-program",
// TODO #11106, no more split on space
"foo bar",
},
}};
EXPECT_EQ(
config.remoteProgram.get(),
(Strings{
"foo",
"bar",
}));
}
}

View File

@ -58,6 +58,7 @@ sources = files(
'derivation.cc', 'derivation.cc',
'derived-path.cc', 'derived-path.cc',
'downstream-placeholder.cc', 'downstream-placeholder.cc',
'legacy-ssh-store.cc',
'machines.cc', 'machines.cc',
'nar-info-disk-cache.cc', 'nar-info-disk-cache.cc',
'nar-info.cc', 'nar-info.cc',
@ -67,6 +68,7 @@ sources = files(
'path.cc', 'path.cc',
'references.cc', 'references.cc',
'serve-protocol.cc', 'serve-protocol.cc',
'ssh-store.cc',
'store-reference.cc', 'store-reference.cc',
'worker-protocol.cc', 'worker-protocol.cc',
) )

View File

@ -0,0 +1,26 @@
#include <gtest/gtest.h>
#include "ssh-store.hh"
namespace nix {
TEST(SSHStore, constructConfig)
{
SSHStoreConfig config{
"ssh",
"localhost",
StoreConfig::Params{
{
"remote-program",
// TODO #11106, no more split on space
"foo bar",
},
}};
EXPECT_EQ(
config.remoteProgram.get(),
(Strings{
"foo",
"bar",
}));
}
}