libvirt_ffi 0.1.0 → 0.2.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/connection.rb +38 -5
- data/lib/libvirt/domain.rb +35 -4
- data/lib/libvirt/event.rb +0 -1
- data/lib/libvirt/ffi/connection.rb +61 -3
- data/lib/libvirt/ffi/domain.rb +38 -4
- data/lib/libvirt/ffi/event.rb +0 -4
- data/lib/libvirt/ffi/libvirt.rb +0 -3
- data/lib/libvirt/ffi/node_info.rb +37 -0
- data/lib/libvirt/node_info.rb +46 -0
- data/lib/libvirt/version.rb +1 -1
- data/lib/libvirt.rb +5 -1
- data/test_usage/test_event_loop.rb +32 -8
- metadata +4 -3
- data/lib/libvirt/lib_version.rb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8a956033faefb88d11d76587ed18a9ef066f15ecf12321d97611f53469fc8e55
|
4
|
+
data.tar.gz: f16da9c9e1311edccf72c539591a0b0892f70f36aca7fa7718ce396ab2cc5826
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 39539a7d0868f78843d388fefc3b398406a6cbf3890dd7667e8484280098c9ba2c3af45659280b338ee1f0c93ee9c45a4ffdf6246db64e7c5571d0b43abd0c39
|
7
|
+
data.tar.gz: 5a8502473cde37b1538ec2ead69d872f989b66052d2cc7c93f766557591b4b5b807f7a45e31927a7b07b9b1361ecd9f8b9d827b3b7768f19f1694e46ef8a5e42
|
data/lib/libvirt/connection.rb
CHANGED
@@ -1,10 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'objspace'
|
4
|
-
require 'libvirt/ffi/connection'
|
5
|
-
require 'libvirt/ffi/domain'
|
6
|
-
require 'libvirt/util'
|
7
|
-
|
8
3
|
module Libvirt
|
9
4
|
class Connection
|
10
5
|
def initialize(uri)
|
@@ -98,6 +93,44 @@ module Libvirt
|
|
98
93
|
true
|
99
94
|
end
|
100
95
|
|
96
|
+
def version
|
97
|
+
version_ptr = ::FFI::MemoryPointer.new(:ulong)
|
98
|
+
result = FFI::Connection.virConnectGetVersion(@conn_ptr, version_ptr)
|
99
|
+
raise Error, "Couldn't get connection version" if result < 0
|
100
|
+
version_number = version_ptr.get_ulong(0)
|
101
|
+
# version_number = FFI::Connection.virConnectGetVersion(@conn_ptr)
|
102
|
+
Libvirt::Util.parse_version(version_number)
|
103
|
+
end
|
104
|
+
|
105
|
+
def lib_version
|
106
|
+
version_ptr = ::FFI::MemoryPointer.new(:ulong)
|
107
|
+
result = FFI::Connection.virConnectGetLibVersion(@conn_ptr, version_ptr)
|
108
|
+
raise Error, "Couldn't get connection lib version" if result < 0
|
109
|
+
version_number = version_ptr.get_ulong(0)
|
110
|
+
# version_number = FFI::Connection.virConnectGetLibVersion(@conn_ptr)
|
111
|
+
Libvirt::Util.parse_version(version_number)
|
112
|
+
end
|
113
|
+
|
114
|
+
def hostname
|
115
|
+
FFI::Connection.virConnectGetHostname(@conn_ptr)
|
116
|
+
end
|
117
|
+
|
118
|
+
# @param type [String,NilClass]
|
119
|
+
def max_vcpus(type = nil)
|
120
|
+
FFI::Connection.virConnectGetMaxVcpus(@conn_ptr, type)
|
121
|
+
end
|
122
|
+
|
123
|
+
def capabilities
|
124
|
+
FFI::Connection.virConnectGetCapabilities(@conn_ptr)
|
125
|
+
end
|
126
|
+
|
127
|
+
def node_info
|
128
|
+
node_info_ptr = ::FFI::MemoryPointer.new(FFI::NodeInfo::Struct.by_value)
|
129
|
+
result = FFI::NodeInfo.virNodeGetInfo(@conn_ptr, node_info_ptr)
|
130
|
+
raise Error, "Couldn't get connection node info" if result < 0
|
131
|
+
NodeInfo.new(node_info_ptr)
|
132
|
+
end
|
133
|
+
|
101
134
|
private
|
102
135
|
|
103
136
|
def check_open!
|
data/lib/libvirt/domain.rb
CHANGED
@@ -1,9 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'objspace'
|
4
|
-
require 'libvirt/ffi/domain'
|
5
|
-
require 'libvirt/util'
|
6
|
-
|
7
3
|
module Libvirt
|
8
4
|
class Domain
|
9
5
|
def initialize(dom_ptr, conn)
|
@@ -25,5 +21,40 @@ module Libvirt
|
|
25
21
|
def to_ptr
|
26
22
|
@dom_ptr
|
27
23
|
end
|
24
|
+
|
25
|
+
def uuid
|
26
|
+
buff = ::FFI::MemoryPointer.new(:char, FFI::Domain::UUID_STRING_BUFLEN)
|
27
|
+
result = FFI::Domain.virDomainGetUUIDString(@dom_ptr, buff)
|
28
|
+
raise Error, "Couldn't get domain uuid" if result < 0
|
29
|
+
buff.read_string
|
30
|
+
end
|
31
|
+
|
32
|
+
def name
|
33
|
+
FFI::Domain.virDomainGetName(@dom_ptr)
|
34
|
+
end
|
35
|
+
|
36
|
+
def max_vcpus
|
37
|
+
FFI::Domain.virDomainGetMaxVcpus(@dom_ptr)
|
38
|
+
end
|
39
|
+
|
40
|
+
# def vcpus
|
41
|
+
# # https://github.com/libvirt/ruby-libvirt/blob/9f71ff5add1f57ffef7cf513b72638d92d9fd84f/ext/libvirt/domain.c#L787
|
42
|
+
# # dominfo = virDomainGetInfo
|
43
|
+
# # dominfo.nrVirtCpu
|
44
|
+
# # maxcpus = ruby_libvirt_get_maxcpus(ruby_libvirt_connect_get(d));
|
45
|
+
# # vcpu_infos_ptr
|
46
|
+
# FFI::Domain.virDomainGetVcpus(@dom_ptr, vcpu_infos_ptr, maxinfo, cpumaps, maplen)
|
47
|
+
# end
|
48
|
+
def vcpus
|
49
|
+
OpenStruct.new(count: max_vcpus)
|
50
|
+
end
|
51
|
+
|
52
|
+
def max_memory
|
53
|
+
FFI::Domain.virDomainGetMaxMemory(@dom_ptr)
|
54
|
+
end
|
55
|
+
|
56
|
+
def xml_desc(flags = 0)
|
57
|
+
FFI::Domain.virDomainGetXMLDesc(@dom_ptr, flags)
|
58
|
+
end
|
28
59
|
end
|
29
60
|
end
|
data/lib/libvirt/event.rb
CHANGED
@@ -1,14 +1,44 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'ffi'
|
4
|
-
require 'libvirt/util'
|
5
|
-
|
6
3
|
module Libvirt
|
7
4
|
module FFI
|
8
5
|
module Connection
|
9
6
|
extend ::FFI::Library
|
10
7
|
ffi_lib Util.library_path
|
11
8
|
|
9
|
+
# struct virNodeInfo {
|
10
|
+
#
|
11
|
+
# char model[32] model - string indicating the CPU model
|
12
|
+
# unsigned long memory - memory size in kilobytes
|
13
|
+
# unsigned int cpus - the number of active CPUs
|
14
|
+
# unsigned int mhz - expected CPU frequency, 0 if not known or on unusual architectures
|
15
|
+
# unsigned int nodes - the number of NUMA cell, 1 for unusual NUMA topologies or uniform memory access; check capabilities XML for the actual NUMA topology
|
16
|
+
# unsigned int sockets - number of CPU sockets per node if nodes > 1, 1 in case of unusual NUMA topology
|
17
|
+
# unsigned int cores - number of cores per socket, total number of processors in case of unusual NUMA topolog
|
18
|
+
# unsigned int threads - number of threads per core, 1 in case of unusual numa topology
|
19
|
+
# }
|
20
|
+
class NodeInfoStruct < ::FFI::Struct
|
21
|
+
layout :model, [:char, 32],
|
22
|
+
:memory, :ulong,
|
23
|
+
:cpus, :ulong,
|
24
|
+
:mhz, :ulong,
|
25
|
+
:nodes, :ulong,
|
26
|
+
:sockets, :ulong,
|
27
|
+
:cores, :ulong,
|
28
|
+
:threads, :ulong
|
29
|
+
end
|
30
|
+
|
31
|
+
class NodeInfo
|
32
|
+
def initialize(node_info_ptr, node_info_struct)
|
33
|
+
@node_info_ptr = node_info_ptr
|
34
|
+
@node_info_struct = node_info_struct
|
35
|
+
end
|
36
|
+
|
37
|
+
def [](attr)
|
38
|
+
@node_info_struct[attr]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
12
42
|
# virConnectPtr virConnectOpen (const char * name)
|
13
43
|
attach_function :virConnectOpen, [:string], :pointer
|
14
44
|
|
@@ -21,6 +51,34 @@ module Libvirt
|
|
21
51
|
# unsigned int count
|
22
52
|
# )
|
23
53
|
attach_function :virConnectSetKeepAlive, [:pointer, :int, :uint], :int
|
54
|
+
|
55
|
+
# int virConnectGetVersion (
|
56
|
+
# virConnectPtr conn,
|
57
|
+
# unsigned long * hvVer
|
58
|
+
# )
|
59
|
+
attach_function :virConnectGetVersion, [:pointer, :pointer], :int
|
60
|
+
|
61
|
+
# int virConnectGetLibVersion (
|
62
|
+
# virConnectPtr conn,
|
63
|
+
# unsigned long * libVer
|
64
|
+
# )
|
65
|
+
attach_function :virConnectGetLibVersion, [:pointer, :pointer], :int
|
66
|
+
|
67
|
+
# char * virConnectGetHostname (
|
68
|
+
# virConnectPtr conn
|
69
|
+
# )
|
70
|
+
attach_function :virConnectGetHostname, [:pointer], :string # strptr ?
|
71
|
+
|
72
|
+
# int virConnectGetMaxVcpus (
|
73
|
+
# virConnectPtr conn,
|
74
|
+
# const char * type
|
75
|
+
# )
|
76
|
+
attach_function :virConnectGetMaxVcpus, [:pointer, :string], :int
|
77
|
+
|
78
|
+
# char * virConnectGetCapabilities (
|
79
|
+
# virConnectPtr conn
|
80
|
+
# )
|
81
|
+
attach_function :virConnectGetCapabilities, [:pointer], :string # strptr ?
|
24
82
|
end
|
25
83
|
end
|
26
84
|
end
|
data/lib/libvirt/ffi/domain.rb
CHANGED
@@ -1,15 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'ffi'
|
4
|
-
require 'libvirt/util'
|
5
|
-
require 'libvirt/ffi/common'
|
6
|
-
|
7
3
|
module Libvirt
|
8
4
|
module FFI
|
9
5
|
module Domain
|
10
6
|
extend ::FFI::Library
|
11
7
|
ffi_lib Util.library_path
|
12
8
|
|
9
|
+
UUID_STRING_BUFLEN = 0x80 # RFC4122
|
10
|
+
|
13
11
|
# int virConnectDomainEventRegisterAny(
|
14
12
|
# virConnectPtr conn,
|
15
13
|
# virDomainPtr dom,
|
@@ -75,6 +73,42 @@ module Libvirt
|
|
75
73
|
# )
|
76
74
|
attach_function :virDomainGetState, [:pointer, :pointer, :pointer, :uint], :int
|
77
75
|
|
76
|
+
# const char *virDomainGetName (
|
77
|
+
# virDomainPtr domain
|
78
|
+
# )
|
79
|
+
attach_function :virDomainGetName, [:pointer], :string # strptr?
|
80
|
+
|
81
|
+
# int virDomainGetMaxVcpus (
|
82
|
+
# virDomainPtr domain
|
83
|
+
# )
|
84
|
+
attach_function :virDomainGetMaxVcpus, [:pointer], :int
|
85
|
+
|
86
|
+
# int virDomainGetVcpus (
|
87
|
+
# virDomainPtr domain,
|
88
|
+
# virVcpuInfoPtr info,
|
89
|
+
# int maxinfo,
|
90
|
+
# unsigned char * cpumaps,
|
91
|
+
# int maplen
|
92
|
+
# )
|
93
|
+
attach_function :virDomainGetVcpus, [:pointer, :pointer, :int, :pointer, :int], :int
|
94
|
+
|
95
|
+
# int virDomainGetUUIDString (
|
96
|
+
# virDomainPtr domain,
|
97
|
+
# char * buf
|
98
|
+
# )
|
99
|
+
attach_function :virDomainGetUUIDString, [:pointer, :pointer], :int
|
100
|
+
|
101
|
+
# unsigned long virDomainGetMaxMemory (
|
102
|
+
# virDomainPtr domain
|
103
|
+
# )
|
104
|
+
attach_function :virDomainGetMaxMemory, [:pointer], :ulong
|
105
|
+
|
106
|
+
# char *virDomainGetXMLDesc (
|
107
|
+
# virDomainPtr domain,
|
108
|
+
# unsigned int flags
|
109
|
+
# )
|
110
|
+
attach_function :virDomainGetXMLDesc, [:pointer, :uint], :string # strptr?
|
111
|
+
|
78
112
|
# typedef int (*virConnectDomainEventCallback) (
|
79
113
|
# virConnectPtr conn,
|
80
114
|
# virDomainPtr dom,
|
data/lib/libvirt/ffi/event.rb
CHANGED
data/lib/libvirt/ffi/libvirt.rb
CHANGED
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Libvirt
|
4
|
+
module FFI
|
5
|
+
module NodeInfo
|
6
|
+
extend ::FFI::Library
|
7
|
+
ffi_lib Util.library_path
|
8
|
+
|
9
|
+
# struct virNodeInfo {
|
10
|
+
#
|
11
|
+
# char model[32] model - string indicating the CPU model
|
12
|
+
# unsigned long memory - memory size in kilobytes
|
13
|
+
# unsigned int cpus - the number of active CPUs
|
14
|
+
# unsigned int mhz - expected CPU frequency, 0 if not known or on unusual architectures
|
15
|
+
# unsigned int nodes - the number of NUMA cell, 1 for unusual NUMA topologies or uniform memory access;
|
16
|
+
# check capabilities XML for the actual NUMA topology
|
17
|
+
# unsigned int sockets - number of CPU sockets per node if nodes > 1, 1 in case of unusual NUMA topology
|
18
|
+
# unsigned int cores - number of cores per socket, total number of processors in case of unusual NUMA topolog
|
19
|
+
# unsigned int threads - number of threads per core, 1 in case of unusual numa topology
|
20
|
+
# }
|
21
|
+
class Struct < ::FFI::Struct
|
22
|
+
layout :model, [:char, 32],
|
23
|
+
:memory, :ulong,
|
24
|
+
:cpus, :uint,
|
25
|
+
:mhz, :uint,
|
26
|
+
:nodes, :uint,
|
27
|
+
:sockets, :uint,
|
28
|
+
:cores, :uint,
|
29
|
+
:threads, :uint
|
30
|
+
end
|
31
|
+
|
32
|
+
# int virNodeGetInfo (virConnectPtr conn,
|
33
|
+
# virNodeInfoPtr info)
|
34
|
+
attach_function :virNodeGetInfo, [:pointer, :pointer], :int
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
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
|
45
|
+
end
|
46
|
+
end
|
data/lib/libvirt/version.rb
CHANGED
data/lib/libvirt.rb
CHANGED
@@ -1,15 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'ffi'
|
4
|
+
require 'objspace'
|
4
5
|
require 'libvirt/util'
|
5
6
|
require 'libvirt/error'
|
6
7
|
require 'libvirt/ffi/common'
|
8
|
+
require 'libvirt/ffi/libvirt'
|
7
9
|
require 'libvirt/ffi/connection'
|
8
10
|
require 'libvirt/ffi/domain'
|
9
|
-
require 'libvirt/
|
11
|
+
require 'libvirt/ffi/event'
|
12
|
+
require 'libvirt/ffi/node_info'
|
10
13
|
require 'libvirt/event'
|
11
14
|
require 'libvirt/connection'
|
12
15
|
require 'libvirt/domain'
|
16
|
+
require 'libvirt/node_info'
|
13
17
|
require 'libvirt/version'
|
14
18
|
|
15
19
|
module Libvirt
|
@@ -20,6 +20,9 @@ DOMS = []
|
|
20
20
|
Async do
|
21
21
|
ASYNC_REACTOR = Async::Task.current.reactor
|
22
22
|
|
23
|
+
puts "Lib version #{Libvirt.lib_version}"
|
24
|
+
puts "Gem version #{Libvirt::VERSION}"
|
25
|
+
|
23
26
|
IMPL.start
|
24
27
|
|
25
28
|
c = Libvirt::Connection.new('qemu+tcp://localhost:16510/system')
|
@@ -28,6 +31,22 @@ Async do
|
|
28
31
|
Libvirt.logger.info { "set_keep_alive #{res}" }
|
29
32
|
CONNS.push(c)
|
30
33
|
|
34
|
+
puts "Connection version #{c.version.inspect}"
|
35
|
+
puts "Connection lib_version #{c.lib_version.inspect}"
|
36
|
+
puts "Connection hostname #{c.hostname.inspect}"
|
37
|
+
puts "Connection max_vcpus #{c.max_vcpus.inspect}"
|
38
|
+
puts "Connection capabilities #{c.capabilities.inspect}"
|
39
|
+
node_info = c.node_info
|
40
|
+
puts "Connection nodeInfo #{node_info}"
|
41
|
+
puts "NodeInfo model #{node_info.model.inspect}"
|
42
|
+
puts "NodeInfo cpus #{node_info.cpus.inspect}"
|
43
|
+
puts "NodeInfo mhz #{node_info.mhz.inspect}"
|
44
|
+
puts "NodeInfo nodes #{node_info.nodes.inspect}"
|
45
|
+
puts "NodeInfo sockets #{node_info.sockets.inspect}"
|
46
|
+
puts "NodeInfo cores #{node_info.cores.inspect}"
|
47
|
+
puts "NodeInfo threads #{node_info.threads.inspect}"
|
48
|
+
puts "NodeInfo memory #{node_info.memory.inspect}"
|
49
|
+
|
31
50
|
c.register_domain_event_callback(Libvirt::DOMAIN_EVENT_ID_LIFECYCLE, nil) do |dom, event, detail, opaque|
|
32
51
|
Libvirt.logger.info { "DOMAIN_EVENT_ID_LIFECYCLE user dom=#{dom}, event=#{event}, detail=#{detail}, opaque=#{opaque}" }
|
33
52
|
end
|
@@ -44,17 +63,22 @@ Async do
|
|
44
63
|
end
|
45
64
|
end
|
46
65
|
|
47
|
-
|
48
|
-
|
66
|
+
d = domains.first
|
67
|
+
puts "Domain uuid #{d.uuid.inspect}"
|
68
|
+
puts "Domain name #{d.name.inspect}"
|
69
|
+
puts "Domain get_state #{d.get_state.inspect}"
|
70
|
+
puts "Domain get_cpus #{d.max_vcpus.inspect}"
|
71
|
+
puts "Domain max_memory #{d.max_memory.inspect}"
|
72
|
+
puts "Domain xml_desc #{d.xml_desc.inspect}"
|
49
73
|
|
50
74
|
# ASYNC_REACTOR.every(10) do
|
51
75
|
# LibvirtAsync::Util.create_task(nil, ASYNC_REACTOR) { IMPL.print_debug_info }.run
|
52
76
|
# end
|
53
77
|
|
54
|
-
ASYNC_REACTOR.every(5) do
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
end
|
78
|
+
# ASYNC_REACTOR.every(5) do
|
79
|
+
# Libvirt.logger.info { "MEM USAGE: #{GetProcessMem.new.mb} MB" }
|
80
|
+
# Libvirt.logger.info { "GC.start" }
|
81
|
+
# GC.start
|
82
|
+
# Libvirt.logger.info { "MEM USAGE: #{GetProcessMem.new.mb} MB" }
|
83
|
+
# end
|
60
84
|
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
|
+
version: 0.2.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-
|
11
|
+
date: 2020-01-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi
|
@@ -52,7 +52,8 @@ files:
|
|
52
52
|
- lib/libvirt/ffi/domain.rb
|
53
53
|
- lib/libvirt/ffi/event.rb
|
54
54
|
- lib/libvirt/ffi/libvirt.rb
|
55
|
-
- lib/libvirt/
|
55
|
+
- lib/libvirt/ffi/node_info.rb
|
56
|
+
- lib/libvirt/node_info.rb
|
56
57
|
- lib/libvirt/util.rb
|
57
58
|
- lib/libvirt/version.rb
|
58
59
|
- lib/libvirt_ffi.rb
|