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
@@ -0,0 +1,77 @@
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 'fog/proxmox/helpers/controller_helper'
22
+
23
+ describe Fog::Proxmox::ControllerHelper do
24
+
25
+ let(:net) do
26
+ { net0: 'virtio=66:89:C5:59:AA:96,bridge=vmbr0,firewall=1,link_down=1,queues=1,rate=1,tag=1' }
27
+ end
28
+ let(:net_no_options) do
29
+ { net0: 'virtio=66:89:C5:59:AA:96' }
30
+ end
31
+ let(:scsi) do
32
+ { scsi10: 'local-lvm:1,cache=none' }
33
+ end
34
+
35
+ describe '#extract' do
36
+ it "returns bridge" do
37
+ bridge = Fog::Proxmox::ControllerHelper.extract('bridge',net[:net0])
38
+ assert_equal 'vmbr0', bridge
39
+ end
40
+ it "returns nil" do
41
+ bridge = Fog::Proxmox::ControllerHelper.extract('bridge',net_no_options[:net0])
42
+ assert !bridge
43
+ end
44
+ it "returns firewall" do
45
+ firewall = Fog::Proxmox::ControllerHelper.extract('firewall',net[:net0])
46
+ assert_equal '1', firewall
47
+ end
48
+ it "returns cache" do
49
+ cache = Fog::Proxmox::ControllerHelper.extract('cache',scsi[:scsi10])
50
+ assert_equal 'none', cache
51
+ end
52
+ end
53
+
54
+ describe '#last_index' do
55
+ it "returns -1" do
56
+ last = Fog::Proxmox::ControllerHelper.last_index('net',{})
57
+ assert last == -1
58
+ end
59
+ it "returns 0" do
60
+ last = Fog::Proxmox::ControllerHelper.last_index('net',net)
61
+ assert last == 0
62
+ end
63
+ it "returns 10" do
64
+ last = Fog::Proxmox::ControllerHelper.last_index('scsi',scsi)
65
+ assert last == 10
66
+ end
67
+ end
68
+
69
+ describe '#valid?' do
70
+ it "returns true" do
71
+ assert Fog::Proxmox::ControllerHelper.valid?('net','net0')
72
+ end
73
+ it "returns false" do
74
+ assert !Fog::Proxmox::ControllerHelper.valid?('net','sdfdsf')
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,91 @@
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 'fog/proxmox/helpers/cpu_helper'
22
+
23
+ describe Fog::Proxmox::CpuHelper do
24
+
25
+ let(:cpu) do
26
+ 'cputype=kvm64,flags=+spec-ctrl,+pcid'
27
+ end
28
+ let(:cpu_nocputype) do
29
+ 'kvm64,flags=+spec-ctrl,+pcid'
30
+ end
31
+ let(:cpu_nospectre) do
32
+ 'cputype=kvm64,flags=+pcid'
33
+ end
34
+ let(:cpu_nopcid) do
35
+ 'cputype=kvm64,flags=+spec-ctrl'
36
+ end
37
+
38
+ describe '#extract' do
39
+ it "returns array" do
40
+ result = Fog::Proxmox::CpuHelper.extract(cpu)
41
+ assert_equal(5, result.length)
42
+ assert_equal('cputype=', result[0])
43
+ assert_equal('kvm64', result[1])
44
+ assert_equal(',flags=', result[2])
45
+ assert_equal('+spec-ctrl', result[3])
46
+ assert_equal('+pcid', result[4])
47
+ end
48
+ it "returns array" do
49
+ result = Fog::Proxmox::CpuHelper.extract(cpu_nocputype)
50
+ assert_equal(5, result.length)
51
+ assert !result[0]
52
+ assert_equal('kvm64', result[1])
53
+ assert_equal(',flags=', result[2])
54
+ assert_equal('+spec-ctrl', result[3])
55
+ assert_equal('+pcid', result[4])
56
+ end
57
+ end
58
+
59
+ describe '#extract_type' do
60
+ it "returns string" do
61
+ result = Fog::Proxmox::CpuHelper.extract_type(cpu)
62
+ assert_equal('kvm64', result)
63
+ end
64
+ it "returns string" do
65
+ result = Fog::Proxmox::CpuHelper.extract_type(cpu_nocputype)
66
+ assert_equal('kvm64', result)
67
+ end
68
+ end
69
+
70
+ describe '#extract_spectre' do
71
+ it "returns true" do
72
+ result = Fog::Proxmox::CpuHelper.extract_spectre(cpu)
73
+ assert result
74
+ end
75
+ it "returns false" do
76
+ result = Fog::Proxmox::CpuHelper.extract_spectre(cpu_nospectre)
77
+ assert !result
78
+ end
79
+ end
80
+
81
+ describe '#extract_pcid' do
82
+ it "returns true" do
83
+ result = Fog::Proxmox::CpuHelper.extract_pcid(cpu)
84
+ assert result
85
+ end
86
+ it "returns false" do
87
+ result = Fog::Proxmox::CpuHelper.extract_pcid(cpu_nopcid)
88
+ assert !result
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,104 @@
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 'fog/proxmox/helpers/disk_helper'
22
+
23
+ describe Fog::Proxmox::DiskHelper do
24
+
25
+ let(:scsi0) do
26
+ { id: 'scsi0', storage: 'local-lvm', size: 1, options: { cache: 'none' }}
27
+ end
28
+
29
+ let(:scsi0_image) do
30
+ { id: 'scsi0', volid: 'local-lvm:vm-100-disk-1', storage: 'local-lvm', size: 1, options: { cache: 'none' }}
31
+ end
32
+
33
+ let(:scsi) do
34
+ { scsi0: 'local-lvm:vm-100-disk-1,size=8G,cache=none'}
35
+ end
36
+
37
+ let(:cdrom_none) do
38
+ { ide2: 'none,media=cdrom'}
39
+ end
40
+
41
+ let(:cdrom_iso) do
42
+ { ide2: 'local:iso/alpine-virt-3.7.0-x86_64.iso,media=cdrom'}
43
+ end
44
+
45
+ describe '#flatten' do
46
+ it "returns creation string" do
47
+ disk = Fog::Proxmox::DiskHelper.flatten(scsi0)
48
+ assert_equal({ scsi0: 'local-lvm:1,cache=none' }, disk)
49
+ end
50
+ it "returns image string" do
51
+ disk = Fog::Proxmox::DiskHelper.flatten(scsi0_image)
52
+ assert_equal({ scsi0: 'local-lvm:vm-100-disk-1,size=1,cache=none' }, disk)
53
+ end
54
+ end
55
+
56
+ describe '#extract_controller' do
57
+ it "returns controller" do
58
+ controller = Fog::Proxmox::DiskHelper.extract_controller(scsi0[:id])
59
+ assert_equal('scsi', controller)
60
+ end
61
+ end
62
+
63
+ describe '#extract_device' do
64
+ it "returns device" do
65
+ device = Fog::Proxmox::DiskHelper.extract_device(scsi0[:id])
66
+ assert_equal(0, device)
67
+ end
68
+ end
69
+
70
+ describe '#extract_storage_volid_size' do
71
+ it "returns scsi get storage and volid" do
72
+ storage, volid, size = Fog::Proxmox::DiskHelper.extract_storage_volid_size(scsi[:scsi0])
73
+ assert_equal('local-lvm', storage)
74
+ assert_equal('local-lvm:vm-100-disk-1', volid)
75
+ assert_equal(8, size)
76
+ end
77
+ it "returns scsi0 creation storage and volid" do
78
+ disk = Fog::Proxmox::DiskHelper.flatten(scsi0)
79
+ storage, volid, size = Fog::Proxmox::DiskHelper.extract_storage_volid_size(disk[:scsi0])
80
+ assert_equal('local-lvm', storage)
81
+ assert_nil volid
82
+ assert_equal(1, size)
83
+ end
84
+ it "returns cdrom storage and volid none" do
85
+ storage, volid, size = Fog::Proxmox::DiskHelper.extract_storage_volid_size(cdrom_none[:ide2])
86
+ assert_nil storage
87
+ assert_equal('none', volid)
88
+ assert_nil size
89
+ end
90
+ it "returns cdrom storage and volid iso" do
91
+ storage, volid, size = Fog::Proxmox::DiskHelper.extract_storage_volid_size(cdrom_iso[:ide2])
92
+ assert_equal('local', storage)
93
+ assert_equal('local:iso/alpine-virt-3.7.0-x86_64.iso', volid)
94
+ assert_nil size
95
+ end
96
+ end
97
+
98
+ describe '#extract_size' do
99
+ it "returns size" do
100
+ size = Fog::Proxmox::DiskHelper.extract_size(scsi[:scsi0])
101
+ assert_equal(8, size)
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,73 @@
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 'fog/proxmox/helpers/nic_helper'
22
+
23
+ describe Fog::Proxmox::NicHelper do
24
+
25
+ let(:net_vm) do
26
+ { net0: 'virtio=66:89:C5:59:AA:96,bridge=vmbr0,firewall=1,link_down=1,queues=1,rate=1,tag=1' }
27
+ end
28
+
29
+ let(:net_vm_create) do
30
+ { net0: 'model=virtio,bridge=vmbr0,firewall=1,link_down=1,queues=1,rate=1,tag=1' }
31
+ end
32
+
33
+ let(:net_lxc) do
34
+ { net0: 'eth0=66:89:C5:59:AA:96,bridge=vmbr0,firewall=1,link_down=1,queues=1,rate=1,tag=1' }
35
+ end
36
+
37
+ let(:net_lxc_create) do
38
+ { net0: 'name=eth0,bridge=vmbr0,firewall=1,link_down=1,queues=1,rate=1,tag=1' }
39
+ end
40
+
41
+ describe '#extract_model' do
42
+ it "returns model card" do
43
+ model = Fog::Proxmox::NicHelper.extract_model(net_vm[:net0])
44
+ assert_equal 'virtio', model
45
+ end
46
+ it "returns model card creation" do
47
+ model = Fog::Proxmox::NicHelper.extract_model(net_vm_create[:net0])
48
+ assert_equal 'virtio', model
49
+ end
50
+ end
51
+
52
+ describe '#extract_name' do
53
+ it "returns lxc name" do
54
+ model = Fog::Proxmox::NicHelper.extract_name(net_lxc[:net0])
55
+ assert_equal 'eth0', model
56
+ end
57
+ it "returns lxc name creation" do
58
+ model = Fog::Proxmox::NicHelper.extract_name(net_lxc_create[:net0])
59
+ assert_equal 'eth0', model
60
+ end
61
+ end
62
+
63
+ describe '#extract_mac_address' do
64
+ it "returns vm mac address" do
65
+ mac_address = Fog::Proxmox::NicHelper.extract_mac_address(net_vm[:net0])
66
+ assert_equal '66:89:C5:59:AA:96', mac_address
67
+ end
68
+ it "returns lxc mac address" do
69
+ mac_address = Fog::Proxmox::NicHelper.extract_mac_address(net_lxc[:net0])
70
+ assert_equal '66:89:C5:59:AA:96', mac_address
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,316 @@
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::Identity::Proxmox do
24
+ before :all do
25
+ @proxmox_vcr = ProxmoxVCR.new(
26
+ vcr_directory: 'spec/fixtures/proxmox/identity',
27
+ service_class: Fog::Identity::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 'authenticates with username and password' do
38
+ VCR.use_cassette('auth') do
39
+ identity = Fog::Identity::Proxmox.new(
40
+ pve_username: @username,
41
+ pve_password: @password,
42
+ pve_url: @pve_url.to_s
43
+ )
44
+ identity.wont_be_nil
45
+ end
46
+ end
47
+
48
+ it 'verifies ticket with path and privs' do
49
+ VCR.use_cassette('auth') do
50
+ principal = { username: @username, password: @password, privs: ['User.Modify'], path: 'access', otp: 'proxmox01' }
51
+ permissions = @service.check_permissions(principal)
52
+ permissions.wont_be_nil
53
+ permissions.wont_be_empty
54
+ permissions['username'].must_equal @username
55
+ permissions['cap'].wont_be_empty
56
+ end
57
+ end
58
+
59
+ it 'reads server version' do
60
+ VCR.use_cassette('read_version') do
61
+ version = @service.read_version
62
+ version.wont_be_nil
63
+ version.include? 'version'
64
+ end
65
+ end
66
+
67
+ it 'CRUD users' do
68
+ VCR.use_cassette('users') do
69
+ bob_hash = {
70
+ userid: 'bobsinclar@pve',
71
+ password: 'bobsinclar1',
72
+ firstname: 'Bob',
73
+ lastname: 'Sinclar',
74
+ email: 'bobsinclar@proxmox.com'
75
+ }
76
+ # Create 1st time
77
+ @service.users.create(bob_hash)
78
+ # Find by id
79
+ bob = @service.users.find_by_id bob_hash[:userid]
80
+ bob.wont_be_nil
81
+ # Create 2nd time must fails
82
+ proc do
83
+ @service.users.create(bob_hash)
84
+ end.must_raise Excon::Errors::InternalServerError
85
+ # all users
86
+ users_all = @service.users.all
87
+ users_all.wont_be_nil
88
+ users_all.wont_be_empty
89
+ users_all.must_include bob
90
+ # Update
91
+ bob.comment = 'novelist'
92
+ bob.enable = 0
93
+ @service.groups.create(groupid: 'group1')
94
+ @service.groups.create(groupid: 'group2')
95
+ bob.groups = %w[group1 group2]
96
+ bob.update
97
+ # change bob's password
98
+ bob.password = 'bobsinclar2'
99
+ bob.change_password
100
+ # disabled users
101
+ users_disabled = @service.users.all('enabled' => 0)
102
+ users_disabled.wont_be_nil
103
+ users_disabled.wont_be_empty
104
+ users_disabled.must_include bob
105
+ # Delete
106
+ bob.destroy
107
+ group1 = @service.groups.find_by_id 'group1'
108
+ group1.destroy
109
+ group2 = @service.groups.find_by_id 'group2'
110
+ group2.destroy
111
+ proc do
112
+ @service.users.find_by_id bob_hash[:userid]
113
+ end.must_raise Excon::Errors::InternalServerError
114
+ end
115
+ end
116
+
117
+ it 'CRUD groups' do
118
+ VCR.use_cassette('groups') do
119
+ group_hash = { groupid: 'group1' }
120
+ # Create 1st time
121
+ @service.groups.create(group_hash)
122
+ # Find by id
123
+ group = @service.groups.find_by_id group_hash[:groupid]
124
+ group.wont_be_nil
125
+ # Create 2nd time must fails
126
+ proc do
127
+ @service.groups.create(group_hash)
128
+ end.must_raise Excon::Errors::InternalServerError
129
+ # Update
130
+ group.comment = 'Group 1'
131
+ group.update
132
+ # all groups
133
+ groups_all = @service.groups.all
134
+ groups_all.wont_be_nil
135
+ groups_all.wont_be_empty
136
+ groups_all.must_include group
137
+ # Delete
138
+ group.destroy
139
+ proc do
140
+ @service.groups.find_by_id group_hash[:groupid]
141
+ end.must_raise Excon::Errors::InternalServerError
142
+ end
143
+ end
144
+
145
+ it 'CRUD roles' do
146
+ VCR.use_cassette('roles') do
147
+ role_hash = { roleid: 'PVETestAuditor' }
148
+ # Create 1st time
149
+ @service.roles.create(role_hash)
150
+ # Find by id
151
+ role = @service.roles.find_by_id role_hash[:roleid]
152
+ role.wont_be_nil
153
+ # Create 2nd time must fails
154
+ proc do
155
+ @service.roles.create(role_hash)
156
+ end.must_raise Excon::Errors::InternalServerError
157
+ # # Update
158
+ role.privs = 'Datastore.Audit Sys.Audit VM.Audit'
159
+ role.update
160
+ # # all groups
161
+ roles_all = @service.roles.all
162
+ roles_all.wont_be_nil
163
+ roles_all.wont_be_empty
164
+ roles_all.must_include role
165
+ # Delete
166
+ role.destroy
167
+ proc do
168
+ @service.roles.find_by_id role_hash[:roleid]
169
+ end.must_raise Excon::Errors::InternalServerError
170
+ end
171
+ end
172
+
173
+ it 'CRUD domains' do
174
+ VCR.use_cassette('domains') do
175
+ ldap_hash = {
176
+ realm: 'LDAP',
177
+ type: 'ldap',
178
+ base_dn: 'ou=People,dc=ldap-test,dc=com',
179
+ user_attr: 'LDAP',
180
+ server1: 'localhost',
181
+ port: 389,
182
+ default: 0,
183
+ secure: 0
184
+ }
185
+ ad_hash = {
186
+ realm: 'ActiveDirectory',
187
+ type: 'ad',
188
+ domain: 'proxmox.com',
189
+ server1: 'localhost',
190
+ port: 389,
191
+ default: 0,
192
+ secure: 0
193
+ }
194
+ # Create 1st time
195
+ @service.domains.create(ldap_hash)
196
+ # Find by id
197
+ ldap = @service.domains.find_by_id ldap_hash[:realm]
198
+ ldap.wont_be_nil
199
+ # Create 1st time
200
+ @service.domains.create(ad_hash)
201
+ # Create 2nd time must fails
202
+ proc do
203
+ @service.domains.create(ldap_hash)
204
+ end.must_raise Excon::Errors::InternalServerError
205
+ # # Create 2nd time must fails
206
+ proc do
207
+ @service.domains.create(ad_hash)
208
+ end.must_raise Excon::Errors::InternalServerError
209
+ # Update
210
+ ldap.type.comment = 'Test domain LDAP'
211
+ ldap.type.tfa = 'type=oath,step=30,digits=8'
212
+ ldap.update
213
+ # Find by id
214
+ ad = @service.domains.find_by_id ad_hash[:realm]
215
+ ad.wont_be_nil
216
+ ad.type.tfa = 'type=yubico,id=1,key=2,url=http://localhost'
217
+ ad.update
218
+ # # all groups
219
+ domains_all = @service.domains.all
220
+ domains_all.wont_be_nil
221
+ domains_all.wont_be_empty
222
+ domains_all.must_include ldap
223
+ domains_all.must_include ad
224
+ # Delete
225
+ ldap.destroy
226
+ ad.destroy
227
+ proc do
228
+ @service.domains.find_by_id ldap_hash[:realm]
229
+ end.must_raise Excon::Errors::InternalServerError
230
+ proc do
231
+ @service.domains.find_by_id ad_hash[:realm]
232
+ end.must_raise Excon::Errors::InternalServerError
233
+ end
234
+ end
235
+
236
+ it 'adds or removes permissions' do
237
+ VCR.use_cassette('permissions') do
238
+ # Add ACL to users
239
+ bob_hash = {
240
+ userid: 'bobsinclar@pve',
241
+ password: 'bobsinclar1',
242
+ firstname: 'Bob',
243
+ lastname: 'Sinclar',
244
+ email: 'bobsinclar@proxmox.com'
245
+ }
246
+ @service.users.create(bob_hash)
247
+ permission_hash = {
248
+ path: '/access/users',
249
+ roles: 'PVEUserAdmin',
250
+ users: bob_hash[:userid]
251
+ }
252
+ @service.add_permission(permission_hash)
253
+ # Read all permissions
254
+ permissions = @service.permissions.all
255
+ permissions.wont_be_empty
256
+ permission = @service.permissions.create(permission_hash)
257
+ permissions.must_include permission
258
+ # Remove ACL to users
259
+ @service.permissions.remove(permission_hash)
260
+ permissions = @service.permissions.all
261
+ permissions.must_be_empty
262
+ bob = @service.users.find_by_id bob_hash[:userid]
263
+ bob.destroy
264
+ # Add ACL to groups
265
+ @service.groups.create(groupid: 'group1', comment: 'Group 1')
266
+ permission_hash.delete(:users)
267
+ permission_hash.store(:groups, 'group1')
268
+ @service.permissions.add(permission_hash)
269
+ # Read all permissions
270
+ permissions = @service.permissions.all
271
+ permissions.wont_be_empty
272
+ permission = @service.permissions.create(permission_hash)
273
+ permissions.must_include permission
274
+ # Remove ACL to groups
275
+ @service.permissions.remove(permission_hash)
276
+ permissions = @service.permissions.all
277
+ permissions.must_be_empty
278
+ group1 = @service.groups.find_by_id 'group1'
279
+ group1.destroy
280
+ end
281
+ end
282
+
283
+ it 'CRUD pools' do
284
+ VCR.use_cassette('pools') do
285
+ pool_hash = { poolid: 'pool1' }
286
+ # Create 1st time
287
+ @service.pools.create(pool_hash)
288
+ # Find by id
289
+ pool = @service.pools.find_by_id pool_hash[:poolid]
290
+ pool.wont_be_nil
291
+ # Create 2nd time must fails
292
+ proc do
293
+ @service.pools.create(pool_hash)
294
+ end.must_raise Excon::Errors::InternalServerError
295
+ # Update
296
+ # Add comment
297
+ pool.comment = 'Pool 1'
298
+ pool.update
299
+ # Add storage as member
300
+ pool.add_server 100 # do nothing if server does not exist
301
+ pool.add_storage 'local-lvm'
302
+ # all pools
303
+ pools_all = @service.pools.all
304
+ pools_all.wont_be_nil
305
+ pools_all.wont_be_empty
306
+ pools_all.must_include pool
307
+ # Delete
308
+ pool.remove_server 100
309
+ pool.remove_storage 'local-lvm'
310
+ pool.destroy
311
+ proc do
312
+ @service.pools.find_by_id pool_hash[:poolid]
313
+ end.must_raise Excon::Errors::InternalServerError
314
+ end
315
+ end
316
+ end