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,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