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,279 @@
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
+ # There are basically two modes of operation for these specs.
21
+ #
22
+ # 1. ENV[PVE_URL] exists: talk to an actual Proxmox server and record HTTP
23
+ # traffic in VCRs at "spec/debug" (credentials are read from the conventional
24
+ # environment variables: PVE_URL, PVE_USERNAME, PVE_PASSWORD)
25
+ # 2. otherwise (Travis, etc): use VCRs at "spec/fixtures/proxmox/#{service}"
26
+
27
+ require 'fog/proxmox'
28
+
29
+ pve_url = 'https://172.26.49.146:8006/api2/json'
30
+ pve_username = 'root@pam'
31
+ pve_password = 'proxmox01'
32
+
33
+ # Create service compute
34
+ compute = Fog::Compute::Proxmox.new(
35
+ pve_url: pve_url,
36
+ pve_username: pve_username,
37
+ pve_password: pve_password
38
+ )
39
+
40
+ # Create pools
41
+ pool_hash = { poolid: 'pool1' }
42
+ compute.domains.create(pool_hash)
43
+
44
+ # Get one pool by id
45
+ pool1 = compute.pools.find_by_id 'pool1'
46
+
47
+ # Update pool
48
+ pool1.comment 'pool 1'
49
+ pool1.update
50
+
51
+ # List all pools
52
+ compute.pools.all
53
+
54
+ # List pool by pool
55
+ compute.pools.each do |pool|
56
+ # pool ...
57
+ end
58
+
59
+ # Delete pool
60
+ pool1.destroy
61
+
62
+ # Create servers
63
+
64
+ # Get node owner
65
+ node_name = 'pve'
66
+ node = compute.nodes.find_by_id node_name
67
+
68
+ # Get next free vmid
69
+ vmid = node.servers.next_id
70
+ server_hash = { vmid: vmid }
71
+
72
+ # Create server
73
+ node.servers.create(server_hash)
74
+
75
+ # Check already used vmid
76
+ node.servers.id_valid? vmid
77
+
78
+ # Get server
79
+ server = node.servers.get vmid
80
+
81
+ # Update config server
82
+ # Add cdrom empty
83
+ config_hash = { ide2: 'none,media=cdrom' }
84
+ server.update(config_hash)
85
+ # Attach a hdd
86
+ virtio0 = { id: 'virtio0', storage: storage.storage, size: '1' }
87
+ ide0 = { id: 'ide0', storage: storage.storage, size: '1' }
88
+ options = { backup: 0, replicate: 0 }
89
+ server.attach(virtio0, options)
90
+ server.attach(ide0, options)
91
+ # Resize disk server
92
+ server.extend('virtio0', '+1G')
93
+ # Move disk server
94
+ server.move('virtio0', 'local')
95
+ # Detach a disk
96
+ server.detach 'ide0'
97
+ # Remove it
98
+ server.detach 'unused0'
99
+ # Detach another device
100
+ server.detach 'ide2'
101
+ # Add network interface
102
+ config_hash = { net0: 'virtio,bridge=vmbr0' }
103
+ server.update(config_hash)
104
+ # Add start at boot, keyboard fr, linux 3.x os type, kvm hardware disabled (proxmox guest in virtualbox)
105
+ config_hash = { onboot: 1, keyboard: 'fr', ostype: 'l26', kvm: 0 }
106
+ server.update(config_hash)
107
+ # Get configuration model
108
+ config = server.get_config
109
+ # Get nics config
110
+ nics = server.get_config.nics
111
+ nics[:net0]
112
+ # Get hdd controllers (ide, sata, scsi or virtio) config
113
+ # All return hashes with key equals to controller id
114
+ ides = server.get_config.ides
115
+ ides[:ide2]
116
+ satas = server.get_config.satas
117
+ scsis = server.get_config.scsis
118
+ virtios = server.get_config.virtios
119
+ virtios[:virtio0]
120
+ # Get mac_addresses
121
+ server.get_config.mac_adresses
122
+ # List all servers
123
+ servers_all = compute.servers.all
124
+
125
+ # Start server
126
+ server.action('start')
127
+ # Wait until task is complete
128
+ server.wait_for { ready? }
129
+ # Suspend server
130
+ server.action('suspend')
131
+ # Wait until task is complete
132
+ server.wait_for { server.qmpstatus == 'paused' }
133
+ # Resume server
134
+ server.action('resume')
135
+ # Wait until task is complete
136
+ server.wait_for { ready? }
137
+ # Stop server
138
+ server.action('stop')
139
+ # Wait until task is complete
140
+ server.wait_for { server.status == 'stopped' }
141
+
142
+ # Backup a server
143
+ server.backup(compress: 'lzo')
144
+
145
+ # Fetch a backup volume (first one)
146
+ volume = server.backups.first
147
+
148
+ # Restore it
149
+ server.restore volume
150
+
151
+ # Delete a backup
152
+ volume.destroy
153
+
154
+ # Snapshot a server
155
+ server.snapshots.create(name: 'snapshot1')
156
+
157
+ # Fetch it
158
+ snapshot = server.snapshots.get 'snapshot1'
159
+ # Fetch all
160
+ server.snapshots.all
161
+
162
+ # Update snapshot
163
+ snapshot.description 'Snapshot 1'
164
+ snapshot.update
165
+
166
+ # Delete snapshot
167
+ snapshot.destroy
168
+
169
+ # Fetch disk images
170
+ server.disk_images.all
171
+
172
+ # Delete server
173
+ server.destroy
174
+
175
+ # Create containers
176
+ node_name = 'pve'
177
+ node = compute.nodes.find_by_id node_name
178
+ ostemplate = 'local:vztmpl/alpine-3.7-default_20171211_amd64.tar.xz'
179
+ container_hash = {
180
+ vmid: vmid,
181
+ storage: 'local-lvm',
182
+ ostemplate: ostemplate,
183
+ password: 'proxmox01',
184
+ rootfs: 'local-lvm:1'
185
+ }
186
+
187
+ # Get next free vmid
188
+ vmid = node.containers.next_id
189
+
190
+ node.containers.create(container_hash)
191
+ # Check already used vmid
192
+ valid = node.containers.id_valid? vmid
193
+
194
+ # Get container
195
+ container = node.containers.get(vmid)
196
+
197
+ # Get container config
198
+ container.config
199
+ # Update config container
200
+ # Attach an aditional mount point
201
+ mp0 = { id: 'mp0', storage: 'local-lvm', size: '1' }
202
+ options = { mp: '/opt/app', backup: 0, replicate: 0, quota: 1 }
203
+ container.attach(mp0, options)
204
+ # Resize rootfs container
205
+ container.extend('rootfs', '+1G')
206
+ # Move rootfs container and delete original
207
+ container.move('rootfs', 'local-lvm', delete: 1)
208
+ # Detach a mount point
209
+ container.detach 'mp0'
210
+ # Remove it
211
+ container.detach 'unused0'
212
+ # Add network interface
213
+ config_hash = { net0: 'bridge=vmbr0,name=eth0,ip=dhcp,ip6=dhcp' }
214
+ container.update(config_hash)
215
+ # Add start at boot, linux os type alpine
216
+ config_hash = { onboot: 1, ostype: 'alpine' }
217
+ container.update(config_hash)
218
+ # Get mac_addresses
219
+ container.mac_adresses
220
+ # Get nics
221
+ container.config.nics
222
+ # Get additional mount points
223
+ container.config.mount_points
224
+ # List all servers
225
+ containers_all = node.containers.all
226
+
227
+ # Start container
228
+ container.action('start')
229
+ # Wait until task is complete
230
+ container.wait_for { ready? }
231
+ # Stop container
232
+ container.action('stop')
233
+ # Wait until task is complete
234
+ container.wait_for { container.status == 'stopped' }
235
+
236
+ # Backup a container
237
+ container.backup(compress: 'lzo')
238
+
239
+ # Fetch a backup volume (first one)
240
+ volume = container.backups.first
241
+
242
+ # Restore it
243
+ container.restore volume
244
+
245
+ # Delete a backup
246
+ volume.destroy
247
+
248
+ # Snapshot a container
249
+ container.snapshots.create(name: 'snapshot1')
250
+
251
+ # Fetch it
252
+ snapshot = container.snapshots.get 'snapshot1'
253
+ # Fetch all
254
+ container.snapshots.all
255
+
256
+ # Update snapshot
257
+ snapshot.description 'Snapshot 1'
258
+ snapshot.update
259
+
260
+ # Delete snapshot
261
+ snapshot.destroy
262
+
263
+ # Fetch additional mount points
264
+ container.mount_points
265
+ # Fetch network interfaces
266
+ container.nics
267
+
268
+ # Delete container
269
+ container.destroy
270
+
271
+ # List 1 task
272
+ options = { limit: 1 }
273
+ node = 'pve'
274
+ tasks = compute.tasks.search(node, options)
275
+ # Get task
276
+ upid = tasks[0].upid
277
+ task = compute.tasks.find_by_id(node, upid)
278
+ # Stop task
279
+ task.stop
@@ -0,0 +1,195 @@
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
+ # There are basically two modes of operation for these specs.
22
+ #
23
+ # 1. ENV[PVE_URL] exists: talk to an actual Proxmox server and record HTTP
24
+ # traffic in VCRs at "spec/debug" (credentials are read from the conventional
25
+ # environment variables: PVE_URL, PVE_USERNAME, PVE_PASSWORD)
26
+ # 2. otherwise (Travis, etc): use VCRs at "spec/fixtures/proxmox/#{service}"
27
+
28
+ require 'fog/proxmox'
29
+
30
+ pve_url = 'https://172.26.49.146:8006/api2/json'
31
+ pve_username = 'root@pam'
32
+ pve_password = 'proxmox01'
33
+
34
+ # Create service identity
35
+ identity = Fog::Identity::Proxmox.new(
36
+ pve_url: pve_url,
37
+ pve_username: pve_username,
38
+ pve_password: pve_password
39
+ )
40
+
41
+ # Get proxmox version
42
+ identity.read_version
43
+
44
+ # Create a new user
45
+ bob_hash = {
46
+ userid: 'bobsinclar@pve',
47
+ password: 'bobsinclar1',
48
+ firstname: 'Bob',
49
+ lastname: 'Sinclar',
50
+ email: 'bobsinclar@proxmox.com'
51
+ }
52
+ # is equivalent to
53
+ # bob_hash = {
54
+ # userid: 'bobsinclar',
55
+ # realm: 'pve',
56
+ # password: 'bobsinclar1',
57
+ # firstname: 'Bob',
58
+ # lastname: 'Sinclar',
59
+ # email: 'bobsinclar@proxmox.com'
60
+ # }
61
+ identity.users.create(bob_hash)
62
+
63
+ # Get a user by id
64
+ bob = identity.users.find_by_id 'bobsinclar@pve'
65
+
66
+ # List all users
67
+ identity.users.all
68
+
69
+ # List user by user
70
+ identity.users.each do |user|
71
+ # user ...
72
+ end
73
+
74
+ # Update user
75
+ bob.comment = 'novelist'
76
+ # add groups
77
+ bob.groups = %w[group1]
78
+ bob.update
79
+
80
+ # Delete user
81
+ bob.destroy
82
+
83
+ # Create groups
84
+ group_hash = { groupid: 'group1' }
85
+ identity.domains.create(group_hash)
86
+
87
+ # Get one group by id
88
+ group1 = identity.groups.find_by_id 'group1'
89
+
90
+ # Update group
91
+ group1.comment 'Group 1'
92
+ group1.update
93
+
94
+ # List all groups
95
+ identity.groups.all
96
+
97
+ # List group by group
98
+ identity.groups.each do |group|
99
+ # group ...
100
+ end
101
+
102
+ # Delete group
103
+ group1.destroy
104
+
105
+ # Create roles
106
+ role_hash = { roleid: 'role1' }
107
+ identity.roles.create(role_hash)
108
+
109
+ # Get one role by id
110
+ role1 = identity.roles.find_by_id 'role1'
111
+
112
+ # Update role
113
+ role1.comment 'Role 1'
114
+ role1.update
115
+
116
+ # List all roles
117
+ identity.roles.all
118
+
119
+ # List role by role
120
+ identity.roles.each do |role|
121
+ # role ...
122
+ end
123
+
124
+ # Delete role
125
+ role1.destroy
126
+
127
+ # Create a new domain (authentication server)
128
+ # Three types: PAM, PVE, LDAP and ActiveDirectory
129
+ # PAM and PVE already exist by default
130
+ # LDAP sample:
131
+ ldap_hash = {
132
+ realm: 'LDAP',
133
+ type: 'ldap',
134
+ base_dn: 'ou=People,dc=ldap-test,dc=com',
135
+ user_attr: 'LDAP',
136
+ server1: 'localhost',
137
+ port: 389,
138
+ default: 0,
139
+ secure: 0
140
+ }
141
+ # ActiveDirectory sample:
142
+ # ad_hash = {
143
+ # realm: 'ActiveDirectory',
144
+ # type: 'ad',
145
+ # domain: 'proxmox.com',
146
+ # server1: 'localhost',
147
+ # port: 389,
148
+ # default: 0,
149
+ # secure: 0
150
+ # }
151
+
152
+ identity.domains.create(ldap_hash)
153
+
154
+ # List domains
155
+ identity.domains.each do |domain|
156
+ # domain ...
157
+ end
158
+
159
+ # Find domain by id
160
+ ldap = identity.domains.find_by_id ldap_hash[:realm]
161
+
162
+ # Update domain
163
+ ldap.type.comment = 'Test domain LDAP'
164
+ # Two types of Two Factors Authentication (TFA): oath and yubico
165
+ ldap.type.tfa = 'type=oath,step=30,digits=8'
166
+ # ad.type.tfa = 'type=yubico,id=1,key=2,url=http://localhost'
167
+ ldap.update
168
+
169
+ # Delete domain
170
+ ldap.destroy
171
+
172
+ # Add a user permission
173
+ permission_hash = {
174
+ path: '/access/users',
175
+ roles: 'PVEUserAdmin',
176
+ users: bob_hash[:userid]
177
+ }
178
+ # Add a group permission
179
+ # permission_hash = {
180
+ # path: '/access/users',
181
+ # roles: 'PVEUserAdmin',
182
+ # groups: 'group1'
183
+ # }
184
+ identity.add_permission(permission_hash)
185
+
186
+ # List all permissions
187
+ identity.permissions.all
188
+
189
+ # List permission by permission
190
+ identity.permissions.each do |permission|
191
+ # permission ...
192
+ end
193
+
194
+ # Remove permission
195
+ identity.remove_permission(permission_hash)