libvirt_ffi 0.4.1 → 0.5.0

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.
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
@@ -3,28 +3,31 @@
3
3
  module Libvirt
4
4
  module FFI
5
5
  module Stream
6
+ # https://libvirt.org/html/libvirt-libvirt-stream.html
7
+
6
8
  extend ::FFI::Library
9
+ extend Helpers
7
10
  ffi_lib Util.library_path
8
11
 
9
12
  # virStreamPtr virStreamNew (
10
13
  # virConnectPtr conn,
11
- # unsigned int flags
14
+ # unsigned int flags
12
15
  # )
13
16
  attach_function :virStreamNew, [:pointer, :uint], :pointer
14
17
 
15
18
  # typedef void (*virStreamEventCallback) (
16
19
  # virStreamPtr stream,
17
- # int events,
18
- # void * opaque
20
+ # int events,
21
+ # void * opaque
19
22
  # )
20
23
  callback :virStreamEventCallback, [:pointer, :int, :pointer], :void
21
24
 
22
- # int virStreamEventAddCallback (
25
+ # int virStreamEventAddCallback (
23
26
  # virStreamPtr stream,
24
- # int events,
25
- # virStreamEventCallback cb,
26
- # void * opaque,
27
- # virFreeCallback ff
27
+ # int events,
28
+ # virStreamEventCallback cb,
29
+ # void * opaque,
30
+ # virFreeCallback ff
28
31
  # )
29
32
  attach_function :virStreamEventAddCallback, [
30
33
  :pointer,
@@ -34,39 +37,38 @@ module Libvirt
34
37
  FFI::Common::FREE_CALLBACK
35
38
  ], :int
36
39
 
37
- # int virStreamEventRemoveCallback (
40
+ # int virStreamEventRemoveCallback (
38
41
  # virStreamPtr stream
39
42
  # )
40
43
  attach_function :virStreamEventRemoveCallback, [:pointer], :int
41
44
 
42
- # int virStreamEventUpdateCallback (
45
+ # int virStreamEventUpdateCallback (
43
46
  # virStreamPtr stream,
44
47
  # int events
45
48
  # )
46
49
  attach_function :virStreamEventUpdateCallback, [:pointer, :int], :int
47
50
 
48
- # int virStreamFinish (
51
+ # int virStreamFinish (
49
52
  # virStreamPtr stream
50
53
  # )
51
54
  attach_function :virStreamFinish, [:pointer], :int
52
55
 
53
- # int virStreamFree (
56
+ # int virStreamFree (
54
57
  # virStreamPtr stream
55
58
  # )
56
59
  attach_function :virStreamFree, [:pointer], :int
57
60
 
58
- # int virStreamAbort (
61
+ # int virStreamAbort (
59
62
  # virStreamPtr stream
60
63
  # )
61
64
  attach_function :virStreamAbort, [:pointer], :int
62
65
 
63
- # int virStreamRecv (
66
+ # int virStreamRecv (
64
67
  # virStreamPtr stream,
65
- # char *data,
66
- # size_t nbytes
68
+ # char *data,
69
+ # size_t nbytes
67
70
  # )
68
71
  attach_function :virStreamRecv, [:pointer, :pointer, :size_t], :int
69
-
70
72
  end
71
73
  end
72
74
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Libvirt
4
+ module FFI
5
+ # https://libvirt.org/html/index.html
6
+ # namespace for libvirt C bindings
7
+
8
+ require 'libvirt/ffi/helpers'
9
+ require 'libvirt/ffi/common'
10
+ require 'libvirt/ffi/error'
11
+ require 'libvirt/ffi/host'
12
+ require 'libvirt/ffi/domain'
13
+ require 'libvirt/ffi/event'
14
+ require 'libvirt/ffi/stream'
15
+ require 'libvirt/ffi/storage'
16
+ end
17
+ end
@@ -1,46 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Libvirt
4
- class NodeInfo
5
- def initialize(node_info_ptr)
6
- @node_info_ptr = node_info_ptr
7
- @node_info_struct = FFI::NodeInfo::Struct.new(node_info_ptr)
8
- end
9
-
10
- def [](attr)
11
- @node_info_struct[attr]
12
- end
13
-
14
- def model
15
- @node_info_struct[:model].to_s
16
- end
17
-
18
- def cpus
19
- @node_info_struct[:cpus]
20
- end
21
-
22
- def mhz
23
- @node_info_struct[:mhz]
24
- end
25
-
26
- def nodes
27
- @node_info_struct[:nodes]
28
- end
29
-
30
- def sockets
31
- @node_info_struct[:sockets]
32
- end
33
-
34
- def cores
35
- @node_info_struct[:cores]
36
- end
37
-
38
- def threads
39
- @node_info_struct[:threads]
40
- end
41
-
42
- def memory
43
- @node_info_struct[:memory]
44
- end
4
+ class NodeInfo < BaseInfo
5
+ struct_class FFI::Host::NodeInfoStruct
45
6
  end
