kitchen-lxd_cli 0.1.6 → 2.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b72ba2a22edb8adb3ee21e394eb133b532270a33
4
- data.tar.gz: e758ef7199090d29672a0715b064bedcb6fe578e
3
+ metadata.gz: ad7b7dd864e7373d8f549d39ffc1ddbb58f3d929
4
+ data.tar.gz: 1ca5ed8845e1ed386320d5f228a7f22cd1bf38da
5
5
  SHA512:
6
- metadata.gz: 1bc3eef0b7531b1fafe449d87618ee64015e8e184dbf194d23c2b8914c9f9a4ed5197c490aca7d27b9bf628d8dbb28e40db49b4505e320035643ec7c2806690f
7
- data.tar.gz: b12cc296130ace2e4f5f55553da219972e8d3d70c0802007b4747efa55c8f3e8706598ec561c613ac1ef435282110be084d7dd6522302d6ba013e82112ad2f6f
6
+ metadata.gz: 67c2f7b009f1f3941674d9c15e08437cc18e7361309e90dfbc70941dcd54dc97f0f53e0489eb7a8cc13511ea013c04821164f9c6a2924e98364f225eab3547ed
7
+ data.tar.gz: 482187b180da0b2412be0e233fb4bbc4d8b7644a9c34da4cdee76e1d5d366eb011b666397c7d1ea9057fd31a9c806012f90c21eac535aad718dace56361d7d5e
data/README.md CHANGED
@@ -6,7 +6,7 @@ A Test Kitchen Driver for LXD / LXC
6
6
 
7
7
  This is a test-kitchen driver for lxd, which controls lxc. I named it LxdCli because this is my first plugin and I wanted to leave LXD driver name in case a more extensive project is put together. Although I've since added a lot more features than I originally planned.
8
8
 
9
- I'm running lxd --version 0.20 on ubuntu 15.10. NOTE: Networking options will not work LXD 0.21, 0.22 [Github Issue](https://github.com/lxc/lxd/issues/1259)
9
+ I'm running lxd --version 2.0.2 on ubuntu 16.04. Image setup, Networking options, etc will not work prior to 2.0.0 [Github Issue](https://github.com/lxc/lxd/issues/1259), use kitchen_lxd_cli 0.x.x for lxd 0.x. Only tested with ubuntu containers, pull requests are welcome.
10
10
 
11
11
  I started the project because I really like the idea of developing containers, but kitchen-lxc wouldn't work with my version. I also tried docker but preferred how lxd is closer to a hypervisor virtual machine. For instance kitchen-docker my recipes that had worked on virtual machies for mongodb, the service would not start when using docker. I was able to get the service to start but liked the concept of system containers more than application containers. Ultimately I was interested in LXD and there wasn't anything out there. I was quickly able to get my mongodb recipe working. I figured I'd clean things up, and some features and publish it. Since then I've added numerous features, mainly with a focus on speeding up development of cookbooks, and exploring LXD.
12
12
 
@@ -52,8 +52,8 @@ driver:
52
52
  image_release: trusty
53
53
  profile: my_lxc_profile
54
54
  config:
55
- limits.memory: 2G
56
- limits.cpus: 2
55
+ limits.memory: 2GB
56
+ limits.cpu: 2
57
57
  boot.autostart: true
58
58
  domain_name: lxc
59
59
  ip_gateway: 10.0.3.1
@@ -205,12 +205,12 @@ Default is Nil. See LXC documentation but a lxc profile can be specified. Whic
205
205
 
