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.
Files changed (180) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +79 -0
  3. data/.gitignore +1 -0
  4. data/.rubocop.yml +1 -1
  5. data/README.md +10 -2
  6. data/docs/compute.md +23 -7
  7. data/docs/identity.md +31 -6
  8. data/examples/compute.rb +11 -11
  9. data/examples/identity.rb +28 -15
  10. data/fog-proxmox.gemspec +2 -2
  11. data/lib/fog/proxmox.rb +16 -76
  12. data/lib/fog/proxmox/auth/token.rb +88 -0
  13. data/lib/fog/proxmox/auth/token/access_ticket.rb +85 -0
  14. data/lib/fog/proxmox/auth/token/user_token.rb +94 -0
  15. data/lib/fog/{compute/proxmox.rb → proxmox/compute.rb} +31 -16
  16. data/lib/fog/{compute/proxmox → proxmox/compute}/models/disk.rb +15 -2
  17. data/lib/fog/{compute/proxmox → proxmox/compute}/models/disks.rb +5 -1
  18. data/lib/fog/{compute/proxmox → proxmox/compute}/models/interface.rb +4 -0
  19. data/lib/fog/{compute/proxmox → proxmox/compute}/models/interfaces.rb +1 -1
  20. data/lib/fog/{compute/proxmox → proxmox/compute}/models/node.rb +0 -0
  21. data/lib/fog/{compute/proxmox → proxmox/compute}/models/nodes.rb +1 -1
  22. data/lib/fog/{compute/proxmox → proxmox/compute}/models/server.rb +2 -3
  23. data/lib/fog/{compute/proxmox → proxmox/compute}/models/server_config.rb +9 -1
  24. data/lib/fog/{compute/proxmox → proxmox/compute}/models/servers.rb +1 -1
  25. data/lib/fog/{compute/proxmox → proxmox/compute}/models/snapshot.rb +4 -5
  26. data/lib/fog/{compute/proxmox → proxmox/compute}/models/snapshots.rb +1 -1
  27. data/lib/fog/{compute/proxmox → proxmox/compute}/models/storage.rb +2 -3
  28. data/lib/fog/{compute/proxmox → proxmox/compute}/models/storages.rb +1 -1
  29. data/lib/fog/{compute/proxmox → proxmox/compute}/models/task.rb +2 -3
  30. data/lib/fog/{compute/proxmox → proxmox/compute}/models/tasks.rb +1 -1
  31. data/lib/fog/{compute/proxmox → proxmox/compute}/models/volume.rb +9 -3
  32. data/lib/fog/{compute/proxmox → proxmox/compute}/models/volumes.rb +1 -1
  33. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/action_server.rb +1 -0
  34. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/clone_server.rb +1 -0
  35. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/create_backup.rb +1 -0
  36. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/create_server.rb +1 -0
  37. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/create_snapshot.rb +3 -1
  38. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/create_spice.rb +1 -0
  39. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/create_term.rb +1 -0
  40. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/create_vnc.rb +1 -0
  41. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/delete_server.rb +1 -0
  42. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/delete_snapshot.rb +3 -1
  43. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/delete_volume.rb +1 -1
  44. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/get_node_statistics.rb +2 -2
  45. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/get_server_config.rb +18 -0
  46. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/get_server_status.rb +21 -0
  47. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/get_snapshot_config.rb +1 -1
  48. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/get_task.rb +1 -1
  49. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/get_vnc.rb +1 -0
  50. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/get_volume.rb +1 -1
  51. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/list_nodes.rb +8 -1
  52. data/lib/fog/proxmox/compute/requests/list_servers.rb +113 -0
  53. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/list_snapshots.rb +24 -1
  54. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/list_storages.rb +3 -1
  55. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/list_tasks.rb +3 -1
  56. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/list_volumes.rb +3 -1
  57. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/log_task.rb +3 -1
  58. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/migrate_server.rb +1 -1
  59. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/move_disk.rb +1 -1
  60. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/move_volume.rb +1 -1
  61. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/next_vmid.rb +1 -0
  62. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/resize_container.rb +1 -1
  63. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/resize_server.rb +1 -1
  64. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/rollback_snapshot.rb +3 -1
  65. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/status_task.rb +1 -1
  66. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/stop_task.rb +1 -1
  67. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/template_server.rb +1 -0
  68. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/update_server.rb +1 -0
  69. data/lib/fog/{compute/proxmox → proxmox/compute}/requests/update_snapshot.rb +1 -1
  70. data/lib/fog/proxmox/core.rb +67 -58
  71. data/lib/fog/proxmox/hash.rb +2 -2
  72. data/lib/fog/proxmox/helpers/cpu_helper.rb +48 -9
  73. data/lib/fog/proxmox/helpers/disk_helper.rb +55 -19
  74. data/lib/fog/proxmox/helpers/nic_helper.rb +28 -20
  75. data/lib/fog/{identity/proxmox.rb → proxmox/identity.rb} +31 -17
  76. data/lib/fog/{identity/proxmox → proxmox/identity}/models/domain.rb +0 -0
  77. data/lib/fog/{identity/proxmox → proxmox/identity}/models/domain_type.rb +0 -0
  78. data/lib/fog/{identity/proxmox → proxmox/identity}/models/domains.rb +1 -1
  79. data/lib/fog/{identity/proxmox → proxmox/identity}/models/group.rb +4 -2
  80. data/lib/fog/{identity/proxmox → proxmox/identity}/models/groups.rb +1 -1
  81. data/lib/fog/{identity/proxmox → proxmox/identity}/models/permission.rb +0 -0
  82. data/lib/fog/{identity/proxmox → proxmox/identity}/models/permissions.rb +1 -1
  83. data/lib/fog/{identity/proxmox → proxmox/identity}/models/pool.rb +18 -0
  84. data/lib/fog/{identity/proxmox → proxmox/identity}/models/pools.rb +4 -2
  85. data/lib/fog/{identity/proxmox → proxmox/identity}/models/principal.rb +0 -0
  86. data/lib/fog/{identity/proxmox → proxmox/identity}/models/role.rb +0 -0
  87. data/lib/fog/{identity/proxmox → proxmox/identity}/models/roles.rb +1 -1
  88. data/lib/fog/proxmox/identity/models/token.rb +71 -0
  89. data/lib/fog/proxmox/identity/models/token_info.rb +41 -0
  90. data/lib/fog/proxmox/identity/models/tokens.rb +58 -0
  91. data/lib/fog/{identity/proxmox → proxmox/identity}/models/user.rb +25 -2
  92. data/lib/fog/{identity/proxmox → proxmox/identity}/models/users.rb +1 -1
  93. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/change_password.rb +0 -0
  94. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/check_permissions.rb +0 -0
  95. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/create_domain.rb +0 -0
  96. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/create_group.rb +0 -0
  97. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/create_pool.rb +0 -0
  98. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/create_role.rb +0 -0
  99. data/lib/fog/proxmox/identity/requests/create_token.rb +40 -0
  100. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/create_user.rb +0 -0
  101. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/delete_domain.rb +0 -0
  102. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/delete_group.rb +0 -0
  103. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/delete_pool.rb +0 -0
  104. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/delete_role.rb +0 -0
  105. data/lib/fog/proxmox/identity/requests/delete_token.rb +40 -0
  106. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/delete_user.rb +0 -0
  107. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/get_domain.rb +0 -0
  108. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/get_group.rb +0 -0
  109. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/get_pool.rb +0 -0
  110. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/get_role.rb +0 -0
  111. data/lib/fog/proxmox/identity/requests/get_token_info.rb +41 -0
  112. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/get_user.rb +0 -0
  113. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/list_domains.rb +0 -0
  114. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/list_groups.rb +0 -0
  115. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/list_permissions.rb +0 -0
  116. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/list_pools.rb +0 -0
  117. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/list_roles.rb +0 -0
  118. data/lib/fog/proxmox/identity/requests/list_tokens.rb +41 -0
  119. data/lib/fog/proxmox/identity/requests/list_user_permissions.rb +44 -0
  120. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/list_users.rb +0 -0
  121. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/read_version.rb +0 -0
  122. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/update_domain.rb +0 -0
  123. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/update_group.rb +0 -0
  124. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/update_permissions.rb +0 -0
  125. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/update_pool.rb +0 -0
  126. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/update_role.rb +0 -0
  127. data/lib/fog/proxmox/identity/requests/update_token.rb +41 -0
  128. data/lib/fog/{identity/proxmox → proxmox/identity}/requests/update_user.rb +0 -0
  129. data/lib/fog/{network/proxmox.rb → proxmox/network.rb} +21 -14
  130. data/lib/fog/{network/proxmox → proxmox/network}/models/network.rb +0 -0
  131. data/lib/fog/{network/proxmox → proxmox/network}/models/networks.rb +1 -1
  132. data/lib/fog/{network/proxmox → proxmox/network}/models/node.rb +1 -1
  133. data/lib/fog/{network/proxmox → proxmox/network}/models/nodes.rb +1 -1
  134. data/lib/fog/{network/proxmox → proxmox/network}/requests/create_network.rb +0 -0
  135. data/lib/fog/{network/proxmox → proxmox/network}/requests/delete_network.rb +0 -0
  136. data/lib/fog/{network/proxmox → proxmox/network}/requests/get_network.rb +0 -0
  137. data/lib/fog/{network/proxmox → proxmox/network}/requests/get_node.rb +0 -0
  138. data/lib/fog/{network/proxmox → proxmox/network}/requests/list_networks.rb +0 -0
  139. data/lib/fog/{network/proxmox → proxmox/network}/requests/list_nodes.rb +0 -0
  140. data/lib/fog/{network/proxmox → proxmox/network}/requests/power_node.rb +0 -0
  141. data/lib/fog/{network/proxmox → proxmox/network}/requests/update_network.rb +0 -0
  142. data/lib/fog/{storage/proxmox.rb → proxmox/storage.rb} +1 -1
  143. data/lib/fog/proxmox/version.rb +1 -1
  144. data/spec/compute_spec.rb +4 -4
  145. data/spec/fixtures/proxmox/compute/common_auth.yml +40 -0
  146. data/spec/fixtures/proxmox/compute/containers.yml +1752 -7568
  147. data/spec/fixtures/proxmox/compute/nodes.yml +24 -30
  148. data/spec/fixtures/proxmox/compute/servers.yml +5015 -10683
  149. data/spec/fixtures/proxmox/compute/snapshots.yml +479 -1719
  150. data/spec/fixtures/proxmox/compute/storages.yml +32 -40
  151. data/spec/fixtures/proxmox/compute/tasks.yml +118 -338
  152. data/spec/fixtures/proxmox/identity/auth.yml +9 -11
  153. data/spec/fixtures/proxmox/identity/auth_access_ticket.yml +77 -0
  154. data/spec/fixtures/proxmox/identity/auth_user_token.yml +77 -0
  155. data/spec/fixtures/proxmox/identity/common_auth.yml +40 -0
  156. data/spec/fixtures/proxmox/identity/domains.yml +146 -178
  157. data/spec/fixtures/proxmox/identity/groups.yml +72 -90
  158. data/spec/fixtures/proxmox/identity/permissions.yml +301 -193
  159. data/spec/fixtures/proxmox/identity/pools.yml +422 -159
  160. data/spec/fixtures/proxmox/identity/read_version.yml +7 -9
  161. data/spec/fixtures/proxmox/identity/roles.yml +74 -92
  162. data/spec/fixtures/proxmox/identity/tokens.yml +494 -0
  163. data/spec/fixtures/proxmox/identity/users.yml +149 -187
  164. data/spec/fixtures/proxmox/network/common_auth.yml +40 -0
  165. data/spec/fixtures/proxmox/network/networks.yml +99 -96
  166. data/spec/helpers/cpu_helper_spec.rb +28 -21
  167. data/spec/helpers/disk_helper_spec.rb +231 -175
  168. data/spec/helpers/nic_helper_spec.rb +113 -114
  169. data/spec/identity_spec.rb +116 -28
  170. data/spec/network_spec.rb +3 -3
  171. data/spec/proxmox_vcr.rb +24 -22
  172. data/spec/spec_helper.rb +4 -3
  173. metadata +160 -145
  174. data/.gitlab-ci.yml +0 -50
  175. data/.travis.yml +0 -20
  176. data/lib/fog/compute/proxmox/requests/list_servers.rb +0 -42
  177. data/spec/fixtures/proxmox/compute/identity_ticket.yml +0 -40
  178. data/spec/fixtures/proxmox/identity/identity_ticket.yml +0 -40
  179. data/spec/fixtures/proxmox/identity/renew.yml +0 -40
  180. 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; end
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
@@ -37,7 +37,9 @@ module Fog
37
37
 