46
7
  end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Libvirt
4
+ class StoragePool
5
+ def self.load_ref(pointer)
6
+ result = FFI::Storage.virStoragePoolRef(pointer)
7
+ raise Errors::LibError, "Couldn't retrieve storage pool reference" if result.negative?
8
+
9
+ new(pointer)
10
+ end
11
+
12
+ def initialize(pointer)
13
+ @ptr = pointer
14
+
15
+ free = ->(obj_id) do
16
+ Util.log(:debug) { "Finalize Libvirt::StoragePool 0x#{obj_id.to_s(16)} @ptr=#{@ptr}," }
17
+ return unless @ptr
18
+
19
+ fr_result = FFI::Storage.virStoragePoolFree(@ptr)
20
+ warn "Couldn't free Libvirt::StoragePool (0x#{obj_id.to_s(16)}) pointer #{@ptr.address}" if fr_result.negative?
21
+ end
22
+ ObjectSpace.define_finalizer(self, free)
23
+ end
24
+
25
+ def to_ptr
26
+ @ptr
27
+ end
28
+
29
+ def info
30
+ info_ptr = ::FFI::MemoryPointer.new(FFI::Storage::PoolInfoStruct.by_value)
31
+ result = FFI::Storage.virStoragePoolGetInfo(@ptr, info_ptr)
32
+ raise Errors::LibError, "Couldn't get storage pool info" if result.negative?
33
+
34
+ StoragePoolInfo.new(info_ptr)
35
+ end
36
+
37
+ def xml_desc(options_or_flags = nil)
38
+ flags = Util.parse_flags options_or_flags, FFI::Storage.enum_type(:xml_flags)
39
+ result = FFI::Storage.virStoragePoolGetXMLDesc(@ptr, flags)
40
+ raise Errors::LibError, "Couldn't get storage pool xml desc" if result.nil?
41
+
42
+ result
43
+ end
44
+
45
+ def list_all_volumes_qty
46
+ result = FFI::Storage.virStoragePoolListAllVolumes(@ptr, nil, 0)
47
+ raise Errors::LibError, "Couldn't retrieve volumes qty" if result.negative?
48
+
49
+ result
50
+ end
51
+
52
+ def list_all_volumes
53
+ size = list_all_volumes_qty
54
+ return [] if size.zero?
55
+
56
+ storage_volumes_ptr = ::FFI::MemoryPointer.new(:pointer, size)
57
+ result = FFI::Storage.virStoragePoolListAllVolumes(@ptr, storage_volumes_ptr, 0)
58
+ raise Errors::LibError, "Couldn't retrieve volumes list" if result.negative?
59
+
60
+ ptr = storage_volumes_ptr.read_pointer
61
+ ptr.get_array_of_pointer(0, size).map { |stv_ptr| StorageVolume.new(stv_ptr) }
62
+ end
63
+
64
+ private
65
+
66
+ def dbg(&block)
67
+ Util.log(:debug, 'Libvirt::Domain', &block)
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Libvirt
4
+ class StoragePoolInfo < BaseInfo
5
+ struct_class FFI::Storage::PoolInfoStruct
6
+ end
7
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Libvirt
4
+ class StorageVolume
5
+ def self.load_ref(pointer)
6
+ result = FFI::Storage.virStorageVolRef(pointer)
7
+ raise Errors::LibError, "Couldn't retrieve storage volume reference" if result.negative?
8
+
9
+ new(pointer)
10
+ end
11
+
12
+ def initialize(pointer)
13
+ @ptr = pointer
14
+
15
+ free = ->(obj_id) do
16
+ Util.log(:debug) { "Finalize Libvirt::StorageVolume 0x#{obj_id.to_s(16)} @ptr=#{@ptr}," }
17
+ return unless @ptr
18
+
19
+ fr_result = FFI::Storage.virStorageVolFree(@ptr)
20
+ warn "Couldn't free Libvirt::StorageVolume (0x#{obj_id.to_s(16)}) pointer #{@ptr.address}" if fr_result.negative?
21
+ end
22
+ ObjectSpace.define_finalizer(self, free)
23
+ end
24
+
25
+ def to_ptr
26
+ @ptr
27
+ end
28
+
29
+ def info
30
+ info_ptr = ::FFI::MemoryPointer.new(FFI::Storage::VolumeInfoStruct.by_value)
31
+ result = FFI::Storage.virStorageVolGetInfo(@ptr, info_ptr)
32
+ raise Errors::LibError, "Couldn't get storage volume info" if result.negative?
33
+
34
+ StorageVolumeInfo.new(info_ptr)
35
+ end
36
+
37
+ def xml_desc(options_or_flags = nil)
38
+ flags = Util.parse_flags options_or_flags, FFI::Storage.enum_type(:xml_flags)
39
+ result = FFI::Storage.virStorageVolGetXMLDesc(@ptr, flags)
40
+ raise Errors::LibError, "Couldn't get storage volume xml desc" if result.nil?
41
+
42
+ result
43
+ end
44
+
45
+ private
46
+
47
+ def dbg(&block)
48
+ Util.log(:debug, 'Libvirt::Domain', &block)
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Libvirt
4
+ class StorageVolumeInfo < BaseInfo
5
+ struct_class FFI::Storage::VolumeInfoStruct
6
+ end
7
+ end
@@ -12,15 +12,17 @@ module Libvirt
12
12
  @opaque = nil
