Add feature-complete /domain/clock support

Feature reference: https://libvirt.org/formatdomain.html#time-keeping
This commit is contained in:
Bart Kus
2023-01-25 22:33:20 -08:00
parent 6b907ab6e0
commit 78e46979e0
7 changed files with 68 additions and 9 deletions

View File

@@ -36,7 +36,11 @@ module VagrantPlugins
@nodeset = config.nodeset
@features = config.features
@features_hyperv = config.features_hyperv
@clock_absolute = config.clock_absolute
@clock_adjustment = config.clock_adjustment
@clock_basis = config.clock_basis
@clock_offset = config.clock_offset
@clock_timezone = config.clock_timezone
@clock_timers = config.clock_timers
@launchsecurity_data = config.launchsecurity_data
@shares = config.shares
@@ -236,7 +240,15 @@ module VagrantPlugins
env[:ui].info(" -- Feature (HyperV): name=#{feature[:name]}, state=#{feature[:state]}")
end
end
env[:ui].info(" -- Clock offset: #{@clock_offset}")
if not @clock_absolute.nil?
env[:ui].info(" -- Clock absolute: #{@clock_absolute}")
elsif not @clock_adjustment.nil?
env[:ui].info(" -- Clock adjustment: #{@clock_adjustment}")
elsif not @clock_timezone.nil?
env[:ui].info(" -- Clock timezone: #{@clock_timezone}")
else
env[:ui].info(" -- Clock offset: #{@clock_offset}")
end
@clock_timers.each do |timer|
env[:ui].info(" -- Clock timer: #{timer.map { |k,v| "#{k}=#{v}"}.join(', ')}")
end

View File

@@ -166,12 +166,29 @@ module VagrantPlugins
xml_descr.delete_element('/domain/cpu')
end
# Clock
# Clock - can change in complicated ways, so just build a new clock and compare
newclock = REXML::Element.new('newclock')
if not config.clock_absolute.nil?
newclock.add_attribute('offset', 'absolute')
newclock.add_attribute('start', config.clock_absolute)
elsif not config.clock_adjustment.nil?
newclock.add_attribute('offset', 'variable')
newclock.add_attribute('basis', config.clock_basis)
newclock.add_attribute('adjustment', config.clock_adjustment)
elsif not config.clock_timezone.nil?
newclock.add_attribute('offset', 'timezone')
newclock.add_attribute('timezone', config.clock_timezone)
else
newclock.add_attribute('offset', config.clock_offset)
end
clock = REXML::XPath.first(xml_descr, '/domain/clock')
if clock.attributes['offset'] != config.clock_offset
@logger.debug "clock offset changed"
if clock.attributes != newclock.attributes
@logger.debug "clock definition changed"
descr_changed = true
clock.attributes['offset'] = config.clock_offset
clock.attributes.clear
newclock.attributes.each do |attr, value|
clock.add_attribute(attr, value)
end
end
# clock timers - because timers can be added/removed, just rebuild and then compare

View File

@@ -98,7 +98,11 @@ module VagrantPlugins
attr_accessor :shares
attr_accessor :features
attr_accessor :features_hyperv
attr_accessor :clock_absolute
attr_accessor :clock_adjustment
attr_accessor :clock_basis
attr_accessor :clock_offset
attr_accessor :clock_timezone
attr_accessor :clock_timers
attr_accessor :launchsecurity_data
attr_accessor :numa_nodes
@@ -278,7 +282,11 @@ module VagrantPlugins
@shares = UNSET_VALUE
@features = UNSET_VALUE
@features_hyperv = UNSET_VALUE
@clock_absolute = UNSET_VALUE
@clock_adjustment = UNSET_VALUE
@clock_basis = UNSET_VALUE
@clock_offset = UNSET_VALUE
@clock_timezone = UNSET_VALUE
@clock_timers = []
@launchsecurity_data = UNSET_VALUE
@numa_nodes = UNSET_VALUE
@@ -1002,7 +1010,11 @@ module VagrantPlugins
@shares = nil if @shares == UNSET_VALUE
@features = ['acpi','apic','pae'] if @features == UNSET_VALUE
@features_hyperv = [] if @features_hyperv == UNSET_VALUE
@clock_absolute = nil if @clock_absolute == UNSET_VALUE
@clock_adjustment = nil if @clock_adjustment == UNSET_VALUE
@clock_basis = 'utc' if @clock_basis == UNSET_VALUE
@clock_offset = 'utc' if @clock_offset == UNSET_VALUE
@clock_timezone = nil if @clock_timezone == UNSET_VALUE
@clock_timers = [] if @clock_timers == UNSET_VALUE
@launchsecurity_data = nil if @launchsecurity_data == UNSET_VALUE
@numa_nodes = @numa_nodes == UNSET_VALUE ? nil : _generate_numa

View File

@@ -132,7 +132,15 @@
</hyperv>
<%- end -%>
</features>
<%- if not @clock_absolute.nil? -%>
<clock offset='absolute' start='<%= @clock_absolute %>'>
<%- elsif not @clock_adjustment.nil? -%>
<clock offset='variable' basis='<%= @clock_basis %>' adjustment='<%= @clock_adjustment %>'>
<%- elsif not @clock_timezone.nil? -%>
<clock offset='timezone' timezone='<%= @clock_timezone %>'>
<%- else -%>
<clock offset='<%= @clock_offset %>'>
<%- end -%>
<%- @clock_timers.each do |clock_timer| -%>
<timer<% clock_timer.each do |attr, value| %> <%= attr %>='<%= value %>'<% end %>/>
<%- end -%>