vagrant-lxd 0.4.0 → 0.4.1
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 +4 -4
- data/Gemfile.lock +2 -2
- data/README.md +33 -2
- data/lib/vagrant-lxd/action.rb +1 -0
- data/lib/vagrant-lxd/config.rb +21 -3
- data/lib/vagrant-lxd/driver.rb +46 -5
- data/lib/vagrant-lxd/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fef7b1d0ba6f86c3f621e843abe99b6bfcda266f
|
4
|
+
data.tar.gz: 2de77f085615f775deff08f65a10bdd584182647
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cc3718c25b56973c47858ad5bc7711a23d0ba1a9ae43b9ab55f42dbf10cd2e67d4730948e92dbcb1e0eddbff595eabc815e4dfd952235766a1d8bb5e69c3dca7
|
7
|
+
data.tar.gz: c87aa4c96a58bf9162124a6fa910cabeb9ab29c17726ef4403a88a11ec74ff9f11124f49e39ebe13bdcaae38da71427cfcaa31267c3717dc882f5385edc8a9d0
|
data/Gemfile.lock
CHANGED
@@ -27,13 +27,13 @@ GIT
|
|
27
27
|
PATH
|
28
28
|
remote: .
|
29
29
|
specs:
|
30
|
-
vagrant-lxd (0.4.
|
30
|
+
vagrant-lxd (0.4.1)
|
31
31
|
hyperkit (~> 1.2.0)
|
32
32
|
|
33
33
|
GEM
|
34
34
|
remote: https://rubygems.org/
|
35
35
|
specs:
|
36
|
-
activesupport (5.2.
|
36
|
+
activesupport (5.2.3)
|
37
37
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
38
38
|
i18n (>= 0.7, < 2)
|
39
39
|
minitest (~> 5.1)
|
data/README.md
CHANGED
@@ -191,7 +191,7 @@ In order to run Linux containers on an LXD-backed machine, it must be
|
|
191
191
|
created with the `nesting` and `privileged` properties set to `true`.
|
192
192
|
These correspond to the `security.nesting` and `security.privileged`
|
193
193
|
configuration items for LXD, respectively. Refer to LXD's [container
|
194
|
-
configuration documentation][
|
194
|
+
configuration documentation][containers] for details.
|
195
195
|
|
196
196
|
config.vm.provider 'lxd' do |lxd|
|
197
197
|
lxd.nesting = true
|
@@ -202,7 +202,38 @@ Note that enabling these options will invalidate any user and group ID
|
|
202
202
|
mappings you may have configured for synced folders, since privileged
|
203
203
|
containers use the same UID and GID space as the host machine.
|
204
204
|
|
205
|
-
[
|
205
|
+
[containers]: https://lxd.readthedocs.io/en/latest/containers/
|
206
|
+
|
207
|
+
### Adding Devices
|
208
|
+
|
209
|
+
You can attach arbitrary devices to the container with the `devices`
|
210
|
+
setting. This should be a map of device names to configuration hashes,
|
211
|
+
where the hash keys and values are valid [device configuration
|
212
|
+
settings][device-config].
|
213
|
+
|
214
|
+
For example, the following configuration uses a `proxy` device to
|
215
|
+
forward local X11 traffic from the container to the host, allowing you
|
216
|
+
to run graphical applications transparently from within the guest:
|
217
|
+
|
218
|
+
# e.g. vagrant ssh -c 'DISPLAY=:0 firefox'
|
219
|
+
config.vm.provider 'lxd' do |lxd|
|
220
|
+
lxd.devices = {
|
221
|
+
x11: {
|
222
|
+
type: 'proxy',
|
223
|
+
mode: '0777',
|
224
|
+
bind: 'container',
|
225
|
+
listen: 'unix:/tmp/.X11-unix/X0',
|
226
|
+
connect: 'unix:/tmp/.X11-unix/X0',
|
227
|
+
'security.uid': Process.uid.to_s,
|
228
|
+
'security.gid': Process.gid.to_s,
|
229
|
+
}
|
230
|
+
}
|
231
|
+
end
|
232
|
+
|
233
|
+
Note that disk devices should be configured as [synced
|
234
|
+
folders](#synced-folders) rather than ad-hoc devices.
|
235
|
+
|
236
|
+
[device-config]: https://lxd.readthedocs.io/en/latest/containers/#device-configuration
|
206
237
|
|
207
238
|
## Hacking
|
208
239
|
|
data/lib/vagrant-lxd/action.rb
CHANGED
data/lib/vagrant-lxd/config.rb
CHANGED
@@ -26,6 +26,7 @@ module VagrantLXD
|
|
26
26
|
attr_accessor :name
|
27
27
|
attr_accessor :timeout
|
28
28
|
attr_accessor :config
|
29
|
+
attr_accessor :devices
|
29
30
|
attr_accessor :environment
|
30
31
|
attr_accessor :ephemeral
|
31
32
|
attr_accessor :nesting
|
@@ -40,6 +41,7 @@ module VagrantLXD
|
|
40
41
|
@name = UNSET_VALUE
|
41
42
|
@timeout = UNSET_VALUE
|
42
43
|
@config = UNSET_VALUE
|
44
|
+
@devices = UNSET_VALUE
|
43
45
|
@environment = UNSET_VALUE
|
44
46
|
@nesting = UNSET_VALUE
|
45
47
|
@privileged = UNSET_VALUE
|
@@ -74,15 +76,27 @@ module VagrantLXD
|
|
74
76
|
if not config.is_a? Hash
|
75
77
|
errors << "Invalid `config' (value must be a hash): #{config.inspect}"
|
76
78
|
elsif not config.keys.all? { |x| x.is_a? Symbol }
|
77
|
-
errors << "Invalid `config' (
|
79
|
+
errors << "Invalid `config' (keys must be symbols): #{config.inspect}"
|
80
|
+
end
|
81
|
+
|
82
|
+
if not devices.is_a? Hash
|
83
|
+
errors << "Invalid `devices' (value must be a hash): #{devices.inspect}"
|
84
|
+
elsif not devices.keys.all? { |x| x.is_a? String or x.is_a? Symbol }
|
85
|
+
errors << "Invalid `devices' (keys must be strings or symbols): #{devices.inspect}"
|
86
|
+
elsif devices.keys.any? { |x| x =~ /^(.*([^a-z0-9.\-_]).*)$/ }
|
87
|
+
errors << "Invalid `devices' (device name `#{$1}' contains invalid character '#{$2}'): #{devices.inspect}"
|
88
|
+
elsif not devices.values.all? { |x| x.is_a? Hash }
|
89
|
+
errors << "Invalid `devices' (values must be hashes): #{devices.inspect}"
|
90
|
+
elsif not devices.values.map(&:values).flatten.all? { |x| x.is_a? String }
|
91
|
+
errors << "Invalid `devices' (device value must be strings): #{devices.inspect}"
|
78
92
|
end
|
79
93
|
|
80
94
|
if not environment.is_a? Hash
|
81
95
|
errors << "Invalid `environment' (value must be a hash): #{environment.inspect}"
|
82
96
|
elsif not environment.keys.all? { |x| x.is_a? String or x.is_a? Symbol }
|
83
|
-
errors << "Invalid `environment' (
|
97
|
+
errors << "Invalid `environment' (keys must be strings or symbols): #{environment.inspect}"
|
84
98
|
elsif not environment.values.all? { |x| x.is_a? String }
|
85
|
-
errors << "Invalid `environment' (
|
99
|
+
errors << "Invalid `environment' (values must be strings): #{environment.inspect}"
|
86
100
|
end
|
87
101
|
|
88
102
|
begin
|
@@ -151,6 +165,10 @@ module VagrantLXD
|
|
151
165
|
@config = {}
|
152
166
|
end
|
153
167
|
|
168
|
+
if devices == UNSET_VALUE
|
169
|
+
@devices = {}
|
170
|
+
end
|
171
|
+
|
154
172
|
if environment == UNSET_VALUE
|
155
173
|
@environment = {}
|
156
174
|
end
|
data/lib/vagrant-lxd/driver.rb
CHANGED
@@ -18,6 +18,7 @@
|
|
18
18
|
#
|
19
19
|
|
20
20
|
require 'active_support/core_ext/object/deep_dup'
|
21
|
+
require 'active_support/core_ext/hash/except'
|
21
22
|
require 'hyperkit'
|
22
23
|
require 'securerandom'
|
23
24
|
require 'tempfile'
|
@@ -112,11 +113,21 @@ module VagrantLXD
|
|
112
113
|
end
|
113
114
|
end
|
114
115
|
|
116
|
+
module Hyperkit::Client::Containers
|
117
|
+
alias extract_container_options_without_devices extract_container_options
|
118
|
+
|
119
|
+
def extract_container_options(name, options)
|
120
|
+
opts = extract_container_options_without_devices(name, options)
|
121
|
+
options.slice(:devices).merge(opts)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
115
125
|
NOT_CREATED = Vagrant::MachineState::NOT_CREATED_ID
|
116
126
|
|
117
127
|
attr_reader :api_endpoint
|
118
128
|
attr_reader :name
|
119
129
|
attr_reader :timeout
|
130
|
+
attr_reader :devices
|
120
131
|
attr_reader :environment
|
121
132
|
attr_reader :ephemeral
|
122
133
|
attr_reader :nesting
|
@@ -131,7 +142,8 @@ module VagrantLXD
|
|
131
142
|
@machine = machine
|
132
143
|
@timeout = machine.provider_config.timeout
|
133
144
|
@api_endpoint = machine.provider_config.api_endpoint
|
134
|
-
@config =
|
145
|
+
@config = machine.provider_config.config
|
146
|
+
@devices = machine.provider_config.devices
|
135
147
|
@environment = machine.provider_config.environment
|
136
148
|
@nesting = machine.provider_config.nesting
|
137
149
|
@privileged = machine.provider_config.privileged
|
@@ -187,9 +199,7 @@ module VagrantLXD
|
|
187
199
|
|
188
200
|
def unmount(name, options)
|
189
201
|
container = lxd.container(machine_id)
|
190
|
-
devices = container[:devices].to_hash
|
191
|
-
devices.delete(name.to_sym)
|
192
|
-
container[:devices] = devices
|
202
|
+
container[:devices] = container[:devices].to_hash.except(name.to_sym)
|
193
203
|
lxd.update_container(machine_id, container)
|
194
204
|
rescue Hyperkit::BadRequest => e
|
195
205
|
@machine.ui.error 'Failed to unmount synced folder'
|
@@ -271,7 +281,7 @@ module VagrantLXD
|
|
271
281
|
end
|
272
282
|
end
|
273
283
|
|
274
|
-
container = lxd.create_container(machine_id, ephemeral: ephemeral, fingerprint: fingerprint, config: config, profiles: profiles)
|
284
|
+
container = lxd.create_container(machine_id, devices: devices, ephemeral: ephemeral, fingerprint: fingerprint, config: config, profiles: profiles)
|
275
285
|
@logger.debug 'Created container: ' << container.inspect
|
276
286
|
|
277
287
|
@machine.id = machine_id
|
@@ -334,12 +344,42 @@ module VagrantLXD
|
|
334
344
|
def configure
|
335
345
|
container = lxd.container(machine_id)
|
336
346
|
container[:config] = container[:config].to_hash.merge(config)
|
347
|
+
container[:devices] = container[:devices].to_hash.merge(devices)
|
337
348
|
lxd.update_container(machine_id, container)
|
338
349
|
rescue Hyperkit::Error => e
|
339
350
|
@machine.ui.error 'Failed to configure container'
|
340
351
|
fail ContainerConfigurationFailure, machine_name: @machine.name, reason: e.reason
|
341
352
|
end
|
342
353
|
|
354
|
+
# When a container is restarted, the `forkproxy` processes that manage
|
355
|
+
# its proxy devices will persist but will not reliably recreate
|
356
|
+
# container-side listeners for devices that are configured with
|
357
|
+
# "bind=container". Removing and re-creating the devices forces the
|
358
|
+
# proxy processes to be recreated, ensuring the listeners are as well.
|
359
|
+
def reconnect
|
360
|
+
# select proxy devices
|
361
|
+
container = lxd.container(machine_id)
|
362
|
+
devices = container[:devices].to_hash
|
363
|
+
proxies = devices.select { |_, d| d[:type] == 'proxy' }
|
364
|
+
|
365
|
+
# bail if there's nothing to do
|
366
|
+
return if proxies.empty?
|
367
|
+
|
368
|
+
# TODO move messaging into a dedicated action
|
369
|
+
@machine.ui.info 'Reconnecting proxy devices...'
|
370
|
+
|
371
|
+
# remove proxy devices
|
372
|
+
container[:devices] = devices.except(*proxies.keys)
|
373
|
+
lxd.update_container(machine_id, container)
|
374
|
+
|
375
|
+
# restore all devices (including proxies)
|
376
|
+
container[:devices] = devices.merge(proxies)
|
377
|
+
lxd.update_container(machine_id, container)
|
378
|
+
rescue Hyperkit::Error => e
|
379
|
+
@machine.ui.error 'Failed to connect proxy devices'
|
380
|
+
fail ContainerConfigurationFailure, machine_name: @machine.name, reason: e.reason
|
381
|
+
end
|
382
|
+
|
343
383
|
def info
|
344
384
|
if in_state? :running, :frozen
|
345
385
|
{
|
@@ -520,6 +560,7 @@ module VagrantLXD
|
|
520
560
|
lxd_rootfs = lxd_dir / 'rootfs.tar.gz'
|
521
561
|
lxd_metadata = YAML.load(File.read(lxd_dir / 'metadata.yaml')) rescue nil
|
522
562
|
|
563
|
+
# TODO move messaging into a dedicated action
|
523
564
|
if lxd_rootfs.exist? and lxd_metadata.is_a? Hash and lxd_metadata['source_fingerprint'] == lxc_fingerprint
|
524
565
|
@machine.ui.info 'Importing LXC image...'
|
525
566
|
else
|
data/lib/vagrant-lxd/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-lxd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Evan Hanson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-04-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hyperkit
|
@@ -72,7 +72,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
72
72
|
version: '0'
|
73
73
|
requirements: []
|
74
74
|
rubyforge_project:
|
75
|
-
rubygems_version: 2.6.
|
75
|
+
rubygems_version: 2.6.12
|
76
76
|
signing_key:
|
77
77
|
specification_version: 4
|
78
78
|
summary: Vagrant LXD provider
|