13
13
 
14
14
  free = ->(obj_id) do
15
+ Util.log(:debug) { "Finalize Libvirt::Stream 0x#{obj_id.to_s(16)} @stream_ptr=#{@stream_ptr}, @cb=#{@cb}, @opaque=#{@opaque}," }
15
16
  return unless @stream_ptr
17
+
16
18
  if @cb
17
19
  rcb_result = FFI::Stream.virStreamEventRemoveCallback(@stream_ptr)
18
- STDERR.puts("Couldn't remove callback Libvirt::Stream (0x#{obj_id.to_s(16)}) pointer #{@stream_ptr.address}") if rcb_result < 0
20
+ warn("Couldn't remove callback Libvirt::Stream (0x#{obj_id.to_s(16)}) pointer #{@stream_ptr.address}") if rcb_result.negative?
19
21
  ab_result = FFI::Stream.virStreamAbort(@stream_ptr)
20
- STDERR.puts("Couldn't abort Libvirt::Stream (0x#{obj_id.to_s(16)}) pointer #{@stream_ptr.address}") if ab_result < 0
22
+ warn("Couldn't abort Libvirt::Stream (0x#{obj_id.to_s(16)}) pointer #{@stream_ptr.address}") if ab_result.negative?
21
23
  end
22
24
  fr_result = FFI::Stream.virStreamFree(@stream_ptr)
23
- STDERR.puts("Couldn't free Libvirt::Stream (0x#{obj_id.to_s(16)}) pointer #{@stream_ptr.address}") if fr_result < 0
25
+ warn("Couldn't free Libvirt::Stream (0x#{obj_id.to_s(16)}) pointer #{@stream_ptr.address}") if fr_result.negative?
24
26
  end
25
27
  ObjectSpace.define_finalizer(self, free)
26
28
  end
@@ -35,16 +37,16 @@ module Libvirt
35
37
  def event_add_callback(events, opaque, &block)
36
38
  dbg { "#event_add_callback events=#{events}, opaque=#{opaque}" }
37
39
 
38
- raise Error, 'callback already added' unless @cb.nil?
40
+ raise Errors::LibError, 'callback already added' unless @cb.nil?
39
41
 
40
42
  @opaque = opaque
41
- @cb = ::FFI::Function.new(:void, [:pointer, :int, :pointer]) do |_stream_ptr, evs, _op|
43
+ @cb = FFI::Stream.callback_function(:virStreamEventCallback) do |_stream_ptr, evs, _op|
42
44
  # stream = Stream.new(stream_ptr)