38
38
  # class Mock list_storages request
39
39
  class Mock
40
- def list_storages; end
40
+ def list_storages(_node, _options = {})
41
+ []
42
+ end
41
43
  end
42
44
  end
43
45
  end
@@ -35,7 +35,9 @@ module Fog
35
35
 
36
36
  # class Mock list_tasks request
37
37
  class Mock
38
- def list_tasks; end
38
+ def list_tasks(_node, _options = {})
39
+ []
40
+ end
39
41
  end
40
42
  end
41
43
  end
@@ -35,7 +35,9 @@ module Fog
35
35
 
36
36
  # class Mock list_volumes request
37
37
  class Mock
38
- def list_volumes; end
38
+ def list_volumes(_node, _storage, _options = {})
39
+ []
40
+ end
39
41
  end
40
42
  end
41
43
  end
@@ -35,7 +35,9 @@ module Fog
35
35
 
36
36
  # class Mock status_task
37
37
  class Mock
38
- def log_task(node, upid); end
38
+ def log_task(_node, _upid, options = {})
39
+ [{ 't' => 'TASK OK', 'n' => 1 }]
40
+ end
39
41
  end
40
42
  end
41
43
  end
@@ -37,7 +37,7 @@ module Fog
37
37
 
38
38
  # class Mock migrate_server request
