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,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# Copyright 2018 Tristan Robert
|
3
|
+
|
4
|
+
# This file is part of Fog::Proxmox.
|
5
|
+
|
6
|
+
# Fog::Proxmox is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
|
11
|
+
# Fog::Proxmox is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU General Public License for more details.
|
15
|
+
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with Fog::Proxmox. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
|
19
|
+
# frozen_string_literal: true
|
20
|
+
|
21
|
+
require 'fog/proxmox/json'
|
22
|
+
|
23
|
+
module Fog
|
24
|
+
module Network
|
25
|
+
class Proxmox
|
26
|
+
# class Real power_node request
|
27
|
+
class Real
|
28
|
+
def power_node(path_params, body_params)
|
29
|
+
node = path_params[:node]
|
30
|
+
response = request(
|
31
|
+
expects: [200],
|
32
|
+
method: 'POST',
|
33
|
+
path: "nodes/#{node}/status",
|
34
|
+
body: URI.encode_www_form(body_params)
|
35
|
+
)
|
36
|
+
Fog::Proxmox::Json.get_data(response)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# class Mock power_node request
|
41
|
+
class Mock
|
42
|
+
def power_node; end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
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/json'
|
21
|
+
|
22
|
+
module Fog
|
23
|
+
module Network
|
24
|
+
class Proxmox
|
25
|
+
# class Real update_network request
|
26
|
+
class Real
|
27
|
+
def update_network(path_params, body_params)
|
28
|
+
node = path_params[:node]
|
29
|
+
type = body_params[:type]
|
30
|
+
iface = path_params[:iface]
|
31
|
+
response = request(
|
32
|
+
expects: [200],
|
33
|
+
method: 'PUT',
|
34
|
+
path: "nodes/#{node}/network/#{iface}",
|
35
|
+
body: URI.encode_www_form(body_params)
|
36
|
+
)
|
37
|
+
Fog::Proxmox::Json.get_data(response)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# class Mock update_network request
|
42
|
+
class Mock
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/fog/proxmox.rb
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# Copyright 2018 Tristan Robert
|
3
|
+
|
4
|
+
# This file is part of Fog::Proxmox.
|
5
|
+
|
6
|
+
# Fog::Proxmox is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
|
11
|
+
# Fog::Proxmox is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU General Public License for more details.
|
15
|
+
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with Fog::Proxmox. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
|
19
|
+
# frozen_string_literal: true
|
20
|
+
|
21
|
+
require 'fog/proxmox/version'
|
22
|
+
require 'fog/proxmox/core'
|
23
|
+
require 'fog/proxmox/json'
|
24
|
+
require 'fog/core'
|
25
|
+
require 'fog/json'
|
26
|
+
|
27
|
+
module Fog
|
28
|
+
# Identity module
|
29
|
+
module Identity
|
30
|
+
autoload :Proxmox, File.expand_path('identity/proxmox', __dir__)
|
31
|
+
end
|
32
|
+
# Compute module
|
33
|
+
module Compute
|
34
|
+
autoload :Proxmox, File.expand_path('compute/proxmox', __dir__)
|
35
|
+
end
|
36
|
+
# Storage module
|
37
|
+
module Storage
|
38
|
+
autoload :Proxmox, File.expand_path('storage/proxmox', __dir__)
|
39
|
+
end
|
40
|
+
# Network module
|
41
|
+
module Network
|
42
|
+
autoload :Proxmox, File.expand_path('network/proxmox', __dir__)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Proxmox module
|
46
|
+
module Proxmox
|
47
|
+
extend Fog::Provider
|
48
|
+
service(:identity, 'Identity')
|
49
|
+
service(:compute, 'Compute')
|
50
|
+
service(:storage, 'Storage')
|
51
|
+
service(:network, 'Network')
|
52
|
+
|
53
|
+
@cache = {}
|
54
|
+
|
55
|
+
# Default lifetime ticket is 2 hours
|
56
|
+
@ticket_lifetime = 2 * 60 * 60
|
57
|
+
|
58
|
+
class << self
|
59
|
+
attr_accessor :cache
|
60
|
+
attr_reader :version
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.clear_cache
|
64
|
+
Fog::Proxmox.cache = {}
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.authenticate(options, connection_options = {})
|
68
|
+
get_tokens(options, connection_options)
|
69
|
+
@cache
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.authenticated?
|
73
|
+
!@cache.empty?
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.extract_password(options)
|
77
|
+
ticket = options[:pve_ticket]
|
78
|
+
options[:pve_password] = ticket unless ticket
|
79
|
+
end
|
80
|
+
|
81
|
+
def self.get_tokens(options, connection_options = {})
|
82
|
+
username = options[:pve_username].to_s
|
83
|
+
password = options[:pve_password].to_s
|
84
|
+
url = options[:pve_url]
|
85
|
+
extract_password(options)
|
86
|
+
uri = URI.parse(url)
|
87
|
+
@api_path = uri.path
|
88
|
+
connection_options = connection_options.merge(path_prefix: @api_path)
|
89
|
+
retrieve_tokens(uri, connection_options, username, password) unless authenticated?
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.retrieve_tokens(uri, connection_options, username, password)
|
93
|
+
request = {
|
94
|
+
expects: [200, 204],
|
95
|
+
headers: { 'Accept' => 'application/json' },
|
96
|
+
body: "username=#{username}&password=#{password}",
|
97
|
+
method: 'POST',
|
98
|
+
path: 'access/ticket'
|
99
|
+
}
|
100
|
+
|
101
|
+
connection = Fog::Core::Connection.new(
|
102
|
+
uri.to_s,
|
103
|
+
false,
|
104
|
+
connection_options
|
105
|
+
)
|
106
|
+
|
107
|
+
response = connection.request(request)
|
108
|
+
data = Json.get_data(response)
|
109
|
+
ticket = data['ticket']
|
110
|
+
username = data['username']
|
111
|
+
csrftoken = data['CSRFPreventionToken']
|
112
|
+
|
113
|
+
now = Time.now
|
114
|
+
deadline = Time.at(now.to_i + @ticket_lifetime)
|
115
|
+
save_token(username, ticket, csrftoken, deadline)
|
116
|
+
end
|
117
|
+
|
118
|
+
def self.save_token(username, ticket, csrftoken, deadline)
|
119
|
+
@cache = {
|
120
|
+
username: username,
|
121
|
+
ticket: ticket,
|
122
|
+
csrftoken: csrftoken,
|
123
|
+
deadline: deadline
|
124
|
+
}
|
125
|
+
Fog::Proxmox.cache = @cache
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
@@ -0,0 +1,139 @@
|
|
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/json'
|
21
|
+
require 'fog/proxmox/variables'
|
22
|
+
|
23
|
+
module Fog
|
24
|
+
module Proxmox
|
25
|
+
# Core module
|
26
|
+
module Core
|
27
|
+
attr_accessor :pve_ticket
|
28
|
+
attr_reader :pve_csrftoken
|
29
|
+
attr_reader :pve_username
|
30
|
+
attr_reader :deadline
|
31
|
+
attr_reader :principal
|
32
|
+
|
33
|
+
# fallback
|
34
|
+
def self.not_found_class
|
35
|
+
Fog::Compute::Proxmox::NotFound
|
36
|
+
end
|
37
|
+
|
38
|
+
def initialize_identity(options)
|
39
|
+
@principal = nil
|
40
|
+
@pve_must_reauthenticate = true
|
41
|
+
@pve_ticket = nil
|
42
|
+
Fog::Proxmox::Variables.to_variables(self, options, 'pve')
|
43
|
+
@pve_uri = URI.parse(@pve_url)
|
44
|
+
@pve_must_reauthenticate = true unless @pve_ticket
|
45
|
+
missing_credentials = []
|
46
|
+
missing_credentials << :pve_username unless @pve_username
|
47
|
+
|
48
|
+
unless @pve_ticket
|
49
|
+
missing_credentials << :pve_password unless @pve_password
|
50
|
+
end
|
51
|
+
|
52
|
+
raise ArgumentError, "Missing required arguments: #{missing_credentials.join(', ')}" unless missing_credentials.empty?
|
53
|
+
end
|
54
|
+
|
55
|
+
def credentials
|
56
|
+
options = {
|
57
|
+
provider: 'proxmox',
|
58
|
+
pve_url: @pve_uri.to_s,
|
59
|
+
pve_ticket: @pve_ticket,
|
60
|
+
pve_csrftoken: @pve_csrftoken,
|
61
|
+
pve_username: @pve_username
|
62
|
+
}
|
63
|
+
pve_options.merge options
|
64
|
+
end
|
65
|
+
|
66
|
+
def reload
|
67
|
+
@connection.reset
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
def request(params)
|
73
|
+
retried = false
|
74
|
+
begin
|
75
|
+
response = @connection.request(params.merge(
|
76
|
+
headers: headers(params[:method], params[:headers])
|
77
|
+
))
|
78
|
+
rescue Excon::Errors::Unauthorized => error
|
79
|
+
# token expiration and token renewal possible
|
80
|
+
if error.response.body != 'Bad username or password' && @pve_can_reauthenticate && !retried
|
81
|
+
authenticate
|
82
|
+
retried = true
|
83
|
+
retry
|
84
|
+
# bad credentials or token renewal not possible
|
85
|
+
else
|
86
|
+
raise error
|
87
|
+
end
|
88
|
+
rescue Excon::Errors::HTTPStatusError => error
|
89
|
+
raise case error
|
90
|
+
when Excon::Errors::NotFound
|
91
|
+
self.class.not_found_class.slurp(error)
|
92
|
+
else
|
93
|
+
error
|
94
|
+
end
|
95
|
+
end
|
96
|
+
response
|
97
|
+
end
|
98
|
+
|
99
|
+
def headers(method, additional_headers)
|
100
|
+
additional_headers ||= {}
|
101
|
+
headers_hash = { 'Accept' => 'application/json' }
|
102
|
+
# CSRF token is required to PUT, POST and DELETE http requests
|
103
|
+
if %w[PUT POST DELETE].include? method
|
104
|
+
headers_hash.store('CSRFPreventionToken', @pve_csrftoken)
|
105
|
+
end
|
106
|
+
# ticket must be present in cookie
|
107
|
+
headers_hash.store('Cookie', "PVEAuthCookie=#{@pve_ticket}") if @pve_ticket
|
108
|
+
headers_hash.merge additional_headers
|
109
|
+
headers_hash
|
110
|
+
end
|
111
|
+
|
112
|
+
def pve_options
|
113
|
+
Fog::Proxmox::Variables.to_hash(self, 'pve')
|
114
|
+
end
|
115
|
+
|
116
|
+
def authenticate
|
117
|
+
unless @principal
|
118
|
+
options = pve_options
|
119
|
+
options[:pve_ticket] = @pve_must_reauthenticate ? nil : @pve_ticket
|
120
|
+
credentials = Fog::Proxmox.authenticate(options, @connection_options)
|
121
|
+
@principal = credentials
|
122
|
+
@pve_username = credentials[:username]
|
123
|
+
@pve_ticket = credentials[:ticket]
|
124
|
+
@pve_deadline = credentials[:deadline]
|
125
|
+
@pve_csrftoken = credentials[:csrftoken]
|
126
|
+
@pve_must_reauthenticate = false
|
127
|
+
end
|
128
|
+
|
129
|
+
@host = @pve_uri.host
|
130
|
+
@api_path = @pve_uri.path
|
131
|
+
@api_path.sub!(%r{/$}, '')
|
132
|
+
@port = @pve_uri.port
|
133
|
+
@scheme = @pve_uri.scheme
|
134
|
+
|
135
|
+
true
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
@@ -0,0 +1,64 @@
|
|
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
|
+
module Fog
|
21
|
+
module Proxmox
|
22
|
+
module Errors
|
23
|
+
# class ServiceError
|
24
|
+
class ServiceError < Fog::Errors::Error
|
25
|
+
attr_reader :response_data
|
26
|
+
|
27
|
+
def self.slurp(error)
|
28
|
+
if error.response.body.empty?
|
29
|
+
data = nil
|
30
|
+
message = nil
|
31
|
+
else
|
32
|
+
data = Fog::JSON.decode(error.response.body)
|
33
|
+
message = data['message']
|
34
|
+
data1 = data.values.first
|
35
|
+
message = data1['message'] if message.nil? && !data1.nil?
|
36
|
+
end
|
37
|
+
|
38
|
+
new_error = super(error, message)
|
39
|
+
new_error.instance_variable_set(:@response_data, data)
|
40
|
+
new_error
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# class ServiceUnavailable error
|
45
|
+
class ServiceUnavailable < ServiceError; end
|
46
|
+
|
47
|
+
# class BadRequest error
|
48
|
+
class BadRequest < ServiceError
|
49
|
+
attr_reader :validation_errors
|
50
|
+
|
51
|
+
def self.slurp(error)
|
52
|
+
new_error = super(error)
|
53
|
+
unless new_error.response_data.nil? || new_error.response_data['badRequest'].nil?
|
54
|
+
new_error.instance_variable_set(:@validation_errors, new_error.response_data['badRequest']['validationErrors'])
|
55
|
+
end
|
56
|
+
new_error
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# class InterfaceNotImplemented error
|
61
|
+
class InterfaceNotImplemented < Fog::Errors::Error; end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,33 @@
|
|
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
|
+
module Fog
|
21
|
+
module Proxmox
|
22
|
+
# module Hash mixins
|
23
|
+
module Hash
|
24
|
+
def self.stringify(hash)
|
25
|
+
string = ''
|
26
|
+
hash.each do |key, value|
|
27
|
+
string += "#{key}=#{value},"
|
28
|
+
end
|
29
|
+
string.slice(0, string.length - 1)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|