43
45
  block.call(self, evs, @opaque)
44
46
  end
45
47
 
46
48
  result = FFI::Stream.virStreamEventAddCallback(@stream_ptr, events, @cb, nil, nil)
47
- raise Error, "Couldn't add stream event callback" if result < 0
49
+ raise Errors::LibError, "Couldn't add stream event callback" if result.negative?
48
50
 
49
51
  true
50
52
  end
@@ -54,7 +56,8 @@ module Libvirt
54
56
  dbg { "#event_update_callback events=#{events}" }
55
57
 
56
58
  result = FFI::Stream.virStreamEventUpdateCallback(@stream_ptr, events)
57
- raise Error, "Couldn't remove stream event callback" if result < 0
59
+ raise Errors::LibError, "Couldn't remove stream event callback" if result.negative?
60
+
58
61
  true
59
62
  end
60
63
 
@@ -62,7 +65,8 @@ module Libvirt
62
65
  dbg { '#event_remove_callback' }
63
66
 
64
67
  result = FFI::Stream.virStreamEventRemoveCallback(@stream_ptr)
65
- raise Error, "Couldn't remove stream event callback" if result < 0
68
+ raise Errors::LibError, "Couldn't remove stream event callback" if result.negative?
69
+
66
70
  opaque = @opaque
67
71
  @cb = nil
68
72
  @opaque = nil
@@ -71,21 +75,24 @@ module Libvirt
71
75
 
72
76
  def finish
73
77
  result = FFI::Stream.virStreamFinish(@stream_ptr)
74
- raise Error, "Couldn't remove stream event callback" if result < 0
78
+ raise Errors::LibError, "Couldn't remove stream event callback" if result.negative?
79
+
75
80
  @cb = nil
76
81
  @opaque = nil
77
82
  end
78
83
 
79
84
  def abort_stream
80
85
  result = FFI::Stream.virStreamAbort(@stream_ptr)
81
- raise Error, "Couldn't remove stream event callback" if result < 0
86
+ raise Errors::LibError, "Couldn't remove stream event callback" if result.negative?
87
+
82
88
  @cb = nil
83
89
  @opaque = nil
84
90
  end
85
91
 
86
92
  def free_stream
87
93
  result = FFI::Stream.virStreamFree(@stream_ptr)
88
- raise Error, "Couldn't free stream event callback" if result < 0
94
+ raise Errors::LibError, "Couldn't free stream event callback" if result.negative?
95
+
89
96
  @cb = nil
90
97
  @opaque = nil
91
98
  @stream_ptr = nil
@@ -97,14 +104,14 @@ module Libvirt
97
104
  if result == -1
98
105
  abort_stream
99
106
  [-1, nil]
100
- elsif result == 0
107
+ elsif result.zero?
101
108
  [0, nil]
102
109
  elsif result == -2
103
110
  [-2, nil]
104
- elsif result > 0
111
+ elsif result.positive?
105
112
  [result, buffer.read_bytes(result)]
106
113
  else
107
- raise Error, "Invalid response from virStreamRecv #{result.inspect}"
114
+ raise Errors::LibError, "Invalid response from virStreamRecv #{result.inspect}"
108
115
  end
109
116
  end
110
117
 
data/lib/libvirt/util.rb CHANGED
@@ -2,23 +2,36 @@
2
2
 
3
3
  module Libvirt
4
4
  module Util
5
- class << self
5
+ UNIT_TO_BYTES = {
6
+ b: 1,
7
+ bytes: 1,
8
+ KB: 1_000,
9
+ KiB: 1_024,
10
+ k: 1_024,
11
+ MB: 1_000_000,
12
+ M: 1_048_576,
13
+ MiB: 1_048_576,
14
+ GB: 1_000_000_000,
15
+ G: 1_073_741_824,
16
+ GiB: 1_073_741_824,
17
+ TB: 1_000_000_000_000,
18
+ T: 1_099_511_627_776,
19
+ TiB: 1_099_511_627_776
20
+ }.freeze
6
21
 
7
- def logger=(logger)
8
- @logger = logger
9
- end
22
+ class << self
23
+ attr_writer :logger
10
24
 