39
39
  class Mock
40
- def migrate_server; end
40
+ def migrate_server(_path_params, _body_params); end
41
41
  end
42
42
  end
43
43
  end
@@ -36,7 +36,7 @@ module Fog
36
36
 
37
37
  # class Mock move_disk request
38
38
  class Mock
39
- def move_disk; end
39
+ def move_disk(_path_params, _body_params); end
40
40
  end
41
41
  end
42
42
  end
@@ -36,7 +36,7 @@ module Fog
36
36
 
37
37
  # class Mock move_volume request
38
38
  class Mock
39
- def move_volume; end
39
+ def move_volume(_path_params, _body_params); end
40
40
  end
41
41
  end
42
42
  end
@@ -35,6 +35,7 @@ module Fog
35
35
 
36
36
  # class Mock next_vmid collection
37
37
  class Mock
38
+ def next_vmid; end
38
39
  end
39
40
  end
40
41
  end
@@ -36,7 +36,7 @@ module Fog
36
36
 
37
37
  # class Mock resize_container request
38
38
  class Mock
39
- def resize_container; end
39
+ def resize_container(_path_params, _body_params); end
40
40
  end
41
41
  end
42
42
  end
@@ -36,7 +36,7 @@ module Fog
36
36
 
37
37
  # class Mock resize_server request
