libvirt_ffi 0.6.1 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/tests.yml +26 -0
- data/.gitignore +2 -1
- data/.rspec +1 -0
- data/.rubocop.yml +1 -1
- data/Gemfile +7 -10
- data/README.md +2 -2
- data/Rakefile +3 -8
- data/lib/libvirt/base_info.rb +8 -0
- data/lib/libvirt/connection.rb +228 -69
- data/lib/libvirt/domain.rb +18 -0
- data/lib/libvirt/ffi/domain.rb +53 -41
- data/lib/libvirt/ffi/host.rb +78 -39
- data/lib/libvirt/ffi/interface.rb +175 -0
- data/lib/libvirt/ffi/network.rb +392 -0
- data/lib/libvirt/ffi/storage.rb +1 -1
- data/lib/libvirt/ffi.rb +2 -0
- data/lib/libvirt/host_callback_storage.rb +10 -2
- data/lib/libvirt/interface.rb +92 -0
- data/lib/libvirt/loggable.rb +58 -0
- data/lib/libvirt/network.rb +176 -0
- data/lib/libvirt/network_dhcp_lease.rb +20 -0
- data/lib/libvirt/storage_pool.rb +2 -2
- data/lib/libvirt/util.rb +87 -64
- data/lib/libvirt/version.rb +1 -1
- data/lib/libvirt/xml/generic.rb +8 -5
- data/lib/libvirt/xml/interface.rb +79 -0
- data/lib/libvirt/xml/ip_address.rb +51 -0
- data/lib/libvirt/xml/network.rb +204 -0
- data/lib/libvirt/xml.rb +6 -2
- data/lib/libvirt.rb +18 -16
- data/libvirt.gemspec +11 -13
- metadata +14 -26
- data/.travis.yml +0 -6
- data/test_usage/support/libvirt_async.rb +0 -536
- data/test_usage/support/log_formatter.rb +0 -33
- data/test_usage/test_domain.rb +0 -43
- data/test_usage/test_event_loop.rb +0 -185
- data/test_usage/test_libvirtd_restart.rb +0 -63
- data/test_usage/test_metadata.rb +0 -104
- data/test_usage/test_screenshot.rb +0 -197
- data/test_usage/test_storage.rb +0 -52
@@ -1,185 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# frozen_string_literal: true
|
3
|
-
|
4
|
-
require 'bundler/setup'
|
5
|
-
require 'libvirt'
|
6
|
-
require 'logger'
|
7
|
-
require 'active_support/all'
|
8
|
-
require 'async'
|
9
|
-
require 'get_process_mem'
|
10
|
-
require 'gc_tracer'
|
11
|
-
|
12
|
-
require_relative 'support/libvirt_async'
|
13
|
-
require_relative 'support/log_formatter'
|
14
|
-
|
15
|
-
GC::Tracer.start_logging(
|
16
|
-
nil,
|
17
|
-
gc_stat: false,
|
18
|
-
gc_latest_gc_info: false,
|
19
|
-
rusage: false,
|
20
|
-
events: [:end_mark, :end_sweep]
|
21
|
-
)
|
22
|
-
|
23
|
-
Libvirt.logger = Logger.new(STDOUT, formatter: LogFormatter.new)
|
24
|
-
Libvirt.logger.level = ENV['DEBUG'] ? :debug : :info
|
25
|
-
|
26
|
-
IMPL = LibvirtAsync::Implementations.new
|
27
|
-
OBJECTS = {
|
28
|
-
hv: nil,
|
29
|
-
domains: [],
|
30
|
-
cb_ids: []
|
31
|
-
}.freeze
|
32
|
-
|
33
|
-
Async do
|
34
|
-
ASYNC_REACTOR = Async::Task.current.reactor
|
35
|
-
|
36
|
-
puts "Lib version #{Libvirt.lib_version}"
|
37
|
-
puts "Gem version #{Libvirt::VERSION}"
|
38
|
-
|
39
|
-
IMPL.start
|
40
|
-
|
41
|
-
OBJECTS[:hv] = Libvirt::Connection.new('qemu+tcp://localhost:16510/system')
|
42
|
-
OBJECTS[:hv].open
|
43
|
-
res = OBJECTS[:hv].set_keep_alive(2, 1)
|
44
|
-
Libvirt.logger.info { "set_keep_alive #{res}" }
|
45
|
-
|
46
|
-
puts "Connection version #{OBJECTS[:hv].version.inspect}"
|
47
|
-
puts "Connection lib_version #{OBJECTS[:hv].lib_version.inspect}"
|
48
|
-
puts "Connection hostname #{OBJECTS[:hv].hostname.inspect}"
|
49
|
-
puts "Connection max_vcpus #{OBJECTS[:hv].max_vcpus.inspect}"
|
50
|
-
puts "Connection capabilities #{OBJECTS[:hv].capabilities.inspect}"
|
51
|
-
node_info = OBJECTS[:hv].node_info
|
52
|
-
puts "Connection nodeInfo #{node_info}"
|
53
|
-
puts "NodeInfo model #{node_info.model.inspect}"
|
54
|
-
puts "NodeInfo cpus #{node_info.cpus.inspect}"
|
55
|
-
puts "NodeInfo mhz #{node_info.mhz.inspect}"
|
56
|
-
puts "NodeInfo nodes #{node_info.nodes.inspect}"
|
57
|
-
puts "NodeInfo sockets #{node_info.sockets.inspect}"
|
58
|
-
puts "NodeInfo cores #{node_info.cores.inspect}"
|
59
|
-
puts "NodeInfo threads #{node_info.threads.inspect}"
|
60
|
-
puts "NodeInfo memory #{node_info.memory.inspect}"
|
61
|
-
|
62
|
-
Libvirt::Connection::DOMAIN_EVENT_IDS.map do |event_id|
|
63
|
-
op = OpenStruct.new(a: 'b', event_id: event_id)
|
64
|
-
callback_id = OBJECTS[:hv].register_domain_event_callback(event_id, nil, op) do |conn, dom, *args, opaque|
|
65
|
-
Libvirt.logger.info { "DOMAIN EVENT #{event_id} conn=#{conn}, dom=#{dom}, args=#{args}, opaque=#{opaque}" }
|
66
|
-
end
|
67
|
-
Libvirt.logger.info { "Registered domain event callback event_id=#{event_id} callback_id=#{callback_id}" }
|
68
|
-
OBJECTS[:cb_ids] << callback_id
|
69
|
-
end
|
70
|
-
|
71
|
-
puts "domains qty #{OBJECTS[:hv].list_all_domains_qty}"
|
72
|
-
|
73
|
-
OBJECTS[:domains] = OBJECTS[:hv].list_all_domains
|
74
|
-
puts "Domains (#{OBJECTS[:domains].size}): #{OBJECTS[:domains]}"
|
75
|
-
|
76
|
-
d = OBJECTS[:domains].first
|
77
|
-
puts "Domain uuid #{d.uuid.inspect}"
|
78
|
-
puts "Domain name #{d.name.inspect}"
|
79
|
-
puts "Domain get_state #{d.get_state.inspect}"
|
80
|
-
puts "Domain get_cpus #{d.max_vcpus.inspect}"
|
81
|
-
puts "Domain max_memory #{d.max_memory.inspect}"
|
82
|
-
# puts "Domain xml_desc #{d.xml_desc.inspect}"
|
83
|
-
|
84
|
-
# ASYNC_REACTOR.every(10) do
|
85
|
-
# LibvirtAsync::Util.create_task(nil, ASYNC_REACTOR) { IMPL.print_debug_info }.run
|
86
|
-
# end
|
87
|
-
|
88
|
-
ASYNC_REACTOR.every(5) do
|
89
|
-
Libvirt.logger.info { "MEM USAGE: #{GetProcessMem.new.mb} MB" }
|
90
|
-
# Libvirt.logger.info { "GC.start" }
|
91
|
-
# GC.start
|
92
|
-
# Libvirt.logger.info { "MEM USAGE: #{GetProcessMem.new.mb} MB" }
|
93
|
-
end
|
94
|
-
|
95
|
-
# ASYNC_REACTOR.after(20) do
|
96
|
-
# Libvirt.logger.info { 'START Cleaning up!' }
|
97
|
-
#
|
98
|
-
# LibvirtAsync::Util.create_task(nil, ASYNC_REACTOR) do
|
99
|
-
#
|
100
|
-
# OBJECTS[:cb_ids].each do |callback_id|
|
101
|
-
# Libvirt.logger.info { "Start retrieving callback_id=#{callback_id}" }
|
102
|
-
# opaque = OBJECTS[:hv].deregister_domain_event_callback(callback_id)
|
103
|
-
# Libvirt.logger.info { "Retrieved opaque=#{opaque}" }
|
104
|
-
# end
|
105
|
-
# Libvirt.logger.info { 'Cleaning up!' }
|
106
|
-
# OBJECTS[:hv] = nil
|
107
|
-
# OBJECTS[:domains] = []
|
108
|
-
# OBJECTS[:cb_ids] = []
|
109
|
-
# Libvirt.logger.info { "GC.start 1" }
|
110
|
-
# GC.start
|
111
|
-
#
|
112
|
-
# ASYNC_REACTOR << LibvirtAsync::Util.create_task(nil, ASYNC_REACTOR) do
|
113
|
-
# Libvirt.logger.info { "GC.start 2" }
|
114
|
-
# GC.start
|
115
|
-
# end.fiber
|
116
|
-
#
|
117
|
-
# end.run
|
118
|
-
# end
|
119
|
-
|
120
|
-
# puts 'undefine DOM'
|
121
|
-
# d.undefine
|
122
|
-
# ASYNC_REACTOR.sleep 5
|
123
|
-
|
124
|
-
# begin
|
125
|
-
# puts 'DOM starting...'
|
126
|
-
# d.start
|
127
|
-
# puts 'DOM started'
|
128
|
-
# rescue Libvirt::Errors::LibError => e
|
129
|
-
# STDERR.puts "error starting\n#{e.class}\n#{e.message}", e.error_data
|
130
|
-
# end
|
131
|
-
#
|
132
|
-
# ASYNC_REACTOR.sleep 5
|
133
|
-
# puts "DOMAIN state #{d.get_state} before save_memory"
|
134
|
-
# d.save_memory
|
135
|
-
# puts "DOMAIN state #{d.get_state} after save_memory"
|
136
|
-
#
|
137
|
-
# ASYNC_REACTOR.sleep 5
|
138
|
-
# puts "DOMAIN state #{d.get_state} before start"
|
139
|
-
# d.start
|
140
|
-
# puts "DOMAIN state #{d.get_state} after start"
|
141
|
-
#
|
142
|
-
# #ASYNC_REACTOR.sleep 5
|
143
|
-
# puts "DOMAIN state #{d.get_state} before resume"
|
144
|
-
# d.resume
|
145
|
-
# puts "DOMAIN state #{d.get_state} after resume"
|
146
|
-
|
147
|
-
# ASYNC_REACTOR.sleep 10
|
148
|
-
# puts "DOMAIN state #{d.get_state} before shutdown"
|
149
|
-
# d.shutdown(1)
|
150
|
-
# puts "DOMAIN state #{d.get_state} after shutdown"
|
151
|
-
#
|
152
|
-
# ASYNC_REACTOR.sleep 10
|
153
|
-
# puts "DOMAIN state #{d.get_state}"
|
154
|
-
# d.start
|
155
|
-
# puts 'DOM start'
|
156
|
-
#
|
157
|
-
# ASYNC_REACTOR.sleep 10
|
158
|
-
# puts "DOMAIN state #{d.get_state}"
|
159
|
-
# d.reboot
|
160
|
-
# puts 'DOM reboot'
|
161
|
-
#
|
162
|
-
# ASYNC_REACTOR.sleep 5
|
163
|
-
# puts "DOMAIN state #{d.get_state}"
|
164
|
-
# d.suspend
|
165
|
-
# puts 'DOM suspend'
|
166
|
-
#
|
167
|
-
# ASYNC_REACTOR.sleep 5
|
168
|
-
# puts "DOMAIN state #{d.get_state}"
|
169
|
-
# d.resume
|
170
|
-
# puts 'DOM resume'
|
171
|
-
#
|
172
|
-
# ASYNC_REACTOR.sleep 5
|
173
|
-
# puts "DOMAIN state #{d.get_state}"
|
174
|
-
# d.reset
|
175
|
-
# puts 'DOM reset'
|
176
|
-
#
|
177
|
-
# ASYNC_REACTOR.sleep 5
|
178
|
-
# puts "DOMAIN state #{d.get_state}"
|
179
|
-
# d.power_off
|
180
|
-
# puts 'DOM power_off'
|
181
|
-
#
|
182
|
-
# ASYNC_REACTOR.sleep 5
|
183
|
-
# d.start
|
184
|
-
# puts 'DOM start'
|
185
|
-
end
|
@@ -1,63 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# frozen_string_literal: true
|
3
|
-
|
4
|
-
require 'bundler/setup'
|
5
|
-
require 'libvirt'
|
6
|
-
require 'logger'
|
7
|
-
require 'active_support/all'
|
8
|
-
require 'async'
|
9
|
-
require 'get_process_mem'
|
10
|
-
require 'gc_tracer'
|
11
|
-
|
12
|
-
require_relative 'support/libvirt_async'
|
13
|
-
require_relative 'support/log_formatter'
|
14
|
-
|
15
|
-
GC::Tracer.start_logging(
|
16
|
-
nil,
|
17
|
-
gc_stat: false,
|
18
|
-
gc_latest_gc_info: false,
|
19
|
-
rusage: false,
|
20
|
-
events: [:end_mark, :end_sweep]
|
21
|
-
)
|
22
|
-
|
23
|
-
Libvirt.logger = Logger.new(STDOUT, formatter: LogFormatter.new)
|
24
|
-
Libvirt.logger.level = ENV['DEBUG'] ? :debug : :info
|
25
|
-
|
26
|
-
IMPL = LibvirtAsync::Implementations.new
|
27
|
-
OBJECTS = {
|
28
|
-
hv: nil
|
29
|
-
}.freeze
|
30
|
-
|
31
|
-
def async_task(run, parent = nil, &block)
|
32
|
-
task = LibvirtAsync::Util.create_task(parent, ASYNC_REACTOR, &block)
|
33
|
-
case run
|
34
|
-
when :now
|
35
|
-
task.run
|
36
|
-
when :later
|
37
|
-
task.reactor << task.fiber
|
38
|
-
else
|
39
|
-
raise ArgumentError, "invalid run #{run}"
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
Async do
|
44
|
-
ASYNC_REACTOR = Async::Task.current.reactor
|
45
|
-
|
46
|
-
puts "Lib version #{Libvirt.lib_version}"
|
47
|
-
puts "Gem version #{Libvirt::VERSION}"
|
48
|
-
|
49
|
-
IMPL.start
|
50
|
-
|
51
|
-
OBJECTS[:hv] = Libvirt::Connection.new('qemu+tcp://localhost:16510/system')
|
52
|
-
OBJECTS[:hv].open
|
53
|
-
OBJECTS[:hv].register_close_callback do |conn, reason, _op|
|
54
|
-
puts "Im closing conn=#{conn}, reason=#{reason}"
|
55
|
-
end
|
56
|
-
# OBJECTS[:hv].set_keep_alive(2, 1)
|
57
|
-
|
58
|
-
ASYNC_REACTOR.every(5) do
|
59
|
-
async_task(:now) do
|
60
|
-
puts "list_all_domains_qty #{OBJECTS[:hv].list_all_domains_qty}"
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
data/test_usage/test_metadata.rb
DELETED
@@ -1,104 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# frozen_string_literal: true
|
3
|
-
|
4
|
-
require 'bundler/setup'
|
5
|
-
require 'libvirt'
|
6
|
-
require 'logger'
|
7
|
-
require 'active_support/all'
|
8
|
-
require 'async'
|
9
|
-
|
10
|
-
require_relative 'support/libvirt_async'
|
11
|
-
require_relative 'support/log_formatter'
|
12
|
-
|
13
|
-
require 'libvirt/xml'
|
14
|
-
|
15
|
-
Libvirt.logger = Logger.new(STDOUT, formatter: LogFormatter.new)
|
16
|
-
Libvirt.logger.level = ENV['DEBUG'] ? :debug : :info
|
17
|
-
|
18
|
-
IMPL = LibvirtAsync::Implementations.new
|
19
|
-
|
20
|
-
STDOUT.sync = true
|
21
|
-
STDERR.sync = true
|
22
|
-
|
23
|
-
def log_error(error, skip_backtrace: false, causes: [])
|
24
|
-
STDERR.puts "<#{error.class}>: #{error.message}", error.backtrace
|
25
|
-
if error.cause && error.cause != error && !causes.include?(error.cause)
|
26
|
-
causes.push(error)
|
27
|
-
log_error(error.cause, skip_backtrace: skip_backtrace, causes: causes)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def libvirt_safe(rescue_value = nil)
|
32
|
-
yield
|
33
|
-
rescue Libvirt::Errors::LibError => e
|
34
|
-
STDERR.puts "<#{e.class}>: #{e.message}"
|
35
|
-
rescue_value
|
36
|
-
end
|
37
|
-
|
38
|
-
Async do
|
39
|
-
ASYNC_REACTOR = Async::Task.current.reactor
|
40
|
-
|
41
|
-
puts "Lib version #{Libvirt.lib_version}"
|
42
|
-
puts "Gem version #{Libvirt::VERSION}"
|
43
|
-
|
44
|
-
IMPL.start
|
45
|
-
|
46
|
-
conn = Libvirt::Connection.new('qemu+tcp://localhost:16510/system')
|
47
|
-
conn.open
|
48
|
-
|
49
|
-
puts "Connection version #{conn.version.inspect}"
|
50
|
-
puts "Connection lib_version #{conn.lib_version.inspect}"
|
51
|
-
puts "Connection hostname #{conn.hostname.inspect}"
|
52
|
-
|
53
|
-
dom = conn.list_all_domains.first
|
54
|
-
puts "Domain #{dom.uuid} #{dom.name} #{dom.get_state}"
|
55
|
-
|
56
|
-
libvirt_safe do
|
57
|
-
dom.start
|
58
|
-
end
|
59
|
-
|
60
|
-
dom.set_metadata("test title #{Process.pid}", type: :TITLE, flags: :AFFECT_CONFIG)
|
61
|
-
dom.set_metadata("test desc #{Process.pid}", type: :DESCRIPTION, flags: :AFFECT_CONFIG)
|
62
|
-
|
63
|
-
puts "domain title", libvirt_safe{ dom.get_metadata(type: :TITLE, flags: :AFFECT_CONFIG) }
|
64
|
-
puts "domain description", libvirt_safe { dom.get_metadata(type: :DESCRIPTION, flags: :AFFECT_CONFIG) }
|
65
|
-
|
66
|
-
puts "full XML title", Libvirt::Xml::Domain.load(dom.xml_desc).title
|
67
|
-
puts "full XML description", Libvirt::Xml::Domain.load(dom.xml_desc).description
|
68
|
-
|
69
|
-
namespace = 'https://example.com'
|
70
|
-
old_metadata = dom.get_metadata(
|
71
|
-
uri: namespace, flags: :AFFECT_CONFIG
|
72
|
-
)
|
73
|
-
|
74
|
-
puts "Old Metadata", old_metadata
|
75
|
-
|
76
|
-
new_metadata = "<pid>#{Process.pid}</pid>"
|
77
|
-
key = 'example'
|
78
|
-
dom.set_metadata new_metadata,
|
79
|
-
key: key,
|
80
|
-
uri: namespace,
|
81
|
-
flags: :AFFECT_CONFIG
|
82
|
-
|
83
|
-
puts "new metadata", dom.get_metadata(
|
84
|
-
uri: namespace, flags: :AFFECT_CONFIG
|
85
|
-
)
|
86
|
-
|
87
|
-
puts "full XML metadata", Libvirt::Xml::Domain.load(dom.xml_desc).metadata
|
88
|
-
|
89
|
-
puts "domain shutdown", libvirt_safe { dom.shutdown }
|
90
|
-
ASYNC_REACTOR.sleep 5
|
91
|
-
puts dom.get_state
|
92
|
-
|
93
|
-
puts "domain start", libvirt_safe { dom.start }
|
94
|
-
ASYNC_REACTOR.sleep 2
|
95
|
-
puts dom.get_state
|
96
|
-
|
97
|
-
puts "full XML metadata", Libvirt::Xml::Domain.load(dom.xml_desc).metadata
|
98
|
-
puts "full XML title", Libvirt::Xml::Domain.load(dom.xml_desc).title
|
99
|
-
puts "full XML description", Libvirt::Xml::Domain.load(dom.xml_desc).description
|
100
|
-
|
101
|
-
rescue StandardError => e
|
102
|
-
log_error(e)
|
103
|
-
exit 1
|
104
|
-
end
|
@@ -1,197 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# frozen_string_literal: true
|
3
|
-
|
4
|
-
require 'bundler/setup'
|
5
|
-
require 'libvirt'
|
6
|
-
require 'logger'
|
7
|
-
require 'active_support/all'
|
8
|
-
require 'async'
|
9
|
-
require 'get_process_mem'
|
10
|
-
|
11
|
-
require_relative 'support/libvirt_async'
|
12
|
-
require_relative 'support/log_formatter'
|
13
|
-
|
14
|
-
Libvirt.logger = Logger.new(STDOUT, formatter: LogFormatter.new)
|
15
|
-
Libvirt.logger.level = ENV['DEBUG'] ? :debug : :info
|
16
|
-
|
17
|
-
LibvirtAsync.logger = Logger.new(STDOUT, formatter: LogFormatter.new)
|
18
|
-
LibvirtAsync.logger.level = ENV['LIBVIRT_DEBUG'] ? :debug : :info
|
19
|
-
|
20
|
-
def print_usage(msg)
|
21
|
-
mem = GetProcessMem.new
|
22
|
-
STDOUT.puts "#{msg} [#{mem.mb}MB]"
|
23
|
-
end
|
24
|
-
|
25
|
-
def run_gc(msg)
|
26
|
-
print_usage "#{msg} before GC.start"
|
27
|
-
GC.start
|
28
|
-
print_usage "#{msg} after GC.start"
|
29
|
-
end
|
30
|
-
|
31
|
-
IMPL = LibvirtAsync::Implementations.new
|
32
|
-
CONNS = [].freeze
|
33
|
-
DOMS = [].freeze
|
34
|
-
STREAMS = { stream: nil }.freeze
|
35
|
-
|
36
|
-
class ScreenshotOpaque
|
37
|
-
CALLBACK = proc do |s, ev, op|
|
38
|
-
# run_gc('ScreenshotOpaque CALLBACK start')
|
39
|
-
next unless (Libvirt::Stream::EVENT_READABLE & ev) != 0
|
40
|
-
|
41
|
-
begin
|
42
|
-
code, data = s.recv(1024)
|
43
|
-
rescue Libvirt::Errors::LibError => e
|
44
|
-
op.on_libvirt_error(s, e)
|
45
|
-
next
|
46
|
-
end
|
47
|
-
# run_gc('ScreenshotOpaque CALLBACK after recv')
|
48
|
-
|
49
|
-
case code
|
50
|
-
when 0
|
51
|
-
op.on_complete(s)
|
52
|
-
when -1
|
53
|
-
op.on_recv_error(s)
|
54
|
-
when -2
|
55
|
-
print_usage "Opaque::CALLBACK #{op.filepath} wait for data"
|
56
|
-
else
|
57
|
-
op.on_receive(data)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
attr_reader :filepath
|
62
|
-
|
63
|
-
def initialize(filepath, finish_cb)
|
64
|
-
@filepath = filepath
|
65
|
-
@f = File.open(@filepath, 'wb')
|
66
|
-
@finish_cb = finish_cb
|
67
|
-
end
|
68
|
-
|
69
|
-
def on_complete(stream)
|
70
|
-
print_usage "Opaque#on_complete #{@filepath}"
|
71
|
-
success, reason = finish_stream(stream)
|
72
|
-
finish(success, reason)
|
73
|
-
end
|
74
|
-
|
75
|
-
def on_receive(data)
|
76
|
-
print_usage "Opaque#on_receive #{@filepath} #{data&.size}"
|
77
|
-
@f.write(data)
|
78
|
-
end
|
79
|
-
|
80
|
-
def on_recv_error(stream)
|
81
|
-
print_usage "Opaque#on_recv_error #{@filepath}"
|
82
|
-
success, reason = finish_stream(stream)
|
83
|
-
finish(success, reason)
|
84
|
-
end
|
85
|
-
|
86
|
-
def on_libvirt_error(stream, e)
|
87
|
-
print_usage "Opaque#on_libvirt_error #{@filepath} #{e}"
|
88
|
-
success, reason = finish_stream(stream)
|
89
|
-
finish(success, reason)
|
90
|
-
end
|
91
|
-
|
92
|
-
private
|
93
|
-
|
94
|
-
def finish_stream(stream)
|
95
|
-
print_usage "Opaque#finish_stream stream.event_remove_callback #{@filepath}"
|
96
|
-
stream.event_remove_callback
|
97
|
-
result = begin
|
98
|
-
print_usage "Opaque#finish_stream stream.finish #{@filepath}"
|
99
|
-
stream.finish
|
100
|
-
[true, nil]
|
101
|
-
rescue Libvirt::Errors::LibError => e
|
102
|
-
warn "Opaque#finish_stream stream.finish exception rescued #{e.class} #{e.message}"
|
103
|
-
[false, e.message]
|
104
|
-
end
|
105
|
-
print_usage "Opaque#finish_stream ends #{@filepath}"
|
106
|
-
result
|
107
|
-
end
|
108
|
-
|
109
|
-
def finish(success, reason)
|
110
|
-
print_usage "Opaque#finish success=#{success} #{@filepath}"
|
111
|
-
|
112
|
-
@f.close
|
113
|
-
@f = nil
|
114
|
-
@finish_cb.call(success, reason)
|
115
|
-
@finish_cb = nil
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
def save_screenshot(c, domain, i)
|
120
|
-
stream = c.stream(Libvirt::Stream::NONBLOCK)
|
121
|
-
|
122
|
-
opaque_cb = proc do |success|
|
123
|
-
puts "Stream #{i} complete success=#{success}"
|
124
|
-
print_usage "after stream #{i} complete stream=#{STREAMS["stream#{i}"]}"
|
125
|
-
run_gc("Stream #{i} complete before remove stream")
|
126
|
-
print_usage "after stream #{i} complete and GC.start"
|
127
|
-
STREAMS["stream#{i}"] = nil
|
128
|
-
run_gc("Stream #{i} complete before remove stream")
|
129
|
-
print_usage "after stream #{i} delete and GC.start"
|
130
|
-
end
|
131
|
-
|
132
|
-
opaque = ScreenshotOpaque.new("tmp/screenshots_test#{i}.pnm", opaque_cb)
|
133
|
-
|
134
|
-
STREAMS["stream#{i}"] = stream
|
135
|
-
|
136
|
-
print_usage "test_screenshot_mem #{i} before stream start"
|
137
|
-
domain.screenshot(stream, 0)
|
138
|
-
stream.event_add_callback(
|
139
|
-
Libvirt::Stream::EVENT_READABLE,
|
140
|
-
opaque,
|
141
|
-
&ScreenshotOpaque::CALLBACK
|
142
|
-
)
|
143
|
-
run_gc("Stream #{i} after add event")
|
144
|
-
end
|
145
|
-
|
146
|
-
Async do
|
147
|
-
ASYNC_REACTOR = Async::Task.current.reactor
|
148
|
-
|
149
|
-
puts "Lib version #{Libvirt.lib_version}"
|
150
|
-
puts "Gem version #{Libvirt::VERSION}"
|
151
|
-
|
152
|
-
IMPL.start
|
153
|
-
|
154
|
-
c = Libvirt::Connection.new('qemu+tcp://localhost:16510/system')
|
155
|
-
c.open
|
156
|
-
res = c.set_keep_alive(2, 1)
|
157
|
-
Libvirt.logger.info { "set_keep_alive #{res}" }
|
158
|
-
CONNS.push(c)
|
159
|
-
|
160
|
-
domain = c.list_all_domains.first
|
161
|
-
DOMS.push(domain)
|
162
|
-
|
163
|
-
print_usage 'First generation'
|
164
|
-
5.times do |i|
|
165
|
-
save_screenshot(c, domain, 100 + i)
|
166
|
-
end
|
167
|
-
|
168
|
-
ASYNC_REACTOR.after(15) do
|
169
|
-
Async::Task.new(ASYNC_REACTOR, nil) do
|
170
|
-
print_usage 'Second generation'
|
171
|
-
|
172
|
-
con = CONNS.first
|
173
|
-
dom = DOMS.first
|
174
|
-
5.times do |i|
|
175
|
-
save_screenshot(con, dom, 200 + i)
|
176
|
-
end
|
177
|
-
end.run
|
178
|
-
end
|
179
|
-
|
180
|
-
ASYNC_REACTOR.after(30) do
|
181
|
-
Async::Task.new(ASYNC_REACTOR, nil) do
|
182
|
-
print_usage 'Third generation'
|
183
|
-
|
184
|
-
con = CONNS.first
|
185
|
-
dom = DOMS.first
|
186
|
-
5.times do |i|
|
187
|
-
save_screenshot(con, dom, 300 + i)
|
188
|
-
end
|
189
|
-
end.run
|
190
|
-
end
|
191
|
-
|
192
|
-
ASYNC_REACTOR.every(5) do
|
193
|
-
Async::Task.new(ASYNC_REACTOR, nil) do
|
194
|
-
run_gc 'PERIODIC'
|
195
|
-
end.run
|
196
|
-
end
|
197
|
-
end
|
data/test_usage/test_storage.rb
DELETED
@@ -1,52 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# frozen_string_literal: true
|
3
|
-
|
4
|
-
require 'bundler/setup'
|
5
|
-
require 'libvirt'
|
6
|
-
require 'logger'
|
7
|
-
require 'active_support/all'
|
8
|
-
require 'async'
|
9
|
-
|
10
|
-
require_relative 'support/libvirt_async'
|
11
|
-
require_relative 'support/log_formatter'
|
12
|
-
|
13
|
-
require 'libvirt/xml'
|
14
|
-
|
15
|
-
Libvirt.logger = Logger.new(STDOUT, formatter: LogFormatter.new)
|
16
|
-
Libvirt.logger.level = ENV['DEBUG'] ? :debug : :info
|
17
|
-
|
18
|
-
IMPL = LibvirtAsync::Implementations.new
|
19
|
-
|
20
|
-
Async do
|
21
|
-
ASYNC_REACTOR = Async::Task.current.reactor
|
22
|
-
|
23
|
-
puts "Lib version #{Libvirt.lib_version}"
|
24
|
-
puts "Gem version #{Libvirt::VERSION}"
|
25
|
-
|
26
|
-
IMPL.start
|
27
|
-
|
28
|
-
conn = Libvirt::Connection.new('qemu+tcp://localhost:16510/system')
|
29
|
-
conn.open
|
30
|
-
|
31
|
-
puts "Connection version #{conn.version.inspect}"
|
32
|
-
puts "Connection lib_version #{conn.lib_version.inspect}"
|
33
|
-
puts "Connection hostname #{conn.hostname.inspect}"
|
34
|
-
|
35
|
-
pools = conn.list_all_storage_pools
|
36
|
-
puts "Connection storage pools qty #{pools.size}"
|
37
|
-
|
38
|
-
pools.each.with_index do |pool, i|
|
39
|
-
puts "Storage pool #{i} info", pool.info.to_h
|
40
|
-
puts "Storage pool #{i} xml", Libvirt::Xml::StoragePool.load(pool.xml_desc).to_h
|
41
|
-
end
|
42
|
-
|
43
|
-
pools.each.with_index do |pool, i|
|
44
|
-
volumes = pool.list_all_volumes
|
45
|
-
puts "Storage pool #{i} volumes qty #{volumes.size}"
|
46
|
-
|
47
|
-
volumes.each.with_index do |vol, j|
|
48
|
-
puts "Storage pool #{i} volume #{j} info", vol.info.to_h
|
49
|
-
puts "Storage pool #{i} volume #{j} xml", Libvirt::Xml::StorageVolume.load(vol.xml_desc).to_h
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|