11
- def logger
12
- @logger
13
- end
25
+ attr_reader :logger
14
26
 
15
27
  def log(severity, prog = nil, &block)
16
28
  return if @logger.nil?
29
+
17
30
  @logger.public_send(severity, prog, &block)
18
31
  end
19
32
 
20
33
  def library_path
21
- %w(libvirt libvirt.so.0)
34
+ %w[libvirt libvirt.so.0]
22
35
  end
23
36
 
24
37
  # @param [Integer] version_number ulong
@@ -36,13 +49,53 @@ module Libvirt
36
49
  def parse_enum(enum, value)
37
50
  if value.is_a?(Symbol)
38
51
  raise ArgumentError, 'invalid enum value' unless enum.symbols.include?(value)
52
+
39
53
  return [enum.find(value), value]
40
54
  end
41
55
 
42
56
  raise ArgumentError, 'invalid enum value' unless enum.symbol_map.values.include?(value)
57
+
43
58
  [value, enum.symbol_map[value]]
44
59
  end
45
60
 
61
+ # Bitwise OR integer flags calculation for C language.
62
+ # @param flags [Integer,Symbol,Array<Symbol>,Hash{Symbol=>Boolean},nil]
63
+ # @param enum [FFI::Enum]
64
+ # @param default [Integer] optional (default 0x0)
65
+ # @return [Integer] bitwise OR of keys
66
+ # @example Usage:
67
+ # parse_flags(nil, enum)
68
+ # parse_flags({MANAGED_SAVE: true, SNAPSHOTS_METADATA: true, NVRAM: false}, enum)
69
+ # parse_flags({managed_save: true, snapshots_metadata: true, keep_nvram: nil}, enum)
70
+ # parse_flags(3, enum)
71
+ # parse_flags([:MANAGED_SAVE, :SNAPSHOTS_METADATA], enum)
72
+ # parse_flags([:managed_save, :snapshots_metadata], enum)
73
+ #
74
+ def parse_flags(flags, enum, default: 0x0)
75
+ flags = default if flags.nil?
76
+ flags = enum[flags] if flags.is_a?(Symbol)
77
+ return flags if flags.is_a?(Integer)
78
+
79
+ result = 0x0
80
+ flags = flags.select { |_, v| v }.keys if flags.is_a?(Hash)
81
+
82
+ raise ArgumentError, 'flags must be an Integer or a Hash or an Array' unless flags.is_a?(Array)
83
+
84
+ flags.each do |key|
85
+ result |= enum[key.to_s.upcase.to_sym]
86
+ end
87
+
88
+ result
89
+ end
90
+
91
+ # @param value [Integer,String]
92
+ # @param unit [String,Symbol] default 'bytes'
93
+ # @return [Integer] memory in bytes
94
+ def parse_memory(value, unit)
95
+ unit ||= 'bytes'
96
+ multiplier = UNIT_TO_BYTES.fetch(unit.to_sym)
97
+ Integer(value) * multiplier
98
+ end
46
99
  end
47
100
  end
48
101
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Libvirt
4
- VERSION = '0.4.1'
4
+ VERSION = '0.5.0'
5
5
  end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Libvirt
