libvirt_ffi 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +78 -0
  3. data/Gemfile +7 -3
  4. data/Rakefile +6 -1
  5. data/bin/console +1 -0
  6. data/exe/libvirt +1 -0
  7. data/lib/libvirt/base_info.rb +34 -0
  8. data/lib/libvirt/connection.rb +98 -36
  9. data/lib/libvirt/domain.rb +105 -8
  10. data/lib/libvirt/domain_callback_storage.rb +13 -15
  11. data/lib/libvirt/errors.rb +65 -0
  12. data/lib/libvirt/event.rb +29 -19
  13. data/lib/libvirt/ffi/common.rb +8 -1
  14. data/lib/libvirt/ffi/domain.rb +529 -196
  15. data/lib/libvirt/ffi/error.rb +243 -0
  16. data/lib/libvirt/ffi/event.rb +30 -36
  17. data/lib/libvirt/ffi/helpers.rb +17 -0
  18. data/lib/libvirt/ffi/host.rb +122 -0
  19. data/lib/libvirt/ffi/storage.rb +149 -0
  20. data/lib/libvirt/ffi/stream.rb +19 -17
  21. data/lib/libvirt/ffi.rb +17 -0
  22. data/lib/libvirt/node_info.rb +2 -41
  23. data/lib/libvirt/storage_pool.rb +70 -0
  24. data/lib/libvirt/storage_pool_info.rb +7 -0
  25. data/lib/libvirt/storage_volume.rb +51 -0
  26. data/lib/libvirt/storage_volume_info.rb +7 -0
  27. data/lib/libvirt/stream.rb +21 -14
  28. data/lib/libvirt/util.rb +61 -8
  29. data/lib/libvirt/version.rb +1 -1
  30. data/lib/libvirt/xml/disk.rb +59 -0
  31. data/lib/libvirt/xml/domain.rb +76 -0
  32. data/lib/libvirt/xml/generic.rb +252 -0
  33. data/lib/libvirt/xml/graphics.rb +14 -0
  34. data/lib/libvirt/xml/max_vcpu.rb +12 -0
  35. data/lib/libvirt/xml/memory.rb +14 -0
  36. data/lib/libvirt/xml/storage_pool.rb +24 -0
  37. data/lib/libvirt/xml/storage_volume.rb +32 -0
  38. data/lib/libvirt/xml/vcpu.rb +12 -0
  39. data/lib/libvirt/xml.rb +23 -0
  40. data/lib/libvirt.rb +12 -12
  41. data/lib/libvirt_ffi.rb +2 -0
  42. data/libvirt.gemspec +5 -1
  43. data/test_usage/support/libvirt_async.rb +27 -35
  44. data/test_usage/support/log_formatter.rb +5 -10
  45. data/test_usage/test_domain.rb +43 -0
  46. data/test_usage/test_event_loop.rb +115 -39
  47. data/test_usage/test_libvirtd_restart.rb +63 -0
  48. data/test_usage/test_metadata.rb +104 -0
  49. data/test_usage/test_screenshot.rb +14 -13
  50. data/test_usage/test_storage.rb +52 -0
  51. metadata +42 -6
  52. data/lib/libvirt/error.rb +0 -6
  53. data/lib/libvirt/ffi/connection.rb +0 -94
  54. data/lib/libvirt/ffi/libvirt.rb +0 -17
  55. data/lib/libvirt/ffi/node_info.rb +0 -37
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'bundler/setup'
4
5
  require 'libvirt'
@@ -16,16 +17,18 @@ GC::Tracer.start_logging(
16
17
  gc_stat: false,
17
18
  gc_latest_gc_info: false,
18
19
  rusage: false,
19
- events: %i[end_mark end_sweep]
20
+ events: [:end_mark, :end_sweep]
20
21
  )
21
22
 
22
23
  Libvirt.logger = Logger.new(STDOUT, formatter: LogFormatter.new)
