2017-05-02 13:17:37 +02:00
|
|
|
#pragma once
|
2023-03-31 23:18:41 -04:00
|
|
|
///@file
|
2017-05-02 13:17:37 +02:00
|
|
|
|
2024-07-12 15:37:54 +02:00
|
|
|
#include "ref.hh"
|
2024-01-23 15:36:03 -05:00
|
|
|
#include "store-reference.hh"
|
2017-05-02 13:17:37 +02:00
|
|
|
|
|
|
|
namespace nix {
|
|
|
|
|
2020-08-12 16:32:36 +00:00
|
|
|
class Store;
|
|
|
|
|
2024-05-22 23:12:23 -04:00
|
|
|
struct Machine;
|
|
|
|
|
|
|
|
typedef std::vector<Machine> Machines;
|
|
|
|
|
2017-05-02 13:17:37 +02:00
|
|
|
struct Machine {
|
|
|
|
|
2024-01-23 15:36:03 -05:00
|
|
|
const StoreReference storeUri;
|
2024-01-23 12:30:26 -05:00
|
|
|
const std::set<std::string> systemTypes;
|
2022-02-21 16:37:25 +01:00
|
|
|
const std::string sshKey;
|
2017-05-02 13:17:37 +02:00
|
|
|
const unsigned int maxJobs;
|
2024-01-24 01:03:07 -05:00
|
|
|
const float speedFactor;
|
2022-02-21 16:37:25 +01:00
|
|
|
const std::set<std::string> supportedFeatures;
|
|
|
|
const std::set<std::string> mandatoryFeatures;
|
2017-05-02 14:36:59 +02:00
|
|
|
const std::string sshPublicHostKey;
|
2017-05-02 13:17:37 +02:00
|
|
|
bool enabled = true;
|
|
|
|
|
2024-01-23 12:52:54 -05:00
|
|
|
/**
|
|
|
|
* @return Whether `system` is either `"builtin"` or in
|
|
|
|
* `systemTypes`.
|
|
|
|
*/
|
|
|
|
bool systemSupported(const std::string & system) const;
|
|
|
|
|
2024-01-23 12:50:48 -05:00
|
|
|
/**
|
|
|
|
* @return Whether `features` is a subset of the union of `supportedFeatures` and
|
|
|
|
* `mandatoryFeatures`
|
|
|
|
*/
|
2022-02-21 16:37:25 +01:00
|
|
|
bool allSupported(const std::set<std::string> & features) const;
|
2017-05-02 13:17:37 +02:00
|
|
|
|
2024-01-23 12:50:48 -05:00
|
|
|
/**
|
|
|
|
* @return @Whether `mandatoryFeatures` is a subset of `features`
|
|
|
|
*/
|
2022-02-21 16:37:25 +01:00
|
|
|
bool mandatoryMet(const std::set<std::string> & features) const;
|
2017-05-02 13:17:37 +02:00
|
|
|
|
2024-01-23 15:36:03 -05:00
|
|
|
Machine(
|
|
|
|
const std::string & storeUri,
|
2017-05-02 13:17:37 +02:00
|
|
|
decltype(systemTypes) systemTypes,
|
|
|
|
decltype(sshKey) sshKey,
|
|
|
|
decltype(maxJobs) maxJobs,
|
|
|
|
decltype(speedFactor) speedFactor,
|
|
|
|
decltype(supportedFeatures) supportedFeatures,
|
2017-05-02 14:36:59 +02:00
|
|
|
decltype(mandatoryFeatures) mandatoryFeatures,
|
|
|
|
decltype(sshPublicHostKey) sshPublicHostKey);
|
2020-08-12 16:32:36 +00:00
|
|
|
|
2024-01-23 15:36:03 -05:00
|
|
|
/**
|
|
|
|
* Elaborate `storeUri` into a complete store reference,
|
|
|
|
* incorporating information from the other fields of the `Machine`
|
|
|
|
* as applicable.
|
|
|
|
*/
|
|
|
|
StoreReference completeStoreReference() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Open a `Store` for this machine.
|
|
|
|
*
|
|
|
|
* Just a simple function composition:
|
|
|
|
* ```c++
|
|
|
|
* nix::openStore(completeStoreReference())
|
|
|
|
* ```
|
|
|
|
*/
|
2020-08-12 16:32:36 +00:00
|
|
|
ref<Store> openStore() const;
|
2017-05-02 13:17:37 +02:00
|
|
|
|
2024-05-22 23:12:23 -04:00
|
|
|
/**
|
|
|
|
* Parse a machine configuration.
|
|
|
|
*
|
|
|
|
* Every machine is specified on its own line, and lines beginning
|
|
|
|
* with `@` are interpreted as paths to other configuration files in
|
|
|
|
* the same format.
|
|
|
|
*/
|
|
|
|
static Machines parseConfig(const std::set<std::string> & defaultSystems, const std::string & config);
|
|
|
|
};
|
2017-05-02 13:17:37 +02:00
|
|
|
|
2024-05-22 23:12:23 -04:00
|
|
|
/**
|
|
|
|
* Parse machines from the global config
|
|
|
|
*
|
|
|
|
* @todo Remove, globals are bad.
|
|
|
|
*/
|
2017-05-02 13:44:10 +02:00
|
|
|
Machines getMachines();
|
|
|
|
|
2017-05-02 13:17:37 +02:00
|
|
|
}
|