2017-05-02 14:17:37 +03:00
|
|
|
#pragma once
|
2023-04-01 06:18:41 +03:00
|
|
|
///@file
|
2017-05-02 14:17:37 +03:00
|
|
|
|
2024-07-12 16:37:54 +03:00
|
|
|
#include "ref.hh"
|
2024-01-23 22:36:03 +02:00
|
|
|
#include "store-reference.hh"
|
2017-05-02 14:17:37 +03:00
|
|
|
|
|
|
|
namespace nix {
|
|
|
|
|
2020-08-12 19:32:36 +03:00
|
|
|
class Store;
|
|
|
|
|
2024-05-23 06:12:23 +03:00
|
|
|
struct Machine;
|
|
|
|
|
|
|
|
typedef std::vector<Machine> Machines;
|
|
|
|
|
2017-05-02 14:17:37 +03:00
|
|
|
struct Machine {
|
|
|
|
|
2024-01-23 22:36:03 +02:00
|
|
|
const StoreReference storeUri;
|
2024-01-23 19:30:26 +02:00
|
|
|
const std::set<std::string> systemTypes;
|
2022-02-21 17:37:25 +02:00
|
|
|
const std::string sshKey;
|
2017-05-02 14:17:37 +03:00
|
|
|
const unsigned int maxJobs;
|
2024-01-24 08:03:07 +02:00
|
|
|
const float speedFactor;
|
2022-02-21 17:37:25 +02:00
|
|
|
const std::set<std::string> supportedFeatures;
|
|
|
|
const std::set<std::string> mandatoryFeatures;
|
2017-05-02 15:36:59 +03:00
|
|
|
const std::string sshPublicHostKey;
|
2017-05-02 14:17:37 +03:00
|
|
|
bool enabled = true;
|
|
|
|
|
2024-01-23 19:52:54 +02:00
|
|
|
/**
|
|
|
|
* @return Whether `system` is either `"builtin"` or in
|
|
|
|
* `systemTypes`.
|
|
|
|
*/
|
|
|
|
bool systemSupported(const std::string & system) const;
|
|
|
|
|
2024-01-23 19:50:48 +02:00
|
|
|
/**
|
|
|
|
* @return Whether `features` is a subset of the union of `supportedFeatures` and
|
|
|
|
* `mandatoryFeatures`
|
|
|
|
*/
|
2022-02-21 17:37:25 +02:00
|
|
|
bool allSupported(const std::set<std::string> & features) const;
|
2017-05-02 14:17:37 +03:00
|
|
|
|
2024-01-23 19:50:48 +02:00
|
|
|
/**
|
|
|
|
* @return @Whether `mandatoryFeatures` is a subset of `features`
|
|
|
|
*/
|
2022-02-21 17:37:25 +02:00
|
|
|
bool mandatoryMet(const std::set<std::string> & features) const;
|
2017-05-02 14:17:37 +03:00
|
|
|
|
2024-01-23 22:36:03 +02:00
|
|
|
Machine(
|
|
|
|
const std::string & storeUri,
|
2017-05-02 14:17:37 +03:00
|
|
|
decltype(systemTypes) systemTypes,
|
|
|
|
decltype(sshKey) sshKey,
|
|
|
|
decltype(maxJobs) maxJobs,
|
|
|
|
decltype(speedFactor) speedFactor,
|
|
|
|
decltype(supportedFeatures) supportedFeatures,
|
2017-05-02 15:36:59 +03:00
|
|
|
decltype(mandatoryFeatures) mandatoryFeatures,
|
|
|
|
decltype(sshPublicHostKey) sshPublicHostKey);
|
2020-08-12 19:32:36 +03:00
|
|
|
|
2024-01-23 22:36:03 +02: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 19:32:36 +03:00
|
|
|
ref<Store> openStore() const;
|
2017-05-02 14:17:37 +03:00
|
|
|
|
2024-05-23 06:12:23 +03: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 14:17:37 +03:00
|
|
|
|
2024-05-23 06:12:23 +03:00
|
|
|
/**
|
|
|
|
* Parse machines from the global config
|
|
|
|
*
|
|
|
|
* @todo Remove, globals are bad.
|
|
|
|
*/
|
2017-05-02 14:44:10 +03:00
|
|
|
Machines getMachines();
|
|
|
|
|
2017-05-02 14:17:37 +03:00
|
|
|
}
|