libvirt_ffi 0.5.6 → 0.6.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.
- checksums.yaml +4 -4
- data/lib/libvirt.rb +1 -1
- data/lib/libvirt/connection.rb +55 -5
- data/lib/libvirt/domain.rb +5 -2
- data/lib/libvirt/ffi/domain.rb +4 -2
- data/lib/libvirt/ffi/host.rb +9 -1
- data/lib/libvirt/ffi/storage.rb +85 -0
- data/lib/libvirt/{domain_callback_storage.rb → host_callback_storage.rb} +4 -4
- data/lib/libvirt/storage_pool.rb +15 -0
- data/lib/libvirt/util.rb +2 -0
- data/lib/libvirt/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bf7335e98f7be6c9145bad5d2fdc6322b9dda60f31ddb92afd2ce76ebfd95d34
|
4
|
+
data.tar.gz: 2c8fe7a75a8778709860128b466faa04d511ed1eb6eec0913a15bee9202a1d67
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 756e46ad598baa4996961a191398b924059333ea248ae4df26c950a340a8a683e44a3bef80995f07b1d2968e56be3a27965c882dafc891f879114c703ab1cd4c
|
7
|
+
data.tar.gz: eb82fede907f3c40474a894d428da233058ef502e6f0fe891c135c1733fe3bcb02f54df0951188bd0a8c779e1800b309ecc4b985d6ca8e504adbeff13f8143f3
|
data/lib/libvirt.rb
CHANGED
data/lib/libvirt/connection.rb
CHANGED
@@ -3,19 +3,37 @@
|
|
3
3
|
module Libvirt
|
4
4
|
class Connection
|
5
5
|
DOMAIN_EVENT_IDS = FFI::Domain.enum_type(:event_id).symbols.dup.freeze
|
6
|
+
POOL_EVENT_IDS = FFI::Storage.enum_type(:event_id).symbols.dup.freeze
|
6
7
|
|
7
|
-
|
8
|
+
DOMAIN_STORAGE = HostCallbackStorage.new
|
9
|
+
POOL_STORAGE = HostCallbackStorage.new
|
8
10
|
|
9
11
|
DOMAIN_EVENT_CALLBACKS = DOMAIN_EVENT_IDS.map do |event_id_sym|
|
10
12
|
func = FFI::Domain.event_callback_for(event_id_sym) do |conn_ptr, dom_ptr, *args, op_ptr|
|
13
|
+
Util.log(:debug, "DOMAIN_EVENT_CALLBACKS[#{event_id_sym}]") do
|
14
|
+
"inside callback conn_ptr=#{conn_ptr}, pool_ptr=#{dom_ptr}, args=#{args}, op_ptr=#{op_ptr}"
|
15
|
+
end
|
11
16
|
connection = Connection.load_ref(conn_ptr)
|
12
17
|
domain = Domain.load_ref(dom_ptr)
|
13
|
-
block, opaque =
|
18
|
+
block, opaque = DOMAIN_STORAGE.retrieve_from_pointer(op_ptr)
|
14
19
|
block.call(connection, domain, *args, opaque)
|
15
20
|
end
|
16
21
|
[event_id_sym, func]
|
17
22
|
end.to_h.freeze
|
18
23
|
|
24
|
+
POOL_EVENT_CALLBACKS = POOL_EVENT_IDS.map do |event_id_sym|
|
25
|
+
func = FFI::Storage.event_callback_for(event_id_sym) do |conn_ptr, pool_ptr, *args, op_ptr|
|
26
|
+
Util.log(:debug, "POOL_EVENT_CALLBACKS[#{event_id_sym}]") do
|
27
|
+
"inside callback conn_ptr=#{conn_ptr}, pool_ptr=#{pool_ptr}, args=#{args}, op_ptr=#{op_ptr}"
|
28
|
+
end
|
29
|
+
connection = Connection.load_ref(conn_ptr)
|
30
|
+
pool = StoragePool.load_ref(pool_ptr)
|
31
|
+
block, opaque = POOL_STORAGE.retrieve_from_pointer(op_ptr)
|
32
|
+
block.call(connection, pool, *args, opaque)
|
33
|
+
end
|
34
|
+
[event_id_sym, func]
|
35
|
+
end.to_h.freeze
|
36
|
+
|
19
37
|
def self.load_ref(conn_ptr)
|
20
38
|
ref_result = FFI::Host.virConnectRef(conn_ptr)
|
21
39
|
raise Errors::LibError, "Couldn't retrieve connection reference" if ref_result.negative?
|
@@ -163,7 +181,7 @@ module Libvirt
|
|
163
181
|
event_id, event_id_sym = Util.parse_enum(enum, event_id)
|
164
182
|
cb = DOMAIN_EVENT_CALLBACKS.fetch(event_id_sym)
|
165
183
|
|
166
|
-
cb_data, cb_data_free_func =
|
184
|
+
cb_data, cb_data_free_func = DOMAIN_STORAGE.allocate_struct
|
167
185
|
|
168
186
|
result = FFI::Domain.virConnectDomainEventRegisterAny(
|
169
187
|
@conn_ptr,
|
@@ -178,7 +196,7 @@ module Libvirt
|
|
178
196
|
raise Errors::LibError, "Couldn't register domain event callback"
|
179
197
|
end
|
180
198
|
|
181
|
-
|
199
|
+
DOMAIN_STORAGE.store_struct(
|
182
200
|
cb_data,
|
183
201
|
connection_pointer: @conn_ptr,
|
184
202
|
callback_id: result,
|
@@ -195,10 +213,42 @@ module Libvirt
|
|
195
213
|
raise Errors::LibError, "Couldn't deregister domain event callback" if result.negative?
|
196
214
|
|
197
215
|
# virConnectDomainEventDeregisterAny will call free func
|
198
|
-
# So we don't need to remove object from
|
216
|
+
# So we don't need to remove object from DOMAIN_STORAGE here.
|
199
217
|
true
|
200
218
|
end
|
201
219
|
|
220
|
+
def register_storage_pool_event_callback(event_id, storage_pool = nil, opaque = nil, &block)
|
221
|
+
dbg { "#register_storage_pool_event_callback event_id=#{event_id}" }
|
222
|
+
|
223
|
+
enum = FFI::Storage.enum_type(:event_id)
|
224
|
+
event_id, event_id_sym = Util.parse_enum(enum, event_id)
|
225
|
+
cb = POOL_EVENT_CALLBACKS.fetch(event_id_sym)
|
226
|
+
|
227
|
+
cb_data, cb_data_free_func = POOL_STORAGE.allocate_struct
|
228
|
+
|
229
|
+
result = FFI::Storage.virConnectStoragePoolEventRegisterAny(
|
230
|
+
@conn_ptr,
|
231
|
+
storage_pool&.to_ptr,
|
232
|
+
event_id,
|
233
|
+
cb,
|
234
|
+
cb_data.pointer,
|
235
|
+
cb_data_free_func
|
236
|
+
)
|
237
|
+
if result.negative?
|
238
|
+
cb_data.pointer.free
|
239
|
+
raise Errors::LibError, "Couldn't register storage pool event callback"
|
240
|
+
end
|
241
|
+
|
242
|
+
POOL_STORAGE.store_struct(
|
243
|
+
cb_data,
|
244
|
+
connection_pointer: @conn_ptr,
|
245
|
+
callback_id: result,
|
246
|
+
cb: block,
|
247
|
+
opaque: opaque
|
248
|
+
)
|
249
|
+
result
|
250
|
+
end
|
251
|
+
|
202
252
|
def lib_version
|
203
253
|
version_ptr = ::FFI::MemoryPointer.new(:ulong)
|
204
254
|
result = FFI::Host.virConnectGetLibVersion(@conn_ptr, version_ptr)
|
data/lib/libvirt/domain.rb
CHANGED
@@ -38,7 +38,7 @@ module Libvirt
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def uuid
|
41
|
-
buff = ::FFI::MemoryPointer.new(:char,
|
41
|
+
buff = ::FFI::MemoryPointer.new(:char, Util::UUID_STRING_BUFLEN)
|
42
42
|
result = FFI::Domain.virDomainGetUUIDString(@dom_ptr, buff)
|
43
43
|
raise Errors::LibError, "Couldn't get domain uuid" if result.negative?
|
44
44
|
|
@@ -46,7 +46,10 @@ module Libvirt
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def name
|
49
|
-
FFI::Domain.virDomainGetName(@dom_ptr)
|
49
|
+
result = FFI::Domain.virDomainGetName(@dom_ptr)
|
50
|
+
raise Errors::LibError, "Couldn't retrieve storage pool name" if result.nil?
|
51
|
+
|
52
|
+
result
|
50
53
|
end
|
51
54
|
|
52
55
|
def max_vcpus
|
data/lib/libvirt/ffi/domain.rb
CHANGED
@@ -9,8 +9,6 @@ module Libvirt
|
|
9
9
|
extend Helpers
|
10
10
|
ffi_lib Util.library_path
|
11
11
|
|
12
|
-
UUID_STRING_BUFLEN = 0x80 # RFC4122
|
13
|
-
|
14
12
|
EVENT_ID_TO_CALLBACK = {
|
15
13
|
LIFECYCLE: :virConnectDomainEventCallback,
|
16
14
|
REBOOT: :virConnectDomainEventGenericCallback,
|
@@ -812,6 +810,10 @@ module Libvirt
|
|
812
810
|
detail_enum[detail]
|
813
811
|
end
|
814
812
|
|
813
|
+
# Converts state reason of domain from integer to symbol name.
|
814
|
+
# @param state [Symbol] enum :state (virDomainState)
|
815
|
+
# @param reason [Integer]
|
816
|
+
# @return [Symbol]
|
815
817
|
def self.state_reason(state, reason)
|
816
818
|
reason_enum = enum_type(:"#{state.to_s.downcase}_reason")
|
817
819
|
reason_enum[reason]
|
data/lib/libvirt/ffi/host.rb
CHANGED
@@ -31,6 +31,14 @@ module Libvirt
|
|
31
31
|
:threads, :uint
|
32
32
|
end
|
33
33
|
|
34
|
+
# enum virConnectCloseReason
|
35
|
+
enum :close_reason, [
|
36
|
+
:ERROR, 0x0, # Misc I/O error
|
37
|
+
:EOF, 0x1, # End-of-file from server
|
38
|
+
:KEEPALIVE, 0x2, # Keepalive timer triggered
|
39
|
+
:CLIENT, 0x3 # Client requested it
|
40
|
+
]
|
41
|
+
|
34
42
|
# int virGetVersion (
|
35
43
|
# unsigned long *libVer,
|
36
44
|
# const char *type,
|
@@ -49,7 +57,7 @@ module Libvirt
|
|
49
57
|
# int reason,
|
50
58
|
# void * opaque
|
51
59
|
# )
|
52
|
-
callback :virConnectCloseFunc, [:pointer, :
|
60
|
+
callback :virConnectCloseFunc, [:pointer, :close_reason, :pointer], :void
|
53
61
|
|
54
62
|
# virConnectPtr virConnectOpen (const char * name)
|
55
63
|
attach_function :virConnectOpen, [:string], :pointer
|
data/lib/libvirt/ffi/storage.rb
CHANGED
@@ -9,6 +9,11 @@ module Libvirt
|
|
9
9
|
extend Helpers
|
10
10
|
ffi_lib Util.library_path
|
11
11
|
|
12
|
+
EVENT_ID_TO_CALLBACK = {
|
13
|
+
LIFECYCLE: :virConnectStoragePoolEventLifecycleCallback,
|
14
|
+
REFRESH: :virConnectStoragePoolEventGenericCallback
|
15
|
+
}.freeze
|
16
|
+
|
12
17
|
# enum virStoragePoolState
|
13
18
|
enum :pool_state, [
|
14
19
|
:INACTIVE, 0x0, # Not running
|
@@ -63,6 +68,23 @@ module Libvirt
|
|
63
68
|
:INACTIVE, 0x1 # dump inactive pool/volume information
|
64
69
|
]
|
65
70
|
|
71
|
+
# enum virStoragePoolEventID
|
72
|
+
enum :event_id, [
|
73
|
+
:LIFECYCLE, 0x0, # virConnectStoragePoolEventLifecycleCallback
|
74
|
+
:REFRESH, 0x1 # virConnectStoragePoolEventGenericCallback
|
75
|
+
]
|
76
|
+
|
77
|
+
# enum virStoragePoolEventLifecycleType
|
78
|
+
enum :event_lifecycle_type, [
|
79
|
+
:DEFINED, 0x0,
|
80
|
+
:UNDEFINED, 0x1,
|
81
|
+
:STARTED, 0x2,
|
82
|
+
:STOPPED, 0x3,
|
83
|
+
:CREATED, 0x4,
|
84
|
+
:DELETED, 0x5,
|
85
|
+
:LAST, 0x6
|
86
|
+
]
|
87
|
+
|
66
88
|
# struct virStoragePoolInfo {
|
67
89
|
# int state # virStoragePoolState flags
|
68
90
|
# unsigned long long capacity # Logical size bytes
|
@@ -87,6 +109,26 @@ module Libvirt
|
|
87
109
|
:allocation, :ulong_long
|
88
110
|
end
|
89
111
|
|
112
|
+
# typedef void (*virConnectStoragePoolEventGenericCallback) (
|
113
|
+
# virConnectPtr conn,
|
114
|
+
# virStoragePoolPtr pool,
|
115
|
+
# void * opaque
|
116
|
+
# )
|
117
|
+
callback :virConnectStoragePoolEventGenericCallback,
|
118
|
+
[:pointer, :pointer, :pointer],
|
119
|
+
:void
|
120
|
+
|
121
|
+
# typedef void (*virConnectStoragePoolEventLifecycleCallback) (
|
122
|
+
# virConnectPtr conn,
|
123
|
+
# virStoragePoolPtr pool,
|
124
|
+
# int event,
|
125
|
+
# int detail,
|
126
|
+
# void * opaque
|
127
|
+
# )
|
128
|
+
callback :virConnectStoragePoolEventLifecycleCallback,
|
129
|
+
[:pointer, :pointer, :event_lifecycle_type, :int, :pointer],
|
130
|
+
:void
|
131
|
+
|
90
132
|
# int virConnectListAllStoragePools (
|
91
133
|
# virConnectPtr conn,
|
92
134
|
# virStoragePoolPtr ** pools,
|
@@ -144,6 +186,49 @@ module Libvirt
|
|
144
186
|
# unsigned int flags
|
145
187
|
# )
|
146
188
|
attach_function :virStorageVolGetXMLDesc, [:pointer, :xml_flags], :string
|
189
|
+
|
190
|
+
# int virConnectStoragePoolEventRegisterAny (
|
191
|
+
# virConnectPtr conn,
|
192
|
+
# virStoragePoolPtr pool,
|
193
|
+
# int eventID,
|
194
|
+
# virConnectStoragePoolEventGenericCallback cb,
|
195
|
+
# void * opaque,
|
196
|
+
# virFreeCallback freecb
|
197
|
+
# )
|
198
|
+
attach_function :virConnectStoragePoolEventRegisterAny,
|
199
|
+
[:pointer, :pointer, :event_id, :pointer, :pointer, FFI::Common::FREE_CALLBACK],
|
200
|
+
:int
|
201
|
+
|
202
|
+
# int virConnectStoragePoolEventDeregisterAny (
|
203
|
+
# virConnectPtr conn,
|
204
|
+
# int callbackID
|
205
|
+
# )
|
206
|
+
attach_function :virConnectStoragePoolEventDeregisterAny,
|
207
|
+
[:pointer, :int],
|
208
|
+
:int
|
209
|
+
|
210
|
+
# int virStoragePoolGetUUIDString (virStoragePoolPtr pool,
|
211
|
+
# char * buf)
|
212
|
+
attach_function :virStoragePoolGetUUIDString, [:pointer, :pointer], :int
|
213
|
+
|
214
|
+
# const char * virStoragePoolGetName (virStoragePoolPtr pool)
|
215
|
+
attach_function :virStoragePoolGetName, [:pointer], :string
|
216
|
+
|
217
|
+
module_function
|
218
|
+
|
219
|
+
# Creates event callback function for provided event_id
|
220
|
+
# @param event_id [Integer,Symbol]
|
221
|
+
# @yield connect_ptr, domain_ptr, *args, opaque_ptr
|
222
|
+
# @return [FFI::Function]
|
223
|
+
def event_callback_for(event_id, &block)
|
224
|
+
event_id_sym = event_id.is_a?(Symbol) ? event_id : enum_type(:event_id)[event_id]
|
225
|
+
|
226
|
+
callback_name = EVENT_ID_TO_CALLBACK.fetch(event_id_sym)
|
227
|
+
callback_function(callback_name) do |*args|
|
228
|
+
Util.log(:debug, name) { ".event_callback_for #{event_id_sym} CALLBACK #{args.map(&:to_s).join(', ')}," }
|
229
|
+
block.call(*args)
|
230
|
+
end
|
231
|
+
end
|
147
232
|
end
|
148
233
|
end
|
149
234
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Libvirt
|
4
|
-
class
|
4
|
+
class HostCallbackStorage
|
5
5
|
class CallbackDataStruct < ::FFI::Struct
|
6
6
|
layout :connection_pointer, :pointer,
|
7
7
|
:callback_id, :int
|
@@ -12,7 +12,7 @@ module Libvirt
|
|
12
12
|
end
|
13
13
|
|
14
14
|
# @return [Array<2>]
|
15
|
-
# cb_data [Libvirt::
|
15
|
+
# cb_data [Libvirt::HostCallbackStorage::CallbackDataStruct],
|
16
16
|
# cb_data_free_func [FFI::Function]
|
17
17
|
def allocate_struct
|
18
18
|
dbg { '#allocate_struct' }
|
@@ -20,7 +20,7 @@ module Libvirt
|
|
20
20
|
cb_data_ptr = ::FFI::MemoryPointer.new(:char, CallbackDataStruct.size, false)
|
21
21
|
cb_data = CallbackDataStruct.new(cb_data_ptr)
|
22
22
|
cb_data_free_func = FFI::Common.free_function do |pointer|
|
23
|
-
dbg { 'Libvirt::
|
23
|
+
dbg { 'Libvirt::HostCallbackStorage cb_data_free_func triggered' }
|
24
24
|
remove_struct(pointer)
|
25
25
|
end
|
26
26
|
[cb_data, cb_data_free_func]
|
@@ -63,7 +63,7 @@ module Libvirt
|
|
63
63
|
private
|
64
64
|
|
65
65
|
def dbg(&block)
|
66
|
-
Util.log(:debug, 'Libvirt::
|
66
|
+
Util.log(:debug, 'Libvirt::HostCallbackStorage', &block)
|
67
67
|
end
|
68
68
|
end
|
69
69
|
end
|
data/lib/libvirt/storage_pool.rb
CHANGED
@@ -61,6 +61,21 @@ module Libvirt
|
|
61
61
|
ptr.get_array_of_pointer(0, size).map { |stv_ptr| StorageVolume.new(stv_ptr) }
|
62
62
|
end
|
63
63
|
|
64
|
+
def uuid
|
65
|
+
buff = ::FFI::MemoryPointer.new(:char, Util::UUID_STRING_BUFLEN)
|
66
|
+
result = FFI::Storage.virStoragePoolGetUUIDString(@ptr, buff)
|
67
|
+
raise Errors::LibError, "Couldn't get storage pool uuid" if result.negative?
|
68
|
+
|
69
|
+
buff.read_string
|
70
|
+
end
|
71
|
+
|
72
|
+
def name
|
73
|
+
result = FFI::Storage.virStoragePoolGetName(@ptr)
|
74
|
+
raise Errors::LibError, "Couldn't retrieve storage pool name" if result.nil?
|
75
|
+
|
76
|
+
result
|
77
|
+
end
|
78
|
+
|
64
79
|
private
|
65
80
|
|
66
81
|
def dbg(&block)
|
data/lib/libvirt/util.rb
CHANGED
data/lib/libvirt/version.rb
CHANGED
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
|
+
version: 0.6.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-
|
11
|
+
date: 2020-05-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi
|
@@ -61,7 +61,6 @@ files:
|
|
61
61
|
- lib/libvirt/base_info.rb
|
62
62
|
- lib/libvirt/connection.rb
|
63
63
|
- lib/libvirt/domain.rb
|
64
|
-
- lib/libvirt/domain_callback_storage.rb
|
65
64
|
- lib/libvirt/errors.rb
|
66
65
|
- lib/libvirt/event.rb
|
67
66
|
- lib/libvirt/ffi.rb
|
@@ -73,6 +72,7 @@ files:
|
|
73
72
|
- lib/libvirt/ffi/host.rb
|
74
73
|
- lib/libvirt/ffi/storage.rb
|
75
74
|
- lib/libvirt/ffi/stream.rb
|
75
|
+
- lib/libvirt/host_callback_storage.rb
|
76
76
|
- lib/libvirt/node_info.rb
|
77
77
|
- lib/libvirt/storage_pool.rb
|
78
78
|
- lib/libvirt/storage_pool_info.rb
|