206
206
  Default is Nil. See LXC documentation but a lxc config container key/value can be specified. [LXC Container Config Options](https://github.com/lxc/lxd/blob/master/specs/configuration.md#keyvalue-configuration-1). Config options are passed to "lxc init" command. A String or a Hash of key/value pairs is accepted.
207
207
 
208
- `config: "limits.memory=2G"`
208
+ `config: "limits.memory=2GB"`
209
209
 
210
210
  ```yaml
211
211
  config:
212
- limits.memory: 1G
213
- limits.cpus: 2
212
+ limits.memory: 1GB
213
+ limits.cpu: 2
214
214
  boot.autostart: true
215
215
  ```
216
216
 
@@ -225,6 +225,8 @@ mount:
225
225
  mymount2:
226
226
  local_path: "/my/local/path"
227
227
  container_path: "/my/container/path"
228
+ # Attempts to create the local_path if it doesn't exist yet
229
+ create_source: true
228
230
  ```
229
231
 
230
232
  You can mount however many directories you like. The kitchen-lxd_cli driver will run `lxc config device add <container> <name> disk <local_path>=<container_path>`
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ['lib']
20
20
 
21
- spec.add_dependency 'test-kitchen', '~> 1.4.2'
21
+ spec.add_dependency 'test-kitchen', '~> 1.4'
22
22
 
23
23
  spec.add_development_dependency 'bundler', '~> 1.10'
24
24
  spec.add_development_dependency 'rake'
@@ -17,6 +17,7 @@
17
17
  # limitations under the License.
18
18
 
19
19
  require 'kitchen'
20
+ require 'fileutils'
20
21
 
21
22
  module Kitchen
22
23
 
@@ -40,7 +41,7 @@ module Kitchen
40
41
  default_config :lxd_proxy_path, "#{ENV['HOME']}/.lxd_proxy"
41
42
  default_config :lxd_proxy_update, false
42
43
  default_config :username, "root"
43
-
44
+
44
45
  required_config :public_key_path
45
46
 
46
47
  def create(state)
@@ -49,7 +50,7 @@ module Kitchen
49
50
  unless exists?
50
51
  image_name = create_image_if_missing
51
52
  profile_args = setup_profile_args if config[:profile]
52
- config_args = setup_config_args if config[:config]
53
+ config_args = setup_config_args
53
54
  info("Initializing container #{instance.name}")
54
55
  run_lxc_command("init #{image_name} #{instance.name} #{profile_args} #{config_args}")
55
56
  end
@@ -73,7 +74,7 @@ module Kitchen
73
74
  info("Stopping container #{instance.name}")
74
75
  run_lxc_command("stop #{instance.name}")
75
76
  end
76
-
77
+
77
78
  publish_image if config[:publish_image_before_destroy]
78
79
 
79
80
  unless config[:never_destroy]
@@ -117,9 +118,10 @@ module Kitchen
117
118
  image_os = config[:image_os]
118
119
  image_os ||= image[:os]
119
120
  image_release = config[:image_release]
120
- image_release ||= image[:release]
121
- debug("Ran command: lxd-images import #{image_os} #{image_release} --alias #{image_name}")
122
- IO.popen("lxd-images import #{image_os} #{image_release} --alias #{image_name}", "w") { |pipe| puts pipe.gets rescue nil }
121
+ image_release ||= image[:release_num]
122
+ debug("Ran command: lxc image copy #{image_os}:#{image_release} local: --alias #{image_name}")
123
+ IO.popen("lxc image copy #{image_os}:#{image_release} local: --alias #{image_name}", "w") { |pipe| puts pipe.gets rescue nil }
124
+ # IO.popen("lxd-images import #{image_os} #{image_release} --alias #{image_name}", "w") { |pipe| puts pipe.gets rescue nil }
123
125
  end
124
126
 
125
127
  return image_name
@@ -130,20 +132,20 @@ module Kitchen
130
132
  if platform.downcase == "ubuntu"
131
133
  case release.downcase
132
134
  when "14.04", "1404", "trusty", "", nil
133
- image = { :os => platform, :release => "trusty" }
135
+ image = { :os => platform, :release_name => "trusty", :release_num => '14.04' }
134
136
  when "14.10", "1410", "utopic"
135
- image = { :os => platform, :release => "utopic" }
137
+ image = { :os => platform, :release_name => "utopic", :release_num => '14.10' }
136
138
  when "15.04", "1504", "vivid"
137
- image = { :os => platform, :release => "vivid" }
139
+ image = { :os => platform, :release_name => "vivid", :release_num => '15.04' }
138
140
  when "15.10", "1510", "wily"
139
- image = { :os => platform, :release => "wily" }
141
+ image = { :os => platform, :release_name => "wily", :release_num => '15.10' }
140
142
  when "16.04", "1604", "xenial"
141
- image = { :os => platform, :release => "xenial" }
143
+ image = { :os => platform, :release_name => "xenial", :release_num => '16.04' }
142
144
  else
143
- image = { :os => platform, :release => release }
145
+ image = { :os => platform, :release_name => release, :release_num => release }
144
146
  end
145
147
  else
146
- image = { :os => platform, :release => release }
148
+ image = { :os => platform, :release_name => release, :release_num => release }
147
149
  end
148
150
  return image
149
151
  end
@@ -198,7 +200,7 @@ module Kitchen
198
200
 
199
201
  if config[:ipv4]
200
202
  IO.popen("bash", "r+") do |p|
201
- p.puts("echo -e \"lxc.network.type = veth\nlxc.network.name = eth0\nlxc.network.link = lxcbr0\nlxc.network.ipv4 = #{config[:ipv4]}\nlxc.network.ipv4.gateway = #{config[:ip_gateway]}\nlxc.network.flags = up\" | lxc config set #{instance.name} raw.lxc -")
203
+ p.puts("echo -e \"lxc.network.0.ipv4 = #{config[:ipv4]}\nlxc.network.0.ipv4.gateway = #{config[:ip_gateway]}\n\" | lxc config set #{instance.name} raw.lxc -")
202
204
  p.puts("exit")
203
205
  end
204
206
  arg_disable_dhcp = "&& lxc exec #{instance.name} -- sed -i 's/dhcp/manual/g' /etc/network/interfaces.d/eth0.cfg"
@@ -213,6 +215,8 @@ module Kitchen
213
215
  config_args = ""
214
216
  if config[:config].class == String
215
217
  config_args += " -c #{config[:config]}"
218
+ elsif config[:config].nil?
219
+ config_args += ""
216
220
  else
217
221
  config[:config].each do |key, value|
218
222
  config_args += " -c #{key}=#{value}"
@@ -242,7 +246,13 @@ module Kitchen
242
246
  def setup_mount_bindings
243
247
  config[:mount].each do |mount_name, mount_binding|
244
248
  if mount_name && mount_binding[:local_path] && mount_binding[:container_path]
245
- run_lxc_command("config device add #{instance.name} #{mount_name} disk source=#{mount_binding[:local_path]} path=#{mount_binding[:container_path]}")
249
+ # eval is used here in case there's a need to pass instance.name as variable
250
+ host_path = eval('"'+ mount_binding[:local_path] +'"')
251
+ if ! File.directory?(mount_binding[:local_path]) && mount_binding[:create_source]
252
+ debug("Source path for the #{mount_name} doesn't exist, creating #{host_path}")
253
+ FileUtils.mkdir_p(host_path)
254
+ end
255
+ run_lxc_command("config device add #{instance.name} #{mount_name} disk source=#{host_path} path=#{mount_binding[:container_path]}")
246
256
  end
247
257
  end if config[:mount].class == Hash
248
258
  end
@@ -263,12 +273,19 @@ module Kitchen
263
273
  end if config[:ipv4] && dns_servers.length == 0
264
274
 
265
275
  if dns_servers.length > 0
266
- wait_for_path("/etc/resolvconf/resolv.conf.d/base")
267
- debug("Setting up the following dns servers via /etc/resolvconf/resolv.conf.d/base:")
268
- debug(dns_servers.gsub("\n", ' '))
269
- p.puts(" echo \"#{dns_servers.chomp}\" > /etc/resolvconf/resolv.conf.d/base")
270
- wait_for_path("/run/resolvconf/interface")
271
- p.puts("resolvconf -u")
276
+ if system "lxc exec #{instance.name} -- test -e /etc/redhat-release"
277
+ wait_for_path("/etc/resolv.conf")
278
+ debug("Setting up the following dns servers via /etc/resolv.conf:")
279
+ debug(dns_servers.gsub("\n", ' '))
280
+ p.puts(" echo \"#{dns_servers.chomp}\" > /etc/resolv.conf")
281
+ else
282
+ wait_for_path("/etc/resolvconf/resolv.conf.d/base")
283
+ debug("Setting up the following dns servers via /etc/resolvconf/resolv.conf.d/base:")
284
+ debug(dns_servers.gsub("\n", ' '))
285
+ p.puts(" echo \"#{dns_servers.chomp}\" > /etc/resolvconf/resolv.conf.d/base")
286
+ wait_for_path("/run/resolvconf/interface")
287
+ p.puts("resolvconf -u")
288
+ end
272
289
  end
273
290
 
274
291
  debug("Setting up /etc/hosts")
@@ -300,10 +317,12 @@ module Kitchen
300
317
  begin
301
318
  debug("Uploading public key...")
302
319
  unless config[:username] == "root"
303
- `lxc file push #{config[:public_key_path]} #{instance.name}/home/#{config[:username]}/.ssh/authorized_keys 2> /dev/null`
320
+ home_path = '/home/'
304
321
  else
305
- `lxc file push #{config[:public_key_path]} #{instance.name}/#{config[:username]}/.ssh/authorized_keys 2> /dev/null`
322
+ home_path = '/'
306
323
  end
324
+ authorized_keys_path = "#{home_path}#{config[:username]}/.ssh/authorized_keys"
325
+ `lxc file push #{config[:public_key_path]} #{instance.name}#{authorized_keys_path} 2> /dev/null && lxc exec #{instance.name} -- chown #{config[:username]}:#{config[:username]} #{authorized_keys_path}`
307
326
  break if $?.to_i == 0
308
327
  sleep 0.3
309
328
  end while true
@@ -362,7 +381,7 @@ module Kitchen
362
381
  def wait_for_ip_address
363
382
  info("Waiting for network to become ready")
364
383
  begin
365
- lxc_info = `lxc info #{instance.name}`.match(/^[ ]+eth0:[\t]IPV4[\t]([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/)
384
+ lxc_info = `lxc info #{instance.name}`.match(/eth0:\tinet\t(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/)
366
385
  debug("Still waiting for IP Address...")
367
386
  lxc_ip = lxc_info.captures[0].to_s if lxc_info && lxc_info.captures
368
387
  break if lxc_ip && lxc_ip.length > 7
@@ -21,6 +21,6 @@ module Kitchen
21
21
  module Driver
22
22
 
23
23
  # Version string for LxdCli Kitchen driver
24
- LXD_CLI_VERSION = "0.1.6"
24
+ LXD_CLI_VERSION = "2.0.0"
25
25
  end
26
26
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kitchen-lxd_cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Braden Wright
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-28 00:00:00.000000000 Z
11
+ date: 2016-07-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: test-kitchen
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.4.2
19
+ version: '1.4'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.4.2
26
+ version: '1.4'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -133,7 +133,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
133
133
  version: '0'
134
134
  requirements: []
135
135
  rubyforge_project:
136
- rubygems_version: 2.4.8
136
+ rubygems_version: 2.6.4
137
137
  signing_key:
138
138
  specification_version: 4
139
139
  summary: A Test Kitchen Driver for LXD