fog-proxmox 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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
data/README.md ADDED
@@ -0,0 +1,58 @@
1
+ ![Foreman](fogproxmox.png)
2
+
3
+ # Fog::Proxmox
4
+
5
+ [![Build Status](https://travis-ci.org/fog/fog-proxmox.svg?branch=master)](https://travis-ci.org/fog/fog-proxmox)
6
+ [![Maintainability](https://api.codeclimate.com/v1/badges/33e619f2167cc9864b61/maintainability)](https://codeclimate.com/github/fog/fog-proxmox/maintainability)
7
+ [![Test Coverage](https://api.codeclimate.com/v1/badges/33e619f2167cc9864b61/test_coverage)](https://codeclimate.com/github/fog/fog-proxmox/test_coverage)
8
+
9
+ This is a [FOG](http://fog.io/) (>= 1.45.0) module gem to support [Proxmox VE](https://www.proxmox.com/en/proxmox-ve) (tested with 5.1 and 5.2)
10
+
11
+ It is intended to satisfy this [feature](https://github.com/fog/fog/issues/3644), but Proxmox provider only, and above all this [Foreman](http://www.theforeman.org) [feature](https://projects.theforeman.org/issues/2186).
12
+
13
+ It is inspired by the great [fog-openstack](https://github.com/fog/fog-openstack) module.
14
+
15
+ ## Installation
16
+
17
+ Add this line to your application's Gemfile:
18
+
19
+ ```ruby
20
+ gem 'fog-proxmox'
21
+ ```
22
+
23
+ And then execute:
24
+
25
+ ```ruby
26
+ bundle install --binstubs
27
+ ```
28
+
29
+ Or install it yourself as:
30
+
31
+ ```ruby
32
+ gem install fog-proxmox
33
+ ```
34
+
35
+ ## Usage
36
+
37
+ See [documentation](docs/getting_started.md).
38
+
39
+ This is not yet a stable version. I recommend you not to use it in production.
40
+
41
+ Work is still in progress...
42
+
43
+ ## Development
44
+
45
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `bundle exec rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
46
+
47
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
48
+
49
+ ## Contributing
50
+
51
+ You can reach the [contributors](CONTRIBUTORS.md).
52
+ Bug reports and pull requests are welcome on GitHub at [Fog-Proxmox](https://github.com/fog/fog-proxmox/issues). This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
53
+
54
+ Please read [how to contribute](CONTRIBUTING.md).
55
+
56
+ ## License
57
+
58
+ The gem is available as open source under the terms of the [GPL v3 License](LICENSE).
data/Rakefile ADDED
@@ -0,0 +1,53 @@
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 'bundler/gem_tasks'
21
+ require 'rubocop/rake_task'
22
+ require 'rake/testtask'
23
+
24
+ RuboCop::RakeTask.new
25
+
26
+ task default: :test
27
+
28
+ desc 'Run fog-proxmox unit tests with Minitest'
29
+ task :test do
30
+ mock = ENV['FOG_MOCK'] || 'true'
31
+ sh("export FOG_MOCK=#{mock} && bundle exec rake tests:unit")
32
+ end
33
+
34
+ desc 'Run fog-proxmox spec/ tests (VCR)'
35
+ task spec: 'tests:spec'
36
+
37
+ namespace :tests do
38
+ desc 'Run fog-proxmox test/'
39
+ Rake::TestTask.new do |t|
40
+ t.name = 'unit'
41
+ t.libs.push %w[lib test]
42
+ t.test_files = FileList['test/**/*.rb']
43
+ t.verbose = true
44
+ end
45
+
46
+ desc 'Run fog-proxmox spec/'
47
+ Rake::TestTask.new do |t|
48
+ t.name = 'spec'
49
+ t.libs.push %w[lib spec]
50
+ t.pattern = 'spec/**/*_spec.rb'
51
+ t.verbose = true
52
+ end
53
+ end
data/SUPPORT.md ADDED
@@ -0,0 +1,9 @@
1
+ # Sponsor Fog::Proxmox development
2
+
3
+ Fog::Proxmox is an [GPL-3](LICENSE) licensed open source project and completely free to use.
4
+
5
+ However, the amount of effort needed to maintain and develop the project could be support by donations.
6
+
7
+ You can support Fog::Proxmox development via the following methods:
8
+
9
+ * [Donate by PayPal](https://paypal.me/TristanRobert)
data/bin/console ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'console' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("fog-proxmox", "console")
data/bin/setup ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'setup' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("fog-proxmox", "setup")
data/docs/compute.md ADDED
@@ -0,0 +1,846 @@
1
+ # Compute
2
+
3
+ This document shows you the compute service available with fog-proxmox.
4
+
5
+ Proxmox supports both virtual machines (QEMU/KVM) and containers (LXC) management.
6
+
7
+ You can see more details in [Proxmox VM management wiki page](https://pve.proxmox.com/wiki/Qemu/KVM_Virtual_Machines) and [Proxmox containers management wiki page](https://pve.proxmox.com/wiki/Linux_Container).
8
+
9
+ ## Starting irb console
10
+
11
+ ```ruby
12
+ irb
13
+ ```
14
+
15
+ ```ruby
16
+ require 'fog/proxmox'
17
+ ```
18
+
19
+ ## Create compute service
20
+
21
+ ```ruby
22
+ compute = Fog::Compute::Proxmox.new(
23
+ pve_username: PVE_USERNAME, # your user name
24
+ pve_password: PVE_PASSWORD, # your password
25
+ pve_url: PVE_URL, # your server url
26
+ connection_options: {} # connection options
27
+ )
28
+ ```
29
+
30
+ [connection_options](connection_parameters.md) are also available.
31
+
32
+ ## Fog Abstractions
33
+
34
+ Fog provides both a **model** and **request** abstraction. The request abstraction provides the most efficient interface and the model abstraction wraps the request abstraction to provide a convenient `ActiveModel` like interface.
35
+
36
+ ### Request Layer
37
+
38
+ The request abstraction maps directly to the [Proxmox VE API](https://pve.proxmox.com/wiki/Proxmox_VE_API). It provides an interface to the Proxmox Compute service.
39
+
40
+ To see a list of requests supported by the service:
41
+
42
+ ```ruby
43
+ compute.requests
44
+ ```
45
+
46
+ To learn more about Compute request methods refer to source files.
47
+
48
+ To learn more about Excon refer to [Excon GitHub repo](https://github.com/geemus/excon).
49
+
50
+ ### Model Layer
51
+
52
+ Fog models behave in a manner similar to `ActiveModel`. Models will generally respond to `create`, `save`, `persisted?`, `destroy`, `reload` and `attributes` methods. Additionally, fog will automatically create attribute accessors.
53
+
54
+ Here is a summary of common model methods:
55
+
56
+ <table>
57
+ <tr>
58
+ <th>Method</th>
59
+ <th>Description</th>
60
+ </tr>
61
+ <tr>
62
+ <td>create</td>
63
+ <td>
64
+ Accepts hash of attributes and creates object.<br>
65
+ Note: creation is a non-blocking call and you will be required to wait for a valid state before using resulting object.
66
+ </td>
67
+ </tr>
68
+ <tr>
69
+ <td>save</td>
70
+ <td>Saves object.<br>
71
+ Note: not all objects support updating object.</td>
72
+ </tr>
73
+ <tr>
74
+ <td>persisted?</td>
75
+ <td>Returns true if the object has been persisted.</td>
76
+ </tr>
77
+ <tr>
78
+ <td>destroy</td>
79
+ <td>
80
+ Destroys object.<br>
81
+ Note: this is a non-blocking call and object deletion might not be instantaneous.
82
+ </td>
83
+ <tr>
84
+ <td>reload</td>
85
+ <td>Updates object with latest state from service.</td>
86
+ <tr>
87
+ <td>ready?</td>
88
+ <td>Returns true if object is in a ready state and able to perform actions. This method will raise an exception if object is in an error state.</td>
89
+ </tr>
90
+ <tr>
91
+ <td>attributes</td>
92
+ <td>Returns a hash containing the list of model attributes and values.</td>
93
+ </tr>
94
+ <td>identity</td>
95
+ <td>
96
+ Returns the identity of the object.<br>
97
+ Note: This might not always be equal to object.id.
98
+ </td>
99
+ </tr>
100
+ <tr>
101
+ <td>wait_for</td>
102
+ <td>This method periodically reloads model and then yields to specified block until block returns true or a timeout occurs.</td>
103
+ </tr>
104
+ </table>
105
+
106
+ The remainder of this document details the model abstraction.
107
+
108
+ #### Nodes management
109
+
110
+ Proxmox supports cluster management. Each hyperviser in the cluster is called a node.
111
+ Proxmox installs a default node in the cluster called `pve`.
112
+
113
+ List all nodes:
114
+
115
+ ```ruby
116
+ service.nodes.all
117
+ ```
118
+
119
+ This returns a collection of `Fog::Compute::Proxmox::Node` models:
120
+
121
+ Get a node:
122
+
123
+ ```ruby
124
+ node = service.nodes.find_by_id 'pve'
125
+ ```
126
+
127
+ #### Servers management
128
+
129
+ Proxmox supports servers management. Servers are also called virtual machines (VM).
130
+
131
+ VM are QEMU/KVM managed. They are attached to a node.
132
+
133
+ More details in [Proxmox VM management wiki page](https://pve.proxmox.com/wiki/Qemu/KVM_Virtual_Machines)
134
+
135
+ You need to specify a node before managing VM. Fog-proxmox enables it by managing VM from a node.
136
+
137
+ List all servers:
138
+
139
+ ```ruby
140
+ node.servers.all
141
+ ```
142
+
143
+ This returns a collection of `Fog::Identity::Proxmox::Server` models.
144
+
145
+ Before creating a server you can get the next available server id (integer >= 100) in the cluster:
146
+
147
+ ```ruby
148
+ nextid = node.servers.next_id
149
+ ```
150
+
151
+ You can also verify that an id is free or valid:
152
+
153
+ ```ruby
154
+ node.servers.id_valid? nextid
155
+ ```
156
+
157
+ Now that you have a valid id, you can create a server in this node:
158
+
159
+ ```ruby
160
+ node.servers.create({ vmid: nextid })
161
+ ```
162
+
163
+ Get this server:
164
+
165
+ ```ruby
166
+ server = node.servers.get nextid
167
+ ```
168
+
169
+ Add options: boot at startup, OS type (linux 4.x), french keyboard, no hardware KVM:
170
+
171
+ ```ruby
172
+ server.update({ onboot: 1, keyboard: 'fr', ostype: 'l26', kvm: 0 })
173
+ ```
174
+
175
+ Add a cdrom volume:
176
+
177
+ ```ruby
178
+ server.update({ ide2: 'none,media=cdrom' })
179
+ ```
180
+
181
+ Add a network interface controller (nic):
182
+
183
+ ```ruby
184
+ server.update({ net0: 'virtio,bridge=vmbr0' })
185
+ ```
186
+
187
+ Get mac adresses generated by Proxmox:
188
+
189
+ ```ruby
190
+ server.config.mac_adresses
191
+ ```
192
+
193
+ This returns an array of strings.
194
+
195
+ Get all server configuration:
196
+
197
+ ```ruby
198
+ server.config
199
+ ```
200
+
201
+ This returns a `Fog::Compute::Proxmox::ServerConfig` model:
202
+
203
+ ```ruby
204
+ <Fog::Compute::Proxmox::ServerConfig
205
+ smbios1: "uuid=ba2da6bd-0c92-4cfe-8f70-d22cc5b5bba2",
206
+ numa: 0,
207
+ digest: "348fdc21536f23a29dfb9b3120faa124aaeec742",
208
+ ostype: "l26",
209
+ cores: 1,
210
+ virtio0: "local-lvm:vm-100-disk-1,size=1G",
211
+ bootdisk: "virtio0",
212
+ scsihw: "virtio-scsi-pci",
213
+ sockets: 1,
214
+ net0: "virtio=8E:BF:3E:E7:17:0D,bridge=vmbr0",
215
+ memory: 512,
216
+ name: "test",
217
+ ide2: "cdrom,media=cdrom",
218
+ server: <Fog::Compute::Proxmox::Server vmid: 100, ...>
219
+ >
220
+ ```
221
+
222
+ Get nics config:
223
+
224
+ ```ruby
225
+ nics = server.config.interfaces
226
+ ```
227
+
228
+ This returns a hash:
229
+
230
+ ```ruby
231
+ nics = {net0: 'virtio=8E:BF:3E:E7:17:0D,bridge=vmbr0'}
232
+ ```
233
+
234
+ Get IDE,SATA,SCSI or VirtIO controllers config:
235
+
236
+ ```ruby
237
+ disks = server.config.disks
238
+ ```
239
+
240
+ This returns a hash:
241
+
242
+ ```ruby
243
+ disks = {ide2: 'cdrom,media=cdrom', virtio0: "local-lvm:vm-100-disk-1,size=1G", sata0: "local-lvm:vm-100-disk-2,size=1G"}
244
+ ```
245
+
246
+ ##### Console
247
+
248
+ VNC, SPICE and terminal consoles are availables.
249
+
250
+ Server needs to be running and a VGA display configured.
251
+
252
+ Default VGA set to `std` implies vnc console:
253
+
254
+ ```ruby
255
+ vnc_console = server.start_console(websocket: 1)
256
+ server.connect_vnc(vnc_console)
257
+ ```
258
+
259
+ returns a vnc session hash,
260
+
261
+ and set to `qxl` implies spice console:
262
+
263
+ ```ruby
264
+ spice_console = server.start_console(proxy: 'localhost')
265
+ ```
266
+
267
+ returns a spice session hash,
268
+
269
+
270
+ and set to `serial0` implies terminal console:
271
+
272
+ ```ruby
273
+ term_console = server.start_console
274
+ ```
275
+
276
+ returns a term session hash.
277
+
278
+ ##### Volumes server management
279
+
280
+ Before attaching a hdd volume, you can first fetch available storages that could have images in this node:
281
+
282
+ ```ruby
283
+ storages = node.storages.list_by_content_type 'images'
284
+ storage = storages[0] # local-lvm
285
+ ```
286
+
287
+ Four types of storage controllers emulated by Qemu are available:
288
+
289
+ * **IDE**: ide[n], n in [0..3]
290
+ * **SATA**: sata[n], n in [0..5]
291
+ * **SCSI**: scsi[n], n in [0..13]
292
+ * **VirtIO Block**: virtio[n], n in [0..15]
293
+
294
+ The hdd id is the type controller appended with an integer (n).
295
+
296
+ More details on complete configuration options can be find in [Proxmox VE API](https://pve.proxmox.com/wiki/Proxmox_VE_API).
297
+
298
+ Then attach a hdd from this storage:
299
+
300
+ ```ruby
301
+ disk = { id: 'virtio0', storage: storage.storage, size: '1' } # virtualIO block with 1Gb
302
+ options = { backup: 0, replicate: 0 } # nor backup, neither replication
303
+ server.attach(disk, options)
304
+ ```
305
+
306
+ Resize a disk:
307
+
308
+ ```ruby
309
+ server.extend('virtio0','+1G')
310
+ ```
311
+
312
+ Move a disk
313
+
314
+ ```ruby
315
+ server.move('virtio0','local')
316
+ ```
317
+
318
+ Detach a disk
319
+
320
+ ```ruby
321
+ server.detach 'virtio0'
322
+ ```
323
+
324
+ Actions on your server:
325
+
326
+ ```ruby
327
+ server.action('start') # start your server
328
+ server.wait_for { server.ready? } # wait until it is running
329
+ server.ready? # you can check if it is ready (i.e. running)
330
+ ```
331
+
332
+ ```ruby
333
+ server.action('suspend') # pause your server
334
+ server.wait_for { server.qmpstatus == 'paused' } # wait until it is paused
335
+ ```
336
+
337
+ ```ruby
338
+ server.action('resume') # resume your server
339
+ server.wait_for { server.ready? } # wait until it is running
340
+ ```
341
+
342
+ ```ruby
343
+ server.action('stop') # stop your server
344
+ server.wait_for { server.status == 'stopped' } # wait until it is stopped
345
+ ```
346
+
347
+ Fetch server disk_images:
348
+
349
+ ```ruby
350
+ disk_images = server.disk_images
351
+ ```
352
+
353
+ This returns an array of `Fog::Compute::Proxmox::Volume` instances.
354
+
355
+ Delete server:
356
+
357
+ ```ruby
358
+ server.destroy
359
+ ```
360
+
361
+ ##### Backup and restore server
362
+
363
+ You can backup all node's guests or just one guest.
364
+
365
+ You need first to get a node or a server to manage its backups:
366
+
367
+ ```ruby
368
+ node = compute.nodes.get 'pve'
369
+ server = node.servers.get vmid
370
+ ```
371
+
372
+ Then you can backup one server:
373
+
374
+ ```ruby
375
+ options = { compress: 'lzo'}
376
+ server.backup options
377
+ ```
378
+
379
+ or backup all servers on a node:
380
+
381
+ ```ruby
382
+ node.backup options
383
+ ```
384
+
385
+ You can restore a server from a backup.
386
+ Backups are volumes which content type is `backup` and owned by a server.
387
+
388
+ You first fetch the backup volumes of this server:
389
+
390
+ ```ruby
391
+ volumes = server.backups
392
+ ```
393
+
394
+ This returns an array of `Fog::Compute::Proxmox::Volume` instances.
395
+
396
+ Then you choose one:
397
+
398
+ ```ruby
399
+ backup = volumes[0] # local:backup/vzdump-qemu-100-2018_05_15-15_18_31.vma.lzo
400
+ ```
401
+
402
+ This returns a `Fog::Compute::Proxmox::Volume` instance:
403
+
404
+ ```ruby
405
+ <Fog::Compute::Proxmox::Volume
406
+ volid="local:backup/vzdump-qemu-100-2018_05_15-15_18_31.vma.lzo",
407
+ content="backup",
408
+ size=376,
409
+ format="vma.lzo",
410
+ node=nil,
411
+ storage=nil,
412
+ vmid="100"
413
+ >
414
+ ```
415
+
416
+ Then you can restore it:
417
+
418
+ ```ruby
419
+ options = { compress: 'lzo'}
420
+ server.restore backup
421
+ ```
422
+
423
+ You can delete it:
424
+
425
+ ```ruby
426
+ backup.delete
427
+ ```
428
+
429
+ More details on complete backup `options` configuration hash can be find in [Backup and restore wiki page](https://pve.proxmox.com/wiki/Backup_and_Restore).
430
+
431
+ ##### Snapshots server management
432
+
433
+ You need first to get a server to manage its snapshots:
434
+
435
+ ```ruby
436
+ server = node.servers.get vmid
437
+ ```
438
+
439
+ Then you can create a snapshot on it:
440
+
441
+ ```ruby
442
+ snapname = 'snapshot1' # you define its id
443
+ server.snapshots.create snapname
444
+ ```
445
+
446
+ Get a snapshot:
447
+
448
+ ```ruby
449
+ snapshot = server.snapshots.get snapname
450
+ ```
451
+
452
+ Add description:
453
+
454
+ ```ruby
455
+ snapshot.description = 'Snapshot 1'
456
+ snapshot.update
457
+ ```
458
+
459
+ Rollback server to this snapshot:
460
+
461
+ ```ruby
462
+ snapshot.rollback
463
+ ```
464
+
465
+ Delete snapshot:
466
+
467
+ ```ruby
468
+ snapshot.destroy
469
+ ```
470
+
471
+ ##### Clones server management
472
+
473
+ Proxmox supports cloning servers. It creates a new VM as a copy of the server.
474
+
475
+ You need first to get a server to manage its clones and a valid new VM id:
476
+
477
+ ```ruby
478
+ server = node.servers.get vmid
479
+ newid = node.servers.next_id
480
+ ```
481
+
482
+ Then you can clone it:
483
+
484
+ ```ruby
485
+ server.clone(newid)
486
+ ```
487
+
488
+ It creates a new server which id is newid. So you can manage it as a server.
489
+
490
+ Destroy the clone:
491
+
492
+ ```ruby
493
+ clone = node.servers.get newid
494
+ clone.destroy
495
+ ```
496
+
497
+ #### Containers management
498
+
499
+ Proxmox supports Linux containers management.
500
+
501
+ Containers are LXC managed. They are attached to a node.
502
+
503
+ More details in [Proxmox Linux Containers management wiki page](https://pve.proxmox.com/wiki/Linux_Container)
504
+
505
+ You need to specify a node before managing Containers. Fog-proxmox enables it by managing Containers from a node.
506
+
507
+ List all containers:
508
+
509
+ ```ruby
510
+ node.containers.all
511
+ ```
512
+
513
+ This returns a collection of `Fog::Identity::Proxmox::Container` models which are inherited from `Fog::Identity::Proxmox::Server` because they have many common features.
514
+
515
+ Before creating a container you can get the next available container id (integer >= 100) in the cluster:
516
+
517
+ ```ruby
518
+ nextid = node.containers.next_id
519
+ ```
520
+
521
+ You can also verify that an id is free or valid:
522
+
523
+ ```ruby
524
+ node.containers.id_valid? nextid
525
+ ```
526
+
527
+ Now that you have a valid id, you can create a container in this node.
528
+ Before creating the container, you need to have an available template uploaded into the cluster.
529
+ You can define the rootfs volume (1G), a root password and a SSH public key.
530
+
531
+ ```ruby
532
+ ostemplate = 'local:vztmpl/alpine-3.7-default_20171211_amd64.tar.xz'
533
+ container_hash = { vmid: vmid, storage: 'local-lvm',
534
+ ostemplate: ostemplate, password: 'proxmox01',
535
+ rootfs: 'local-lvm:1' }
536
+ node.containers.create container_hash
537
+ ```
538
+
539
+ Get this container:
540
+
541
+ ```ruby
542
+ container = node.containers.get nextid
543
+ ```
544
+
545
+ Add options: boot at startup, OS type (alpine):
546
+
547
+ ```ruby
548
+ container.update({ onboot: 1, ostype: 'alpine' })
549
+ ```
550
+
551
+ Add a network interface controller (nic):
552
+
553
+ ```ruby
554
+ container.update({ net0: 'bridge=vmbr0,name=eth0,ip=dhcp,ip6=dhcp' })
555
+ ```
556
+
557
+ Fetch all nics:
558
+
559
+ ```ruby
560
+ nics = container.config.nics
561
+ ```
562
+
563
+ This returns a hash:
564
+
565
+ ```ruby
566
+ nics = { net0: 'bridge=vmbr0,name=eth0,ip=dhcp,ip6=dhcp' }
567
+ ```
568
+
569
+ Get mac adresses generated by Proxmox:
570
+
571
+ ```ruby
572
+ container.config.mac_adresses
573
+ ```
574
+
575
+ This returns an array of strings.
576
+
577
+ Get container configuration:
578
+
579
+ ```ruby
580
+ container.config
581
+ ```
582
+
583
+ This returns a `Fog::Compute::Proxmox::ContainerConfig` model:
584
+
585
+ ```ruby
586
+ <Fog::Compute::Proxmox::ContainerConfig
587
+ memory: 512,
588
+ net0: "name=eth0,bridge=vmbr0,hwaddr=BE:3C:A9:3F:4E:39,ip=dhcp,ip6=dhcp,type=veth",
589
+ swap: 512,
590
+ cores: 1,
591
+ rootfs: "local-lvm:vm-100-disk-1,size=1G",
592
+ hostname: "CT100",
593
+ digest: "e5131befed2f6ff8e11d598c4d8bb6016d5c0901",
594
+ ostype: "alpine",
595
+ arch: "amd64"
596
+ container: <Fog::Compute::Proxmox::Container vmid: 100, ...>
597
+ >
598
+ ```
599
+
600
+ ##### Volumes container management
601
+
602
+ Before attaching a volume, you can first fetch available storages that could have images in this node:
603
+
604
+ ```ruby
605
+ storages = node.storages.list_by_content_type 'images'
606
+ storage = storages[0] # local-lvm
607
+ ```
608
+
609
+ A default and minimum volume is called `rootfs`.
610
+ Additional volumes could be attached to a container and are called mount points:
611
+
612
+ * **Mount points**: mp[n], n in [0..9]
613
+
614
+ The mount points id is `mp` appended with an integer (n).
615
+
616
+ More details on complete configuration options can be find in [Proxmox VE Linux Container](https://pve.proxmox.com/wiki/Linux_Container).
617
+
618
+ Then attach a volume from this storage:
619
+
620
+ ```ruby
621
+ mp0 = { id: 'mp0', storage: storage.storage, size: '1' }
622
+ options = { mp: '/opt/app', backup: 0, replicate: 0, quota: 1 }
623
+ container.attach(mp0, options)
624
+ ```
625
+
626
+ Extend a volume:
627
+
628
+ ```ruby
629
+ container.extend('rootfs', '+5M') # add 5Mb to rootfs volume
630
+ ```
631
+
632
+ Move a volume:
633
+
634
+ ```ruby
635
+ container.move('rootfs', 'local-lvm', delete: 1) # move rootfs and delete original
636
+ ```
637
+
638
+ Detach a volume
639
+
640
+ ```ruby
641
+ container.detach('mp0') # detach
642
+ container.detach('unused0') # remove
643
+ ```
644
+
645
+ Actions on your container:
646
+
647
+ ```ruby
648
+ container.action('start') # start your container
649
+ container.wait_for { container.ready? } # wait until it is running
650
+ container.ready? # you can check if it is ready (i.e. running)
651
+ ```
652
+
653
+ ```ruby
654
+ container.action('stop') # stop your container
655
+ container.wait_for { container.status == 'stopped' } # wait until it is stopped
656
+ ```
657
+
658
+ Resume, suspend actions are not implemented.
659
+
660
+ Fetch container mount points:
661
+
662
+ ```ruby
663
+ mount_points = container.config.mount_points
664
+ ```
665
+
666
+ This returns a hash:
667
+
668
+ ```ruby
669
+ mount_points = { mp0: "local-lvm:vm-100-disk-2,mp=/opt/app,size=1G" }
670
+ ```
671
+
672
+ Delete container:
673
+
674
+ ```ruby
675
+ container.destroy
676
+ ```
677
+
678
+ ##### Backup and restore container
679
+
680
+ You can backup all node's guests or just one guest.
681
+
682
+ You need first to get a node or a container to manage its backups:
683
+
684
+ ```ruby
685
+ node = compute.nodes.get 'pve'
686
+ container = node.containers.get vmid
687
+ ```
688
+
689
+ Then you can backup one container:
690
+
691
+ ```ruby
692
+ options = { compress: 'lzo'}
693
+ container.backup options
694
+ ```
695
+
696
+ or backup all containers and servers on a node:
697
+
698
+ ```ruby
699
+ node.backup options
700
+ ```
701
+
702
+ You can restore a container from a backup.
703
+ Backups are volumes which content type is `backup` and owned by a container.
704
+
705
+ You first fetch the backup volumes of this container:
706
+
707
+ ```ruby
708
+ volumes = container.backups
709
+ ```
710
+
711
+ This returns an array of `Fog::Compute::Proxmox::Volume` instances.
712
+
713
+ Then you choose one:
714
+
715
+ ```ruby
716
+ backup = volumes[0] # local:backup/vzdump-qemu-100-2018_05_15-15_18_31.vma.lzo
717
+ ```
718
+
719
+ This returns a `Fog::Compute::Proxmox::Volume` instance:
720
+
721
+ ```ruby
722
+ <Fog::Compute::Proxmox::Volume
723
+ volid="local:backup/vzdump-qemu-100-2018_05_15-15_18_31.vma.lzo",
724
+ content="backup",
725
+ size=376,
726
+ format="vma.lzo",
727
+ node=nil,
728
+ storage=nil,
729
+ vmid="100"
730
+ >
731
+ ```
732
+
733
+ Then you can restore it:
734
+
735
+ ```ruby
736
+ options = { compress: 'lzo'}
737
+ container.restore backup
738
+ ```
739
+
740
+ You can delete it:
741
+
742
+ ```ruby
743
+ backup.delete
744
+ ```
745
+
746
+ More details on complete backup `options` configuration hash can be find in [Backup and restore wiki page](https://pve.proxmox.com/wiki/Backup_and_Restore).
747
+
748
+ ##### Snapshots container management
749
+
750
+ You need first to get a container to manage its snapshots:
751
+
752
+ ```ruby
753
+ container = node.containers.get vmid
754
+ ```
755
+
756
+ Then you can create a snapshot on it:
757
+
758
+ ```ruby
759
+ snapname = 'snapshot1' # you define its id
760
+ container.snapshots.create snapname
761
+ ```
762
+
763
+ Get a snapshot:
764
+
765
+ ```ruby
766
+ snapshot = container.snapshots.get snapname
767
+ ```
768
+
769
+ Add description:
770
+
771
+ ```ruby
772
+ snapshot.description = 'Snapshot 1'
773
+ snapshot.update
774
+ ```
775
+
776
+ Rollback container to this snapshot:
777
+
778
+ ```ruby
779
+ snapshot.rollback
780
+ ```
781
+
782
+ Delete snapshot:
783
+
784
+ ```ruby
785
+ snapshot.destroy
786
+ ```
787
+
788
+ ##### Clones container management
789
+
790
+ Proxmox supports cloning containers. It creates a new container as a copy of the original container.
791
+
792
+ You need first to get a container to manage its clones and a valid new container id:
793
+
794
+ ```ruby
795
+ container = node.containers.get vmid
796
+ newid = node.containers.next_id
797
+ ```
798
+
799
+ Then you can clone it:
800
+
801
+ ```ruby
802
+ container.clone(newid)
803
+ ```
804
+
805
+ It creates a new container which id is newid. So you can manage it as a container.
806
+
807
+ Destroy the clone:
808
+
809
+ ```ruby
810
+ clone = node.containers.get newid
811
+ clone.destroy
812
+ ```
813
+
814
+ #### Tasks management
815
+
816
+ Proxmox supports tasks management. A task enables to follow all asynchronous actions made in a node: VM creation, start, etc. Indeed, some of these tasks could be long to execute.
817
+
818
+ You need first to get a node to manage its tasks:
819
+
820
+ ```ruby
821
+ node = compute.nodes.find_by_id 'pve'
822
+ ```
823
+
824
+ Search tasks (limit results to 1):
825
+
826
+ ```ruby
827
+ tasks = node.tasks.search { limit: 1 }
828
+ ```
829
+
830
+ Get a task by its id. This id can be retrieved as a result of an action:
831
+
832
+ ```ruby
833
+ taskid = snapshot.destroy
834
+ task = node.tasks.find_by_id taskid
835
+ task.wait_for { succeeded? }
836
+ ```
837
+
838
+ Stop a task:
839
+
840
+ ```ruby
841
+ task.stop
842
+ ```
843
+
844
+ ### Examples
845
+
846
+ More examples can be seen at [examples/compute.rb](examples/compute.rb) or [spec/compute_spec.rb](spec/compute_spec.rb).