23
24
  Libvirt.logger.level = ENV['DEBUG'] ? :debug : :info
24
25
 
25
26
  IMPL = LibvirtAsync::Implementations.new
26
- CONNS = []
27
- DOMS = []
28
- CB_IDS = []
27
+ OBJECTS = {
28
+ hv: nil,
29
+ domains: [],
30
+ cb_ids: []
31
+ }.freeze
29
32
 
30
33
  Async do
31
34
  ASYNC_REACTOR = Async::Task.current.reactor
@@ -35,18 +38,17 @@ Async do
35
38
 
36
39
  IMPL.start
37
40
 
38
- c = Libvirt::Connection.new('qemu+tcp://localhost:16510/system')
39
- c.open
40
- res = c.set_keep_alive(2, 1)
41
- Libvirt.logger.info { "set_keep_alive #{res}" }
42
- CONNS.push(c)
43
-
44
- puts "Connection version #{c.version.inspect}"
45
- puts "Connection lib_version #{c.lib_version.inspect}"
46
- puts "Connection hostname #{c.hostname.inspect}"
47
- puts "Connection max_vcpus #{c.max_vcpus.inspect}"
48
- puts "Connection capabilities #{c.capabilities.inspect}"
49
- node_info = c.node_info
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
50
52
  puts "Connection nodeInfo #{node_info}"
51
53
  puts "NodeInfo model #{node_info.model.inspect}"
52
54
  puts "NodeInfo cpus #{node_info.cpus.inspect}"
@@ -57,27 +59,27 @@ Async do
57
59
  puts "NodeInfo threads #{node_info.threads.inspect}"
58
60
  puts "NodeInfo memory #{node_info.memory.inspect}"
59
61
 
60
- cb_ids = Libvirt::Connection::DOMAIN_EVENT_IDS.map do |event_id|
62
+ Libvirt::Connection::DOMAIN_EVENT_IDS.map do |event_id|
61
63
  op = OpenStruct.new(a: 'b', event_id: event_id)
62
- c.register_domain_event_callback(event_id, nil, op) do |conn, dom, *args, opaque|
64
+ callback_id = OBJECTS[:hv].register_domain_event_callback(event_id, nil, op) do |conn, dom, *args, opaque|
63
65
  Libvirt.logger.info { "DOMAIN EVENT #{event_id} conn=#{conn}, dom=#{dom}, args=#{args}, opaque=#{opaque}" }
64
66
  end
67
+ Libvirt.logger.info { "Registered domain event callback event_id=#{event_id} callback_id=#{callback_id}" }
68
+ OBJECTS[:cb_ids] << callback_id
65
69
  end
66
- CB_IDS.concat(cb_ids)
67
70
 
68
- puts "domains qty #{c.list_all_domains_qty}"
71
+ puts "domains qty #{OBJECTS[:hv].list_all_domains_qty}"
69
72
 
70
- domains = c.list_all_domains
71
- DOMS.concat(domains)
72
- puts "Domains (#{domains.size}): #{domains}"
73
+ OBJECTS[:domains] = OBJECTS[:hv].list_all_domains
74
+ puts "Domains (#{OBJECTS[:domains].size}): #{OBJECTS[:domains]}"
73
75
 
74
- d = domains.first
76
+ d = OBJECTS[:domains].first
75
77
  puts "Domain uuid #{d.uuid.inspect}"
76
78
  puts "Domain name #{d.name.inspect}"
77
79
  puts "Domain get_state #{d.get_state.inspect}"
78
80
  puts "Domain get_cpus #{d.max_vcpus.inspect}"
79
81
  puts "Domain max_memory #{d.max_memory.inspect}"
80
- puts "Domain xml_desc #{d.xml_desc.inspect}"
82
+ # puts "Domain xml_desc #{d.xml_desc.inspect}"
81
83
 
82
84
  # ASYNC_REACTOR.every(10) do
83
85
  # LibvirtAsync::Util.create_task(nil, ASYNC_REACTOR) { IMPL.print_debug_info }.run
