fog-proxmox 0.4.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.
Files changed (199) hide show
  1. checksums.yaml +7 -0
  2. data/.bundle/config +4 -0
  3. data/.codeclimate.yml +14 -0
  4. data/.github/ISSUE_TEMPLATE/bug_report.md +35 -0
  5. data/.github/ISSUE_TEMPLATE/feature_request.md +17 -0
  6. data/.gitignore +5 -0
  7. data/.gitlab-ci.yml +42 -0
  8. data/.rubocop.yml +13 -0
  9. data/.ruby-gemset +1 -0
  10. data/.solargraph.yml +10 -0
  11. data/.travis.yml +26 -0
  12. data/.vscode/launch.json +114 -0
  13. data/.vscode/settings.json +45 -0
  14. data/.vscode/tasks.json +27 -0
  15. data/CODE_OF_CONDUCT.md +74 -0
  16. data/CONTRIBUTING.md +20 -0
  17. data/CONTRIBUTORS.md +9 -0
  18. data/Gemfile +23 -0
  19. data/Gemfile.lock +146 -0
  20. data/ISSUE_TEMPLATE.md +43 -0
  21. data/LICENSE +674 -0
  22. data/README.md +58 -0
  23. data/Rakefile +53 -0
  24. data/SUPPORT.md +9 -0
  25. data/bin/console +29 -0
  26. data/bin/setup +29 -0
  27. data/docs/compute.md +846 -0
  28. data/docs/connection_parameters.md +45 -0
  29. data/docs/getting_started.md +53 -0
  30. data/docs/identity.md +357 -0
  31. data/examples/compute.rb +279 -0
  32. data/examples/identity.rb +195 -0
  33. data/fog-proxmox.gemspec +63 -0
  34. data/fogproxmox.png +0 -0
  35. data/lib/fog/compute/proxmox.rb +131 -0
  36. data/lib/fog/compute/proxmox/models/container.rb +97 -0
  37. data/lib/fog/compute/proxmox/models/container_config.rb +90 -0
  38. data/lib/fog/compute/proxmox/models/containers.rb +40 -0
  39. data/lib/fog/compute/proxmox/models/disk.rb +67 -0
  40. data/lib/fog/compute/proxmox/models/disks.rb +49 -0
  41. data/lib/fog/compute/proxmox/models/interface.rb +50 -0
  42. data/lib/fog/compute/proxmox/models/interfaces.rb +46 -0
  43. data/lib/fog/compute/proxmox/models/node.rb +93 -0
  44. data/lib/fog/compute/proxmox/models/nodes.rb +45 -0
  45. data/lib/fog/compute/proxmox/models/server.rb +212 -0
  46. data/lib/fog/compute/proxmox/models/server_config.rb +116 -0
  47. data/lib/fog/compute/proxmox/models/servers.rb +70 -0
  48. data/lib/fog/compute/proxmox/models/snapshot.rb +70 -0
  49. data/lib/fog/compute/proxmox/models/snapshots.rb +55 -0
  50. data/lib/fog/compute/proxmox/models/storage.rb +61 -0
  51. data/lib/fog/compute/proxmox/models/storages.rb +60 -0
  52. data/lib/fog/compute/proxmox/models/task.rb +84 -0
  53. data/lib/fog/compute/proxmox/models/tasks.rb +71 -0
  54. data/lib/fog/compute/proxmox/models/volume.rb +61 -0
  55. data/lib/fog/compute/proxmox/models/volumes.rb +67 -0
  56. data/lib/fog/compute/proxmox/requests/action_server.rb +47 -0
  57. data/lib/fog/compute/proxmox/requests/check_vmid.rb +41 -0
  58. data/lib/fog/compute/proxmox/requests/clone_server.rb +46 -0
  59. data/lib/fog/compute/proxmox/requests/create_backup.rb +44 -0
  60. data/lib/fog/compute/proxmox/requests/create_server.rb +45 -0
  61. data/lib/fog/compute/proxmox/requests/create_snapshot.rb +47 -0
  62. data/lib/fog/compute/proxmox/requests/create_spice.rb +46 -0
  63. data/lib/fog/compute/proxmox/requests/create_term.rb +46 -0
  64. data/lib/fog/compute/proxmox/requests/create_vnc.rb +46 -0
  65. data/lib/fog/compute/proxmox/requests/delete_server.rb +47 -0
  66. data/lib/fog/compute/proxmox/requests/delete_snapshot.rb +48 -0
  67. data/lib/fog/compute/proxmox/requests/delete_volume.rb +40 -0
  68. data/lib/fog/compute/proxmox/requests/get_node.rb +44 -0
  69. data/lib/fog/compute/proxmox/requests/get_server_config.rb +45 -0
  70. data/lib/fog/compute/proxmox/requests/get_server_status.rb +45 -0
  71. data/lib/fog/compute/proxmox/requests/get_snapshot.rb +47 -0
  72. data/lib/fog/compute/proxmox/requests/get_storage.rb +44 -0
  73. data/lib/fog/compute/proxmox/requests/get_task.rb +44 -0
  74. data/lib/fog/compute/proxmox/requests/get_vnc.rb +46 -0
  75. data/lib/fog/compute/proxmox/requests/get_volume.rb +42 -0
  76. data/lib/fog/compute/proxmox/requests/list_nodes.rb +42 -0
  77. data/lib/fog/compute/proxmox/requests/list_servers.rb +42 -0
  78. data/lib/fog/compute/proxmox/requests/list_snapshots.rb +43 -0
  79. data/lib/fog/compute/proxmox/requests/list_storages.rb +42 -0
  80. data/lib/fog/compute/proxmox/requests/list_tasks.rb +42 -0
  81. data/lib/fog/compute/proxmox/requests/list_volumes.rb +42 -0
  82. data/lib/fog/compute/proxmox/requests/log_task.rb +45 -0
  83. data/lib/fog/compute/proxmox/requests/migrate_server.rb +44 -0
  84. data/lib/fog/compute/proxmox/requests/move_disk.rb +46 -0
  85. data/lib/fog/compute/proxmox/requests/move_volume.rb +46 -0
  86. data/lib/fog/compute/proxmox/requests/next_vmid.rb +39 -0
  87. data/lib/fog/compute/proxmox/requests/resize_container.rb +46 -0
  88. data/lib/fog/compute/proxmox/requests/resize_server.rb +43 -0
  89. data/lib/fog/compute/proxmox/requests/rollback_snapshot.rb +46 -0
  90. data/lib/fog/compute/proxmox/requests/status_task.rb +44 -0
  91. data/lib/fog/compute/proxmox/requests/stop_task.rb +41 -0
  92. data/lib/fog/compute/proxmox/requests/template_server.rb +43 -0
  93. data/lib/fog/compute/proxmox/requests/update_server.rb +46 -0
  94. data/lib/fog/compute/proxmox/requests/update_snapshot.rb +45 -0
  95. data/lib/fog/identity/proxmox.rb +132 -0
  96. data/lib/fog/identity/proxmox/models/activedirectory.rb +57 -0
  97. data/lib/fog/identity/proxmox/models/domain.rb +61 -0
  98. data/lib/fog/identity/proxmox/models/domains.rb +115 -0
  99. data/lib/fog/identity/proxmox/models/group.rb +60 -0
  100. data/lib/fog/identity/proxmox/models/groups.rb +50 -0
  101. data/lib/fog/identity/proxmox/models/ldap.rb +57 -0
  102. data/lib/fog/identity/proxmox/models/oath.rb +50 -0
  103. data/lib/fog/identity/proxmox/models/pam.rb +46 -0
  104. data/lib/fog/identity/proxmox/models/permission.rb +69 -0
  105. data/lib/fog/identity/proxmox/models/permissions.rb +61 -0
  106. data/lib/fog/identity/proxmox/models/pool.rb +84 -0
  107. data/lib/fog/identity/proxmox/models/pools.rb +50 -0
  108. data/lib/fog/identity/proxmox/models/principal.rb +47 -0
  109. data/lib/fog/identity/proxmox/models/pve.rb +46 -0
  110. data/lib/fog/identity/proxmox/models/role.rb +61 -0
  111. data/lib/fog/identity/proxmox/models/roles.rb +51 -0
  112. data/lib/fog/identity/proxmox/models/user.rb +74 -0
  113. data/lib/fog/identity/proxmox/models/users.rb +50 -0
  114. data/lib/fog/identity/proxmox/models/yubico.rb +51 -0
  115. data/lib/fog/identity/proxmox/requests/add_permission.rb +41 -0
  116. data/lib/fog/identity/proxmox/requests/change_password.rb +41 -0
  117. data/lib/fog/identity/proxmox/requests/check_permissions.rb +44 -0
  118. data/lib/fog/identity/proxmox/requests/create_domain.rb +40 -0
  119. data/lib/fog/identity/proxmox/requests/create_group.rb +40 -0
  120. data/lib/fog/identity/proxmox/requests/create_pool.rb +40 -0
  121. data/lib/fog/identity/proxmox/requests/create_role.rb +40 -0
  122. data/lib/fog/identity/proxmox/requests/create_user.rb +40 -0
  123. data/lib/fog/identity/proxmox/requests/delete_domain.rb +40 -0
  124. data/lib/fog/identity/proxmox/requests/delete_group.rb +40 -0
  125. data/lib/fog/identity/proxmox/requests/delete_pool.rb +39 -0
  126. data/lib/fog/identity/proxmox/requests/delete_role.rb +40 -0
  127. data/lib/fog/identity/proxmox/requests/delete_user.rb +39 -0
  128. data/lib/fog/identity/proxmox/requests/get_domain.rb +41 -0
  129. data/lib/fog/identity/proxmox/requests/get_group.rb +41 -0
  130. data/lib/fog/identity/proxmox/requests/get_pool.rb +41 -0
  131. data/lib/fog/identity/proxmox/requests/get_role.rb +41 -0
  132. data/lib/fog/identity/proxmox/requests/get_user.rb +40 -0
  133. data/lib/fog/identity/proxmox/requests/list_domains.rb +41 -0
  134. data/lib/fog/identity/proxmox/requests/list_groups.rb +41 -0
  135. data/lib/fog/identity/proxmox/requests/list_permissions.rb +41 -0
  136. data/lib/fog/identity/proxmox/requests/list_pools.rb +41 -0
  137. data/lib/fog/identity/proxmox/requests/list_roles.rb +41 -0
  138. data/lib/fog/identity/proxmox/requests/list_users.rb +42 -0
  139. data/lib/fog/identity/proxmox/requests/read_version.rb +43 -0
  140. data/lib/fog/identity/proxmox/requests/remove_permission.rb +42 -0
  141. data/lib/fog/identity/proxmox/requests/update_domain.rb +41 -0
  142. data/lib/fog/identity/proxmox/requests/update_group.rb +41 -0
  143. data/lib/fog/identity/proxmox/requests/update_pool.rb +41 -0
  144. data/lib/fog/identity/proxmox/requests/update_role.rb +41 -0
  145. data/lib/fog/identity/proxmox/requests/update_user.rb +41 -0
  146. data/lib/fog/network/proxmox.rb +83 -0
  147. data/lib/fog/network/proxmox/models/network.rb +82 -0
  148. data/lib/fog/network/proxmox/models/networks.rb +54 -0
  149. data/lib/fog/network/proxmox/models/node.rb +70 -0
  150. data/lib/fog/network/proxmox/models/nodes.rb +45 -0
  151. data/lib/fog/network/proxmox/requests/create_network.rb +44 -0
  152. data/lib/fog/network/proxmox/requests/delete_network.rb +45 -0
  153. data/lib/fog/network/proxmox/requests/get_network.rb +46 -0
  154. data/lib/fog/network/proxmox/requests/get_node.rb +44 -0
  155. data/lib/fog/network/proxmox/requests/list_networks.rb +43 -0
  156. data/lib/fog/network/proxmox/requests/list_nodes.rb +42 -0
  157. data/lib/fog/network/proxmox/requests/power_node.rb +46 -0
  158. data/lib/fog/network/proxmox/requests/update_network.rb +46 -0
  159. data/lib/fog/proxmox.rb +128 -0
  160. data/lib/fog/proxmox/core.rb +139 -0
  161. data/lib/fog/proxmox/errors.rb +64 -0
  162. data/lib/fog/proxmox/hash.rb +33 -0
  163. data/lib/fog/proxmox/helpers/controller_helper.rb +55 -0
  164. data/lib/fog/proxmox/helpers/cpu_helper.rb +45 -0
  165. data/lib/fog/proxmox/helpers/disk_helper.rb +84 -0
  166. data/lib/fog/proxmox/helpers/nic_helper.rb +62 -0
  167. data/lib/fog/proxmox/json.rb +32 -0
  168. data/lib/fog/proxmox/models/collection.rb +85 -0
  169. data/lib/fog/proxmox/models/model.rb +58 -0
  170. data/lib/fog/proxmox/variables.rb +40 -0
  171. data/lib/fog/proxmox/version.rb +24 -0
  172. data/lib/fog/storage/proxmox.rb +29 -0
  173. data/spec/compute_spec.rb +408 -0
  174. data/spec/fixtures/proxmox/compute/containers.yml +5398 -0
  175. data/spec/fixtures/proxmox/compute/identity_ticket.yml +40 -0
  176. data/spec/fixtures/proxmox/compute/servers.yml +10571 -0
  177. data/spec/fixtures/proxmox/compute/snapshots.yml +1228 -0
  178. data/spec/fixtures/proxmox/compute/storages.yml +120 -0
  179. data/spec/fixtures/proxmox/compute/tasks.yml +200 -0
  180. data/spec/fixtures/proxmox/identity/auth.yml +44 -0
  181. data/spec/fixtures/proxmox/identity/domains.yml +531 -0
  182. data/spec/fixtures/proxmox/identity/groups.yml +324 -0
  183. data/spec/fixtures/proxmox/identity/identity_ticket.yml +40 -0
  184. data/spec/fixtures/proxmox/identity/permissions.yml +565 -0
  185. data/spec/fixtures/proxmox/identity/pools.yml +488 -0
  186. data/spec/fixtures/proxmox/identity/read_version.yml +42 -0
  187. data/spec/fixtures/proxmox/identity/roles.yml +324 -0
  188. data/spec/fixtures/proxmox/identity/users.yml +646 -0
  189. data/spec/fixtures/proxmox/network/identity_ticket.yml +40 -0
  190. data/spec/fixtures/proxmox/network/networks.yml +413 -0
  191. data/spec/helpers/controller_helper_spec.rb +77 -0
  192. data/spec/helpers/cpu_helper_spec.rb +91 -0
  193. data/spec/helpers/disk_helper_spec.rb +104 -0
  194. data/spec/helpers/nic_helper_spec.rb +73 -0
  195. data/spec/identity_spec.rb +316 -0
  196. data/spec/network_spec.rb +67 -0
  197. data/spec/proxmox_vcr.rb +102 -0
  198. data/spec/spec_helper.rb +39 -0
  199. metadata +535 -0
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2018 Tristan Robert
4
+
5
+ # This file is part of Fog::Proxmox.
6
+
7
+ # Fog::Proxmox is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU General Public License as published by
9
+ # the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+
12
+ # Fog::Proxmox is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU General Public License for more details.
16
+
17
+ # You should have received a copy of the GNU General Public License
18
+ # along with Fog::Proxmox. If not, see <http://www.gnu.org/licenses/>.
19
+
20
+ require 'fog/proxmox/models/collection'
21
+ require 'fog/compute/proxmox/models/disk'
22
+
23
+ module Fog
24
+ module Compute
25
+ class Proxmox
26
+ # class Disks Collection of disk
27
+ class Disks < Fog::Proxmox::Collection
28
+ model Fog::Compute::Proxmox::Disk
29
+
30
+ def all(_options = {})
31
+ self
32
+ end
33
+
34
+ def get(id)
35
+ cached_disk = find { |disk| disk.id == id }
36
+ return cached_disk if cached_disk
37
+ end
38
+
39
+ def next_device(controller)
40
+ Fog::Proxmox::ControllerHelper.last_index(controller, self) + 1
41
+ end
42
+
43
+ def cdrom
44
+ find(&:cdrom?)
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+ # Copyright 2018 Tristan Robert
3
+
4
+ # This file is part of Fog::Proxmox.
5
+
6
+ # Fog::Proxmox is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ # Copyright 2018 Tristan Robert
11
+
12
+ # This file is part of Fog::Proxmox.
13
+
14
+ # Fog::Proxmox is free software: you can redistribute it and/or modify
15
+ # it under the terms of the GNU General Public License as published by
16
+ # the Free Software Foundation, either version 3 of the License, or
17
+ # (at your option) any later version.
18
+
19
+ # Fog::Proxmox is distributed in the hope that it will be useful,
20
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
21
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22
+ # GNU General Public License for more details.
23
+
24
+ # You should have received a copy of the GNU General Public License
25
+ # along with Fog::Proxmox. If not, see <http://www.gnu.org/licenses/>.
26
+
27
+ # frozen_string_literal: true
28
+
29
+ require 'fog/proxmox/models/model'
30
+
31
+ module Fog
32
+ module Compute
33
+ class Proxmox
34
+ # class Interface model
35
+ class Interface < Fog::Proxmox::Model
36
+ identity :id
37
+ attribute :mac
38
+ attribute :model
39
+ attribute :bridge
40
+ attribute :firewall
41
+ attribute :link_down
42
+ attribute :rate
43
+ attribute :queues
44
+ attribute :tag
45
+
46
+ NAME = 'net'
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2018 Tristan Robert
4
+
5
+ # This file is part of Fog::Proxmox.
6
+
7
+ # Fog::Proxmox is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU General Public License as published by
9
+ # the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+
12
+ # Fog::Proxmox is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU General Public License for more details.
16
+
17
+ # You should have received a copy of the GNU General Public License
18
+ # along with Fog::Proxmox. If not, see <http://www.gnu.org/licenses/>.
19
+
20
+ require 'fog/proxmox/models/collection'
21
+ require 'fog/compute/proxmox/models/interface'
22
+ require 'fog/proxmox/helpers/controller_helper'
23
+
24
+ module Fog
25
+ module Compute
26
+ class Proxmox
27
+ # class Interfaces Collection of nodes of cluster
28
+ class Interfaces < Fog::Proxmox::Collection
29
+ model Fog::Compute::Proxmox::Interface
30
+
31
+ def all(_options = {})
32
+ self
33
+ end
34
+
35
+ def get(id)
36
+ cached_interface = find { |interface| interface.id == id }
37
+ return cached_interface if cached_interface
38
+ end
39
+
40
+ def next_nicid
41
+ Fog::Proxmox::ControllerHelper.last_index(Fog::Compute::Proxmox::Interface::NAME, self) + 1
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+ # Copyright 2018 Tristan Robert
3
+
4
+ # This file is part of Fog::Proxmox.
5
+
6
+ # Fog::Proxmox is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ # Copyright 2018 Tristan Robert
11
+
12
+ # This file is part of Fog::Proxmox.
13
+
14
+ # Fog::Proxmox is free software: you can redistribute it and/or modify
15
+ # it under the terms of the GNU General Public License as published by
16
+ # the Free Software Foundation, either version 3 of the License, or
17
+ # (at your option) any later version.
18
+
19
+ # Fog::Proxmox is distributed in the hope that it will be useful,
20
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
21
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22
+ # GNU General Public License for more details.
23
+
24
+ # You should have received a copy of the GNU General Public License
25
+ # along with Fog::Proxmox. If not, see <http://www.gnu.org/licenses/>.
26
+
27
+ # frozen_string_literal: true
28
+
29
+ require 'fog/proxmox/models/model'
30
+
31
+ module Fog
32
+ module Compute
33
+ class Proxmox
34
+ # class Node model of VMs
35
+ class Node < Fog::Proxmox::Model
36
+ identity :node
37
+ attribute :status
38
+ attribute :wait
39
+ attribute :uptime
40
+ attribute :pveversion
41
+ attribute :ksm
42
+ attribute :kversion
43
+ attribute :loadavg
44
+ attribute :rootfs
45
+ attribute :cpu
46
+ attribute :cpuinfo
47
+ attribute :memory
48
+ attribute :idle
49
+ attribute :swap
50
+ attribute :servers
51
+ attribute :tasks
52
+ attribute :storages
53
+
54
+ def to_s
55
+ node
56
+ end
57
+
58
+ def tasks
59
+ @tasks ||= begin
60
+ Fog::Compute::Proxmox::Tasks.new(service: service,
61
+ node: self)
62
+ end
63
+ end
64
+
65
+ def servers
66
+ @servers ||= begin
67
+ Fog::Compute::Proxmox::Servers.new(service: service,
68
+ node: self)
69
+ end
70
+ end
71
+
72
+ def containers
73
+ @containers ||= begin
74
+ Fog::Compute::Proxmox::Containers.new(service: service,
75
+ node: self)
76
+ end
77
+ end
78
+
79
+ def storages
80
+ @storages ||= begin
81
+ Fog::Compute::Proxmox::Storages.new(service: service,
82
+ node: self)
83
+ end
84
+ end
85
+
86
+ def backup(options = {})
87
+ task_upid = service.backup({ node: node }, options)
88
+ task_upid
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2018 Tristan Robert
4
+
5
+ # This file is part of Fog::Proxmox.
6
+
7
+ # Fog::Proxmox is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU General Public License as published by
9
+ # the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+
12
+ # Fog::Proxmox is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU General Public License for more details.
16
+
17
+ # You should have received a copy of the GNU General Public License
18
+ # along with Fog::Proxmox. If not, see <http://www.gnu.org/licenses/>.
19
+
20
+ require 'fog/proxmox/models/collection'
21
+ require 'fog/compute/proxmox/models/node'
22
+
23
+ module Fog
24
+ module Compute
25
+ class Proxmox
26
+ # class Nodes Collection of nodes of cluster
27
+ class Nodes < Fog::Proxmox::Collection
28
+ model Fog::Compute::Proxmox::Node
29
+
30
+ def all(_options = {})
31
+ load_response(service.list_nodes, 'nodes')
32
+ end
33
+
34
+ def find_by_id(id)
35
+ cached_node = find { |node| node.node == id }
36
+ return cached_node if cached_node
37
+ node_hash = service.get_node(id)
38
+ Fog::Compute::Proxmox::Node.new(
39
+ node_hash.merge(service: service, node: id)
40
+ )
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,212 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2018 Tristan Robert
4
+
5
+ # This file is part of Fog::Proxmox.
6
+
7
+ # Fog::Proxmox is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU General Public License as published by
9
+ # the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+
12
+ # Fog::Proxmox is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU General Public License for more details.
16
+
17
+ # You should have received a copy of the GNU General Public License
18
+ # along with Fog::Proxmox. If not, see <http://www.gnu.org/licenses/>.
19
+
20
+ require 'fog/compute/models/server'
21
+ require 'fog/proxmox/helpers/disk_helper'
22
+ require 'fog/proxmox/hash'
23
+
24
+ module Fog
25
+ module Compute
26
+ class Proxmox
27
+ # Server model
28
+ class Server < Fog::Compute::Server
29
+ identity :vmid
30
+ attribute :node
31
+ attribute :config
32
+ attribute :name
33
+ attribute :type
34
+ attribute :maxdisk
35
+ attribute :disk
36
+ attribute :diskwrite
37
+ attribute :diskread
38
+ attribute :uptime
39
+ attribute :netout
40
+ attribute :netin
41
+ attribute :cpu
42
+ attribute :cpus
43
+ attribute :template
44
+ attribute :status
45
+ attribute :maxcpu
46
+ attribute :mem
47
+ attribute :maxmem
48
+ attribute :qmpstatus
49
+ attribute :ha
50
+ attribute :pid
51
+ attribute :blockstat
52
+ attribute :balloon
53
+ attribute :ballooninfo
54
+ attribute :snapshots
55
+
56
+ def initialize(attributes = {})
57
+ prepare_service_value(attributes)
58
+ set_config(attributes)
59
+ super
60
+ end
61
+
62
+ def type(attributes = {})
63
+ @type ||= 'qemu' unless attributes[:type] || attributes['type']
64
+ @type
65
+ end
66
+
67
+ def request(name, body_params = {}, path_params = {})
68
+ requires :node, :type
69
+ path = path_params.merge(node: node, type: type)
70
+ task_upid = service.send(name, path, body_params)
71
+ tasks.wait_for(task_upid)
72
+ end
73
+
74
+ def create(config = {})
75
+ request(:create_server, config.merge(vmid: vmid))
76
+ end
77
+
78
+ def update(config = {})
79
+ requires :vmid
80
+ request(:update_server, config, vmid: vmid)
81
+ end
82
+
83
+ def destroy(options = {})
84
+ requires :vmid
85
+ request(:delete_server, options, vmid: vmid)
86
+ end
87
+
88
+ def action(action, options = {})
89
+ requires :vmid
90
+ action_known = %w[start stop resume suspend shutdown reset].include? action
91
+ message = "Action #{action} not implemented"
92
+ raise Fog::Errors::Error, message unless action_known
93
+ request(:action_server, options, action: action, vmid: vmid)
94
+ end
95
+
96
+ def ready?
97
+ status == 'running'
98
+ end
99
+
100
+ def reload
101
+ requires :vmid
102
+ object = collection.get(vmid)
103
+ merge_attributes(object.attributes)
104
+ end
105
+
106
+ def backup(options = {})
107
+ requires :vmid
108
+ request(:create_backup, options.merge(vmid: vmid))
109
+ end
110
+
111
+ def restore(backup, options = {})
112
+ requires :vmid
113
+ config = options.merge(archive: backup.volid, force: 1)
114
+ create(config)
115
+ end
116
+
117
+ def clone(newid, options = {})
118
+ requires :vmid
119
+ request(:clone_server, options.merge(newid: newid), vmid: vmid)
120
+ end
121
+
122
+ def template(options = {})
123
+ requires :vmid, :node
124
+ service.template_server({ node: node, type: type, vmid: vmid }, options)
125
+ end
126
+
127
+ def migrate(target, options = {})
128
+ requires :vmid
129
+ request(:migrate_server, options.merge(target: target), vmid: vmid)
130
+ end
131
+
132
+ def extend(disk, size, options = {})
133
+ requires :vmid, :node
134
+ service.resize_server({ node: node, vmid: vmid }, options.merge(disk: disk, size: size))
135
+ end
136
+
137
+ def move(disk, storage, options = {})
138
+ requires :vmid
139
+ request(:move_disk, options.merge(disk: disk, storage: storage), vmid: vmid)
140
+ end
141
+
142
+ def attach(disk, options = {})
143
+ config = Fog::Proxmox::DiskHelper.flatten(disk.merge(options: options))
144
+ update(config)
145
+ end
146
+
147
+ def detach(diskid)
148
+ update(delete: diskid)
149
+ end
150
+
151
+ def set_config(attributes = {})
152
+ @config = Fog::Compute::Proxmox::ServerConfig.new({ service: service }.merge(attributes))
153
+ end
154
+
155
+ def config
156
+ path_params = { node: node, type: type, vmid: vmid }
157
+ set_config(service.get_server_config(path_params)) if uptime
158
+ @config
159
+ end
160
+
161
+ def snapshots
162
+ @snapshots ||= begin
163
+ Fog::Compute::Proxmox::Snapshots.new(service: service,
164
+ server: self)
165
+ end
166
+ end
167
+
168
+ def backups
169
+ list 'backup'
170
+ end
171
+
172
+ def images
173
+ list 'images'
174
+ end
175
+
176
+ def list(content)
177
+ storages = node.storages.list_by_content_type content
178
+ volumes = []
179
+ storages.each { |storage| volumes += storage.volumes.list_by_content_type_and_by_server(content, vmid) }
180
+ volumes
181
+ end
182
+
183
+ def tasks
184
+ node.tasks.search(vmid: vmid)
185
+ end
186
+
187
+ def start_console(options = {})
188
+ raise ::Fog::Proxmox::Errors::ServiceError, "Unable to start console because server not running." unless ready?
189
+ type_console = config.type_console
190
+ raise ::Fog::Proxmox::Errors::ServiceError, "Unable to start console because VGA display server config is not set or unknown." unless type_console
191
+ requires :vmid, :node, :type
192
+ path_params = { node: node, type: type, vmid: vmid }
193
+ body_params = options
194
+ data = service.send(('create_' + type_console).to_sym, path_params, body_params)
195
+ task_upid = data['upid']
196
+ if task_upid
197
+ task = tasks.get(task_upid)
198
+ task.wait_for { running? }
199
+ end
200
+ data
201
+ end
202
+
203
+ def connect_vnc(options = {})
204
+ requires :vmid, :node, :type
205
+ path_params = { node: node, type: type, vmid: vmid }
206
+ query_params = { port: options['port'], vncticket: options['ticket'] }
207
+ service.get_vnc(path_params, query_params)
208
+ end
209
+ end
210
+ end
211
+ end
212
+ end