fog-proxmox 0.10.0 → 0.14.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +79 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +1 -1
- data/README.md +10 -2
- data/docs/compute.md +23 -7
- data/docs/identity.md +31 -6
- data/examples/compute.rb +11 -11
- data/examples/identity.rb +28 -15
- data/fog-proxmox.gemspec +2 -2
- data/lib/fog/proxmox.rb +16 -76
- data/lib/fog/proxmox/auth/token.rb +88 -0
- data/lib/fog/proxmox/auth/token/access_ticket.rb +85 -0
- data/lib/fog/proxmox/auth/token/user_token.rb +94 -0
- data/lib/fog/{compute/proxmox.rb → proxmox/compute.rb} +31 -16
- data/lib/fog/{compute/proxmox → proxmox/compute}/models/disk.rb +15 -2
- data/lib/fog/{compute/proxmox → proxmox/compute}/models/disks.rb +5 -1
- data/lib/fog/{compute/proxmox → proxmox/compute}/models/interface.rb +4 -0
- data/lib/fog/{compute/proxmox → proxmox/compute}/models/interfaces.rb +1 -1
- data/lib/fog/{compute/proxmox → proxmox/compute}/models/node.rb +0 -0
- data/lib/fog/{compute/proxmox → proxmox/compute}/models/nodes.rb +1 -1
- data/lib/fog/{compute/proxmox → proxmox/compute}/models/server.rb +2 -3
- data/lib/fog/{compute/proxmox → proxmox/compute}/models/server_config.rb +9 -1
- data/lib/fog/{compute/proxmox → proxmox/compute}/models/servers.rb +1 -1
- data/lib/fog/{compute/proxmox → proxmox/compute}/models/snapshot.rb +4 -5
- data/lib/fog/{compute/proxmox → proxmox/compute}/models/snapshots.rb +1 -1
- data/lib/fog/{compute/proxmox → proxmox/compute}/models/storage.rb +2 -3
- data/lib/fog/{compute/proxmox → proxmox/compute}/models/storages.rb +1 -1
- data/lib/fog/{compute/proxmox → proxmox/compute}/models/task.rb +2 -3
- data/lib/fog/{compute/proxmox → proxmox/compute}/models/tasks.rb +1 -1
- data/lib/fog/{compute/proxmox → proxmox/compute}/models/volume.rb +9 -3
- data/lib/fog/{compute/proxmox → proxmox/compute}/models/volumes.rb +1 -1
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/action_server.rb +1 -0
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/clone_server.rb +1 -0
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/create_backup.rb +1 -0
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/create_server.rb +1 -0
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/create_snapshot.rb +3 -1
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/create_spice.rb +1 -0
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/create_term.rb +1 -0
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/create_vnc.rb +1 -0
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/delete_server.rb +1 -0
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/delete_snapshot.rb +3 -1
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/delete_volume.rb +1 -1
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/get_node_statistics.rb +2 -2
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/get_server_config.rb +18 -0
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/get_server_status.rb +21 -0
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/get_snapshot_config.rb +1 -1
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/get_task.rb +1 -1
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/get_vnc.rb +1 -0
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/get_volume.rb +1 -1
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/list_nodes.rb +8 -1
- data/lib/fog/proxmox/compute/requests/list_servers.rb +113 -0
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/list_snapshots.rb +24 -1
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/list_storages.rb +3 -1
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/list_tasks.rb +3 -1
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/list_volumes.rb +3 -1
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/log_task.rb +3 -1
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/migrate_server.rb +1 -1
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/move_disk.rb +1 -1
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/move_volume.rb +1 -1
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/next_vmid.rb +1 -0
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/resize_container.rb +1 -1
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/resize_server.rb +1 -1
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/rollback_snapshot.rb +3 -1
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/status_task.rb +1 -1
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/stop_task.rb +1 -1
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/template_server.rb +1 -0
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/update_server.rb +1 -0
- data/lib/fog/{compute/proxmox → proxmox/compute}/requests/update_snapshot.rb +1 -1
- data/lib/fog/proxmox/core.rb +67 -58
- data/lib/fog/proxmox/hash.rb +2 -2
- data/lib/fog/proxmox/helpers/cpu_helper.rb +48 -9
- data/lib/fog/proxmox/helpers/disk_helper.rb +55 -19
- data/lib/fog/proxmox/helpers/nic_helper.rb +28 -20
- data/lib/fog/{identity/proxmox.rb → proxmox/identity.rb} +31 -17
- data/lib/fog/{identity/proxmox → proxmox/identity}/models/domain.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/models/domain_type.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/models/domains.rb +1 -1
- data/lib/fog/{identity/proxmox → proxmox/identity}/models/group.rb +4 -2
- data/lib/fog/{identity/proxmox → proxmox/identity}/models/groups.rb +1 -1
- data/lib/fog/{identity/proxmox → proxmox/identity}/models/permission.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/models/permissions.rb +1 -1
- data/lib/fog/{identity/proxmox → proxmox/identity}/models/pool.rb +18 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/models/pools.rb +4 -2
- data/lib/fog/{identity/proxmox → proxmox/identity}/models/principal.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/models/role.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/models/roles.rb +1 -1
- data/lib/fog/proxmox/identity/models/token.rb +71 -0
- data/lib/fog/proxmox/identity/models/token_info.rb +41 -0
- data/lib/fog/proxmox/identity/models/tokens.rb +58 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/models/user.rb +25 -2
- data/lib/fog/{identity/proxmox → proxmox/identity}/models/users.rb +1 -1
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/change_password.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/check_permissions.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/create_domain.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/create_group.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/create_pool.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/create_role.rb +0 -0
- data/lib/fog/proxmox/identity/requests/create_token.rb +40 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/create_user.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/delete_domain.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/delete_group.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/delete_pool.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/delete_role.rb +0 -0
- data/lib/fog/proxmox/identity/requests/delete_token.rb +40 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/delete_user.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/get_domain.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/get_group.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/get_pool.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/get_role.rb +0 -0
- data/lib/fog/proxmox/identity/requests/get_token_info.rb +41 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/get_user.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/list_domains.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/list_groups.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/list_permissions.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/list_pools.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/list_roles.rb +0 -0
- data/lib/fog/proxmox/identity/requests/list_tokens.rb +41 -0
- data/lib/fog/proxmox/identity/requests/list_user_permissions.rb +44 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/list_users.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/read_version.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/update_domain.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/update_group.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/update_permissions.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/update_pool.rb +0 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/update_role.rb +0 -0
- data/lib/fog/proxmox/identity/requests/update_token.rb +41 -0
- data/lib/fog/{identity/proxmox → proxmox/identity}/requests/update_user.rb +0 -0
- data/lib/fog/{network/proxmox.rb → proxmox/network.rb} +21 -14
- data/lib/fog/{network/proxmox → proxmox/network}/models/network.rb +0 -0
- data/lib/fog/{network/proxmox → proxmox/network}/models/networks.rb +1 -1
- data/lib/fog/{network/proxmox → proxmox/network}/models/node.rb +1 -1
- data/lib/fog/{network/proxmox → proxmox/network}/models/nodes.rb +1 -1
- data/lib/fog/{network/proxmox → proxmox/network}/requests/create_network.rb +0 -0
- data/lib/fog/{network/proxmox → proxmox/network}/requests/delete_network.rb +0 -0
- data/lib/fog/{network/proxmox → proxmox/network}/requests/get_network.rb +0 -0
- data/lib/fog/{network/proxmox → proxmox/network}/requests/get_node.rb +0 -0
- data/lib/fog/{network/proxmox → proxmox/network}/requests/list_networks.rb +0 -0
- data/lib/fog/{network/proxmox → proxmox/network}/requests/list_nodes.rb +0 -0
- data/lib/fog/{network/proxmox → proxmox/network}/requests/power_node.rb +0 -0
- data/lib/fog/{network/proxmox → proxmox/network}/requests/update_network.rb +0 -0
- data/lib/fog/{storage/proxmox.rb → proxmox/storage.rb} +1 -1
- data/lib/fog/proxmox/version.rb +1 -1
- data/spec/compute_spec.rb +4 -4
- data/spec/fixtures/proxmox/compute/common_auth.yml +40 -0
- data/spec/fixtures/proxmox/compute/containers.yml +1752 -7568
- data/spec/fixtures/proxmox/compute/nodes.yml +24 -30
- data/spec/fixtures/proxmox/compute/servers.yml +5015 -10683
- data/spec/fixtures/proxmox/compute/snapshots.yml +479 -1719
- data/spec/fixtures/proxmox/compute/storages.yml +32 -40
- data/spec/fixtures/proxmox/compute/tasks.yml +118 -338
- data/spec/fixtures/proxmox/identity/auth.yml +9 -11
- data/spec/fixtures/proxmox/identity/auth_access_ticket.yml +77 -0
- data/spec/fixtures/proxmox/identity/auth_user_token.yml +77 -0
- data/spec/fixtures/proxmox/identity/common_auth.yml +40 -0
- data/spec/fixtures/proxmox/identity/domains.yml +146 -178
- data/spec/fixtures/proxmox/identity/groups.yml +72 -90
- data/spec/fixtures/proxmox/identity/permissions.yml +301 -193
- data/spec/fixtures/proxmox/identity/pools.yml +422 -159
- data/spec/fixtures/proxmox/identity/read_version.yml +7 -9
- data/spec/fixtures/proxmox/identity/roles.yml +74 -92
- data/spec/fixtures/proxmox/identity/tokens.yml +494 -0
- data/spec/fixtures/proxmox/identity/users.yml +149 -187
- data/spec/fixtures/proxmox/network/common_auth.yml +40 -0
- data/spec/fixtures/proxmox/network/networks.yml +99 -96
- data/spec/helpers/cpu_helper_spec.rb +28 -21
- data/spec/helpers/disk_helper_spec.rb +231 -175
- data/spec/helpers/nic_helper_spec.rb +113 -114
- data/spec/identity_spec.rb +116 -28
- data/spec/network_spec.rb +3 -3
- data/spec/proxmox_vcr.rb +24 -22
- data/spec/spec_helper.rb +4 -3
- metadata +160 -145
- data/.gitlab-ci.yml +0 -50
- data/.travis.yml +0 -20
- data/lib/fog/compute/proxmox/requests/list_servers.rb +0 -42
- data/spec/fixtures/proxmox/compute/identity_ticket.yml +0 -40
- data/spec/fixtures/proxmox/identity/identity_ticket.yml +0 -40
- data/spec/fixtures/proxmox/identity/renew.yml +0 -40
- data/spec/fixtures/proxmox/network/identity_ticket.yml +0 -40
@@ -36,7 +36,30 @@ module Fog
|
|
36
36
|
|
37
37
|
# class Mock list_snapshots request
|
38
38
|
class Mock
|
39
|
-
def list_snapshots
|
39
|
+
def list_snapshots(_path_params)
|
40
|
+
[
|
41
|
+
{
|
42
|
+
'name' => 'snapshot1',
|
43
|
+
'description' => 'latest snapshot',
|
44
|
+
'snaptime' => 1_578_057_452,
|
45
|
+
'vmstate' => 0,
|
46
|
+
'node_id' => 'proxmox',
|
47
|
+
'server_id' => '100',
|
48
|
+
'server_type' => 'qemu',
|
49
|
+
'vmgenid' => nil
|
50
|
+
},
|
51
|
+
{
|
52
|
+
'name' => 'snapshot2',
|
53
|
+
'description' => 'latest snapshot2',
|
54
|
+
'snaptime' => 1_578_058_452,
|
55
|
+
'vmstate' => 0,
|
56
|
+
'node_id' => 'proxmox',
|
57
|
+
'server_id' => '100',
|
58
|
+
'server_type' => 'qemu',
|
59
|
+
'vmgenid' => nil
|
60
|
+
}
|
61
|
+
]
|
62
|
+
end
|
40
63
|
end
|
41
64
|
end
|
42
65
|
end
|
data/lib/fog/proxmox/core.rb
CHANGED
@@ -25,41 +25,55 @@ module Fog
|
|
25
25
|
module Proxmox
|
26
26
|
# Core module
|
27
27
|
module Core
|
28
|
-
attr_accessor :
|
29
|
-
attr_reader :
|
30
|
-
attr_reader :
|
31
|
-
attr_reader :
|
32
|
-
|
28
|
+
attr_accessor :token
|
29
|
+
attr_reader :auth_method
|
30
|
+
attr_reader :expires
|
31
|
+
attr_reader :current_user
|
32
|
+
|
33
|
+
def user_token?
|
34
|
+
@auth_token == 'user_token'
|
35
|
+
end
|
33
36
|
|
34
37
|
# fallback
|
35
38
|
def self.not_found_class
|
36
|
-
Fog::Proxmox::
|
39
|
+
Fog::Proxmox::Core::NotFound
|
37
40
|
end
|
38
41
|
|
39
|
-
def
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
@
|
44
|
-
|
45
|
-
missing_credentials << :pve_username unless @pve_username
|
42
|
+
def initialize(options = {})
|
43
|
+
setup(options)
|
44
|
+
authenticate
|
45
|
+
@auth_token.missing_credentials(options)
|
46
|
+
@connection = Fog::Core::Connection.new(@proxmox_url, @persistent, @connection_options)
|
47
|
+
end
|
46
48
|
|
47
|
-
|
48
|
-
|
49
|
+
def setup(options)
|
50
|
+
if options.respond_to?(:config_service?) && options.config_service?
|
51
|
+
configure(options)
|
52
|
+
return
|
49
53
|
end
|
50
|
-
|
51
|
-
|
54
|
+
Fog::Proxmox::Variables.to_variables(self, options, 'proxmox')
|
55
|
+
@connection_options = options[:connection_options] || {}
|
56
|
+
@connection_options[:disable_proxy] = true if ENV['DISABLE_PROXY'] == 'true'
|
57
|
+
@connection_options[:ssl_verify_peer] = false if ENV['SSL_VERIFY_PEER'] == 'false'
|
58
|
+
@proxmox_must_reauthenticate = true
|
59
|
+
@persistent = options[:persistent] || false
|
60
|
+
@token ||= options[:proxmox_token]
|
61
|
+
@auth_method ||= options[:proxmox_auth_method]
|
62
|
+
if @token
|
63
|
+
@proxmox_can_reauthenticate = false
|
64
|
+
else
|
65
|
+
@proxmox_can_reauthenticate = true
|
66
|
+
end
|
52
67
|
end
|
53
68
|
|
54
69
|
def credentials
|
55
70
|
options = {
|
56
71
|
provider: 'proxmox',
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
pve_username: @pve_username
|
72
|
+
proxmox_auth_method: @auth_method,
|
73
|
+
proxmox_url: @proxmox_uri.to_s,
|
74
|
+
current_user: @current_user
|
61
75
|
}
|
62
|
-
|
76
|
+
proxmox_options.merge options
|
63
77
|
end
|
64
78
|
|
65
79
|
def reload
|
@@ -68,16 +82,22 @@ module Fog
|
|
68
82
|
|
69
83
|
private
|
70
84
|
|
85
|
+
def expired?
|
86
|
+
return false if @expires.nil?
|
87
|
+
return false if @expires == 0
|
88
|
+
return @expires - Time.now.utc.to_i < 60
|
89
|
+
end
|
90
|
+
|
71
91
|
def request(params)
|
72
|
-
retried = false
|
92
|
+
retried = false
|
73
93
|
begin
|
74
|
-
|
75
|
-
|
76
|
-
)
|
94
|
+
authenticate! if expired?
|
95
|
+
request_options = params.merge(path: "#{@path}/#{params[:path]}", headers: @auth_token.headers(params[:method], params.respond_to?(:headers) ? params[:headers] : {}, {}))
|
96
|
+
response = @connection.request(request_options)
|
77
97
|
rescue Excon::Errors::Unauthorized => error
|
78
98
|
# token expiration and token renewal possible
|
79
|
-
if
|
80
|
-
authenticate
|
99
|
+
if !%w[Bad username or password, invalid token value!].include?(error.response.body) && @proxmox_can_reauthenticate && !retried
|
100
|
+
authenticate!
|
81
101
|
retried = true
|
82
102
|
retry
|
83
103
|
# bad credentials or token renewal not possible
|
@@ -95,41 +115,30 @@ module Fog
|
|
95
115
|
Fog::Proxmox::Json.get_data(response)
|
96
116
|
end
|
97
117
|
|
98
|
-
def
|
99
|
-
|
100
|
-
headers_hash = { 'Accept' => 'application/json' }
|
101
|
-
# CSRF token is required to PUT, POST and DELETE http requests
|
102
|
-
if %w[PUT POST DELETE].include? method
|
103
|
-
headers_hash.store('CSRFPreventionToken', @pve_csrftoken)
|
104
|
-
end
|
105
|
-
# ticket must be present in cookie
|
106
|
-
headers_hash.store('Cookie', "PVEAuthCookie=#{@pve_ticket}") if @pve_ticket
|
107
|
-
headers_hash.merge additional_headers
|
108
|
-
headers_hash
|
109
|
-
end
|
110
|
-
|
111
|
-
def pve_options
|
112
|
-
Fog::Proxmox::Variables.to_hash(self, 'pve')
|
118
|
+
def proxmox_options
|
119
|
+
Fog::Proxmox::Variables.to_hash(self, 'proxmox')
|
113
120
|
end
|
114
121
|
|
115
122
|
def authenticate
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
@
|
128
|
-
@port = @pve_uri.port
|
129
|
-
@scheme = @pve_uri.scheme
|
130
|
-
|
123
|
+
if @proxmox_must_reauthenticate
|
124
|
+
@token = nil if @proxmox_must_reauthenticate
|
125
|
+
@auth_token = Fog::Proxmox::Auth::Token.build(proxmox_options, @connection_options)
|
126
|
+
@current_user = proxmox_options[:proxmox_userid] ? proxmox_options[:proxmox_userid] : proxmox_options[:proxmox_username]
|
127
|
+
@token = @auth_token.token
|
128
|
+
@expires = @auth_token.expires
|
129
|
+
@proxmox_must_reauthenticate = false
|
130
|
+
else
|
131
|
+
@token = @proxmox_token
|
132
|
+
end
|
133
|
+
uri = URI.parse(@proxmox_url)
|
134
|
+
@path = uri.path
|
131
135
|
true
|
132
136
|
end
|
137
|
+
|
138
|
+
def authenticate!
|
139
|
+
@proxmox_must_reauthenticate = true
|
140
|
+
authenticate
|
141
|
+
end
|
133
142
|
end
|
134
143
|
end
|
135
144
|
end
|
data/lib/fog/proxmox/hash.rb
CHANGED
@@ -23,13 +23,13 @@ module Fog
|
|
23
23
|
module Hash
|
24
24
|
|
25
25
|
def self.stringify(hash)
|
26
|
-
filtered = hash.reject { |_key,value| value.
|
26
|
+
filtered = hash.reject { |_key, value| value.nil? }
|
27
27
|
a = filtered.to_a.collect { |item| item.join('=') }
|
28
28
|
a.join(',')
|
29
29
|
end
|
30
30
|
|
31
31
|
def self.flatten(hash)
|
32
|
-
filtered = hash.reject { |_key,value| value.
|
32
|
+
filtered = hash.reject { |_key, value| value.nil? }
|
33
33
|
a = filtered.to_a.collect { |item| item.join(': ') }
|
34
34
|
a.join(',')
|
35
35
|
end
|
@@ -21,21 +21,60 @@ module Fog
|
|
21
21
|
module Proxmox
|
22
22
|
# module Cpu mixins
|
23
23
|
module CpuHelper
|
24
|
-
CPU_REGEXP = /(\bcputype=)?(\w+)[,]?(\bflags=)?(
|
25
|
-
|
26
|
-
|
24
|
+
CPU_REGEXP = /(\bcputype=)?(?<cputype>[\w-]+)[,]?(\bflags=)?(?<flags>[[\+\-][\w-]+[;]?]*)/
|
25
|
+
FLAGS = { spectre: 'spec-ctrl', pcid: 'pcid', ssbd: 'ssbd', ibpb: 'ibpb', virt_ssbd: 'virt-ssbd', amd_ssbd: 'amd-ssbd', amd_no_ssb: 'amd-no-ssb', md_clear: 'md-clear', pdpe1gb: 'pdpe1gb', hv_tlbflush: 'hv-tlbflush', aes: 'aes', hv_evmcs: 'hv-evmcs' }
|
26
|
+
def self.flags
|
27
|
+
FLAGS
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.extract(cpu, name)
|
31
|
+
captures_h = cpu ? CPU_REGEXP.match(cpu.to_s) : { cputype: '', flags: '' }
|
32
|
+
captures_h[name]
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.extract_cputype(cpu)
|
36
|
+
extract(cpu, :cputype)
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.extract_flags(cpu)
|
40
|
+
extract(cpu, :flags)
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.flag_value(cpu, flag_key)
|
44
|
+
flag_value = '0'
|
45
|
+
raw_values = extract_flags(cpu).split(';').select { |flag| ['+' + flag_key, '-' + flag_key].include?(flag) }
|
46
|
+
unless raw_values.empty?
|
47
|
+
flag_value = raw_values[0].start_with?('+') ? '+1' : raw_values[0].start_with?('-') ? '-1' : '0'
|
48
|
+
end
|
49
|
+
flag_value
|
27
50
|
end
|
28
51
|
|
29
|
-
def self.
|
30
|
-
|
52
|
+
def self.hash_has_no_default_flag?(cpu_h, flag_name)
|
53
|
+
cpu_h.key?(flag_name) && ['-1', '+1'].include?(cpu_h[flag_name])
|
31
54
|
end
|
32
55
|
|
33
|
-
def self.
|
34
|
-
|
56
|
+
def self.hash_flag(cpu_h, flag_name)
|
57
|
+
flag = ''
|
58
|
+
if cpu_h.key?(flag_name)
|
59
|
+
flag = '+' if cpu_h[flag_name] == '+1'
|
60
|
+
flag = '-' if cpu_h[flag_name] == '-1'
|
61
|
+
end
|
62
|
+
flag
|
35
63
|
end
|
36
64
|
|
37
|
-
def self.
|
38
|
-
|
65
|
+
def self.flatten(cpu_h)
|
66
|
+
return '' unless cpu_h['cpu_type']
|
67
|
+
|
68
|
+
cpu_type = "cputype=#{cpu_h['cpu_type']}"
|
69
|
+
num_flags = 0
|
70
|
+
FLAGS.each_key { |flag_key| num_flags += 1 if hash_has_no_default_flag?(cpu_h, flag_key.to_s) }
|
71
|
+
cpu_type += ',flags=' if num_flags > 0
|
72
|
+
flags_with_no_default_value = FLAGS.select { |flag_key, _flag_value| hash_has_no_default_flag?(cpu_h, flag_key.to_s) }
|
73
|
+
flags_with_no_default_value.each_with_index do |(flag_key, flag_value), index|
|
74
|
+
cpu_type += hash_flag(cpu_h, flag_key.to_s) + flag_value if hash_has_no_default_flag?(cpu_h, flag_key.to_s)
|
75
|
+
cpu_type += ';' if num_flags > index + 1
|
76
|
+
end
|
77
|
+
cpu_type
|
39
78
|
end
|
40
79
|
end
|
41
80
|
end
|