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
data/examples/compute.rb
ADDED
@@ -0,0 +1,279 @@
|
|
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
|
+
# There are basically two modes of operation for these specs.
|
21
|
+
#
|
22
|
+
# 1. ENV[PVE_URL] exists: talk to an actual Proxmox server and record HTTP
|
23
|
+
# traffic in VCRs at "spec/debug" (credentials are read from the conventional
|
24
|
+
# environment variables: PVE_URL, PVE_USERNAME, PVE_PASSWORD)
|
25
|
+
# 2. otherwise (Travis, etc): use VCRs at "spec/fixtures/proxmox/#{service}"
|
26
|
+
|
27
|
+
require 'fog/proxmox'
|
28
|
+
|
29
|
+
pve_url = 'https://172.26.49.146:8006/api2/json'
|
30
|
+
pve_username = 'root@pam'
|
31
|
+
pve_password = 'proxmox01'
|
32
|
+
|
33
|
+
# Create service compute
|
34
|
+
compute = Fog::Compute::Proxmox.new(
|
35
|
+
pve_url: pve_url,
|
36
|
+
pve_username: pve_username,
|
37
|
+
pve_password: pve_password
|
38
|
+
)
|
39
|
+
|
40
|
+
# Create pools
|
41
|
+
pool_hash = { poolid: 'pool1' }
|
42
|
+
compute.domains.create(pool_hash)
|
43
|
+
|
44
|
+
# Get one pool by id
|
45
|
+
pool1 = compute.pools.find_by_id 'pool1'
|
46
|
+
|
47
|
+
# Update pool
|
48
|
+
pool1.comment 'pool 1'
|
49
|
+
pool1.update
|
50
|
+
|
51
|
+
# List all pools
|
52
|
+
compute.pools.all
|
53
|
+
|
54
|
+
# List pool by pool
|
55
|
+
compute.pools.each do |pool|
|
56
|
+
# pool ...
|
57
|
+
end
|
58
|
+
|
59
|
+
# Delete pool
|
60
|
+
pool1.destroy
|
61
|
+
|
62
|
+
# Create servers
|
63
|
+
|
64
|
+
# Get node owner
|
65
|
+
node_name = 'pve'
|
66
|
+
node = compute.nodes.find_by_id node_name
|
67
|
+
|
68
|
+
# Get next free vmid
|
69
|
+
vmid = node.servers.next_id
|
70
|
+
server_hash = { vmid: vmid }
|
71
|
+
|
72
|
+
# Create server
|
73
|
+
node.servers.create(server_hash)
|
74
|
+
|
75
|
+
# Check already used vmid
|
76
|
+
node.servers.id_valid? vmid
|
77
|
+
|
78
|
+
# Get server
|
79
|
+
server = node.servers.get vmid
|
80
|
+
|
81
|
+
# Update config server
|
82
|
+
# Add cdrom empty
|
83
|
+
config_hash = { ide2: 'none,media=cdrom' }
|
84
|
+
server.update(config_hash)
|
85
|
+
# Attach a hdd
|
86
|
+
virtio0 = { id: 'virtio0', storage: storage.storage, size: '1' }
|
87
|
+
ide0 = { id: 'ide0', storage: storage.storage, size: '1' }
|
88
|
+
options = { backup: 0, replicate: 0 }
|
89
|
+
server.attach(virtio0, options)
|
90
|
+
server.attach(ide0, options)
|
91
|
+
# Resize disk server
|
92
|
+
server.extend('virtio0', '+1G')
|
93
|
+
# Move disk server
|
94
|
+
server.move('virtio0', 'local')
|
95
|
+
# Detach a disk
|
96
|
+
server.detach 'ide0'
|
97
|
+
# Remove it
|
98
|
+
server.detach 'unused0'
|
99
|
+
# Detach another device
|
100
|
+
server.detach 'ide2'
|
101
|
+
# Add network interface
|
102
|
+
config_hash = { net0: 'virtio,bridge=vmbr0' }
|
103
|
+
server.update(config_hash)
|
104
|
+
# Add start at boot, keyboard fr, linux 3.x os type, kvm hardware disabled (proxmox guest in virtualbox)
|
105
|
+
config_hash = { onboot: 1, keyboard: 'fr', ostype: 'l26', kvm: 0 }
|
106
|
+
server.update(config_hash)
|
107
|
+
# Get configuration model
|
108
|
+
config = server.get_config
|
109
|
+
# Get nics config
|
110
|
+
nics = server.get_config.nics
|
111
|
+
nics[:net0]
|
112
|
+
# Get hdd controllers (ide, sata, scsi or virtio) config
|
113
|
+
# All return hashes with key equals to controller id
|
114
|
+
ides = server.get_config.ides
|
115
|
+
ides[:ide2]
|
116
|
+
satas = server.get_config.satas
|
117
|
+
scsis = server.get_config.scsis
|
118
|
+
virtios = server.get_config.virtios
|
119
|
+
virtios[:virtio0]
|
120
|
+
# Get mac_addresses
|
121
|
+
server.get_config.mac_adresses
|
122
|
+
# List all servers
|
123
|
+
servers_all = compute.servers.all
|
124
|
+
|
125
|
+
# Start server
|
126
|
+
server.action('start')
|
127
|
+
# Wait until task is complete
|
128
|
+
server.wait_for { ready? }
|
129
|
+
# Suspend server
|
130
|
+
server.action('suspend')
|
131
|
+
# Wait until task is complete
|
132
|
+
server.wait_for { server.qmpstatus == 'paused' }
|
133
|
+
# Resume server
|
134
|
+
server.action('resume')
|
135
|
+
# Wait until task is complete
|
136
|
+
server.wait_for { ready? }
|
137
|
+
# Stop server
|
138
|
+
server.action('stop')
|
139
|
+
# Wait until task is complete
|
140
|
+
server.wait_for { server.status == 'stopped' }
|
141
|
+
|
142
|
+
# Backup a server
|
143
|
+
server.backup(compress: 'lzo')
|
144
|
+
|
145
|
+
# Fetch a backup volume (first one)
|
146
|
+
volume = server.backups.first
|
147
|
+
|
148
|
+
# Restore it
|
149
|
+
server.restore volume
|
150
|
+
|
151
|
+
# Delete a backup
|
152
|
+
volume.destroy
|
153
|
+
|
154
|
+
# Snapshot a server
|
155
|
+
server.snapshots.create(name: 'snapshot1')
|
156
|
+
|
157
|
+
# Fetch it
|
158
|
+
snapshot = server.snapshots.get 'snapshot1'
|
159
|
+
# Fetch all
|
160
|
+
server.snapshots.all
|
161
|
+
|
162
|
+
# Update snapshot
|
163
|
+
snapshot.description 'Snapshot 1'
|
164
|
+
snapshot.update
|
165
|
+
|
166
|
+
# Delete snapshot
|
167
|
+
snapshot.destroy
|
168
|
+
|
169
|
+
# Fetch disk images
|
170
|
+
server.disk_images.all
|
171
|
+
|
172
|
+
# Delete server
|
173
|
+
server.destroy
|
174
|
+
|
175
|
+
# Create containers
|
176
|
+
node_name = 'pve'
|
177
|
+
node = compute.nodes.find_by_id node_name
|
178
|
+
ostemplate = 'local:vztmpl/alpine-3.7-default_20171211_amd64.tar.xz'
|
179
|
+
container_hash = {
|
180
|
+
vmid: vmid,
|
181
|
+
storage: 'local-lvm',
|
182
|
+
ostemplate: ostemplate,
|
183
|
+
password: 'proxmox01',
|
184
|
+
rootfs: 'local-lvm:1'
|
185
|
+
}
|
186
|
+
|
187
|
+
# Get next free vmid
|
188
|
+
vmid = node.containers.next_id
|
189
|
+
|
190
|
+
node.containers.create(container_hash)
|
191
|
+
# Check already used vmid
|
192
|
+
valid = node.containers.id_valid? vmid
|
193
|
+
|
194
|
+
# Get container
|
195
|
+
container = node.containers.get(vmid)
|
196
|
+
|
197
|
+
# Get container config
|
198
|
+
container.config
|
199
|
+
# Update config container
|
200
|
+
# Attach an aditional mount point
|
201
|
+
mp0 = { id: 'mp0', storage: 'local-lvm', size: '1' }
|
202
|
+
options = { mp: '/opt/app', backup: 0, replicate: 0, quota: 1 }
|
203
|
+
container.attach(mp0, options)
|
204
|
+
# Resize rootfs container
|
205
|
+
container.extend('rootfs', '+1G')
|
206
|
+
# Move rootfs container and delete original
|
207
|
+
container.move('rootfs', 'local-lvm', delete: 1)
|
208
|
+
# Detach a mount point
|
209
|
+
container.detach 'mp0'
|
210
|
+
# Remove it
|
211
|
+
container.detach 'unused0'
|
212
|
+
# Add network interface
|
213
|
+
config_hash = { net0: 'bridge=vmbr0,name=eth0,ip=dhcp,ip6=dhcp' }
|
214
|
+
container.update(config_hash)
|
215
|
+
# Add start at boot, linux os type alpine
|
216
|
+
config_hash = { onboot: 1, ostype: 'alpine' }
|
217
|
+
container.update(config_hash)
|
218
|
+
# Get mac_addresses
|
219
|
+
container.mac_adresses
|
220
|
+
# Get nics
|
221
|
+
container.config.nics
|
222
|
+
# Get additional mount points
|
223
|
+
container.config.mount_points
|
224
|
+
# List all servers
|
225
|
+
containers_all = node.containers.all
|
226
|
+
|
227
|
+
# Start container
|
228
|
+
container.action('start')
|
229
|
+
# Wait until task is complete
|
230
|
+
container.wait_for { ready? }
|
231
|
+
# Stop container
|
232
|
+
container.action('stop')
|
233
|
+
# Wait until task is complete
|
234
|
+
container.wait_for { container.status == 'stopped' }
|
235
|
+
|
236
|
+
# Backup a container
|
237
|
+
container.backup(compress: 'lzo')
|
238
|
+
|
239
|
+
# Fetch a backup volume (first one)
|
240
|
+
volume = container.backups.first
|
241
|
+
|
242
|
+
# Restore it
|
243
|
+
container.restore volume
|
244
|
+
|
245
|
+
# Delete a backup
|
246
|
+
volume.destroy
|
247
|
+
|
248
|
+
# Snapshot a container
|
249
|
+
container.snapshots.create(name: 'snapshot1')
|
250
|
+
|
251
|
+
# Fetch it
|
252
|
+
snapshot = container.snapshots.get 'snapshot1'
|
253
|
+
# Fetch all
|
254
|
+
container.snapshots.all
|
255
|
+
|
256
|
+
# Update snapshot
|
257
|
+
snapshot.description 'Snapshot 1'
|
258
|
+
snapshot.update
|
259
|
+
|
260
|
+
# Delete snapshot
|
261
|
+
snapshot.destroy
|
262
|
+
|
263
|
+
# Fetch additional mount points
|
264
|
+
container.mount_points
|
265
|
+
# Fetch network interfaces
|
266
|
+
container.nics
|
267
|
+
|
268
|
+
# Delete container
|
269
|
+
container.destroy
|
270
|
+
|
271
|
+
# List 1 task
|
272
|
+
options = { limit: 1 }
|
273
|
+
node = 'pve'
|
274
|
+
tasks = compute.tasks.search(node, options)
|
275
|
+
# Get task
|
276
|
+
upid = tasks[0].upid
|
277
|
+
task = compute.tasks.find_by_id(node, upid)
|
278
|
+
# Stop task
|
279
|
+
task.stop
|
@@ -0,0 +1,195 @@
|
|
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
|
+
# There are basically two modes of operation for these specs.
|
22
|
+
#
|
23
|
+
# 1. ENV[PVE_URL] exists: talk to an actual Proxmox server and record HTTP
|
24
|
+
# traffic in VCRs at "spec/debug" (credentials are read from the conventional
|
25
|
+
# environment variables: PVE_URL, PVE_USERNAME, PVE_PASSWORD)
|
26
|
+
# 2. otherwise (Travis, etc): use VCRs at "spec/fixtures/proxmox/#{service}"
|
27
|
+
|
28
|
+
require 'fog/proxmox'
|
29
|
+
|
30
|
+
pve_url = 'https://172.26.49.146:8006/api2/json'
|
31
|
+
pve_username = 'root@pam'
|
32
|
+
pve_password = 'proxmox01'
|
33
|
+
|
34
|
+
# Create service identity
|
35
|
+
identity = Fog::Identity::Proxmox.new(
|
36
|
+
pve_url: pve_url,
|
37
|
+
pve_username: pve_username,
|
38
|
+
pve_password: pve_password
|
39
|
+
)
|
40
|
+
|
41
|
+
# Get proxmox version
|
42
|
+
identity.read_version
|
43
|
+
|
44
|
+
# Create a new user
|
45
|
+
bob_hash = {
|
46
|
+
userid: 'bobsinclar@pve',
|
47
|
+
password: 'bobsinclar1',
|
48
|
+
firstname: 'Bob',
|
49
|
+
lastname: 'Sinclar',
|
50
|
+
email: 'bobsinclar@proxmox.com'
|
51
|
+
}
|
52
|
+
# is equivalent to
|
53
|
+
# bob_hash = {
|
54
|
+
# userid: 'bobsinclar',
|
55
|
+
# realm: 'pve',
|
56
|
+
# password: 'bobsinclar1',
|
57
|
+
# firstname: 'Bob',
|
58
|
+
# lastname: 'Sinclar',
|
59
|
+
# email: 'bobsinclar@proxmox.com'
|
60
|
+
# }
|
61
|
+
identity.users.create(bob_hash)
|
62
|
+
|
63
|
+
# Get a user by id
|
64
|
+
bob = identity.users.find_by_id 'bobsinclar@pve'
|
65
|
+
|
66
|
+
# List all users
|
67
|
+
identity.users.all
|
68
|
+
|
69
|
+
# List user by user
|
70
|
+
identity.users.each do |user|
|
71
|
+
# user ...
|
72
|
+
end
|
73
|
+
|
74
|
+
# Update user
|
75
|
+
bob.comment = 'novelist'
|
76
|
+
# add groups
|
77
|
+
bob.groups = %w[group1]
|
78
|
+
bob.update
|
79
|
+
|
80
|
+
# Delete user
|
81
|
+
bob.destroy
|
82
|
+
|
83
|
+
# Create groups
|
84
|
+
group_hash = { groupid: 'group1' }
|
85
|
+
identity.domains.create(group_hash)
|
86
|
+
|
87
|
+
# Get one group by id
|
88
|
+
group1 = identity.groups.find_by_id 'group1'
|
89
|
+
|
90
|
+
# Update group
|
91
|
+
group1.comment 'Group 1'
|
92
|
+
group1.update
|
93
|
+
|
94
|
+
# List all groups
|
95
|
+
identity.groups.all
|
96
|
+
|
97
|
+
# List group by group
|
98
|
+
identity.groups.each do |group|
|
99
|
+
# group ...
|
100
|
+
end
|
101
|
+
|
102
|
+
# Delete group
|
103
|
+
group1.destroy
|
104
|
+
|
105
|
+
# Create roles
|
106
|
+
role_hash = { roleid: 'role1' }
|
107
|
+
identity.roles.create(role_hash)
|
108
|
+
|
109
|
+
# Get one role by id
|
110
|
+
role1 = identity.roles.find_by_id 'role1'
|
111
|
+
|
112
|
+
# Update role
|
113
|
+
role1.comment 'Role 1'
|
114
|
+
role1.update
|
115
|
+
|
116
|
+
# List all roles
|
117
|
+
identity.roles.all
|
118
|
+
|
119
|
+
# List role by role
|
120
|
+
identity.roles.each do |role|
|
121
|
+
# role ...
|
122
|
+
end
|
123
|
+
|
124
|
+
# Delete role
|
125
|
+
role1.destroy
|
126
|
+
|
127
|
+
# Create a new domain (authentication server)
|
128
|
+
# Three types: PAM, PVE, LDAP and ActiveDirectory
|
129
|
+
# PAM and PVE already exist by default
|
130
|
+
# LDAP sample:
|
131
|
+
ldap_hash = {
|
132
|
+
realm: 'LDAP',
|
133
|
+
type: 'ldap',
|
134
|
+
base_dn: 'ou=People,dc=ldap-test,dc=com',
|
135
|
+
user_attr: 'LDAP',
|
136
|
+
server1: 'localhost',
|
137
|
+
port: 389,
|
138
|
+
default: 0,
|
139
|
+
secure: 0
|
140
|
+
}
|
141
|
+
# ActiveDirectory sample:
|
142
|
+
# ad_hash = {
|
143
|
+
# realm: 'ActiveDirectory',
|
144
|
+
# type: 'ad',
|
145
|
+
# domain: 'proxmox.com',
|
146
|
+
# server1: 'localhost',
|
147
|
+
# port: 389,
|
148
|
+
# default: 0,
|
149
|
+
# secure: 0
|
150
|
+
# }
|
151
|
+
|
152
|
+
identity.domains.create(ldap_hash)
|
153
|
+
|
154
|
+
# List domains
|
155
|
+
identity.domains.each do |domain|
|
156
|
+
# domain ...
|
157
|
+
end
|
158
|
+
|
159
|
+
# Find domain by id
|
160
|
+
ldap = identity.domains.find_by_id ldap_hash[:realm]
|
161
|
+
|
162
|
+
# Update domain
|
163
|
+
ldap.type.comment = 'Test domain LDAP'
|
164
|
+
# Two types of Two Factors Authentication (TFA): oath and yubico
|
165
|
+
ldap.type.tfa = 'type=oath,step=30,digits=8'
|
166
|
+
# ad.type.tfa = 'type=yubico,id=1,key=2,url=http://localhost'
|
167
|
+
ldap.update
|
168
|
+
|
169
|
+
# Delete domain
|
170
|
+
ldap.destroy
|
171
|
+
|
172
|
+
# Add a user permission
|
173
|
+
permission_hash = {
|
174
|
+
path: '/access/users',
|
175
|
+
roles: 'PVEUserAdmin',
|
176
|
+
users: bob_hash[:userid]
|
177
|
+
}
|
178
|
+
# Add a group permission
|
179
|
+
# permission_hash = {
|
180
|
+
# path: '/access/users',
|
181
|
+
# roles: 'PVEUserAdmin',
|
182
|
+
# groups: 'group1'
|
183
|
+
# }
|
184
|
+
identity.add_permission(permission_hash)
|
185
|
+
|
186
|
+
# List all permissions
|
187
|
+
identity.permissions.all
|
188
|
+
|
189
|
+
# List permission by permission
|
190
|
+
identity.permissions.each do |permission|
|
191
|
+
# permission ...
|
192
|
+
end
|
193
|
+
|
194
|
+
# Remove permission
|
195
|
+
identity.remove_permission(permission_hash)
|