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