38
38
  class Mock
39
- def resize_server; end
39
+ def resize_server(_path_params, _body_params); end
40
40
  end
41
41
  end
42
42
  end
@@ -39,7 +39,9 @@ module Fog
39
39
 
40
40
  # class Mock rollback_snapshot request
41
41
  class Mock
42
- def rollback_snapshot; end
42
+ def rollback_snapshot(_path_params)
43
+ 'UPID:proxmox:00002EBF:646E2BF3:5E1C7E39:qmrollback:100:root@pam:'
44
+ end
43
45
  end
44
46
  end
45
47
  end
@@ -34,7 +34,7 @@ module Fog
34
34
 
35
35
  # class Mock status_task
36
36
  class Mock
37
- def status_task(node, upid); end
37
+ def status_task(_node, _upid); end
38
38
  end
39
39
  end
40
40
  end
@@ -34,7 +34,7 @@ module Fog
34
34
 
35
35
  # class Mock get_task collection
36
36
  class Mock
37
- def stop_task(taskid); end
37
+ def stop_task(_node, _taskid); end
38
38
  end
39
39
  end
40
40
  end
@@ -37,6 +37,7 @@ module Fog
37
37
 
38
38
  # class Mock template_server request
39
39
  class Mock
40
+ def template_server(_path_params, _body_params); end
40
41
  end
