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,49 @@
|
|
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 'fog/proxmox/models/collection'
|
21
|
+
require 'fog/compute/proxmox/models/disk'
|
22
|
+
|
23
|
+
module Fog
|
24
|
+
module Compute
|
25
|
+
class Proxmox
|
26
|
+
# class Disks Collection of disk
|
27
|
+
class Disks < Fog::Proxmox::Collection
|
28
|
+
model Fog::Compute::Proxmox::Disk
|
29
|
+
|
30
|
+
def all(_options = {})
|
31
|
+
self
|
32
|
+
end
|
33
|
+
|
34
|
+
def get(id)
|
35
|
+
cached_disk = find { |disk| disk.id == id }
|
36
|
+
return cached_disk if cached_disk
|
37
|
+
end
|
38
|
+
|
39
|
+
def next_device(controller)
|
40
|
+
Fog::Proxmox::ControllerHelper.last_index(controller, self) + 1
|
41
|
+
end
|
42
|
+
|
43
|
+
def cdrom
|
44
|
+
find(&:cdrom?)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# Copyright 2018 Tristan Robert
|
3
|
+
|
4
|
+
# This file is part of Fog::Proxmox.
|
5
|
+
|
6
|
+
# Fog::Proxmox is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
# Copyright 2018 Tristan Robert
|
11
|
+
|
12
|
+
# This file is part of Fog::Proxmox.
|
13
|
+
|
14
|
+
# Fog::Proxmox is free software: you can redistribute it and/or modify
|
15
|
+
# it under the terms of the GNU General Public License as published by
|
16
|
+
# the Free Software Foundation, either version 3 of the License, or
|
17
|
+
# (at your option) any later version.
|
18
|
+
|
19
|
+
# Fog::Proxmox is distributed in the hope that it will be useful,
|
20
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
21
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
22
|
+
# GNU General Public License for more details.
|
23
|
+
|
24
|
+
# You should have received a copy of the GNU General Public License
|
25
|
+
# along with Fog::Proxmox. If not, see <http://www.gnu.org/licenses/>.
|
26
|
+
|
27
|
+
# frozen_string_literal: true
|
28
|
+
|
29
|
+
require 'fog/proxmox/models/model'
|
30
|
+
|
31
|
+
module Fog
|
32
|
+
module Compute
|
33
|
+
class Proxmox
|
34
|
+
# class Interface model
|
35
|
+
class Interface < Fog::Proxmox::Model
|
36
|
+
identity :id
|
37
|
+
attribute :mac
|
38
|
+
attribute :model
|
39
|
+
attribute :bridge
|
40
|
+
attribute :firewall
|
41
|
+
attribute :link_down
|
42
|
+
attribute :rate
|
43
|
+
attribute :queues
|
44
|
+
attribute :tag
|
45
|
+
|
46
|
+
NAME = 'net'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,46 @@
|
|
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 'fog/proxmox/models/collection'
|
21
|
+
require 'fog/compute/proxmox/models/interface'
|
22
|
+
require 'fog/proxmox/helpers/controller_helper'
|
23
|
+
|
24
|
+
module Fog
|
25
|
+
module Compute
|
26
|
+
class Proxmox
|
27
|
+
# class Interfaces Collection of nodes of cluster
|
28
|
+
class Interfaces < Fog::Proxmox::Collection
|
29
|
+
model Fog::Compute::Proxmox::Interface
|
30
|
+
|
31
|
+
def all(_options = {})
|
32
|
+
self
|
33
|
+
end
|
34
|
+
|
35
|
+
def get(id)
|
36
|
+
cached_interface = find { |interface| interface.id == id }
|
37
|
+
return cached_interface if cached_interface
|
38
|
+
end
|
39
|
+
|
40
|
+
def next_nicid
|
41
|
+
Fog::Proxmox::ControllerHelper.last_index(Fog::Compute::Proxmox::Interface::NAME, self) + 1
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# Copyright 2018 Tristan Robert
|
3
|
+
|
4
|
+
# This file is part of Fog::Proxmox.
|
5
|
+
|
6
|
+
# Fog::Proxmox is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
# Copyright 2018 Tristan Robert
|
11
|
+
|
12
|
+
# This file is part of Fog::Proxmox.
|
13
|
+
|
14
|
+
# Fog::Proxmox is free software: you can redistribute it and/or modify
|
15
|
+
# it under the terms of the GNU General Public License as published by
|
16
|
+
# the Free Software Foundation, either version 3 of the License, or
|
17
|
+
# (at your option) any later version.
|
18
|
+
|
19
|
+
# Fog::Proxmox is distributed in the hope that it will be useful,
|
20
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
21
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
22
|
+
# GNU General Public License for more details.
|
23
|
+
|
24
|
+
# You should have received a copy of the GNU General Public License
|
25
|
+
# along with Fog::Proxmox. If not, see <http://www.gnu.org/licenses/>.
|
26
|
+
|
27
|
+
# frozen_string_literal: true
|
28
|
+
|
29
|
+
require 'fog/proxmox/models/model'
|
30
|
+
|
31
|
+
module Fog
|
32
|
+
module Compute
|
33
|
+
class Proxmox
|
34
|
+
# class Node model of VMs
|
35
|
+
class Node < Fog::Proxmox::Model
|
36
|
+
identity :node
|
37
|
+
attribute :status
|
38
|
+
attribute :wait
|
39
|
+
attribute :uptime
|
40
|
+
attribute :pveversion
|
41
|
+
attribute :ksm
|
42
|
+
attribute :kversion
|
43
|
+
attribute :loadavg
|
44
|
+
attribute :rootfs
|
45
|
+
attribute :cpu
|
46
|
+
attribute :cpuinfo
|
47
|
+
attribute :memory
|
48
|
+
attribute :idle
|
49
|
+
attribute :swap
|
50
|
+
attribute :servers
|
51
|
+
attribute :tasks
|
52
|
+
attribute :storages
|
53
|
+
|
54
|
+
def to_s
|
55
|
+
node
|
56
|
+
end
|
57
|
+
|
58
|
+
def tasks
|
59
|
+
@tasks ||= begin
|
60
|
+
Fog::Compute::Proxmox::Tasks.new(service: service,
|
61
|
+
node: self)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def servers
|
66
|
+
@servers ||= begin
|
67
|
+
Fog::Compute::Proxmox::Servers.new(service: service,
|
68
|
+
node: self)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def containers
|
73
|
+
@containers ||= begin
|
74
|
+
Fog::Compute::Proxmox::Containers.new(service: service,
|
75
|
+
node: self)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def storages
|
80
|
+
@storages ||= begin
|
81
|
+
Fog::Compute::Proxmox::Storages.new(service: service,
|
82
|
+
node: self)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def backup(options = {})
|
87
|
+
task_upid = service.backup({ node: node }, options)
|
88
|
+
task_upid
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,45 @@
|
|
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 'fog/proxmox/models/collection'
|
21
|
+
require 'fog/compute/proxmox/models/node'
|
22
|
+
|
23
|
+
module Fog
|
24
|
+
module Compute
|
25
|
+
class Proxmox
|
26
|
+
# class Nodes Collection of nodes of cluster
|
27
|
+
class Nodes < Fog::Proxmox::Collection
|
28
|
+
model Fog::Compute::Proxmox::Node
|
29
|
+
|
30
|
+
def all(_options = {})
|
31
|
+
load_response(service.list_nodes, 'nodes')
|
32
|
+
end
|
33
|
+
|
34
|
+
def find_by_id(id)
|
35
|
+
cached_node = find { |node| node.node == id }
|
36
|
+
return cached_node if cached_node
|
37
|
+
node_hash = service.get_node(id)
|
38
|
+
Fog::Compute::Proxmox::Node.new(
|
39
|
+
node_hash.merge(service: service, node: id)
|
40
|
+
)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,212 @@
|
|
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 'fog/compute/models/server'
|
21
|
+
require 'fog/proxmox/helpers/disk_helper'
|
22
|
+
require 'fog/proxmox/hash'
|
23
|
+
|
24
|
+
module Fog
|
25
|
+
module Compute
|
26
|
+
class Proxmox
|
27
|
+
# Server model
|
28
|
+
class Server < Fog::Compute::Server
|
29
|
+
identity :vmid
|
30
|
+
attribute :node
|
31
|
+
attribute :config
|
32
|
+
attribute :name
|
33
|
+
attribute :type
|
34
|
+
attribute :maxdisk
|
35
|
+
attribute :disk
|
36
|
+
attribute :diskwrite
|
37
|
+
attribute :diskread
|
38
|
+
attribute :uptime
|
39
|
+
attribute :netout
|
40
|
+
attribute :netin
|
41
|
+
attribute :cpu
|
42
|
+
attribute :cpus
|
43
|
+
attribute :template
|
44
|
+
attribute :status
|
45
|
+
attribute :maxcpu
|
46
|
+
attribute :mem
|
47
|
+
attribute :maxmem
|
48
|
+
attribute :qmpstatus
|
49
|
+
attribute :ha
|
50
|
+
attribute :pid
|
51
|
+
attribute :blockstat
|
52
|
+
attribute :balloon
|
53
|
+
attribute :ballooninfo
|
54
|
+
attribute :snapshots
|
55
|
+
|
56
|
+
def initialize(attributes = {})
|
57
|
+
prepare_service_value(attributes)
|
58
|
+
set_config(attributes)
|
59
|
+
super
|
60
|
+
end
|
61
|
+
|
62
|
+
def type(attributes = {})
|
63
|
+
@type ||= 'qemu' unless attributes[:type] || attributes['type']
|
64
|
+
@type
|
65
|
+
end
|
66
|
+
|
67
|
+
def request(name, body_params = {}, path_params = {})
|
68
|
+
requires :node, :type
|
69
|
+
path = path_params.merge(node: node, type: type)
|
70
|
+
task_upid = service.send(name, path, body_params)
|
71
|
+
tasks.wait_for(task_upid)
|
72
|
+
end
|
73
|
+
|
74
|
+
def create(config = {})
|
75
|
+
request(:create_server, config.merge(vmid: vmid))
|
76
|
+
end
|
77
|
+
|
78
|
+
def update(config = {})
|
79
|
+
requires :vmid
|
80
|
+
request(:update_server, config, vmid: vmid)
|
81
|
+
end
|
82
|
+
|
83
|
+
def destroy(options = {})
|
84
|
+
requires :vmid
|
85
|
+
request(:delete_server, options, vmid: vmid)
|
86
|
+
end
|
87
|
+
|
88
|
+
def action(action, options = {})
|
89
|
+
requires :vmid
|
90
|
+
action_known = %w[start stop resume suspend shutdown reset].include? action
|
91
|
+
message = "Action #{action} not implemented"
|
92
|
+
raise Fog::Errors::Error, message unless action_known
|
93
|
+
request(:action_server, options, action: action, vmid: vmid)
|
94
|
+
end
|
95
|
+
|
96
|
+
def ready?
|
97
|
+
status == 'running'
|
98
|
+
end
|
99
|
+
|
100
|
+
def reload
|
101
|
+
requires :vmid
|
102
|
+
object = collection.get(vmid)
|
103
|
+
merge_attributes(object.attributes)
|
104
|
+
end
|
105
|
+
|
106
|
+
def backup(options = {})
|
107
|
+
requires :vmid
|
108
|
+
request(:create_backup, options.merge(vmid: vmid))
|
109
|
+
end
|
110
|
+
|
111
|
+
def restore(backup, options = {})
|
112
|
+
requires :vmid
|
113
|
+
config = options.merge(archive: backup.volid, force: 1)
|
114
|
+
create(config)
|
115
|
+
end
|
116
|
+
|
117
|
+
def clone(newid, options = {})
|
118
|
+
requires :vmid
|
119
|
+
request(:clone_server, options.merge(newid: newid), vmid: vmid)
|
120
|
+
end
|
121
|
+
|
122
|
+
def template(options = {})
|
123
|
+
requires :vmid, :node
|
124
|
+
service.template_server({ node: node, type: type, vmid: vmid }, options)
|
125
|
+
end
|
126
|
+
|
127
|
+
def migrate(target, options = {})
|
128
|
+
requires :vmid
|
129
|
+
request(:migrate_server, options.merge(target: target), vmid: vmid)
|
130
|
+
end
|
131
|
+
|
132
|
+
def extend(disk, size, options = {})
|
133
|
+
requires :vmid, :node
|
134
|
+
service.resize_server({ node: node, vmid: vmid }, options.merge(disk: disk, size: size))
|
135
|
+
end
|
136
|
+
|
137
|
+
def move(disk, storage, options = {})
|
138
|
+
requires :vmid
|
139
|
+
request(:move_disk, options.merge(disk: disk, storage: storage), vmid: vmid)
|
140
|
+
end
|
141
|
+
|
142
|
+
def attach(disk, options = {})
|
143
|
+
config = Fog::Proxmox::DiskHelper.flatten(disk.merge(options: options))
|
144
|
+
update(config)
|
145
|
+
end
|
146
|
+
|
147
|
+
def detach(diskid)
|
148
|
+
update(delete: diskid)
|
149
|
+
end
|
150
|
+
|
151
|
+
def set_config(attributes = {})
|
152
|
+
@config = Fog::Compute::Proxmox::ServerConfig.new({ service: service }.merge(attributes))
|
153
|
+
end
|
154
|
+
|
155
|
+
def config
|
156
|
+
path_params = { node: node, type: type, vmid: vmid }
|
157
|
+
set_config(service.get_server_config(path_params)) if uptime
|
158
|
+
@config
|
159
|
+
end
|
160
|
+
|
161
|
+
def snapshots
|
162
|
+
@snapshots ||= begin
|
163
|
+
Fog::Compute::Proxmox::Snapshots.new(service: service,
|
164
|
+
server: self)
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
def backups
|
169
|
+
list 'backup'
|
170
|
+
end
|
171
|
+
|
172
|
+
def images
|
173
|
+
list 'images'
|
174
|
+
end
|
175
|
+
|
176
|
+
def list(content)
|
177
|
+
storages = node.storages.list_by_content_type content
|
178
|
+
volumes = []
|
179
|
+
storages.each { |storage| volumes += storage.volumes.list_by_content_type_and_by_server(content, vmid) }
|
180
|
+
volumes
|
181
|
+
end
|
182
|
+
|
183
|
+
def tasks
|
184
|
+
node.tasks.search(vmid: vmid)
|
185
|
+
end
|
186
|
+
|
187
|
+
def start_console(options = {})
|
188
|
+
raise ::Fog::Proxmox::Errors::ServiceError, "Unable to start console because server not running." unless ready?
|
189
|
+
type_console = config.type_console
|
190
|
+
raise ::Fog::Proxmox::Errors::ServiceError, "Unable to start console because VGA display server config is not set or unknown." unless type_console
|
191
|
+
requires :vmid, :node, :type
|
192
|
+
path_params = { node: node, type: type, vmid: vmid }
|
193
|
+
body_params = options
|
194
|
+
data = service.send(('create_' + type_console).to_sym, path_params, body_params)
|
195
|
+
task_upid = data['upid']
|
196
|
+
if task_upid
|
197
|
+
task = tasks.get(task_upid)
|
198
|
+
task.wait_for { running? }
|
199
|
+
end
|
200
|
+
data
|
201
|
+
end
|
202
|
+
|
203
|
+
def connect_vnc(options = {})
|
204
|
+
requires :vmid, :node, :type
|
205
|
+
path_params = { node: node, type: type, vmid: vmid }
|
206
|
+
query_params = { port: options['port'], vncticket: options['ticket'] }
|
207
|
+
service.get_vnc(path_params, query_params)
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|