kitchen-lxd_cli 0.1.6 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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