@@ -90,20 +92,94 @@ Async do
90
92
  # Libvirt.logger.info { "MEM USAGE: #{GetProcessMem.new.mb} MB" }
91
93
  end
92
94
 
93
- ASYNC_REACTOR.after(20) do
94
- LibvirtAsync::Util.create_task(nil, ASYNC_REACTOR) do
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
95
119
 
96
- c = CONNS.first
97
- CB_IDS.each do |callback_id|
98
- opaque = c.deregister_domain_event_callback(callback_id)
99
- puts "Retrieved opaque #{opaque}"
100
- end
101
- Libvirt.logger.info { 'Cleaning up!' }
102
- CONNS = []
103
- DOMS = []
104
- CB_IDS = []
105
- GC.start
120
+ # puts 'undefine DOM'
121
+ # d.undefine
122
+ # ASYNC_REACTOR.sleep 5
106
123
 
107
- end
108
- end
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'
109
185
  end
@@ -0,0 +1,63 @@
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
@@ -0,0 +1,104 @@
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}"
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,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'bundler/setup'
4
5
  require 'libvirt'
@@ -28,21 +29,22 @@ def run_gc(msg)
28
29
  end
29
30
 
30
31
  IMPL = LibvirtAsync::Implementations.new
31
- CONNS = []
32
- DOMS = []
33
- STREAMS = { stream: nil }
32
+ CONNS = [].freeze
33
+ DOMS = [].freeze
34
+ STREAMS = { stream: nil }.freeze
34
35
 
35
36
  class ScreenshotOpaque
36
37
  CALLBACK = proc do |s, ev, op|
37
- #run_gc('ScreenshotOpaque CALLBACK start')
38
+ # run_gc('ScreenshotOpaque CALLBACK start')
38
39
  next unless (Libvirt::Stream::EVENT_READABLE & ev) != 0
40
+
39
41
  begin
40
42
  code, data = s.recv(1024)
41
- rescue Libvirt::Error => e
43
+ rescue Libvirt::Errors::LibError => e
42
44
  op.on_libvirt_error(s, e)
43
45
  next
44
46
  end
45
- #run_gc('ScreenshotOpaque CALLBACK after recv')
47
+ # run_gc('ScreenshotOpaque CALLBACK after recv')
46
48
 
47
49
  case code
48
50
  when 0
@@ -96,9 +98,9 @@ class ScreenshotOpaque
96
98
  print_usage "Opaque#finish_stream stream.finish #{@filepath}"
97
99
  stream.finish
98
100
  [true, nil]
99
- rescue Libvirt::Error => e
100
- STDERR.puts "Opaque#finish_stream stream.finish exception rescued #{e.class} #{e.message}"
101
- [false, e.message]
101
+ rescue Libvirt::Errors::LibError => e
102
+ warn "Opaque#finish_stream stream.finish exception rescued #{e.class} #{e.message}"
103
+ [false, e.message]
102
104
  end
103
105
  print_usage "Opaque#finish_stream ends #{@filepath}"
104
106
  result
@@ -158,14 +160,14 @@ Async do
158
160
  domain = c.list_all_domains.first
159
161
  DOMS.push(domain)
160
162
 
161
- print_usage "First generation"
163
+ print_usage 'First generation'
162
164
  5.times do |i|
163
165
  save_screenshot(c, domain, 100 + i)
164
166
  end
165
167
 
166
168
  ASYNC_REACTOR.after(15) do
167
169
  Async::Task.new(ASYNC_REACTOR, nil) do
168
- print_usage "Second generation"
170
+ print_usage 'Second generation'
169
171
 
170
172
  con = CONNS.first
171
173
  dom = DOMS.first
@@ -177,7 +179,7 @@ Async do
177
179
 
178
180
  ASYNC_REACTOR.after(30) do
179
181
  Async::Task.new(ASYNC_REACTOR, nil) do
