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,24 @@
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
+ module Fog
21
+ module Proxmox
22
+ VERSION = '0.4.0'
23
+ end
24
+ end
@@ -0,0 +1,29 @@
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
+
11
+ # Fog::Proxmox is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with Fog::Proxmox. If not, see <http://www.gnu.org/licenses/>.
18
+
19
+ # frozen_string_literal: true
20
+
21
+ module Fog
22
+ module Storage
23
+ # Procmox storage service
24
+ class Proxmox < Fog::Service
25
+ # Models
26
+ model_path 'fog/storage/proxmox/models'
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,408 @@
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 'spec_helper'
21
+ require_relative './proxmox_vcr'
22
+
23
+ describe Fog::Compute::Proxmox do
24
+ before :all do
25
+ @proxmox_vcr = ProxmoxVCR.new(
26
+ vcr_directory: 'spec/fixtures/proxmox/compute',
27
+ service_class: Fog::Compute::Proxmox
28
+ )
29
+ @service = @proxmox_vcr.service
30
+ @pve_url = @proxmox_vcr.url
31
+ @username = @proxmox_vcr.username
32
+ @password = @proxmox_vcr.password
33
+ @ticket = @proxmox_vcr.ticket
34
+ @csrftoken = @proxmox_vcr.csrftoken
35
+ end
36
+
37
+ it 'Manage tasks' do
38
+ VCR.use_cassette('tasks') do
39
+ # List all tasks
40
+ options = { limit: 1 }
41
+ node_name = 'pve'
42
+ node = @service.nodes.find_by_id node_name
43
+ tasks = node.tasks.search(options)
44
+ tasks.wont_be_nil
45
+ tasks.wont_be_empty
46
+ # Get task
47
+ upid = tasks[0].upid
48
+ task = node.tasks.find_by_id(upid)
49
+ task.wont_be_nil
50
+ # Stop task
51
+ task.stop
52
+ task.exitstatus.must_equal 'OK'
53
+ end
54
+ end
55
+
56
+ it 'Manage storages' do
57
+ VCR.use_cassette('storages') do
58
+ # Get node
59
+ node_name = 'pve'
60
+ node = @service.nodes.find_by_id node_name
61
+ # List all storages
62
+ storages = node.storages.all
63
+ storages.wont_be_nil
64
+ storages.wont_be_empty
65
+ # List by content type
66
+ storages = node.storages.list_by_content_type 'iso'
67
+ storages.wont_be_nil
68
+ storages.wont_be_empty
69
+ # Get storage
70
+ storage = node.storages.find_by_id('local')
71
+ storage.wont_be_nil
72
+ end
73
+ end
74
+
75
+ it 'CRUD servers' do
76
+ VCR.use_cassette('servers') do
77
+ node_name = 'pve'
78
+ node = @service.nodes.find_by_id node_name
79
+ # Get next vmid
80
+ vmid = node.servers.next_id
81
+ server_hash = { vmid: vmid }
82
+ # Check valid vmid
83
+ valid = node.servers.id_valid? vmid
84
+ valid.must_equal true
85
+ # Check not valid vmid
86
+ valid = node.servers.id_valid? 99
87
+ valid.must_equal false
88
+ # Create 1st time
89
+ node.servers.create(server_hash)
90
+ # Check already used vmid
91
+ valid = node.servers.id_valid? vmid
92
+ valid.must_equal false
93
+ # Clone server
94
+ newid = node.servers.next_id
95
+ # Get server
96
+ server = node.servers.get vmid
97
+ server.wont_be_nil
98
+ # Backup it
99
+ server.backup(compress: 'lzo')
100
+ # Get this backup image
101
+ # Find available backup volumes
102
+ volume = server.backups.first
103
+ volume.wont_be_nil
104
+ # Restore it
105
+ server.restore(volume, storage: 'local')
106
+ # Delete it
107
+ volume.destroy
108
+ # Add hdd
109
+ # Find available storages with images
110
+ storages = node.storages.list_by_content_type 'images'
111
+ storage = storages[0]
112
+ virtio0 = { id: 'virtio0', storage: storage.storage, size: '1' }
113
+ ide0 = { id: 'ide0', storage: storage.storage, size: '1' }
114
+ options = { backup: 0, replicate: 0 }
115
+ server.attach(virtio0, options)
116
+ server.attach(ide0, options)
117
+ server.detach('ide0')
118
+ server.detach('unused0')
119
+ sleep 1
120
+ # Clone it (linked fails)
121
+ server.clone(newid, full: 1)
122
+ # Get clone
123
+ clone = node.servers.get newid
124
+ # Template this clone (read-only)
125
+ clone.template
126
+ # Get clone disk image
127
+ image = clone.images.first
128
+ image.wont_be_nil
129
+ # Delete clone
130
+ clone.destroy
131
+ proc do
132
+ node.servers.get newid
133
+ end.must_raise Excon::Errors::InternalServerError
134
+ # Create 2nd time must fails
135
+ proc do
136
+ node.servers.create server_hash
137
+ end.must_raise Excon::Errors::InternalServerError
138
+ # Update config server
139
+ # Add empty cdrom
140
+ config_hash = { ide2: 'none,media=cdrom' }
141
+ server.update(config_hash)
142
+ # Resize disk server
143
+ server.extend('virtio0', '+1G')
144
+ # Move disk server
145
+ server.move('virtio0', 'local')
146
+ # Add network interface
147
+ config_hash = { net0: 'virtio,bridge=vmbr0' }
148
+ server.update(config_hash)
149
+ # Add start at boot, keyboard fr,
150
+ # linux 4.x os type, kvm hardware disabled (proxmox guest in virtualbox) and vga enabled to console
151
+ config_hash = { onboot: 1, keyboard: 'fr', ostype: 'l26', kvm: 0 }
152
+ server.update(config_hash)
153
+ # server config
154
+ disks = server.config.disks
155
+ nics = server.config.interfaces
156
+ nics.wont_be_nil
157
+ nics.wont_be_empty
158
+ nics.get('net0').wont_be_nil
159
+ disks.wont_be_nil
160
+ disks.wont_be_empty
161
+ virtio0 = disks.get('virtio0')
162
+ virtio0.wont_be_nil
163
+ ide2 = disks.get('ide2')
164
+ ide2.wont_be_nil
165
+ # Get a mac adress
166
+ mac_address = server.config.mac_addresses.first
167
+ mac_address.wont_be_nil
168
+ # all servers
169
+ servers_all = node.servers.all
170
+ servers_all.wont_be_nil
171
+ servers_all.wont_be_empty
172
+ servers_all.must_include server
173
+ # server not running exception
174
+ proc do
175
+ vnc = server.start_console(websocket: 1)
176
+ end.must_raise Fog::Proxmox::Errors::ServiceError
177
+ # Start server
178
+ server.action('start')
179
+ server.wait_for { ready? }
180
+ status = server.ready?
181
+ status.must_equal true
182
+ # server vga not set exception
183
+ proc do
184
+ vnc = server.start_console(websocket: 1)
185
+ end.must_raise Fog::Proxmox::Errors::ServiceError
186
+ # Stop server
187
+ server.action('stop')
188
+ server.wait_for { server.status == 'stopped' }
189
+ status = server.status
190
+ status.must_equal 'stopped'
191
+ server.update(vga: 'std')
192
+ # Start server
193
+ server.action('start')
194
+ server.wait_for { ready? }
195
+ status = server.ready?
196
+ status.must_equal true
197
+ vnc = server.start_console(websocket: 1)
198
+ vnc['cert'].wont_be_nil
199
+ port = server.connect_vnc(vnc)
200
+ port.wont_be_nil
201
+ # Stop server
202
+ server.action('stop')
203
+ server.wait_for { server.status == 'stopped' }
204
+ status = server.status
205
+ status.must_equal 'stopped'
206
+ server.update(serial0: 'socket', vga: 'serial0')
207
+ # Start server
208
+ server.action('start')
209
+ server.wait_for { ready? }
210
+ status = server.ready?
211
+ status.must_equal true
212
+ term = server.start_console
213
+ term['ticket'].wont_be_nil
214
+ # Stop server
215
+ server.action('stop')
216
+ server.wait_for { server.status == 'stopped' }
217
+ status = server.status
218
+ status.must_equal 'stopped'
219
+ server.update(vga: 'qxl')
220
+ # Start server
221
+ server.action('start')
222
+ server.wait_for { ready? }
223
+ status = server.ready?
224
+ status.must_equal true
225
+ spice = server.start_console
226
+ spice['password'].wont_be_nil
227
+ # Suspend server
228
+ server.action('suspend')
229
+ server.wait_for { server.qmpstatus == 'paused' }
230
+ qmpstatus = server.qmpstatus
231
+ qmpstatus.must_equal 'paused'
232
+ # Resume server
233
+ server.action('resume')
234
+ server.wait_for { ready? }
235
+ status = server.ready?
236
+ status.must_equal true
237
+ # Stop server
238
+ server.action('stop')
239
+ server.wait_for { server.status == 'stopped' }
240
+ status = server.status
241
+ status.must_equal 'stopped'
242
+ proc do
243
+ server.action('hello')
244
+ end.must_raise Fog::Errors::Error
245
+ # Delete
246
+ server.destroy
247
+ proc do
248
+ node.servers.get vmid
249
+ end.must_raise Excon::Errors::InternalServerError
250
+ end
251
+ end
252
+
253
+ it 'CRUD snapshots' do
254
+ VCR.use_cassette('snapshots') do
255
+ node_name = 'pve'
256
+ node = @service.nodes.find_by_id node_name
257
+ vmid = node.servers.next_id
258
+ server_hash = { vmid: vmid }
259
+ node.servers.create server_hash
260
+ # Create
261
+ snapname = 'snapshot1'
262
+ server = node.servers.get vmid
263
+ snapshot_hash = { snapname: snapname }
264
+ server.snapshots.create(snapshot_hash)
265
+ # Find by id
266
+ snapshot = server.snapshots.get snapname
267
+ snapshot.wont_be_nil
268
+ # Update
269
+ snapshot.description = 'Snapshot 1'
270
+ snapshot.update
271
+ # all snapshots
272
+ snapshots_all = server.snapshots.all
273
+ snapshots_all.wont_be_nil
274
+ snapshots_all.wont_be_empty
275
+ snapshots_all.must_include snapshot
276
+ # Delete
277
+ snapshot.destroy
278
+ server.destroy
279
+ end
280
+ end
281
+
282
+ it 'CRUD containers' do
283
+ VCR.use_cassette('containers') do
284
+ node_name = 'pve'
285
+ node = @service.nodes.find_by_id node_name
286
+ # Get next vmid
287
+ vmid = node.containers.next_id
288
+ ostemplate = 'local:vztmpl/alpine-3.7-default_20171211_amd64.tar.xz'
289
+ container_hash = { vmid: vmid,
290
+ storage: 'local-lvm',
291
+ ostemplate: ostemplate, password: 'proxmox01', rootfs: 'local-lvm:1' }
292
+ # Check valid vmid
293
+ valid = node.containers.id_valid? vmid
294
+ valid.must_equal true
295
+ # Check not valid vmid
296
+ valid = node.containers.id_valid? 99
297
+ valid.must_equal false
298
+ # Create 1st time
299
+ node.containers.create(container_hash)
300
+ # Check already used vmid
301
+ valid = node.containers.id_valid? vmid
302
+ valid.must_equal false
303
+ # Clone container
304
+ newid = node.containers.next_id
305
+ # Get container
306
+ container = node.containers.get vmid
307
+ container.wont_be_nil
308
+ # Backup it
309
+ container.backup(compress: 'lzo')
310
+ # Get this backup image
311
+ # Find available backup volumes
312
+ backup = container.backups.first
313
+ container.wont_be_nil
314
+ # Restore it
315
+ container.restore(backup, storage: 'local-lvm')
316
+ # Delete it
317
+ backup.destroy
318
+ # Add mount points
319
+ # Find available storages with images
320
+ storages = node.storages.list_by_content_type 'images'
321
+ storage = storages[0]
322
+ mp0 = { id: 'mp0', storage: storage.storage, size: '1' }
323
+ options = { mp: '/opt/app', backup: 0, replicate: 0, quota: 1 }
324
+ container.attach(mp0, options)
325
+ # Fetch mount points
326
+ mount_points = container.config.mount_points
327
+ mount_points.wont_be_empty
328
+ mount_points.get('mp0').wont_be_nil
329
+ # Remove mount points
330
+ container.detach('mp0')
331
+ container.detach('unused0')
332
+ sleep 1
333
+ # Clone it
334
+ container.clone(newid)
335
+ # Get clone
336
+ clone = node.containers.get newid
337
+ # Template this clone (read-only)
338
+ clone.template
339
+ # Get clone disk image
340
+ image = clone.images.first
341
+ image.wont_be_nil
342
+ # Delete clone
343
+ clone.destroy
344
+ proc do
345
+ node.containers.get newid
346
+ end.must_raise Excon::Errors::InternalServerError
347
+ # Create 2nd time must fails
348
+ proc do
349
+ node.containers.create container_hash
350
+ end.must_raise Excon::Errors::InternalServerError
351
+ # Update config container
352
+ # Resize rootfs container
353
+ container.extend('rootfs', '+5M')
354
+ # Move rootfs container and delete original
355
+ container.move('rootfs', 'local-lvm', delete: 1)
356
+ # Add network interface
357
+ config_hash = { net0: 'bridge=vmbr0,name=eth0,ip=dhcp,ip6=dhcp' }
358
+ container.update(config_hash)
359
+ # Add start at boot, keyboard fr,
360
+ # linux os type alpine
361
+ config_hash = { onboot: 1, ostype: 'alpine' }
362
+ container.update(config_hash)
363
+ # get container config
364
+ config = container.config
365
+ config.wont_be_nil
366
+ # Get a mac address
367
+ mac_address = container.config.mac_addresses.first
368
+ mac_address.wont_be_nil
369
+ # Fetch nics
370
+ interfaces = container.config.interfaces
371
+ interfaces.wont_be_empty
372
+ interfaces.get('net0').wont_be_nil
373
+ # all containers
374
+ containers_all = node.containers.all
375
+ containers_all.wont_be_nil
376
+ containers_all.wont_be_empty
377
+ containers_all.must_include container
378
+ # Start container
379
+ container.action('start')
380
+ container.wait_for { ready? }
381
+ status = container.ready?
382
+ status.must_equal true
383
+ # Suspend container not implemented
384
+ proc do
385
+ container.action('suspend')
386
+ end.must_raise Fog::Errors::Error
387
+ # Resume container not implemented
388
+ proc do
389
+ container.action('resume')
390
+ end.must_raise Fog::Errors::Error
391
+ # Stop container
392
+ container.action('stop')
393
+ container.wait_for { container.status == 'stopped' }
394
+ status = container.status
395
+ status.must_equal 'stopped'
396
+ proc do
397
+ container.action('hello')
398
+ end.must_raise Fog::Errors::Error
399
+ # Delete
400
+ container.destroy
401
+ # Delete container does not delete images
402
+ storage.volumes.each(&:destroy)
403
+ proc do
404
+ node.containers.get vmid
405
+ end.must_raise Excon::Errors::InternalServerError
406
+ end
407
+ end
408
+ end