lib/confctl/machine.rb in confctl-1.0.0 vs lib/confctl/machine.rb in confctl-2.0.0

- old
+ new

@@ -1,28 +1,116 @@ module ConfCtl class Machine - attr_reader :name, :safe_name, :managed, :spin, :opts + CarriedMachine = Struct.new( + :carrier, + :name, + :alias, + :attribute, + keyword_init: true + ) + # @return [String] + attr_reader :name + + # @return [String] + attr_reader :safe_name + + # @return [Boolean] + attr_reader :managed + + # @return [String] + attr_reader :spin + + # @return [String] + attr_reader :carrier_name + + # @return [String] + attr_reader :cluster_name + + # @return [String] + attr_reader :safe_cluster_name + + # Alias for this machine on the carrier + # @return [String] + attr_reader :carried_alias + + # Alias for this machine on the carrier + # @return [String] + attr_reader :safe_carried_alias + + # @return [Hash] machine metadata + attr_reader :meta + # @param opts [Hash] - def initialize(opts) - @opts = opts + # @param machine_list [MachineList] + def initialize(opts, machine_list:) + @meta = opts['metaConfig'] @name = opts['name'] - @safe_name = opts['name'].gsub('/', ':') - @managed = opts['managed'] - @spin = opts['spin'] + @safe_name = name.gsub('/', ':') + @managed = meta['managed'] + @spin = meta['spin'] + @is_carrier = meta.fetch('carrier', {}).fetch('enable', false) + @carrier_name = opts['carrier'] + @cluster_name = opts['clusterName'] + @safe_cluster_name = cluster_name.gsub('/', ':') + @carried_alias = opts['alias'] || @cluster_name + @safe_carried_alias = @carried_alias.gsub('/', ':') + @machine_list = machine_list end + # True if this machine carries other machines + def carrier? + @is_carrier + end + + # @return [Array<CarriedMachine>] + def carried_machines + meta.fetch('carrier', {}).fetch('machines', []).map do |m| + CarriedMachine.new( + carrier: self, + name: m['machine'], + alias: m['alias'] || m['machine'], + attribute: m['attribute'] + ) + end + end + + # True if this machine is on a carrier + def carried? + !@carrier_name.nil? + end + + # @return [Machine] carrier + def carrier_machine + carrier = @machine_list[@carrier_name] + + if carrier.nil? + raise "Carrier #{@carrier_name} not found in machine list" + end + + carrier + end + def target_host - (opts['host'] && opts['host']['target']) || name + meta.fetch('host', {}).fetch('target', name) end def localhost? target_host == 'localhost' end + # @return [String] path to nix-env managed profile + def profile + if carried? + "/nix/var/nix/profiles/confctl-#{safe_carried_alias}" + else + '/nix/var/nix/profiles/system' + end + end + def nix_paths - opts['nix']['nixPath'].to_h do |v| + meta['nix']['nixPath'].to_h do |v| eq = v.index('=') raise "'#{v}' is not a valid nix path entry " if eq.nil? [v[0..eq - 1], v[eq + 1..]] end @@ -31,11 +119,11 @@ def health_checks return @health_checks if @health_checks @health_checks = [] - opts['healthChecks'].each do |type, checks| + meta['healthChecks'].each do |type, checks| case type when 'systemd' next if !checks['enable'] || spin != 'nixos' if checks['systemProperties'].any? @@ -74,14 +162,16 @@ @health_checks end def [](key) if key.index('.') - get(opts, key.split('.')) + get(meta, key.split('.')) + elsif key == 'name' + name elsif key == 'checks' health_checks.length else - opts[key] + meta[key] end end def to_s name