180
- print_usage "Third generation"
182
+ print_usage 'Third generation'
181
183
 
182
184
  con = CONNS.first
183
185
  dom = DOMS.first
@@ -192,5 +194,4 @@ Async do
192
194
  run_gc 'PERIODIC'
193
195
  end.run
194
196
  end
195
-
196
197
  end
@@ -0,0 +1,52 @@
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
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: libvirt_ffi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Denis Talakevich
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-01-31 00:00:00.000000000 Z
11
+ date: 2020-03-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rubocop
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.80.1
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.80.1
27
41
  description: Libvirt FFI
28
42
  email:
29
43
  - senid231@gmail.com
@@ -33,6 +47,7 @@ extensions: []
33
47
  extra_rdoc_files: []
34
48
  files:
35
49
  - ".gitignore"
50
+ - ".rubocop.yml"
36
51
  - ".travis.yml"
37
52
  - CODE_OF_CONDUCT.md
38
53
  - Gemfile
@@ -43,28 +58,49 @@ files:
43
58
  - bin/setup
44
59
  - exe/libvirt
45
60
  - lib/libvirt.rb
61
+ - lib/libvirt/base_info.rb
46
62
  - lib/libvirt/connection.rb
47
63
  - lib/libvirt/domain.rb
48
64
  - lib/libvirt/domain_callback_storage.rb
49
- - lib/libvirt/error.rb
65
+ - lib/libvirt/errors.rb
50
66
  - lib/libvirt/event.rb
67
+ - lib/libvirt/ffi.rb
51
68
  - lib/libvirt/ffi/common.rb
52
- - lib/libvirt/ffi/connection.rb
53
69
  - lib/libvirt/ffi/domain.rb
70
+ - lib/libvirt/ffi/error.rb
54
71
  - lib/libvirt/ffi/event.rb
55
- - lib/libvirt/ffi/libvirt.rb
56
- - lib/libvirt/ffi/node_info.rb
72
+ - lib/libvirt/ffi/helpers.rb
73
+ - lib/libvirt/ffi/host.rb
74
+ - lib/libvirt/ffi/storage.rb
57
75
  - lib/libvirt/ffi/stream.rb
58
76
  - lib/libvirt/node_info.rb
77
+ - lib/libvirt/storage_pool.rb
78
+ - lib/libvirt/storage_pool_info.rb
79
+ - lib/libvirt/storage_volume.rb
80
+ - lib/libvirt/storage_volume_info.rb
59
81
  - lib/libvirt/stream.rb
60
82
  - lib/libvirt/util.rb
61
83
  - lib/libvirt/version.rb
84
+ - lib/libvirt/xml.rb
85
+ - lib/libvirt/xml/disk.rb
86
+ - lib/libvirt/xml/domain.rb
87
+ - lib/libvirt/xml/generic.rb
88
+ - lib/libvirt/xml/graphics.rb
89
+ - lib/libvirt/xml/max_vcpu.rb
90
+ - lib/libvirt/xml/memory.rb
91
+ - lib/libvirt/xml/storage_pool.rb
92
+ - lib/libvirt/xml/storage_volume.rb
93
+ - lib/libvirt/xml/vcpu.rb
62
94
  - lib/libvirt_ffi.rb
63
95
  - libvirt.gemspec
64
96
  - test_usage/support/libvirt_async.rb
65
97
  - test_usage/support/log_formatter.rb
98
+ - test_usage/test_domain.rb
66
99
  - test_usage/test_event_loop.rb
100
+ - test_usage/test_libvirtd_restart.rb
101
+ - test_usage/test_metadata.rb
67
102
  - test_usage/test_screenshot.rb
103
+ - test_usage/test_storage.rb
68
104
  homepage: https://github.com/senid231/libvirt_ffi
69
105
  licenses:
70
106
  - MIT
data/lib/libvirt/error.rb DELETED
@@ -1,6 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Libvirt
4
- class Error < StandardError
5
- end
6
- end