diff --git a/docs/nix/options/flake-module.nix b/docs/nix/options/flake-module.nix index ed70300d9..bbfa17476 100644 --- a/docs/nix/options/flake-module.nix +++ b/docs/nix/options/flake-module.nix @@ -30,7 +30,7 @@ { imports = [ serviceModule - ../../../lib/inventory/distributed-service/service-module.nix + ../../../lib/modules/inventory/distributed-service/service-module.nix ]; } ]; @@ -124,7 +124,7 @@ _file = "docs flake-module"; imports = [ { _module.args = { inherit clanLib; }; } - (import ../../../lib/inventory/build-inventory/roles-interface.nix { + (import ../../../lib/modules/inventoryClass/roles-interface.nix { nestedSettingsOption = mkOption { type = types.raw; description = '' @@ -154,7 +154,7 @@ _file = "docs mkScope"; } { noInstanceOptions = true; } - ../../../lib/inventory/build-inventory/interface.nix + ../../../lib/modules/inventoryClass/interface.nix ] ++ mapAttrsToList fakeInstanceOptions modules; urlPrefix = "https://github.com/nix-community/dream2nix/blob/main/"; }; diff --git a/lib/default.nix b/lib/default.nix index b5cdd5eaa..073c6407f 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -38,10 +38,10 @@ lib.fix (clanLib: { }).config.result.api.schema; # ------------------------------------ # ClanLib functions - evalClan = clanLib.callLib ./inventory/eval-clan-modules { }; + evalClan = clanLib.callLib ./modules/inventory/eval-clan-modules { }; buildClanModule = clanLib.callLib ./modules { }; - inventory = clanLib.callLib ./inventory { }; - modules = clanLib.callLib ./inventory/frontmatter { }; + inventory = clanLib.callLib ./modules/inventory { }; + modules = clanLib.callLib ./modules/inventory/frontmatter { }; test = clanLib.callLib ./test { }; # Custom types types = clanLib.callLib ./types { }; diff --git a/lib/flake-module.nix b/lib/flake-module.nix index ed5a2f21f..9cf0bb96f 100644 --- a/lib/flake-module.nix +++ b/lib/flake-module.nix @@ -10,7 +10,7 @@ rec { ./modules/flake-module.nix ./clanTest/flake-module.nix ./introspection/flake-module.nix - ./inventory/flake-module.nix + ./modules/inventory/flake-module.nix ./jsonschema/flake-module.nix ./types/flake-module.nix ]; diff --git a/lib/inventory/README.md b/lib/inventory/README.md deleted file mode 100644 index 4776a3883..000000000 --- a/lib/inventory/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# Inventory - -The inventory is our concept for distributed services. Users can configure multiple machines with minimal effort. - -- The inventory acts as a declarative source of truth for all machine configurations. -- Users can easily add or remove machines to/from services. -- Ensures that all machines and services are configured consistently, across multiple nixosConfigs. -- Defaults and predefined roles in our modules minimizes the need for manual configuration. - -Open questions: - -- [ ] How do we set default role, description and other metadata? - - It must be accessible from Python. - - It must set the value in the module system. - -- [ ] Inventory might use assertions. Should each machine inherit the inventory assertions ? - -- [ ] Is the service config interface the same as the module config interface ? - -- [ ] As a user do I want to see borgbackup as the high level category? - - -Architecture - -``` -nixosConfig < machine_module < inventory ---------------------------------------------- -nixos < borgbackup <- inventory <-> UI - - creates the config Maps from high level services to the borgbackup clan module - for ONE machine Inventory is completely serializable. - UI can interact with the inventory to define machines, and services - Defining Users is out of scope for the first prototype. -``` - -## Provides a specification for the inventory - -It is used for design phase and as validation helper. - -> Cue is less verbose and easier to understand and maintain than json-schema. -> Json-schema, if needed can be easily generated on-the fly. - -## Checking validity - -Directly check a json against the schema - -`cue vet inventory.json root.cue -d '#Root'` - -## Json schema - -Export the json-schema i.e. for usage in python / javascript / nix - -`cue export --out openapi root.cue` - -## Usage - -Comments are rendered as descriptions in the json schema. - -```cue -// A name of the clan (primarily shown by the UI) -name: string -``` - -Cue open sets. In the following `foo = {...}` means that the key `foo` can contain any arbitrary json object. - -```cue -foo: { ... } -``` - -Cue dynamic keys. - -```cue -[string]: { - attr: string -} -``` - -This is the schema of - -```json -{ - "a": { - "attr": "foo" - }, - "b": { - "attr": "bar" - } - // ... Indefinitely more dynamic keys of type "string" -} -``` diff --git a/lib/modules/clan/computed-tags.nix b/lib/modules/clan/computed-tags.nix index 36eba2c5c..528336f56 100644 --- a/lib/modules/clan/computed-tags.nix +++ b/lib/modules/clan/computed-tags.nix @@ -9,7 +9,7 @@ { machines, ... }: { # Only compute the default value - # The option MUST be defined in ./build-inventory/interface.nix + # The option MUST be defined in inventoryClass/interface.nix all = lib.mkDefault (builtins.attrNames machines); nixos = lib.mkDefault ( builtins.attrNames (lib.filterAttrs (_n: m: m.machineClass == "nixos") machines) diff --git a/lib/modules/clan/interface.nix b/lib/modules/clan/interface.nix index 6ecf2d8da..1c637d308 100644 --- a/lib/modules/clan/interface.nix +++ b/lib/modules/clan/interface.nix @@ -104,7 +104,7 @@ in _module.args = { inherit clanLib; }; _file = "clan interface"; } - ../../inventory/build-inventory/interface.nix + ../inventoryClass/interface.nix ]; }; description = '' @@ -120,7 +120,7 @@ in Global information about the clan. ''; type = types.deferredModuleWith { - staticModules = [ ../../inventory/build-inventory/meta-interface.nix ]; + staticModules = [ ../inventoryClass/meta-interface.nix ]; }; default = { }; }; diff --git a/lib/modules/clan/module.nix b/lib/modules/clan/module.nix index bbe93afc1..de5a88d3a 100644 --- a/lib/modules/clan/module.nix +++ b/lib/modules/clan/module.nix @@ -42,38 +42,6 @@ let ); inherit (clan-core) clanLib; - inventoryClass = - let - localModuleSet = - lib.filterAttrs (n: _: !inventory._legacyModules ? ${n}) inventory.modules // config.modules; - flakeInputs = config.self.inputs; - in - { - _module.args = { - inherit clanLib; - }; - imports = [ - ../../inventory/build-inventory/builder/default.nix - (lib.modules.importApply ../../inventory/build-inventory/service-list-from-inputs.nix { - inherit localModuleSet flakeInputs clanLib; - }) - { - inherit inventory directory; - } - ( - { config, ... }: - { - distributedServices = clanLib.inventory.mapInstances { - inherit (config) inventory; - inherit localModuleSet flakeInputs; - prefix = [ "distributedServices" ]; - }; - machines = config.distributedServices.allMachines; - } - ) - ../../inventory/build-inventory/inventory-introspection.nix - ]; - }; moduleSystemConstructor = { # TODO: remove default system once we have a hardware-config mechanism @@ -81,7 +49,7 @@ let darwin = nix-darwin.lib.darwinSystem; }; - allMachines = inventoryClass.machines; # <- inventory.machines <- clan.machines + allMachines = config.clanInternals.inventoryClass.machines; # <- inventory.machines <- clan.machines machineClasses = lib.mapAttrs ( name: _: inventory.machines.${name}.machineClass or "nixos" @@ -238,7 +206,7 @@ in networking.hostName = lib.mkDefault name; } ) - ) inventoryClass.machines) + ) config.clanInternals.inventoryClass.machines) # The user can define some machine config here # i.e. 'clan.machines.jon = ...' @@ -260,7 +228,39 @@ in inherit darwinConfigurations; clanInternals = { - inherit inventoryClass; + inventoryClass = + let + localModuleSet = + lib.filterAttrs (n: _: !inventory._legacyModules ? ${n}) inventory.modules // config.modules; + flakeInputs = config.self.inputs; + in + { + _module.args = { + inherit clanLib; + }; + imports = [ + ../inventoryClass/builder/default.nix + (lib.modules.importApply ../inventoryClass/service-list-from-inputs.nix { + inherit localModuleSet flakeInputs clanLib; + }) + { + inherit inventory directory; + } + ( + { config, ... }: + { + distributedServices = clanLib.inventory.mapInstances { + inherit (config) inventory; + inherit localModuleSet flakeInputs; + prefix = [ "distributedServices" ]; + }; + machines = config.distributedServices.allMachines; + } + ) + ../inventoryClass/inventory-introspection.nix + ]; + }; + # TODO: remove this after a month or so # This is here for backwards compatibility for older CLI versions inventory = config.inventory; diff --git a/lib/inventory/constraints/default.nix b/lib/modules/inventory/constraints/default.nix similarity index 100% rename from lib/inventory/constraints/default.nix rename to lib/modules/inventory/constraints/default.nix diff --git a/lib/inventory/constraints/interface.nix b/lib/modules/inventory/constraints/interface.nix similarity index 100% rename from lib/inventory/constraints/interface.nix rename to lib/modules/inventory/constraints/interface.nix diff --git a/lib/inventory/default.nix b/lib/modules/inventory/default.nix similarity index 90% rename from lib/inventory/default.nix rename to lib/modules/inventory/default.nix index 894116451..b01368955 100644 --- a/lib/inventory/default.nix +++ b/lib/modules/inventory/default.nix @@ -4,11 +4,11 @@ let in { inherit (services) evalClanService mapInstances resolveModule; - inherit (import ./build-inventory { inherit lib clanLib; }) buildInventory; + inherit (import ../inventoryClass { inherit lib clanLib; }) buildInventory; interface = { - _file = "inventory/default.nix"; + _file = "clanLib.inventory.interface"; imports = [ - ./build-inventory/interface.nix + ../inventoryClass/interface.nix ]; _module.args = { inherit clanLib; }; }; diff --git a/lib/inventory/distributed-service/api-feature.nix b/lib/modules/inventory/distributed-service/api-feature.nix similarity index 100% rename from lib/inventory/distributed-service/api-feature.nix rename to lib/modules/inventory/distributed-service/api-feature.nix diff --git a/lib/inventory/distributed-service/flake-module.nix b/lib/modules/inventory/distributed-service/flake-module.nix similarity index 100% rename from lib/inventory/distributed-service/flake-module.nix rename to lib/modules/inventory/distributed-service/flake-module.nix diff --git a/lib/inventory/distributed-service/inventory-adapter.nix b/lib/modules/inventory/distributed-service/inventory-adapter.nix similarity index 100% rename from lib/inventory/distributed-service/inventory-adapter.nix rename to lib/modules/inventory/distributed-service/inventory-adapter.nix diff --git a/lib/inventory/distributed-service/manifest/default.nix b/lib/modules/inventory/distributed-service/manifest/default.nix similarity index 100% rename from lib/inventory/distributed-service/manifest/default.nix rename to lib/modules/inventory/distributed-service/manifest/default.nix diff --git a/lib/inventory/distributed-service/service-module.nix b/lib/modules/inventory/distributed-service/service-module.nix similarity index 100% rename from lib/inventory/distributed-service/service-module.nix rename to lib/modules/inventory/distributed-service/service-module.nix diff --git a/lib/inventory/distributed-service/tests/default.nix b/lib/modules/inventory/distributed-service/tests/default.nix similarity index 100% rename from lib/inventory/distributed-service/tests/default.nix rename to lib/modules/inventory/distributed-service/tests/default.nix diff --git a/lib/inventory/distributed-service/tests/import_module_spec.nix b/lib/modules/inventory/distributed-service/tests/import_module_spec.nix similarity index 100% rename from lib/inventory/distributed-service/tests/import_module_spec.nix rename to lib/modules/inventory/distributed-service/tests/import_module_spec.nix diff --git a/lib/inventory/distributed-service/tests/nested_services/default.nix b/lib/modules/inventory/distributed-service/tests/nested_services/default.nix similarity index 100% rename from lib/inventory/distributed-service/tests/nested_services/default.nix rename to lib/modules/inventory/distributed-service/tests/nested_services/default.nix diff --git a/lib/inventory/distributed-service/tests/nested_services/multi_import_duplication.nix b/lib/modules/inventory/distributed-service/tests/nested_services/multi_import_duplication.nix similarity index 100% rename from lib/inventory/distributed-service/tests/nested_services/multi_import_duplication.nix rename to lib/modules/inventory/distributed-service/tests/nested_services/multi_import_duplication.nix diff --git a/lib/inventory/distributed-service/tests/nested_services/multi_machine.nix b/lib/modules/inventory/distributed-service/tests/nested_services/multi_machine.nix similarity index 100% rename from lib/inventory/distributed-service/tests/nested_services/multi_machine.nix rename to lib/modules/inventory/distributed-service/tests/nested_services/multi_machine.nix diff --git a/lib/inventory/distributed-service/tests/nested_services/simple.nix b/lib/modules/inventory/distributed-service/tests/nested_services/simple.nix similarity index 100% rename from lib/inventory/distributed-service/tests/nested_services/simple.nix rename to lib/modules/inventory/distributed-service/tests/nested_services/simple.nix diff --git a/lib/inventory/distributed-service/tests/per_instance_args.nix b/lib/modules/inventory/distributed-service/tests/per_instance_args.nix similarity index 100% rename from lib/inventory/distributed-service/tests/per_instance_args.nix rename to lib/modules/inventory/distributed-service/tests/per_instance_args.nix diff --git a/lib/inventory/distributed-service/tests/per_machine_args.nix b/lib/modules/inventory/distributed-service/tests/per_machine_args.nix similarity index 100% rename from lib/inventory/distributed-service/tests/per_machine_args.nix rename to lib/modules/inventory/distributed-service/tests/per_machine_args.nix diff --git a/lib/inventory/eval-clan-modules/default.nix b/lib/modules/inventory/eval-clan-modules/default.nix similarity index 100% rename from lib/inventory/eval-clan-modules/default.nix rename to lib/modules/inventory/eval-clan-modules/default.nix diff --git a/lib/inventory/flake-module.nix b/lib/modules/inventory/flake-module.nix similarity index 100% rename from lib/inventory/flake-module.nix rename to lib/modules/inventory/flake-module.nix diff --git a/lib/inventory/frontmatter/default.nix b/lib/modules/inventory/frontmatter/default.nix similarity index 100% rename from lib/inventory/frontmatter/default.nix rename to lib/modules/inventory/frontmatter/default.nix diff --git a/lib/inventory/frontmatter/interface.nix b/lib/modules/inventory/frontmatter/interface.nix similarity index 100% rename from lib/inventory/frontmatter/interface.nix rename to lib/modules/inventory/frontmatter/interface.nix diff --git a/lib/inventory/schemas/default.nix b/lib/modules/inventory/schemas/default.nix similarity index 97% rename from lib/inventory/schemas/default.nix rename to lib/modules/inventory/schemas/default.nix index 9c725db3a..bbb3af493 100644 --- a/lib/inventory/schemas/default.nix +++ b/lib/modules/inventory/schemas/default.nix @@ -19,7 +19,7 @@ let frontMatterSchema = jsonLib.parseOptions self.clanLib.modules.frontmatterOptions { }; inventorySchema = jsonLib.parseModule ({ - imports = [ ../build-inventory/interface.nix ]; + imports = [ ../../inventoryClass/interface.nix ]; _module.args = { inherit (self) clanLib; }; }); diff --git a/lib/inventory/schemas/render_schema.py b/lib/modules/inventory/schemas/render_schema.py similarity index 100% rename from lib/inventory/schemas/render_schema.py rename to lib/modules/inventory/schemas/render_schema.py diff --git a/lib/inventory/tests/default.nix b/lib/modules/inventory/tests/default.nix similarity index 100% rename from lib/inventory/tests/default.nix rename to lib/modules/inventory/tests/default.nix diff --git a/lib/inventory/tests/legacyModule/README.md b/lib/modules/inventory/tests/legacyModule/README.md similarity index 100% rename from lib/inventory/tests/legacyModule/README.md rename to lib/modules/inventory/tests/legacyModule/README.md diff --git a/lib/inventory/tests/legacyModule/roles/default.nix b/lib/modules/inventory/tests/legacyModule/roles/default.nix similarity index 100% rename from lib/inventory/tests/legacyModule/roles/default.nix rename to lib/modules/inventory/tests/legacyModule/roles/default.nix diff --git a/lib/inventory/build-inventory/assertions.nix b/lib/modules/inventoryClass/assertions.nix similarity index 100% rename from lib/inventory/build-inventory/assertions.nix rename to lib/modules/inventoryClass/assertions.nix diff --git a/lib/inventory/build-inventory/builder/default.nix b/lib/modules/inventoryClass/builder/default.nix similarity index 100% rename from lib/inventory/build-inventory/builder/default.nix rename to lib/modules/inventoryClass/builder/default.nix diff --git a/lib/inventory/build-inventory/builder/interface.nix b/lib/modules/inventoryClass/builder/interface.nix similarity index 100% rename from lib/inventory/build-inventory/builder/interface.nix rename to lib/modules/inventoryClass/builder/interface.nix diff --git a/lib/inventory/build-inventory/builder/roles.nix b/lib/modules/inventoryClass/builder/roles.nix similarity index 100% rename from lib/inventory/build-inventory/builder/roles.nix rename to lib/modules/inventoryClass/builder/roles.nix diff --git a/lib/inventory/build-inventory/default.nix b/lib/modules/inventoryClass/default.nix similarity index 100% rename from lib/inventory/build-inventory/default.nix rename to lib/modules/inventoryClass/default.nix diff --git a/lib/inventory/build-inventory/interface.nix b/lib/modules/inventoryClass/interface.nix similarity index 100% rename from lib/inventory/build-inventory/interface.nix rename to lib/modules/inventoryClass/interface.nix diff --git a/lib/inventory/build-inventory/inventory-introspection.nix b/lib/modules/inventoryClass/inventory-introspection.nix similarity index 100% rename from lib/inventory/build-inventory/inventory-introspection.nix rename to lib/modules/inventoryClass/inventory-introspection.nix diff --git a/lib/inventory/build-inventory/meta-interface.nix b/lib/modules/inventoryClass/meta-interface.nix similarity index 100% rename from lib/inventory/build-inventory/meta-interface.nix rename to lib/modules/inventoryClass/meta-interface.nix diff --git a/lib/inventory/build-inventory/roles-interface.nix b/lib/modules/inventoryClass/roles-interface.nix similarity index 100% rename from lib/inventory/build-inventory/roles-interface.nix rename to lib/modules/inventoryClass/roles-interface.nix diff --git a/lib/inventory/build-inventory/service-list-from-inputs.nix b/lib/modules/inventoryClass/service-list-from-inputs.nix similarity index 100% rename from lib/inventory/build-inventory/service-list-from-inputs.nix rename to lib/modules/inventoryClass/service-list-from-inputs.nix