libvirt_ffi 0.5.6 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|