4
+ module Xml
5
+ class Disk < Generic
6
+ # https://libvirt.org/formatdomain.html#elementsDisks
7
+
8
+ attribute :type, type: :attr
9
+ attribute :device, type: :attr
10
+ attribute :model, type: :attr
11
+ attribute :raw_io, type: :attr, name: :rawio, cast: :bool
12
+ attribute :sg_io, type: :attr, name: :sgio
13
+ attribute :snapshot, type: :attr
14
+ attribute :source_file, name: :file, path: './source', type: :attr
15
+ attribute :source_dev, name: :dev, path: './source', type: :attr
16
+ attribute :source_dir, name: :dir, path: './source', type: :attr
17
+ attribute :source_protocol, name: :protocol, path: './source', type: :attr
18
+ attribute :source_pool, name: :pool, path: './source', type: :attr
19
+ attribute :source_volume, name: :volume, path: './source', type: :attr
20
+ attribute :source_mode, name: :mode, path: './source', type: :attr
21
+ attribute :source_name, name: :name, path: './source', type: :attr
22
+ attribute :source_type, name: :type, path: './source', type: :attr
23
+ attribute :source_managed, name: :managed, path: './source', type: :attr, cast: :bool
24
+ attribute :source_namespace, name: :namespace, path: './source', type: :attr
25
+ attribute :source_index, name: :index, path: './source', type: :attr
26
+ attribute :source_host_name, name: :name, path: './source/host', type: :attr
27
+ attribute :source_host_port, name: :port, path: './source/host', type: :attr
28
+ attribute :source_host_transport, name: :transport, path: './source/host', type: :attr
29
+ attribute :source_host_socket, name: :socket, path: './source/host', type: :attr
30
+ attribute :source_snapshot_name, name: :name, path: './source/snapshot', type: :attr
31
+ attribute :source_config_file, name: :file, path: './source/config', type: :attr
32
+ # TODO: source/auth
33
+ # TODO: source/encryption
34
+ # TODO: source/reservations
35
+ # TODO: source/initiator
36
+ # TODO: source/address
37
+ # TODO: source/slices
38
+ # TODO: backingStore
39
+ # TODO: mirror
40
+ # TODO: target
41
+ # TODO: iotune
42
+ # TODO: driver
43
+ # TODO: backenddomain
44
+ # TODO: boot
45
+ # TODO: encryption
46
+ # TODO: readonly
47
+ # TODO: shareable
48
+ # TODO: transient
49
+ # TODO: serial
50
+ # TODO: wwn
51
+ # TODO: vendor
52
+ # TODO: product
53
+ # TODO: address
54
+ # TODO: auth
55
+ # TODO: geometry
56
+ # TODO: blockio
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Libvirt
4
+ module Xml
5
+ class Domain < Generic
6
+ # https://libvirt.org/formatdomain.html
7
+
8
+ root_path './domain'
9
+
10
+ attribute :name
11
+ attribute :uuid
12
+ attribute :gen_id, path: './genid'
13
+ attribute :title
14
+ attribute :description
15
+ attribute :metadata, type: :raw
16
+ attribute :vcpu, type: :struct, class: MaxVcpu
17
+ attribute :vcpus, type: :struct, array: true, class: Vcpu, cast: ->(objects) { objects.sort_by(&:id) }
18
+ attribute :memory, type: :struct, class: Memory
19
+ attribute :current_memory, type: :struct, class: Memory
20
+ attribute :max_memory, type: :struct, class: Memory
21
+ attribute :resource_partitions, path: './resource/partition', array: true
22
+ attribute :on_power_off
23
+ attribute :on_reboot
24
+ attribute :on_crash
25
+ attribute :on_lock_failure
26
+ attribute :device_graphics, type: :struct, path: './devices/graphics', class: Graphics, array: true
27
+ attribute :device_disks, type: :struct, path: './devices/disk', class: Disk, array: true
28
+ # https://libvirt.org/formatdomain.html#elementsDevices
29
+ # todo devices/emulator
30
+ # todo devices/interface
31
+ # todo devices/filesystem
32
+ # todo devices/controller
33
+ # todo devices/lease
34
+ # todo devices/hostdev
35
+ # todo devices/redirdev
36
+ # todo devices/smartcard
37
+ # todo devices/input
38
+ # todo devices/hub
39
+ # todo devices/video
40
+ # todo devices/parallel
41
+ # todo devices/serial
42
+ # todo devices/console
43
+ # todo devices/channel
44
+ # todo devices/sound
45
+ # todo devices/watchdog
46
+ # todo devices/memballoon
47
+ # todo devices/rng
48
+ # todo devices/tpm
49
+ # todo devices/nvram
50
+ # todo devices/panic
51
+ # todo devices/shmem
52
+ # todo devices/memory
53
+ # todo devices/iommu
54
+ # todo devices/vsock
55
+ # todo os
56
+ # todo bootloader
57
+ # todo bootloader_args
58
+ # todo sysinfo
59
+ # todo iothreads
60
+ # todo iothreadids
61
+ # todo cputune
62
+ # todo memoryBacking
63
+ # todo memtune
64
+ # todo numatune
65
+ # todo blkiotune
66
+ # todo cpu
67
+ # todo pm
68
+ # todo features
69
+ # todo clock
70
+ # todo perf
71
+ # todo seclabel
72
+ # todo keywrap
73
+ # todo launchSecurity
74
+ end
75
+ end
76
+ end