41
42
  end
42
43
  end
@@ -37,6 +37,7 @@ module Fog
37
37
 
38
38
  # class Mock update_server request
39
39
  class Mock
40
+ def update_server(_path_params, _body_params); end
40
41
  end
41
42
  end
42
43
  end
@@ -38,7 +38,7 @@ module Fog
38
38
 
39
39
  # class Mock update_snapshot request
40
40
  class Mock
41
- def update_snapshot; end
41
+ def update_snapshot(_path_params, _body_params); end
42
42
  end
43
43
  end
44
44
  end
@@ -25,41 +25,55 @@ module Fog
25
25
  module Proxmox
26
26
  # Core module
27
27
  module Core
28
- attr_accessor :pve_ticket
29
- attr_reader :pve_csrftoken
30
- attr_reader :pve_username
31
- attr_reader :deadline
32
- attr_reader :principal
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::Compute::NotFound
39
+ Fog::Proxmox::Core::NotFound
37
40
  end
38
41
 
39
- def initialize_identity(options)
40
- @principal = nil
41
- @pve_ticket = nil
42
- Fog::Proxmox::Variables.to_variables(self, options, 'pve')
43
- @pve_uri = URI.parse(@pve_url)
44
- missing_credentials = []
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
- unless @pve_ticket
48
- missing_credentials << :pve_password unless @pve_password
49
+ def setup(options)
50
+ if options.respond_to?(:config_service?) && options.config_service?
51
+ configure(options)
52
+ return
49
53
  end
50
-
51
- raise ArgumentError, "Missing required arguments: #{missing_credentials.join(', ')}" unless missing_credentials.empty?
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
- pve_url: @pve_uri.to_s,
58
- pve_ticket: @pve_ticket,
59
- pve_csrftoken: @pve_csrftoken,
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
- pve_options.merge options
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
- response = @connection.request(params.merge(
75
- headers: headers(params[:method], params[:headers])
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 error.response.body != 'Bad username or password' && !retried
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 headers(method, additional_headers)
99
- additional_headers ||= {}
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
- options = pve_options
117
- @pve_ticket = options[:pve_ticket]
118
- Fog::Proxmox.authenticate(options, @connection_options)
119
- @principal = Fog::Proxmox.credentials
120
- @pve_username = Fog::Proxmox.credentials[:username]
121
- @pve_ticket = Fog::Proxmox.credentials[:ticket]
122
- @pve_deadline = Fog::Proxmox.credentials[:deadline]
123
- @pve_csrftoken = Fog::Proxmox.credentials[:csrftoken]
124
-
125
- @host = @pve_uri.host
126
- @api_path = @pve_uri.path
127
- @api_path.sub!(%r{/$}, '')
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
@@ -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.to_s.empty? }
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.to_s.empty? }
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=)?(\+[\w-]+)?[;]?(\+[\w-]+)?/
25
- def self.extract(cpu,i)
26
- cpu ? CPU_REGEXP.match(cpu.to_s)[i] : ''
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.extract_type(cpu)
30
- extract(cpu,2)
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.has_pcid?(cpu)
34
- extract(cpu,5) == '+pcid'
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.has_spectre?(cpu)
38
- extract(cpu,4) == '+spec-ctrl'
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