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.
- checksums.yaml +7 -0
- data/.bundle/config +4 -0
- data/.codeclimate.yml +14 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +35 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +17 -0
- data/.gitignore +5 -0
- data/.gitlab-ci.yml +42 -0
- data/.rubocop.yml +13 -0
- data/.ruby-gemset +1 -0
- data/.solargraph.yml +10 -0
- data/.travis.yml +26 -0
- data/.vscode/launch.json +114 -0
- data/.vscode/settings.json +45 -0
- data/.vscode/tasks.json +27 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/CONTRIBUTING.md +20 -0
- data/CONTRIBUTORS.md +9 -0
- data/Gemfile +23 -0
- data/Gemfile.lock +146 -0
- data/ISSUE_TEMPLATE.md +43 -0
- data/LICENSE +674 -0
- data/README.md +58 -0
- data/Rakefile +53 -0
- data/SUPPORT.md +9 -0
- data/bin/console +29 -0
- data/bin/setup +29 -0
- data/docs/compute.md +846 -0
- data/docs/connection_parameters.md +45 -0
- data/docs/getting_started.md +53 -0
- data/docs/identity.md +357 -0
- data/examples/compute.rb +279 -0
- data/examples/identity.rb +195 -0
- data/fog-proxmox.gemspec +63 -0
- data/fogproxmox.png +0 -0
- data/lib/fog/compute/proxmox.rb +131 -0
- data/lib/fog/compute/proxmox/models/container.rb +97 -0
- data/lib/fog/compute/proxmox/models/container_config.rb +90 -0
- data/lib/fog/compute/proxmox/models/containers.rb +40 -0
- data/lib/fog/compute/proxmox/models/disk.rb +67 -0
- data/lib/fog/compute/proxmox/models/disks.rb +49 -0
- data/lib/fog/compute/proxmox/models/interface.rb +50 -0
- data/lib/fog/compute/proxmox/models/interfaces.rb +46 -0
- data/lib/fog/compute/proxmox/models/node.rb +93 -0
- data/lib/fog/compute/proxmox/models/nodes.rb +45 -0
- data/lib/fog/compute/proxmox/models/server.rb +212 -0
- data/lib/fog/compute/proxmox/models/server_config.rb +116 -0
- data/lib/fog/compute/proxmox/models/servers.rb +70 -0
- data/lib/fog/compute/proxmox/models/snapshot.rb +70 -0
- data/lib/fog/compute/proxmox/models/snapshots.rb +55 -0
- data/lib/fog/compute/proxmox/models/storage.rb +61 -0
- data/lib/fog/compute/proxmox/models/storages.rb +60 -0
- data/lib/fog/compute/proxmox/models/task.rb +84 -0
- data/lib/fog/compute/proxmox/models/tasks.rb +71 -0
- data/lib/fog/compute/proxmox/models/volume.rb +61 -0
- data/lib/fog/compute/proxmox/models/volumes.rb +67 -0
- data/lib/fog/compute/proxmox/requests/action_server.rb +47 -0
- data/lib/fog/compute/proxmox/requests/check_vmid.rb +41 -0
- data/lib/fog/compute/proxmox/requests/clone_server.rb +46 -0
- data/lib/fog/compute/proxmox/requests/create_backup.rb +44 -0
- data/lib/fog/compute/proxmox/requests/create_server.rb +45 -0
- data/lib/fog/compute/proxmox/requests/create_snapshot.rb +47 -0
- data/lib/fog/compute/proxmox/requests/create_spice.rb +46 -0
- data/lib/fog/compute/proxmox/requests/create_term.rb +46 -0
- data/lib/fog/compute/proxmox/requests/create_vnc.rb +46 -0
- data/lib/fog/compute/proxmox/requests/delete_server.rb +47 -0
- data/lib/fog/compute/proxmox/requests/delete_snapshot.rb +48 -0
- data/lib/fog/compute/proxmox/requests/delete_volume.rb +40 -0
- data/lib/fog/compute/proxmox/requests/get_node.rb +44 -0
- data/lib/fog/compute/proxmox/requests/get_server_config.rb +45 -0
- data/lib/fog/compute/proxmox/requests/get_server_status.rb +45 -0
- data/lib/fog/compute/proxmox/requests/get_snapshot.rb +47 -0
- data/lib/fog/compute/proxmox/requests/get_storage.rb +44 -0
- data/lib/fog/compute/proxmox/requests/get_task.rb +44 -0
- data/lib/fog/compute/proxmox/requests/get_vnc.rb +46 -0
- data/lib/fog/compute/proxmox/requests/get_volume.rb +42 -0
- data/lib/fog/compute/proxmox/requests/list_nodes.rb +42 -0
- data/lib/fog/compute/proxmox/requests/list_servers.rb +42 -0
- data/lib/fog/compute/proxmox/requests/list_snapshots.rb +43 -0
- data/lib/fog/compute/proxmox/requests/list_storages.rb +42 -0
- data/lib/fog/compute/proxmox/requests/list_tasks.rb +42 -0
- data/lib/fog/compute/proxmox/requests/list_volumes.rb +42 -0
- data/lib/fog/compute/proxmox/requests/log_task.rb +45 -0
- data/lib/fog/compute/proxmox/requests/migrate_server.rb +44 -0
- data/lib/fog/compute/proxmox/requests/move_disk.rb +46 -0
- data/lib/fog/compute/proxmox/requests/move_volume.rb +46 -0
- data/lib/fog/compute/proxmox/requests/next_vmid.rb +39 -0
- data/lib/fog/compute/proxmox/requests/resize_container.rb +46 -0
- data/lib/fog/compute/proxmox/requests/resize_server.rb +43 -0
- data/lib/fog/compute/proxmox/requests/rollback_snapshot.rb +46 -0
- data/lib/fog/compute/proxmox/requests/status_task.rb +44 -0
- data/lib/fog/compute/proxmox/requests/stop_task.rb +41 -0
- data/lib/fog/compute/proxmox/requests/template_server.rb +43 -0
- data/lib/fog/compute/proxmox/requests/update_server.rb +46 -0
- data/lib/fog/compute/proxmox/requests/update_snapshot.rb +45 -0
- data/lib/fog/identity/proxmox.rb +132 -0
- data/lib/fog/identity/proxmox/models/activedirectory.rb +57 -0
- data/lib/fog/identity/proxmox/models/domain.rb +61 -0
- data/lib/fog/identity/proxmox/models/domains.rb +115 -0
- data/lib/fog/identity/proxmox/models/group.rb +60 -0
- data/lib/fog/identity/proxmox/models/groups.rb +50 -0
- data/lib/fog/identity/proxmox/models/ldap.rb +57 -0
- data/lib/fog/identity/proxmox/models/oath.rb +50 -0
- data/lib/fog/identity/proxmox/models/pam.rb +46 -0
- data/lib/fog/identity/proxmox/models/permission.rb +69 -0
- data/lib/fog/identity/proxmox/models/permissions.rb +61 -0
- data/lib/fog/identity/proxmox/models/pool.rb +84 -0
- data/lib/fog/identity/proxmox/models/pools.rb +50 -0
- data/lib/fog/identity/proxmox/models/principal.rb +47 -0
- data/lib/fog/identity/proxmox/models/pve.rb +46 -0
- data/lib/fog/identity/proxmox/models/role.rb +61 -0
- data/lib/fog/identity/proxmox/models/roles.rb +51 -0
- data/lib/fog/identity/proxmox/models/user.rb +74 -0
- data/lib/fog/identity/proxmox/models/users.rb +50 -0
- data/lib/fog/identity/proxmox/models/yubico.rb +51 -0
- data/lib/fog/identity/proxmox/requests/add_permission.rb +41 -0
- data/lib/fog/identity/proxmox/requests/change_password.rb +41 -0
- data/lib/fog/identity/proxmox/requests/check_permissions.rb +44 -0
- data/lib/fog/identity/proxmox/requests/create_domain.rb +40 -0
- data/lib/fog/identity/proxmox/requests/create_group.rb +40 -0
- data/lib/fog/identity/proxmox/requests/create_pool.rb +40 -0
- data/lib/fog/identity/proxmox/requests/create_role.rb +40 -0
- data/lib/fog/identity/proxmox/requests/create_user.rb +40 -0
- data/lib/fog/identity/proxmox/requests/delete_domain.rb +40 -0
- data/lib/fog/identity/proxmox/requests/delete_group.rb +40 -0
- data/lib/fog/identity/proxmox/requests/delete_pool.rb +39 -0
- data/lib/fog/identity/proxmox/requests/delete_role.rb +40 -0
- data/lib/fog/identity/proxmox/requests/delete_user.rb +39 -0
- data/lib/fog/identity/proxmox/requests/get_domain.rb +41 -0
- data/lib/fog/identity/proxmox/requests/get_group.rb +41 -0
- data/lib/fog/identity/proxmox/requests/get_pool.rb +41 -0
- data/lib/fog/identity/proxmox/requests/get_role.rb +41 -0
- data/lib/fog/identity/proxmox/requests/get_user.rb +40 -0
- data/lib/fog/identity/proxmox/requests/list_domains.rb +41 -0
- data/lib/fog/identity/proxmox/requests/list_groups.rb +41 -0
- data/lib/fog/identity/proxmox/requests/list_permissions.rb +41 -0
- data/lib/fog/identity/proxmox/requests/list_pools.rb +41 -0
- data/lib/fog/identity/proxmox/requests/list_roles.rb +41 -0
- data/lib/fog/identity/proxmox/requests/list_users.rb +42 -0
- data/lib/fog/identity/proxmox/requests/read_version.rb +43 -0
- data/lib/fog/identity/proxmox/requests/remove_permission.rb +42 -0
- data/lib/fog/identity/proxmox/requests/update_domain.rb +41 -0
- data/lib/fog/identity/proxmox/requests/update_group.rb +41 -0
- data/lib/fog/identity/proxmox/requests/update_pool.rb +41 -0
- data/lib/fog/identity/proxmox/requests/update_role.rb +41 -0
- data/lib/fog/identity/proxmox/requests/update_user.rb +41 -0
- data/lib/fog/network/proxmox.rb +83 -0
- data/lib/fog/network/proxmox/models/network.rb +82 -0
- data/lib/fog/network/proxmox/models/networks.rb +54 -0
- data/lib/fog/network/proxmox/models/node.rb +70 -0
- data/lib/fog/network/proxmox/models/nodes.rb +45 -0
- data/lib/fog/network/proxmox/requests/create_network.rb +44 -0
- data/lib/fog/network/proxmox/requests/delete_network.rb +45 -0
- data/lib/fog/network/proxmox/requests/get_network.rb +46 -0
- data/lib/fog/network/proxmox/requests/get_node.rb +44 -0
- data/lib/fog/network/proxmox/requests/list_networks.rb +43 -0
- data/lib/fog/network/proxmox/requests/list_nodes.rb +42 -0
- data/lib/fog/network/proxmox/requests/power_node.rb +46 -0
- data/lib/fog/network/proxmox/requests/update_network.rb +46 -0
- data/lib/fog/proxmox.rb +128 -0
- data/lib/fog/proxmox/core.rb +139 -0
- data/lib/fog/proxmox/errors.rb +64 -0
- data/lib/fog/proxmox/hash.rb +33 -0
- data/lib/fog/proxmox/helpers/controller_helper.rb +55 -0
- data/lib/fog/proxmox/helpers/cpu_helper.rb +45 -0
- data/lib/fog/proxmox/helpers/disk_helper.rb +84 -0
- data/lib/fog/proxmox/helpers/nic_helper.rb +62 -0
- data/lib/fog/proxmox/json.rb +32 -0
- data/lib/fog/proxmox/models/collection.rb +85 -0
- data/lib/fog/proxmox/models/model.rb +58 -0
- data/lib/fog/proxmox/variables.rb +40 -0
- data/lib/fog/proxmox/version.rb +24 -0
- data/lib/fog/storage/proxmox.rb +29 -0
- data/spec/compute_spec.rb +408 -0
- data/spec/fixtures/proxmox/compute/containers.yml +5398 -0
- data/spec/fixtures/proxmox/compute/identity_ticket.yml +40 -0
- data/spec/fixtures/proxmox/compute/servers.yml +10571 -0
- data/spec/fixtures/proxmox/compute/snapshots.yml +1228 -0
- data/spec/fixtures/proxmox/compute/storages.yml +120 -0
- data/spec/fixtures/proxmox/compute/tasks.yml +200 -0
- data/spec/fixtures/proxmox/identity/auth.yml +44 -0
- data/spec/fixtures/proxmox/identity/domains.yml +531 -0
- data/spec/fixtures/proxmox/identity/groups.yml +324 -0
- data/spec/fixtures/proxmox/identity/identity_ticket.yml +40 -0
- data/spec/fixtures/proxmox/identity/permissions.yml +565 -0
- data/spec/fixtures/proxmox/identity/pools.yml +488 -0
- data/spec/fixtures/proxmox/identity/read_version.yml +42 -0
- data/spec/fixtures/proxmox/identity/roles.yml +324 -0
- data/spec/fixtures/proxmox/identity/users.yml +646 -0
- data/spec/fixtures/proxmox/network/identity_ticket.yml +40 -0
- data/spec/fixtures/proxmox/network/networks.yml +413 -0
- data/spec/helpers/controller_helper_spec.rb +77 -0
- data/spec/helpers/cpu_helper_spec.rb +91 -0
- data/spec/helpers/disk_helper_spec.rb +104 -0
- data/spec/helpers/nic_helper_spec.rb +73 -0
- data/spec/identity_spec.rb +316 -0
- data/spec/network_spec.rb +67 -0
- data/spec/proxmox_vcr.rb +102 -0
- data/spec/spec_helper.rb +39 -0
- 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
|